diff --git a/app/composer.json b/app/composer.json index a9bf7fe28..7d24106bb 100644 --- a/app/composer.json +++ b/app/composer.json @@ -5,27 +5,29 @@ "type": "project", "license": "Apache 2", "require": { - "php": ">=8.1", + "php": ">=8.2", "ext-intl": "*", "ext-json": "*", "ext-mbstring": "*", "cakephp/authentication": "~3.0", - "cakephp/cakephp": "5.2.*", - "cakephp/migrations": "^4.0.0", + "cakephp/cakephp": "5.3.*", + "cakephp/migrations": "^5.0", "cakephp/plugin-installer": "^2.0", "doctrine/dbal": "^3.10.1", - "league/container": "^4.2.0", + "league/container": "^5.1", "mobiledetect/mobiledetectlib": "^4.8.03", "psr/log": "^3.0", - "symfony/html-sanitizer": "^7.2" + "symfony/html-sanitizer": "^7.4.13" }, "require-dev": { - "cakephp/bake": "^3.0.0", - "cakephp/cakephp-codesniffer": "^5.0", - "cakephp/debug_kit": "^5.0.0", + "cakephp/bake": "^3.6", + "cakephp/cakephp-codesniffer": "^5.3", + "cakephp/debug_kit": "^5.2", + "composer/composer": "^2.9.8", "josegonzalez/dotenv": "^4.0", - "phpunit/phpunit": "^10.5.5 || ^11.1.3 || ^12.1", - "psy/psysh": "@stable" + "phpunit/phpunit": "^11.5.50 || ^12.5.8 || ^13.0", + "psy/psysh": "^0.12.19", + "twig/twig": "^3.27" }, "suggest": { "markstory/asset_compress": "An asset compression plugin which provides file concatenation and a flexible filter system for preprocessing and minification.", diff --git a/app/composer.lock b/app/composer.lock index e457db029..b5b158d69 100644 --- a/app/composer.lock +++ b/app/composer.lock @@ -4,20 +4,20 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "9fe7a17129cc9dbf9c3ad66bbd6c6814", + "content-hash": "3d2092107eba5bf1e3825d696b5903e1", "packages": [ { "name": "cakephp/authentication", - "version": "3.3.2", + "version": "3.3.5", "source": { "type": "git", "url": "https://github.com/cakephp/authentication.git", - "reference": "76e859261832866884b8b8d78dc14e6d22fb3451" + "reference": "9a12edc97de43f95eb4fecf033b623d5b17b436c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/authentication/zipball/76e859261832866884b8b8d78dc14e6d22fb3451", - "reference": "76e859261832866884b8b8d78dc14e6d22fb3451", + "url": "https://api.github.com/repos/cakephp/authentication/zipball/9a12edc97de43f95eb4fecf033b623d5b17b436c", + "reference": "9a12edc97de43f95eb4fecf033b623d5b17b436c", "shasum": "" }, "require": { @@ -33,7 +33,7 @@ "cakephp/cakephp": "^5.1.0", "cakephp/cakephp-codesniffer": "^5.0", "firebase/php-jwt": "^6.2", - "phpunit/phpunit": "^10.5.5 || ^11.1.3 || ^12.0.9" + "phpunit/phpunit": "^10.5.58 || ^11.5.3 || ^12.4" }, "suggest": { "cakephp/cakephp": "Install full core to use \"CookieAuthenticator\".", @@ -72,32 +72,32 @@ "issues": "https://github.com/cakephp/authentication/issues", "source": "https://github.com/cakephp/authentication" }, - "time": "2025-07-30T20:38:32+00:00" + "time": "2026-01-31T00:28:31+00:00" }, { "name": "cakephp/cakephp", - "version": "5.2.7", + "version": "5.3.6", "source": { "type": "git", "url": "https://github.com/cakephp/cakephp.git", - "reference": "6912570c76b7c27410ab7524d119e5a97f851508" + "reference": "cdaca8c3b710789e8545bff5a83194a6b19cad46" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/cakephp/zipball/6912570c76b7c27410ab7524d119e5a97f851508", - "reference": "6912570c76b7c27410ab7524d119e5a97f851508", + "url": "https://api.github.com/repos/cakephp/cakephp/zipball/cdaca8c3b710789e8545bff5a83194a6b19cad46", + "reference": "cdaca8c3b710789e8545bff5a83194a6b19cad46", "shasum": "" }, "require": { - "cakephp/chronos": "^3.1", + "cakephp/chronos": "^3.3", "composer/ca-bundle": "^1.5", "ext-intl": "*", "ext-json": "*", "ext-mbstring": "*", - "laminas/laminas-diactoros": "^3.3", + "laminas/laminas-diactoros": "^3.8", "laminas/laminas-httphandlerrunner": "^2.6", - "league/container": "^4.2", - "php": ">=8.1", + "league/container": "^5.1", + "php": ">=8.2", "psr/container": "^1.1 || ^2.0", "psr/http-client": "^1.0.2", "psr/http-factory": "^1.1", @@ -133,12 +133,12 @@ "cakephp/validation": "self.version" }, "require-dev": { - "cakephp/cakephp-codesniffer": "^5.2", - "http-interop/http-factory-tests": "dev-main", - "mikey179/vfsstream": "^1.6.10", + "cakephp/cakephp-codesniffer": "^5.3", + "http-interop/http-factory-tests": "^2.0", + "mikey179/vfsstream": "^1.6.12", "mockery/mockery": "^1.6", "paragonie/csp-builder": "^2.3 || ^3.0", - "phpunit/phpunit": "^10.5.5 || ^11.1.3 || ^12.0.9" + "phpunit/phpunit": "^11.5.3 || ^12.1.3 || ^13.0" }, "suggest": { "ext-curl": "To enable more efficient network calls in Http\\Client.", @@ -148,7 +148,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-5.next": "5.2.x-dev" + "dev-5.next": "5.4.x-dev" } }, "autoload": { @@ -193,20 +193,20 @@ "issues": "https://github.com/cakephp/cakephp/issues", "source": "https://github.com/cakephp/cakephp" }, - "time": "2025-08-31T02:18:16+00:00" + "time": "2026-05-23T16:55:57+00:00" }, { "name": "cakephp/chronos", - "version": "3.2.0", + "version": "3.5.0", "source": { "type": "git", "url": "https://github.com/cakephp/chronos.git", - "reference": "6c820947bc1372a250288ab164ec1b3bb7afab39" + "reference": "e6e777b534244911566face8a5dbdbd7f7bda5a6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/chronos/zipball/6c820947bc1372a250288ab164ec1b3bb7afab39", - "reference": "6c820947bc1372a250288ab164ec1b3bb7afab39", + "url": "https://api.github.com/repos/cakephp/chronos/zipball/e6e777b534244911566face8a5dbdbd7f7bda5a6", + "reference": "e6e777b534244911566face8a5dbdbd7f7bda5a6", "shasum": "" }, "require": { @@ -218,7 +218,7 @@ }, "require-dev": { "cakephp/cakephp-codesniffer": "^5.0", - "phpunit/phpunit": "^10.1.0 || ^11.1.3" + "phpunit/phpunit": "^10.5.58 || ^11.5.3 || ^12.1.3" }, "type": "library", "autoload": { @@ -252,33 +252,33 @@ "issues": "https://github.com/cakephp/chronos/issues", "source": "https://github.com/cakephp/chronos" }, - "time": "2025-06-28T11:35:59+00:00" + "time": "2026-04-10T02:50:39+00:00" }, { "name": "cakephp/migrations", - "version": "4.7.2", + "version": "5.2.0", "source": { "type": "git", "url": "https://github.com/cakephp/migrations.git", - "reference": "69732d98d84b99f9b0a8af94de7dd9ac242aeaff" + "reference": "369d849a540a6815f402447119351ad6fe7894ac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/migrations/zipball/69732d98d84b99f9b0a8af94de7dd9ac242aeaff", - "reference": "69732d98d84b99f9b0a8af94de7dd9ac242aeaff", + "url": "https://api.github.com/repos/cakephp/migrations/zipball/369d849a540a6815f402447119351ad6fe7894ac", + "reference": "369d849a540a6815f402447119351ad6fe7894ac", "shasum": "" }, "require": { - "cakephp/cache": "^5.2", - "cakephp/orm": "^5.2", - "php": ">=8.1", - "robmorgan/phinx": "^0.16.10" + "cakephp/cache": "^5.3.0", + "cakephp/database": "^5.3.2", + "cakephp/orm": "^5.3.0", + "php": ">=8.2" }, "require-dev": { "cakephp/bake": "^3.3", - "cakephp/cakephp": "^5.2.5", + "cakephp/cakephp": "^5.3.0", "cakephp/cakephp-codesniffer": "^5.0", - "phpunit/phpunit": "^10.5.5 || ^11.1.3 || ^12.2.4" + "phpunit/phpunit": "^11.5.3 || ^12.1.3 || ^13.0" }, "suggest": { "cakephp/bake": "If you want to generate migrations.", @@ -300,7 +300,7 @@ "homepage": "https://github.com/cakephp/migrations/graphs/contributors" } ], - "description": "Database Migration plugin for CakePHP based on Phinx", + "description": "Database Migration plugin for CakePHP", "homepage": "https://github.com/cakephp/migrations", "keywords": [ "cakephp", @@ -313,20 +313,20 @@ "issues": "https://github.com/cakephp/migrations/issues", "source": "https://github.com/cakephp/migrations" }, - "time": "2025-09-01T04:46:50+00:00" + "time": "2026-05-13T14:46:37+00:00" }, { "name": "cakephp/plugin-installer", - "version": "2.0.1", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/cakephp/plugin-installer.git", - "reference": "5420701fd47d82fe81805ebee34fbbcef34c52ba" + "reference": "40bfecb4565ab29cd8c34b0d02d0007d2d5ebd2b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/plugin-installer/zipball/5420701fd47d82fe81805ebee34fbbcef34c52ba", - "reference": "5420701fd47d82fe81805ebee34fbbcef34c52ba", + "url": "https://api.github.com/repos/cakephp/plugin-installer/zipball/40bfecb4565ab29cd8c34b0d02d0007d2d5ebd2b", + "reference": "40bfecb4565ab29cd8c34b0d02d0007d2d5ebd2b", "shasum": "" }, "require": { @@ -336,7 +336,7 @@ "require-dev": { "cakephp/cakephp-codesniffer": "^5.0", "composer/composer": "^2.0", - "phpunit/phpunit": "^10.1.0" + "phpunit/phpunit": "^10.1.0 || ^11.1.3 || ^12.0 || ^13.0" }, "type": "composer-plugin", "extra": { @@ -357,25 +357,25 @@ "homepage": "https://cakephp.org" } ], - "description": "A composer installer for CakePHP 3.0+ plugins.", + "description": "A composer installer for CakePHP plugins.", "support": { "issues": "https://github.com/cakephp/plugin-installer/issues", - "source": "https://github.com/cakephp/plugin-installer/tree/2.0.1" + "source": "https://github.com/cakephp/plugin-installer/tree/2.0.2" }, - "time": "2023-09-10T10:02:44+00:00" + "time": "2026-04-10T02:55:04+00:00" }, { "name": "composer/ca-bundle", - "version": "1.5.8", + "version": "1.5.12", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "719026bb30813accb68271fee7e39552a58e9f65" + "reference": "00a2f4201641d5c53f7fc0195e6c8d9fcc321a78" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/719026bb30813accb68271fee7e39552a58e9f65", - "reference": "719026bb30813accb68271fee7e39552a58e9f65", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/00a2f4201641d5c53f7fc0195e6c8d9fcc321a78", + "reference": "00a2f4201641d5c53f7fc0195e6c8d9fcc321a78", "shasum": "" }, "require": { @@ -422,7 +422,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.5.8" + "source": "https://github.com/composer/ca-bundle/tree/1.5.12" }, "funding": [ { @@ -434,20 +434,20 @@ "type": "github" } ], - "time": "2025-08-20T18:49:47+00:00" + "time": "2026-05-19T11:26:22+00:00" }, { "name": "doctrine/dbal", - "version": "3.10.2", + "version": "3.10.5", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "c6c16cf787eaba3112203dfcd715fa2059c62282" + "reference": "95d84866bf3c04b2ddca1df7c049714660959aef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/c6c16cf787eaba3112203dfcd715fa2059c62282", - "reference": "c6c16cf787eaba3112203dfcd715fa2059c62282", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/95d84866bf3c04b2ddca1df7c049714660959aef", + "reference": "95d84866bf3c04b2ddca1df7c049714660959aef", "shasum": "" }, "require": { @@ -463,16 +463,16 @@ }, "require-dev": { "doctrine/cache": "^1.11|^2.0", - "doctrine/coding-standard": "13.0.1", + "doctrine/coding-standard": "14.0.0", "fig/log-test": "^1", "jetbrains/phpstorm-stubs": "2023.1", - "phpstan/phpstan": "2.1.22", + "phpstan/phpstan": "2.1.30", "phpstan/phpstan-strict-rules": "^2", - "phpunit/phpunit": "9.6.23", - "slevomat/coding-standard": "8.16.2", - "squizlabs/php_codesniffer": "3.13.1", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/console": "^4.4|^5.4|^6.0|^7.0" + "phpunit/phpunit": "9.6.34", + "slevomat/coding-standard": "8.27.1", + "squizlabs/php_codesniffer": "4.0.1", + "symfony/cache": "^5.4|^6.0|^7.0|^8.0", + "symfony/console": "^4.4|^5.4|^6.0|^7.0|^8.0" }, "suggest": { "symfony/console": "For helpful console commands such as SQL execution and import of files." @@ -532,7 +532,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.10.2" + "source": "https://github.com/doctrine/dbal/tree/3.10.5" }, "funding": [ { @@ -548,33 +548,33 @@ "type": "tidelift" } ], - "time": "2025-09-04T23:51:27+00:00" + "time": "2026-02-24T08:03:57+00:00" }, { "name": "doctrine/deprecations", - "version": "1.1.5", + "version": "1.1.6", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38" + "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", - "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca", + "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "conflict": { - "phpunit/phpunit": "<=7.5 || >=13" + "phpunit/phpunit": "<=7.5 || >=14" }, "require-dev": { - "doctrine/coding-standard": "^9 || ^12 || ^13", - "phpstan/phpstan": "1.4.10 || 2.1.11", + "doctrine/coding-standard": "^9 || ^12 || ^14", + "phpstan/phpstan": "1.4.10 || 2.1.30", "phpstan/phpstan-phpunit": "^1.0 || ^2", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12.4 || ^13.0", "psr/log": "^1 || ^2 || ^3" }, "suggest": { @@ -594,22 +594,22 @@ "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/1.1.5" + "source": "https://github.com/doctrine/deprecations/tree/1.1.6" }, - "time": "2025-04-07T20:06:18+00:00" + "time": "2026-02-07T07:09:04+00:00" }, { "name": "doctrine/event-manager", - "version": "2.0.1", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/doctrine/event-manager.git", - "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e" + "reference": "dda33921b198841ca8dbad2eaa5d4d34769d18cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/b680156fa328f1dfd874fd48c7026c41570b9c6e", - "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/dda33921b198841ca8dbad2eaa5d4d34769d18cf", + "reference": "dda33921b198841ca8dbad2eaa5d4d34769d18cf", "shasum": "" }, "require": { @@ -619,10 +619,10 @@ "doctrine/common": "<2.9" }, "require-dev": { - "doctrine/coding-standard": "^12", - "phpstan/phpstan": "^1.8.8", - "phpunit/phpunit": "^10.5", - "vimeo/psalm": "^5.24" + "doctrine/coding-standard": "^14", + "phpdocumentor/guides-cli": "^1.4", + "phpstan/phpstan": "^2.1.32", + "phpunit/phpunit": "^10.5.58" }, "type": "library", "autoload": { @@ -671,7 +671,7 @@ ], "support": { "issues": "https://github.com/doctrine/event-manager/issues", - "source": "https://github.com/doctrine/event-manager/tree/2.0.1" + "source": "https://github.com/doctrine/event-manager/tree/2.1.1" }, "funding": [ { @@ -687,24 +687,24 @@ "type": "tidelift" } ], - "time": "2024-05-22T20:47:39+00:00" + "time": "2026-01-29T07:11:08+00:00" }, { "name": "laminas/laminas-diactoros", - "version": "3.6.0", + "version": "3.8.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-diactoros.git", - "reference": "b068eac123f21c0e592de41deeb7403b88e0a89f" + "reference": "60c182916b2749480895601649563970f3f12ec4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/b068eac123f21c0e592de41deeb7403b88e0a89f", - "reference": "b068eac123f21c0e592de41deeb7403b88e0a89f", + "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/60c182916b2749480895601649563970f3f12ec4", + "reference": "60c182916b2749480895601649563970f3f12ec4", "shasum": "" }, "require": { - "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0", "psr/http-factory": "^1.1", "psr/http-message": "^1.1 || ^2.0" }, @@ -721,11 +721,11 @@ "ext-gd": "*", "ext-libxml": "*", "http-interop/http-factory-tests": "^2.2.0", - "laminas/laminas-coding-standard": "~3.0.0", + "laminas/laminas-coding-standard": "~3.1.0", "php-http/psr7-integration-tests": "^1.4.0", "phpunit/phpunit": "^10.5.36", - "psalm/plugin-phpunit": "^0.19.0", - "vimeo/psalm": "^5.26.1" + "psalm/plugin-phpunit": "^0.19.5", + "vimeo/psalm": "^6.13" }, "type": "library", "extra": { @@ -775,24 +775,24 @@ "type": "community_bridge" } ], - "time": "2025-05-05T16:03:34+00:00" + "time": "2025-10-12T15:31:36+00:00" }, { "name": "laminas/laminas-httphandlerrunner", - "version": "2.12.0", + "version": "2.13.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-httphandlerrunner.git", - "reference": "b14da3519c650e9436e410cfedee6f860312eff9" + "reference": "181eaeeb838ad3d80fbbcfb0657a46bc212bbd4e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-httphandlerrunner/zipball/b14da3519c650e9436e410cfedee6f860312eff9", - "reference": "b14da3519c650e9436e410cfedee6f860312eff9", + "url": "https://api.github.com/repos/laminas/laminas-httphandlerrunner/zipball/181eaeeb838ad3d80fbbcfb0657a46bc212bbd4e", + "reference": "181eaeeb838ad3d80fbbcfb0657a46bc212bbd4e", "shasum": "" }, "require": { - "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0", "psr/http-message": "^1.0 || ^2.0", "psr/http-message-implementation": "^1.0 || ^2.0", "psr/http-server-handler": "^1.0" @@ -842,25 +842,26 @@ "type": "community_bridge" } ], - "time": "2025-05-13T21:21:16+00:00" + "time": "2025-10-12T20:58:29+00:00" }, { "name": "league/container", - "version": "4.2.5", + "version": "5.2.0", "source": { "type": "git", "url": "https://github.com/thephpleague/container.git", - "reference": "d3cebb0ff4685ff61c749e54b27db49319e2ec00" + "reference": "58accbc032f0090a9bd08326f93062c5a658b2c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/container/zipball/d3cebb0ff4685ff61c749e54b27db49319e2ec00", - "reference": "d3cebb0ff4685ff61c749e54b27db49319e2ec00", + "url": "https://api.github.com/repos/thephpleague/container/zipball/58accbc032f0090a9bd08326f93062c5a658b2c5", + "reference": "58accbc032f0090a9bd08326f93062c5a658b2c5", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0", - "psr/container": "^1.1 || ^2.0" + "php": "^8.1", + "psr/container": "^2.0.2", + "psr/event-dispatcher": "^1.0" }, "provide": { "psr/container-implementation": "^1.0" @@ -869,13 +870,13 @@ "orno/di": "~2.0" }, "require-dev": { - "nette/php-generator": "^3.4", - "nikic/php-parser": "^4.10", - "phpstan/phpstan": "^0.12.47", - "phpunit/phpunit": "^8.5.17", + "nette/php-generator": "^4.1", + "nikic/php-parser": "^5.0", + "phpstan/phpstan": "^2.1.11", + "phpunit/phpunit": "^10.5.45|^11.5.15|^12.0", "roave/security-advisories": "dev-latest", - "scrutinizer/ocular": "^1.8", - "squizlabs/php_codesniffer": "^3.6" + "scrutinizer/ocular": "^1.9", + "squizlabs/php_codesniffer": "^3.9" }, "type": "library", "extra": { @@ -884,7 +885,8 @@ "dev-2.x": "2.x-dev", "dev-3.x": "3.x-dev", "dev-4.x": "4.x-dev", - "dev-master": "4.x-dev" + "dev-5.x": "5.x-dev", + "dev-master": "5.x-dev" } }, "autoload": { @@ -916,7 +918,7 @@ ], "support": { "issues": "https://github.com/thephpleague/container/issues", - "source": "https://github.com/thephpleague/container/tree/4.2.5" + "source": "https://github.com/thephpleague/container/tree/5.2.0" }, "funding": [ { @@ -924,37 +926,42 @@ "type": "github" } ], - "time": "2025-05-20T12:55:37+00:00" + "time": "2026-03-19T18:52:39+00:00" }, { "name": "league/uri", - "version": "7.5.1", + "version": "7.8.1", "source": { "type": "git", "url": "https://github.com/thephpleague/uri.git", - "reference": "81fb5145d2644324614cc532b28efd0215bda430" + "reference": "08cf38e3924d4f56238125547b5720496fac8fd4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri/zipball/81fb5145d2644324614cc532b28efd0215bda430", - "reference": "81fb5145d2644324614cc532b28efd0215bda430", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/08cf38e3924d4f56238125547b5720496fac8fd4", + "reference": "08cf38e3924d4f56238125547b5720496fac8fd4", "shasum": "" }, "require": { - "league/uri-interfaces": "^7.5", - "php": "^8.1" + "league/uri-interfaces": "^7.8.1", + "php": "^8.1", + "psr/http-factory": "^1" }, "conflict": { "league/uri-schemes": "^1.0" }, "suggest": { "ext-bcmath": "to improve IPV4 host parsing", + "ext-dom": "to convert the URI into an HTML anchor tag", "ext-fileinfo": "to create Data URI from file contennts", "ext-gmp": "to improve IPV4 host parsing", "ext-intl": "to handle IDN host with the best performance", - "jeremykendall/php-domain-parser": "to resolve Public Suffix and Top Level Domain", - "league/uri-components": "Needed to easily manipulate URI objects components", + "ext-uri": "to use the PHP native URI class", + "jeremykendall/php-domain-parser": "to further parse the URI host and resolve its Public Suffix and Top Level Domain", + "league/uri-components": "to provide additional tools to manipulate URI objects components", + "league/uri-polyfill": "to backport the PHP URI extension for older versions of PHP", "php-64bit": "to improve IPV4 host parsing", + "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification", "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" }, "type": "library", @@ -982,6 +989,7 @@ "description": "URI manipulation library", "homepage": "https://uri.thephpleague.com", "keywords": [ + "URN", "data-uri", "file-uri", "ftp", @@ -994,9 +1002,11 @@ "psr-7", "query-string", "querystring", + "rfc2141", "rfc3986", "rfc3987", "rfc6570", + "rfc8141", "uri", "uri-template", "url", @@ -1006,7 +1016,7 @@ "docs": "https://uri.thephpleague.com", "forum": "https://thephpleague.slack.com", "issues": "https://github.com/thephpleague/uri-src/issues", - "source": "https://github.com/thephpleague/uri/tree/7.5.1" + "source": "https://github.com/thephpleague/uri/tree/7.8.1" }, "funding": [ { @@ -1014,26 +1024,25 @@ "type": "github" } ], - "time": "2024-12-08T08:40:02+00:00" + "time": "2026-03-15T20:22:25+00:00" }, { "name": "league/uri-interfaces", - "version": "7.5.0", + "version": "7.8.1", "source": { "type": "git", "url": "https://github.com/thephpleague/uri-interfaces.git", - "reference": "08cfc6c4f3d811584fb09c37e2849e6a7f9b0742" + "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/08cfc6c4f3d811584fb09c37e2849e6a7f9b0742", - "reference": "08cfc6c4f3d811584fb09c37e2849e6a7f9b0742", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/85d5c77c5d6d3af6c54db4a78246364908f3c928", + "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928", "shasum": "" }, "require": { "ext-filter": "*", "php": "^8.1", - "psr/http-factory": "^1", "psr/http-message": "^1.1 || ^2.0" }, "suggest": { @@ -1041,6 +1050,7 @@ "ext-gmp": "to improve IPV4 host parsing", "ext-intl": "to handle IDN host with the best performance", "php-64bit": "to improve IPV4 host parsing", + "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification", "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" }, "type": "library", @@ -1065,7 +1075,7 @@ "homepage": "https://nyamsprod.com" } ], - "description": "Common interfaces and classes for URI representation and interaction", + "description": "Common tools for parsing and resolving RFC3987/RFC3986 URI", "homepage": "https://uri.thephpleague.com", "keywords": [ "data-uri", @@ -1090,7 +1100,7 @@ "docs": "https://uri.thephpleague.com", "forum": "https://thephpleague.slack.com", "issues": "https://github.com/thephpleague/uri-src/issues", - "source": "https://github.com/thephpleague/uri-interfaces/tree/7.5.0" + "source": "https://github.com/thephpleague/uri-interfaces/tree/7.8.1" }, "funding": [ { @@ -1098,7 +1108,7 @@ "type": "github" } ], - "time": "2024-12-08T08:18:47+00:00" + "time": "2026-03-08T20:05:35+00:00" }, { "name": "masterminds/html5", @@ -1169,29 +1179,28 @@ }, { "name": "mobiledetect/mobiledetectlib", - "version": "4.8.09", + "version": "4.10.0", "source": { "type": "git", "url": "https://github.com/serbanghita/Mobile-Detect.git", - "reference": "a06fe2e546a06bb8c2639d6823d5250b2efb3209" + "reference": "1473bd9d6aa40158f75f1e05116e6dd081148b2c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/serbanghita/Mobile-Detect/zipball/a06fe2e546a06bb8c2639d6823d5250b2efb3209", - "reference": "a06fe2e546a06bb8c2639d6823d5250b2efb3209", + "url": "https://api.github.com/repos/serbanghita/Mobile-Detect/zipball/1473bd9d6aa40158f75f1e05116e6dd081148b2c", + "reference": "1473bd9d6aa40158f75f1e05116e6dd081148b2c", "shasum": "" }, "require": { - "php": ">=8.0", - "psr/cache": "^3.0", - "psr/simple-cache": "^3" + "php": ">=8.2", + "psr/simple-cache": "^1.0 || ^2.0 || ^3.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^v3.65.0", - "phpbench/phpbench": "^1.2", - "phpstan/phpstan": "^1.12.x-dev", - "phpunit/phpunit": "^9.6.18", - "squizlabs/php_codesniffer": "^3.11.1" + "friendsofphp/php-cs-fixer": "3.95.1", + "phpbench/phpbench": "1.6.1", + "phpstan/phpstan": "2.1.47", + "phpunit/phpunit": "9.6.34", + "squizlabs/php_codesniffer": "3.13.5" }, "type": "library", "autoload": { @@ -1222,7 +1231,7 @@ ], "support": { "issues": "https://github.com/serbanghita/Mobile-Detect/issues", - "source": "https://github.com/serbanghita/Mobile-Detect/tree/4.8.09" + "source": "https://github.com/serbanghita/Mobile-Detect/tree/4.10.0" }, "funding": [ { @@ -1230,7 +1239,7 @@ "type": "github" } ], - "time": "2024-12-10T15:32:06+00:00" + "time": "2026-04-23T13:05:57+00:00" }, { "name": "psr/cache", @@ -1382,6 +1391,56 @@ }, "time": "2021-11-05T16:47:00+00:00" }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, { "name": "psr/http-client", "version": "1.0.3", @@ -1757,130 +1816,35 @@ "time": "2021-10-29T13:26:27+00:00" }, { - "name": "robmorgan/phinx", - "version": "0.16.10", + "name": "symfony/deprecation-contracts", + "version": "v3.7.0", "source": { "type": "git", - "url": "https://github.com/cakephp/phinx.git", - "reference": "83f83ec105e55e3abba7acc23c0272b5fcf66929" + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "50f59d1f3ca46d41ac911f97a78626b6756af35b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/phinx/zipball/83f83ec105e55e3abba7acc23c0272b5fcf66929", - "reference": "83f83ec105e55e3abba7acc23c0272b5fcf66929", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/50f59d1f3ca46d41ac911f97a78626b6756af35b", + "reference": "50f59d1f3ca46d41ac911f97a78626b6756af35b", "shasum": "" }, "require": { - "cakephp/database": "^5.0.2", - "composer-runtime-api": "^2.0", - "php-64bit": ">=8.1", - "psr/container": "^1.1|^2.0", - "symfony/config": "^4.0|^5.0|^6.0|^7.0", - "symfony/console": "^6.0|^7.0" - }, - "require-dev": { - "cakephp/cakephp-codesniffer": "^5.0", - "cakephp/i18n": "^5.0", - "ext-json": "*", - "ext-pdo": "*", - "phpunit/phpunit": "^9.5.19", - "symfony/yaml": "^4.0|^5.0|^6.0|^7.0" - }, - "suggest": { - "ext-json": "Install if using JSON configuration format", - "ext-pdo": "PDO extension is needed", - "symfony/yaml": "Install if using YAML configuration format" + "php": ">=8.1" }, - "bin": [ - "bin/phinx" - ], "type": "library", - "autoload": { - "psr-4": { - "Phinx\\": "src/Phinx/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Rob Morgan", - "email": "robbym@gmail.com", - "homepage": "https://robmorgan.id.au", - "role": "Lead Developer" - }, - { - "name": "Woody Gilk", - "email": "woody.gilk@gmail.com", - "homepage": "https://shadowhand.me", - "role": "Developer" - }, - { - "name": "Richard Quadling", - "email": "rquadling@gmail.com", - "role": "Developer" + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" }, - { - "name": "CakePHP Community", - "homepage": "https://github.com/cakephp/phinx/graphs/contributors", - "role": "Developer" + "branch-alias": { + "dev-main": "3.7-dev" } - ], - "description": "Phinx makes it ridiculously easy to manage the database migrations for your PHP app.", - "homepage": "https://phinx.org", - "keywords": [ - "database", - "database migrations", - "db", - "migrations", - "phinx" - ], - "support": { - "issues": "https://github.com/cakephp/phinx/issues", - "source": "https://github.com/cakephp/phinx/tree/0.16.10" - }, - "time": "2025-07-08T18:55:28+00:00" - }, - { - "name": "symfony/config", - "version": "v7.3.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/config.git", - "reference": "faef36e271bbeb74a9d733be4b56419b157762e2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/faef36e271bbeb74a9d733be4b56419b157762e2", - "reference": "faef36e271bbeb74a9d733be4b56419b157762e2", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/filesystem": "^7.1", - "symfony/polyfill-ctype": "~1.8" - }, - "conflict": { - "symfony/finder": "<6.4", - "symfony/service-contracts": "<2.5" - }, - "require-dev": { - "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/finder": "^6.4|^7.0", - "symfony/messenger": "^6.4|^7.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^6.4|^7.0" }, - "type": "library", "autoload": { - "psr-4": { - "Symfony\\Component\\Config\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "files": [ + "function.php" ] }, "notification-url": "https://packagist.org/downloads/", @@ -1889,18 +1853,18 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", + "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v7.3.2" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.7.0" }, "funding": [ { @@ -1920,56 +1884,33 @@ "type": "tidelift" } ], - "time": "2025-07-26T13:55:06+00:00" + "time": "2026-04-13T15:52:40+00:00" }, { - "name": "symfony/console", - "version": "v7.3.3", + "name": "symfony/html-sanitizer", + "version": "v7.4.13", "source": { "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "cb0102a1c5ac3807cf3fdf8bea96007df7fdbea7" + "url": "https://github.com/symfony/html-sanitizer.git", + "reference": "761f6c49dfd103ee08b3cd09ece588b069e18ec9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/cb0102a1c5ac3807cf3fdf8bea96007df7fdbea7", - "reference": "cb0102a1c5ac3807cf3fdf8bea96007df7fdbea7", + "url": "https://api.github.com/repos/symfony/html-sanitizer/zipball/761f6c49dfd103ee08b3cd09ece588b069e18ec9", + "reference": "761f6c49dfd103ee08b3cd09ece588b069e18ec9", "shasum": "" }, "require": { + "ext-dom": "*", + "league/uri": "^6.5|^7.0", + "masterminds/html5": "^2.7.2", "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^7.2" - }, - "conflict": { - "symfony/dependency-injection": "<6.4", - "symfony/dotenv": "<6.4", - "symfony/event-dispatcher": "<6.4", - "symfony/lock": "<6.4", - "symfony/process": "<6.4" - }, - "provide": { - "psr/log-implementation": "1.0|2.0|3.0" - }, - "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/lock": "^6.4|^7.0", - "symfony/messenger": "^6.4|^7.0", - "symfony/process": "^6.4|^7.0", - "symfony/stopwatch": "^6.4|^7.0", - "symfony/var-dumper": "^6.4|^7.0" + "symfony/deprecation-contracts": "^2.5|^3" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Console\\": "" + "Symfony\\Component\\HtmlSanitizer\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -1981,24 +1922,23 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Titouan Galopin", + "email": "galopintitouan@gmail.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Eases the creation of beautiful and testable command line interfaces", + "description": "Provides an object-oriented API to sanitize untrusted HTML input for safe insertion into a document's DOM.", "homepage": "https://symfony.com", "keywords": [ - "cli", - "command-line", - "console", - "terminal" + "Purifier", + "html", + "sanitizer" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.3.3" + "source": "https://github.com/symfony/html-sanitizer/tree/v7.4.13" }, "funding": [ { @@ -2018,105 +1958,90 @@ "type": "tidelift" } ], - "time": "2025-08-25T06:35:40+00:00" - }, + "time": "2026-05-24T11:20:33+00:00" + } + ], + "packages-dev": [ { - "name": "symfony/deprecation-contracts", - "version": "v3.6.0", + "name": "brick/varexporter", + "version": "0.7.0", "source": { "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" + "url": "https://github.com/brick/varexporter.git", + "reference": "b3a50b8f630a9ed5015ea3e1f00479af261ed80d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", - "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", + "url": "https://api.github.com/repos/brick/varexporter/zipball/b3a50b8f630a9ed5015ea3e1f00479af261ed80d", + "reference": "b3a50b8f630a9ed5015ea3e1f00479af261ed80d", "shasum": "" }, "require": { - "php": ">=8.1" + "nikic/php-parser": "^5.0", + "php": "^8.2" }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, - "branch-alias": { - "dev-main": "3.6-dev" - } + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^11.0", + "vimeo/psalm": "6.14.3" }, + "type": "library", "autoload": { - "files": [ - "function.php" - ] + "psr-4": { + "Brick\\VarExporter\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } + "description": "A powerful alternative to var_export(), which can export closures and objects without __set_state()", + "keywords": [ + "var_export" ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" + "issues": "https://github.com/brick/varexporter/issues", + "source": "https://github.com/brick/varexporter/tree/0.7.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/BenMorel", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2026-01-06T22:56:00+00:00" }, { - "name": "symfony/filesystem", - "version": "v7.3.2", + "name": "cakephp/bake", + "version": "3.6.4", "source": { "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "edcbb768a186b5c3f25d0643159a787d3e63b7fd" + "url": "https://github.com/cakephp/bake.git", + "reference": "45139a702f039b64dcfb758bff60910861486060" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/edcbb768a186b5c3f25d0643159a787d3e63b7fd", - "reference": "edcbb768a186b5c3f25d0643159a787d3e63b7fd", + "url": "https://api.github.com/repos/cakephp/bake/zipball/45139a702f039b64dcfb758bff60910861486060", + "reference": "45139a702f039b64dcfb758bff60910861486060", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8" + "brick/varexporter": "^0.6.0 || ^0.7.0", + "cakephp/cakephp": "^5.1", + "cakephp/twig-view": "^2.0.2", + "nikic/php-parser": "^5.0.0", + "php": ">=8.1" }, "require-dev": { - "symfony/process": "^6.4|^7.0" + "cakephp/cakephp-codesniffer": "^5.0.0", + "cakephp/debug_kit": "^5.0.0", + "phpunit/phpunit": "^10.5.40 || ^11.5.20 || ^12.2.4" }, - "type": "library", + "type": "cakephp-plugin", "autoload": { "psr-4": { - "Symfony\\Component\\Filesystem\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Bake\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2124,751 +2049,48 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "CakePHP Community", + "homepage": "https://github.com/cakephp/bake/graphs/contributors" } ], - "description": "Provides basic utilities for the filesystem", - "homepage": "https://symfony.com", + "description": "Bake plugin for CakePHP", + "homepage": "https://github.com/cakephp/bake", + "keywords": [ + "bake", + "cakephp", + "cli", + "dev" + ], "support": { - "source": "https://github.com/symfony/filesystem/tree/v7.3.2" + "forum": "https://stackoverflow.com/tags/cakephp", + "issues": "https://github.com/cakephp/bake/issues", + "source": "https://github.com/cakephp/bake" }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2025-07-07T08:17:47+00:00" - }, - { - "name": "symfony/html-sanitizer", - "version": "v7.3.3", - "source": { - "type": "git", - "url": "https://github.com/symfony/html-sanitizer.git", - "reference": "8740fc48979f649dee8b8fc51a2698e5c190bf12" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/html-sanitizer/zipball/8740fc48979f649dee8b8fc51a2698e5c190bf12", - "reference": "8740fc48979f649dee8b8fc51a2698e5c190bf12", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "league/uri": "^6.5|^7.0", - "masterminds/html5": "^2.7.2", - "php": ">=8.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\HtmlSanitizer\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Titouan Galopin", - "email": "galopintitouan@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides an object-oriented API to sanitize untrusted HTML input for safe insertion into a document's DOM.", - "homepage": "https://symfony.com", - "keywords": [ - "Purifier", - "html", - "sanitizer" - ], - "support": { - "source": "https://github.com/symfony/html-sanitizer/tree/v7.3.3" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2025-08-12T10:34:03+00:00" - }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.33.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "provide": { - "ext-ctype": "*" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-09-09T11:45:10+00:00" - }, - { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.33.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", - "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's grapheme_* functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "grapheme", - "intl", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2025-06-27T09:58:17+00:00" - }, - { - "name": "symfony/polyfill-intl-normalizer", - "version": "v1.33.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "3833d7255cc303546435cb650316bff708a1c75c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", - "reference": "3833d7255cc303546435cb650316bff708a1c75c", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "intl", - "normalizer", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-09-09T11:45:10+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.33.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", - "shasum": "" - }, - "require": { - "ext-iconv": "*", - "php": ">=7.2" - }, - "provide": { - "ext-mbstring": "*" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-12-23T08:48:59+00:00" - }, - { - "name": "symfony/service-contracts", - "version": "v3.6.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f021b05a130d35510bd6b25fe9053c2a8a15d5d4", - "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "psr/container": "^1.1|^2.0", - "symfony/deprecation-contracts": "^2.5|^3" - }, - "conflict": { - "ext-psr": "<1.1|>=2" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, - "branch-alias": { - "dev-main": "3.6-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Service\\": "" - }, - "exclude-from-classmap": [ - "/Test/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.6.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2025-04-25T09:37:31+00:00" - }, - { - "name": "symfony/string", - "version": "v7.3.3", - "source": { - "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "17a426cce5fd1f0901fefa9b2a490d0038fd3c9c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/17a426cce5fd1f0901fefa9b2a490d0038fd3c9c", - "reference": "17a426cce5fd1f0901fefa9b2a490d0038fd3c9c", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0" - }, - "conflict": { - "symfony/translation-contracts": "<2.5" - }, - "require-dev": { - "symfony/emoji": "^7.1", - "symfony/error-handler": "^6.4|^7.0", - "symfony/http-client": "^6.4|^7.0", - "symfony/intl": "^6.4|^7.0", - "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "files": [ - "Resources/functions.php" - ], - "psr-4": { - "Symfony\\Component\\String\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", - "homepage": "https://symfony.com", - "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" - ], - "support": { - "source": "https://github.com/symfony/string/tree/v7.3.3" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2025-08-25T06:35:40+00:00" - } - ], - "packages-dev": [ - { - "name": "brick/varexporter", - "version": "0.6.0", - "source": { - "type": "git", - "url": "https://github.com/brick/varexporter.git", - "reference": "af98bfc2b702a312abbcaff37656dbe419cec5bc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/brick/varexporter/zipball/af98bfc2b702a312abbcaff37656dbe419cec5bc", - "reference": "af98bfc2b702a312abbcaff37656dbe419cec5bc", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^5.0", - "php": "^8.1" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.2", - "phpunit/phpunit": "^10.5", - "vimeo/psalm": "6.8.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Brick\\VarExporter\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A powerful alternative to var_export(), which can export closures and objects without __set_state()", - "keywords": [ - "var_export" - ], - "support": { - "issues": "https://github.com/brick/varexporter/issues", - "source": "https://github.com/brick/varexporter/tree/0.6.0" - }, - "funding": [ - { - "url": "https://github.com/BenMorel", - "type": "github" - } - ], - "time": "2025-02-20T17:42:39+00:00" - }, - { - "name": "cakephp/bake", - "version": "3.4.0", - "source": { - "type": "git", - "url": "https://github.com/cakephp/bake.git", - "reference": "a0d2b96486dc5b8547b8e358cd1e218b9ed07d9d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cakephp/bake/zipball/a0d2b96486dc5b8547b8e358cd1e218b9ed07d9d", - "reference": "a0d2b96486dc5b8547b8e358cd1e218b9ed07d9d", - "shasum": "" - }, - "require": { - "brick/varexporter": "^0.6.0", - "cakephp/cakephp": "^5.1", - "cakephp/twig-view": "^2.0.0", - "nikic/php-parser": "^5.0.0", - "php": ">=8.1" - }, - "require-dev": { - "cakephp/cakephp-codesniffer": "^5.0.0", - "cakephp/debug_kit": "^5.0.0", - "phpunit/phpunit": "^10.5.5 || ^11.1.3" - }, - "type": "cakephp-plugin", - "autoload": { - "psr-4": { - "Bake\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "CakePHP Community", - "homepage": "https://github.com/cakephp/bake/graphs/contributors" - } - ], - "description": "Bake plugin for CakePHP", - "homepage": "https://github.com/cakephp/bake", - "keywords": [ - "bake", - "cakephp", - "cli", - "dev" - ], - "support": { - "forum": "https://stackoverflow.com/tags/cakephp", - "issues": "https://github.com/cakephp/bake/issues", - "source": "https://github.com/cakephp/bake" - }, - "time": "2025-06-25T19:18:09+00:00" + "time": "2026-05-08T13:56:13+00:00" }, { "name": "cakephp/cakephp-codesniffer", - "version": "5.2.2", + "version": "5.3.0", "source": { "type": "git", "url": "https://github.com/cakephp/cakephp-codesniffer.git", - "reference": "3c62979556e98d0330f8af8b103ad1ade0a7067e" + "reference": "8c9481165b0f2819ac58894c9a7e5599a55ad678" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/cakephp-codesniffer/zipball/3c62979556e98d0330f8af8b103ad1ade0a7067e", - "reference": "3c62979556e98d0330f8af8b103ad1ade0a7067e", + "url": "https://api.github.com/repos/cakephp/cakephp-codesniffer/zipball/8c9481165b0f2819ac58894c9a7e5599a55ad678", + "reference": "8c9481165b0f2819ac58894c9a7e5599a55ad678", "shasum": "" }, "require": { - "php": ">=8.1.0", - "phpstan/phpdoc-parser": "^2.1.0", - "slevomat/coding-standard": "^8.16", - "squizlabs/php_codesniffer": "^3.9" + "dealerdirect/phpcodesniffer-composer-installer": "^1.1.2", + "php": ">=8.1", + "phpstan/phpdoc-parser": "^2.1", + "slevomat/coding-standard": "^8.23", + "squizlabs/php_codesniffer": "^4.0" }, "require-dev": { - "phpunit/phpunit": "^9.3.4" + "phpunit/phpunit": "^10.5.32 || ^11.3.3" }, "type": "phpcodesniffer-standard", "autoload": { @@ -2898,32 +2120,32 @@ "issues": "https://github.com/cakephp/cakephp-codesniffer/issues", "source": "https://github.com/cakephp/cakephp-codesniffer" }, - "time": "2025-06-07T17:04:07+00:00" + "time": "2025-09-19T15:47:28+00:00" }, { "name": "cakephp/debug_kit", - "version": "5.1.3", + "version": "5.2.2", "source": { "type": "git", "url": "https://github.com/cakephp/debug_kit.git", - "reference": "6c33eb2993d790d98a27a47a74a10330d699ac07" + "reference": "72cc1b7a4ad9aaa2b841ade1d22aa649955bf017" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/debug_kit/zipball/6c33eb2993d790d98a27a47a74a10330d699ac07", - "reference": "6c33eb2993d790d98a27a47a74a10330d699ac07", + "url": "https://api.github.com/repos/cakephp/debug_kit/zipball/72cc1b7a4ad9aaa2b841ade1d22aa649955bf017", + "reference": "72cc1b7a4ad9aaa2b841ade1d22aa649955bf017", "shasum": "" }, "require": { "cakephp/cakephp": "^5.1", - "composer/composer": "^2.0", + "composer/composer": "^2.7.7", "doctrine/sql-formatter": "^1.1.3", "php": ">=8.1" }, "require-dev": { "cakephp/authorization": "^3.0", "cakephp/cakephp-codesniffer": "^5.0", - "phpunit/phpunit": "^10.5.5 || ^11.1.3" + "phpunit/phpunit": "^10.5.32 || ^11.1.3 || ^12.0.9" }, "suggest": { "ext-pdo_sqlite": "DebugKit needs to store panel data in a database. SQLite is simple and easy to use." @@ -2963,25 +2185,26 @@ "issues": "https://github.com/cakephp/debug_kit/issues", "source": "https://github.com/cakephp/debug_kit" }, - "time": "2025-08-03T15:06:57+00:00" + "time": "2026-05-01T06:20:22+00:00" }, { "name": "cakephp/twig-view", - "version": "2.0.3", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/cakephp/twig-view.git", - "reference": "b11df8e8734ae556d98b143192377dbc6a6f5360" + "reference": "db51ee49c0cb9be4af39497f1724393b7ce51211" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/twig-view/zipball/b11df8e8734ae556d98b143192377dbc6a6f5360", - "reference": "b11df8e8734ae556d98b143192377dbc6a6f5360", + "url": "https://api.github.com/repos/cakephp/twig-view/zipball/db51ee49c0cb9be4af39497f1724393b7ce51211", + "reference": "db51ee49c0cb9be4af39497f1724393b7ce51211", "shasum": "" }, "require": { "cakephp/cakephp": "^5.0.0", "jasny/twig-extensions": "^1.3", + "php": ">=8.1", "twig/markdown-extra": "^3.0", "twig/twig": "^3.11.1" }, @@ -2993,7 +2216,7 @@ "cakephp/debug_kit": "^5.0", "michelf/php-markdown": "^1.9", "mikey179/vfsstream": "^1.6.10", - "phpunit/phpunit": "^10.5.5 || ^11.1.3" + "phpunit/phpunit": "^11.5.3 | ^12.1.3" }, "type": "cakephp-plugin", "autoload": { @@ -3024,26 +2247,26 @@ "issues": "https://github.com/cakephp/twig-view/issues", "source": "https://github.com/cakephp/twig-view" }, - "time": "2024-10-11T07:53:08+00:00" + "time": "2026-01-05T22:35:06+00:00" }, { "name": "composer/class-map-generator", - "version": "1.6.2", + "version": "1.7.3", "source": { "type": "git", "url": "https://github.com/composer/class-map-generator.git", - "reference": "ba9f089655d4cdd64e762a6044f411ccdaec0076" + "reference": "86d8208fc3c649a3a999daf1a63c25201be2990f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/ba9f089655d4cdd64e762a6044f411ccdaec0076", - "reference": "ba9f089655d4cdd64e762a6044f411ccdaec0076", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/86d8208fc3c649a3a999daf1a63c25201be2990f", + "reference": "86d8208fc3c649a3a999daf1a63c25201be2990f", "shasum": "" }, "require": { "composer/pcre": "^2.1 || ^3.1", "php": "^7.2 || ^8.0", - "symfony/finder": "^4.4 || ^5.3 || ^6 || ^7" + "symfony/finder": "^4.4 || ^5.3 || ^6 || ^7 || ^8" }, "require-dev": { "phpstan/phpstan": "^1.12 || ^2", @@ -3051,7 +2274,7 @@ "phpstan/phpstan-phpunit": "^1 || ^2", "phpstan/phpstan-strict-rules": "^1.1 || ^2", "phpunit/phpunit": "^8", - "symfony/filesystem": "^5.4 || ^6" + "symfony/filesystem": "^5.4 || ^6 || ^7 || ^8" }, "type": "library", "extra": { @@ -3081,7 +2304,7 @@ ], "support": { "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.6.2" + "source": "https://github.com/composer/class-map-generator/tree/1.7.3" }, "funding": [ { @@ -3093,44 +2316,46 @@ "type": "github" } ], - "time": "2025-08-20T18:52:43+00:00" + "time": "2026-05-05T09:17:07+00:00" }, { "name": "composer/composer", - "version": "2.8.11", + "version": "2.9.8", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "00e1a3396eea67033775c4a49c772376f45acd73" + "reference": "39ee8baff8e97a1b657bbfcd6a236ff93a5efbb2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/00e1a3396eea67033775c4a49c772376f45acd73", - "reference": "00e1a3396eea67033775c4a49c772376f45acd73", + "url": "https://api.github.com/repos/composer/composer/zipball/39ee8baff8e97a1b657bbfcd6a236ff93a5efbb2", + "reference": "39ee8baff8e97a1b657bbfcd6a236ff93a5efbb2", "shasum": "" }, "require": { "composer/ca-bundle": "^1.5", "composer/class-map-generator": "^1.4.0", "composer/metadata-minifier": "^1.0", - "composer/pcre": "^2.2 || ^3.2", + "composer/pcre": "^2.3 || ^3.3", "composer/semver": "^3.3", "composer/spdx-licenses": "^1.5.7", "composer/xdebug-handler": "^2.0.2 || ^3.0.3", - "justinrainbow/json-schema": "^6.3.1", + "ext-json": "*", + "justinrainbow/json-schema": "^6.5.1", "php": "^7.2.5 || ^8.0", "psr/log": "^1.0 || ^2.0 || ^3.0", - "react/promise": "^2.11 || ^3.3", + "react/promise": "^3.3", "seld/jsonlint": "^1.4", "seld/phar-utils": "^1.2", "seld/signal-handler": "^2.0", - "symfony/console": "^5.4.35 || ^6.3.12 || ^7.0.3", - "symfony/filesystem": "^5.4.35 || ^6.3.12 || ^7.0.3", - "symfony/finder": "^5.4.35 || ^6.3.12 || ^7.0.3", + "symfony/console": "^5.4.47 || ^6.4.25 || ^7.1.10 || ^8.0", + "symfony/filesystem": "^5.4.45 || ^6.4.24 || ^7.1.10 || ^8.0", + "symfony/finder": "^5.4.45 || ^6.4.24 || ^7.1.10 || ^8.0", "symfony/polyfill-php73": "^1.24", "symfony/polyfill-php80": "^1.24", "symfony/polyfill-php81": "^1.24", - "symfony/process": "^5.4.35 || ^6.3.12 || ^7.0.3" + "symfony/polyfill-php84": "^1.30", + "symfony/process": "^5.4.47 || ^6.4.25 || ^7.1.10 || ^8.0" }, "require-dev": { "phpstan/phpstan": "^1.11.8", @@ -3138,12 +2363,13 @@ "phpstan/phpstan-phpunit": "^1.4.0", "phpstan/phpstan-strict-rules": "^1.6.0", "phpstan/phpstan-symfony": "^1.4.0", - "symfony/phpunit-bridge": "^6.4.3 || ^7.0.1" + "symfony/phpunit-bridge": "^6.4.25 || ^7.3.3 || ^8.0" }, "suggest": { - "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", - "ext-zip": "Enabling the zip extension allows you to unzip archives", - "ext-zlib": "Allow gzip compression of HTTP requests" + "ext-curl": "Provides HTTP support (will fallback to PHP streams if missing)", + "ext-openssl": "Enables access to repositories and packages over HTTPS", + "ext-zip": "Allows direct extraction of ZIP archives (unzip/7z binaries will be used instead if available)", + "ext-zlib": "Enables gzip for HTTP requests" }, "bin": [ "bin/composer" @@ -3156,7 +2382,7 @@ ] }, "branch-alias": { - "dev-main": "2.8-dev" + "dev-main": "2.9-dev" } }, "autoload": { @@ -3191,7 +2417,7 @@ "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", "security": "https://github.com/composer/composer/security/policy", - "source": "https://github.com/composer/composer/tree/2.8.11" + "source": "https://github.com/composer/composer/tree/2.9.8" }, "funding": [ { @@ -3203,7 +2429,7 @@ "type": "github" } ], - "time": "2025-08-21T09:29:39+00:00" + "time": "2026-05-13T07:28:38+00:00" }, { "name": "composer/metadata-minifier", @@ -3432,24 +2658,24 @@ }, { "name": "composer/spdx-licenses", - "version": "1.5.9", + "version": "1.6.0", "source": { "type": "git", "url": "https://github.com/composer/spdx-licenses.git", - "reference": "edf364cefe8c43501e21e88110aac10b284c3c9f" + "reference": "5ecd0cb4177696f9fd48f1605dda81db3dee7889" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/edf364cefe8c43501e21e88110aac10b284c3c9f", - "reference": "edf364cefe8c43501e21e88110aac10b284c3c9f", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/5ecd0cb4177696f9fd48f1605dda81db3dee7889", + "reference": "5ecd0cb4177696f9fd48f1605dda81db3dee7889", "shasum": "" }, "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" + "php": "^7.2 || ^8.0" }, "require-dev": { "phpstan/phpstan": "^1.11", - "symfony/phpunit-bridge": "^3 || ^7" + "symfony/phpunit-bridge": "^6.4.25 || ^7.3.3 || ^8.0" }, "type": "library", "extra": { @@ -3492,7 +2718,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/spdx-licenses/issues", - "source": "https://github.com/composer/spdx-licenses/tree/1.5.9" + "source": "https://github.com/composer/spdx-licenses/tree/1.6.0" }, "funding": [ { @@ -3502,13 +2728,9 @@ { "url": "https://github.com/composer", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" } ], - "time": "2025-05-12T21:07:07+00:00" + "time": "2026-04-08T20:18:39+00:00" }, { "name": "composer/xdebug-handler", @@ -3578,29 +2800,29 @@ }, { "name": "dealerdirect/phpcodesniffer-composer-installer", - "version": "v1.1.2", + "version": "v1.2.1", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/composer-installer.git", - "reference": "e9cf5e4bbf7eeaf9ef5db34938942602838fc2b1" + "reference": "963f0c67bffde0eac41b56be71ac0e8ba132f0bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/e9cf5e4bbf7eeaf9ef5db34938942602838fc2b1", - "reference": "e9cf5e4bbf7eeaf9ef5db34938942602838fc2b1", + "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/963f0c67bffde0eac41b56be71ac0e8ba132f0bd", + "reference": "963f0c67bffde0eac41b56be71ac0e8ba132f0bd", "shasum": "" }, "require": { "composer-plugin-api": "^2.2", "php": ">=5.4", - "squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0" + "squizlabs/php_codesniffer": "^3.1.0 || ^4.0" }, "require-dev": { "composer/composer": "^2.2", "ext-json": "*", "ext-zip": "*", "php-parallel-lint/php-parallel-lint": "^1.4.0", - "phpcompatibility/php-compatibility": "^9.0", + "phpcompatibility/php-compatibility": "^9.0 || ^10.0.0@dev", "yoast/phpunit-polyfills": "^1.0" }, "type": "composer-plugin", @@ -3670,30 +2892,30 @@ "type": "thanks_dev" } ], - "time": "2025-07-17T20:45:56+00:00" + "time": "2026-05-06T08:26:05+00:00" }, { "name": "doctrine/sql-formatter", - "version": "1.5.2", + "version": "1.5.4", "source": { "type": "git", "url": "https://github.com/doctrine/sql-formatter.git", - "reference": "d6d00aba6fd2957fe5216fe2b7673e9985db20c8" + "reference": "9563949f5cd3bd12a17d12fb980528bc141c5806" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/d6d00aba6fd2957fe5216fe2b7673e9985db20c8", - "reference": "d6d00aba6fd2957fe5216fe2b7673e9985db20c8", + "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/9563949f5cd3bd12a17d12fb980528bc141c5806", + "reference": "9563949f5cd3bd12a17d12fb980528bc141c5806", "shasum": "" }, "require": { "php": "^8.1" }, "require-dev": { - "doctrine/coding-standard": "^12", - "ergebnis/phpunit-slow-test-detector": "^2.14", - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^10.5" + "doctrine/coding-standard": "^14", + "ergebnis/phpunit-slow-test-detector": "^2.20", + "phpstan/phpstan": "^2.1.31", + "phpunit/phpunit": "^10.5.58" }, "bin": [ "bin/sql-formatter" @@ -3723,9 +2945,9 @@ ], "support": { "issues": "https://github.com/doctrine/sql-formatter/issues", - "source": "https://github.com/doctrine/sql-formatter/tree/1.5.2" + "source": "https://github.com/doctrine/sql-formatter/tree/1.5.4" }, - "time": "2025-01-24T11:45:48+00:00" + "time": "2026-02-08T16:21:46+00:00" }, { "name": "jasny/twig-extensions", @@ -3852,26 +3074,26 @@ }, { "name": "justinrainbow/json-schema", - "version": "6.5.2", + "version": "6.8.2", "source": { "type": "git", "url": "https://github.com/jsonrainbow/json-schema.git", - "reference": "ac0d369c09653cf7af561f6d91a705bc617a87b8" + "reference": "2c89ebb95ca9cedc9347f780333f7b25792dcb76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/ac0d369c09653cf7af561f6d91a705bc617a87b8", - "reference": "ac0d369c09653cf7af561f6d91a705bc617a87b8", + "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/2c89ebb95ca9cedc9347f780333f7b25792dcb76", + "reference": "2c89ebb95ca9cedc9347f780333f7b25792dcb76", "shasum": "" }, "require": { "ext-json": "*", - "marc-mabe/php-enum": "^4.0", + "marc-mabe/php-enum": "^4.4", "php": "^7.2 || ^8.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "3.3.0", - "json-schema/json-schema-test-suite": "^23.2", + "json-schema/json-schema-test-suite": "dev-main", "marc-mabe/php-enum-phpstan": "^2.0", "phpspec/prophecy": "^1.19", "phpstan/phpstan": "^1.12", @@ -3921,9 +3143,9 @@ ], "support": { "issues": "https://github.com/jsonrainbow/json-schema/issues", - "source": "https://github.com/jsonrainbow/json-schema/tree/6.5.2" + "source": "https://github.com/jsonrainbow/json-schema/tree/6.8.2" }, - "time": "2025-09-09T09:42:27+00:00" + "time": "2026-05-05T05:39:01+00:00" }, { "name": "m1/env", @@ -3989,16 +3211,16 @@ }, { "name": "marc-mabe/php-enum", - "version": "v4.7.1", + "version": "v4.7.2", "source": { "type": "git", "url": "https://github.com/marc-mabe/php-enum.git", - "reference": "7159809e5cfa041dca28e61f7f7ae58063aae8ed" + "reference": "bb426fcdd65c60fb3638ef741e8782508fda7eef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/marc-mabe/php-enum/zipball/7159809e5cfa041dca28e61f7f7ae58063aae8ed", - "reference": "7159809e5cfa041dca28e61f7f7ae58063aae8ed", + "url": "https://api.github.com/repos/marc-mabe/php-enum/zipball/bb426fcdd65c60fb3638ef741e8782508fda7eef", + "reference": "bb426fcdd65c60fb3638ef741e8782508fda7eef", "shasum": "" }, "require": { @@ -4056,9 +3278,9 @@ ], "support": { "issues": "https://github.com/marc-mabe/php-enum/issues", - "source": "https://github.com/marc-mabe/php-enum/tree/v4.7.1" + "source": "https://github.com/marc-mabe/php-enum/tree/v4.7.2" }, - "time": "2024-11-28T04:54:44+00:00" + "time": "2025-09-14T11:18:39+00:00" }, { "name": "myclabs/deep-copy", @@ -4122,16 +3344,16 @@ }, { "name": "nikic/php-parser", - "version": "v5.6.1", + "version": "v5.7.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2" + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2", - "reference": "f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", "shasum": "" }, "require": { @@ -4174,9 +3396,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.6.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0" }, - "time": "2025-08-13T20:13:15+00:00" + "time": "2025-12-06T11:56:16+00:00" }, { "name": "phar-io/manifest", @@ -4298,16 +3520,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "2.3.0", + "version": "2.3.2", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "1e0cd5370df5dd2e556a36b9c62f62e555870495" + "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/1e0cd5370df5dd2e556a36b9c62f62e555870495", - "reference": "1e0cd5370df5dd2e556a36b9c62f62e555870495", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/a004701b11273a26cd7955a61d67a7f1e525a45a", + "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a", "shasum": "" }, "require": { @@ -4334,54 +3556,350 @@ }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "support": { + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.2" + }, + "time": "2026-01-25T14:56:51+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "14.1.9", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "655533a65696bbc4231cd8027af150dadc40ec88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/655533a65696bbc4231cd8027af150dadc40ec88", + "reference": "655533a65696bbc4231cd8027af150dadc40ec88", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^5.7.0", + "php": ">=8.4", + "phpunit/php-text-template": "^6.0", + "sebastian/complexity": "^6.0", + "sebastian/environment": "^9.2", + "sebastian/git-state": "^1.0", + "sebastian/lines-of-code": "^5.0", + "sebastian/version": "^7.0", + "theseer/tokenizer": "^2.0.1" + }, + "require-dev": { + "phpunit/phpunit": "^13.1" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "14.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/14.1.9" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-code-coverage", + "type": "tidelift" + } + ], + "time": "2026-05-16T05:16:14+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "7.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "6e5aa1fb0a95b1703d83e721299ee18bb4e2de50" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6e5aa1fb0a95b1703d83e721299ee18bb4e2de50", + "reference": "6e5aa1fb0a95b1703d83e721299ee18bb4e2de50", + "shasum": "" + }, + "require": { + "php": ">=8.4" + }, + "require-dev": { + "phpunit/phpunit": "^13.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/7.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-file-iterator", + "type": "tidelift" + } + ], + "time": "2026-02-06T04:33:26+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "7.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "42e5c5cae0c65df12d1b1a3ab52bf3f50f244d88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/42e5c5cae0c65df12d1b1a3ab52bf3f50f244d88", + "reference": "42e5c5cae0c65df12d1b1a3ab52bf3f50f244d88", + "shasum": "" + }, + "require": { + "php": ">=8.4" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^13.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/7.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-invoker", + "type": "tidelift" + } + ], + "time": "2026-02-06T04:34:47+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "a47af19f93f76aa3368303d752aa5272ca3299f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/a47af19f93f76aa3368303d752aa5272ca3299f4", + "reference": "a47af19f93f76aa3368303d752aa5272ca3299f4", + "shasum": "" + }, + "require": { + "php": ">=8.4" + }, + "require-dev": { + "phpunit/phpunit": "^13.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" ], - "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { - "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.0" + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/6.0.0" }, - "time": "2025-08-30T15:50:23+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-text-template", + "type": "tidelift" + } + ], + "time": "2026-02-06T04:36:37+00:00" }, { - "name": "phpunit/php-code-coverage", - "version": "12.3.6", + "name": "phpunit/php-timer", + "version": "9.0.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "da2cdaff87220fa641e7652364281b736e4347e0" + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "a0e12065831f6ab0d83120dc61513eb8d9a966f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/da2cdaff87220fa641e7652364281b736e4347e0", - "reference": "da2cdaff87220fa641e7652364281b736e4347e0", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/a0e12065831f6ab0d83120dc61513eb8d9a966f6", + "reference": "a0e12065831f6ab0d83120dc61513eb8d9a966f6", "shasum": "" }, "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-xmlwriter": "*", - "nikic/php-parser": "^5.6.1", - "php": ">=8.3", - "phpunit/php-file-iterator": "^6.0", - "phpunit/php-text-template": "^5.0", - "sebastian/complexity": "^5.0", - "sebastian/environment": "^8.0.3", - "sebastian/lines-of-code": "^4.0", - "sebastian/version": "^6.0", - "theseer/tokenizer": "^1.2.3" + "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^12.3.7" - }, - "suggest": { - "ext-pcov": "PHP extension that provides line coverage", - "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + "phpunit/phpunit": "^13.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "12.3.x-dev" + "dev-main": "9.0-dev" } }, "autoload": { @@ -4400,17 +3918,15 @@ "role": "lead" } ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", "keywords": [ - "coverage", - "testing", - "xunit" + "timer" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.3.6" + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "security": "https://github.com/sebastianbergmann/php-timer/security/policy", + "source": "https://github.com/sebastianbergmann/php-timer/tree/9.0.0" }, "funding": [ { @@ -4426,39 +3942,68 @@ "type": "thanks_dev" }, { - "url": "https://tidelift.com/funding/github/packagist/phpunit/php-code-coverage", + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-timer", "type": "tidelift" } ], - "time": "2025-09-02T05:23:14+00:00" + "time": "2026-02-06T04:37:53+00:00" }, { - "name": "phpunit/php-file-iterator", - "version": "6.0.0", + "name": "phpunit/phpunit", + "version": "13.1.11", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "961bc913d42fe24a257bfff826a5068079ac7782" + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "0f540976373361d1b4549adcb87913ce2116e904" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/961bc913d42fe24a257bfff826a5068079ac7782", - "reference": "961bc913d42fe24a257bfff826a5068079ac7782", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0f540976373361d1b4549adcb87913ce2116e904", + "reference": "0f540976373361d1b4549adcb87913ce2116e904", "shasum": "" }, "require": { - "php": ">=8.3" - }, - "require-dev": { - "phpunit/phpunit": "^12.0" + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.13.4", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=8.4.1", + "phpunit/php-code-coverage": "^14.1.9", + "phpunit/php-file-iterator": "^7.0.0", + "phpunit/php-invoker": "^7.0.0", + "phpunit/php-text-template": "^6.0.0", + "phpunit/php-timer": "^9.0.0", + "sebastian/cli-parser": "^5.0.0", + "sebastian/comparator": "^8.2.1", + "sebastian/diff": "^8.3.0", + "sebastian/environment": "^9.3.1", + "sebastian/exporter": "^8.1.0", + "sebastian/git-state": "^1.0", + "sebastian/global-state": "^9.0.0", + "sebastian/object-enumerator": "^8.0.0", + "sebastian/recursion-context": "^8.0.0", + "sebastian/type": "^7.0.1", + "sebastian/version": "^7.0.0", + "staabm/side-effects-detector": "^1.0.5" }, + "bin": [ + "phpunit" + ], "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "13.1-dev" } }, "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], "classmap": [ "src/" ] @@ -4474,53 +4019,202 @@ "role": "lead" } ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", "keywords": [ - "filesystem", - "iterator" + "phpunit", + "testing", + "xunit" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/6.0.0" + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/13.1.11" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", - "type": "github" + "url": "https://phpunit.de/sponsoring.html", + "type": "other" } ], - "time": "2025-02-07T04:58:37+00:00" + "time": "2026-05-21T12:38:47+00:00" }, { - "name": "phpunit/php-invoker", - "version": "6.0.0", + "name": "psy/psysh", + "version": "v0.12.23", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406" + "url": "https://github.com/bobthecow/psysh.git", + "reference": "4dcc0f08047d52bbde475eda481146fd8e27e1a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/12b54e689b07a25a9b41e57736dfab6ec9ae5406", - "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/4dcc0f08047d52bbde475eda481146fd8e27e1a4", + "reference": "4dcc0f08047d52bbde475eda481146fd8e27e1a4", "shasum": "" }, "require": { - "php": ">=8.3" + "ext-json": "*", + "ext-tokenizer": "*", + "nikic/php-parser": "^5.0 || ^4.0", + "php": "^8.0 || ^7.4", + "symfony/console": "^8.0 || ^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^8.0 || ^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4" + }, + "conflict": { + "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" }, "require-dev": { - "ext-pcntl": "*", - "phpunit/phpunit": "^12.0" + "bamarni/composer-bin-plugin": "^1.2", + "composer/class-map-generator": "^1.6" }, "suggest": { - "ext-pcntl": "*" + "composer/class-map-generator": "Improved tab completion performance with better class discovery.", + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well." }, + "bin": [ + "bin/psysh" + ], "type": "library", "extra": { + "bamarni-bin": { + "bin-links": false, + "forward-command": false + }, "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "0.12.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Psy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "https://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "support": { + "issues": "https://github.com/bobthecow/psysh/issues", + "source": "https://github.com/bobthecow/psysh/tree/v0.12.23" + }, + "time": "2026-05-23T13:41:31+00:00" + }, + { + "name": "react/promise", + "version": "v3.3.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/promise.git", + "reference": "23444f53a813a3296c1368bb104793ce8d88f04a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/promise/zipball/23444f53a813a3296c1368bb104793ce8d88f04a", + "reference": "23444f53a813a3296c1368bb104793ce8d88f04a", + "shasum": "" + }, + "require": { + "php": ">=7.1.0" + }, + "require-dev": { + "phpstan/phpstan": "1.12.28 || 1.4.10", + "phpunit/phpunit": "^9.6 || ^7.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "React\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "A lightweight implementation of CommonJS Promises/A for PHP", + "keywords": [ + "promise", + "promises" + ], + "support": { + "issues": "https://github.com/reactphp/promise/issues", + "source": "https://github.com/reactphp/promise/tree/v3.3.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2025-08-19T18:57:03+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "48a4654fa5e48c1c81214e9930048a572d4b23ca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/48a4654fa5e48c1c81214e9930048a572d4b23ca", + "reference": "48a4654fa5e48c1c81214e9930048a572d4b23ca", + "shasum": "" + }, + "require": { + "php": ">=8.4" + }, + "require-dev": { + "phpunit/phpunit": "^13.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" } }, "autoload": { @@ -4539,48 +4233,64 @@ "role": "lead" } ], - "description": "Invoke callables with a timeout", - "homepage": "https://github.com/sebastianbergmann/php-invoker/", - "keywords": [ - "process" - ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", "support": { - "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/6.0.0" + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/5.0.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/cli-parser", + "type": "tidelift" } ], - "time": "2025-02-07T04:58:58+00:00" + "time": "2026-02-06T04:39:44+00:00" }, { - "name": "phpunit/php-text-template", - "version": "5.0.0", + "name": "sebastian/comparator", + "version": "8.2.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53" + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "ce999bf08b2c387a5423fe56961c32eed3f88089" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/e1367a453f0eda562eedb4f659e13aa900d66c53", - "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/ce999bf08b2c387a5423fe56961c32eed3f88089", + "reference": "ce999bf08b2c387a5423fe56961c32eed3f88089", "shasum": "" }, "require": { - "php": ">=8.3" + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.4", + "sebastian/diff": "^8.3", + "sebastian/exporter": "^8.0.3" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^13.1.10" + }, + "suggest": { + "ext-bcmath": "For comparing BcMath\\Number objects" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "8.2-dev" } }, "autoload": { @@ -4595,52 +4305,78 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" } ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", "keywords": [ - "template" + "comparator", + "compare", + "equality" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/5.0.0" + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/8.2.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", + "type": "tidelift" } ], - "time": "2025-02-07T04:59:16+00:00" + "time": "2026-05-21T04:46:40+00:00" }, { - "name": "phpunit/php-timer", - "version": "8.0.0", + "name": "sebastian/complexity", + "version": "6.0.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc" + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "c5651c795c98093480df79350cb050813fc7a2f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", - "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/c5651c795c98093480df79350cb050813fc7a2f3", + "reference": "c5651c795c98093480df79350cb050813fc7a2f3", "shasum": "" }, "require": { - "php": ">=8.3" + "nikic/php-parser": "^5.0", + "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^13.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "8.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -4659,78 +4395,61 @@ "role": "lead" } ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "security": "https://github.com/sebastianbergmann/php-timer/security/policy", - "source": "https://github.com/sebastianbergmann/php-timer/tree/8.0.0" + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/6.0.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/complexity", + "type": "tidelift" } ], - "time": "2025-02-07T04:59:38+00:00" + "time": "2026-02-06T04:41:32+00:00" }, { - "name": "phpunit/phpunit", - "version": "12.3.8", + "name": "sebastian/diff", + "version": "8.3.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "9d68c1b41fc21aac106c71cde4669fe7b99fca10" + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "b36d33b6e796513de7cb7df053afb3f55eefcd47" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9d68c1b41fc21aac106c71cde4669fe7b99fca10", - "reference": "9d68c1b41fc21aac106c71cde4669fe7b99fca10", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b36d33b6e796513de7cb7df053afb3f55eefcd47", + "reference": "b36d33b6e796513de7cb7df053afb3f55eefcd47", "shasum": "" }, "require": { - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.13.4", - "phar-io/manifest": "^2.0.4", - "phar-io/version": "^3.2.1", - "php": ">=8.3", - "phpunit/php-code-coverage": "^12.3.6", - "phpunit/php-file-iterator": "^6.0.0", - "phpunit/php-invoker": "^6.0.0", - "phpunit/php-text-template": "^5.0.0", - "phpunit/php-timer": "^8.0.0", - "sebastian/cli-parser": "^4.0.0", - "sebastian/comparator": "^7.1.3", - "sebastian/diff": "^7.0.0", - "sebastian/environment": "^8.0.3", - "sebastian/exporter": "^7.0.0", - "sebastian/global-state": "^8.0.2", - "sebastian/object-enumerator": "^7.0.0", - "sebastian/type": "^6.0.3", - "sebastian/version": "^6.0.0", - "staabm/side-effects-detector": "^1.0.5" + "php": ">=8.4" + }, + "require-dev": { + "phpunit/phpunit": "^13.0", + "symfony/process": "^7.2" }, - "bin": [ - "phpunit" - ], "type": "library", "extra": { "branch-alias": { - "dev-main": "12.3-dev" + "dev-main": "8.3-dev" } }, "autoload": { - "files": [ - "src/Framework/Assert/Functions.php" - ], "classmap": [ "src/" ] @@ -4742,27 +4461,27 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" } ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", "keywords": [ - "phpunit", - "testing", - "xunit" + "diff", + "udiff", + "unidiff", + "unified diff" ], "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/12.3.8" + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/8.3.0" }, "funding": [ - { - "url": "https://phpunit.de/sponsors.html", - "type": "custom" - }, { "url": "https://github.com/sebastianbergmann", "type": "github" @@ -4776,187 +4495,202 @@ "type": "thanks_dev" }, { - "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "url": "https://tidelift.com/funding/github/packagist/sebastian/diff", "type": "tidelift" } ], - "time": "2025-09-03T06:25:17+00:00" + "time": "2026-05-15T04:58:09+00:00" }, { - "name": "psy/psysh", - "version": "v0.12.10", + "name": "sebastian/environment", + "version": "9.3.1", "source": { "type": "git", - "url": "https://github.com/bobthecow/psysh.git", - "reference": "6e80abe6f2257121f1eb9a4c55bf29d921025b22" + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "a15fa79a5f5cfd0e9f6817dbcdb0048e99efa146" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/6e80abe6f2257121f1eb9a4c55bf29d921025b22", - "reference": "6e80abe6f2257121f1eb9a4c55bf29d921025b22", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/a15fa79a5f5cfd0e9f6817dbcdb0048e99efa146", + "reference": "a15fa79a5f5cfd0e9f6817dbcdb0048e99efa146", "shasum": "" }, "require": { - "ext-json": "*", - "ext-tokenizer": "*", - "nikic/php-parser": "^5.0 || ^4.0", - "php": "^8.0 || ^7.4", - "symfony/console": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4", - "symfony/var-dumper": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4" - }, - "conflict": { - "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" + "php": ">=8.4" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.2" + "phpunit/phpunit": "^13.1.10" }, "suggest": { - "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", - "ext-pdo-sqlite": "The doc command requires SQLite to work.", - "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well." + "ext-posix": "*" }, - "bin": [ - "bin/psysh" - ], "type": "library", "extra": { - "bamarni-bin": { - "bin-links": false, - "forward-command": false - }, "branch-alias": { - "dev-main": "0.12.x-dev" + "dev-main": "9.3-dev" } }, "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "Psy\\": "src/" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Justin Hileman", - "email": "justin@justinhileman.info" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" } ], - "description": "An interactive shell for modern PHP.", - "homepage": "https://psysh.org", + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", "keywords": [ - "REPL", - "console", - "interactive", - "shell" + "Xdebug", + "environment", + "hhvm" ], "support": { - "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.12.10" + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/9.3.1" }, - "time": "2025-08-04T12:39:37+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/environment", + "type": "tidelift" + } + ], + "time": "2026-05-21T08:47:00+00:00" }, { - "name": "react/promise", - "version": "v3.3.0", + "name": "sebastian/exporter", + "version": "8.1.0", "source": { "type": "git", - "url": "https://github.com/reactphp/promise.git", - "reference": "23444f53a813a3296c1368bb104793ce8d88f04a" + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "c0d29a945f8cf82f300a05e69874508e307ca4c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/23444f53a813a3296c1368bb104793ce8d88f04a", - "reference": "23444f53a813a3296c1368bb104793ce8d88f04a", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/c0d29a945f8cf82f300a05e69874508e307ca4c6", + "reference": "c0d29a945f8cf82f300a05e69874508e307ca4c6", "shasum": "" }, "require": { - "php": ">=7.1.0" + "ext-mbstring": "*", + "php": ">=8.4", + "sebastian/recursion-context": "^8.0" }, "require-dev": { - "phpstan/phpstan": "1.12.28 || 1.4.10", - "phpunit/phpunit": "^9.6 || ^7.5" + "phpunit/phpunit": "^13.1.10" }, "type": "library", - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "React\\Promise\\": "src/" + "extra": { + "branch-alias": { + "dev-main": "8.1-dev" } }, + "autoload": { + "classmap": [ + "src/" + ] + }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" }, { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" }, { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" }, { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" } ], - "description": "A lightweight implementation of CommonJS Promises/A for PHP", + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", "keywords": [ - "promise", - "promises" + "export", + "exporter" ], "support": { - "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v3.3.0" + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/8.1.0" }, "funding": [ { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", + "type": "tidelift" } ], - "time": "2025-08-19T18:57:03+00:00" + "time": "2026-05-21T11:50:56+00:00" }, { - "name": "sebastian/cli-parser", - "version": "4.0.0", + "name": "sebastian/git-state", + "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "6d584c727d9114bcdc14c86711cd1cad51778e7c" + "url": "https://github.com/sebastianbergmann/git-state.git", + "reference": "792a952e0eba55b6960a48aeceb9f371aad1f76b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/6d584c727d9114bcdc14c86711cd1cad51778e7c", - "reference": "6d584c727d9114bcdc14c86711cd1cad51778e7c", + "url": "https://api.github.com/repos/sebastianbergmann/git-state/zipball/792a952e0eba55b6960a48aeceb9f371aad1f76b", + "reference": "792a952e0eba55b6960a48aeceb9f371aad1f76b", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^13.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "1.0-dev" } }, "autoload": { @@ -4975,52 +4709,60 @@ "role": "lead" } ], - "description": "Library for parsing CLI options", - "homepage": "https://github.com/sebastianbergmann/cli-parser", + "description": "Library for describing the state of a Git checkout", + "homepage": "https://github.com/sebastianbergmann/git-state", "support": { - "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/4.0.0" + "issues": "https://github.com/sebastianbergmann/git-state/issues", + "security": "https://github.com/sebastianbergmann/git-state/security/policy", + "source": "https://github.com/sebastianbergmann/git-state/tree/1.0.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/git-state", + "type": "tidelift" } ], - "time": "2025-02-07T04:53:50+00:00" + "time": "2026-03-21T12:54:28+00:00" }, { - "name": "sebastian/comparator", - "version": "7.1.3", + "name": "sebastian/global-state", + "version": "9.0.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "dc904b4bb3ab070865fa4068cd84f3da8b945148" + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "e52e3dc22441e6218c710afe72c3042f8fc41ea7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/dc904b4bb3ab070865fa4068cd84f3da8b945148", - "reference": "dc904b4bb3ab070865fa4068cd84f3da8b945148", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e52e3dc22441e6218c710afe72c3042f8fc41ea7", + "reference": "e52e3dc22441e6218c710afe72c3042f8fc41ea7", "shasum": "" }, "require": { - "ext-dom": "*", - "ext-mbstring": "*", - "php": ">=8.3", - "sebastian/diff": "^7.0", - "sebastian/exporter": "^7.0" + "php": ">=8.4", + "sebastian/object-reflector": "^6.0", + "sebastian/recursion-context": "^8.0" }, "require-dev": { - "phpunit/phpunit": "^12.2" - }, - "suggest": { - "ext-bcmath": "For comparing BcMath\\Number objects" + "ext-dom": "*", + "phpunit/phpunit": "^13.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.1-dev" + "dev-main": "9.0-dev" } }, "autoload": { @@ -5036,31 +4778,17 @@ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" } ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", + "description": "Snapshotting of global state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", "keywords": [ - "comparator", - "compare", - "equality" + "global state" ], "support": { - "issues": "https://github.com/sebastianbergmann/comparator/issues", - "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/7.1.3" + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/9.0.0" }, "funding": [ { @@ -5076,32 +4804,32 @@ "type": "thanks_dev" }, { - "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", + "url": "https://tidelift.com/funding/github/packagist/sebastian/global-state", "type": "tidelift" } ], - "time": "2025-08-20T11:27:00+00:00" + "time": "2026-02-06T04:45:13+00:00" }, { - "name": "sebastian/complexity", - "version": "5.0.0", + "name": "sebastian/lines-of-code", + "version": "5.0.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb" + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "d2cff273a90c79b0eb590baa682d4b5c318bdbb7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/bad4316aba5303d0221f43f8cee37eb58d384bbb", - "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d2cff273a90c79b0eb590baa682d4b5c318bdbb7", + "reference": "d2cff273a90c79b0eb590baa682d4b5c318bdbb7", "shasum": "" }, "require": { - "nikic/php-parser": "^5.0", - "php": ">=8.3" + "nikic/php-parser": "^5.7.0", + "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^13.1.10" }, "type": "library", "extra": { @@ -5125,46 +4853,59 @@ "role": "lead" } ], - "description": "Library for calculating the complexity of PHP code units", - "homepage": "https://github.com/sebastianbergmann/complexity", + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", "support": { - "issues": "https://github.com/sebastianbergmann/complexity/issues", - "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/5.0.0" + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/5.0.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/lines-of-code", + "type": "tidelift" } ], - "time": "2025-02-07T04:55:25+00:00" + "time": "2026-05-19T16:23:37+00:00" }, { - "name": "sebastian/diff", - "version": "7.0.0", + "name": "sebastian/object-enumerator", + "version": "8.0.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "7ab1ea946c012266ca32390913653d844ecd085f" + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "b39ab125fd9a7434b0ecbc4202eebce11a98cfc5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7ab1ea946c012266ca32390913653d844ecd085f", - "reference": "7ab1ea946c012266ca32390913653d844ecd085f", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/b39ab125fd9a7434b0ecbc4202eebce11a98cfc5", + "reference": "b39ab125fd9a7434b0ecbc4202eebce11a98cfc5", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.4", + "sebastian/object-reflector": "^6.0", + "sebastian/recursion-context": "^8.0" }, "require-dev": { - "phpunit/phpunit": "^12.0", - "symfony/process": "^7.2" + "phpunit/phpunit": "^13.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-main": "8.0-dev" } }, "autoload": { @@ -5180,60 +4921,59 @@ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" - }, - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" } ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" - ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", "support": { - "issues": "https://github.com/sebastianbergmann/diff/issues", - "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/7.0.0" + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/8.0.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/object-enumerator", + "type": "tidelift" } ], - "time": "2025-02-07T04:55:46+00:00" + "time": "2026-02-06T04:46:36+00:00" }, { - "name": "sebastian/environment", - "version": "8.0.3", + "name": "sebastian/object-reflector", + "version": "6.0.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "24a711b5c916efc6d6e62aa65aa2ec98fef77f68" + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "3ca042c2c60b0eab094f8a1b6a7093f4d4c72200" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/24a711b5c916efc6d6e62aa65aa2ec98fef77f68", - "reference": "24a711b5c916efc6d6e62aa65aa2ec98fef77f68", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/3ca042c2c60b0eab094f8a1b6a7093f4d4c72200", + "reference": "3ca042c2c60b0eab094f8a1b6a7093f4d4c72200", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^12.0" - }, - "suggest": { - "ext-posix": "*" + "phpunit/phpunit": "^13.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "8.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -5251,17 +4991,12 @@ "email": "sebastian@phpunit.de" } ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "https://github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", "support": { - "issues": "https://github.com/sebastianbergmann/environment/issues", - "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/8.0.3" + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/6.0.0" }, "funding": [ { @@ -5277,38 +5012,36 @@ "type": "thanks_dev" }, { - "url": "https://tidelift.com/funding/github/packagist/sebastian/environment", + "url": "https://tidelift.com/funding/github/packagist/sebastian/object-reflector", "type": "tidelift" } ], - "time": "2025-08-12T14:11:56+00:00" + "time": "2026-02-06T04:47:13+00:00" }, { - "name": "sebastian/exporter", - "version": "7.0.0", + "name": "sebastian/recursion-context", + "version": "8.0.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "76432aafc58d50691a00d86d0632f1217a47b688" + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "74c5af21f6a5833e91767ca068c4d3dfec15317e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/76432aafc58d50691a00d86d0632f1217a47b688", - "reference": "76432aafc58d50691a00d86d0632f1217a47b688", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/74c5af21f6a5833e91767ca068c4d3dfec15317e", + "reference": "74c5af21f6a5833e91767ca068c4d3dfec15317e", "shasum": "" }, "require": { - "ext-mbstring": "*", - "php": ">=8.3", - "sebastian/recursion-context": "^7.0" + "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^13.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-main": "8.0-dev" } }, "autoload": { @@ -5329,65 +5062,128 @@ "name": "Jeff Welch", "email": "whatthejeff@gmail.com" }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, { "name": "Adam Harvey", "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/8.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" }, { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", + "type": "tidelift" } ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "https://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" + "time": "2026-02-06T04:51:28+00:00" + }, + { + "name": "sebastian/type", + "version": "7.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "fee0309275847fefd7636167085e379c1dbf6990" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fee0309275847fefd7636167085e379c1dbf6990", + "reference": "fee0309275847fefd7636167085e379c1dbf6990", + "shasum": "" + }, + "require": { + "php": ">=8.4" + }, + "require-dev": { + "phpunit/phpunit": "^13.1.10" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", "support": { - "issues": "https://github.com/sebastianbergmann/exporter/issues", - "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/7.0.0" + "issues": "https://github.com/sebastianbergmann/type/issues", + "security": "https://github.com/sebastianbergmann/type/security/policy", + "source": "https://github.com/sebastianbergmann/type/tree/7.0.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/type", + "type": "tidelift" } ], - "time": "2025-02-07T04:56:42+00:00" + "time": "2026-05-20T06:49:11+00:00" }, { - "name": "sebastian/global-state", - "version": "8.0.2", + "name": "sebastian/version", + "version": "7.0.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "ef1377171613d09edd25b7816f05be8313f9115d" + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "ad37a5552c8e2b88572249fdc19b6da7792e021b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/ef1377171613d09edd25b7816f05be8313f9115d", - "reference": "ef1377171613d09edd25b7816f05be8313f9115d", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/ad37a5552c8e2b88572249fdc19b6da7792e021b", + "reference": "ad37a5552c8e2b88572249fdc19b6da7792e021b", "shasum": "" }, "require": { - "php": ">=8.3", - "sebastian/object-reflector": "^5.0", - "sebastian/recursion-context": "^7.0" - }, - "require-dev": { - "ext-dom": "*", - "phpunit/phpunit": "^12.0" + "php": ">=8.4" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "8.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -5402,18 +5198,16 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Snapshotting of global state", - "homepage": "https://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", "support": { - "issues": "https://github.com/sebastianbergmann/global-state/issues", - "security": "https://github.com/sebastianbergmann/global-state/security/policy", - "source": "https://github.com/sebastianbergmann/global-state/tree/8.0.2" + "issues": "https://github.com/sebastianbergmann/version/issues", + "security": "https://github.com/sebastianbergmann/version/security/policy", + "source": "https://github.com/sebastianbergmann/version/tree/7.0.0" }, "funding": [ { @@ -5429,412 +5223,425 @@ "type": "thanks_dev" }, { - "url": "https://tidelift.com/funding/github/packagist/sebastian/global-state", + "url": "https://tidelift.com/funding/github/packagist/sebastian/version", "type": "tidelift" } ], - "time": "2025-08-29T11:29:25+00:00" + "time": "2026-02-06T04:52:52+00:00" }, { - "name": "sebastian/lines-of-code", - "version": "4.0.0", + "name": "seld/jsonlint", + "version": "1.11.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "97ffee3bcfb5805568d6af7f0f893678fc076d2f" + "url": "https://github.com/Seldaek/jsonlint.git", + "reference": "1748aaf847fc731cfad7725aec413ee46f0cc3a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/97ffee3bcfb5805568d6af7f0f893678fc076d2f", - "reference": "97ffee3bcfb5805568d6af7f0f893678fc076d2f", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/1748aaf847fc731cfad7725aec413ee46f0cc3a2", + "reference": "1748aaf847fc731cfad7725aec413ee46f0cc3a2", "shasum": "" }, "require": { - "nikic/php-parser": "^5.0", - "php": ">=8.3" + "php": "^5.3 || ^7.0 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpstan/phpstan": "^1.11", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^8.5.13" }, + "bin": [ + "bin/jsonlint" + ], "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Seld\\JsonLint\\": "src/Seld/JsonLint/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" } ], - "description": "Library for counting the lines of code in PHP source code", - "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "description": "JSON Linter", + "keywords": [ + "json", + "linter", + "parser", + "validator" + ], "support": { - "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/4.0.0" + "issues": "https://github.com/Seldaek/jsonlint/issues", + "source": "https://github.com/Seldaek/jsonlint/tree/1.11.0" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "url": "https://github.com/Seldaek", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint", + "type": "tidelift" } ], - "time": "2025-02-07T04:57:28+00:00" + "time": "2024-07-11T14:55:45+00:00" }, { - "name": "sebastian/object-enumerator", - "version": "7.0.0", + "name": "seld/phar-utils", + "version": "1.2.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894" + "url": "https://github.com/Seldaek/phar-utils.git", + "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1effe8e9b8e068e9ae228e542d5d11b5d16db894", - "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894", + "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", + "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", "shasum": "" }, "require": { - "php": ">=8.3", - "sebastian/object-reflector": "^5.0", - "sebastian/recursion-context": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^12.0" + "php": ">=5.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-master": "1.x-dev" } }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Seld\\PharUtils\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be" } ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "description": "PHAR file format utilities, for when PHP phars you up", + "keywords": [ + "phar" + ], "support": { - "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/7.0.0" + "issues": "https://github.com/Seldaek/phar-utils/issues", + "source": "https://github.com/Seldaek/phar-utils/tree/1.2.1" }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2025-02-07T04:57:48+00:00" + "time": "2022-08-31T10:31:18+00:00" }, { - "name": "sebastian/object-reflector", - "version": "5.0.0", + "name": "seld/signal-handler", + "version": "2.0.2", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "4bfa827c969c98be1e527abd576533293c634f6a" + "url": "https://github.com/Seldaek/signal-handler.git", + "reference": "04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/4bfa827c969c98be1e527abd576533293c634f6a", - "reference": "4bfa827c969c98be1e527abd576533293c634f6a", + "url": "https://api.github.com/repos/Seldaek/signal-handler/zipball/04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98", + "reference": "04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=7.2.0" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpstan/phpstan": "^1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^7.5.20 || ^8.5.23", + "psr/log": "^1 || ^2 || ^3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "2.x-dev" } }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Seld\\Signal\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" } ], - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "description": "Simple unix signal handler that silently fails where signals are not supported for easy cross-platform development", + "keywords": [ + "posix", + "sigint", + "signal", + "sigterm", + "unix" + ], "support": { - "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/5.0.0" + "issues": "https://github.com/Seldaek/signal-handler/issues", + "source": "https://github.com/Seldaek/signal-handler/tree/2.0.2" }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2025-02-07T04:58:17+00:00" + "time": "2023-09-03T09:24:00+00:00" }, { - "name": "sebastian/recursion-context", - "version": "7.0.1", + "name": "slevomat/coding-standard", + "version": "8.29.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c" + "url": "https://github.com/slevomat/coding-standard.git", + "reference": "81fce13c4ef4b53a03e5cfa6ce36afc191c1598e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", - "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", + "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/81fce13c4ef4b53a03e5cfa6ce36afc191c1598e", + "reference": "81fce13c4ef4b53a03e5cfa6ce36afc191c1598e", "shasum": "" }, "require": { - "php": ">=8.3" + "dealerdirect/phpcodesniffer-composer-installer": "^0.7 || ^1.2.1", + "php": "^7.4 || ^8.0", + "phpstan/phpdoc-parser": "^2.3.2", + "squizlabs/php_codesniffer": "^4.0.1" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phing/phing": "3.0.1|3.1.2", + "php-parallel-lint/php-parallel-lint": "1.4.0", + "phpstan/phpstan": "2.1.54", + "phpstan/phpstan-deprecation-rules": "2.0.4", + "phpstan/phpstan-phpunit": "2.0.16", + "phpstan/phpstan-strict-rules": "2.0.11", + "phpunit/phpunit": "9.6.34|10.5.63|11.4.4|11.5.55|12.5.24" }, - "type": "library", + "type": "phpcodesniffer-standard", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-master": "8.x-dev" } }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "SlevomatCodingStandard\\": "SlevomatCodingStandard/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } + "description": "Slevomat Coding Standard for PHP_CodeSniffer complements Consistence Coding Standard by providing sniffs with additional checks.", + "keywords": [ + "dev", + "phpcs" ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { - "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/7.0.1" + "issues": "https://github.com/slevomat/coding-standard/issues", + "source": "https://github.com/slevomat/coding-standard/tree/8.29.0" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "url": "https://github.com/kukulich", "type": "github" }, { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", + "url": "https://tidelift.com/funding/github/packagist/slevomat/coding-standard", "type": "tidelift" } ], - "time": "2025-08-13T04:44:59+00:00" + "time": "2026-05-07T05:48:08+00:00" }, { - "name": "sebastian/type", - "version": "6.0.3", + "name": "squizlabs/php_codesniffer", + "version": "4.0.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/type.git", - "reference": "e549163b9760b8f71f191651d22acf32d56d6d4d" + "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", + "reference": "0525c73950de35ded110cffafb9892946d7771b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/e549163b9760b8f71f191651d22acf32d56d6d4d", - "reference": "e549163b9760b8f71f191651d22acf32d56d6d4d", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/0525c73950de35ded110cffafb9892946d7771b5", + "reference": "0525c73950de35ded110cffafb9892946d7771b5", "shasum": "" }, "require": { - "php": ">=8.3" - }, - "require-dev": { - "phpunit/phpunit": "^12.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.0-dev" - } + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=7.2.0" }, - "autoload": { - "classmap": [ - "src/" - ] + "require-dev": { + "phpunit/phpunit": "^8.4.0 || ^9.3.4 || ^10.5.32 || 11.3.3 - 11.5.28 || ^11.5.31" }, + "bin": [ + "bin/phpcbf", + "bin/phpcs" + ], + "type": "library", "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "Greg Sherwood", + "role": "Former lead" + }, + { + "name": "Juliette Reinders Folmer", + "role": "Current lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" } ], - "description": "Collection of value objects that represent the types of the PHP type system", - "homepage": "https://github.com/sebastianbergmann/type", + "description": "PHP_CodeSniffer tokenizes PHP files and detects violations of a defined set of coding standards.", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "keywords": [ + "phpcs", + "standards", + "static analysis" + ], "support": { - "issues": "https://github.com/sebastianbergmann/type/issues", - "security": "https://github.com/sebastianbergmann/type/security/policy", - "source": "https://github.com/sebastianbergmann/type/tree/6.0.3" + "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", + "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", + "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "url": "https://github.com/PHPCSStandards", "type": "github" }, { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" + "url": "https://github.com/jrfnl", + "type": "github" }, { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" }, { - "url": "https://tidelift.com/funding/github/packagist/sebastian/type", - "type": "tidelift" + "url": "https://thanks.dev/u/gh/phpcsstandards", + "type": "thanks_dev" } ], - "time": "2025-08-09T06:57:12+00:00" + "time": "2025-11-10T16:43:36+00:00" }, { - "name": "sebastian/version", - "version": "6.0.0", + "name": "staabm/side-effects-detector", + "version": "1.0.5", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c" + "url": "https://github.com/staabm/side-effects-detector.git", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/3e6ccf7657d4f0a59200564b08cead899313b53c", - "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c", + "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163", "shasum": "" }, "require": { - "php": ">=8.3" + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.0-dev" - } + "require-dev": { + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.6", + "phpunit/phpunit": "^9.6.21", + "symfony/var-dumper": "^5.4.43", + "tomasvotruba/type-coverage": "1.0.0", + "tomasvotruba/unused-public": "1.0.0" }, + "type": "library", "autoload": { "classmap": [ - "src/" + "lib/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } + "description": "A static analysis tool to detect side effects in PHP code", + "keywords": [ + "static analysis" ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", "support": { - "issues": "https://github.com/sebastianbergmann/version/issues", - "security": "https://github.com/sebastianbergmann/version/security/policy", - "source": "https://github.com/sebastianbergmann/version/tree/6.0.0" + "issues": "https://github.com/staabm/side-effects-detector/issues", + "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "url": "https://github.com/staabm", "type": "github" } ], - "time": "2025-02-07T05:00:38+00:00" + "time": "2024-10-20T05:08:20+00:00" }, { - "name": "seld/jsonlint", - "version": "1.11.0", + "name": "symfony/console", + "version": "v8.0.11", "source": { "type": "git", - "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "1748aaf847fc731cfad7725aec413ee46f0cc3a2" + "url": "https://github.com/symfony/console.git", + "reference": "3156577f46a38aa1b9323aad223de7a9cd426782" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/1748aaf847fc731cfad7725aec413ee46f0cc3a2", - "reference": "1748aaf847fc731cfad7725aec413ee46f0cc3a2", + "url": "https://api.github.com/repos/symfony/console/zipball/3156577f46a38aa1b9323aad223de7a9cd426782", + "reference": "3156577f46a38aa1b9323aad223de7a9cd426782", "shasum": "" }, "require": { - "php": "^5.3 || ^7.0 || ^8.0" + "php": ">=8.4", + "symfony/polyfill-mbstring": "^1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^7.4|^8.0" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { - "phpstan/phpstan": "^1.11", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^8.5.13" + "psr/log": "^1|^2|^3", + "symfony/config": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/event-dispatcher": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/lock": "^7.4|^8.0", + "symfony/messenger": "^7.4|^8.0", + "symfony/process": "^7.4|^8.0", + "symfony/stopwatch": "^7.4|^8.0", + "symfony/var-dumper": "^7.4|^8.0" }, - "bin": [ - "bin/jsonlint" - ], "type": "library", "autoload": { "psr-4": { - "Seld\\JsonLint\\": "src/Seld/JsonLint/" - } + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5842,61 +5649,75 @@ ], "authors": [ { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "https://seld.be" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "JSON Linter", + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", "keywords": [ - "json", - "linter", - "parser", - "validator" + "cli", + "command-line", + "console", + "terminal" ], "support": { - "issues": "https://github.com/Seldaek/jsonlint/issues", - "source": "https://github.com/Seldaek/jsonlint/tree/1.11.0" + "source": "https://github.com/symfony/console/tree/v8.0.11" }, "funding": [ { - "url": "https://github.com/Seldaek", + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint", + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-07-11T14:55:45+00:00" + "time": "2026-05-13T12:07:53+00:00" }, { - "name": "seld/phar-utils", - "version": "1.2.1", + "name": "symfony/filesystem", + "version": "v8.0.11", "source": { "type": "git", - "url": "https://github.com/Seldaek/phar-utils.git", - "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c" + "url": "https://github.com/symfony/filesystem.git", + "reference": "224db910898ce1317b892a9a1338f1f8f17eb7c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", - "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/224db910898ce1317b892a9a1338f1f8f17eb7c7", + "reference": "224db910898ce1317b892a9a1338f1f8f17eb7c7", "shasum": "" }, "require": { - "php": ">=5.3" + "php": ">=8.4", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } + "require-dev": { + "symfony/process": "^7.4|^8.0" }, + "type": "library", "autoload": { "psr-4": { - "Seld\\PharUtils\\": "src/" - } + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5904,55 +5725,67 @@ ], "authors": [ { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "PHAR file format utilities, for when PHP phars you up", - "keywords": [ - "phar" - ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/Seldaek/phar-utils/issues", - "source": "https://github.com/Seldaek/phar-utils/tree/1.2.1" + "source": "https://github.com/symfony/filesystem/tree/v8.0.11" }, - "time": "2022-08-31T10:31:18+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-11T16:39:47+00:00" }, { - "name": "seld/signal-handler", - "version": "2.0.2", + "name": "symfony/finder", + "version": "v8.0.8", "source": { "type": "git", - "url": "https://github.com/Seldaek/signal-handler.git", - "reference": "04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98" + "url": "https://github.com/symfony/finder.git", + "reference": "8da41214757b87d97f181e3d14a4179286151007" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/signal-handler/zipball/04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98", - "reference": "04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98", + "url": "https://api.github.com/repos/symfony/finder/zipball/8da41214757b87d97f181e3d14a4179286151007", + "reference": "8da41214757b87d97f181e3d14a4179286151007", "shasum": "" }, "require": { - "php": ">=7.2.0" + "php": ">=8.4" }, "require-dev": { - "phpstan/phpstan": "^1", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1", - "phpstan/phpstan-strict-rules": "^1.3", - "phpunit/phpunit": "^7.5.20 || ^8.5.23", - "psr/log": "^1 || ^2 || ^3" + "symfony/filesystem": "^7.4|^8.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.x-dev" - } - }, "autoload": { "psr-4": { - "Seld\\Signal\\": "src/" - } + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5960,254 +5793,327 @@ ], "authors": [ { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Simple unix signal handler that silently fails where signals are not supported for easy cross-platform development", - "keywords": [ - "posix", - "sigint", - "signal", - "sigterm", - "unix" - ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/Seldaek/signal-handler/issues", - "source": "https://github.com/Seldaek/signal-handler/tree/2.0.2" + "source": "https://github.com/symfony/finder/tree/v8.0.8" }, - "time": "2023-09-03T09:24:00+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-30T15:14:47+00:00" }, { - "name": "slevomat/coding-standard", - "version": "8.22.0", + "name": "symfony/polyfill-ctype", + "version": "v1.37.0", "source": { "type": "git", - "url": "https://github.com/slevomat/coding-standard.git", - "reference": "a4cef983bad2e70125612d22b2f6e2bd1333d5c2" + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/a4cef983bad2e70125612d22b2f6e2bd1333d5c2", - "reference": "a4cef983bad2e70125612d22b2f6e2bd1333d5c2", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/141046a8f9477948ff284fa65be2095baafb94f2", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2", "shasum": "" }, "require": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7 || ^1.1.2", - "php": "^7.4 || ^8.0", - "phpstan/phpdoc-parser": "^2.3.0", - "squizlabs/php_codesniffer": "^3.13.4" + "php": ">=7.2" }, - "require-dev": { - "phing/phing": "3.0.1|3.1.0", - "php-parallel-lint/php-parallel-lint": "1.4.0", - "phpstan/phpstan": "2.1.22", - "phpstan/phpstan-deprecation-rules": "2.0.3", - "phpstan/phpstan-phpunit": "2.0.7", - "phpstan/phpstan-strict-rules": "2.0.6", - "phpunit/phpunit": "9.6.8|10.5.48|11.4.4|11.5.36|12.3.8" + "provide": { + "ext-ctype": "*" }, - "type": "phpcodesniffer-standard", + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", "extra": { - "branch-alias": { - "dev-master": "8.x-dev" + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "SlevomatCodingStandard\\": "SlevomatCodingStandard/" + "Symfony\\Polyfill\\Ctype\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Slevomat Coding Standard for PHP_CodeSniffer complements Consistence Coding Standard by providing sniffs with additional checks.", + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", "keywords": [ - "dev", - "phpcs" + "compatibility", + "ctype", + "polyfill", + "portable" ], "support": { - "issues": "https://github.com/slevomat/coding-standard/issues", - "source": "https://github.com/slevomat/coding-standard/tree/8.22.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.37.0" }, "funding": [ { - "url": "https://github.com/kukulich", + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/slevomat/coding-standard", + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-09-06T09:14:48+00:00" + "time": "2026-04-10T16:19:22+00:00" }, { - "name": "squizlabs/php_codesniffer", - "version": "3.13.4", + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.37.0", "source": { "type": "git", - "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "ad545ea9c1b7d270ce0fc9cbfb884161cd706119" + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "4864388bfbd3001ce88e234fab652acd91fdc57e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/ad545ea9c1b7d270ce0fc9cbfb884161cd706119", - "reference": "ad545ea9c1b7d270ce0fc9cbfb884161cd706119", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/4864388bfbd3001ce88e234fab652acd91fdc57e", + "reference": "4864388bfbd3001ce88e234fab652acd91fdc57e", "shasum": "" }, "require": { - "ext-simplexml": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": ">=5.4.0" + "php": ">=7.2" }, - "require-dev": { - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" + "suggest": { + "ext-intl": "For best performance" }, - "bin": [ - "bin/phpcbf", - "bin/phpcs" - ], "type": "library", "extra": { - "branch-alias": { - "dev-master": "3.x-dev" + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Greg Sherwood", - "role": "Former lead" - }, - { - "name": "Juliette Reinders Folmer", - "role": "Current lead" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { - "name": "Contributors", - "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", - "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", "keywords": [ - "phpcs", - "standards", - "static analysis" + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" ], "support": { - "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", - "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", - "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", - "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.37.0" }, "funding": [ { - "url": "https://github.com/PHPCSStandards", - "type": "github" + "url": "https://symfony.com/sponsor", + "type": "custom" }, { - "url": "https://github.com/jrfnl", + "url": "https://github.com/fabpot", "type": "github" }, { - "url": "https://opencollective.com/php_codesniffer", - "type": "open_collective" + "url": "https://github.com/nicolas-grekas", + "type": "github" }, { - "url": "https://thanks.dev/u/gh/phpcsstandards", - "type": "thanks_dev" + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "time": "2025-09-05T05:47:09+00:00" + "time": "2026-04-26T13:13:48+00:00" }, { - "name": "staabm/side-effects-detector", - "version": "1.0.5", + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.37.0", "source": { "type": "git", - "url": "https://github.com/staabm/side-effects-detector.git", - "reference": "d8334211a140ce329c13726d4a715adbddd0a163" + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", - "reference": "d8334211a140ce329c13726d4a715adbddd0a163", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", "shasum": "" }, "require": { - "ext-tokenizer": "*", - "php": "^7.4 || ^8.0" + "php": ">=7.2" }, - "require-dev": { - "phpstan/extension-installer": "^1.4.3", - "phpstan/phpstan": "^1.12.6", - "phpunit/phpunit": "^9.6.21", - "symfony/var-dumper": "^5.4.43", - "tomasvotruba/type-coverage": "1.0.0", - "tomasvotruba/unused-public": "1.0.0" + "suggest": { + "ext-intl": "For best performance" }, "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, "classmap": [ - "lib/" + "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "A static analysis tool to detect side effects in PHP code", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", "keywords": [ - "static analysis" + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" ], "support": { - "issues": "https://github.com/staabm/side-effects-detector/issues", - "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.37.0" }, "funding": [ { - "url": "https://github.com/staabm", + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "time": "2024-10-20T05:08:20+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "symfony/finder", - "version": "v7.3.2", + "name": "symfony/polyfill-mbstring", + "version": "v1.38.1", "source": { "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "2a6614966ba1074fa93dae0bc804227422df4dfe" + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "14c5439eec4ccff081ac14eca2dc57feb2a66d92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/2a6614966ba1074fa93dae0bc804227422df4dfe", - "reference": "2a6614966ba1074fa93dae0bc804227422df4dfe", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/14c5439eec4ccff081ac14eca2dc57feb2a66d92", + "reference": "14c5439eec4ccff081ac14eca2dc57feb2a66d92", "shasum": "" }, "require": { - "php": ">=8.2" + "ext-iconv": "*", + "php": ">=7.2" }, - "require-dev": { - "symfony/filesystem": "^6.4|^7.0" + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" }, "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Symfony\\Polyfill\\Mbstring\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -6215,18 +6121,25 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Finds files and directories via an intuitive fluent interface", + "description": "Symfony polyfill for the Mbstring extension", "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], "support": { - "source": "https://github.com/symfony/finder/tree/v7.3.2" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.38.1" }, "funding": [ { @@ -6246,11 +6159,11 @@ "type": "tidelift" } ], - "time": "2025-07-15T13:41:35+00:00" + "time": "2026-05-26T12:51:13+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", @@ -6306,7 +6219,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.37.0" }, "funding": [ { @@ -6330,16 +6243,16 @@ }, { "name": "symfony/polyfill-php80", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" + "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", - "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dfb55726c3a76ea3b6459fcfda1ec2d80a682411", + "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411", "shasum": "" }, "require": { @@ -6390,7 +6303,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.37.0" }, "funding": [ { @@ -6410,11 +6323,11 @@ "type": "tidelift" } ], - "time": "2025-01-02T08:10:11+00:00" + "time": "2026-04-10T16:19:22+00:00" }, { "name": "symfony/polyfill-php81", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", @@ -6470,7 +6383,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.37.0" }, "funding": [ { @@ -6492,22 +6405,102 @@ ], "time": "2024-09-09T11:45:10+00:00" }, + { + "name": "symfony/polyfill-php84", + "version": "v1.37.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php84.git", + "reference": "88486db2c389b290bf87ff1de7ebc1e13e42bb06" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/88486db2c389b290bf87ff1de7ebc1e13e42bb06", + "reference": "88486db2c389b290bf87ff1de7ebc1e13e42bb06", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php84\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php84/tree/v1.37.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-10T18:47:49+00:00" + }, { "name": "symfony/process", - "version": "v7.3.3", + "version": "v8.0.11", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "32241012d521e2e8a9d713adb0812bb773b907f1" + "reference": "26d89e459f037d2873300605d0a07e7a8ef84db0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/32241012d521e2e8a9d713adb0812bb773b907f1", - "reference": "32241012d521e2e8a9d713adb0812bb773b907f1", + "url": "https://api.github.com/repos/symfony/process/zipball/26d89e459f037d2873300605d0a07e7a8ef84db0", + "reference": "26d89e459f037d2873300605d0a07e7a8ef84db0", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.4" }, "type": "library", "autoload": { @@ -6535,7 +6528,184 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.3.3" + "source": "https://github.com/symfony/process/tree/v8.0.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-11T16:56:32+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.7.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "d25d82433a80eba6aa0e6c24b61d7370d99e444a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d25d82433a80eba6aa0e6c24b61d7370d99e444a", + "reference": "d25d82433a80eba6aa0e6c24b61d7370d99e444a", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.7.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-28T09:44:51+00:00" + }, + { + "name": "symfony/string", + "version": "v8.0.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "39be2ad058a3c0bd558edca23e65f009865d75ff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/39be2ad058a3c0bd558edca23e65f009865d75ff", + "reference": "39be2ad058a3c0bd558edca23e65f009865d75ff", + "shasum": "" + }, + "require": { + "php": ">=8.4", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-intl-grapheme": "^1.33", + "symfony/polyfill-intl-normalizer": "^1.0", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/emoji": "^7.4|^8.0", + "symfony/http-client": "^7.4|^8.0", + "symfony/intl": "^7.4|^8.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^7.4|^8.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v8.0.11" }, "funding": [ { @@ -6555,35 +6725,35 @@ "type": "tidelift" } ], - "time": "2025-08-18T09:42:54+00:00" + "time": "2026-05-13T12:07:53+00:00" }, { "name": "symfony/var-dumper", - "version": "v7.3.3", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "34d8d4c4b9597347306d1ec8eb4e1319b1e6986f" + "reference": "cfb7badd53bf4177f6e9416cfbbccc13c0e773a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/34d8d4c4b9597347306d1ec8eb4e1319b1e6986f", - "reference": "34d8d4c4b9597347306d1ec8eb4e1319b1e6986f", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/cfb7badd53bf4177f6e9416cfbbccc13c0e773a1", + "reference": "cfb7badd53bf4177f6e9416cfbbccc13c0e773a1", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.0" + "php": ">=8.4", + "symfony/polyfill-mbstring": "^1.0" }, "conflict": { - "symfony/console": "<6.4" + "symfony/console": "<7.4", + "symfony/error-handler": "<7.4" }, "require-dev": { - "symfony/console": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/process": "^6.4|^7.0", - "symfony/uid": "^6.4|^7.0", + "symfony/console": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/process": "^7.4|^8.0", + "symfony/uid": "^7.4|^8.0", "twig/twig": "^3.12" }, "bin": [ @@ -6622,7 +6792,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.3.3" + "source": "https://github.com/symfony/var-dumper/tree/v8.0.8" }, "funding": [ { @@ -6642,27 +6812,27 @@ "type": "tidelift" } ], - "time": "2025-08-13T11:49:31+00:00" + "time": "2026-03-31T07:15:36+00:00" }, { "name": "theseer/tokenizer", - "version": "1.2.3", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + "reference": "7989e43bf381af0eac72e4f0ca5bcbfa81658be4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/7989e43bf381af0eac72e4f0ca5bcbfa81658be4", + "reference": "7989e43bf381af0eac72e4f0ca5bcbfa81658be4", "shasum": "" }, "require": { "ext-dom": "*", "ext-tokenizer": "*", "ext-xmlwriter": "*", - "php": "^7.2 || ^8.0" + "php": "^8.1" }, "type": "library", "autoload": { @@ -6684,7 +6854,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.3" + "source": "https://github.com/theseer/tokenizer/tree/2.0.1" }, "funding": [ { @@ -6692,20 +6862,20 @@ "type": "github" } ], - "time": "2024-03-03T12:36:25+00:00" + "time": "2025-12-08T11:19:18+00:00" }, { "name": "twig/markdown-extra", - "version": "v3.21.0", + "version": "v3.26.0", "source": { "type": "git", "url": "https://github.com/twigphp/markdown-extra.git", - "reference": "f4616e1dd375209dacf6026f846e6b537d036ce4" + "reference": "e3f3fd0836eb6c39457da22c8a76abaac62692b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/markdown-extra/zipball/f4616e1dd375209dacf6026f846e6b537d036ce4", - "reference": "f4616e1dd375209dacf6026f846e6b537d036ce4", + "url": "https://api.github.com/repos/twigphp/markdown-extra/zipball/e3f3fd0836eb6c39457da22c8a76abaac62692b9", + "reference": "e3f3fd0836eb6c39457da22c8a76abaac62692b9", "shasum": "" }, "require": { @@ -6715,7 +6885,7 @@ }, "require-dev": { "erusev/parsedown": "dev-master as 1.x-dev", - "league/commonmark": "^1.0|^2.0", + "league/commonmark": "^2.7", "league/html-to-markdown": "^4.8|^5.0", "michelf/php-markdown": "^1.8|^2.0", "symfony/phpunit-bridge": "^6.4|^7.0" @@ -6752,7 +6922,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/markdown-extra/tree/v3.21.0" + "source": "https://github.com/twigphp/markdown-extra/tree/v3.26.0" }, "funding": [ { @@ -6764,20 +6934,20 @@ "type": "tidelift" } ], - "time": "2025-01-31T20:45:36+00:00" + "time": "2026-05-15T13:14:02+00:00" }, { "name": "twig/twig", - "version": "v3.21.1", + "version": "v3.27.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "285123877d4dd97dd7c11842ac5fb7e86e60d81d" + "reference": "04ae1bfe9463c816cf72ca0abe7eae2c77a9a9ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/285123877d4dd97dd7c11842ac5fb7e86e60d81d", - "reference": "285123877d4dd97dd7c11842ac5fb7e86e60d81d", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/04ae1bfe9463c816cf72ca0abe7eae2c77a9a9ed", + "reference": "04ae1bfe9463c816cf72ca0abe7eae2c77a9a9ed", "shasum": "" }, "require": { @@ -6787,7 +6957,8 @@ "symfony/polyfill-mbstring": "^1.3" }, "require-dev": { - "phpstan/phpstan": "^2.0", + "php-cs-fixer/shim": "^3.0@stable", + "phpstan/phpstan": "^2.0@stable", "psr/container": "^1.0|^2.0", "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0" }, @@ -6831,7 +7002,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.21.1" + "source": "https://github.com/twigphp/Twig/tree/v3.27.0" }, "funding": [ { @@ -6843,22 +7014,20 @@ "type": "tidelift" } ], - "time": "2025-05-03T07:21:55+00:00" + "time": "2026-05-27T13:05:51+00:00" } ], "aliases": [], "minimum-stability": "stable", - "stability-flags": { - "psy/psysh": 0 - }, + "stability-flags": {}, "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": ">=8.1", + "php": ">=8.2", "ext-intl": "*", "ext-json": "*", "ext-mbstring": "*" }, "platform-dev": {}, - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.9.0" } diff --git a/app/vendor/bin/phinx b/app/vendor/bin/phinx deleted file mode 100755 index 20ed10c9a..000000000 --- a/app/vendor/bin/phinx +++ /dev/null @@ -1,119 +0,0 @@ -#!/usr/bin/env php -realpath = realpath($opened_path) ?: $opened_path; - $opened_path = $this->realpath; - $this->handle = fopen($this->realpath, $mode); - $this->position = 0; - - return (bool) $this->handle; - } - - public function stream_read($count) - { - $data = fread($this->handle, $count); - - if ($this->position === 0) { - $data = preg_replace('{^#!.*\r?\n}', '', $data); - } - - $this->position += strlen($data); - - return $data; - } - - public function stream_cast($castAs) - { - return $this->handle; - } - - public function stream_close() - { - fclose($this->handle); - } - - public function stream_lock($operation) - { - return $operation ? flock($this->handle, $operation) : true; - } - - public function stream_seek($offset, $whence) - { - if (0 === fseek($this->handle, $offset, $whence)) { - $this->position = ftell($this->handle); - return true; - } - - return false; - } - - public function stream_tell() - { - return $this->position; - } - - public function stream_eof() - { - return feof($this->handle); - } - - public function stream_stat() - { - return array(); - } - - public function stream_set_option($option, $arg1, $arg2) - { - return true; - } - - public function url_stat($path, $flags) - { - $path = substr($path, 17); - if (file_exists($path)) { - return stat($path); - } - - return false; - } - } - } - - if ( - (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) - || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) - ) { - return include("phpvfscomposer://" . __DIR__ . '/..'.'/robmorgan/phinx/bin/phinx'); - } -} - -return include __DIR__ . '/..'.'/robmorgan/phinx/bin/phinx'; diff --git a/app/vendor/bin/sql-formatter b/app/vendor/bin/sql-formatter index de69b8ade..ed0a69d35 100755 --- a/app/vendor/bin/sql-formatter +++ b/app/vendor/bin/sql-formatter @@ -112,9 +112,8 @@ if (PHP_VERSION_ID < 80000) { (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) ) { - include("phpvfscomposer://" . __DIR__ . '/..'.'/doctrine/sql-formatter/bin/sql-formatter'); - exit(0); + return include("phpvfscomposer://" . __DIR__ . '/..'.'/doctrine/sql-formatter/bin/sql-formatter'); } } -include __DIR__ . '/..'.'/doctrine/sql-formatter/bin/sql-formatter'; +return include __DIR__ . '/..'.'/doctrine/sql-formatter/bin/sql-formatter'; diff --git a/app/vendor/brick/varexporter/CHANGELOG.md b/app/vendor/brick/varexporter/CHANGELOG.md index 762b4fbe2..923e9c3b0 100644 --- a/app/vendor/brick/varexporter/CHANGELOG.md +++ b/app/vendor/brick/varexporter/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## [0.7.0](https://github.com/brick/varexporter/releases/tag/0.7.0) - 2026-01-06 + +✨ **New features** + +- Added `VarExporter::INLINE_LITERAL_LIST`, similar to `INLINE_SCALAR_LIST` but includes enum values + +💥 **BC breaks** + +- Minimum PHP version is now `8.2` + ## [0.6.0](https://github.com/brick/varexporter/releases/tag/0.6.0) - 2025-02-20 💥 **BC breaks** diff --git a/app/vendor/brick/varexporter/composer.json b/app/vendor/brick/varexporter/composer.json index 53554754b..682066f47 100644 --- a/app/vendor/brick/varexporter/composer.json +++ b/app/vendor/brick/varexporter/composer.json @@ -7,13 +7,13 @@ ], "license": "MIT", "require": { - "php": "^8.1", + "php": "^8.2", "nikic/php-parser": "^5.0" }, "require-dev": { - "phpunit/phpunit": "^10.5", + "phpunit/phpunit": "^11.0", "php-coveralls/php-coveralls": "^2.2", - "vimeo/psalm": "6.8.4" + "vimeo/psalm": "6.14.3" }, "autoload": { "psr-4": { diff --git a/app/vendor/brick/varexporter/src/ExportException.php b/app/vendor/brick/varexporter/src/ExportException.php index 662c32c2e..18049a67e 100644 --- a/app/vendor/brick/varexporter/src/ExportException.php +++ b/app/vendor/brick/varexporter/src/ExportException.php @@ -4,9 +4,12 @@ namespace Brick\VarExporter; +use Exception; use Throwable; -final class ExportException extends \Exception +use function implode; + +final class ExportException extends Exception { /** * @param string[] $path @@ -25,7 +28,7 @@ public function __construct(string $message, array $path, ?Throwable $previous = * * @param string[] $path */ - public static function pathToString(array $path) : string + public static function pathToString(array $path): string { return '[' . implode('][', $path) . ']'; } diff --git a/app/vendor/brick/varexporter/src/Internal/GenericExporter.php b/app/vendor/brick/varexporter/src/Internal/GenericExporter.php index 7757ccdbe..5f677edf6 100644 --- a/app/vendor/brick/varexporter/src/Internal/GenericExporter.php +++ b/app/vendor/brick/varexporter/src/Internal/GenericExporter.php @@ -6,6 +6,21 @@ use Brick\VarExporter\ExportException; use Brick\VarExporter\VarExporter; +use ReflectionObject; +use UnitEnum; + +use function array_is_list; +use function array_merge; +use function array_unshift; +use function count; +use function gettype; +use function implode; +use function is_array; +use function is_object; +use function is_scalar; +use function spl_object_id; +use function sprintf; +use function var_export; /** * The main exporter implementation, that handles variables of any type. @@ -18,87 +33,73 @@ */ final class GenericExporter { - /** - * @var ObjectExporter[] - */ - private array $objectExporters = []; + public readonly bool $addTypeHints; - /** - * The visited objects, to detect circular references. - * - * This is a two-level map of parent object id => child object id => path where the object first appeared. - * - * @var array> - */ - private array $visitedObjects = []; + public readonly bool $skipDynamicProperties; - /** - * @psalm-readonly - */ - public bool $addTypeHints; + public readonly bool $inlineArray; - /** - * @psalm-readonly - */ - public bool $skipDynamicProperties; + public readonly bool $inlineScalarList; - /** - * @psalm-readonly - */ - public bool $inlineArray; + public readonly bool $inlineLiteralList; - /** - * @psalm-readonly - */ - public bool $inlineScalarList; + public readonly bool $closureSnapshotUses; - /** - * @psalm-readonly - */ - public bool $closureSnapshotUses; + public readonly bool $trailingCommaInArray; + + public readonly int $indentLevel; /** - * @psalm-readonly + * @var ObjectExporter[] */ - public bool $trailingCommaInArray; + private readonly array $objectExporters; /** - * @psalm-readonly + * The visited objects, to detect circular references. + * + * This is a two-level map of parent object id => child object id => path where the object first appeared. + * + * @var array> */ - public int $indentLevel; + private array $visitedObjects = []; public function __construct(int $options, int $indentLevel = 0) { - $this->objectExporters[] = new ObjectExporter\StdClassExporter($this); + $objectExporters = [ + new ObjectExporter\StdClassExporter($this), + ]; if (($options & VarExporter::NO_CLOSURES) === 0) { - $this->objectExporters[] = new ObjectExporter\ClosureExporter($this); + $objectExporters[] = new ObjectExporter\ClosureExporter($this); } if (($options & VarExporter::NO_SET_STATE) === 0) { - $this->objectExporters[] = new ObjectExporter\SetStateExporter($this); + $objectExporters[] = new ObjectExporter\SetStateExporter($this); } - $this->objectExporters[] = new ObjectExporter\InternalClassExporter($this); + $objectExporters[] = new ObjectExporter\InternalClassExporter($this); if (($options & VarExporter::NO_SERIALIZE) === 0) { - $this->objectExporters[] = new ObjectExporter\SerializeExporter($this); + $objectExporters[] = new ObjectExporter\SerializeExporter($this); } if (($options & VarExporter::NO_ENUMS) === 0) { - $this->objectExporters[] = new ObjectExporter\EnumExporter($this); + $objectExporters[] = new ObjectExporter\EnumExporter($this); } if (($options & VarExporter::NOT_ANY_OBJECT) === 0) { - $this->objectExporters[] = new ObjectExporter\AnyObjectExporter($this); + $objectExporters[] = new ObjectExporter\AnyObjectExporter($this); } - $this->addTypeHints = (bool) ($options & VarExporter::ADD_TYPE_HINTS); - $this->skipDynamicProperties = (bool) ($options & VarExporter::SKIP_DYNAMIC_PROPERTIES); - $this->inlineArray = (bool) ($options & VarExporter::INLINE_ARRAY); - $this->inlineScalarList = (bool) ($options & VarExporter::INLINE_SCALAR_LIST); - $this->closureSnapshotUses = (bool) ($options & VarExporter::CLOSURE_SNAPSHOT_USES); - $this->trailingCommaInArray = (bool) ($options & VarExporter::TRAILING_COMMA_IN_ARRAY); + $this->objectExporters = $objectExporters; + + $this->addTypeHints = (bool) ($options & VarExporter::ADD_TYPE_HINTS); + $this->skipDynamicProperties = (bool) ($options & VarExporter::SKIP_DYNAMIC_PROPERTIES); + $this->inlineArray = (bool) ($options & VarExporter::INLINE_ARRAY); + $this->inlineScalarList = (bool) ($options & VarExporter::INLINE_SCALAR_LIST); + $this->inlineLiteralList = (bool) ($options & VarExporter::INLINE_LITERAL_LIST); + $this->closureSnapshotUses = (bool) ($options & VarExporter::CLOSURE_SNAPSHOT_USES); + $this->trailingCommaInArray = (bool) ($options & VarExporter::TRAILING_COMMA_IN_ARRAY); $this->indentLevel = $indentLevel; } @@ -112,7 +113,7 @@ public function __construct(int $options, int $indentLevel = 0) * * @throws ExportException */ - public function export(mixed $var, array $path, array $parentIds) : array + public function export(mixed $var, array $path, array $parentIds): array { if ($var === null) { return ['null']; @@ -136,8 +137,6 @@ public function export(mixed $var, array $path, array $parentIds) : array } /** - * @psalm-suppress MixedAssignment - * * @param array $array The array to export. * @param string[] $path The path to the current array in the array/object graph. * @param int[] $parentIds The ids of all objects higher in the graph. @@ -145,8 +144,10 @@ public function export(mixed $var, array $path, array $parentIds) : array * @return string[] The lines of code. * * @throws ExportException + * + * @psalm-suppress MixedAssignment */ - public function exportArray(array $array, array $path, array $parentIds) : array + public function exportArray(array $array, array $path, array $parentIds): array { if (! $array) { return ['[]']; @@ -155,11 +156,13 @@ public function exportArray(array $array, array $path, array $parentIds) : array $result = []; $count = count($array); - $isList = array_keys($array) === range(0, $count - 1); + $isList = array_is_list($array); $current = 0; - $inline = $this->inlineArray || ($this->inlineScalarList && $isList && $this->isScalarList($array)); + $inline = $this->inlineArray + || ($this->inlineScalarList && $isList && $this->isScalarList($array)) + || ($this->inlineLiteralList && $isList && $this->isLiteralList($array)); foreach ($array as $key => $value) { $isLast = (++$current === $count); @@ -200,24 +203,6 @@ public function exportArray(array $array, array $path, array $parentIds) : array return $result; } - /** - * Returns whether the given array only contains scalar values. - * - * Types considered scalar here are int, bool, float, string and null. - * If the array is empty, this method returns true. - * - */ - private function isScalarList(array $array) : bool - { - foreach ($array as $value) { - if ($value !== null && ! is_scalar($value)) { - return false; - } - } - - return true; - } - /** * @param object $object The object to export. * @param string[] $path The path to the current object in the array/object graph. @@ -227,7 +212,7 @@ private function isScalarList(array $array) : bool * * @throws ExportException */ - public function exportObject(object $object, array $path, array $parentIds) : array + public function exportObject(object $object, array $path, array $parentIds): array { $id = spl_object_id($object); @@ -237,14 +222,14 @@ public function exportObject(object $object, array $path, array $parentIds) : ar 'Object of class "%s" has a circular reference at %s. ' . 'Circular references are currently not supported.', $object::class, - ExportException::pathToString($this->visitedObjects[$parentId][$id]) + ExportException::pathToString($this->visitedObjects[$parentId][$id]), ), $path); } $this->visitedObjects[$parentId][$id] = $path; } - $reflectionObject = new \ReflectionObject($object); + $reflectionObject = new ReflectionObject($object); foreach ($this->objectExporters as $objectExporter) { if ($objectExporter->supports($reflectionObject)) { @@ -266,9 +251,9 @@ public function exportObject(object $object, array $path, array $parentIds) : ar * * @return string[] The indented lines of code. */ - public function indent(array $lines) : array + public function indent(array $lines): array { - foreach ($lines as & $value) { + foreach ($lines as &$value) { if ($value !== '') { $value = ' ' . $value; } @@ -284,11 +269,45 @@ public function indent(array $lines) : array * * @return string[] */ - public function wrap(array $lines, string $prepend, string $append) : array + public function wrap(array $lines, string $prepend, string $append): array { $lines[0] = $prepend . $lines[0]; $lines[count($lines) - 1] .= $append; return $lines; } + + /** + * Returns whether the given array only contains scalar values. + * + * Types considered scalar here are int, bool, float, string and null. + * If the array is empty, this method returns true. + */ + private function isScalarList(array $array): bool + { + foreach ($array as $value) { + if ($value !== null && ! is_scalar($value)) { + return false; + } + } + + return true; + } + + /** + * Returns whether the given array only contains literal values. + * + * Values considered literal are: int, float, string, bool, null, and enum values. + * If the array is empty, this method returns true. + */ + private function isLiteralList(array $array): bool + { + foreach ($array as $value) { + if ($value !== null && ! is_scalar($value) && ! $value instanceof UnitEnum) { + return false; + } + } + + return true; + } } diff --git a/app/vendor/brick/varexporter/src/Internal/ObjectExporter.php b/app/vendor/brick/varexporter/src/Internal/ObjectExporter.php index d3e7eee8a..02fb7c355 100644 --- a/app/vendor/brick/varexporter/src/Internal/ObjectExporter.php +++ b/app/vendor/brick/varexporter/src/Internal/ObjectExporter.php @@ -5,6 +5,10 @@ namespace Brick\VarExporter\Internal; use Brick\VarExporter\ExportException; +use ReflectionClass; +use ReflectionObject; + +use function array_merge; /** * An exporter that handles a specific type of object. @@ -13,33 +17,31 @@ */ abstract class ObjectExporter { - protected GenericExporter $exporter; - - public function __construct(GenericExporter $exporter) - { - $this->exporter = $exporter; + public function __construct( + protected readonly GenericExporter $exporter, + ) { } /** * Returns whether this exporter supports the given object. * - * @param \ReflectionObject $reflectionObject A reflection of the object. + * @param ReflectionObject $reflectionObject A reflection of the object. */ - abstract public function supports(\ReflectionObject $reflectionObject) : bool; + abstract public function supports(ReflectionObject $reflectionObject): bool; /** * Exports the given object. * - * @param object $object The object to export. - * @param \ReflectionObject $reflectionObject A reflection of the object. - * @param string[] $path The path to the current object in the array/object graph. - * @param int[] $parentIds The ids of all objects higher in the graph. + * @param object $object The object to export. + * @param ReflectionObject $reflectionObject A reflection of the object. + * @param string[] $path The path to the current object in the array/object graph. + * @param int[] $parentIds The ids of all objects higher in the graph. * * @return string[] The lines of code. * * @throws ExportException */ - abstract public function export(object $object, \ReflectionObject $reflectionObject, array $path, array $parentIds) : array; + abstract public function export(object $object, ReflectionObject $reflectionObject, array $path, array $parentIds): array; /** * Returns the code to create a new object of the given class. @@ -48,7 +50,7 @@ abstract public function export(object $object, \ReflectionObject $reflectionObj * * @return string[] The lines of code. */ - final protected function getCreateObjectCode(\ReflectionClass $class) : array + final protected function getCreateObjectCode(ReflectionClass $class): array { $className = '\\' . $class->getName(); @@ -75,12 +77,12 @@ final protected function getCreateObjectCode(\ReflectionClass $class) : array * * @return string[] The lines of code, wrapped in a closure. */ - final protected function wrapInClosure(array $code) : array + final protected function wrapInClosure(array $code): array { return array_merge( ['(static function() {'], $this->exporter->indent($code), - ['})()'] + ['})()'], ); } } diff --git a/app/vendor/brick/varexporter/src/Internal/ObjectExporter/AnyObjectExporter.php b/app/vendor/brick/varexporter/src/Internal/ObjectExporter/AnyObjectExporter.php index 573d6c357..2ab0416d1 100644 --- a/app/vendor/brick/varexporter/src/Internal/ObjectExporter/AnyObjectExporter.php +++ b/app/vendor/brick/varexporter/src/Internal/ObjectExporter/AnyObjectExporter.php @@ -6,6 +6,16 @@ use Brick\VarExporter\Internal\ObjectExporter; use Override; +use ReflectionClass; +use ReflectionObject; +use ReflectionProperty; + +use function array_key_exists; +use function array_merge; +use function method_exists; +use function preg_match; +use function spl_object_id; +use function var_export; /** * Handles any class through direct property access and bound closures. @@ -18,7 +28,7 @@ final class AnyObjectExporter extends ObjectExporter { #[Override] - public function supports(\ReflectionObject $reflectionObject) : bool + public function supports(ReflectionObject $reflectionObject): bool { return true; } @@ -27,15 +37,15 @@ public function supports(\ReflectionObject $reflectionObject) : bool * @psalm-suppress MixedAssignment */ #[Override] - public function export(object $object, \ReflectionObject $reflectionObject, array $path, array $parentIds) : array + public function export(object $object, ReflectionObject $reflectionObject, array $path, array $parentIds): array { $lines = $this->getCreateObjectCode($reflectionObject); $objectAsArray = (array) $object; $current = $this->exporter->skipDynamicProperties - ? new \ReflectionClass($object) // properties from class definition only - : $reflectionObject; // properties from class definition + dynamic properties + ? new ReflectionClass($object) // properties from class definition only + : $reflectionObject; // properties from class definition + dynamic properties $isParentClass = false; @@ -68,13 +78,13 @@ public function export(object $object, \ReflectionObject $reflectionObject, arra if (array_key_exists($key, $objectAsArray)) { $value = $objectAsArray[$key]; - if ($property->isPublic() && !(method_exists($property, 'isReadOnly') && $property->isReadOnly())) { + if ($property->isPublic() && ! (method_exists($property, 'isReadOnly') && $property->isReadOnly())) { $publicNonReadonlyProperties[$name] = $value; } else { $nonPublicOrPublicReadonlyProperties[$name] = $value; } } else { - if ($property->isPublic() && !(method_exists($property, 'isReadOnly') && $property->isReadOnly())) { + if ($property->isPublic() && ! (method_exists($property, 'isReadOnly') && $property->isReadOnly())) { $unsetPublicNonReadonlyProperties[] = $name; } else { $unsetNonPublicOrPublicReadonlyProperties[] = $name; @@ -153,9 +163,8 @@ public function export(object $object, \ReflectionObject $reflectionObject, arra /** * Returns the key of the given property in the object-to-array cast. - * */ - private function getPropertyKey(\ReflectionProperty $property) : string + private function getPropertyKey(ReflectionProperty $property): string { $name = $property->getName(); @@ -170,7 +179,7 @@ private function getPropertyKey(\ReflectionProperty $property) : string return $name; } - private function escapePropName(string $var) : string + private function escapePropName(string $var): string { if (preg_match('/^[a-zA-Z_][a-zA-Z0-9_]*$/', $var) === 1) { return $var; diff --git a/app/vendor/brick/varexporter/src/Internal/ObjectExporter/ClosureExporter.php b/app/vendor/brick/varexporter/src/Internal/ObjectExporter/ClosureExporter.php index 1e6120e71..1c2ecb734 100644 --- a/app/vendor/brick/varexporter/src/Internal/ObjectExporter/ClosureExporter.php +++ b/app/vendor/brick/varexporter/src/Internal/ObjectExporter/ClosureExporter.php @@ -15,8 +15,20 @@ use PhpParser\NodeVisitor\NameResolver; use PhpParser\Parser; use PhpParser\ParserFactory; -use PhpParser\PhpVersion; use ReflectionFunction; +use ReflectionObject; + +use function array_keys; +use function array_merge; +use function assert; +use function count; +use function file_get_contents; +use function implode; +use function is_string; +use function sprintf; +use function str_ends_with; + +use const PHP_EOL; /** * Handles closures. @@ -28,17 +40,17 @@ final class ClosureExporter extends ObjectExporter private ?Parser $parser = null; #[Override] - public function supports(\ReflectionObject $reflectionObject) : bool + public function supports(ReflectionObject $reflectionObject): bool { - return $reflectionObject->getName() === \Closure::class; + return $reflectionObject->getName() === Closure::class; } #[Override] - public function export(object $object, \ReflectionObject $reflectionObject, array $path, array $parentIds) : array + public function export(object $object, ReflectionObject $reflectionObject, array $path, array $parentIds): array { assert($object instanceof Closure); - $reflectionFunction = new \ReflectionFunction($object); + $reflectionFunction = new ReflectionFunction($object); $file = $reflectionFunction->getFileName(); $line = $reflectionFunction->getStartLine(); @@ -62,7 +74,7 @@ public function export(object $object, \ReflectionObject $reflectionObject, arra private function getParser(): Parser { if ($this->parser === null) { - $this->parser = (new ParserFactory)->createForHostVersion(); + $this->parser = (new ParserFactory())->createForHostVersion(); } return $this->parser; @@ -78,13 +90,13 @@ private function getParser(): Parser * * @throws ExportException */ - private function parseFile(string $filename, array $path) : array + private function parseFile(string $filename, array $path): array { if (str_ends_with($filename, " : eval()'d code")) { throw new ExportException("Closure defined in eval()'d code cannot be exported.", $path); } - $source = @ file_get_contents($filename); + $source = @file_get_contents($filename); if ($source === false) { // @codeCoverageIgnoreStart @@ -113,7 +125,7 @@ private function parseFile(string $filename, array $path) : array * * @return Node[] */ - private function resolveNames(array $ast) : array + private function resolveNames(array $ast): array { $nameResolver = new NameResolver(); $nodeTraverser = new NodeTraverser(); @@ -138,11 +150,11 @@ private function getClosure( array $ast, string $file, int $line, - array $path - ) : Node\Expr\Closure { + array $path, + ): Node\Expr\Closure { $finder = new FindingVisitor( - fn(Node $node): bool => ($node instanceof Node\Expr\Closure || $node instanceof Node\Expr\ArrowFunction) - && $node->getStartLine() === $line + fn (Node $node): bool => ($node instanceof Node\Expr\Closure || $node instanceof Node\Expr\ArrowFunction) + && $node->getStartLine() === $line, ); $traverser = new NodeTraverser(); @@ -157,11 +169,11 @@ private function getClosure( 'Expected exactly 1 closure in %s on line %d, found %d.', $file, $line, - $count + $count, ), $path); } - /** @var Node\Expr\Closure|Node\Expr\ArrowFunction $closure */ + /** @var Node\Expr\ArrowFunction|Node\Expr\Closure $closure */ $closure = $closures[0]; if ($closure instanceof Node\Expr\ArrowFunction) { @@ -178,13 +190,13 @@ private function getClosure( /** * Convert a parsed arrow function to a closure. * - * @param ReflectionFunction $reflectionFunction Reflection of the closure. - * @param Node\Expr\ArrowFunction $arrowFunction Parsed arrow function. + * @param ReflectionFunction $reflectionFunction Reflection of the closure. + * @param Node\Expr\ArrowFunction $arrowFunction Parsed arrow function. */ private function convertArrowFunction( ReflectionFunction $reflectionFunction, - Node\Expr\ArrowFunction $arrowFunction - ) : Node\Expr\Closure { + Node\Expr\ArrowFunction $arrowFunction, + ): Node\Expr\Closure { $closure = new Node\Expr\Closure([], ['arrow_function' => true]); $closure->static = false; @@ -198,8 +210,8 @@ private function convertArrowFunction( foreach (array_keys($static) as $var) { assert(is_string($var)); - $closure->uses[] = new Node\Expr\ClosureUse( - new Node\Expr\Variable($var) + $closure->uses[] = new Node\ClosureUse( + new Node\Expr\Variable($var), ); } @@ -218,11 +230,11 @@ private function convertArrowFunction( private function closureHandleUses( ReflectionFunction $reflectionFunction, Node\Expr\Closure $closure, - array $path - ) : void { + array $path, + ): void { if (! $this->exporter->closureSnapshotUses) { $message = $closure->hasAttribute('arrow_function') - ? "The arrow function uses variables in the parent scope, this is not supported by default" + ? 'The arrow function uses variables in the parent scope, this is not supported by default' : "The closure has bound variables through 'use', this is not supported by default"; throw new ExportException("$message. Use the CLOSURE_SNAPSHOT_USE option to export them.", $path); @@ -249,7 +261,7 @@ private function closureHandleUses( $assign = new Node\Expr\Assign( new Node\Expr\Variable($var), - $expr->expr + $expr->expr, ); $stmts[] = new Node\Stmt\Expression($assign); } diff --git a/app/vendor/brick/varexporter/src/Internal/ObjectExporter/ClosureExporter/PrettyPrinter.php b/app/vendor/brick/varexporter/src/Internal/ObjectExporter/ClosureExporter/PrettyPrinter.php index 97fd44245..7b89289ba 100644 --- a/app/vendor/brick/varexporter/src/Internal/ObjectExporter/ClosureExporter/PrettyPrinter.php +++ b/app/vendor/brick/varexporter/src/Internal/ObjectExporter/ClosureExporter/PrettyPrinter.php @@ -7,6 +7,8 @@ use Override; use PhpParser\PrettyPrinter\Standard; +use function str_repeat; + /** * Extends the standard pretty-printer to allow for a base indent level. * @@ -16,13 +18,13 @@ final class PrettyPrinter extends Standard { private int $varExporterNestingLevel = 0; - public function setVarExporterNestingLevel(int $level) : void + public function setVarExporterNestingLevel(int $level): void { $this->varExporterNestingLevel = $level; } #[Override] - protected function resetState() : void + protected function resetState(): void { parent::resetState(); diff --git a/app/vendor/brick/varexporter/src/Internal/ObjectExporter/EnumExporter.php b/app/vendor/brick/varexporter/src/Internal/ObjectExporter/EnumExporter.php index 86fc1cbae..77cda93e4 100644 --- a/app/vendor/brick/varexporter/src/Internal/ObjectExporter/EnumExporter.php +++ b/app/vendor/brick/varexporter/src/Internal/ObjectExporter/EnumExporter.php @@ -6,8 +6,11 @@ use Brick\VarExporter\Internal\ObjectExporter; use Override; +use ReflectionObject; use UnitEnum; +use function assert; + /** * Handles enums. * @@ -16,18 +19,18 @@ final class EnumExporter extends ObjectExporter { #[Override] - public function supports(\ReflectionObject $reflectionObject) : bool + public function supports(ReflectionObject $reflectionObject): bool { return $reflectionObject->isEnum(); } #[Override] - public function export(object $object, \ReflectionObject $reflectionObject, array $path, array $parentIds) : array + public function export(object $object, ReflectionObject $reflectionObject, array $path, array $parentIds): array { assert($object instanceof UnitEnum); return [ - $object::class . '::' . $object->name + $object::class . '::' . $object->name, ]; } } diff --git a/app/vendor/brick/varexporter/src/Internal/ObjectExporter/InternalClassExporter.php b/app/vendor/brick/varexporter/src/Internal/ObjectExporter/InternalClassExporter.php index 79ce7cf05..62be3135d 100644 --- a/app/vendor/brick/varexporter/src/Internal/ObjectExporter/InternalClassExporter.php +++ b/app/vendor/brick/varexporter/src/Internal/ObjectExporter/InternalClassExporter.php @@ -7,6 +7,7 @@ use Brick\VarExporter\ExportException; use Brick\VarExporter\Internal\ObjectExporter; use Override; +use ReflectionObject; /** * Throws on internal classes. @@ -16,13 +17,13 @@ final class InternalClassExporter extends ObjectExporter { #[Override] - public function supports(\ReflectionObject $reflectionObject) : bool + public function supports(ReflectionObject $reflectionObject): bool { return $reflectionObject->isInternal(); } #[Override] - public function export(object $object, \ReflectionObject $reflectionObject, array $path, array $parentIds) : array + public function export(object $object, ReflectionObject $reflectionObject, array $path, array $parentIds): array { $className = $reflectionObject->getName(); diff --git a/app/vendor/brick/varexporter/src/Internal/ObjectExporter/SerializeExporter.php b/app/vendor/brick/varexporter/src/Internal/ObjectExporter/SerializeExporter.php index 6953ae8b4..639ac40f9 100644 --- a/app/vendor/brick/varexporter/src/Internal/ObjectExporter/SerializeExporter.php +++ b/app/vendor/brick/varexporter/src/Internal/ObjectExporter/SerializeExporter.php @@ -6,6 +6,9 @@ use Brick\VarExporter\Internal\ObjectExporter; use Override; +use ReflectionObject; + +use function array_merge; /** * Handles instances of classes with __serialize() and __unserialize() methods. @@ -15,14 +18,14 @@ final class SerializeExporter extends ObjectExporter { #[Override] - public function supports(\ReflectionObject $reflectionObject) : bool + public function supports(ReflectionObject $reflectionObject): bool { return $reflectionObject->hasMethod('__serialize') && $reflectionObject->hasMethod('__unserialize'); } #[Override] - public function export(object $object, \ReflectionObject $reflectionObject, array $path, array $parentIds) : array + public function export(object $object, ReflectionObject $reflectionObject, array $path, array $parentIds): array { $lines = $this->getCreateObjectCode($reflectionObject); diff --git a/app/vendor/brick/varexporter/src/Internal/ObjectExporter/SetStateExporter.php b/app/vendor/brick/varexporter/src/Internal/ObjectExporter/SetStateExporter.php index a33c79e38..d760c2117 100644 --- a/app/vendor/brick/varexporter/src/Internal/ObjectExporter/SetStateExporter.php +++ b/app/vendor/brick/varexporter/src/Internal/ObjectExporter/SetStateExporter.php @@ -7,6 +7,12 @@ use Brick\VarExporter\ExportException; use Brick\VarExporter\Internal\ObjectExporter; use Override; +use ReflectionClass; +use ReflectionObject; + +use function array_key_exists; +use function strrpos; +use function substr; /** * Handles instances of classes with a __set_state() method. @@ -16,7 +22,7 @@ final class SetStateExporter extends ObjectExporter { #[Override] - public function supports(\ReflectionObject $reflectionObject) : bool + public function supports(ReflectionObject $reflectionObject): bool { if ($reflectionObject->hasMethod('__set_state')) { $method = $reflectionObject->getMethod('__set_state'); @@ -28,7 +34,7 @@ public function supports(\ReflectionObject $reflectionObject) : bool } #[Override] - public function export(object $object, \ReflectionObject $reflectionObject, array $path, array $parentIds) : array + public function export(object $object, ReflectionObject $reflectionObject, array $path, array $parentIds): array { $className = $reflectionObject->getName(); @@ -36,7 +42,7 @@ public function export(object $object, \ReflectionObject $reflectionObject, arra $exportedVars = $this->exporter->exportArray($vars, $path, $parentIds); - return $this->exporter->wrap($exportedVars, '\\' . $className . '::__set_state(', ')'); + return $this->exporter->wrap($exportedVars, '\\' . $className . '::__set_state(', ')'); } /** @@ -51,16 +57,16 @@ public function export(object $object, \ReflectionObject $reflectionObject, arra * * This way we offer a better safety guarantee, while staying compatible with var_export() in the output. * - * @psalm-suppress MixedAssignment - * * @param object $object The object to dump. * @param string[] $path The path to the object, in the array/object graph. * * @return array An associative array of property name to value. * * @throws ExportException + * + * @psalm-suppress MixedAssignment */ - private function getObjectVars(object $object, array $path) : array + private function getObjectVars(object $object, array $path): array { $result = []; @@ -78,7 +84,7 @@ private function getObjectVars(object $object, array $path) : array throw new ExportException( 'Class "' . $className . '" has overridden private property "' . $name . '". ' . 'This is not supported for exporting objects with __set_state().', - $path + $path, ); } @@ -92,10 +98,10 @@ private function getObjectVars(object $object, array $path) : array return $result; } - private function isDynamicProperty(object $object, string $name) : bool + private function isDynamicProperty(object $object, string $name): bool { - $reflectionClass = new \ReflectionClass($object); - $reflectionObject = new \ReflectionObject($object); + $reflectionClass = new ReflectionClass($object); + $reflectionObject = new ReflectionObject($object); return $reflectionObject->hasProperty($name) && ! $reflectionClass->hasProperty($name); } diff --git a/app/vendor/brick/varexporter/src/Internal/ObjectExporter/StdClassExporter.php b/app/vendor/brick/varexporter/src/Internal/ObjectExporter/StdClassExporter.php index 5c7e869d0..6e49dcddd 100644 --- a/app/vendor/brick/varexporter/src/Internal/ObjectExporter/StdClassExporter.php +++ b/app/vendor/brick/varexporter/src/Internal/ObjectExporter/StdClassExporter.php @@ -6,6 +6,8 @@ use Brick\VarExporter\Internal\ObjectExporter; use Override; +use ReflectionObject; +use stdClass; /** * Handles stdClass objects. @@ -15,13 +17,13 @@ final class StdClassExporter extends ObjectExporter { #[Override] - public function supports(\ReflectionObject $reflectionObject) : bool + public function supports(ReflectionObject $reflectionObject): bool { - return $reflectionObject->getName() === \stdClass::class; + return $reflectionObject->getName() === stdClass::class; } #[Override] - public function export(object $object, \ReflectionObject $reflectionObject, array $path, array $parentIds) : array + public function export(object $object, ReflectionObject $reflectionObject, array $path, array $parentIds): array { $exported = $this->exporter->exportArray((array) $object, $path, $parentIds); diff --git a/app/vendor/brick/varexporter/src/VarExporter.php b/app/vendor/brick/varexporter/src/VarExporter.php index 7258f337a..687a1cae7 100644 --- a/app/vendor/brick/varexporter/src/VarExporter.php +++ b/app/vendor/brick/varexporter/src/VarExporter.php @@ -6,6 +6,14 @@ use Brick\VarExporter\Internal\GenericExporter; +use function array_map; +use function array_shift; +use function count; +use function implode; +use function str_repeat; + +use const PHP_EOL; + final class VarExporter { /** @@ -50,7 +58,7 @@ final class VarExporter /** * Formats lists (0-based numeric arrays) containing only scalar values on a single line. * Types considered scalar here are int, bool, float, string and null. - * This option is a subset of INLINE_ARRAY, and has no effect when INLINE_ARRAY is used. + * This option is a subset of INLINE_ARRAY and INLINE_LITERAL_LIST and has no effect when either is used. */ public const INLINE_SCALAR_LIST = 1 << 7; @@ -75,14 +83,21 @@ final class VarExporter public const INLINE_ARRAY = 1 << 11; /** - * @param mixed $var The variable to export. - * @param int $options A bitmask of options. Possible values are `VarExporter::*` constants. - * Combine multiple options with a bitwise OR `|` operator. - * @param int $indentLevel The base output indentation level. + * Formats lists (0-based numeric arrays) containing only literal values on a single line. + * Values considered literal are: int, float, string, bool, null, and enum values. + * This option is a subset of INLINE_ARRAY and has no effect when INLINE_ARRAY is used. + */ + public const INLINE_LITERAL_LIST = 1 << 12; + + /** + * @param mixed $var The variable to export. + * @param int $options A bitmask of options. Possible values are `VarExporter::*` constants. + * Combine multiple options with a bitwise OR `|` operator. + * @param int $indentLevel The base output indentation level. * * @throws ExportException */ - public static function export(mixed $var, int $options = 0, int $indentLevel = 0) : string + public static function export(mixed $var, int $options = 0, int $indentLevel = 0): string { $exporter = new GenericExporter($options, $indentLevel); $lines = $exporter->export($var, [], []); @@ -92,7 +107,7 @@ public static function export(mixed $var, int $options = 0, int $indentLevel = 0 } else { $firstLine = array_shift($lines); $lines = array_map( - fn($line) => str_repeat(' ', $indentLevel) . $line, + fn ($line) => str_repeat(' ', $indentLevel) . $line, $lines, ); diff --git a/app/vendor/brick/varexporter/tools/ecs/composer.json b/app/vendor/brick/varexporter/tools/ecs/composer.json new file mode 100644 index 000000000..5298cfffd --- /dev/null +++ b/app/vendor/brick/varexporter/tools/ecs/composer.json @@ -0,0 +1,10 @@ +{ + "require": { + "brick/coding-standard": "v4" + }, + "config": { + "allow-plugins": { + "dealerdirect/phpcodesniffer-composer-installer": false + } + } +} diff --git a/app/vendor/brick/varexporter/tools/ecs/ecs.php b/app/vendor/brick/varexporter/tools/ecs/ecs.php new file mode 100644 index 000000000..9f00ee7a6 --- /dev/null +++ b/app/vendor/brick/varexporter/tools/ecs/ecs.php @@ -0,0 +1,32 @@ +import(__DIR__ . '/vendor/brick/coding-standard/ecs.php'); + + $libRootPath = realpath(__DIR__ . '/../../'); + + $ecsConfig->paths( + [ + $libRootPath . '/src', + $libRootPath . '/tests', + __FILE__, + ], + ); + + $ecsConfig->skip([ + // uses unknown functions etc., let's not touch it + $libRootPath . '/tests/ExportClosureTest.php', + + // tests expect a certain order of class elements + OrderedClassElementsFixer::class => $libRootPath . '/tests/Classes/Hierarchy/*.php', + + // assertEquals() is used intentionally in assertExportEquals() + PhpUnitStrictFixer::class => $libRootPath . 'tests/AbstractTestCase.php', + ]); +}; diff --git a/app/vendor/cakephp-plugins.php b/app/vendor/cakephp-plugins.php index baabe40de..7d415483c 100644 --- a/app/vendor/cakephp-plugins.php +++ b/app/vendor/cakephp-plugins.php @@ -6,7 +6,16 @@ 'Authentication' => $baseDir . '/vendor/cakephp/authentication/', 'Bake' => $baseDir . '/vendor/cakephp/bake/', 'Cake/TwigView' => $baseDir . '/vendor/cakephp/twig-view/', + 'CoreApi' => $baseDir . '/plugins/CoreApi/', + 'CoreAssigner' => $baseDir . '/plugins/CoreAssigner/', + 'CoreEnroller' => $baseDir . '/plugins/CoreEnroller/', + 'CoreJob' => $baseDir . '/plugins/CoreJob/', + 'CoreServer' => $baseDir . '/plugins/CoreServer/', 'DebugKit' => $baseDir . '/vendor/cakephp/debug_kit/', + 'EnvSource' => $baseDir . '/plugins/EnvSource/', 'Migrations' => $baseDir . '/vendor/cakephp/migrations/', + 'OrcidSource' => $baseDir . '/plugins/OrcidSource/', + 'SshKeyAuthenticator' => $baseDir . '/plugins/SshKeyAuthenticator/', + 'TermsAgreer' => $baseDir . '/plugins/TermsAgreer/', ], ]; diff --git a/app/vendor/cakephp/authentication/composer.json b/app/vendor/cakephp/authentication/composer.json index 22782b3d0..8f74bcc9d 100644 --- a/app/vendor/cakephp/authentication/composer.json +++ b/app/vendor/cakephp/authentication/composer.json @@ -35,7 +35,7 @@ "cakephp/cakephp": "^5.1.0", "cakephp/cakephp-codesniffer": "^5.0", "firebase/php-jwt": "^6.2", - "phpunit/phpunit": "^10.5.5 || ^11.1.3 || ^12.0.9" + "phpunit/phpunit": "^10.5.58 || ^11.5.3 || ^12.4" }, "suggest": { "ext-ldap": "Make sure this php extension is installed and enabled on your system if you want to use the built-in LDAP adapter for \"LdapIdentifier\".", diff --git a/app/vendor/cakephp/authentication/src/AuthenticationPlugin.php b/app/vendor/cakephp/authentication/src/AuthenticationPlugin.php new file mode 100644 index 000000000..3400bf096 --- /dev/null +++ b/app/vendor/cakephp/authentication/src/AuthenticationPlugin.php @@ -0,0 +1,45 @@ + [ + * 'enabled' => true, // Enable validation (default: false for BC) + * 'maxDepth' => 1, // Max nested "redirect=" parameters (default: 1) + * 'maxEncodingLevels' => 1, // Max percent-encoding levels (default: 1) + * 'maxLength' => 2000, // Max URL length in characters (default: 2000) + * ] + * ``` * * ### Example: * @@ -105,6 +117,12 @@ class AuthenticationService implements AuthenticationServiceInterface, Impersona 'identityAttribute' => 'identity', 'queryParam' => null, 'unauthenticatedRedirect' => null, + 'redirectValidation' => [ + 'enabled' => false, // Disabled by default for backward compatibility + 'maxDepth' => 1, + 'maxEncodingLevels' => 1, + 'maxLength' => 2000, + ], ]; /** @@ -383,14 +401,20 @@ public function buildIdentity(ArrayAccess|array $identityData): IdentityInterfac */ public function getUnauthenticatedRedirectUrl(ServerRequestInterface $request): ?string { - $param = $this->getConfig('queryParam'); $target = $this->getConfig('unauthenticatedRedirect'); if ($target === null) { return null; } + if (is_array($target) && class_exists(Router::class)) { $target = Router::url($target); } + + if ($request->getMethod() !== 'GET') { + return $target; + } + + $param = $this->getConfig('queryParam'); if ($param === null) { return $target; } @@ -451,7 +475,49 @@ public function getLoginRedirect(ServerRequestInterface $request): ?string $parsed['query'] = "?{$parsed['query']}"; } - return $parsed['path'] . $parsed['query']; + $redirect = $parsed['path'] . $parsed['query']; + + // Validate redirect to prevent loops if enabled + return $this->validateRedirect($redirect); + } + + /** + * Validates a redirect URL to prevent loops and malicious patterns + * + * This method can be overridden in subclasses to implement custom validation logic. + * + * @param string $redirect The redirect URL to validate + * @return string|null The validated URL or null if invalid + */ + protected function validateRedirect(string $redirect): ?string + { + $config = $this->getConfig('redirectValidation'); + + // If validation is disabled, return the URL as-is (backward compatibility) + if (!$config['enabled']) { + return $redirect; + } + + $decodedUrl = urldecode($redirect); + + // Check for nested redirect parameters + $redirectCount = substr_count($decodedUrl, 'redirect='); + if ($redirectCount >= $config['maxDepth']) { + return null; + } + + // Check for multiple encoding levels (e.g., %25 = percent-encoded %) + $encodingCount = substr_count($redirect, '%25'); + if ($encodingCount >= $config['maxEncodingLevels']) { + return null; + } + + // Check URL length to prevent DOS attacks + if (strlen($redirect) > $config['maxLength']) { + return null; + } + + return $redirect; } /** diff --git a/app/vendor/cakephp/authentication/src/Authenticator/AuthenticationRequiredException.php b/app/vendor/cakephp/authentication/src/Authenticator/AuthenticationRequiredException.php index 1bdd6370e..017074ce1 100644 --- a/app/vendor/cakephp/authentication/src/Authenticator/AuthenticationRequiredException.php +++ b/app/vendor/cakephp/authentication/src/Authenticator/AuthenticationRequiredException.php @@ -28,7 +28,7 @@ class AuthenticationRequiredException extends HttpException { /** - * @var array + * @var array|string> */ protected array $headers = []; diff --git a/app/vendor/cakephp/authentication/src/Authenticator/CookieAuthenticator.php b/app/vendor/cakephp/authentication/src/Authenticator/CookieAuthenticator.php index 6c16053f0..580aec6b3 100644 --- a/app/vendor/cakephp/authentication/src/Authenticator/CookieAuthenticator.php +++ b/app/vendor/cakephp/authentication/src/Authenticator/CookieAuthenticator.php @@ -18,6 +18,8 @@ use ArrayAccess; use Authentication\Identifier\AbstractIdentifier; +use Authentication\Identifier\IdentifierCollection; +use Authentication\Identifier\IdentifierInterface; use Authentication\PasswordHasher\PasswordHasherTrait; use Authentication\UrlChecker\UrlCheckerTrait; use Cake\Http\Cookie\Cookie; @@ -55,6 +57,26 @@ class CookieAuthenticator extends AbstractAuthenticator implements PersistenceIn 'salt' => true, ]; + /** + * Gets the identifier, loading a default Password identifier if none configured. + * + * This is done lazily to allow loadIdentifier() to be called after loadAuthenticator(). + * + * @return \Authentication\Identifier\IdentifierInterface + */ + public function getIdentifier(): IdentifierInterface + { + if ($this->_identifier instanceof IdentifierCollection && $this->_identifier->isEmpty()) { + $identifierConfig = []; + if ($this->getConfig('fields')) { + $identifierConfig['fields'] = $this->getConfig('fields'); + } + $this->_identifier->load('Authentication.Password', $identifierConfig); + } + + return $this->_identifier; + } + /** * @inheritDoc */ @@ -82,10 +104,11 @@ public function authenticate(ServerRequestInterface $request): ResultInterface [$username, $tokenHash] = $token; - $identity = $this->_identifier->identify(compact('username')); + $identifier = $this->getIdentifier(); + $identity = $identifier->identify(compact('username')); if (!$identity) { - return new Result(null, Result::FAILURE_IDENTITY_NOT_FOUND, $this->_identifier->getErrors()); + return new Result(null, Result::FAILURE_IDENTITY_NOT_FOUND, $identifier->getErrors()); } if (!$this->_checkToken($identity, $tokenHash)) { diff --git a/app/vendor/cakephp/authentication/src/Authenticator/FormAuthenticator.php b/app/vendor/cakephp/authentication/src/Authenticator/FormAuthenticator.php index 07bbe9d76..781b4e70e 100644 --- a/app/vendor/cakephp/authentication/src/Authenticator/FormAuthenticator.php +++ b/app/vendor/cakephp/authentication/src/Authenticator/FormAuthenticator.php @@ -17,6 +17,8 @@ namespace Authentication\Authenticator; use Authentication\Identifier\AbstractIdentifier; +use Authentication\Identifier\IdentifierCollection; +use Authentication\Identifier\IdentifierInterface; use Authentication\UrlChecker\UrlCheckerTrait; use Cake\Routing\Router; use Psr\Http\Message\ServerRequestInterface; @@ -47,6 +49,26 @@ class FormAuthenticator extends AbstractAuthenticator ], ]; + /** + * Gets the identifier, loading a default Password identifier if none configured. + * + * This is done lazily to allow loadIdentifier() to be called after loadAuthenticator(). + * + * @return \Authentication\Identifier\IdentifierInterface + */ + public function getIdentifier(): IdentifierInterface + { + if ($this->_identifier instanceof IdentifierCollection && $this->_identifier->isEmpty()) { + $identifierConfig = []; + if ($this->getConfig('fields')) { + $identifierConfig['fields'] = $this->getConfig('fields'); + } + $this->_identifier->load('Authentication.Password', $identifierConfig); + } + + return $this->_identifier; + } + /** * Checks the fields to ensure they are supplied. * @@ -116,9 +138,12 @@ protected function _buildLoginUrlErrorResult(ServerRequestInterface $request): R } /** - * Authenticates the identity contained in a request. Will use the `config.userModel`, and `config.fields` - * to find POST data that is used to find a matching record in the `config.userModel`. Will return false if - * there is no post data, either username or password is missing, or if the scope conditions have not been met. + * Authenticates the identity contained in a request. + * + * Will use the `config.userModel`, and `config.fields` to find POST data + * that is used to find a matching record in the `config.userModel`. + * Will return false if there is no post data, either username or password is missing, + * or if the scope conditions have not been met. * * @param \Psr\Http\Message\ServerRequestInterface $request The request that contains login information. * @return \Authentication\Authenticator\ResultInterface @@ -136,10 +161,11 @@ public function authenticate(ServerRequestInterface $request): ResultInterface ]); } - $user = $this->_identifier->identify($data); + $identifier = $this->getIdentifier(); + $user = $identifier->identify($data); if (!$user) { - return new Result(null, Result::FAILURE_IDENTITY_NOT_FOUND, $this->_identifier->getErrors()); + return new Result(null, Result::FAILURE_IDENTITY_NOT_FOUND, $identifier->getErrors()); } return new Result($user, Result::SUCCESS); diff --git a/app/vendor/cakephp/authentication/src/Authenticator/HttpBasicAuthenticator.php b/app/vendor/cakephp/authentication/src/Authenticator/HttpBasicAuthenticator.php index e98782433..7d5c2b8d7 100644 --- a/app/vendor/cakephp/authentication/src/Authenticator/HttpBasicAuthenticator.php +++ b/app/vendor/cakephp/authentication/src/Authenticator/HttpBasicAuthenticator.php @@ -16,6 +16,8 @@ namespace Authentication\Authenticator; use Authentication\Identifier\AbstractIdentifier; +use Authentication\Identifier\IdentifierCollection; +use Authentication\Identifier\IdentifierInterface; use Psr\Http\Message\ServerRequestInterface; /** @@ -41,6 +43,26 @@ class HttpBasicAuthenticator extends AbstractAuthenticator implements StatelessI 'skipChallenge' => false, ]; + /** + * Gets the identifier, loading a default Password identifier if none configured. + * + * This is done lazily to allow loadIdentifier() to be called after loadAuthenticator(). + * + * @return \Authentication\Identifier\IdentifierInterface + */ + public function getIdentifier(): IdentifierInterface + { + if ($this->_identifier instanceof IdentifierCollection && $this->_identifier->isEmpty()) { + $identifierConfig = []; + if ($this->getConfig('fields')) { + $identifierConfig['fields'] = $this->getConfig('fields'); + } + $this->_identifier->load('Authentication.Password', $identifierConfig); + } + + return $this->_identifier; + } + /** * Authenticate a user using HTTP auth. Will use the configured User model and attempt a * login using HTTP auth. @@ -58,7 +80,7 @@ public function authenticate(ServerRequestInterface $request): ResultInterface return new Result(null, Result::FAILURE_CREDENTIALS_MISSING); } - $user = $this->_identifier->identify([ + $user = $this->getIdentifier()->identify([ AbstractIdentifier::CREDENTIAL_USERNAME => $username, AbstractIdentifier::CREDENTIAL_PASSWORD => $password, ]); diff --git a/app/vendor/cakephp/authentication/src/Authenticator/JwtAuthenticator.php b/app/vendor/cakephp/authentication/src/Authenticator/JwtAuthenticator.php index 2afa82fe2..3ce212e35 100644 --- a/app/vendor/cakephp/authentication/src/Authenticator/JwtAuthenticator.php +++ b/app/vendor/cakephp/authentication/src/Authenticator/JwtAuthenticator.php @@ -17,6 +17,7 @@ namespace Authentication\Authenticator; use ArrayObject; +use Authentication\Identifier\IdentifierCollection; use Authentication\Identifier\IdentifierInterface; use Authentication\Identifier\JwtSubjectIdentifier; use Cake\Utility\Security; @@ -66,6 +67,22 @@ public function __construct(IdentifierInterface $identifier, array $config = []) } } + /** + * Gets the identifier, loading a default JwtSubject identifier if none configured. + * + * This is done lazily to allow loadIdentifier() to be called after loadAuthenticator(). + * + * @return \Authentication\Identifier\IdentifierInterface + */ + public function getIdentifier(): IdentifierInterface + { + if ($this->_identifier instanceof IdentifierCollection && $this->_identifier->isEmpty()) { + $this->_identifier->load('Authentication.JwtSubject'); + } + + return $this->_identifier; + } + /** * Authenticates the identity based on a JWT token contained in a request. * @@ -106,12 +123,13 @@ public function authenticate(ServerRequestInterface $request): ResultInterface return new Result($user, Result::SUCCESS); } - $user = $this->_identifier->identify([ + $identifier = $this->getIdentifier(); + $user = $identifier->identify([ $subjectKey => $result[$subjectKey], ]); if (!$user) { - return new Result(null, Result::FAILURE_IDENTITY_NOT_FOUND, $this->_identifier->getErrors()); + return new Result(null, Result::FAILURE_IDENTITY_NOT_FOUND, $identifier->getErrors()); } return new Result($user, Result::SUCCESS); diff --git a/app/vendor/cakephp/authentication/src/Authenticator/SessionAuthenticator.php b/app/vendor/cakephp/authentication/src/Authenticator/SessionAuthenticator.php index a6c98deaf..32c7f983e 100644 --- a/app/vendor/cakephp/authentication/src/Authenticator/SessionAuthenticator.php +++ b/app/vendor/cakephp/authentication/src/Authenticator/SessionAuthenticator.php @@ -21,6 +21,7 @@ use Cake\Http\Exception\UnauthorizedException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; +use function Cake\Core\deprecationWarning; /** * Session Authenticator @@ -31,9 +32,9 @@ class SessionAuthenticator extends AbstractAuthenticator implements PersistenceI * Default config for this object. * - `fields` The fields to use to verify a user by. * - `sessionKey` Session key. - * - `identify` Whether to identify user data stored in a session. This is - * useful if you want to remotely end sessions that have a different password stored, - * or if your identification logic needs additional conditions before a user can login. + * - `identify` Whether to identify user data stored in a session. + * Deprecated: Use `PrimaryKeySessionAuthenticator` instead if you + * need to fetch fresh user data from the database on each request. * * @var array */ @@ -65,6 +66,11 @@ public function authenticate(ServerRequestInterface $request): ResultInterface } if ($this->getConfig('identify') === true) { + deprecationWarning( + '3.4.0', + 'The `identify` option is deprecated. ' . + 'Use `PrimaryKeySessionAuthenticator` instead to fetch fresh user data on each request.', + ); $credentials = []; foreach ($this->getConfig('fields') as $key => $field) { $credentials[$key] = $user[$field]; diff --git a/app/vendor/cakephp/authentication/src/Authenticator/TokenAuthenticator.php b/app/vendor/cakephp/authentication/src/Authenticator/TokenAuthenticator.php index 385a9c5c4..3751ac82d 100644 --- a/app/vendor/cakephp/authentication/src/Authenticator/TokenAuthenticator.php +++ b/app/vendor/cakephp/authentication/src/Authenticator/TokenAuthenticator.php @@ -16,6 +16,8 @@ */ namespace Authentication\Authenticator; +use Authentication\Identifier\IdentifierCollection; +use Authentication\Identifier\IdentifierInterface; use Authentication\Identifier\TokenIdentifier; use Psr\Http\Message\ServerRequestInterface; @@ -35,6 +37,22 @@ class TokenAuthenticator extends AbstractAuthenticator implements StatelessInter 'tokenPrefix' => null, ]; + /** + * Gets the identifier, loading a default Token identifier if none configured. + * + * This is done lazily to allow loadIdentifier() to be called after loadAuthenticator(). + * + * @return \Authentication\Identifier\IdentifierInterface + */ + public function getIdentifier(): IdentifierInterface + { + if ($this->_identifier instanceof IdentifierCollection && $this->_identifier->isEmpty()) { + $this->_identifier->load('Authentication.Token'); + } + + return $this->_identifier; + } + /** * Checks if the token is in the headers or a request parameter * @@ -124,12 +142,13 @@ public function authenticate(ServerRequestInterface $request): ResultInterface return new Result(null, Result::FAILURE_CREDENTIALS_MISSING); } - $user = $this->_identifier->identify([ + $identifier = $this->getIdentifier(); + $user = $identifier->identify([ TokenIdentifier::CREDENTIAL_TOKEN => $token, ]); if (!$user) { - return new Result(null, Result::FAILURE_IDENTITY_NOT_FOUND, $this->_identifier->getErrors()); + return new Result(null, Result::FAILURE_IDENTITY_NOT_FOUND, $identifier->getErrors()); } return new Result($user, Result::SUCCESS); diff --git a/app/vendor/cakephp/authentication/src/Identifier/IdentifierCollection.php b/app/vendor/cakephp/authentication/src/Identifier/IdentifierCollection.php index ec49d1dc0..257b25d8e 100644 --- a/app/vendor/cakephp/authentication/src/Identifier/IdentifierCollection.php +++ b/app/vendor/cakephp/authentication/src/Identifier/IdentifierCollection.php @@ -56,7 +56,11 @@ public function identify(array $credentials): ArrayAccess|array|null return $result; } - $this->_errors[$name] = $identifier->getErrors(); + + $errors = $identifier->getErrors(); + if ($errors) { + $this->_errors[$name] = $identifier->getErrors(); + } } $this->_successfulIdentifier = null; diff --git a/app/vendor/cakephp/authentication/src/Plugin.php b/app/vendor/cakephp/authentication/src/Plugin.php index 2e169f6b2..40c4da55a 100644 --- a/app/vendor/cakephp/authentication/src/Plugin.php +++ b/app/vendor/cakephp/authentication/src/Plugin.php @@ -15,31 +15,9 @@ */ namespace Authentication; -use Cake\Core\BasePlugin; - /** - * Plugin class for CakePHP. + * @deprecated 3.3.4 Use AuthenticationPlugin instead */ -class Plugin extends BasePlugin +class Plugin extends AuthenticationPlugin { - /** - * Do bootstrapping or not - * - * @var bool - */ - protected bool $bootstrapEnabled = false; - - /** - * Load routes or not - * - * @var bool - */ - protected bool $routesEnabled = false; - - /** - * Console middleware - * - * @var bool - */ - protected bool $consoleEnabled = false; } diff --git a/app/vendor/cakephp/bake/.phive/phars.xml b/app/vendor/cakephp/bake/.phive/phars.xml index f5aa33004..40973f754 100644 --- a/app/vendor/cakephp/bake/.phive/phars.xml +++ b/app/vendor/cakephp/bake/.phive/phars.xml @@ -1,4 +1,4 @@ - + diff --git a/app/vendor/cakephp/bake/Dockerfile b/app/vendor/cakephp/bake/Dockerfile index 7acfb27ee..d1f129524 100644 --- a/app/vendor/cakephp/bake/Dockerfile +++ b/app/vendor/cakephp/bake/Dockerfile @@ -1,26 +1,36 @@ -# Basic docker based environment -# Necessary to trick dokku into building the documentation -# using dockerfile instead of herokuish -FROM ubuntu:22.04 - -# Add basic tools -RUN apt-get update && \ - apt-get install -y build-essential \ - software-properties-common \ - curl \ - git \ - libxml2 \ - libffi-dev \ - libssl-dev - -# Prevent interactive timezone input -ENV DEBIAN_FRONTEND=noninteractive -RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php && \ - apt-get update && \ - apt-get install -y php8.1-cli php8.1-mbstring php8.1-xml php8.1-zip php8.1-intl php8.1-opcache php8.1-sqlite - -WORKDIR /code - -VOLUME ["/code"] - -CMD [ '/bin/bash' ] +# ---------------------- +# 1. Build stage +# ---------------------- +FROM node:24-alpine AS builder + +# Git is required because docs/package.json pulls a dependency from GitHub. +RUN apk add --no-cache git openssh-client + +WORKDIR /app/docs + +# Copy dependency manifests first to preserve Docker layer caching. +COPY docs/ ./ +RUN npm ci + +# Increase max-old-space-size to avoid memory issues during build +#ENV NODE_OPTIONS="--max-old-space-size=8192" + +# Build the site. +RUN npm run docs:build + +# ---------------------- +# 2. Runtime stage (angie) +# ---------------------- +FROM docker.angie.software/angie:latest AS runner + +# Copy built files +COPY --from=builder /app/docs/.vitepress/dist /usr/share/angie/html + +# Expose port +EXPOSE 80 + +# Health check (optional) +HEALTHCHECK CMD wget --quiet --tries=1 --spider http://localhost:80/ || exit 1 + +# Start angie +CMD ["angie", "-g", "daemon off;"] diff --git a/app/vendor/cakephp/bake/composer.json b/app/vendor/cakephp/bake/composer.json index fedab7a39..6ad33444a 100644 --- a/app/vendor/cakephp/bake/composer.json +++ b/app/vendor/cakephp/bake/composer.json @@ -23,15 +23,15 @@ }, "require": { "php": ">=8.1", - "brick/varexporter": "^0.6.0", + "brick/varexporter": "^0.6.0 || ^0.7.0", "cakephp/cakephp": "^5.1", - "cakephp/twig-view": "^2.0.0", + "cakephp/twig-view": "^2.0.2", "nikic/php-parser": "^5.0.0" }, "require-dev": { "cakephp/cakephp-codesniffer": "^5.0.0", "cakephp/debug_kit": "^5.0.0", - "phpunit/phpunit": "^10.5.5 || ^11.1.3" + "phpunit/phpunit": "^10.5.40 || ^11.5.20 || ^12.2.4" }, "autoload": { "psr-4": { @@ -40,10 +40,17 @@ }, "autoload-dev": { "psr-4": { + "Authentication\\": "tests/test_app/Plugin/Authentication/src/", + "Authorization\\": "tests/test_app/Plugin/Authorization/src/", "BakeTest\\": "tests/test_app/Plugin/BakeTest/src/", "Bake\\Test\\": "tests/", "Bake\\Test\\App\\": "tests/test_app/App/", "Company\\Pastry\\": "tests/test_app/Plugin/Company/Pastry/src/", + "FixtureTest\\": "tests/test_app/App/Plugin/FixtureTest/src/", + "TestBake\\": "tests/test_app/Plugin/TestBake/src/", + "TestBakeTheme\\": "tests/test_app/Plugin/TestBakeTheme/src/", + "TestTemplate\\": "tests/test_app/App/Plugin/TestTemplate/src/", + "TestTest\\": "tests/test_app/App/Plugin/TestTest/src/", "WithBakeSubFolder\\": "tests/test_app/Plugin/WithBakeSubFolder/src/" } }, @@ -58,12 +65,15 @@ "@test", "@cs-check" ], - "cs-check": "phpcs --parallel=16 -p src/ tests/", - "cs-fix": "phpcbf --parallel=16 -p src/ tests/", + "cs-check": "phpcs", + "cs-fix": "phpcbf", "phpstan": "tools/phpstan analyse", "stan": "@phpstan", "stan-baseline": "tools/phpstan --generate-baseline", "stan-setup": "phive install", + "rector-setup": "cp composer.json composer.backup && composer require --dev rector/rector:\"~2.3.1\" && mv composer.backup composer.json", + "rector-check": "vendor/bin/rector process --dry-run", + "rector-fix": "vendor/bin/rector process", "test": "phpunit", "test-coverage": "phpunit --coverage-clover=clover.xml" } diff --git a/app/vendor/cakephp/bake/docs.Dockerfile b/app/vendor/cakephp/bake/docs.Dockerfile deleted file mode 100644 index eb134b0ee..000000000 --- a/app/vendor/cakephp/bake/docs.Dockerfile +++ /dev/null @@ -1,24 +0,0 @@ -# Generate the HTML output. -FROM ghcr.io/cakephp/docs-builder as builder - -# Copy entire repo in with .git so we can build all versions in one image. -COPY docs /data/docs - -RUN cd /data/docs-builder \ - && make website LANGS="en es fr ja pt ru" SOURCE=/data/docs DEST=/data/website/ - -# Build a small nginx container with just the static site in it. -FROM ghcr.io/cakephp/docs-builder:runtime as runtime - -# Configure search index script -ENV LANGS="en es fr ja pt ru" -ENV SEARCH_SOURCE="/usr/share/nginx/html" -ENV SEARCH_URL_PREFIX="/bake/3" - -COPY --from=builder /data/docs /data/docs -COPY --from=builder /data/website /data/website -COPY --from=builder /data/docs-builder/nginx.conf /etc/nginx/conf.d/default.conf - -# Copy docs into place. -RUN cp -R /data/website/html/* /usr/share/nginx/html \ - && rm -rf /data/website diff --git a/app/vendor/cakephp/bake/docs/.vitepress/config.js b/app/vendor/cakephp/bake/docs/.vitepress/config.js new file mode 100644 index 000000000..5e8ac6185 --- /dev/null +++ b/app/vendor/cakephp/bake/docs/.vitepress/config.js @@ -0,0 +1,94 @@ +import baseConfig from '@cakephp/docs-skeleton/config' +import { createRequire } from 'module' + +const require = createRequire(import.meta.url) +const tocEn = require('./toc_en.json') +const tocEs = require('./toc_es.json') +const tocFr = require('./toc_fr.json') +const tocJa = require('./toc_ja.json') +const tocPt = require('./toc_pt.json') +const tocRu = require('./toc_ru.json') + +const versions = { + text: '3.x', + items: [ + { text: '3.x (current)', link: 'https://book.cakephp.org/bake/3/', target: '_self' }, + { text: '2.x', link: 'https://book.cakephp.org/bake/2.x/', target: '_self' }, + { text: '1.x', link: 'https://book.cakephp.org/bake/1.x/', target: '_self' }, + ], +} + +export default { + extends: baseConfig, + srcDir: '.', + title: 'Bake', + description: 'CakePHP Bake Documentation', + base: '/bake/3/', + rewrites: { + 'en/:slug*': ':slug*', + }, + sitemap: { + hostname: 'https://book.cakephp.org/bake/3/', + }, + themeConfig: { + siteTitle: false, + pluginName: "Bake", + socialLinks: [ + { icon: 'github', link: 'https://github.com/cakephp/bake' }, + ], + editLink: { + pattern: 'https://github.com/cakephp/bake/edit/3.x/docs/:path', + text: 'Edit this page on GitHub', + }, + sidebar: tocEn, + nav: [ + { text: 'CakePHP', link: 'https://cakephp.org' }, + { text: 'API', link: 'https://api.cakephp.org/bake/' }, + { ...versions }, + ], + }, + locales: { + root: { + label: 'English', + lang: 'en', + themeConfig: { + sidebar: tocEn, + }, + }, + es: { + label: 'Español', + lang: 'es', + themeConfig: { + sidebar: tocEs, + }, + }, + fr: { + label: 'Français', + lang: 'fr', + themeConfig: { + sidebar: tocFr, + }, + }, + ja: { + label: '日本語', + lang: 'ja', + themeConfig: { + sidebar: tocJa, + }, + }, + pt: { + label: 'Português', + lang: 'pt', + themeConfig: { + sidebar: tocPt, + }, + }, + ru: { + label: 'Русский', + lang: 'ru', + themeConfig: { + sidebar: tocRu, + }, + }, + }, +} diff --git a/app/vendor/cakephp/bake/docs/.vitepress/theme/index.js b/app/vendor/cakephp/bake/docs/.vitepress/theme/index.js new file mode 100644 index 000000000..e33e19ec9 --- /dev/null +++ b/app/vendor/cakephp/bake/docs/.vitepress/theme/index.js @@ -0,0 +1 @@ +export { default } from '@cakephp/docs-skeleton' diff --git a/app/vendor/cakephp/bake/docs/.vitepress/toc_en.json b/app/vendor/cakephp/bake/docs/.vitepress/toc_en.json new file mode 100644 index 000000000..ae8a22c60 --- /dev/null +++ b/app/vendor/cakephp/bake/docs/.vitepress/toc_en.json @@ -0,0 +1,13 @@ +{ + "/": [ + { + "text": "CakePHP Bake", + "collapsed": false, + "items": [ + { "text": "Bake Console", "link": "/" }, + { "text": "Code Generation with Bake", "link": "/usage" }, + { "text": "Extending Bake", "link": "/development" } + ] + } + ] +} diff --git a/app/vendor/cakephp/bake/docs/.vitepress/toc_es.json b/app/vendor/cakephp/bake/docs/.vitepress/toc_es.json new file mode 100644 index 000000000..98b6e2cb0 --- /dev/null +++ b/app/vendor/cakephp/bake/docs/.vitepress/toc_es.json @@ -0,0 +1,13 @@ +{ + "/es/": [ + { + "text": "CakePHP Bake", + "collapsed": false, + "items": [ + { "text": "Consola Bake", "link": "/es/" }, + { "text": "Crear código con Bake", "link": "/es/usage" }, + { "text": "Extending Bake", "link": "/es/development" } + ] + } + ] +} diff --git a/app/vendor/cakephp/bake/docs/.vitepress/toc_fr.json b/app/vendor/cakephp/bake/docs/.vitepress/toc_fr.json new file mode 100644 index 000000000..eceb87131 --- /dev/null +++ b/app/vendor/cakephp/bake/docs/.vitepress/toc_fr.json @@ -0,0 +1,13 @@ +{ + "/fr/": [ + { + "text": "CakePHP Bake", + "collapsed": false, + "items": [ + { "text": "Console Bake", "link": "/fr/" }, + { "text": "Génération de code avec Bake", "link": "/fr/usage" }, + { "text": "Étendre Bake", "link": "/fr/development" } + ] + } + ] +} diff --git a/app/vendor/cakephp/bake/docs/.vitepress/toc_ja.json b/app/vendor/cakephp/bake/docs/.vitepress/toc_ja.json new file mode 100644 index 000000000..a459e238c --- /dev/null +++ b/app/vendor/cakephp/bake/docs/.vitepress/toc_ja.json @@ -0,0 +1,13 @@ +{ + "/ja/": [ + { + "text": "CakePHP Bake", + "collapsed": false, + "items": [ + { "text": "Bake コンソール", "link": "/ja/" }, + { "text": "Bake でコード生成", "link": "/ja/usage" }, + { "text": "Bake の拡張", "link": "/ja/development" } + ] + } + ] +} diff --git a/app/vendor/cakephp/bake/docs/.vitepress/toc_pt.json b/app/vendor/cakephp/bake/docs/.vitepress/toc_pt.json new file mode 100644 index 000000000..70af9e386 --- /dev/null +++ b/app/vendor/cakephp/bake/docs/.vitepress/toc_pt.json @@ -0,0 +1,13 @@ +{ + "/pt/": [ + { + "text": "CakePHP Bake", + "collapsed": false, + "items": [ + { "text": "Console Bake", "link": "/pt/" }, + { "text": "Geração de Código com Bake", "link": "/pt/usage" }, + { "text": "Estendendo o Bake", "link": "/pt/development" } + ] + } + ] +} diff --git a/app/vendor/cakephp/bake/docs/.vitepress/toc_ru.json b/app/vendor/cakephp/bake/docs/.vitepress/toc_ru.json new file mode 100644 index 000000000..38d8ea36d --- /dev/null +++ b/app/vendor/cakephp/bake/docs/.vitepress/toc_ru.json @@ -0,0 +1,13 @@ +{ + "/ru/": [ + { + "text": "CakePHP Bake", + "collapsed": false, + "items": [ + { "text": "Консоль Bake", "link": "/ru/" }, + { "text": "Генерация кода с помощью Bake", "link": "/ru/usage" }, + { "text": "Расширение возможностей Bake", "link": "/ru/development" } + ] + } + ] +} diff --git a/app/vendor/cakephp/bake/docs/config/__init__.py b/app/vendor/cakephp/bake/docs/config/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/app/vendor/cakephp/bake/docs/config/all.py b/app/vendor/cakephp/bake/docs/config/all.py deleted file mode 100644 index cfeecdc20..000000000 --- a/app/vendor/cakephp/bake/docs/config/all.py +++ /dev/null @@ -1,50 +0,0 @@ -# Global configuration information used across all the -# translations of documentation. -# -# Import the base theme configuration -from cakephpsphinx.config.all import * - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# - -# The full version, including alpha/beta/rc tags. -release = '3.x' - -# The search index version. -search_version = 'bake-3' - -# The marketing display name for the book. -version_name = '' - -# Project name shown in the black header bar -project = 'CakePHP Bake' - -# Other versions that display in the version picker menu. -version_list = [ - {'name': '1.x', 'number': '/bake/1.x', 'title': '1.x'}, - {'name': '2.x', 'number': '/bake/2.x', 'title': '2.x'}, - {'name': '3.x', 'number': '/bake/3.x', 'title': '3.x', 'current': True}, -] - -# Languages available. -languages = ['en', 'es', 'fr', 'ja', 'pt', 'ru'] - -# The GitHub branch name for this version of the docs -# for edit links to point at. -branch = '2.x' - -# Current version being built -version = '2.x' - -# Language in use for this directory. -language = 'en' - -show_root_link = True - -repository = 'cakephp/bake' - -source_path = 'docs/' - -hide_page_contents = ('search', '404', 'contents') diff --git a/app/vendor/cakephp/bake/docs/en/conf.py b/app/vendor/cakephp/bake/docs/en/conf.py deleted file mode 100644 index f638bda22..000000000 --- a/app/vendor/cakephp/bake/docs/en/conf.py +++ /dev/null @@ -1,9 +0,0 @@ -import sys, os - -# Append the top level directory of the docs, so we can import from the config dir. -sys.path.insert(0, os.path.abspath('..')) - -# Pull in all the configuration options defined in the global config file.. -from config.all import * - -language = 'en' diff --git a/app/vendor/cakephp/bake/docs/en/contents.rst b/app/vendor/cakephp/bake/docs/en/contents.rst deleted file mode 100644 index 08c3e957c..000000000 --- a/app/vendor/cakephp/bake/docs/en/contents.rst +++ /dev/null @@ -1,7 +0,0 @@ -.. toctree:: - :maxdepth: 2 - :caption: CakePHP Bake - - /index - /usage - /development diff --git a/app/vendor/cakephp/bake/docs/en/development.md b/app/vendor/cakephp/bake/docs/en/development.md new file mode 100644 index 000000000..bc7d608a8 --- /dev/null +++ b/app/vendor/cakephp/bake/docs/en/development.md @@ -0,0 +1,315 @@ +# Extending Bake + +Bake features an extensible architecture that allows your application or plugins +to modify or add to the base functionality. +Bake makes use of a dedicated view class that uses the [Twig](https://twig.symfony.com/) template engine. + +## Bake Events + +As a view class, `BakeView` emits the same events as any other view class, plus one extra initialize event. +However, whereas standard view classes use the event prefix `View.`, `BakeView` uses the event prefix `Bake.`. + +The initialize event can be used to make changes that apply to all baked output. +For example, to add another helper to the bake view class: + +```php +on('Bake.initialize', function (EventInterface $event) { + $view = $event->getSubject(); + + // In my bake templates, allow the use of the MySpecial helper + $view->loadHelper('MySpecial', ['some' => 'config']); + + // And add an $author variable so it's always available + $view->set('author', 'Andy'); +}); +``` + +Bake events can also be handy for making small changes to existing templates. +For example, to change the variable names used when baking controller and template files, listen for `Bake.beforeRender`: + +```php +on('Bake.beforeRender', function (EventInterface $event) { + $view = $event->getSubject(); + + // Use $rows for the main data variable in indexes + if ($view->get('pluralName')) { + $view->set('pluralName', 'rows'); + } + if ($view->get('pluralVar')) { + $view->set('pluralVar', 'rows'); + } + + // Use $theOne for the main data variable in view/edit + if ($view->get('singularName')) { + $view->set('singularName', 'theOne'); + } + if ($view->get('singularVar')) { + $view->set('singularVar', 'theOne'); + } +}); +``` + +You may also scope `Bake.beforeRender` and `Bake.afterRender` events to a specific generated file. +For instance, if you want to add specific actions to your `UsersController` when generating from a `Controller/controller.twig` file: + +```php +on( + 'Bake.beforeRender.Controller.controller', + function (EventInterface $event) { + $view = $event->getSubject(); + if ($view->get('name') === 'Users') { + // add the login and logout actions to the Users controller + $view->set('actions', [ + 'login', + 'logout', + 'index', + 'view', + 'add', + 'edit', + 'delete', + ]); + } + } +); +``` + +By scoping event listeners to specific bake templates, you can simplify your bake-related event logic and provide callbacks that are easier to test. + +## Bake Template Syntax + +Bake template files use the [Twig](https://twig.symfony.com/) template syntax. + +For example, when baking a command like this: + +```bash +bin/cake bake command Foo +``` + +The template used at `vendor/cakephp/bake/templates/bake/Command/command.twig` looks like this: + +```php +Test->classSuffixes[$this->name()])) { + $this->Test->classSuffixes[$this->name()] = 'Foo'; + } + + $name = ucfirst($this->name()); + if (!isset($this->Test->classTypes[$name])) { + $this->Test->classTypes[$name] = 'Foo'; + } + + parent::bakeTest($className, $args, $io); +} +``` + +- The **class suffix** is appended to the name provided in your `bake` call. In the example above, that would create `ExampleFooTest.php`. +- The **class type** is the sub-namespace used to reach your file relative to the app or plugin you are baking into. In the example above, that would create the test namespace `App\Test\TestCase\Foo`. + +## Configuring the BakeView Class + +Bake commands use the `BakeView` class to render templates. +You can access the instance by listening to the `Bake.initialize` event: + +```php +on( + 'Bake.initialize', + function ($event, $view) { + $view->loadHelper('Foo'); + } +); +``` diff --git a/app/vendor/cakephp/bake/docs/en/development.rst b/app/vendor/cakephp/bake/docs/en/development.rst deleted file mode 100644 index c7c7aa252..000000000 --- a/app/vendor/cakephp/bake/docs/en/development.rst +++ /dev/null @@ -1,343 +0,0 @@ -Extending Bake -############## - -Bake features an extensible architecture that allows your application or plugins -to modify or add-to the base functionality. Bake makes use of a dedicated -view class which uses the `Twig `_ template engine. - -Bake Events -=========== - -As a view class, ``BakeView`` emits the same events as any other view class, -plus one extra initialize event. However, whereas standard view classes use the -event prefix "View.", ``BakeView`` uses the event prefix "Bake.". - -The initialize event can be used to make changes which apply to all baked -output, for example to add another helper to the bake view class this event can -be used:: - - on('Bake.initialize', function (EventInterface $event) { - $view = $event->getSubject(); - - // In my bake templates, allow the use of the MySpecial helper - $view->loadHelper('MySpecial', ['some' => 'config']); - - // And add an $author variable so it's always available - $view->set('author', 'Andy'); - }); - -Bake events can be handy for making small changes to existing templates. -For example, to change the variable names used when baking controller/template -files one can use a function listening for ``Bake.beforeRender`` to modify the -variables used in the bake templates:: - - on('Bake.beforeRender', function (EventInterface $event) { - $view = $event->getSubject(); - - // Use $rows for the main data variable in indexes - if ($view->get('pluralName')) { - $view->set('pluralName', 'rows'); - } - if ($view->get('pluralVar')) { - $view->set('pluralVar', 'rows'); - } - - // Use $theOne for the main data variable in view/edit - if ($view->get('singularName')) { - $view->set('singularName', 'theOne'); - } - if ($view->get('singularVar')) { - $view->set('singularVar', 'theOne'); - } - }); - -You may also scope the ``Bake.beforeRender`` and ``Bake.afterRender`` events to -a specific generated file. For instance, if you want to add specific actions to -your UsersController when generating from a **Controller/controller.twig** file, -you can use the following event:: - - on( - 'Bake.beforeRender.Controller.controller', - function (EventInterface $event) { - $view = $event->getSubject(); - if ($view->get('name') === 'Users') { - // add the login and logout actions to the Users controller - $view->set('actions', [ - 'login', - 'logout', - 'index', - 'view', - 'add', - 'edit', - 'delete', - ]); - } - } - ); - -By scoping event listeners to specific bake templates, you can simplify your -bake related event logic and provide callbacks that are easier to test. - -Bake Template Syntax -==================== - -Bake template files use the `Twig `__ template syntax. - -So, for example, when baking a command like so: - -.. code-block:: bash - - bin/cake bake command Foo - -The template used (**vendor/cakephp/bake/templates/bake/Command/command.twig**) -looks like this:: - - Test->classSuffixes[$this->name()])) { - $this->Test->classSuffixes[$this->name()] = 'Foo'; - } - - $name = ucfirst($this->name()); - if (!isset($this->Test->classTypes[$name])) { - $this->Test->classTypes[$name] = 'Foo'; - } - - return parent::bakeTest($className); - } - -* The **class suffix** will be appened to the name provided in your ``bake`` - call. In the previous example, it would create a ``ExampleFooTest.php`` file. -* The **class type** will be the sub-namespace used that will lead to your - file (relative to the app or the plugin you are baking into). In the previous - example, it would create your test with the namespace ``App\Test\TestCase\Foo``. - -Configuring the BakeView class -============================== - -The bake commands use the ``BakeView`` class to render the templates. You can -access the instance by listening to the ``Bake.initialize`` event. For example, here's -how you can load your own helper so that it can be used in bake templates:: - - on( - 'Bake.initialize', - function ($event, $view) { - $view->loadHelper('Foo'); - } - ); - -.. meta:: - :title lang=en: Extending Bake - :keywords lang=en: command line interface, development, bake view, bake template syntax, twig, erb tags, percent tags diff --git a/app/vendor/cakephp/bake/docs/en/index.md b/app/vendor/cakephp/bake/docs/en/index.md new file mode 100644 index 000000000..4f8b7808b --- /dev/null +++ b/app/vendor/cakephp/bake/docs/en/index.md @@ -0,0 +1,25 @@ +# Bake Console + +CakePHP's bake console is another effort to get you up and running in CakePHP fast. +The bake console can create any of CakePHP's basic ingredients: models, +behaviors, views, helpers, controllers, components, test cases, fixtures, and plugins. +Bake can create far more than skeleton classes and is a natural next step once an application has been scaffolded. + +## Installation + +Before trying to use or extend Bake, make sure it is installed in your application. +Bake is provided as a plugin that you can install with Composer: + +```bash +composer require --dev cakephp/bake:"^3.0" +``` + +The above installs Bake as a development dependency, so it will not be installed during production deployments. + +When using Twig templates, make sure you are loading the `Cake/TwigView` plugin with its bootstrap. +You can also omit it completely, which makes the Bake plugin load it on demand. + +## Documentation Map + +- [Code Generation with Bake](/usage) covers running the console, listing commands, baking models and enums, and changing bake themes. +- [Extending Bake](/development) covers events, Twig templates, custom themes, application template overrides, and creating custom bake commands. diff --git a/app/vendor/cakephp/bake/docs/en/index.rst b/app/vendor/cakephp/bake/docs/en/index.rst deleted file mode 100644 index 38c7d2f89..000000000 --- a/app/vendor/cakephp/bake/docs/en/index.rst +++ /dev/null @@ -1,28 +0,0 @@ -Bake Console -############ - -CakePHP's bake console is another effort to get you up and running in CakePHP -– fast. The bake console can create any of CakePHP's basic ingredients: models, -behaviors, views, helpers, controllers, components, test cases, fixtures and plugins. -And we aren't just talking skeleton classes: Bake can create a fully functional -application in just a few minutes. In fact, Bake is a natural step to take once -an application has been scaffolded. - -Installation -============ - -Before trying to use or extend bake, make sure it is installed in your -application. Bake is provided as a plugin that you can install with Composer:: - - composer require --dev cakephp/bake:"^3.0" - -The above will install bake as a development dependency. This means that it will -not be installed when you do production deployments. - -When using the Twig templates make sure you are loading the -``Cake/TwigView`` plugin with its bootstrap. You can also omit it -completely which then makes Bake plugin load this plugin on demand. - -.. meta:: - :title lang=en: Bake Console - :keywords lang=en: command line interface,development,bake view, bake template syntax,erb tags,asp tags,percent tags diff --git a/app/vendor/cakephp/bake/docs/en/usage.md b/app/vendor/cakephp/bake/docs/en/usage.md new file mode 100644 index 000000000..76b226d9f --- /dev/null +++ b/app/vendor/cakephp/bake/docs/en/usage.md @@ -0,0 +1,124 @@ +# Code Generation with Bake + +The Bake console is run using the PHP CLI. +If you have problems running the script, ensure that: + +1. You have the PHP CLI installed and that it has the proper modules enabled, such as MySQL and `intl`. +2. If the database host is `localhost`, try `127.0.0.1` instead, as `localhost` can cause issues with PHP CLI. +3. Depending on how your computer is configured, you may need to set execute rights on the Cake shell script to call it using `bin/cake bake`. + +Before running Bake you should make sure you have at least one database connection configured. + +You can get the list of available bake commands by running `bin/cake bake --help`. +For Windows usage use `bin\cake bake --help`: + +```bash +$ bin/cake bake --help +Current Paths: + +* app: src/ +* root: /path/to/your/app/ +* core: /path/to/your/app/vendor/cakephp/cakephp/ + +Available Commands: + +Bake: +- bake all +- bake behavior +- bake cell +- bake command +- bake command_helper +- bake component +- bake controller +- bake controller all +- bake enum +- bake fixture +- bake fixture all +- bake form +- bake helper +- bake mailer +- bake middleware +- bake model +- bake model all +- bake plugin +- bake template +- bake template all +- bake test + +To run a command, type `cake command_name [args|options]` +To get help on a specific command, type `cake command_name --help` +``` + +## Bake Models + +Models are generically baked from existing database tables. +CakePHP conventions apply, so Bake detects relations based on `thing_id` foreign keys to `things` tables with their `id` primary keys. + +For non-conventional relations, you can use references in constraints or foreign key definitions for Bake to detect relations: + +```php +->addForeignKey('billing_country_id', 'countries') // defaults to `id` +->addForeignKey('shipping_country_id', 'countries', 'cid') +``` + +## Bake Enums + +You can use Bake to generate [backed enums](https://www.php.net/manual/en/language.enumerations.backed.php) for use in your models. +Enums are placed in `src/Model/Enum/` and implement `EnumLabelInterface`, which provides a `label()` method for human-readable display. + +To bake a string-backed enum: + +```bash +bin/cake bake enum ArticleStatus draft,published,archived +``` + +This generates `src/Model/Enum/ArticleStatus.php`: + +```php +namespace App\Model\Enum; + +use Cake\Database\Type\EnumLabelInterface; +use Cake\Utility\Inflector; + +enum ArticleStatus: string implements EnumLabelInterface +{ + case Draft = 'draft'; + case Published = 'published'; + case Archived = 'archived'; + + public function label(): string + { + return Inflector::humanize(Inflector::underscore($this->name)); + } +} +``` + +For int-backed enums, use the `-i` option and provide values with colons: + +```bash +bin/cake bake enum Priority low:1,medium:2,high:3 -i +``` + +This generates an int-backed enum: + +```php +enum Priority: int implements EnumLabelInterface +{ + case Low = 1; + case Medium = 2; + case High = 3; + + // ... +} +``` + +You can also bake enums into plugins: + +```bash +bin/cake bake enum MyPlugin.OrderStatus pending,processing,shipped +``` + +## Bake Themes + +The `theme` option is common to all bake commands and allows changing the bake template files used when baking. +To create your own templates, see [Creating a Bake Theme](/development#creating-a-bake-theme). diff --git a/app/vendor/cakephp/bake/docs/en/usage.rst b/app/vendor/cakephp/bake/docs/en/usage.rst deleted file mode 100644 index 8cf9da928..000000000 --- a/app/vendor/cakephp/bake/docs/en/usage.rst +++ /dev/null @@ -1,76 +0,0 @@ -Code Generation with Bake -######################### - -The Bake console is run using the PHP CLI (command line interface). -If you have problems running the script, ensure that: - -#. You have the PHP CLI installed and that it has the proper modules enabled - (eg: MySQL, intl). -#. Users also might have issues if the database host is 'localhost' and should - try '127.0.0.1' instead, as localhost can cause issues with PHP CLI. -#. Depending on how your computer is configured, you may have to set execute - rights on the cake bash script to call it using ``bin/cake bake``. - -Before running bake you should make sure you have at least one database -connection configured. - -You can get the list of available bake command by running ``bin/cake bake --help`` -(For Windows usage ``bin\cake bake --help``) :: - - $ bin/cake bake --help - Current Paths: - - * app: src/ - * root: /path/to/your/app/ - * core: /path/to/your/app/vendor/cakephp/cakephp/ - - Available Commands: - - Bake: - - bake all - - bake behavior - - bake cell - - bake command - - bake command_helper - - bake component - - bake controller - - bake controller all - - bake enum - - bake fixture - - bake fixture all - - bake form - - bake helper - - bake mailer - - bake middleware - - bake model - - bake model all - - bake plugin - - bake template - - bake template all - - bake test - - To run a command, type `cake command_name [args|options]` - To get help on a specific command, type `cake command_name --help` - -Bake Models -=========== - -Models are generically baked from the existing DB tables. -The conventions here apply, so it will detect relations based on ``thing_id`` foreign keys to ``things`` tables with their ``id`` primary keys. - -For non-conventional relations, you can use references in the constraints / foreign key definitions for Bake to detect the relations, e.g.:: - - ->addForeignKey('billing_country_id', 'countries') // defaults to `id` - ->addForeignKey('shipping_country_id', 'countries', 'cid') - - -Bake Themes -=========== - -The theme option is common to all bake commands, and allows changing the bake -template files used when baking. To create your own templates, see the -:ref:`bake theme creation documentation `. - -.. meta:: - :title lang=en: Code Generation with Bake - :keywords lang=en: command line interface,functional application,database,database configuration,bash script,basic ingredients,project,model,path path,code generation,scaffolding,windows users,configuration file,few minutes,config,view,models,running,mysql diff --git a/app/vendor/cakephp/bake/docs/es/conf.py b/app/vendor/cakephp/bake/docs/es/conf.py deleted file mode 100644 index 4691ece6a..000000000 --- a/app/vendor/cakephp/bake/docs/es/conf.py +++ /dev/null @@ -1,9 +0,0 @@ -import sys, os - -# Append the top level directory of the docs, so we can import from the config dir. -sys.path.insert(0, os.path.abspath('..')) - -# Pull in all the configuration options defined in the global config file.. -from config.all import * - -language = 'es' diff --git a/app/vendor/cakephp/bake/docs/es/contents.rst b/app/vendor/cakephp/bake/docs/es/contents.rst deleted file mode 100644 index 08c3e957c..000000000 --- a/app/vendor/cakephp/bake/docs/es/contents.rst +++ /dev/null @@ -1,7 +0,0 @@ -.. toctree:: - :maxdepth: 2 - :caption: CakePHP Bake - - /index - /usage - /development diff --git a/app/vendor/cakephp/bake/docs/es/development.md b/app/vendor/cakephp/bake/docs/es/development.md new file mode 100644 index 000000000..a6ecced69 --- /dev/null +++ b/app/vendor/cakephp/bake/docs/es/development.md @@ -0,0 +1,9 @@ +# Extending Bake + +::: info +La documentación no es compatible actualmente con el idioma español en esta página. + +Por favor, siéntase libre de enviarnos un pull request en [GitHub](https://github.com/cakephp/bake) o utilizar el botón de edición de la documentación para proponer cambios. + +Puede consultar la versión en inglés desde el selector de idioma superior para obtener información sobre este tema. +::: diff --git a/app/vendor/cakephp/bake/docs/es/development.rst b/app/vendor/cakephp/bake/docs/es/development.rst deleted file mode 100644 index 7f717d051..000000000 --- a/app/vendor/cakephp/bake/docs/es/development.rst +++ /dev/null @@ -1,17 +0,0 @@ -Extending Bake -############## - -.. note:: - La documentación no es compatible actualmente con el idioma español en esta página. - - Por favor, siéntase libre de enviarnos un pull request en - `Github `_ o utilizar el botón **Improve this Doc** para proponer directamente los cambios. - - Usted puede hacer referencia a la versión en Inglés en el menú de selección superior - para obtener información sobre el tema de esta página. - -.. _creating-a-bake-theme: - -.. meta:: - :title lang=es: Extending Bake - :keywords lang=es: command line interface,development,bake view, bake template syntax,erb tags,asp tags,percent tags diff --git a/app/vendor/cakephp/bake/docs/es/index.md b/app/vendor/cakephp/bake/docs/es/index.md new file mode 100644 index 000000000..6e7328672 --- /dev/null +++ b/app/vendor/cakephp/bake/docs/es/index.md @@ -0,0 +1,24 @@ +# Consola Bake + +La consola Bake de CakePHP permite preparar y ejecutar CakePHP rápidamente. +Puede crear muchos de los ingredientes básicos de CakePHP, como modelos, +behaviours, vistas, helpers, controladores, componentes, casos de prueba, +fixtures y plugins. +Bake puede generar mucho más que esqueletos de clases y es un paso natural después de crear la base de la aplicación. + +## Instalación + +Antes de intentar utilizar o extender Bake, asegúrate de que está instalado en tu aplicación. +Bake se distribuye como un plugin que puedes instalar con Composer: + +```bash +composer require --dev cakephp/bake:~1.0 +``` + +La instrucción anterior instalará Bake como una dependencia de desarrollo. +Esto significa que no será instalado cuando hagas despliegues en producción. + +## Mapa de documentación + +- [Crear código con Bake](/es/usage) cubre la ejecución del CLI, el listado de tareas y los temas de Bake. +- [Extending Bake](/es/development) enlaza al contenido disponible para ampliaciones y personalización. diff --git a/app/vendor/cakephp/bake/docs/es/index.rst b/app/vendor/cakephp/bake/docs/es/index.rst deleted file mode 100644 index 80f1fa654..000000000 --- a/app/vendor/cakephp/bake/docs/es/index.rst +++ /dev/null @@ -1,31 +0,0 @@ -Consola bake -############ - -La consola bake de CakePHP es otro esfuerzo para preparar y ejecutar CakePHP rápidamente. - -La consola bake puede crear cualquiera de los ingredientes básicos de CakePHP: -modelos, behaviours, vistas, helpers, controladores, componentes, casos de -prueba, fixtures y plugins. - -Y no hablamos sólo de esqueletos de clases: Bake puede crear una aplicación -totalmente funcional en solo un par de minutos. - -De hecho, Bake es un paso natural a dar una vez ha sido creado el esqueleto de -la aplicación. - -Instalación -=========== - -Antes de intentar utilizar o extender bake asegúrate de que está instalado en tu -aplicación. - -Bake está incluido como un plugin que puedes instalar con Composer:: - - composer require --dev cakephp/bake:~1.0 - -La instrucción anterior instalará bake como una dependencia de desarrollo. Esto -significa que no será instalado cuando hagas despliegues en producción. - -.. meta:: - :title lang=es: Consola Bake - :keywords lang=es: interfaz de línea de comando,desarrollo,bake vista, bake sintaxis plantilla,erb tags,asp tags,percent tags diff --git a/app/vendor/cakephp/bake/docs/es/usage.md b/app/vendor/cakephp/bake/docs/es/usage.md new file mode 100644 index 000000000..c1862006d --- /dev/null +++ b/app/vendor/cakephp/bake/docs/es/usage.md @@ -0,0 +1,100 @@ +# Crear código con Bake + +La consola de Cake se ejecuta usando PHP CLI. +Si tiene problemas para ejecutar el script, asegúrese de: + +1. Tener instalado PHP CLI y los módulos correspondientes habilitados, por ejemplo MySQL e `intl`. +2. Si el host de la base de datos es `localhost`, intentar la conexión con `127.0.0.1`, ya que en algunos casos PHP CLI tiene problemas al usar `localhost`. +3. Dependiendo de cómo esté configurado su equipo, la ejecución de `bin/cake bake` puede requerir permisos de ejecución. + +Antes de comenzar, asegúrese de disponer al menos de una conexión a base de datos configurada. + +Para comenzar con la ejecución del comando puede abrir la consola y ejecutar `Cake bake`. + +1. Ir a Inicio > Ejecutar. +2. Escribir `cmd` y presionar Enter. +3. Navegar hasta la carpeta de instalación de Cake. +4. Acceder a la carpeta `bin`. +5. Escribir `Cake bake`, lo cual deberá devolver un listado con las tareas disponibles. + +El resultado debería ser algo similar a lo siguiente: + +```bash +$ bin/cake bake + +Welcome to CakePHP v3.1.6 Console +--------------------------------------------------------------- +App : src +Path: /var/www/cakephp.dev/src/ +PHP: 5.5.8 +--------------------------------------------------------------- +The following commands can be used to generate skeleton code for your application. + +Available bake commands: + +- all +- behavior +- cell +- component +- controller +- fixture +- form +- helper +- mailer +- migration +- migration_snapshot +- model +- plugin +- template +- test + +By using 'cake bake [name]' you can invoke a specific bake task. +``` + +Puede obtener más información sobre lo que realiza cada tarea y sus opciones usando `--help`: + +```bash +$ bin/cake bake controller --help + +Welcome to CakePHP v3.1.6 Console +--------------------------------------------------------------- +App : src +Path: /var/www/cakephp.dev/src/ +--------------------------------------------------------------- +Bake a controller skeleton. + +Usage: +cake bake controller [subcommand] [options] [] + +Subcommands: + +all Bake all controllers with CRUD methods. + +To see help on a subcommand use `cake bake controller [subcommand] --help` + +Options: + +--help, -h Display this help. +--verbose, -v Enable verbose output. +--quiet, -q Enable quiet output. +--plugin, -p Plugin to bake into. +--force, -f Force overwriting existing files without prompting. +--connection, -c The datasource connection to get data from. + (default: default) +--theme, -t The theme to use when baking code. +--components The comma separated list of components to use. +--helpers The comma separated list of helpers to use. +--prefix The namespace/routing prefix to use. +--no-test Do not generate a test skeleton. +--no-actions Do not generate basic CRUD action methods. + +Arguments: + +name Name of the controller to bake. Can use Plugin.name to bake + controllers into plugins. (optional) +``` + +## Temas Bake / Templates + +La opción `theme` es genérica para todos los comandos Bake y permite cambiar los templates utilizados para generar los archivos finales. +Para crear sus propios templates, vea [Creating a Bake Theme](/es/development#creating-a-bake-theme). diff --git a/app/vendor/cakephp/bake/docs/es/usage.rst b/app/vendor/cakephp/bake/docs/es/usage.rst deleted file mode 100644 index 40a6e43a3..000000000 --- a/app/vendor/cakephp/bake/docs/es/usage.rst +++ /dev/null @@ -1,113 +0,0 @@ -Crear código con Bake -##################### - -La consola de CAKE se ejecuta usando PHP CLI (command line interface). -Si tiene problemas para ejecutar el script, asegurese de: - -#. Tener instalado el PHP CLI y que estén los módulos correspondientes - habilitados (ej: MySQL y intl). -#. Si el host de base de datos es 'localhost', intente realizar la conexión con - el ip '127.0.0.1'. En algunos casos PHP CLI tiene problemas al referenciar - por nombre de host (localhost). -#. Dependiendo de como esté configurado su equipo, la ejecución del comando - CAKE BAKE (cake bash script) puede requerir permisos de ejecución al - lanzar ``bin/cake bake``. - -Antes de comenzar la ejecución, asegúrese de disponer al menos de una conexión -a una base de datos configurada. - -Para comenzar con la ejecución del comando debe abrir la consola de windows -y ejecutar "Cake Bake" - -#. Ir a Inicio (Start) > Ejecutar (Run) -#. Escribir "cmd" y presionar 'Enter' -#. Navegar hasta llegar a la carpeta de instalación de cake -#. Acceder a la carpeta 'bin' -#. Escribir 'Cake bake' lo cual deberá devolver un listado con todas las - tareas/actividades disponibles. - -El resultado debería ser algo similar a lo siguiente:: - - $ bin/cake bake - - Welcome to CakePHP v3.1.6 Console - --------------------------------------------------------------- - App : src - Path: /var/www/cakephp.dev/src/ - PHP: 5.5.8 - --------------------------------------------------------------- - The following commands can be used to generate skeleton code for your application. - - Available bake commands: - - - all - - behavior - - cell - - component - - controller - - fixture - - form - - helper - - mailer - - migration - - migration_snapshot - - model - - plugin - - template - - test - - By using 'cake bake [name]' you can invoke a specific bake task. - -Puede obtener más información sobre lo que realiza cada una de las actividades -y sus opciones usando el parametro '--help' option:: - - $ bin/cake bake controller --help - - Welcome to CakePHP v3.1.6 Console - --------------------------------------------------------------- - App : src - Path: /var/www/cakephp.dev/src/ - --------------------------------------------------------------- - Bake a controller skeleton. - - Usage: - cake bake controller [subcommand] [options] [] - - Subcommands: - - all Bake all controllers with CRUD methods. - - To see help on a subcommand use `cake bake controller [subcommand] --help` - - Options: - - --help, -h Display this help. - --verbose, -v Enable verbose output. - --quiet, -q Enable quiet output. - --plugin, -p Plugin to bake into. - --force, -f Force overwriting existing files without prompting. - --connection, -c The datasource connection to get data from. - (default: default) - --theme, -t The theme to use when baking code. - --components The comma separated list of components to use. - --helpers The comma separated list of helpers to use. - --prefix The namespace/routing prefix to use. - --no-test Do not generate a test skeleton. - --no-actions Do not generate basic CRUD action methods. - - Arguments: - - name Name of the controller to bake. Can use Plugin.name to bake - controllers into plugins. (optional) - -Temas Bake / Templates -====================== - -La opción ``theme`` es genérica para todos los comandos bake y permite cambiar los -templates de bake utilizados para generar los archivos finales. Para crear sus -propios templates, ver :ref:`bake theme creation documentation -`. - -.. meta:: - :title lang=es: Crear código con Bake - :keywords lang=es: interfaz de línea de comando, aplicación funcional, base de datos, configuración de base de datos, bash script, ingredientes básicos, proyecto, modelo, path, crear código, generación de código, scaffolding, usuarios windows, archivo de configuración, pocos minutos, configurar, view, modelos, running, mysql diff --git a/app/vendor/cakephp/bake/docs/fr/conf.py b/app/vendor/cakephp/bake/docs/fr/conf.py deleted file mode 100644 index b02032efa..000000000 --- a/app/vendor/cakephp/bake/docs/fr/conf.py +++ /dev/null @@ -1,9 +0,0 @@ -import sys, os - -# Append the top level directory of the docs, so we can import from the config dir. -sys.path.insert(0, os.path.abspath('..')) - -# Pull in all the configuration options defined in the global config file.. -from config.all import * - -language = 'fr' diff --git a/app/vendor/cakephp/bake/docs/fr/contents.rst b/app/vendor/cakephp/bake/docs/fr/contents.rst deleted file mode 100644 index 08c3e957c..000000000 --- a/app/vendor/cakephp/bake/docs/fr/contents.rst +++ /dev/null @@ -1,7 +0,0 @@ -.. toctree:: - :maxdepth: 2 - :caption: CakePHP Bake - - /index - /usage - /development diff --git a/app/vendor/cakephp/bake/docs/fr/development.md b/app/vendor/cakephp/bake/docs/fr/development.md new file mode 100644 index 000000000..8d08ce39d --- /dev/null +++ b/app/vendor/cakephp/bake/docs/fr/development.md @@ -0,0 +1,297 @@ +# Étendre Bake + +Bake dispose d'une architecture extensible qui permet à votre application ou à vos plugins de modifier ou d'ajouter des fonctionnalités de base. +Bake utilise une classe de vue dédiée fondée sur le moteur de template [Twig](https://twig.symfony.com/). + +## Events de Bake + +Comme une classe de vue, `BakeView` envoie les mêmes events que toute autre classe de vue, ainsi qu'un event `initialize` supplémentaire. +Alors que les classes de vue standard utilisent le préfixe `View.`, `BakeView` utilise le préfixe `Bake.`. + +L'event `initialize` peut être utilisé pour faire des changements qui s'appliquent à toutes les sorties générées par Bake. +Par exemple, pour ajouter un helper : + +```php +on('Bake.initialize', function (EventInterface $event) { + $view = $event->getSubject(); + + // Dans mes templates de bake, permet l'utilisation du helper MySpecial + $view->loadHelper('MySpecial', ['some' => 'config']); + + // Et ajoute une variable $author pour qu'elle soit toujours disponible + $view->set('author', 'Andy'); +}); +``` + +Les events de Bake peuvent aussi servir à faire de petits changements dans les templates existants. +Par exemple, pour changer les noms de variables utilisés lors de la création de fichiers de controller et de template : + +```php +on('Bake.beforeRender', function (EventInterface $event) { + $view = $event->getSubject(); + + // Utilise $rows pour la principale variable de données dans les index + if ($view->get('pluralName')) { + $view->set('pluralName', 'rows'); + } + if ($view->get('pluralVar')) { + $view->set('pluralVar', 'rows'); + } + + // Utilise $theOne pour la principale variable de données dans les view/edit + if ($view->get('singularName')) { + $view->set('singularName', 'theOne'); + } + if ($view->get('singularVar')) { + $view->set('singularVar', 'theOne'); + } +}); +``` + +Vous pouvez aussi scoper les events `Bake.beforeRender` et `Bake.afterRender` à un fichier généré spécifique. +Par exemple, pour ajouter des actions à `UsersController` lors de la génération depuis `Controller/controller.twig` : + +```php +on( + 'Bake.beforeRender.Controller.controller', + function (EventInterface $event) { + $view = $event->getSubject(); + if ($view->get('name') === 'Users') { + // ajouter les actions login et logout au controller Users + $view->set('actions', [ + 'login', + 'logout', + 'index', + 'view', + 'add', + 'edit', + 'delete', + ]); + } + } +); +``` + +En scopant les écouteurs d'event vers des templates de Bake spécifiques, vous simplifiez la logique liée à Bake et obtenez des callbacks plus faciles à tester. + +## Syntaxe de template de Bake + +Les fichiers de template de Bake utilisent la syntaxe [Twig](https://twig.symfony.com/). + +Par exemple, si vous générez une commande comme ceci : + +```bash +bin/cake bake command Foo +``` + +Le template utilisé dans `vendor/cakephp/bake/templates/bake/Command/command.twig` ressemble à ceci : + +```php +Test->classSuffixes[$this->name()])) { + $this->Test->classSuffixes[$this->name()] = 'Foo'; + } + + $name = ucfirst($this->name()); + if (!isset($this->Test->classTypes[$name])) { + $this->Test->classTypes[$name] = 'Foo'; + } + + return parent::bakeTest($className); +} +``` + +- Le **suffixe de classe** sera ajouté après le nom passé à `bake`. Dans l'exemple ci-dessus, cela créerait `ExempleFooTest.php`. +- Le **type de classe** sera le sous-namespace utilisé pour atteindre le fichier relatif à l'application ou au plugin. Dans l'exemple ci-dessus, cela créerait le namespace `App\Test\TestCase\Foo`. diff --git a/app/vendor/cakephp/bake/docs/fr/development.rst b/app/vendor/cakephp/bake/docs/fr/development.rst deleted file mode 100644 index 697a6301d..000000000 --- a/app/vendor/cakephp/bake/docs/fr/development.rst +++ /dev/null @@ -1,347 +0,0 @@ -Etendre Bake -############ - -Bake dispose d'une architecture extensible qui permet à votre application ou -à vos plugins de modifier ou ajouter la fonctionnalité de base. Bake utilise une -classe de vue dédiée qui utilise le moteur de template -`Twig `_. - -Events de Bake -============== - -Comme une classe de vue, ``BakeView`` envoie les mêmes events que toute autre -classe de vue, ainsi qu'un event initialize supplémentaire. Cependant, -alors que les classes de vue standard utilisent le préfixe d'event -"View.", ``BakeView`` utilise le préfixe d'event "Bake.". - -L'event initialize peut être utilisé pour faire des changements qui -s'appliquent à toutes les sorties fabriquées avec bake, par exemple pour ajouter -un autre helper à la classe de vue bake, cet event peut être utilisé:: - - on('Bake.initialize', function (EventInterface $event) { - $view = $event->getSubject(); - - // Dans mes templates de bake, permet l'utilisation du helper MySpecial - $view->loadHelper('MySpecial', ['some' => 'config']); - - // Et ajoute une variable $author pour qu'elle soit toujours disponible - $view->set('author', 'Andy'); - - }); - -Les events de bake peuvent être pratiques pour faire de petits changements dans -les templates existants. Par exemple, pour changer les noms de variables -utilisés lors de la création avec bake de fichiers de controller/template, on -pourra utiliser une fonction qui écoute ``Bake.beforeRender`` pour modifier les -variables utilisées dans les templates de bake:: - - on('Bake.beforeRender', function (EventInterface $event) { - $view = $event->getSubject(); - - // Utilise $rows pour la principale variable de données dans les index - if ($view->get('pluralName')) { - $view->set('pluralName', 'rows'); - } - if ($view->get('pluralVar')) { - $view->set('pluralVar', 'rows'); - } - - // Utilise $theOne pour la principale variable de données dans les view/edit - if ($view->get('singularName')) { - $view->set('singularName', 'theOne'); - } - if ($view->get('singularVar')) { - $view->set('singularVar', 'theOne'); - } - - }); - -Vous pouvez aussi scoper les events ``Bake.beforeRender`` et -``Bake.afterRender`` dans un fichier généré spécifique. Par exemple, si vous -souhaitez ajouter des actions spécifiques à votre UsersController quand vous le -générez à partir d'un fichier **Controller/controller.twig**, vous pouvez -utiliser l'event suivant:: - - on( - 'Bake.beforeRender.Controller.controller', - function (EventInterface $event) { - $view = $event->getSubject(); - if ($view->get('name') === 'Users') { - // ajouter les actions login et logout au controller Users - $view->set('actions', [ - 'login', - 'logout', - 'index', - 'view', - 'add', - 'edit', - 'delete' - ]; - } - } - ); - -En scopant les écouteurs d'event vers des templates de bake spécifiques, vous -pouvez simplifier votre logique d'event liée à bake et fournir des callbacks -qui sont plus faciles à tester. - -Syntaxe de Template de Bake -=========================== - -Les fichiers de template de Bake utilisent la syntaxe de template de -`Twig `__. - -Ainsi, par exemple, pour créer avec bake un shell comme ceci: - -.. code-block:: bash - - bin/cake bake command Foo - -Le template utilisé -(***vendor/cakephp/bake/templates/bake/Command/command.twig**) -ressemble à ceci:: - - declare(strict_types=1); - - namespace {{ namespace }}\Command; - - use Cake\Command\Command; - use Cake\Console\Arguments; - use Cake\Console\ConsoleIo; - use Cake\Console\ConsoleOptionParser; - - /** - * {{ name }} command. - */ - class {{ name }}Command extends Command - { - /** - * Méthode hook pour définir le parseur d'option de cette commande. - * - * @see https://book.cakephp.org/5/fr/console-commands/commands.html#defining-arguments-and-options - * @param \Cake\Console\ConsoleOptionParser $parser Le parseur à définir - * @return \Cake\Console\ConsoleOptionParser Le parseur construit. - */ - public function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser - { - $parser = parent::buildOptionParser($parser); - - return $parser; - } - - /** - * Implémentez cette méthode avec la logique de votre commande. - * - * @param \Cake\Console\Arguments $args Les arguments de la commande. - * @param \Cake\Console\ConsoleIo $io La console il - * @return int|null|void Le code de sortie ou null pour un succès - */ - public function execute(Arguments $args, ConsoleIo $io) - { - } - } - -Et la classe résultante construite avec bake (**src/Command/FooCommand.php**) -ressemble à ceci:: - - Test->classSuffixes[$this->name()])) { - $this->Test->classSuffixes[$this->name()] = 'Foo'; - } - - $name = ucfirst($this->name()); - if (!isset($this->Test->classTypes[$name])) { - $this->Test->classTypes[$name] = 'Foo'; - } - - return parent::bakeTest($className); - } - -* Le **suffixe de classe** sera ajouté après le nom passé à ``bake``. Dans le - cadre de l'exemple ci-dessus, cela créerait un fichier ``ExempleFooTest.php``. -* Le **type de classe** sera le sous-namespace utilisé pour atteindre votre - fichier (relatif à l'application ou au plugin dans lequel vous faites le - ``bake``). Dans le cadre de l'exemple ci-dessus, cela créerait le test avec le - namespace ``App\Test\TestCase\Foo``. - -.. meta:: - :title lang=fr: Etendre Bake - :keywords lang=fr: interface ligne de commande,development,bake view, bake template syntax,erb tags,asp tags,percent tags diff --git a/app/vendor/cakephp/bake/docs/fr/index.md b/app/vendor/cakephp/bake/docs/fr/index.md new file mode 100644 index 000000000..07930646f --- /dev/null +++ b/app/vendor/cakephp/bake/docs/fr/index.md @@ -0,0 +1,25 @@ +# Console Bake + +La console Bake de CakePHP permet de lancer rapidement une application CakePHP. +Elle peut créer les éléments de base de CakePHP, comme les models, behaviors, views, +helpers, controllers, components, cas de tests, fixtures et plugins. +Bake peut aller bien au-delà des classes squelettes et constitue une étape naturelle après un premier prototypage. + +## Installation + +Avant d'utiliser ou d'étendre Bake, assurez-vous qu'il est installé dans votre application. +Bake est disponible sous forme de plugin que vous pouvez installer avec Composer : + +```bash +composer require --dev cakephp/bake:"^2.0" +``` + +Cela installe Bake comme dépendance de développement, et il ne sera donc pas déployé en production. + +Quand vous utilisez les templates Twig, vérifiez que vous chargez le plugin `Cake/TwigView` avec son bootstrap. +Vous pouvez aussi l'omettre complètement, ce qui fera charger ce plugin à la demande par Bake. + +## Plan de la documentation + +- [Génération de code avec Bake](/fr/usage) couvre l'exécution du CLI, les commandes disponibles et les thèmes Bake. +- [Étendre Bake](/fr/development) couvre les events, les templates Twig, les thèmes et les commandes Bake personnalisées. diff --git a/app/vendor/cakephp/bake/docs/fr/index.rst b/app/vendor/cakephp/bake/docs/fr/index.rst deleted file mode 100644 index 80e39229b..000000000 --- a/app/vendor/cakephp/bake/docs/fr/index.rst +++ /dev/null @@ -1,30 +0,0 @@ -Console Bake -############ - -La console Bake de CakePHP est un autre outil permettant de réaliser son -application rapidement. La console Bake peut créer chacun des ingrédients -basiques de CakePHP : models, behaviors, views, helpers, controllers, -components, cas de tests, fixtures et plugins. Et nous ne parlons pas -seulement des squelettes de classes : Bake peut créer une application -fonctionnelle complète en seulement quelques minutes. En réalité, Bake est une -étape naturelle à suivre une fois qu'une application a été prototypée. - -Installation -============ - -Avant d'essayer d'utiliser ou d'étendre bake, assurez-vous qu'il est installé -dans votre application. Bake est disponible en tant que plugin que vous pouvez -installer avec Composer:: - - composer require --dev cakephp/bake:"^2.0" - -Ceci va installer bake en tant que dépendance de développement. Cela signifie -qu'il ne sera pas installé lors d'un déploiement en production. - -Quand vous utilisez les templates Twig, vérifiez que vous chargez le plugin -``Cake/TwigView`` avec son bootstrap. Vous pouvez aussi l'omettre complètement, -ce qui fait que Bake chargera ce plugin à la demande. - -.. meta:: - :title lang=fr: Console Bake - :keywords lang=fr: interface ligne de commande,development,bake view, bake template syntaxe,erb tags,asp tags,percent tags diff --git a/app/vendor/cakephp/bake/docs/fr/usage.md b/app/vendor/cakephp/bake/docs/fr/usage.md new file mode 100644 index 000000000..3515cd8bf --- /dev/null +++ b/app/vendor/cakephp/bake/docs/fr/usage.md @@ -0,0 +1,53 @@ +# Génération de code avec Bake + +La console Bake est exécutée avec le CLI PHP. +Si vous avez des problèmes en exécutant ce script, vérifiez que : + +1. Le CLI PHP est installé et qu'il a les bons modules activés, par exemple MySQL et `intl`. +2. Si l'hôte de la base de données est `localhost`, essayez `127.0.0.1`, car `localhost` peut causer des problèmes avec PHP CLI. +3. Selon la configuration de votre ordinateur, vous devrez peut-être donner les permissions d'exécution au script `cake` pour autoriser le lancement via `bin/cake bake`. + +Avant de lancer Bake, vous devez vous assurer qu'au moins une connexion de base de données est configurée. + +Vous pouvez voir la liste des commandes disponibles en lançant `bin/cake bake --help`. +Pour Windows, utilisez `bin\cake bake --help` : + +```bash +$ bin/cake bake --help +Current Paths: + +* app: src/ +* root: /path/to/your/app/ +* core: /path/to/your/app/vendor/cakephp/cakephp/ + +Available Commands: + +Bake: +- bake all +- bake behavior +- bake cell +- bake command +- bake component +- bake controller +- bake controller all +- bake fixture +- bake fixture all +- bake form +- bake helper +- bake mailer +- bake middleware +- bake model +- bake model all +- bake plugin +- bake template +- bake template all +- bake test + +To run a command, type `cake command_name [args|options]` +To get help on a specific command, type `cake command_name --help` +``` + +## Thèmes de Bake + +L'option `theme` est commune à toutes les commandes Bake et permet de changer les fichiers de template utilisés lors de la génération. +Pour créer vos propres templates, référez-vous à [Créer un thème de Bake](/fr/development#creer-un-theme-de-bake). diff --git a/app/vendor/cakephp/bake/docs/fr/usage.rst b/app/vendor/cakephp/bake/docs/fr/usage.rst deleted file mode 100644 index 2a6e3d482..000000000 --- a/app/vendor/cakephp/bake/docs/fr/usage.rst +++ /dev/null @@ -1,65 +0,0 @@ -Génération de Code avec Bake -############################ - -La console Bake est exécutée en utilisant le CLI PHP -(Interface de Ligne de Commande). Si vous avez des problèmes en exécutant ce -script, vérifiez que : - -#. le CLI PHP est installé et qu'il a les bons modules activés (ex: MySQL, intl). -#. Certains utilisateurs peuvent aussi rencontrer des problèmes si l'hôte de la - base de données est 'localhost' et devront essayer '127.0.0.1' à la place, - car localhost peut causer des problèmes avec PHP CLI. -#. Selon la configuration de votre ordinateur, vous devrez peut-être donner les - permissions d'exécution sur le script bash cake pour autoriser le lancement - par ``bin/cake bake``. - -Avant de lancer bake, vous devrez vous assurer que vous avez au moins une -connexion de base de données configurée. - -Vous pouvez voir la liste des commandes bake disponibles en lançant -``bin/cake bake --help`` (pour Windows ``bin\cake bake --help``) :: - - $ bin/cake bake --help - Current Paths: - - * app: src/ - * root: /path/to/your/app/ - * core: /path/to/your/app/vendor/cakephp/cakephp/ - - Available Commands: - - Bake: - - bake all - - bake behavior - - bake cell - - bake command - - bake component - - bake controller - - bake controller all - - bake fixture - - bake fixture all - - bake form - - bake helper - - bake mailer - - bake middleware - - bake model - - bake model all - - bake plugin - - bake template - - bake template all - - bake test - - To run a command, type `cake command_name [args|options]` - To get help on a specific command, type `cake command_name --help` - -Thèmes de Bake -============== - -L'option theme est commune à toutes les commandes de bake, et permet de changer -les fichiers de template utilisés lors de la création avec bake. Pour créer vos -propres templates, référez-vous :ref:`à la documentation sur la création de -theme bake `. - -.. meta:: - :title lang=fr: Génération de Code avec Bake - :keywords lang=fr: interface ligne de commande,application fonctionnelle,base de données,configuration base de données,bash script,ingredients basiques,project,model,path path,génération de code,scaffolding,windows users,configuration file,few minutes,config,view,models,running,mysql diff --git a/app/vendor/cakephp/bake/docs/ja/conf.py b/app/vendor/cakephp/bake/docs/ja/conf.py deleted file mode 100644 index 5871da648..000000000 --- a/app/vendor/cakephp/bake/docs/ja/conf.py +++ /dev/null @@ -1,9 +0,0 @@ -import sys, os - -# Append the top level directory of the docs, so we can import from the config dir. -sys.path.insert(0, os.path.abspath('..')) - -# Pull in all the configuration options defined in the global config file.. -from config.all import * - -language = 'ja' diff --git a/app/vendor/cakephp/bake/docs/ja/contents.rst b/app/vendor/cakephp/bake/docs/ja/contents.rst deleted file mode 100644 index 08c3e957c..000000000 --- a/app/vendor/cakephp/bake/docs/ja/contents.rst +++ /dev/null @@ -1,7 +0,0 @@ -.. toctree:: - :maxdepth: 2 - :caption: CakePHP Bake - - /index - /usage - /development diff --git a/app/vendor/cakephp/bake/docs/ja/development.md b/app/vendor/cakephp/bake/docs/ja/development.md new file mode 100644 index 000000000..867c3d313 --- /dev/null +++ b/app/vendor/cakephp/bake/docs/ja/development.md @@ -0,0 +1,315 @@ +# Bake の拡張 + +Bake は、アプリケーションやプラグインが基本機能を変更または追加できる拡張可能なアーキテクチャーを備えています。 +Bake は [Twig](https://twig.symfony.com/) テンプレートエンジンを使う専用のビュークラスを利用します。 + +## Bake イベント + +`BakeView` は、他のビュークラスと同様のイベントに加え、特別な initialize イベントを発します。 +標準ビュークラスはイベントプレフィックス `View.` を使いますが、`BakeView` は `Bake.` を使います。 + +initialize イベントは、すべての Bake 出力に対する変更に使用できます。 +たとえば、Bake ビュークラスに別のヘルパーを追加するには次のようにします。 + +```php +on('Bake.initialize', function (EventInterface $event) { + $view = $event->getSubject(); + + // bake テンプレートの中で MySpecial ヘルパーの使用を可能にします + $view->loadHelper('MySpecial', ['some' => 'config']); + + // そして、$author 変数を利用可能にするために追加 + $view->set('author', 'Andy'); +}); +``` + +別のプラグインの中から Bake を変更したい場合は、プラグインの `config/bootstrap.php` に Bake イベントを置くのが有効です。 + +Bake イベントは、既存テンプレートへの小さな変更にも役立ちます。 +たとえば、コントローラーやテンプレートファイルを Bake するときに使う変数名を変更するには `Bake.beforeRender` を利用します。 + +```php +on('Bake.beforeRender', function (EventInterface $event) { + $view = $event->getSubject(); + + // indexes の中のメインデータ変数に $rows を使用 + if ($view->get('pluralName')) { + $view->set('pluralName', 'rows'); + } + if ($view->get('pluralVar')) { + $view->set('pluralVar', 'rows'); + } + + // view と edit の中のメインデータ変数に $theOne を使用 + if ($view->get('singularName')) { + $view->set('singularName', 'theOne'); + } + if ($view->get('singularVar')) { + $view->set('singularVar', 'theOne'); + } +}); +``` + +`Bake.beforeRender` と `Bake.afterRender` を特定の生成ファイルに限定することもできます。 +たとえば `Controller/controller.twig` から生成する際に `UsersController` に特定アクションを追加したい場合は次のイベントを使用できます。 + +```php +on( + 'Bake.beforeRender.Controller.controller', + function (EventInterface $event) { + $view = $event->getSubject(); + if ($view->get('name') === 'Users') { + // Users コントローラーに login と logout を追加 + $view->set('actions', [ + 'login', + 'logout', + 'index', + 'view', + 'add', + 'edit', + 'delete', + ]); + } + } +); +``` + +特定の Bake テンプレートにイベントリスナーを絞ることで、Bake 関連のイベントロジックを単純にし、テストしやすいコールバックを提供できます。 + +## Bake テンプレート構文 + +Bake テンプレートファイルは [Twig](https://twig.symfony.com/doc/2.x/) 構文を使用します。 + +たとえば、次のようにコマンドを Bake した場合: + +```bash +bin/cake bake command Foo +``` + +`vendor/cakephp/bake/templates/bake/Command/command.twig` のテンプレートは次のようになります。 + +```php +Test->classSuffixes[$this->name()])) { + $this->Test->classSuffixes[$this->name()] = 'Foo'; + } + + $name = ucfirst($this->name()); + if (!isset($this->Test->classTypes[$name])) { + $this->Test->classTypes[$name] = 'Foo'; + } + + return parent::bakeTest($className); +} +``` + +- **class suffix** は `bake` 呼び出しで与えた名前に追加されます。前の例では `ExampleFooTest.php` を作成します。 +- **class type** はファイルに到達するためのサブ名前空間です。前の例では `App\Test\TestCase\Foo` という名前空間でテストを作成します。 + +## BakeView クラスの設定 + +Bake コマンドは、テンプレートをレンダリングするために `BakeView` クラスを使います。 +`Bake.initialize` イベントを監視するとインスタンスにアクセスできます。 + +```php +on( + 'Bake.initialize', + function ($event, $view) { + $view->loadHelper('Foo'); + } +); +``` diff --git a/app/vendor/cakephp/bake/docs/ja/development.rst b/app/vendor/cakephp/bake/docs/ja/development.rst deleted file mode 100644 index 070e43a5c..000000000 --- a/app/vendor/cakephp/bake/docs/ja/development.rst +++ /dev/null @@ -1,296 +0,0 @@ -Bake の拡張 -########### - -Bake は、アプリケーションやプラグインが基本機能に対して変更または追加を可能にする -拡張可能なアーキテクチャーを備えています。Bake は、 `Twig `_ -テンプレートエンジンを使用したビュークラスを利用します。 - -Bake イベント -============= - -``BakeView`` は、ビュークラスとして、他のビュークラスと同様のイベントに加え、 -1つの特別な初期化 (initialize) イベントを発します。しかし、一方で標準ビュークラスは、 -イベントのプレフィックス "View." を使用しますが、 ``BakeView`` は、 -イベントのプレフィックス "Bake." を使用しています。 - -初期化イベントは、すべての bake の出力に対して変更を加えるために使用できます。 -例えば、bake ビュークラスに他のヘルパーを追加するためにこのイベントは使用されます。 :: - - on('Bake.initialize', function (Event $event) { - $view = $event->getSubject(); - - // bake テンプレートの中で MySpecial ヘルパーの使用を可能にします - $view->loadHelper('MySpecial', ['some' => 'config']); - - // そして、$author 変数を利用可能にするために追加 - $view->set('author', 'Andy'); - - }); - -別のプラグインの中から bake を変更したい場合は、プラグインの ``config/bootstrap.php`` -ファイルでプラグインの Bake イベントを置くことは良いアイデアです。 - -Bake イベントは、既存のテンプレートに小さな変更を行うための便利なことができます。 -例えば、コントローラーやテンプレートファイルを bake する際に使用される変数名を -変更するために、bake テンプレートで使用される変数を変更するために -``Bake.beforeRender`` で呼び出される関数を使用することができます。 :: - - on('Bake.beforeRender', function (Event $event) { - $view = $event->getSubject(); - - // indexes の中のメインデータ変数に $rows を使用 - if ($view->get('pluralName')) { - $view->set('pluralName', 'rows'); - } - if ($view->get('pluralVar')) { - $view->set('pluralVar', 'rows'); - } - - // view と edit の中のメインデータ変数に $theOne を使用 - if ($view->get('singularName')) { - $view->set('singularName', 'theOne'); - } - if ($view->get('singularVar')) { - $view->set('singularVar', 'theOne'); - } - - }); - -特定の生成されたファイルへの ``Bake.beforeRender`` と ``Bake.afterRender`` -イベントを指定することもあるでしょう。例えば、 -**Controller/controller.twig** ファイルから生成する際、 UsersController -に特定のアクションを追加したい場合、以下のイベントを使用することができます。 :: - - on( - 'Bake.beforeRender.Controller.controller', - function (Event $event) { - $view = $event->getSubject(); - if ($view->viewVars['name'] == 'Users') { - // Users コントローラーに login と logout を追加 - $view->viewVars['actions'] = [ - 'login', - 'logout', - 'index', - 'view', - 'add', - 'edit', - 'delete' - ]; - } - } - ); - -特定の bake テンプレートのためのイベントリスナーを指定することによって、 -bake 関連のイベント・ロジックを簡素化し、テストするのが容易であるコールバックを -提供することができます。 - -Bake テンプレート構文 -===================== - -Bake テンプレートファイルは、 `Twig `__ -テンプレート構文を使用します。 - -だから、例えば、以下のようにシェルを bake した場合: - -.. code-block:: bash - - bin/cake bake shell Foo - -(**vendor/cakephp/bake/src/Template/Bake/Shell/shell.twig**) を使用した -テンプレートは、以下のようになります。 :: - - `` Bake テンプレートの PHP 終了タグ - * ``<%=`` Bake テンプレートの PHP ショートエコータグ - * ``<%-`` Bake テンプレートの PHP 開始タグ、タグの前に、先頭の空白を除去 - * ``-%>`` Bake テンプレートの PHP 終了タグ、タグの後に末尾の空白を除去 - -.. _creating-a-bake-theme: - -Bake テーマの作成 -================= - -"bake" コマンドによって生成された出力を変更したい場合、bake が使用するテンプレートの -一部または全部を置き換えることができる、独自の bake の「テーマ」を作成することができます。 -これを行うための最善の方法は、次のとおりです。 - -#. 新しいプラグインを bake します。プラグインの名前は bake の「テーマ」名になります。 -#. 新しいディレクトリー **plugins/[name]/src/Template/Bake/Template/** を作成します。 -#. **vendor/cakephp/bake/src/Template/Bake/Template** から上書きしたい - テンプレートをあなたのプラグインの中の適切なファイルにコピーしてください。 -#. bake を実行するときに、必要であれば、 bake のテーマを指定するための ``--theme`` - オプションを使用してください。各呼び出しでこのオプションを指定しなくても済むように、 - カスタムテーマをデフォルトテーマとして使用するように設定することもできます。 :: - - Test->classSuffixes[$this->name()])) { - $this->Test->classSuffixes[$this->name()] = 'Foo'; - } - - $name = ucfirst($this->name()); - if (!isset($this->Test->classTypes[$name])) { - $this->Test->classTypes[$name] = 'Foo'; - } - - return parent::bakeTest($className); - } - -* **class suffix** は ``bake`` 呼び出しで与えられた名前に追加します。前の例では、 - ``ExampleFooTest.php`` ファイルを作成します。 -* **class type** は、(あなたが bake するアプリやプラグインに関連する) - あなたのファイルを導くために使用されるサブ名前空間です。 - 前の例では、名前空間 ``App\Test\TestCase\Foo`` でテストを作成します。 - -.. meta:: - :title lang=ja: Bake の拡張 - :keywords lang=ja: command line interface,development,bake view, bake template syntax,twig,erb tags,percent tags diff --git a/app/vendor/cakephp/bake/docs/ja/index.md b/app/vendor/cakephp/bake/docs/ja/index.md new file mode 100644 index 000000000..bad397c78 --- /dev/null +++ b/app/vendor/cakephp/bake/docs/ja/index.md @@ -0,0 +1,26 @@ +# Bake コンソール + +CakePHP の Bake コンソールは、CakePHP を素早く使い始めるためのツールです。 +Bake コンソールは、モデル、ビヘイビアー、ビュー、ヘルパー、コントローラー、コンポーネント、 +テストケース、フィクスチャー、プラグインなど、CakePHP の基本的な素材を作成できます。 +単なるスケルトンクラスだけではなく、数分で完全に機能するアプリケーションを作成できます。 + +## インストール手順 + +Bake を使用したり拡張する前に、アプリケーションに Bake をインストールしてください。 +Bake は Composer を使ってインストールするプラグインとして提供されています。 + +```bash +composer require --dev cakephp/bake:"^3.0" +``` + +このコマンドは、Bake を開発用依存パッケージとしてインストールします。 +そのため、本番環境へのデプロイ時にはインストールされません。 + +Twig テンプレートを使用する場合、`Cake/TwigView` プラグインをブートストラップとともに読み込んでいることを確認してください。 +完全に省略し、Bake プラグインに必要時だけ読み込ませることもできます。 + +## ドキュメント一覧 + +- [Bake でコード生成](/ja/usage) では CLI の実行、利用可能なコマンド、モデル生成、テーマについて説明します。 +- [Bake の拡張](/ja/development) ではイベント、Twig テンプレート、テーマ、カスタム Bake コマンドについて説明します。 diff --git a/app/vendor/cakephp/bake/docs/ja/index.rst b/app/vendor/cakephp/bake/docs/ja/index.rst deleted file mode 100644 index a4e503963..000000000 --- a/app/vendor/cakephp/bake/docs/ja/index.rst +++ /dev/null @@ -1,28 +0,0 @@ -Bake コンソール -################ - -CakePHP の bake コンソールは、迅速に CakePHP を動作させるまでを支援します。 -bake コンソールは、CakePHP の基本的な素材(モデル、ビヘイビアー、ビュー、ヘルパー、 -コントローラー、コンポーネント、テストケース、フィクスチャー、プラグイン)を作成できます。 -その為のスケルトンクラスについては、ここでは省略しますが、 -bake は数分で完全に機能するアプリケーションを作成できます。 -要するに、bake は足場の組まれたアプリケーションをいっぺんに手に入れるためにうってつけの方法です。 - -インストール手順 -================= - -bake を使用したり拡張する前に、アプリケーションに bake をインストールしておいてください。 -bake は Composer を使ってインストールするプラグインとして提供されています。 :: - - composer require --dev cakephp/bake:"^2.0" - -上記のコマンドは、bake を開発環境で使用するパッケージとしてインストールします。 -この入れ方の場合、本番環境としてデプロイする際には、 bake はインストールされません。 - -Twig テンプレートを使用する場合、 ``Cake/TwigView`` プラグインをブートストラップとともに -読み込んでいることを確認してください。それを完全に省略して、 -Bake プラグインにこのプラグインを読み込ませることもできます。 - -.. meta:: - :title lang=ja: Bakeコンソール - :keywords lang=ja: コマンドライン,CLI,development,bake view, bake template syntax,erb tags,asp tags,percent tags diff --git a/app/vendor/cakephp/bake/docs/ja/usage.md b/app/vendor/cakephp/bake/docs/ja/usage.md new file mode 100644 index 000000000..09f3ec27d --- /dev/null +++ b/app/vendor/cakephp/bake/docs/ja/usage.md @@ -0,0 +1,68 @@ +# Bake でコード生成 + +Bake コンソールは PHP CLI で実行します。 +スクリプトの実行に問題がある場合は、次を確認してください。 + +1. PHP CLI がインストールされていて、必要なモジュールが有効になっていること。例: MySQL、`intl`。 +2. データベースホストが `localhost` の場合は、代わりに `127.0.0.1` を試すこと。PHP CLI で問題になることがあります。 +3. コンピューターの設定によっては、`bin/cake bake` で使用する Cake スクリプトに実行権限を付ける必要があること。 + +Bake を実行する前に、少なくとも 1 つのデータベース接続が設定されていることを確認してください。 + +`bin/cake bake --help` を実行すると、利用可能な Bake コマンドを表示できます。 +Windows では `bin\cake bake --help` を使用します。 + +```bash +$ bin/cake bake --help +Current Paths: + +* app: src/ +* root: /path/to/your/app/ +* core: /path/to/your/app/vendor/cakephp/cakephp/ + +Available Commands: + +Bake: +- bake all +- bake behavior +- bake cell +- bake command +- bake command_helper +- bake component +- bake controller +- bake controller all +- bake enum +- bake fixture +- bake fixture all +- bake form +- bake helper +- bake mailer +- bake middleware +- bake model +- bake model all +- bake plugin +- bake template +- bake template all +- bake test + +To run a command, type `cake command_name [args|options]` +To get help on a specific command, type `cake command_name --help` +``` + +## Bake モデル + +モデルは既存のデータベーステーブルから生成されます。 +規約が適用されるため、外部キー `thing_id` とテーブル `things` の主キー `id` に基づいてリレーションが検出されます。 + +規約から外れたリレーションの場合は、制約や外部キー定義の参照を使って Bake にリレーションを検出させることができます。 + +```php +->addForeignKey('billing_country_id', 'countries') // defaults to `id` +->addForeignKey('shipping_country_id', 'countries', 'cid') +``` + +## Bake テーマ + +テーマオプションはすべての Bake コマンドで共通です。 +Bake 時に使用するテンプレートファイルを変更できます。 +テーマを作るには、[Bake テーマの作成](/ja/development#bake-テーマの作成) を参照してください。 diff --git a/app/vendor/cakephp/bake/docs/ja/usage.rst b/app/vendor/cakephp/bake/docs/ja/usage.rst deleted file mode 100644 index 9912102ef..000000000 --- a/app/vendor/cakephp/bake/docs/ja/usage.rst +++ /dev/null @@ -1,100 +0,0 @@ -Bake でコード生成 -################## - -cake コンソールは、 PHP CLI (command line interface) で実行します。 -もしスクリプトの実行に問題があるなら、以下を満たしてください。 - -#. PHP CLI がインストールされているか適切なモジュールが有効か確認してください (例:MySQL, intl)。 -#. データベースのホストが 'localhost' で問題があるなら、代わりに '127.0.0.1' を使って下さい。 - PHP CLI でこの問題がおこる可能性があります。 -#. 使っているコンピューターの設定に応じて、 ``bin/cake bake`` で使用する cake bash スクリプトの - 実行権限を設定する必要があります。 - -bake を実行する前にデータベースとの接続を確認しましょう。 - -``bin/cake bake`` を引数無しで実行すると可能なタスクを表示できます。 - -Windows システムの場合、 ``bin\cake bake`` を試してみてください。 - -それは以下のように表示されます。 :: - - $ bin/cake bake - - Welcome to CakePHP v3.1.6 Console - --------------------------------------------------------------- - App : src - Path: /var/www/cakephp.dev/src/ - PHP: 5.5.8 - --------------------------------------------------------------- - The following commands can be used to generate skeleton code for your application. - - Available bake commands: - - - all - - behavior - - cell - - component - - controller - - fixture - - form - - helper - - mailer - - migration - - migration_snapshot - - model - - plugin - - template - - test - - By using `cake bake [name]` you can invoke a specific bake task. - -より詳しい各コマンドの情報を得るには、 ``--help`` オプションをつけ実行してください。 :: - - $ bin/cake bake controller --help - - Welcome to CakePHP v3.1.6 Console - --------------------------------------------------------------- - App : src - Path: /var/www/cakephp.dev/src/ - --------------------------------------------------------------- - Bake a controller skeleton. - - Usage: - cake bake controller [subcommand] [options] [] - - Subcommands: - - all Bake all controllers with CRUD methods. - - To see help on a subcommand use `cake bake controller [subcommand] --help` - - Options: - - --help, -h Display this help. - --verbose, -v Enable verbose output. - --quiet, -q Enable quiet output. - --plugin, -p Plugin to bake into. - --force, -f Force overwriting existing files without prompting. - --connection, -c The datasource connection to get data from. - (default: default) - --theme, -t The theme to use when baking code. - --components The comma separated list of components to use. - --helpers The comma separated list of helpers to use. - --prefix The namespace/routing prefix to use. - --no-test Do not generate a test skeleton. - --no-actions Do not generate basic CRUD action methods. - - Arguments: - - name Name of the controller to bake. Can use Plugin.name to bake - controllers into plugins. (optional) - -Bake テーマオプション -===================== - -テーマオプションは全 bake コマンドで一般的です。また、bake テンプレートファイルを変更することができます。 -テーマを作るには、 :ref:`Bake テーマ作成ドキュメント ` をご覧ください。 - -.. meta:: - :title lang=ja: Code Generation with Bake - :keywords lang=ja: command line interface,functional application,database,database configuration,bash script,basic ingredients,project,model,path path,code generation,scaffolding,windows users,configuration file,few minutes,config,view,models,running,mysql diff --git a/app/vendor/cakephp/bake/docs/package-lock.json b/app/vendor/cakephp/bake/docs/package-lock.json new file mode 100644 index 000000000..8236c3b3d --- /dev/null +++ b/app/vendor/cakephp/bake/docs/package-lock.json @@ -0,0 +1,2099 @@ +{ + "name": "docs", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "docs", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@cakephp/docs-skeleton": "https://github.com/cakephp/docs-skeleton.git#node-package", + "vitepress": "^2.0.0-alpha.16" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cakephp/docs-skeleton": { + "version": "1.0.0", + "resolved": "git+ssh://git@github.com/cakephp/docs-skeleton.git#9501c6d47a80645604fceb31328368eeb6a21bc6", + "bin": { + "cakedocs": "bin/cakedocs.js" + }, + "peerDependencies": { + "vitepress": "^2.0.0-alpha.15" + } + }, + "node_modules/@docsearch/css": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.6.2.tgz", + "integrity": "sha512-fH/cn8BjEEdM2nJdjNMHIvOVYupG6AIDtFVDgIZrNzdCSj4KXr9kd+hsehqsNGYjpUjObeKYKvgy/IwCb1jZYQ==", + "license": "MIT" + }, + "node_modules/@docsearch/js": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-4.6.2.tgz", + "integrity": "sha512-qj1yoxl3y4GKoK7+VM6fq/rQqPnvUmg3IKzJ9x0VzN14QVzdB/SG/J6VfV1BWT5RcPUFxIcVwoY1fwHM2fSRRw==", + "license": "MIT" + }, + "node_modules/@docsearch/sidepanel-js": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@docsearch/sidepanel-js/-/sidepanel-js-4.6.2.tgz", + "integrity": "sha512-Pni85AP/GwRj7fFg8cBJp0U04tzbueBvWSd3gysgnOsVnQVSZwSYncfErUScLE1CAtR+qocPDFjmYR9AMRNJtQ==", + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", + "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", + "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", + "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", + "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", + "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", + "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", + "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", + "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", + "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", + "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", + "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", + "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", + "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", + "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", + "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", + "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", + "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", + "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", + "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", + "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", + "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", + "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", + "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", + "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", + "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", + "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@iconify-json/simple-icons": { + "version": "1.2.76", + "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.76.tgz", + "integrity": "sha512-lLRlA8yaf+1L5VCPRvR9lynoSklsddKHEylchmZJKdj/q2xVQ1ZAEJ8SCQlv9cbgtMefnlyM98U+8Si2aoFZPA==", + "license": "CC0-1.0", + "dependencies": { + "@iconify/types": "*" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "license": "MIT" + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.2.tgz", + "integrity": "sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==", + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.1.tgz", + "integrity": "sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.1.tgz", + "integrity": "sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.1.tgz", + "integrity": "sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.1.tgz", + "integrity": "sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.1.tgz", + "integrity": "sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.1.tgz", + "integrity": "sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.1.tgz", + "integrity": "sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.1.tgz", + "integrity": "sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.1.tgz", + "integrity": "sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.1.tgz", + "integrity": "sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.1.tgz", + "integrity": "sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.1.tgz", + "integrity": "sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.1.tgz", + "integrity": "sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.1.tgz", + "integrity": "sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.1.tgz", + "integrity": "sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.1.tgz", + "integrity": "sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.1.tgz", + "integrity": "sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.1.tgz", + "integrity": "sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.1.tgz", + "integrity": "sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.1.tgz", + "integrity": "sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.1.tgz", + "integrity": "sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.1.tgz", + "integrity": "sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.1.tgz", + "integrity": "sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.1.tgz", + "integrity": "sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.1.tgz", + "integrity": "sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.23.0.tgz", + "integrity": "sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.5" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.23.0.tgz", + "integrity": "sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.4" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.23.0.tgz", + "integrity": "sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/langs": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.23.0.tgz", + "integrity": "sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0" + } + }, + "node_modules/@shikijs/themes": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.23.0.tgz", + "integrity": "sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0" + } + }, + "node_modules/@shikijs/transformers": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-3.23.0.tgz", + "integrity": "sha512-F9msZVxdF+krQNSdQ4V+Ja5QemeAoTQ2jxt7nJCwhDsdF1JWS3KxIQXA3lQbyKwS3J61oHRUSv4jYWv3CkaKTQ==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "3.23.0", + "@shikijs/types": "3.23.0" + } + }, + "node_modules/@shikijs/types": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.23.0.tgz", + "integrity": "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "license": "MIT" + }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "license": "MIT", + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "license": "MIT" + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.5.tgz", + "integrity": "sha512-bL3AxKuQySfk1iGcBsQnoRVexTPJq0Z/ixFVM8OhVJAP6ZXXXLtM7NFKWhLl30Kg7uTBqIaPXbh+nuQCuBDedg==", + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-rc.2" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.32.tgz", + "integrity": "sha512-4x74Tbtqnda8s/NSD6e1Dr5p1c8HdMU5RWSjMSUzb8RTcUQqevDCxVAitcLBKT+ie3o0Dl9crc/S/opJM7qBGQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.2", + "@vue/shared": "3.5.32", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.32.tgz", + "integrity": "sha512-ybHAu70NtiEI1fvAUz3oXZqkUYEe5J98GjMDpTGl5iHb0T15wQYLR4wE3h9xfuTNA+Cm2f4czfe8B4s+CCH57Q==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.32", + "@vue/shared": "3.5.32" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.32.tgz", + "integrity": "sha512-8UYUYo71cP/0YHMO814TRZlPuUUw3oifHuMR7Wp9SNoRSrxRQnhMLNlCeaODNn6kNTJsjFoQ/kqIj4qGvya4Xg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.2", + "@vue/compiler-core": "3.5.32", + "@vue/compiler-dom": "3.5.32", + "@vue/compiler-ssr": "3.5.32", + "@vue/shared": "3.5.32", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.8", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.32.tgz", + "integrity": "sha512-Gp4gTs22T3DgRotZ8aA/6m2jMR+GMztvBXUBEUOYOcST+giyGWJ4WvFd7QLHBkzTxkfOt8IELKNdpzITLbA2rw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.32", + "@vue/shared": "3.5.32" + } + }, + "node_modules/@vue/devtools-api": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-8.1.1.tgz", + "integrity": "sha512-bsDMJ07b3GN1puVwJb/fyFnj/U2imyswK5UQVLZwVl7O05jDrt6BHxeG5XffmOOdasOj/bOmIjxJvGPxU7pcqw==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^8.1.1" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-8.1.1.tgz", + "integrity": "sha512-gVBaBv++i+adg4JpH71k9ppl4soyR7Y2McEqO5YNgv0BI1kMZ7BDX5gnwkZ5COYgiCyhejZG+yGNrBAjj6Coqg==", + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^8.1.1", + "birpc": "^2.6.1", + "hookable": "^5.5.3", + "perfect-debounce": "^2.0.0" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-8.1.1.tgz", + "integrity": "sha512-+h4ttmJYl/txpxHKaoZcaKpC+pvckgLzIDiSQlaQ7kKthKh8KuwoLW2D8hPJEnqKzXOvu15UHEoGyngAXCz0EQ==", + "license": "MIT" + }, + "node_modules/@vue/reactivity": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.32.tgz", + "integrity": "sha512-/ORasxSGvZ6MN5gc+uE364SxFdJ0+WqVG0CENXaGW58TOCdrAW76WWaplDtECeS1qphvtBZtR+3/o1g1zL4xPQ==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.32" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.32.tgz", + "integrity": "sha512-pDrXCejn4UpFDFmMd27AcJEbHaLemaE5o4pbb7sLk79SRIhc6/t34BQA7SGNgYtbMnvbF/HHOftYBgFJtUoJUQ==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.32", + "@vue/shared": "3.5.32" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.32.tgz", + "integrity": "sha512-1CDVv7tv/IV13V8Nip1k/aaObVbWqRlVCVezTwx3K07p7Vxossp5JU1dcPNhJk3w347gonIUT9jQOGutyJrSVQ==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.32", + "@vue/runtime-core": "3.5.32", + "@vue/shared": "3.5.32", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.32.tgz", + "integrity": "sha512-IOjm2+JQwRFS7W28HNuJeXQle9KdZbODFY7hFGVtnnghF51ta20EWAZJHX+zLGtsHhaU6uC9BGPV52KVpYryMQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.32", + "@vue/shared": "3.5.32" + }, + "peerDependencies": { + "vue": "3.5.32" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.32.tgz", + "integrity": "sha512-ksNyrmRQzWJJ8n3cRDuSF7zNNontuJg1YHnmWRJd2AMu8Ij2bqwiiri2lH5rHtYPZjj4STkNcgcmiQqlOjiYGg==", + "license": "MIT" + }, + "node_modules/@vueuse/core": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-14.2.1.tgz", + "integrity": "sha512-3vwDzV+GDUNpdegRY6kzpLm4Igptq+GA0QkJ3W61Iv27YWwW/ufSlOfgQIpN6FZRMG0mkaz4gglJRtq5SeJyIQ==", + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "14.2.1", + "@vueuse/shared": "14.2.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/@vueuse/integrations": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-14.2.1.tgz", + "integrity": "sha512-2LIUpBi/67PoXJGqSDQUF0pgQWpNHh7beiA+KG2AbybcNm+pTGWT6oPGlBgUoDWmYwfeQqM/uzOHqcILpKL7nA==", + "license": "MIT", + "dependencies": { + "@vueuse/core": "14.2.1", + "@vueuse/shared": "14.2.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "async-validator": "^4", + "axios": "^1", + "change-case": "^5", + "drauu": "^0.4", + "focus-trap": "^7 || ^8", + "fuse.js": "^7", + "idb-keyval": "^6", + "jwt-decode": "^4", + "nprogress": "^0.2", + "qrcode": "^1.5", + "sortablejs": "^1", + "universal-cookie": "^7 || ^8", + "vue": "^3.5.0" + }, + "peerDependenciesMeta": { + "async-validator": { + "optional": true + }, + "axios": { + "optional": true + }, + "change-case": { + "optional": true + }, + "drauu": { + "optional": true + }, + "focus-trap": { + "optional": true + }, + "fuse.js": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "jwt-decode": { + "optional": true + }, + "nprogress": { + "optional": true + }, + "qrcode": { + "optional": true + }, + "sortablejs": { + "optional": true + }, + "universal-cookie": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-14.2.1.tgz", + "integrity": "sha512-1ButlVtj5Sb/HDtIy1HFr1VqCP4G6Ypqt5MAo0lCgjokrk2mvQKsK2uuy0vqu/Ks+sHfuHo0B9Y9jn9xKdjZsw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-14.2.1.tgz", + "integrity": "sha512-shTJncjV9JTI4oVNyF1FQonetYAiTBd+Qj7cY89SWbXSkx7gyhrgtEdF2ZAVWS1S3SHlaROO6F2IesJxQEkZBw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/birpc": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", + "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", + "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.7", + "@esbuild/android-arm": "0.27.7", + "@esbuild/android-arm64": "0.27.7", + "@esbuild/android-x64": "0.27.7", + "@esbuild/darwin-arm64": "0.27.7", + "@esbuild/darwin-x64": "0.27.7", + "@esbuild/freebsd-arm64": "0.27.7", + "@esbuild/freebsd-x64": "0.27.7", + "@esbuild/linux-arm": "0.27.7", + "@esbuild/linux-arm64": "0.27.7", + "@esbuild/linux-ia32": "0.27.7", + "@esbuild/linux-loong64": "0.27.7", + "@esbuild/linux-mips64el": "0.27.7", + "@esbuild/linux-ppc64": "0.27.7", + "@esbuild/linux-riscv64": "0.27.7", + "@esbuild/linux-s390x": "0.27.7", + "@esbuild/linux-x64": "0.27.7", + "@esbuild/netbsd-arm64": "0.27.7", + "@esbuild/netbsd-x64": "0.27.7", + "@esbuild/openbsd-arm64": "0.27.7", + "@esbuild/openbsd-x64": "0.27.7", + "@esbuild/openharmony-arm64": "0.27.7", + "@esbuild/sunos-x64": "0.27.7", + "@esbuild/win32-arm64": "0.27.7", + "@esbuild/win32-ia32": "0.27.7", + "@esbuild/win32-x64": "0.27.7" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/focus-trap": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-8.0.1.tgz", + "integrity": "sha512-9ptSG6z51YQOstI/oN4XuVGP/03u2nh0g//qz7L6zX0i6PZiPnkcf3GenXq7N2hZnASXaMxTPpbKwdI+PFvxlw==", + "license": "MIT", + "dependencies": { + "tabbable": "^6.4.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "license": "MIT" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "license": "MIT" + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/minisearch": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.2.0.tgz", + "integrity": "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/oniguruma-parser": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz", + "integrity": "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==", + "license": "MIT" + }, + "node_modules/oniguruma-to-es": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.5.tgz", + "integrity": "sha512-Zjygswjpsewa0NLTsiizVuMQZbp0MDyM6lIt66OxsF21npUDlzpHi1Mgb/qhQdkb+dWFTzJmFbEWdvZgRho8eQ==", + "license": "MIT", + "dependencies": { + "oniguruma-parser": "^0.12.1", + "regex": "^6.1.0", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/perfect-debounce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz", + "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.1.tgz", + "integrity": "sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.60.1", + "@rollup/rollup-android-arm64": "4.60.1", + "@rollup/rollup-darwin-arm64": "4.60.1", + "@rollup/rollup-darwin-x64": "4.60.1", + "@rollup/rollup-freebsd-arm64": "4.60.1", + "@rollup/rollup-freebsd-x64": "4.60.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.1", + "@rollup/rollup-linux-arm-musleabihf": "4.60.1", + "@rollup/rollup-linux-arm64-gnu": "4.60.1", + "@rollup/rollup-linux-arm64-musl": "4.60.1", + "@rollup/rollup-linux-loong64-gnu": "4.60.1", + "@rollup/rollup-linux-loong64-musl": "4.60.1", + "@rollup/rollup-linux-ppc64-gnu": "4.60.1", + "@rollup/rollup-linux-ppc64-musl": "4.60.1", + "@rollup/rollup-linux-riscv64-gnu": "4.60.1", + "@rollup/rollup-linux-riscv64-musl": "4.60.1", + "@rollup/rollup-linux-s390x-gnu": "4.60.1", + "@rollup/rollup-linux-x64-gnu": "4.60.1", + "@rollup/rollup-linux-x64-musl": "4.60.1", + "@rollup/rollup-openbsd-x64": "4.60.1", + "@rollup/rollup-openharmony-arm64": "4.60.1", + "@rollup/rollup-win32-arm64-msvc": "4.60.1", + "@rollup/rollup-win32-ia32-msvc": "4.60.1", + "@rollup/rollup-win32-x64-gnu": "4.60.1", + "@rollup/rollup-win32-x64-msvc": "4.60.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/shiki": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.23.0.tgz", + "integrity": "sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "3.23.0", + "@shikijs/engine-javascript": "3.23.0", + "@shikijs/engine-oniguruma": "3.23.0", + "@shikijs/langs": "3.23.0", + "@shikijs/themes": "3.23.0", + "@shikijs/types": "3.23.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tabbable": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz", + "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==", + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.2.tgz", + "integrity": "sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitepress": { + "version": "2.0.0-alpha.17", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-2.0.0-alpha.17.tgz", + "integrity": "sha512-Z3VPUpwk/bHYqt1uMVOOK1/4xFiWQov1GNc2FvMdz6kvje4JRXEOngVI9C+bi5jeedMSHiA4dwKkff1NCvbZ9Q==", + "license": "MIT", + "dependencies": { + "@docsearch/css": "^4.5.3", + "@docsearch/js": "^4.5.3", + "@docsearch/sidepanel-js": "^4.5.3", + "@iconify-json/simple-icons": "^1.2.69", + "@shikijs/core": "^3.22.0", + "@shikijs/transformers": "^3.22.0", + "@shikijs/types": "^3.22.0", + "@types/markdown-it": "^14.1.2", + "@vitejs/plugin-vue": "^6.0.4", + "@vue/devtools-api": "^8.0.5", + "@vue/shared": "^3.5.27", + "@vueuse/core": "^14.2.0", + "@vueuse/integrations": "^14.2.0", + "focus-trap": "^8.0.0", + "mark.js": "8.11.1", + "minisearch": "^7.2.0", + "shiki": "^3.22.0", + "vite": "^7.3.1", + "vue": "^3.5.27" + }, + "bin": { + "vitepress": "bin/vitepress.js" + }, + "peerDependencies": { + "markdown-it-mathjax3": "^4", + "oxc-minify": "*", + "postcss": "^8" + }, + "peerDependenciesMeta": { + "markdown-it-mathjax3": { + "optional": true + }, + "oxc-minify": { + "optional": true + }, + "postcss": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.32.tgz", + "integrity": "sha512-vM4z4Q9tTafVfMAK7IVzmxg34rSzTFMyIe0UUEijUCkn9+23lj0WRfA83dg7eQZIUlgOSGrkViIaCfqSAUXsMw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.32", + "@vue/compiler-sfc": "3.5.32", + "@vue/runtime-dom": "3.5.32", + "@vue/server-renderer": "3.5.32", + "@vue/shared": "3.5.32" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/app/vendor/cakephp/bake/docs/package.json b/app/vendor/cakephp/bake/docs/package.json new file mode 100644 index 000000000..f1407730a --- /dev/null +++ b/app/vendor/cakephp/bake/docs/package.json @@ -0,0 +1,19 @@ +{ + "name": "docs", + "version": "1.0.0", + "description": "", + "main": "config.js", + "scripts": { + "docs:dev": "vitepress dev", + "docs:build": "vitepress build", + "docs:preview": "vitepress preview" + }, + "keywords": [], + "author": "", + "license": "ISC", + "type": "module", + "dependencies": { + "@cakephp/docs-skeleton": "git+ssh://git@github.com:cakephp/docs-skeleton.git#node-package", + "vitepress": "^2.0.0-alpha.16" + } +} diff --git a/app/vendor/cakephp/bake/docs/pt/conf.py b/app/vendor/cakephp/bake/docs/pt/conf.py deleted file mode 100644 index 9e22cb017..000000000 --- a/app/vendor/cakephp/bake/docs/pt/conf.py +++ /dev/null @@ -1,9 +0,0 @@ -import sys, os - -# Append the top level directory of the docs, so we can import from the config dir. -sys.path.insert(0, os.path.abspath('..')) - -# Pull in all the configuration options defined in the global config file.. -from config.all import * - -language = 'pt' diff --git a/app/vendor/cakephp/bake/docs/pt/contents.rst b/app/vendor/cakephp/bake/docs/pt/contents.rst deleted file mode 100644 index 08c3e957c..000000000 --- a/app/vendor/cakephp/bake/docs/pt/contents.rst +++ /dev/null @@ -1,7 +0,0 @@ -.. toctree:: - :maxdepth: 2 - :caption: CakePHP Bake - - /index - /usage - /development diff --git a/app/vendor/cakephp/bake/docs/pt/development.md b/app/vendor/cakephp/bake/docs/pt/development.md new file mode 100644 index 000000000..4b724e3e9 --- /dev/null +++ b/app/vendor/cakephp/bake/docs/pt/development.md @@ -0,0 +1,262 @@ +# Estendendo o Bake + +O Bake fornece uma arquitetura expansível que permite à sua aplicação ou plugin modificar ou adicionar funcionalidades às funções básicas. +Bake faz uso de uma classe view dedicada que usa o mecanismo de templates [Twig](https://twig.symfony.com/). + +## Eventos do Bake + +Como uma classe view, `BakeView` emite os mesmos eventos que qualquer outra classe view, mais um evento extra de inicialização. +Enquanto as classes view padrão usam o prefixo `View.`, `BakeView` usa o prefixo `Bake.`. + +O evento de inicialização pode ser usado para fazer mudanças que se aplicam a todas as saídas do Bake. +Por exemplo, ao adicionar outro helper à classe view do Bake: + +```php +on('Bake.initialize', function (Event $event) { + $view = $event->getSubject(); + + // In my bake templates, allow the use of the MySpecial helper + $view->loadHelper('MySpecial', ['some' => 'config']); + + // And add an $author variable so it's always available + $view->set('author', 'Andy'); +}); +``` + +Se você deseja modificar o Bake a partir de outro plugin, é recomendável colocar os eventos do plugin no arquivo `config/bootstrap.php`. + +Os eventos do Bake podem ser úteis para pequenas alterações nos templates existentes. +Por exemplo, para alterar os nomes das variáveis usados no controller e template quando executar o Bake: + +```php +on('Bake.beforeRender', function (Event $event) { + $view = $event->getSubject(); + + // Use $rows for the main data variable in indexes + if ($view->get('pluralName')) { + $view->set('pluralName', 'rows'); + } + if ($view->get('pluralVar')) { + $view->set('pluralVar', 'rows'); + } + + // Use $theOne for the main data variable in view/edit + if ($view->get('singularName')) { + $view->set('singularName', 'theOne'); + } + if ($view->get('singularVar')) { + $view->set('singularVar', 'theOne'); + } +}); +``` + +Você também pode aplicar os eventos `Bake.beforeRender` e `Bake.afterRender` a um arquivo específico. +Por exemplo, se quiser adicionar ações ao `UsersController` ao gerar a partir de `Controller/controller.twig`: + +```php +on( + 'Bake.beforeRender.Controller.controller', + function (Event $event) { + $view = $event->getSubject(); + if ($view->viewVars['name'] == 'Users') { + // add the login and logout actions to the Users controller + $view->set('actions', [ + 'login', + 'logout', + 'index', + 'view', + 'add', + 'edit', + 'delete', + ]); + } + } +); +``` + +Ao adicionar listeners específicos para determinados templates do Bake, você simplifica a lógica relacionada ao Bake e fornece callbacks fáceis de testar. + +## Sintaxe de Templates do Bake + +Os arquivos de template do Bake usam a sintaxe [Twig](https://twig.symfony.com/doc/2.x/). + +Então, por exemplo, quando você executar algo como: + +```bash +bin/cake bake shell Foo +``` + +O template usado em `vendor/cakephp/bake/src/Template/Bake/Shell/shell.twig` parece com isto: + +```php +` fecha uma tag PHP de template Bake. +- `<%=` é a forma short-echo do template Bake. +- `<%-` abre a tag removendo espaços em branco antes dela. +- `-%>` fecha a tag removendo espaços em branco após ela. +::: + +## Criando um Tema Bake + +Se você deseja modificar a saída produzida com o comando `bake`, pode criar seu próprio tema para substituir alguns ou todos os templates que o Bake usa. + +1. Gere um novo plugin. O nome do plugin é o nome do tema. +2. Crie uma nova pasta em `plugins/[name]/Template/Bake/Template/`. +3. Copie qualquer template que queira modificar de `vendor/cakephp/bake/src/Template/Bake/Template` para a pasta acima e altere conforme sua necessidade. +4. Ao executar o Bake, use a opção `--theme` para especificar o tema. Para evitar repetir isso a cada chamada, também é possível definir o tema padrão: + +```php +Test->classSuffixes[$this->name()])) { + $this->Test->classSuffixes[$this->name()] = 'Foo'; + } + + $name = ucfirst($this->name()); + if (!isset($this->Test->classTypes[$name])) { + $this->Test->classTypes[$name] = 'Foo'; + } + + return parent::bakeTest($className); +} +``` + +- O **sufixo da classe** será anexado ao nome fornecido na chamada ao Bake. No exemplo acima, isso criaria `ExampleFooTest.php`. +- O **tipo de classe** será o subnamespace usado para levar ao arquivo relativo à aplicação ou plugin. No exemplo acima, isso criaria o namespace `App\Test\TestCase\Foo`. diff --git a/app/vendor/cakephp/bake/docs/pt/development.rst b/app/vendor/cakephp/bake/docs/pt/development.rst deleted file mode 100644 index 9a24232be..000000000 --- a/app/vendor/cakephp/bake/docs/pt/development.rst +++ /dev/null @@ -1,298 +0,0 @@ -Estendendo o Bake -################# - -O Bake fornece uma arquitetura expansível que permite a sua aplicação ou plugin -modificar ou adicionar funcionalidades às suas funções básicas. Bake faz uso de -uma classe view dedicada que usa a ferramenta de templates `Twig -`_. - -Eventos do Bake -=============== - -Como uma class view , ``BakeView`` emite o mesmo evento como qualquer outra -classe view, mais uma extra que inicializa eventos. No entanto, onde as classes -view padrão usam o prefixo "View.", ``BakeView`` usa o prefixo "Bake.". - -O inicializador de eventos pode ser usado para fazer mudanças quando aplicado -a todas as saídas do Bake, por exemplo, ao adicionar outro helper à classe bake -view este evento pode ser usado:: - - on('Bake.initialize', function (Event $event) { - $view = $event->getSubject(); - - // In my bake templates, allow the use of the MySpecial helper - $view->loadHelper('MySpecial', ['some' => 'config']); - - // And add an $author variable so it's always available - $view->set('author', 'Andy'); - - }); - -Se você deseja modificar o bake de outro plugin, é recomendável colocar os -eventos do bake do seu plugin no arquivo **config/bootstrap.php**. - -Os eventos do Bake podem ser úteis para fazer pequenas alterações nos modelos -existentes. Por exemplo, para alterar os nomes das variáveis usados no -controller/template quando executar o bake, pode-se usar uma função esperando -o ``Bake.beforeRender`` para modificar as variáveis usadas no bake templates:: - - on('Bake.beforeRender', function (Event $event) { - $view = $event->getSubject(); - - // Use $rows for the main data variable in indexes - if ($view->get('pluralName')) { - $view->set('pluralName', 'rows'); - } - if ($view->get('pluralVar')) { - $view->set('pluralVar', 'rows'); - } - - // Use $theOne for the main data variable in view/edit - if ($view->get('singularName')) { - $view->set('singularName', 'theOne'); - } - if ($view->get('singularVar')) { - $view->set('singularVar', 'theOne'); - } - - }); - -Você também pode abranger os eventos ``Bake.beforeRender`` -e ``Bake.afterRender`` para um arquivo específico. Por exemplo, se você quiser -adicionar ações específicas para seu UsersController ao gerar a partir de um -arquivo **Controller/controller.twig**, você pode usar o seguinte evento:: - - on( - 'Bake.beforeRender.Controller.controller', - function (Event $event) { - $view = $event->getSubject(); - if ($view->viewVars['name'] == 'Users') { - // add the login and logout actions to the Users controller - $view->set('actions', [ - 'login', - 'logout', - 'index', - 'view', - 'add', - 'edit', - 'delete' - ]); - } - } - ); - -Ao adicionar eventos que escutam um bake templates específico, você pode -simplesmente relacionar a sua lógica de eventos com o bake e fornecer callbacks -que são facilmente testáveis. - -Sintaxe de Templates do Bake -============================ - -Os arquivos de templates do Bake usam a sintaxe `Twig `__. - -Então, por exemplo, quando você executar algo como:: - -.. code-block:: bash - - $ bin/cake bake shell Foo - -O template usado (**vendor/cakephp/bake/src/Template/Bake/Shell/shell.twig**) -parece com algo assim:: - - `` Um template bake php fecha a tag - * ``<%=`` Um template bake php short-echo tag - * ``<%-`` Um template bake php abre a tag, retirando qualquer espaço em branco antes da tag - * ``-%>`` Um template bake php fecha a tag, retirando qualqualquer espaço em branco após a tag - -.. _creating-a-bake-theme: - -Criando um Tema Bake -===================== - -Se você deseja modificar a saída produzida com o comando bake, você pode criar -o seu próprio tema para o bake que permitirá você substituir algum ou todos os -tempaltes que o bake usa. O mmelhor jeito de fazer isto é: - -#. Bake um novo plugin. O nome do plugin é o 'nome do tema' -#. Crie uma nova pasta em **plugins/[name]/Template/Bake/Template/**. -#. Copie qualquer template que você queira modificar de - **vendor/cakephp/bake/src/Template/Bake/Template** para a pasta acima e modificá-los conforme sua necessidade. -#. Quando executar o bake use a opção ``--theme`` para especificar qual o tema - que o bake deve usar. Para evitar problemas com esta opção, em cada chamada, - você também pode definir o seu template customizado para ser usado como - o template padrão:: - - Test->classSuffixes[$this->name()])) { - $this->Test->classSuffixes[$this->name()] = 'Foo'; - } - - $name = ucfirst($this->name()); - if (!isset($this->Test->classTypes[$name])) { - $this->Test->classTypes[$name] = 'Foo'; - } - - return parent::bakeTest($className); - } - -* O **sufixo da classe** será anexado ao nome fornecido em sua chamada bake. No - exemplo anterior, ele criaria um arquivo ExampleFooTest.php. -* O **tipo de classe** será o subdomínio usado que levará ao seu arquivo - (relativo ao aplicativo ou ao plugin em que você está inserindo). No exemplo - anterior, ele criaria seu teste com o namespace App\Test\TestCase\Foo. - - -.. meta:: - :title lang=en: Extending Bake - :keywords lang=en: command line interface,development,bake view, bake template syntax,twig,erb tags,percent tags - diff --git a/app/vendor/cakephp/bake/docs/pt/index.md b/app/vendor/cakephp/bake/docs/pt/index.md new file mode 100644 index 000000000..fb09a83d4 --- /dev/null +++ b/app/vendor/cakephp/bake/docs/pt/index.md @@ -0,0 +1,25 @@ +# Console Bake + +O console do Bake é uma ferramenta para você sair produzindo em CakePHP rapidamente. +Ele pode criar os itens básicos do CakePHP, como models, behaviors, views, helpers, +controllers, components, test cases, fixtures e plugins. +Bake pode ir além de classes esqueleto e gerar uma base funcional em poucos minutos. + +## Instalação + +Antes de usar ou estender o Bake, tenha certeza de que ele está instalado em sua aplicação. +Bake é distribuído como um plugin que você pode instalar com Composer: + +```bash +composer require --dev cakephp/bake:~2.0 +``` + +Isso instala o Bake como dependência de desenvolvimento, portanto ele não será instalado em produção. + +Ao usar templates Twig, verifique se você está carregando o plugin `Cake/TwigView` com seu bootstrap. +Você também pode omiti-lo completamente, o que faz com que o plugin Bake carregue esse plugin sob demanda. + +## Mapa da documentação + +- [Geração de código com Bake](/pt/usage) cobre a execução do CLI, os comandos disponíveis e os temas do Bake. +- [Estendendo o Bake](/pt/development) cobre eventos, templates, temas e novos comandos de Bake. diff --git a/app/vendor/cakephp/bake/docs/pt/index.rst b/app/vendor/cakephp/bake/docs/pt/index.rst deleted file mode 100644 index 8d068757e..000000000 --- a/app/vendor/cakephp/bake/docs/pt/index.rst +++ /dev/null @@ -1,30 +0,0 @@ -Console Bake -############ - -O console do **Bake** é outra ferramenta disponível para você sair trabalhando -- e rápido! O console Bake pode criar qualquer ítem básico do CakePHP: models, -behaviors, views, helpers, controllers, components, test cases, fixtures -e plugins. E nós não estamos apenas falando do esqueleto da classes: O Bake -pode criar uma aplicação totalmente funcional em questão de minutos. De fato, -o Bake é um passo natural a se dar uma vez que a aplicação tem sua base -construída. - -Instalação -========== - -Antes de tentar usar ou estender o Bake, tenha certeza de que ele está instalado em -sua aplicação. O Bake é distribuído como um plugin que você pode instalar com o -Composer:: - - composer require --dev cakephp/bake:~2.0 - -Isto irá instalar o Bake como uma dependência de desenvolvimento, sendo assim, -não será instalado no ambiente de produção. - -Ao usar os modelos Twig, verifique se você está carregando o plugin -Cake/TwigView com seu bootstrap. Você também pode omiti-lo completamente, -o que faz com que o plugin Bake carregue esse plugin sob demanda. - -.. meta:: - :title lang=pt: Bake Console - :keywords lang=pt: cli,linha de comando,command line,dev,desenvolvimento,bake view, bake syntax,erb tags,asp tags,percent tags diff --git a/app/vendor/cakephp/bake/docs/pt/usage.md b/app/vendor/cakephp/bake/docs/pt/usage.md new file mode 100644 index 000000000..fd89ed1ae --- /dev/null +++ b/app/vendor/cakephp/bake/docs/pt/usage.md @@ -0,0 +1,104 @@ +# Geração de Código com Bake + +O console do Bake é executado usando o PHP CLI. +Se você tiver problemas para executar o script, assegure-se de que: + +1. Você instalou o PHP CLI e possui os módulos apropriados habilitados, por exemplo MySQL e `intl`. +2. Se o host do banco de dados for `localhost`, tente `127.0.0.1`, pois `localhost` pode causar problemas no PHP CLI. +3. Dependendo de como o seu computador está configurado, pode ser necessário definir permissões de execução no script Cake para chamá-lo com `bin/cake bake`. + +Antes de executar o Bake, você deve ter pelo menos uma conexão de banco de dados configurada. + +Para ver as opções disponíveis no Bake, digite: + +```bash +$ bin/cake bake --help + +Current Paths: + +* app: src +* root: . +* core: .\vendor\cakephp\cakephp + +Available Commands: + +Bake: + - bake all + - bake behavior + - bake cell + - bake command + - bake component + - bake controller + - bake controller all + - bake fixture + - bake fixture all + - bake form + - bake helper + - bake mailer + - bake middleware + - bake model + - bake model all + - bake plugin + - bake task + - bake template + - bake template all + - bake test + +To run a command, type `cake command_name [args|options]` +To get help on a specific command, type `cake command_name --help` +``` + +Você pode obter mais informações sobre o que cada tarefa faz e quais são suas opções usando `--help`: + +```bash +$ bin/cake bake model --help + +Bake table and entity classes. + +Usage: +cake bake model [options] [] + +Options: + +--connection, -c The datasource connection to get data from. + (default: default) +--display-field The displayField if you would like to choose one. +--fields A comma separated list of fields to make + accessible. +--force, -f Force overwriting existing files without + prompting. +--help, -h Display this help. +--hidden A comma separated list of fields to hide. +--no-associations Disable generating associations. +--no-entity Disable generating an entity class. +--no-fields Disable generating accessible fields in the + entity. +--no-fixture Do not generate a test fixture skeleton. +--no-hidden Disable generating hidden fields in the entity. +--no-rules Disable generating a rules checker. +--no-table Disable generating a table class. +--no-test Do not generate a test case skeleton. +--no-validation Disable generating validation rules. +--plugin, -p Plugin to bake into. +--primary-key The primary key if you would like to manually set + one. Can be a comma separated list if you are + using a composite primary key. +--quiet, -q Enable quiet output. +--table The table name to use if you have + non-conventional table names. +--theme, -t The theme to use when baking code. +--verbose, -v Enable verbose output. + +Arguments: + +name Name of the model to bake (without the Table suffix). You can use + Plugin.name to bake plugin models. (optional) + +Omitting all arguments and options will list the table names you can +generate models for. +``` + +## Temas para o Bake + +A opção `theme` é comum a todos os comandos do Bake e permite mudar os arquivos de template usados por ele. +Para criar seus próprios templates, veja [Criando um Tema Bake](/pt/development#criando-um-tema-bake). diff --git a/app/vendor/cakephp/bake/docs/pt/usage.rst b/app/vendor/cakephp/bake/docs/pt/usage.rst deleted file mode 100644 index f8cf8b4aa..000000000 --- a/app/vendor/cakephp/bake/docs/pt/usage.rst +++ /dev/null @@ -1,115 +0,0 @@ -Geração de Código com Bake -########################## - -O console do **Bake** é executado usando o PHP CLI (interface da linha de comando). -Se você tiver problemas para executar o script, assegure-se de que: - -#. Você instalou o PHP CLI e possui os módulos apropriados habilitados (por - exemplo: MySQL, intl). -#. Os usuários também podem ter problemas se o host do banco de dados for - 'localhost' e devem tentar '127.0.0.1', em vez disso, como localhost pode - causar problemas no PHP CLI. -#. Dependendo de como o seu computador está configurado, você pode ter que - definir direitos de execução no script cake bash para chamá-lo usando - ``bin/cake bake``. - -Antes de executar o Bake você deve certificar-se de ter pelo menos um banco de dados com a conexão configurada. - -Para ver as opções disponíveis no Bake digite:: - - $ bin/cake bake --help - - Current Paths: - - * app: src - * root: . - * core: .\vendor\cakephp\cakephp - - Available Commands: - - Bake: - - bake all - - bake behavior - - bake cell - - bake command - - bake component - - bake controller - - bake controller all - - bake fixture - - bake fixture all - - bake form - - bake helper - - bake mailer - - bake middleware - - bake model - - bake model all - - bake plugin - - bake task - - bake template - - bake template all - - bake test - - To run a command, type `cake command_name [args|options]` - To get help on a specific command, type `cake command_name --help` - - -Você pode obter mais informações sobre o que cada tarefa faz e quais são suas opções -disponíveis usando a opção ``--help``:: - - $ bin/cake bake model --help - - Bake table and entity classes. - - Usage: - cake bake model [options] [] - - Options: - - --connection, -c The datasource connection to get data from. - (default: default) - --display-field The displayField if you would like to choose one. - --fields A comma separated list of fields to make - accessible. - --force, -f Force overwriting existing files without - prompting. - --help, -h Display this help. - --hidden A comma separated list of fields to hide. - --no-associations Disable generating associations. - --no-entity Disable generating an entity class. - --no-fields Disable generating accessible fields in the - entity. - --no-fixture Do not generate a test fixture skeleton. - --no-hidden Disable generating hidden fields in the entity. - --no-rules Disable generating a rules checker. - --no-table Disable generating a table class. - --no-test Do not generate a test case skeleton. - --no-validation Disable generating validation rules. - --plugin, -p Plugin to bake into. - --primary-key The primary key if you would like to manually set - one. Can be a comma separated list if you are - using a composite primary key. - --quiet, -q Enable quiet output. - --table The table name to use if you have - non-conventional table names. - --theme, -t The theme to use when baking code. - --verbose, -v Enable verbose output. - - Arguments: - - name Name of the model to bake (without the Table suffix). You can use - Plugin.name to bake plugin models. (optional) - - Omitting all arguments and options will list the table names you can - generate models for. - - - -Temas para o Bake -================= - -A opção de tema é comum a todos os comandos do Bake e permite mudar os arquivos de modelo usados por ele. Para criar seus próprios modelos, veja a -:ref:`documentação de criação de temas para o Bake `. - -.. meta:: - :title lang=pt: Geração de código com bake - :keywords lang=pt: command line interface,functional application,database,database configuration,bash script,basic ingredients,project,model,path path,code generation,scaffolding,windows users,configuration file,few minutes,config,iew,shell,models,running,mysql diff --git a/app/vendor/cakephp/bake/docs/public/favicon/apple-touch-icon.png b/app/vendor/cakephp/bake/docs/public/favicon/apple-touch-icon.png new file mode 100644 index 000000000..c6d073d7b Binary files /dev/null and b/app/vendor/cakephp/bake/docs/public/favicon/apple-touch-icon.png differ diff --git a/app/vendor/cakephp/bake/docs/public/favicon/favicon-96x96.png b/app/vendor/cakephp/bake/docs/public/favicon/favicon-96x96.png new file mode 100644 index 000000000..6642e0cda Binary files /dev/null and b/app/vendor/cakephp/bake/docs/public/favicon/favicon-96x96.png differ diff --git a/app/vendor/cakephp/bake/docs/public/favicon/favicon.ico b/app/vendor/cakephp/bake/docs/public/favicon/favicon.ico new file mode 100644 index 000000000..405aa94ce Binary files /dev/null and b/app/vendor/cakephp/bake/docs/public/favicon/favicon.ico differ diff --git a/app/vendor/cakephp/bake/docs/public/favicon/favicon.svg b/app/vendor/cakephp/bake/docs/public/favicon/favicon.svg new file mode 100644 index 000000000..805ef4b8f --- /dev/null +++ b/app/vendor/cakephp/bake/docs/public/favicon/favicon.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/app/vendor/cakephp/bake/docs/public/favicon/site.webmanifest b/app/vendor/cakephp/bake/docs/public/favicon/site.webmanifest new file mode 100644 index 000000000..4f23fb31d --- /dev/null +++ b/app/vendor/cakephp/bake/docs/public/favicon/site.webmanifest @@ -0,0 +1,21 @@ +{ + "name": "CakePHP", + "short_name": "CakePHP", + "icons": [ + { + "src": "/favicon/web-app-manifest-192x192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "/favicon/web-app-manifest-512x512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} \ No newline at end of file diff --git a/app/vendor/cakephp/bake/docs/public/favicon/web-app-manifest-192x192.png b/app/vendor/cakephp/bake/docs/public/favicon/web-app-manifest-192x192.png new file mode 100644 index 000000000..b5df2990b Binary files /dev/null and b/app/vendor/cakephp/bake/docs/public/favicon/web-app-manifest-192x192.png differ diff --git a/app/vendor/cakephp/bake/docs/public/favicon/web-app-manifest-512x512.png b/app/vendor/cakephp/bake/docs/public/favicon/web-app-manifest-512x512.png new file mode 100644 index 000000000..6a522de35 Binary files /dev/null and b/app/vendor/cakephp/bake/docs/public/favicon/web-app-manifest-512x512.png differ diff --git a/app/vendor/cakephp/bake/docs/public/fonts/cakedingbats-webfont.eot b/app/vendor/cakephp/bake/docs/public/fonts/cakedingbats-webfont.eot new file mode 100644 index 000000000..0800d1e7d Binary files /dev/null and b/app/vendor/cakephp/bake/docs/public/fonts/cakedingbats-webfont.eot differ diff --git a/app/vendor/cakephp/bake/docs/public/fonts/cakedingbats-webfont.svg b/app/vendor/cakephp/bake/docs/public/fonts/cakedingbats-webfont.svg new file mode 100644 index 000000000..d2afda5e2 --- /dev/null +++ b/app/vendor/cakephp/bake/docs/public/fonts/cakedingbats-webfont.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/vendor/cakephp/bake/docs/public/fonts/cakedingbats-webfont.ttf b/app/vendor/cakephp/bake/docs/public/fonts/cakedingbats-webfont.ttf new file mode 100644 index 000000000..78ad6c884 Binary files /dev/null and b/app/vendor/cakephp/bake/docs/public/fonts/cakedingbats-webfont.ttf differ diff --git a/app/vendor/cakephp/bake/docs/public/fonts/cakedingbats-webfont.woff b/app/vendor/cakephp/bake/docs/public/fonts/cakedingbats-webfont.woff new file mode 100644 index 000000000..a95e1b38b Binary files /dev/null and b/app/vendor/cakephp/bake/docs/public/fonts/cakedingbats-webfont.woff differ diff --git a/app/vendor/cakephp/bake/docs/public/fonts/cakedingbats-webfont.woff2 b/app/vendor/cakephp/bake/docs/public/fonts/cakedingbats-webfont.woff2 new file mode 100644 index 000000000..2cd9fdd0e Binary files /dev/null and b/app/vendor/cakephp/bake/docs/public/fonts/cakedingbats-webfont.woff2 differ diff --git a/app/vendor/cakephp/bake/docs/public/history-panel-use.mp4 b/app/vendor/cakephp/bake/docs/public/history-panel-use.mp4 new file mode 100644 index 000000000..d87dc65ab Binary files /dev/null and b/app/vendor/cakephp/bake/docs/public/history-panel-use.mp4 differ diff --git a/app/vendor/cakephp/bake/docs/public/history-panel.png b/app/vendor/cakephp/bake/docs/public/history-panel.png new file mode 100644 index 000000000..0c6b27e20 Binary files /dev/null and b/app/vendor/cakephp/bake/docs/public/history-panel.png differ diff --git a/app/vendor/cakephp/bake/docs/public/logo.svg b/app/vendor/cakephp/bake/docs/public/logo.svg new file mode 100644 index 000000000..829c8e98d --- /dev/null +++ b/app/vendor/cakephp/bake/docs/public/logo.svg @@ -0,0 +1,27 @@ + + + + diff --git a/app/vendor/cakephp/bake/docs/public/mail-panel.mp4 b/app/vendor/cakephp/bake/docs/public/mail-panel.mp4 new file mode 100644 index 000000000..02078c858 Binary files /dev/null and b/app/vendor/cakephp/bake/docs/public/mail-panel.mp4 differ diff --git a/app/vendor/cakephp/bake/docs/public/mail-previewer.mp4 b/app/vendor/cakephp/bake/docs/public/mail-previewer.mp4 new file mode 100644 index 000000000..66f9fdb97 Binary files /dev/null and b/app/vendor/cakephp/bake/docs/public/mail-previewer.mp4 differ diff --git a/app/vendor/cakephp/bake/docs/ru/conf.py b/app/vendor/cakephp/bake/docs/ru/conf.py deleted file mode 100644 index f8a170ee5..000000000 --- a/app/vendor/cakephp/bake/docs/ru/conf.py +++ /dev/null @@ -1,9 +0,0 @@ -import sys, os - -# Append the top level directory of the docs, so we can import from the config dir. -sys.path.insert(0, os.path.abspath('..')) - -# Pull in all the configuration options defined in the global config file.. -from config.all import * - -language = 'ru' diff --git a/app/vendor/cakephp/bake/docs/ru/contents.rst b/app/vendor/cakephp/bake/docs/ru/contents.rst deleted file mode 100644 index 08c3e957c..000000000 --- a/app/vendor/cakephp/bake/docs/ru/contents.rst +++ /dev/null @@ -1,7 +0,0 @@ -.. toctree:: - :maxdepth: 2 - :caption: CakePHP Bake - - /index - /usage - /development diff --git a/app/vendor/cakephp/bake/docs/ru/development.md b/app/vendor/cakephp/bake/docs/ru/development.md new file mode 100644 index 000000000..47dda1b25 --- /dev/null +++ b/app/vendor/cakephp/bake/docs/ru/development.md @@ -0,0 +1,263 @@ +# Расширение возможностей Bake + +Bake имеет расширяемую архитектуру, которая позволяет вашему приложению или плагинам изменять или дополнять базовую функциональность. +Bake использует специальный класс представления и механизм шаблонизатора [Twig](https://twig.symfony.com/). + +## События Bake + +`BakeView`, как и любой другой класс представления, генерирует стандартные события, а также дополнительное событие инициализации. +Стандартные классы представления используют префикс `View.`, а `BakeView` использует префикс `Bake.`. + +Событие `initialize` можно использовать для внесения изменений, которые применяются ко всему выводу Bake. +Например, чтобы добавить helper в класс представления Bake: + +```php +on('Bake.initialize', function (Event $event) { + $view = $event->getSubject(); + + // В моих шаблонах bake разрешить использование MySpecial helper + $view->loadHelper('MySpecial', ['some' => 'config']); + + // И добавить переменную $author, чтобы она всегда была доступна + $view->set('author', 'Andy'); +}); +``` + +Если вы хотите изменить Bake из другого плагина, удобнее всего разместить события плагина в `config/bootstrap.php`. + +События Bake полезны и для небольших изменений существующих шаблонов. +Например, чтобы изменить имена переменных, используемых при генерации controller и template файлов, можно слушать `Bake.beforeRender`: + +```php +on('Bake.beforeRender', function (Event $event) { + $view = $event->getSubject(); + + // Использовать $rows для основной переменной данных в index + if ($view->get('pluralName')) { + $view->set('pluralName', 'rows'); + } + if ($view->get('pluralVar')) { + $view->set('pluralVar', 'rows'); + } + + // Использовать $theOne для основной переменной данных в view/edit + if ($view->get('singularName')) { + $view->set('singularName', 'theOne'); + } + if ($view->get('singularVar')) { + $view->set('singularVar', 'theOne'); + } +}); +``` + +Вы также можете привязать события `Bake.beforeRender` и `Bake.afterRender` к конкретному генерируемому файлу. +Например, если вы хотите добавить действия в `UsersController` при генерации из `Controller/controller.twig`: + +```php +on( + 'Bake.beforeRender.Controller.controller', + function (Event $event) { + $view = $event->getSubject(); + if ($view->viewVars['name'] == 'Users') { + // добавим действия входа и выхода в контроллер Users + $view->viewVars['actions'] = [ + 'login', + 'logout', + 'index', + 'view', + 'add', + 'edit', + 'delete', + ]; + } + } +); +``` + +Фокусируя обработчики на конкретных шаблонах Bake, вы упрощаете связанную с Bake логику событий и получаете более удобные для тестирования callback-функции. + +## Синтаксис шаблонов Bake + +Файлы шаблонов Bake используют синтаксис [Twig](https://twig.symfony.com/doc/2.x/). + +Например, при генерации shell-команды: + +```bash +bin/cake bake shell Foo +``` + +Шаблон `vendor/cakephp/bake/src/Template/Bake/Shell/shell.twig` выглядит так: + +```php +` закрывающий PHP-тег шаблона Bake. +- `<%=` короткий echo-тег шаблона Bake. +- `<%-` открывающий тег с удалением пробелов перед тегом. +- `-%>` закрывающий тег с удалением пробелов после тега. +::: + +## Создание темы Bake + +Если вы хотите изменить вывод, создаваемый командой `bake`, вы можете создать собственную тему Bake, которая позволит заменить часть или все шаблоны. + +1. Сгенерируйте новый плагин. Имя плагина станет именем темы Bake. +2. Создайте директорию `plugins/[name]/src/Template/Bake/Template/`. +3. Скопируйте нужные шаблоны из `vendor/cakephp/bake/src/Template/Bake/Template` в соответствующие файлы вашего плагина. +4. При запуске Bake используйте параметр `--theme`, чтобы указать тему. Чтобы не передавать его каждый раз, можно настроить тему по умолчанию: + +```php +Test->classSuffixes[$this->name()])) { + $this->Test->classSuffixes[$this->name()] = 'Foo'; + } + + $name = ucfirst($this->name()); + if (!isset($this->Test->classTypes[$name])) { + $this->Test->classTypes[$name] = 'Foo'; + } + + return parent::bakeTest($className); +} +``` + +- **Суффикс класса** добавляется к имени, переданному в вызове `bake`. В примере выше это создаст `ExampleFooTest.php`. +- **Тип класса** определяет подпространство имён, ведущее к файлу относительно приложения или плагина. В примере выше это создаст тест с namespace `App\Test\TestCase\Foo`. diff --git a/app/vendor/cakephp/bake/docs/ru/development.rst b/app/vendor/cakephp/bake/docs/ru/development.rst deleted file mode 100644 index 568068dbf..000000000 --- a/app/vendor/cakephp/bake/docs/ru/development.rst +++ /dev/null @@ -1,288 +0,0 @@ -Расширение возможностей Bake -############################ - -Bake имеет расширяемую архитектуру, которая позволяет вашему приложению или плагинам -измененять или добавления его базовую функциональность. Bake использует специальный -класс, который использует механизм шаблонизатора `Twig `_. - -События Bake -============ - -В качестве класса представления ``BakeView`` генерирует те же события, что и любой другой класс представления, -плюс одно дополнительное событие инициализации. Однако, в то время как классы стандартного представления используют -префикс события "View.", ``BakeView`` использует префикс события "Bake.". - -Событие initialize можно использовать для внесения изменений, которые применяются ко всем 'испеченным' -выводам, например, чтобы добавить другого помощника в класс вида bake, это событие может -использовать следующее:: - - on('Bake.initialize', function (Event $event) { - $view = $event->getSubject(); - - // В моих шаблонах bake, разрешить использование MySpecial helper - $view->loadHelper('MySpecial', ['some' => 'config']); - - // И добавьте переменную $author, чтобы она всегда была доступна - $view->set('author', 'Andy'); - - }); - -Если вы хотите изменить выпечку из другого плагина, хорошей идеей будет - поместить -события своего плагина в файл ``config/bootstrap.php``. - -События Bake могут быть полезны для внесения небольших изменений в существующие шаблоны. -Например, чтобы изменить имена переменных, используемых для выпечки файлов контроллеров/шаблонов, -можно использовать прослушивающую функцию ``Bake.beforeRender``:: - - on('Bake.beforeRender', function (Event $event) { - $view = $event->getSubject(); - - // Использовать $rows для основной переменной данных для индекса (index) - if ($view->get('pluralName')) { - $view->set('pluralName', 'rows'); - } - if ($view->get('pluralVar')) { - $view->set('pluralVar', 'rows'); - } - - // Используйте $theOne для основной переменной данных для просмотра/редактирования (view/edit) - if ($view->get('singularName')) { - $view->set('singularName', 'theOne'); - } - if ($view->get('singularVar')) { - $view->set('singularVar', 'theOne'); - } - - }); - -Вы также можете использовать события ``Bake.beforeRender`` и ``Bake.afterRender`` для -генерирования специфичного файла. Например, если вы хотите добавить определенные действия для -вашего UserController при генерации из файла **Controller/controller.twig**, -вы можете использовать следующее событие:: - - on( - 'Bake.beforeRender.Controller.controller', - function (Event $event) { - $view = $event->getSubject(); - if ($view->viewVars['name'] == 'Users') { - // добавим действия входа и выхода из системы в контроллер пользователей - $view->viewVars['actions'] = [ - 'login', - 'logout', - 'index', - 'view', - 'add', - 'edit', - 'delete' - ]; - } - } - ); - -При просмотре прослушивателей событий для конкретных шаблонов выпечки вы можете упростить -выпечку связанной логики событий и обеспечить обратные вызовы, которые легче тестировать. - -Синтаксис шаблона выпечки -========================= - -Файлы шаблонов Bake используют синтаксис шаблонизатора `Twig `__. - -Так, например, при выпечке такой оболочки: - -.. code-block:: bash - - bin/cake bake shell Foo - -Используемый шаблон (**vendor/cakephp/bake/src/Template/Bake/Shell/shell.twig**) -будет выглядеть так:: - - `` Bake шаблон закрывающего тега php - * ``<%=`` Bake шаблон php короткого php тега echo - * ``<%-`` Bake шаблон php открытия тега, удаляющего любые введённые пробелы перед тегом - * ``-%>`` Bake шаблон php закрытия тега, любые введённые пробелы после тега - -.. _creating-a-bake-theme: - -Создание темы Bake -================== - -Если вы хотите изменить результат, полученный командой "bake", вы можете -создать свою собственную тему('theme') для "bake", которая позволит вам заменить некоторые или все -шаблоны, которые испекает bake. Лучше всего сделать это так: - -#. Выпечь новый плагин. Имя плагина - это название темы 'bake' -#. Создать новую диреткорию **plugins/[name]/src/Template/Bake/Template/**. -#. Скопируйте любые шаблоны, которые вы хотите переопределить - **vendor/cakephp/bake/src/Template/Bake/Template** для сопоставления файлов с вашим плагином. -#. При запуске выпечки используйте параметр ``--theme``, чтобы указать тему выпечки которую вы - хотите использовать. Чтобы избежать необходимости указывать этот параметр в каждом вызове, вы также можете - настроить свою тему в качестве темы по умолчанию:: - - Test->classSuffixes[$this->name()])) { - $this->Test->classSuffixes[$this->name()] = 'Foo'; - } - - $name = ucfirst($this->name()); - if (!isset($this->Test->classTypes[$name])) { - $this->Test->classTypes[$name] = 'Foo'; - } - - return parent::bakeTest($className); - } - -* **Суффикс класса** будет добавлен к имени, указанному в вашем вызове ``bake``. - В предыдущем примере он создал бы файл ``ExampleFooTest.php``. - -* **Тип файла** будет использовать пространство под-пространство имён(sub-namespace), которое приведёт к файлу (относительно приложения или подключаемого модуля). В предыдущем примере, он создаст ваш тест с пространством имен ``App\Test\TestCase\Foo``. - -.. meta:: - :title lang=ru: Расширение возможностей Bake - :keywords lang=ru: интерфейс командной строки, разработка, выпечка, синтаксис шаблона выпечки, твинг, метки erb, процентные теги diff --git a/app/vendor/cakephp/bake/docs/ru/index.md b/app/vendor/cakephp/bake/docs/ru/index.md new file mode 100644 index 000000000..d330e7319 --- /dev/null +++ b/app/vendor/cakephp/bake/docs/ru/index.md @@ -0,0 +1,23 @@ +# Консоль Bake + +Консоль Bake для CakePHP помогает быстро начать разработку. +Она может создать базовые компоненты CakePHP, включая models, behaviors, views, +helpers, controllers, components, test cases, fixtures и plugins. +Bake умеет создавать не только каркас приложения, но и полностью рабочую основу за считанные минуты. + +## Установка + +Перед тем как использовать Bake, убедитесь, что он установлен в вашем приложении. +Bake распространяется как отдельный плагин, который можно установить через Composer: + +```bash +composer require --dev cakephp/bake:~1.0 +``` + +Команда выше установит Bake как зависимость для разработки. +Это значит, что Bake не будет установлен при деплое на production. + +## Карта документации + +- [Генерация кода с помощью Bake](/ru/usage) описывает запуск CLI, список задач и темы Bake. +- [Расширение возможностей Bake](/ru/development) описывает события, шаблоны, темы и добавление собственных команд. diff --git a/app/vendor/cakephp/bake/docs/ru/index.rst b/app/vendor/cakephp/bake/docs/ru/index.rst deleted file mode 100644 index 0b9c1bc80..000000000 --- a/app/vendor/cakephp/bake/docs/ru/index.rst +++ /dev/null @@ -1,24 +0,0 @@ -Консоль Bake -############ - -Bake консоль CakePHP - это еще один инструмент для быстрой разработки на фреймворке CakePHP. -Консоль Bake может создать любой из базовых компонентов или все сразу: models, -behaviors, views, helpers, controllers, components, test cases, fixtures и plugins. -Речь идет не только о каркасе приложения: Bake консоль создает полностью функционирующее приложение всего за пару минут. - -Bake это естественный шаг для статической генерации кода. - -Установка -========= - -Перед тем, как использовать Bake, убедитесь, что он установлен в вашем приложении. -Bake это отдельный плагин и вы можете установить его с помощью Composer:: - - composer require --dev cakephp/bake:~1.0 - -Команда выше установит Bake в зависимости от разработки. -Это значит, что Bake не будет установлен, когда вы делаете деплой на продакшн сервер. - -.. meta:: - :title lang=ru: Консоль Bake - :keywords lang=ru: интерфейс командной строки,разработка,bake view, bake template syntax,erb tags,asp tags,percent tags diff --git a/app/vendor/cakephp/bake/docs/ru/usage.md b/app/vendor/cakephp/bake/docs/ru/usage.md new file mode 100644 index 000000000..97207aefd --- /dev/null +++ b/app/vendor/cakephp/bake/docs/ru/usage.md @@ -0,0 +1,117 @@ +# Генерация кода с помощью Bake + +Консоль Cake запускается с использованием PHP CLI. +Если у вас возникли проблемы с запуском скрипта, убедитесь, что: + +1. У вас установлен PHP CLI и включены нужные модули, например MySQL и `intl`. +2. Если хост базы данных указан как `localhost`, попробуйте `127.0.0.1`, потому что `localhost` может вызывать проблемы в PHP CLI. +3. В зависимости от того, как настроен ваш компьютер, вам может потребоваться выдать права на выполнение скрипта, чтобы запускать `bin/cake bake`. + +Перед запуском Bake вы должны убедиться, что у вас настроено хотя бы одно соединение с базой данных. + +При запуске без аргументов `bin/cake bake` выводит список доступных задач. +Вы должны увидеть что-то вроде: + +```bash +$ bin/cake bake + +Welcome to CakePHP v3.4.6 Console +--------------------------------------------------------------- +App : src +Path: /var/www/cakephp.dev/src/ +PHP : 5.6.20 +--------------------------------------------------------------- +The following commands can be used to generate skeleton code for your application. + +Available bake commands: + +- all +- behavior +- cell +- component +- controller +- fixture +- form +- helper +- mailer +- migration +- migration_diff +- migration_snapshot +- model +- plugin +- seed +- task +- template +- test + +By using `cake bake [name]` you can invoke a specific bake task. +``` + +Дополнительную информацию о задачах и доступных параметрах можно получить через `--help`: + +```bash +$ bin/cake bake --help + +Welcome to CakePHP v3.4.6 Console +--------------------------------------------------------------- +App : src +Path: /var/www/cakephp.dev/src/ +PHP : 5.6.20 +--------------------------------------------------------------- +The Bake script generates controllers, models and template files for +your application. If run with no command line arguments, Bake guides the +user through the class creation process. You can customize the +generation process by telling Bake where different parts of your +application are using command line arguments. + +Usage: +cake bake.bake [subcommand] [options] + +Subcommands: + +all Bake a complete MVC skeleton. +behavior Bake a behavior class file. +cell Bake a cell class file. +component Bake a component class file. +controller Bake a controller skeleton. +fixture Generate fixtures for use with the test suite. You + can use `bake fixture all` to bake all fixtures. +form Bake a form class file. +helper Bake a helper class file. +mailer Bake a mailer class file. +migration Bake migration class. +migration_diff Bake migration class. +migration_snapshot Bake migration snapshot class. +model Bake table and entity classes. +plugin Create the directory structure, AppController class + and testing setup for a new plugin. Can create + plugins in any of your bootstrapped plugin paths. +seed Bake seed class. +task Bake a task class file. +template Bake views for a controller, using built-in or + custom templates. +test Bake test case skeletons for classes. + +To see help on a subcommand use `cake bake.bake [subcommand] --help` + +Options: + +--connection, -c Database connection to use in conjunction with `bake + all`. (default: default) +--everything Bake a complete MVC skeleton, using all the available + tables. Usage: "bake all --everything" +--force, -f Force overwriting existing files without prompting. +--help, -h Display this help. +--plugin, -p Plugin to bake into. +--prefix Prefix to bake controllers and templates into. +--quiet, -q Enable quiet output. +--tablePrefix Table prefix to be used in models. +--theme, -t The theme to use when baking code. (choices: + Bake|Migrations) +--verbose, -v Enable verbose output. +``` + +## Темы Bake + +Параметр `theme` является общим для всех команд Bake и позволяет изменять файлы шаблонов, используемые при генерации. +Чтобы создать свои шаблоны, см. [Создание темы Bake](/ru/development#создание-темы-bake). diff --git a/app/vendor/cakephp/bake/docs/ru/usage.rst b/app/vendor/cakephp/bake/docs/ru/usage.rst deleted file mode 100644 index 128936141..000000000 --- a/app/vendor/cakephp/bake/docs/ru/usage.rst +++ /dev/null @@ -1,127 +0,0 @@ -Генерация кода с помощью Bake -############################# - -Консоль cake запускается с использованием PHP CLI (интерфейса командной строки). -Если у вас возникли проблемы с запуском скрипта, убедитесь, что: - -#. У вас установлен PHP CLI и что у него есть соответствующие включённые модули - (например: MySQL, intl). -#. У пользователей также могут быть проблемы, если хост базы данных является - 'localhost' вмеcто этого можно попробовать '127.0.0.1', поскольку localhost - может вызвать проблемы с PHP CLI. -#. В зависимости от того, как настроен ваш компьютер, вам может потребоваться - установить права выполнения на скрипт bash, чтобы вызвать его, используя - ``bin/cake bake``. - -Перед запуском bake вы должны убедиться, что у вас есть хотя бы одна база данных и -соединение настроено. - -При запуске без аргументов ``bin/cake bake`` выводит список доступных -заданий. Вы должны увидеть что-то вроде:: - - $ bin/cake bake - - Welcome to CakePHP v3.4.6 Console - --------------------------------------------------------------- - App : src - Path: /var/www/cakephp.dev/src/ - PHP : 5.6.20 - --------------------------------------------------------------- - The following commands can be used to generate skeleton code for your application. - - Available bake commands: - - - all - - behavior - - cell - - component - - controller - - fixture - - form - - helper - - mailer - - migration - - migration_diff - - migration_snapshot - - model - - plugin - - seed - - task - - template - - test - - By using `cake bake [name]` you can invoke a specific bake task. - -Вы можете получить больше дополнительной информации о том, что делает каждая задача, и какие параметры -доступны, если используете ключ ``--help``:: - - $ bin/cake bake --help - - Welcome to CakePHP v3.4.6 Console - --------------------------------------------------------------- - App : src - Path: /var/www/cakephp.dev/src/ - PHP : 5.6.20 - --------------------------------------------------------------- - The Bake script generates controllers, models and template files for - your application. If run with no command line arguments, Bake guides the - user through the class creation process. You can customize the - generation process by telling Bake where different parts of your - application are using command line arguments. - - Usage: - cake bake.bake [subcommand] [options] - - Subcommands: - - all Bake a complete MVC skeleton. - behavior Bake a behavior class file. - cell Bake a cell class file. - component Bake a component class file. - controller Bake a controller skeleton. - fixture Generate fixtures for use with the test suite. You - can use `bake fixture all` to bake all fixtures. - form Bake a form class file. - helper Bake a helper class file. - mailer Bake a mailer class file. - migration Bake migration class. - migration_diff Bake migration class. - migration_snapshot Bake migration snapshot class. - model Bake table and entity classes. - plugin Create the directory structure, AppController class - and testing setup for a new plugin. Can create - plugins in any of your bootstrapped plugin paths. - seed Bake seed class. - task Bake a task class file. - template Bake views for a controller, using built-in or - custom templates. - test Bake test case skeletons for classes. - - To see help on a subcommand use `cake bake.bake [subcommand] --help` - - Options: - - --connection, -c Database connection to use in conjunction with `bake - all`. (default: default) - --everything Bake a complete MVC skeleton, using all the available - tables. Usage: "bake all --everything" - --force, -f Force overwriting existing files without prompting. - --help, -h Display this help. - --plugin, -p Plugin to bake into. - --prefix Prefix to bake controllers and templates into. - --quiet, -q Enable quiet output. - --tablePrefix Table prefix to be used in models. - --theme, -t The theme to use when baking code. (choices: - Bake|Migrations) - --verbose, -v Enable verbose output. - -Темы Bake -========= - -Параметр темы является общим для всех команд bake, так же bake позволяет изменять -файлы шаблонов, используемые при 'выпечке'. Чтобы создать свои собственные шаблоны см. -:ref:`документация по созданию темы`. - -.. meta:: - :title lang=ru: Генерация кода с помощью Bake - :keywords lang=en: command line interface,functional application,database,database configuration,bash script,basic ingredients,project,model,path path,code generation,scaffolding,windows users,configuration file,few minutes,config,view,models,running,mysql diff --git a/app/vendor/cakephp/bake/phpcs.xml b/app/vendor/cakephp/bake/phpcs.xml index d17484779..16a351cd6 100644 --- a/app/vendor/cakephp/bake/phpcs.xml +++ b/app/vendor/cakephp/bake/phpcs.xml @@ -1,12 +1,15 @@ - src/ tests/ + + + + */comparisons/* tests/test_app/* diff --git a/app/vendor/cakephp/bake/phpstan.neon b/app/vendor/cakephp/bake/phpstan.neon index 32434594a..49655075a 100644 --- a/app/vendor/cakephp/bake/phpstan.neon +++ b/app/vendor/cakephp/bake/phpstan.neon @@ -2,10 +2,10 @@ includes: - phpstan-baseline.neon parameters: - level: 6 - paths: - - src/ - bootstrapFiles: - - tests/bootstrap.php - ignoreErrors: - - identifier: missingType.iterableValue + level: 8 + paths: + - src/ + bootstrapFiles: + - tests/bootstrap.php + ignoreErrors: + - identifier: missingType.iterableValue diff --git a/app/vendor/cakephp/bake/rector.php b/app/vendor/cakephp/bake/rector.php new file mode 100644 index 000000000..1aaa408d3 --- /dev/null +++ b/app/vendor/cakephp/bake/rector.php @@ -0,0 +1,81 @@ +withPaths([ + __DIR__ . '/src', + __DIR__ . '/tests', + ]) + + ->withCache( + cacheClass: FileCacheStorage::class, + cacheDirectory: $cacheDir, + ) + + ->withPhpSets() + ->withAttributesSets() + + ->withSets([ + SetList::CODE_QUALITY, + SetList::CODING_STYLE, + SetList::DEAD_CODE, + SetList::EARLY_RETURN, + SetList::INSTANCEOF, + SetList::TYPE_DECLARATION, + ]) + + ->withSkip([ + __DIR__ . '/tests/comparisons', + __DIR__ . '/tests/test_app', + + ClassPropertyAssignToConstructorPromotionRector::class, + CatchExceptionNameMatchingTypeRector::class, + ClosureToArrowFunctionRector::class, + RemoveUselessReturnTagRector::class, + ReturnTypeFromStrictFluentReturnRector::class, + NewlineAfterStatementRector::class, + StringClassNameToClassConstantRector::class, + ReturnTypeFromStrictTypedCallRector::class, + ParamTypeByMethodCallTypeRector::class, + AddFunctionVoidReturnTypeWhereNoReturnRector::class, + StringableForToStringRector::class, + CompactToVariablesRector::class, + SplitDoubleAssignRector::class, + ChangeOrIfContinueToMultiContinueRector::class, + ExplicitBoolCompareRector::class, + NewlineBeforeNewAssignSetRector::class, + SimplifyEmptyCheckOnEmptyArrayRector::class, + DisallowedEmptyRuleFixerRector::class, + EncapsedStringsToSprintfRector::class, + + // these causes problems with the testsuite + UseClassKeywordForClassNameResolutionRector::class, + FunctionFirstClassCallableRector::class, + ]); diff --git a/app/vendor/cakephp/bake/src/BakePlugin.php b/app/vendor/cakephp/bake/src/BakePlugin.php index 0b02eaad3..e2ce6b656 100644 --- a/app/vendor/cakephp/bake/src/BakePlugin.php +++ b/app/vendor/cakephp/bake/src/BakePlugin.php @@ -26,7 +26,6 @@ use Cake\Http\BaseApplication; use DirectoryIterator; use ReflectionClass; -use ReflectionException; /** * Plugin class for bake @@ -35,15 +34,11 @@ class BakePlugin extends BasePlugin { /** * Plugin name. - * - * @var string|null */ protected ?string $name = 'Bake'; /** * Load routes or not - * - * @var bool */ protected bool $routesEnabled = false; @@ -96,13 +91,13 @@ protected function discoverCommands(CommandCollection $commands): CommandCollect $pluginPath = $plugin->getClassPath(); $found = $this->findInPath($namespace, $pluginPath); - if (count($found)) { + if ($found !== []) { $commands->addMany($found); } } $found = $this->findInPath(Configure::read('App.namespace'), APP); - if (count($found)) { + if ($found !== []) { $commands->addMany($found); } @@ -140,11 +135,11 @@ protected function findInPath(string $namespace, string $path): array $class = $namespace . $item->getBasename('.php'); if (!$hasSubfolder) { - try { - $reflection = new ReflectionClass($class); - } catch (ReflectionException) { + if (!class_exists($class)) { continue; } + + $reflection = new ReflectionClass($class); if (!$reflection->isInstantiable() || !$reflection->isSubclassOf(BakeCommand::class)) { continue; } diff --git a/app/vendor/cakephp/bake/src/CodeGen/ClassBuilder.php b/app/vendor/cakephp/bake/src/CodeGen/ClassBuilder.php index 1cf858b1c..68e481e68 100644 --- a/app/vendor/cakephp/bake/src/CodeGen/ClassBuilder.php +++ b/app/vendor/cakephp/bake/src/CodeGen/ClassBuilder.php @@ -18,9 +18,6 @@ class ClassBuilder { - /** - * @var \Bake\CodeGen\ParsedClass|null - */ protected ?ParsedClass $parsedClass; /** @@ -50,7 +47,7 @@ public function getImplements(array $generated = []): array */ public function getUserConstants(array $generated = []): array { - if ($this->parsedClass === null) { + if (!$this->parsedClass instanceof ParsedClass) { return []; } @@ -65,7 +62,7 @@ public function getUserConstants(array $generated = []): array */ public function getUserProperties(array $generated = []): array { - if ($this->parsedClass === null) { + if (!$this->parsedClass instanceof ParsedClass) { return []; } @@ -80,7 +77,7 @@ public function getUserProperties(array $generated = []): array */ public function getUserFunctions(array $generated = []): array { - if ($this->parsedClass === null) { + if (!$this->parsedClass instanceof ParsedClass) { return []; } diff --git a/app/vendor/cakephp/bake/src/CodeGen/CodeParser.php b/app/vendor/cakephp/bake/src/CodeGen/CodeParser.php index c48c8eecb..d3cc0e508 100644 --- a/app/vendor/cakephp/bake/src/CodeGen/CodeParser.php +++ b/app/vendor/cakephp/bake/src/CodeGen/CodeParser.php @@ -18,6 +18,8 @@ use PhpParser\Error; use PhpParser\Node; +use PhpParser\Node\Identifier; +use PhpParser\Node\Name; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\GroupUse; use PhpParser\Node\Stmt\Namespace_; @@ -41,24 +43,12 @@ class CodeParser extends NodeVisitorAbstract */ protected const INDENT = ' '; - /** - * @var \PhpParser\Parser - */ protected Parser $parser; - /** - * @var \PhpParser\NodeTraverser - */ protected NodeTraverser $traverser; - /** - * @var string - */ protected string $fileText = ''; - /** - * @var array - */ protected array $parsed = []; /** @@ -81,7 +71,11 @@ public function parseFile(string $code): ?ParsedFile { $this->fileText = $code; try { - $this->traverser->traverse($this->parser->parse($code)); + $ast = $this->parser->parse($code); + if ($ast === null) { + return null; + } + $this->traverser->traverse($ast); } catch (Error $e) { throw new ParseException($e->getMessage(), null, $e); } @@ -172,7 +166,11 @@ public function enterNode(Node $node) throw new ParseException('Multiple constants per line are not supported, update your file'); } - $name = (string)current($constant->consts)->name; + $const = current($constant->consts); + if ($const === false) { + continue; + } + $name = (string)$const->name; $constants[$name] = $this->getNodeCode($constant); } @@ -182,7 +180,11 @@ public function enterNode(Node $node) throw new ParseException('Multiple properties per line are not supported, update your file'); } - $name = (string)current($property->props)->name; + $prop = current($property->props); + if ($prop === false) { + continue; + } + $name = (string)$prop->name; $properties[$name] = $this->getNodeCode($property); } @@ -192,7 +194,7 @@ public function enterNode(Node $node) $methods[$name] = $this->getNodeCode($method); } - $implements = array_map(function ($name) { + $implements = array_map(function (Name $name): string { return (string)$name; }, $node->implements); @@ -225,9 +227,8 @@ protected function getNodeCode(NodeAbstract $node): string $startPos = $node->getStartFilePos(); $endPos = $node->getEndFilePos(); - $code .= static::INDENT . substr($this->fileText, $startPos, $endPos - $startPos + 1); - return $code; + return $code . static::INDENT . substr($this->fileText, $startPos, $endPos - $startPos + 1); } /** @@ -243,13 +244,9 @@ protected function normalizeUse(UseItem $use, ?string $prefix = null): array } $alias = $use->alias; - if (!$alias) { + if (!$alias instanceof Identifier) { $last = strrpos($name, '\\', -1); - if ($last !== false) { - $alias = substr($name, strrpos($name, '\\', -1) + 1); - } else { - $alias = $name; - } + $alias = $last !== false ? substr($name, strrpos($name, '\\', -1) + 1) : $name; } return [(string)$alias, $name]; diff --git a/app/vendor/cakephp/bake/src/CodeGen/ColumnTypeExtractor.php b/app/vendor/cakephp/bake/src/CodeGen/ColumnTypeExtractor.php new file mode 100644 index 000000000..074cd530c --- /dev/null +++ b/app/vendor/cakephp/bake/src/CodeGen/ColumnTypeExtractor.php @@ -0,0 +1,244 @@ + + */ + protected array $columnTypes = []; + + protected bool $inInitialize = false; + + /** + * Constructor + */ + public function __construct() + { + $version = PhpVersion::fromComponents(8, 1); + $this->parser = (new ParserFactory())->createForVersion($version); + } + + /** + * Extracts column type mappings from initialize method code + * + * @param string $code The initialize method code + * @return array Map of column names to type expressions + */ + public function extract(string $code): array + { + $this->columnTypes = []; + $this->inInitialize = false; + + try { + // Wrap code in a dummy class if needed for parsing + $wrappedCode = "parser->parse($wrappedCode); + if ($ast === null) { + return []; + } + + $traverser = new NodeTraverser(); + $traverser->addVisitor($this); + $traverser->traverse($ast); + } catch (Exception) { + // If parsing fails, return empty array + return []; + } + + return $this->columnTypes; + } + + /** + * @inheritDoc + */ + public function enterNode(Node $node) + { + // Check if we're entering the initialize method + if ($node instanceof Node\Stmt\ClassMethod && $node->name->name === 'initialize') { + $this->inInitialize = true; + + return null; + } + + // Only process nodes within initialize method + if (!$this->inInitialize) { + return null; + } + + // Look for $this->getSchema()->setColumnType() calls + if ($node instanceof Expression && $node->expr instanceof MethodCall) { + $this->processMethodCall($node->expr); + } elseif ($node instanceof MethodCall) { + $this->processMethodCall($node); + } + + return null; + } + + /** + * @inheritDoc + */ + public function leaveNode(Node $node) + { + if ($node instanceof Node\Stmt\ClassMethod && $node->name->name === 'initialize') { + $this->inInitialize = false; + } + + return null; + } + + /** + * Process a method call to check if it's setColumnType + * + * @param \PhpParser\Node\Expr\MethodCall $methodCall The method call to process + * @return void + */ + protected function processMethodCall(MethodCall $methodCall): void + { + $isSetColumnTypeCall = $methodCall->name instanceof Node\Identifier + && $methodCall->name->name === 'setColumnType'; + $schemaCall = $methodCall->var; + $isSchemaMethodCall = $schemaCall instanceof MethodCall; + $hasEnoughArguments = count($methodCall->args) >= 2; + + if (!$isSetColumnTypeCall || !$isSchemaMethodCall || !$hasEnoughArguments) { + return; + } + + $isGetSchemaCall = $schemaCall->name instanceof Node\Identifier + && $schemaCall->name->name === 'getSchema'; + $isCalledOnThis = $schemaCall->var instanceof Variable + && $schemaCall->var->name === 'this'; + + if (!$isGetSchemaCall || !$isCalledOnThis) { + return; + } + + $columnArgNode = $methodCall->args[0]; + $typeArgNode = $methodCall->args[1]; + if (!$columnArgNode instanceof Node\Arg || !$typeArgNode instanceof Node\Arg) { + return; + } + + $columnArg = $columnArgNode->value; + $typeArg = $typeArgNode->value; + + $columnName = $this->getStringValue($columnArg); + if ($columnName === null) { + return; + } + + $typeExpression = $this->getTypeExpression($typeArg); + if ($typeExpression !== null) { + $this->columnTypes[$columnName] = $typeExpression; + } + } + + /** + * Get string value from a node + * + * @param \PhpParser\Node $node The node to extract string from + * @return string|null The string value or null + */ + protected function getStringValue(Node $node): ?string + { + if ($node instanceof Node\Scalar\String_) { + return $node->value; + } + + return null; + } + + /** + * Convert a type expression node to string representation + * + * @param \PhpParser\Node $node The type expression node + * @return string|null String representation of the type expression + */ + protected function getTypeExpression(Node $node): ?string + { + if ($node instanceof Node\Expr\StaticCall) { + $staticCall = $node; + $calledClass = $staticCall->class; + $calledMethod = $staticCall->name; + + $hasNamedClass = $calledClass instanceof Node\Name; + $hasIdentifierMethod = $calledMethod instanceof Node\Identifier; + if (!$hasNamedClass || !$hasIdentifierMethod) { + return null; + } + + $className = $calledClass->toString(); + $methodName = $calledMethod->name; + $isEnumTypeClass = $className === 'EnumType' || str_ends_with($className, '\\EnumType'); + $isFromMethod = $methodName === 'from'; + $hasArguments = $staticCall->args !== []; + if (!$isEnumTypeClass || !$isFromMethod || !$hasArguments) { + return null; + } + + $argNode = $staticCall->args[0]; + if (!$argNode instanceof Node\Arg) { + return null; + } + + $arg = $argNode->value; + if (!$arg instanceof Node\Expr\ClassConstFetch) { + return null; + } + + $enumClassNode = $arg->class; + $constantName = $arg->name; + $hasNamedEnumClass = $enumClassNode instanceof Node\Name; + $isClassConstant = $constantName instanceof Node\Identifier + && $constantName->name === 'class'; + if (!$hasNamedEnumClass || !$isClassConstant) { + return null; + } + + $enumClass = $enumClassNode->toString(); + + return 'EnumType::from(' . $enumClass . '::class)'; + } + + if ($node instanceof Node\Scalar\String_) { + return '"' . $node->value . '"'; + } + + return null; + } +} diff --git a/app/vendor/cakephp/bake/src/CodeGen/FileBuilder.php b/app/vendor/cakephp/bake/src/CodeGen/FileBuilder.php index 1aee4e15d..ece3c8b11 100644 --- a/app/vendor/cakephp/bake/src/CodeGen/FileBuilder.php +++ b/app/vendor/cakephp/bake/src/CodeGen/FileBuilder.php @@ -20,24 +20,12 @@ class FileBuilder { - /** - * @var \Cake\Console\ConsoleIo - */ protected ConsoleIo $io; - /** - * @var string - */ protected string $namespace; - /** - * @var \Bake\CodeGen\ParsedFile|null - */ protected ?ParsedFile $parsedFile; - /** - * @var \Bake\CodeGen\ClassBuilder - */ protected ClassBuilder $classBuilder; /** @@ -47,7 +35,7 @@ class FileBuilder */ public function __construct(ConsoleIo $io, string $namespace, ?ParsedFile $parsedFile = null) { - if ($parsedFile && $parsedFile->namespace !== $namespace) { + if ($parsedFile instanceof ParsedFile && $parsedFile->namespace !== $namespace) { throw new ParseException(sprintf( 'Existing namespace `%s` does not match expected namespace `%s`, cannot update existing file', $parsedFile->namespace, diff --git a/app/vendor/cakephp/bake/src/CodeGen/ImportHelper.php b/app/vendor/cakephp/bake/src/CodeGen/ImportHelper.php index 3b786ffd8..40308c90d 100644 --- a/app/vendor/cakephp/bake/src/CodeGen/ImportHelper.php +++ b/app/vendor/cakephp/bake/src/CodeGen/ImportHelper.php @@ -32,11 +32,7 @@ public static function normalize(array $imports): array foreach ($imports as $alias => $class) { if (is_int($alias)) { $last = strrpos($class, '\\', -1); - if ($last !== false) { - $alias = substr($class, strrpos($class, '\\', -1) + 1); - } else { - $alias = $class; - } + $alias = $last !== false ? substr($class, strrpos($class, '\\', -1) + 1) : $class; } $normalized[$alias] = $class; @@ -58,7 +54,7 @@ public static function merge(array $existing, array $imports, ?ConsoleIo $io = n $existing = static::normalize($existing); foreach (static::normalize($imports) as $alias => $class) { if (isset($existing[$alias]) && $existing[$alias] !== $class) { - if ($io) { + if ($io instanceof ConsoleIo) { $io->warning(sprintf( 'Import `%s` conflicts with existing import, discarding.', $class, @@ -68,8 +64,8 @@ public static function merge(array $existing, array $imports, ?ConsoleIo $io = n } $existingAlias = array_search($class, $existing, true); - if ($existingAlias !== false && $existingAlias != $alias) { - if ($io) { + if ($existingAlias !== false && $existingAlias !== $alias) { + if ($io instanceof ConsoleIo) { $io->warning(sprintf( 'Import `%s` conflicts with existing import, discarding.', $class, diff --git a/app/vendor/cakephp/bake/src/CodeGen/ParsedClass.php b/app/vendor/cakephp/bake/src/CodeGen/ParsedClass.php index dcb9ba9d3..28cad4ded 100644 --- a/app/vendor/cakephp/bake/src/CodeGen/ParsedClass.php +++ b/app/vendor/cakephp/bake/src/CodeGen/ParsedClass.php @@ -21,9 +21,6 @@ */ class ParsedClass { - /** - * @var string - */ public string $name; /** diff --git a/app/vendor/cakephp/bake/src/CodeGen/ParsedFile.php b/app/vendor/cakephp/bake/src/CodeGen/ParsedFile.php index 2abed81fd..185032bf6 100644 --- a/app/vendor/cakephp/bake/src/CodeGen/ParsedFile.php +++ b/app/vendor/cakephp/bake/src/CodeGen/ParsedFile.php @@ -21,9 +21,6 @@ */ class ParsedFile { - /** - * @var string - */ public string $namespace; /** @@ -41,9 +38,6 @@ class ParsedFile */ public array $constImports; - /** - * @var \Bake\CodeGen\ParsedClass - */ public ParsedClass $class; /** diff --git a/app/vendor/cakephp/bake/src/Command/AllCommand.php b/app/vendor/cakephp/bake/src/Command/AllCommand.php index 0c0465021..cd0a5993e 100644 --- a/app/vendor/cakephp/bake/src/Command/AllCommand.php +++ b/app/vendor/cakephp/bake/src/Command/AllCommand.php @@ -45,7 +45,7 @@ class AllCommand extends BakeCommand * @param \Cake\Console\ConsoleOptionParser $parser Option parser to update. * @return \Cake\Console\ConsoleOptionParser */ - public function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser + protected function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser { $parser = $this->_setCommonOptions($parser); @@ -124,16 +124,16 @@ public function execute(Arguments $args, ConsoleIo $io): ?int } $message = sprintf('Error generating %s for %s: %s', $commandName, $table, $e->getMessage()); - $io->err('' . $message . ''); + $io->error($message); $errors++; } } } if ($errors) { - $io->out(sprintf('Bake All completed, but with %s errors.', $errors), 1, ConsoleIo::NORMAL); + $io->warning(sprintf('Bake All completed, but with %s errors.', $errors)); } else { - $io->out('Bake All complete.', 1, ConsoleIo::NORMAL); + $io->success('Bake All complete.'); } return $errors ? static::CODE_ERROR : static::CODE_SUCCESS; diff --git a/app/vendor/cakephp/bake/src/Command/BakeCommand.php b/app/vendor/cakephp/bake/src/Command/BakeCommand.php index 930ac6b95..1c783b2e6 100644 --- a/app/vendor/cakephp/bake/src/Command/BakeCommand.php +++ b/app/vendor/cakephp/bake/src/Command/BakeCommand.php @@ -27,6 +27,7 @@ use Cake\Core\ConventionsTrait; use Cake\Event\Event; use Cake\Event\EventManager; +use Cake\ORM\Locator\TableLocator; use InvalidArgumentException; use function Cake\Core\pluginSplit; @@ -43,11 +44,25 @@ abstract class BakeCommand extends Command /** * The pathFragment appended to the plugin/app path. - * - * @var string */ protected string $pathFragment; + /** + * Initialize the command. + * + * @return void + */ + public function initialize(): void + { + parent::initialize(); + + $locator = $this->getTableLocator(); + if ($locator instanceof TableLocator) { + $locator->allowFallbackClass(true); + $this->setTableLocator($locator); + } + } + /** * Get the command name. * @@ -60,7 +75,7 @@ abstract class BakeCommand extends Command public static function defaultName(): string { $name = parent::defaultName(); - if (strpos($name, 'bake_') === 0) { + if (str_starts_with($name, 'bake_')) { $name = substr($name, 5); } @@ -95,13 +110,14 @@ protected function _getName(string $name): string */ protected function getPrefix(Arguments $args): string { + /** @var string|null $prefix */ $prefix = $args->getOption('prefix'); if (!$prefix) { return ''; } $parts = explode('/', $prefix); - return implode('/', array_map([$this, '_camelize'], $parts)); + return implode('/', array_map($this->_camelize(...), $parts)); } /** @@ -180,7 +196,7 @@ protected function deleteEmptyFile(string $path, ConsoleIo $io): void { if (file_exists($path)) { unlink($path); - $io->out(sprintf('Deleted `%s`', $path), 1, ConsoleIo::NORMAL); + $io->out(sprintf('Deleted `%s`', $path)); } } @@ -196,7 +212,7 @@ protected function deleteEmptyFile(string $path, ConsoleIo $io): void */ protected function isValidColumnName(string $name): bool { - return (bool)preg_match('/^[a-zA-Z_][a-zA-Z0-9_]*$/', $name); + return (bool)preg_match('/^[a-zA-Z_]\w*$/', $name); } /** @@ -208,7 +224,12 @@ protected function isValidColumnName(string $name): bool protected function parseFile(string $path): ?ParsedFile { if (file_exists($path)) { - return (new CodeParser())->parseFile(file_get_contents($path)); + $contents = file_get_contents($path); + if ($contents === false) { + return null; + } + + return (new CodeParser())->parseFile($contents); } return null; diff --git a/app/vendor/cakephp/bake/src/Command/BehaviorCommand.php b/app/vendor/cakephp/bake/src/Command/BehaviorCommand.php index 40968e9ea..c4a06a330 100644 --- a/app/vendor/cakephp/bake/src/Command/BehaviorCommand.php +++ b/app/vendor/cakephp/bake/src/Command/BehaviorCommand.php @@ -23,8 +23,6 @@ class BehaviorCommand extends SimpleBakeCommand { /** * Task name used in path generation. - * - * @var string */ public string $pathFragment = 'Model/Behavior/'; diff --git a/app/vendor/cakephp/bake/src/Command/CellCommand.php b/app/vendor/cakephp/bake/src/Command/CellCommand.php index 657e738b6..c0fb6dc5f 100644 --- a/app/vendor/cakephp/bake/src/Command/CellCommand.php +++ b/app/vendor/cakephp/bake/src/Command/CellCommand.php @@ -28,8 +28,6 @@ class CellCommand extends SimpleBakeCommand { /** * Task name used in path generation. - * - * @var string */ public string $pathFragment = 'View/Cell/'; @@ -87,7 +85,7 @@ public function templateData(Arguments $arguments): array * @param \Cake\Console\ConsoleIo $io The console io * @return void */ - public function bake(string $name, Arguments $args, ConsoleIo $io): void + protected function bake(string $name, Arguments $args, ConsoleIo $io): void { $this->bakeTemplate($name, $args, $io); @@ -116,7 +114,7 @@ protected function bakeTemplate(string $name, Arguments $args, ConsoleIo $io): v * @param \Cake\Console\ConsoleOptionParser $parser Parser instance * @return \Cake\Console\ConsoleOptionParser */ - public function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser + protected function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser { $parser = parent::buildOptionParser($parser); $parser->addOption('prefix', [ diff --git a/app/vendor/cakephp/bake/src/Command/CommandCommand.php b/app/vendor/cakephp/bake/src/Command/CommandCommand.php index 580508e19..8612f330c 100644 --- a/app/vendor/cakephp/bake/src/Command/CommandCommand.php +++ b/app/vendor/cakephp/bake/src/Command/CommandCommand.php @@ -26,8 +26,6 @@ class CommandCommand extends SimpleBakeCommand { /** * Task name used in path generation. - * - * @var string */ public string $pathFragment = 'Command/'; @@ -69,7 +67,7 @@ public function templateData(Arguments $arguments): array $data['command_name'] = Inflector::underscore(str_replace( '.', ' ', - $arguments->getArgument('name'), + $arguments->getArgument('name') ?? '', )); return $data; diff --git a/app/vendor/cakephp/bake/src/Command/CommandHelperCommand.php b/app/vendor/cakephp/bake/src/Command/CommandHelperCommand.php index 542ac1809..643ed758a 100644 --- a/app/vendor/cakephp/bake/src/Command/CommandHelperCommand.php +++ b/app/vendor/cakephp/bake/src/Command/CommandHelperCommand.php @@ -23,8 +23,6 @@ class CommandHelperCommand extends SimpleBakeCommand { /** * Task name used in path generation. - * - * @var string */ public string $pathFragment = 'Command/Helper/'; diff --git a/app/vendor/cakephp/bake/src/Command/ComponentCommand.php b/app/vendor/cakephp/bake/src/Command/ComponentCommand.php index 3adace9b7..af1bbe80f 100644 --- a/app/vendor/cakephp/bake/src/Command/ComponentCommand.php +++ b/app/vendor/cakephp/bake/src/Command/ComponentCommand.php @@ -23,8 +23,6 @@ class ComponentCommand extends SimpleBakeCommand { /** * Task name used in path generation. - * - * @var string */ public string $pathFragment = 'Controller/Component/'; diff --git a/app/vendor/cakephp/bake/src/Command/ControllerAllCommand.php b/app/vendor/cakephp/bake/src/Command/ControllerAllCommand.php index 113e90061..43ffb3ca4 100644 --- a/app/vendor/cakephp/bake/src/Command/ControllerAllCommand.php +++ b/app/vendor/cakephp/bake/src/Command/ControllerAllCommand.php @@ -30,9 +30,6 @@ class ControllerAllCommand extends BakeCommand { use LocatorAwareTrait; - /** - * @var \Bake\Command\ControllerCommand - */ protected ControllerCommand $controllerCommand; /** @@ -83,7 +80,7 @@ public function execute(Arguments $args, ConsoleIo $io): ?int * @param \Cake\Console\ConsoleOptionParser $parser The console option parser * @return \Cake\Console\ConsoleOptionParser */ - public function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser + protected function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser { $parser = $this->controllerCommand->buildOptionParser($parser); $parser diff --git a/app/vendor/cakephp/bake/src/Command/ControllerCommand.php b/app/vendor/cakephp/bake/src/Command/ControllerCommand.php index c78bc5df4..675a255ee 100644 --- a/app/vendor/cakephp/bake/src/Command/ControllerCommand.php +++ b/app/vendor/cakephp/bake/src/Command/ControllerCommand.php @@ -31,8 +31,6 @@ class ControllerCommand extends BakeCommand { /** * Path fragment for generated code. - * - * @var string */ public string $pathFragment = 'Controller/'; @@ -84,7 +82,7 @@ public function bake(string $controllerName, Arguments $args, ConsoleIo $io): vo $actions = ['index', 'view', 'add', 'edit', 'delete']; } if ($args->getOption('actions')) { - $actions = array_map('trim', explode(',', $args->getOption('actions'))); + $actions = array_map('trim', explode(',', (string)$args->getOption('actions'))); $actions = array_filter($actions); } if (!$args->getOption('actions') && Plugin::isLoaded('Authentication') && $controllerName === 'Users') { @@ -129,6 +127,12 @@ public function bake(string $controllerName, Arguments $args, ConsoleIo $io): vo $singularHumanName = $this->_singularHumanName($controllerName); $pluralHumanName = $this->_variableName($controllerName); + // Handle cases where singular and plural are identical (e.g., "news", "sheep") + // to avoid variable collisions in generated controller code + if ($singularName === $pluralName) { + $singularName .= 'Entity'; + } + $defaultModel = sprintf('%s\Model\Table\%sTable', $namespace, $controllerName); if (!class_exists($defaultModel)) { $defaultModel = null; @@ -221,12 +225,10 @@ public function getComponents(Arguments $args): array { $components = []; if ($args->getOption('components')) { - $components = explode(',', $args->getOption('components')); + $components = explode(',', (string)$args->getOption('components')); $components = array_values(array_filter(array_map('trim', $components))); - } else { - if (Plugin::isLoaded('Authorization')) { - $components[] = 'Authorization.Authorization'; - } + } elseif (Plugin::isLoaded('Authorization')) { + $components[] = 'Authorization.Authorization'; } return $components; @@ -242,7 +244,7 @@ public function getHelpers(Arguments $args): array { $helpers = []; if ($args->getOption('helpers')) { - $helpers = explode(',', $args->getOption('helpers')); + $helpers = explode(',', (string)$args->getOption('helpers')); $helpers = array_values(array_filter(array_map('trim', $helpers))); } @@ -255,7 +257,7 @@ public function getHelpers(Arguments $args): array * @param \Cake\Console\ConsoleOptionParser $parser The console option parser * @return \Cake\Console\ConsoleOptionParser */ - public function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser + protected function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser { $parser = $this->_setCommonOptions($parser); $parser->setDescription( diff --git a/app/vendor/cakephp/bake/src/Command/EntryCommand.php b/app/vendor/cakephp/bake/src/Command/EntryCommand.php index 87b9dd759..7f8490ad4 100644 --- a/app/vendor/cakephp/bake/src/Command/EntryCommand.php +++ b/app/vendor/cakephp/bake/src/Command/EntryCommand.php @@ -32,15 +32,11 @@ class EntryCommand extends Command implements CommandCollectionAwareInterface { /** * The command collection to get help on. - * - * @var \Cake\Console\CommandCollection */ protected CommandCollection $commands; /** * The HelpCommand to get help. - * - * @var \Cake\Console\Command\HelpCommand */ protected HelpCommand $help; @@ -82,7 +78,7 @@ public function run(array $argv, ConsoleIo $io): ?int $parser->argumentNames(), ); } catch (ConsoleException $e) { - $io->err('Error: ' . $e->getMessage()); + $io->error('Error: ' . $e->getMessage()); return static::CODE_ERROR; } @@ -109,14 +105,14 @@ public function execute(Arguments $args, ConsoleIo $io): ?int { if ($args->hasArgumentAt(0)) { $name = $args->getArgumentAt(0); - $io->err( - "Could not find bake command named `$name`." - . ' Run `bake --help` to get a list of commands.', + $io->error( + "Could not find bake command named `{$name}`." + . ' Run `bake --help` to get a list of commands.', ); return static::CODE_ERROR; } - $io->err('No command provided. Run `bake --help` to get a list of commands.'); + $io->warning('No command provided. Run `bake --help` to get a list of commands.'); return static::CODE_ERROR; } @@ -127,7 +123,7 @@ public function execute(Arguments $args, ConsoleIo $io): ?int * @param \Cake\Console\ConsoleOptionParser $parser The console option parser * @return \Cake\Console\ConsoleOptionParser */ - public function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser + protected function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser { $this->help = new HelpCommand(); $parser = $this->help->buildOptionParser($parser); @@ -139,12 +135,12 @@ public function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionPar ); $commands = []; foreach ($this->commands as $command => $class) { - if (substr($command, 0, 4) === 'bake') { + if (str_starts_with($command, 'bake')) { $parts = explode(' ', $command); // Remove `bake` array_shift($parts); - if (count($parts) === 0) { + if ($parts === []) { continue; } $commands[$command] = $class; diff --git a/app/vendor/cakephp/bake/src/Command/EnumCommand.php b/app/vendor/cakephp/bake/src/Command/EnumCommand.php index b1f02f039..5eee0d0ef 100644 --- a/app/vendor/cakephp/bake/src/Command/EnumCommand.php +++ b/app/vendor/cakephp/bake/src/Command/EnumCommand.php @@ -30,8 +30,6 @@ class EnumCommand extends SimpleBakeCommand { /** * Task name used in path generation. - * - * @var string */ public string $pathFragment = 'Model/Enum/'; @@ -92,7 +90,7 @@ public function templateData(Arguments $arguments): array * @param \Cake\Console\ConsoleOptionParser $parser The option parser to update. * @return \Cake\Console\ConsoleOptionParser */ - public function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser + protected function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser { $parser = $this->_setCommonOptions($parser); @@ -141,7 +139,7 @@ protected function formatCases(array $cases): array foreach ($cases as $case => $value) { $case = Inflector::camelize(Inflector::underscore($case)); if (is_string($value)) { - $value = '\'' . $value . '\''; + $value = "'" . $value . "'"; } $formatted[] = 'case ' . $case . ' = ' . $value . ';'; } diff --git a/app/vendor/cakephp/bake/src/Command/FixtureAllCommand.php b/app/vendor/cakephp/bake/src/Command/FixtureAllCommand.php index 83de359c3..241e7277c 100644 --- a/app/vendor/cakephp/bake/src/Command/FixtureAllCommand.php +++ b/app/vendor/cakephp/bake/src/Command/FixtureAllCommand.php @@ -44,7 +44,7 @@ public static function defaultName(): string * @param \Cake\Console\ConsoleOptionParser $parser The parser to update * @return \Cake\Console\ConsoleOptionParser */ - public function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser + protected function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser { $parser = $this->_setCommonOptions($parser); @@ -83,7 +83,7 @@ public function execute(Arguments $args, ConsoleIo $io): ?int $this->extractCommonProperties($args); /** @var \Cake\Database\Connection $connection */ - $connection = ConnectionManager::get($args->getOption('connection') ?? 'default'); + $connection = ConnectionManager::get((string)($args->getOption('connection') ?: 'default')); $scanner = new TableScanner($connection); $fixture = new FixtureCommand(); diff --git a/app/vendor/cakephp/bake/src/Command/FixtureCommand.php b/app/vendor/cakephp/bake/src/Command/FixtureCommand.php index b461cef26..1ae33678d 100644 --- a/app/vendor/cakephp/bake/src/Command/FixtureCommand.php +++ b/app/vendor/cakephp/bake/src/Command/FixtureCommand.php @@ -62,7 +62,7 @@ public function getPath(Arguments $args): string * @param \Cake\Console\ConsoleOptionParser $parser Option parser to update. * @return \Cake\Console\ConsoleOptionParser */ - public function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser + protected function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser { $parser = $this->_setCommonOptions($parser); @@ -122,7 +122,7 @@ public function execute(Arguments $args, ConsoleIo $io): ?int return static::CODE_SUCCESS; } - $table = $args->getOption('table') ?? ''; + $table = (string)$args->getOption('table'); $model = $this->_camelize($name); $this->bake($model, $table, $args, $io); @@ -163,7 +163,7 @@ protected function bake(string $model, string $useTable, Arguments $args, Consol try { $data = $this->readSchema($model, $useTable); - } catch (CakeException $e) { + } catch (CakeException) { $this->getTableLocator()->remove($model); $useTable = Inflector::underscore($model); $table = $useTable; @@ -269,7 +269,7 @@ public function generateFixtureFile(Arguments $args, ConsoleIo $io, string $mode ->set($vars) ->generate('Bake.tests/fixture'); - $io->out("\n" . sprintf('Baking test fixture for %s...', $model), 1, ConsoleIo::NORMAL); + $io->out("\n" . sprintf('Baking test fixture for %s...', $model)); $io->createFile($path . $filename, $contents, $this->force); $emptyFile = $path . '.gitkeep'; $this->deleteEmptyFile($emptyFile, $io); @@ -285,19 +285,22 @@ protected function _generateSchema(TableSchemaInterface $table): string { $cols = $indexes = $constraints = []; foreach ($table->columns() as $field) { + /** @var array $fieldData */ $fieldData = $table->getColumn($field); $properties = implode(', ', $this->_values($fieldData)); - $cols[] = " '$field' => [$properties],"; + $cols[] = " '{$field}' => [{$properties}],"; } foreach ($table->indexes() as $index) { + /** @var array $fieldData */ $fieldData = $table->getIndex($index); $properties = implode(', ', $this->_values($fieldData)); - $indexes[] = " '$index' => [$properties],"; + $indexes[] = " '{$index}' => [{$properties}],"; } foreach ($table->constraints() as $index) { + /** @var array $fieldData */ $fieldData = $table->getConstraint($index); $properties = implode(', ', $this->_values($fieldData)); - $constraints[] = " '$index' => [$properties],"; + $constraints[] = " '{$index}' => [{$properties}],"; } $options = $this->_values($table->getOptions()); @@ -315,7 +318,7 @@ protected function _generateSchema(TableSchemaInterface $table): string $content .= " '_options' => [\n" . implode(",\n", $options) . "\n ],\n"; } - return "[\n$content ]"; + return "[\n{$content} ]"; } /** @@ -336,11 +339,7 @@ protected function _values(array $values): array if ($val === 'NULL') { $val = 'null'; } - if (!is_numeric($key)) { - $vals[] = "'{$key}' => {$val}"; - } else { - $vals[] = "{$val}"; - } + $vals[] = is_numeric($key) ? "{$val}" : "'{$key}' => {$val}"; } } @@ -360,6 +359,7 @@ protected function _generateRecords(TableSchemaInterface $table, int $recordCoun for ($i = 0; $i < $recordCount; $i++) { $record = []; foreach ($table->columns() as $field) { + /** @var array $fieldInfo */ $fieldInfo = $table->getColumn($field); $insert = ''; switch ($fieldInfo['type']) { @@ -421,7 +421,7 @@ protected function _generateRecords(TableSchemaInterface $table, int $recordCoun $insert = Text::uuid(); break; } - if (str_starts_with($fieldInfo['type'], 'enum-')) { + if (str_starts_with((string)$fieldInfo['type'], 'enum-')) { $insert = null; if ($fieldInfo['default'] || $fieldInfo['null'] === false) { $dbType = TypeFactory::build($fieldInfo['type']); diff --git a/app/vendor/cakephp/bake/src/Command/FormCommand.php b/app/vendor/cakephp/bake/src/Command/FormCommand.php index af9382591..95b680e8c 100644 --- a/app/vendor/cakephp/bake/src/Command/FormCommand.php +++ b/app/vendor/cakephp/bake/src/Command/FormCommand.php @@ -23,8 +23,6 @@ class FormCommand extends SimpleBakeCommand { /** * Task name used in path generation. - * - * @var string */ public string $pathFragment = 'Form/'; diff --git a/app/vendor/cakephp/bake/src/Command/HelperCommand.php b/app/vendor/cakephp/bake/src/Command/HelperCommand.php index 41a749558..81c43f5f4 100644 --- a/app/vendor/cakephp/bake/src/Command/HelperCommand.php +++ b/app/vendor/cakephp/bake/src/Command/HelperCommand.php @@ -23,8 +23,6 @@ class HelperCommand extends SimpleBakeCommand { /** * Task name used in path generation. - * - * @var string */ public string $pathFragment = 'View/Helper/'; diff --git a/app/vendor/cakephp/bake/src/Command/MailerCommand.php b/app/vendor/cakephp/bake/src/Command/MailerCommand.php index beba98758..6cd9d187e 100644 --- a/app/vendor/cakephp/bake/src/Command/MailerCommand.php +++ b/app/vendor/cakephp/bake/src/Command/MailerCommand.php @@ -26,8 +26,6 @@ class MailerCommand extends SimpleBakeCommand { /** * Task name used in path generation. - * - * @var string */ public string $pathFragment = 'Mailer/'; @@ -63,7 +61,7 @@ public function template(): string * @param \Cake\Console\ConsoleIo $io The console io * @return void */ - public function bake(string $name, Arguments $args, ConsoleIo $io): void + protected function bake(string $name, Arguments $args, ConsoleIo $io): void { parent::bake($name, $args, $io); } diff --git a/app/vendor/cakephp/bake/src/Command/MiddlewareCommand.php b/app/vendor/cakephp/bake/src/Command/MiddlewareCommand.php index 9d376cd45..499c579b4 100644 --- a/app/vendor/cakephp/bake/src/Command/MiddlewareCommand.php +++ b/app/vendor/cakephp/bake/src/Command/MiddlewareCommand.php @@ -23,8 +23,6 @@ class MiddlewareCommand extends SimpleBakeCommand { /** * Task name used in path generation. - * - * @var string */ public string $pathFragment = 'Middleware/'; diff --git a/app/vendor/cakephp/bake/src/Command/ModelAllCommand.php b/app/vendor/cakephp/bake/src/Command/ModelAllCommand.php index a65f696cd..2bbae1a72 100644 --- a/app/vendor/cakephp/bake/src/Command/ModelAllCommand.php +++ b/app/vendor/cakephp/bake/src/Command/ModelAllCommand.php @@ -30,9 +30,6 @@ class ModelAllCommand extends BakeCommand { use LocatorAwareTrait; - /** - * @var \Bake\Command\ModelCommand - */ protected ModelCommand $modelCommand; /** @@ -60,7 +57,7 @@ public function initialize(): void * @param \Cake\Console\ConsoleOptionParser $parser The parser to configure * @return \Cake\Console\ConsoleOptionParser */ - public function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser + protected function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser { $parser = $this->modelCommand->buildOptionParser($parser); $parser diff --git a/app/vendor/cakephp/bake/src/Command/ModelCommand.php b/app/vendor/cakephp/bake/src/Command/ModelCommand.php index 48c45204a..26e06102f 100644 --- a/app/vendor/cakephp/bake/src/Command/ModelCommand.php +++ b/app/vendor/cakephp/bake/src/Command/ModelCommand.php @@ -16,7 +16,9 @@ */ namespace Bake\Command; +use Bake\CodeGen\ColumnTypeExtractor; use Bake\CodeGen\FileBuilder; +use Bake\CodeGen\ParsedFile; use Bake\Utility\Model\EnumParser; use Bake\Utility\TableScanner; use Cake\Console\Arguments; @@ -44,8 +46,6 @@ class ModelCommand extends BakeCommand { /** * path to Model directory - * - * @var string */ public string $pathFragment = 'Model/'; @@ -53,8 +53,6 @@ class ModelCommand extends BakeCommand * Table prefix * * Can be replaced in application subclasses if necessary - * - * @var string */ public string $tablePrefix = ''; @@ -256,9 +254,7 @@ public function getAssociations(Table $table, Arguments $args, ConsoleIo $io): a $associations = $this->findHasMany($table, $associations); $associations = $this->findBelongsToMany($table, $associations); - $associations = $this->ensureAliasUniqueness($associations); - - return $associations; + return $this->ensureAliasUniqueness($associations); } /** @@ -274,7 +270,7 @@ public function getAssociations(Table $table, Arguments $args, ConsoleIo $io): a */ public function applyAssociations(Table $model, array $associations): void { - if (get_class($model) !== Table::class) { + if ($model::class !== Table::class) { return; } @@ -314,7 +310,7 @@ public function getAssociationInfo(Table $table): array foreach ($table->associations() as $association) { /** @var \Cake\ORM\Association $association */ - $tableClass = get_class($association->getTarget()); + $tableClass = $association->getTarget()::class; if ($tableClass === Table::class) { $namespace = $appNamespace; @@ -324,7 +320,7 @@ public function getAssociationInfo(Table $table): array $namespace = $plugin; } - $namespace = str_replace('/', '\\', trim($namespace, '\\')); + $namespace = str_replace('/', '\\', trim((string)$namespace, '\\')); $tableClass = $namespace . '\Model\Table\\' . $className . 'Table'; } @@ -373,10 +369,10 @@ public function findBelongsTo(Table $model, array $associations, ?Arguments $arg $tables = $this->listAll(); // Check if association model could not be instantiated as a subclass but a generic Table instance instead if ( - get_class($associationTable) === Table::class && + $associationTable::class === Table::class && !in_array(Inflector::tableize($tmpModelName), $tables, true) ) { - $allowAliasRelations = $args && $args->getOption('skip-relation-check'); + $allowAliasRelations = $args instanceof Arguments && $args->getOption('skip-relation-check'); $found = $this->findTableReferencedBy($schema, $fieldName); if ($found) { $className = ($this->plugin ? $this->plugin . '.' : '') . Inflector::camelize($found); @@ -391,7 +387,8 @@ public function findBelongsTo(Table $model, array $associations, ?Arguments $arg if ($className && $className !== $tmpModelName) { $assoc['className'] = $className; } - if ($schema->getColumn($fieldName)['null'] === false) { + $columnInfo = $schema->getColumn($fieldName); + if ($columnInfo !== null && ($columnInfo['null'] ?? true) === false) { $assoc['joinType'] = 'INNER'; } } @@ -423,7 +420,7 @@ public function findTableReferencedBy(TableSchemaInterface $schema, string $keyF foreach ($schema->constraints() as $constraint) { $constraintInfo = $schema->getConstraint($constraint); - if (!in_array($keyField, $constraintInfo['columns'])) { + if (!in_array($keyField, $constraintInfo['columns'] ?? [])) { continue; } @@ -431,8 +428,8 @@ public function findTableReferencedBy(TableSchemaInterface $schema, string $keyF continue; } $length = $this->tablePrefix ? mb_strlen($this->tablePrefix) : 0; - if ($length > 0 && mb_substr($constraintInfo['references'][0], 0, $length) === $this->tablePrefix) { - return mb_substr($constraintInfo['references'][0], $length); + if ($length > 0 && mb_substr((string)$constraintInfo['references'][0], 0, $length) === $this->tablePrefix) { + return mb_substr((string)$constraintInfo['references'][0], $length); } return $constraintInfo['references'][0]; @@ -483,8 +480,9 @@ public function hasUniqueConstraintFor(TableSchemaInterface $schema, string $key foreach ($schema->constraints() as $constraint) { $constraintInfo = $schema->getConstraint($constraint); if ( - $constraintInfo['type'] === TableSchema::CONSTRAINT_UNIQUE && - $constraintInfo['columns'] === [$keyField] + $constraintInfo !== null && + ($constraintInfo['type'] ?? null) === TableSchema::CONSTRAINT_UNIQUE && + ($constraintInfo['columns'] ?? []) === [$keyField] ) { return true; } @@ -641,15 +639,15 @@ public function findBelongsToMany(Table $model, array $associations): array * * @param \Cake\ORM\Table $model The model to introspect. * @param \Cake\Console\Arguments $args CLI Arguments - * @return array|string|null + * @return array|string */ - public function getDisplayField(Table $model, Arguments $args): array|string|null + public function getDisplayField(Table $model, Arguments $args): array|string { if ($args->getOption('display-field')) { return (string)$args->getOption('display-field'); } - return $model->getDisplayField(); + return $model->getDisplayField() ?? []; } /** @@ -662,7 +660,7 @@ public function getDisplayField(Table $model, Arguments $args): array|string|nul public function getPrimaryKey(Table $model, Arguments $args): array { if ($args->getOption('primary-key')) { - $fields = explode(',', $args->getOption('primary-key')); + $fields = explode(',', (string)$args->getOption('primary-key')); return array_values(array_filter(array_map('trim', $fields))); } @@ -701,6 +699,7 @@ public function getEntityPropertySchema(Table $model): array $schema = $model->getSchema(); foreach ($schema->columns() as $column) { + /** @var array $columnSchema */ $columnSchema = $schema->getColumn($column); $properties[$column] = [ @@ -720,7 +719,7 @@ public function getEntityPropertySchema(Table $model): array if ($plugin !== null) { $namespace = $plugin; } - $namespace = str_replace('/', '\\', trim($namespace, '\\')); + $namespace = str_replace('/', '\\', trim((string)$namespace, '\\')); $entityClass = $this->_entityName($association->getTarget()->getAlias()); $entityClass = '\\' . $namespace . '\Model\Entity\\' . $entityClass; @@ -756,7 +755,7 @@ public function getFields(Table $table, Arguments $args): array|false|null return false; } if ($args->getOption('fields')) { - $fields = explode(',', $args->getOption('fields')); + $fields = explode(',', (string)$args->getOption('fields')); return array_values(array_filter(array_map('trim', $fields))); } @@ -785,7 +784,7 @@ public function getHiddenFields(Table $model, Arguments $args): array return []; } if ($args->getOption('hidden')) { - $fields = explode(',', $args->getOption('hidden')); + $fields = explode(',', (string)$args->getOption('hidden')); return array_values(array_filter(array_map('trim', $fields))); } @@ -890,9 +889,9 @@ public function fieldValidation( $rules['date'] = []; } elseif ($metaData['type'] === 'time') { $rules['time'] = []; - } elseif (strpos($metaData['type'], 'datetime') === 0) { + } elseif (str_starts_with((string)$metaData['type'], 'datetime')) { $rules['dateTime'] = []; - } elseif (strpos($metaData['type'], 'timestamp') === 0) { + } elseif (str_starts_with((string)$metaData['type'], 'timestamp')) { $rules['dateTime'] = []; } elseif ($metaData['type'] === 'inet') { $rules['ip'] = []; @@ -931,8 +930,9 @@ public function fieldValidation( } foreach ($schema->constraints() as $constraint) { + /** @var array $constraint */ $constraint = $schema->getConstraint($constraint); - if (!in_array($fieldName, $constraint['columns'], true) || count($constraint['columns']) > 1) { + if (!in_array($fieldName, $constraint['columns'] ?? [], true) || count($constraint['columns']) > 1) { continue; } @@ -1009,6 +1009,7 @@ public function getRules(Table $model, array $associations, Arguments $args): ar $uniqueConstraintsColumns = []; foreach ($schema->constraints() as $name) { + /** @var array $constraint */ $constraint = $schema->getConstraint($name); if ($constraint['type'] !== TableSchema::CONSTRAINT_UNIQUE) { continue; @@ -1027,11 +1028,22 @@ public function getRules(Table $model, array $associations, Arguments $args): ar } } - $uniqueRules[] = ['name' => 'isUnique', 'fields' => $constraintFields, 'options' => $options]; + $rule = ['name' => 'isUnique', 'fields' => $constraintFields, 'options' => $options]; + + // Add descriptive message for composite unique constraints + if (count($constraintFields) > 1) { + $rule['message'] = sprintf( + 'This combination of %s and %s already exists', + implode(', ', array_slice($constraintFields, 0, -1)), + end($constraintFields), + ); + } + + $uniqueRules[] = $rule; } $possiblyUniqueColumns = ['username', 'login']; - if (in_array($model->getAlias(), ['Users', 'Accounts'])) { + if (in_array($model->getAlias(), ['Users', 'Accounts'], true)) { $possiblyUniqueColumns[] = 'email'; } @@ -1115,7 +1127,7 @@ public function getCounterCache(Table $model): array try { $otherSchema = $otherModel->getSchema(); - } catch (DatabaseException $e) { + } catch (DatabaseException) { continue; } @@ -1146,7 +1158,7 @@ public function bakeEntity(Table $model, array $data, Arguments $args, ConsoleIo } $name = $this->_entityName($model->getAlias()); - $io->out("\n" . sprintf('Baking entity class for %s...', $name), 1, ConsoleIo::NORMAL); + $io->out("\n" . sprintf('Baking entity class for %s...', $name)); $namespace = Configure::read('App.namespace'); $pluginPath = ''; @@ -1198,7 +1210,7 @@ public function bakeTable(Table $model, array $data, Arguments $args, ConsoleIo } $name = $model->getAlias(); - $io->out("\n" . sprintf('Baking table class for %s...', $name), 1, ConsoleIo::NORMAL); + $io->out("\n" . sprintf('Baking table class for %s...', $name)); $namespace = Configure::read('App.namespace'); $pluginPath = ''; @@ -1210,11 +1222,24 @@ public function bakeTable(Table $model, array $data, Arguments $args, ConsoleIo $filename = $path . 'Table' . DS . $name . 'Table.php'; $parsedFile = null; + $customColumnTypes = []; if ($args->getOption('update')) { $parsedFile = $this->parseFile($filename); + // Extract custom column types from existing file + if ($parsedFile instanceof ParsedFile && isset($parsedFile->class->methods['initialize'])) { + $customColumnTypes = $this->extractCustomColumnTypes($parsedFile->class->methods['initialize']); + } } $entity = $this->_entityName($model->getAlias()); + $enums = $this->enums($model, $entity, $namespace); + + // Merge custom column types with generated enums + // Remove custom types that are now handled by enums + foreach ($enums as $field => $enumClass) { + unset($customColumnTypes[$field]); + } + $data += [ 'plugin' => $this->plugin, 'pluginPath' => $pluginPath, @@ -1228,7 +1253,8 @@ public function bakeTable(Table $model, array $data, Arguments $args, ConsoleIo 'validation' => [], 'rulesChecker' => [], 'behaviors' => [], - 'enums' => $this->enums($model, $entity, $namespace), + 'enums' => $enums, + 'customColumnTypes' => $customColumnTypes, 'connection' => $this->connection, 'fileBuilder' => new FileBuilder($io, "{$namespace}\Model\Table", $parsedFile), ]; @@ -1237,7 +1263,7 @@ public function bakeTable(Table $model, array $data, Arguments $args, ConsoleIo ->set($data) ->generate('Bake.Model/table'); - $this->writefile($io, $filename, $contents, $this->force); + $this->writeFile($io, $filename, $contents, $this->force); // Work around composer caching that classes/files do not exist. // Check for the file as it might not exist in tests. @@ -1307,7 +1333,7 @@ public function getTable(string $name, Arguments $args): string * @param \Cake\Console\ConsoleOptionParser $parser The parser to configure * @return \Cake\Console\ConsoleOptionParser */ - public function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser + protected function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser { $parser = $this->_setCommonOptions($parser); @@ -1318,7 +1344,7 @@ public function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionPar 'You can use Plugin.name to bake plugin models.', ])->addOption('update', [ 'boolean' => true, - 'help' => 'Update generated methods in existing files. If the file doesn\'t exist it will be created.', + 'help' => "Update generated methods in existing files. If the file doesn't exist it will be created.", ])->addOption('table', [ 'help' => 'The table name to use if you have non-conventional table names.', ])->addOption('no-entity', [ @@ -1418,9 +1444,6 @@ public function bakeTest(string $className, Arguments $args, ConsoleIo $io): voi } /** - * @param \Cake\ORM\Table $table - * @param string $entity - * @param string $namespace * @return array */ protected function enums(Table $table, string $entity, string $namespace): array @@ -1442,7 +1465,6 @@ protected function enums(Table $table, string $entity, string $namespace): array } /** - * @param \Cake\Database\Schema\TableSchemaInterface $schema * @return array */ protected function possibleEnumFields(TableSchemaInterface $schema): array @@ -1450,8 +1472,9 @@ protected function possibleEnumFields(TableSchemaInterface $schema): array $fields = []; foreach ($schema->columns() as $column) { + /** @var array $columnSchema */ $columnSchema = $schema->getColumn($column); - if (str_starts_with($columnSchema['type'], 'enum-')) { + if (str_starts_with((string)$columnSchema['type'], 'enum-')) { $fields[] = $column; continue; @@ -1468,7 +1491,6 @@ protected function possibleEnumFields(TableSchemaInterface $schema): array } /** - * @param \Cake\Database\Schema\TableSchemaInterface $schema * @return array */ protected function getEnumDefinitions(TableSchemaInterface $schema): array @@ -1476,21 +1498,22 @@ protected function getEnumDefinitions(TableSchemaInterface $schema): array $enums = []; foreach ($schema->columns() as $column) { + /** @var array $columnSchema */ $columnSchema = $schema->getColumn($column); if ( !in_array($columnSchema['type'], ['string', 'integer', 'tinyinteger', 'smallinteger'], true) - && !str_starts_with($columnSchema['type'], 'enum-') + && !str_starts_with((string)$columnSchema['type'], 'enum-') ) { continue; } - if (empty($columnSchema['comment']) || !str_contains($columnSchema['comment'], '[enum]')) { + if (empty($columnSchema['comment']) || !str_contains((string)$columnSchema['comment'], '[enum]')) { continue; } $enumsDefinitionString = EnumParser::parseDefinitionString($columnSchema['comment']); $isInt = in_array($columnSchema['type'], ['integer', 'tinyinteger', 'smallinteger'], true); - if (str_starts_with($columnSchema['type'], 'enum-')) { + if (str_starts_with((string)$columnSchema['type'], 'enum-')) { $dbType = TypeFactory::build($columnSchema['type']); if ($dbType instanceof EnumType) { $class = $dbType->getEnumClassName(); @@ -1516,10 +1539,7 @@ protected function getEnumDefinitions(TableSchemaInterface $schema): array } /** - * @param \Cake\ORM\Table $model * @param array $data - * @param \Cake\Console\Arguments $args - * @param \Cake\Console\ConsoleIo $io * @return void */ protected function bakeEnums(Table $model, array $data, Arguments $args, ConsoleIo $io): void @@ -1593,4 +1613,17 @@ protected function createAssociationAlias(array $association): string return $this->_modelNameFromKey($foreignKey); } + + /** + * Extract custom column type mappings from existing initialize method + * + * @param string $initializeMethod The initialize method code + * @return array Map of column names to type expressions + */ + protected function extractCustomColumnTypes(string $initializeMethod): array + { + $extractor = new ColumnTypeExtractor(); + + return $extractor->extract($initializeMethod); + } } diff --git a/app/vendor/cakephp/bake/src/Command/PluginCommand.php b/app/vendor/cakephp/bake/src/Command/PluginCommand.php index 341f73e3d..73665d06e 100644 --- a/app/vendor/cakephp/bake/src/Command/PluginCommand.php +++ b/app/vendor/cakephp/bake/src/Command/PluginCommand.php @@ -38,8 +38,6 @@ class PluginCommand extends BakeCommand { /** * Plugin path. - * - * @var string */ public string $path; @@ -56,28 +54,28 @@ public function execute(Arguments $args, ConsoleIo $io): ?int { $name = $args->getArgument('name'); if (empty($name)) { - $io->err('You must provide a plugin name in CamelCase format.'); - $io->err('To make an "MyExample" plugin, run `cake bake plugin MyExample`.'); + $io->error('You must provide a plugin name in CamelCase format.'); + $io->out('To make an "MyExample" plugin, run `cake bake plugin MyExample`.'); return static::CODE_ERROR; } $parts = explode('/', $name); - $plugin = implode('/', array_map([Inflector::class, 'camelize'], $parts)); + $plugin = implode('/', array_map(Inflector::camelize(...), $parts)); if ($args->getOption('standalone-path')) { - $this->path = $args->getOption('standalone-path'); + $this->path = (string)$args->getOption('standalone-path'); $this->path = rtrim($this->path, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR; $this->isVendor = true; if (!is_dir($this->path)) { - $io->err(sprintf('Path `%s` does not exist.', $this->path)); + $io->error(sprintf('Path `%s` does not exist.', $this->path)); return static::CODE_ERROR; } } $pluginPath = $this->_pluginPath($plugin); - if (is_dir($pluginPath)) { + if (is_dir($pluginPath) && !$args->getOption('class-only')) { $io->out(sprintf('Plugin: %s already exists, no action taken', $plugin)); $io->out(sprintf('Path: %s', $pluginPath)); @@ -105,7 +103,8 @@ public function bake(string $plugin, Arguments $args, ConsoleIo $io): ?bool { if (!$this->isVendor) { $pathOptions = App::path('plugins'); - $this->path = current($pathOptions); + $currentPath = current($pathOptions); + $this->path = $currentPath !== false ? $currentPath : ''; if (count($pathOptions) > 1) { $this->findPath($pathOptions, $io); @@ -125,11 +124,18 @@ public function bake(string $plugin, Arguments $args, ConsoleIo $io): ?bool $this->_generateFiles($plugin, $this->path, $args, $io); if (!$this->isVendor) { - $this->_modifyApplication($plugin, $io); + if (!$args->getOption('class-only')) { + $this->_modifyApplication($plugin, $io); + } $composer = $this->findComposer($args, $io); + if ($composer === false) { + $io->error('Could not find composer executable.'); + $this->abort(); + } try { + /** @var non-empty-string $cwd */ $cwd = getcwd(); // Windows makes running multiple commands at once hard. @@ -198,7 +204,7 @@ protected function _generateFiles( $package = Inflector::dasherize($vendor) . '/' . Inflector::dasherize($name); $composerConfig = json_decode( - file_get_contents(ROOT . DS . 'composer.json'), + (string)file_get_contents(ROOT . DS . 'composer.json'), true, ); @@ -219,7 +225,7 @@ protected function _generateFiles( $paths = []; if ($args->hasOption('theme')) { - $paths[] = Plugin::templatePath($args->getOption('theme')); + $paths[] = Plugin::templatePath((string)$args->getOption('theme')); } $paths = array_merge($paths, Configure::read('App.paths.templates')); @@ -247,17 +253,23 @@ protected function _generateFiles( } } + if ($args->getOption('class-only')) { + $files = array_filter($files, function ($file): bool { + return $file->getFilename() === 'Plugin.php.twig'; + }); + } + $templates = array_keys($files); } } while (!$templates); sort($templates); foreach ($templates as $template) { - $template = substr($template, strrpos($template, 'Plugin' . DIRECTORY_SEPARATOR) + 7, -4); + $template = substr((string)$template, strrpos((string)$template, 'Plugin' . DIRECTORY_SEPARATOR) + 7, -4); $template = rtrim($template, '.'); $filename = $template; - if ($filename === 'src/Plugin.php') { - $filename = 'src/' . $name . 'Plugin.php'; + if ($filename === 'src' . DIRECTORY_SEPARATOR . 'Plugin.php') { + $filename = 'src' . DIRECTORY_SEPARATOR . $name . 'Plugin.php'; } $this->_generateFile($renderer, $template, $root, $filename, $io); } @@ -346,7 +358,7 @@ public function findPath(array $pathOptions, ConsoleIo $io): void * @param \Cake\Console\ConsoleOptionParser $parser The option parser * @return \Cake\Console\ConsoleOptionParser */ - public function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser + protected function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser { $parser->setDescription( 'Create the directory structure, AppController class and testing setup for a new plugin. ' . @@ -370,6 +382,10 @@ public function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionPar ->addOption('standalone-path', [ 'short' => 'p', 'help' => 'Generate a standalone plugin in the provided path.', + ])->addOption('class-only', [ + 'short' => 'c', + 'boolean' => true, + 'help' => 'Generate only the plugin class.', ]); return $parser; @@ -380,7 +396,7 @@ public function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionPar * * @param \Cake\Console\Arguments $args The command arguments. * @param \Cake\Console\ConsoleIo $io The console io - * @return string|bool Either the path to composer or false if it cannot be found. + * @return string|false Either the path to composer or false if it cannot be found. */ public function findComposer(Arguments $args, ConsoleIo $io): string|bool { @@ -392,7 +408,7 @@ public function findComposer(Arguments $args, ConsoleIo $io): string|bool } } $composer = false; - $path = env('PATH'); + $path = (string)env('PATH'); if (!empty($path)) { $paths = explode(PATH_SEPARATOR, $path); $composer = $this->_searchPath($paths, $io); @@ -406,7 +422,7 @@ public function findComposer(Arguments $args, ConsoleIo $io): string|bool * * @param array $path The paths to search. * @param \Cake\Console\ConsoleIo $io The console io - * @return string|bool + * @return string|false */ protected function _searchPath(array $path, ConsoleIo $io): string|bool { diff --git a/app/vendor/cakephp/bake/src/Command/SimpleBakeCommand.php b/app/vendor/cakephp/bake/src/Command/SimpleBakeCommand.php index 35527749a..a9667a226 100644 --- a/app/vendor/cakephp/bake/src/Command/SimpleBakeCommand.php +++ b/app/vendor/cakephp/bake/src/Command/SimpleBakeCommand.php @@ -78,7 +78,7 @@ public function execute(Arguments $args, ConsoleIo $io): ?int $this->extractCommonProperties($args); $name = $args->getArgumentAt(0); if (empty($name)) { - $io->err('You must provide a name to bake a ' . $this->name()); + $io->error('You must provide a name to bake a ' . $this->name()); $this->abort(); } $name = $this->_getName($name); @@ -135,7 +135,7 @@ public function bakeTest(string $className, Arguments $args, ConsoleIo $io): voi * @param \Cake\Console\ConsoleOptionParser $parser Option parser to update. * @return \Cake\Console\ConsoleOptionParser */ - public function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser + protected function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser { $parser = $this->_setCommonOptions($parser); $name = $this->name(); diff --git a/app/vendor/cakephp/bake/src/Command/TemplateAllCommand.php b/app/vendor/cakephp/bake/src/Command/TemplateAllCommand.php index 45e14ef10..0a1c72e5e 100644 --- a/app/vendor/cakephp/bake/src/Command/TemplateAllCommand.php +++ b/app/vendor/cakephp/bake/src/Command/TemplateAllCommand.php @@ -27,9 +27,6 @@ */ class TemplateAllCommand extends BakeCommand { - /** - * @var \Bake\Command\TemplateCommand - */ protected TemplateCommand $templateCommand; /** @@ -86,7 +83,7 @@ public function execute(Arguments $args, ConsoleIo $io): int * @param \Cake\Console\ConsoleOptionParser $parser The option parser to update. * @return \Cake\Console\ConsoleOptionParser */ - public function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser + protected function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser { $parser = $this->_setCommonOptions($parser); $parser diff --git a/app/vendor/cakephp/bake/src/Command/TemplateCommand.php b/app/vendor/cakephp/bake/src/Command/TemplateCommand.php index 558187ab9..b41707df3 100644 --- a/app/vendor/cakephp/bake/src/Command/TemplateCommand.php +++ b/app/vendor/cakephp/bake/src/Command/TemplateCommand.php @@ -39,22 +39,16 @@ class TemplateCommand extends BakeCommand { /** * Name of the controller being used - * - * @var string */ public string $controllerName; /** * Classname of the controller being used - * - * @var string */ public string $controllerClass; /** * Name with plugin of the model being used - * - * @var string */ public string $modelName; @@ -74,22 +68,16 @@ class TemplateCommand extends BakeCommand /** * AssociationFilter utility - * - * @var \Bake\Utility\Model\AssociationFilter|null */ protected ?AssociationFilter $_associationFilter = null; /** * Template path. - * - * @var string */ public string $path; /** * Output extension - * - * @var string */ public string $ext = 'php'; @@ -100,7 +88,17 @@ class TemplateCommand extends BakeCommand */ public function initialize(): void { - $this->path = current(App::path('templates')); + parent::initialize(); + + $templatePaths = App::path('templates'); + if ($templatePaths === []) { + throw new RuntimeException( + 'Could not read template paths. ' . + 'Ensure `App.paths.templates` is defined in your application configuration.', + ); + } + + $this->path = current($templatePaths); } /** @@ -130,8 +128,7 @@ public function execute(Arguments $args, ConsoleIo $io): ?int $template = $args->getArgument('template'); $action = $args->getArgument('action'); - $controller = $args->getOption('controller'); - $this->controller($args, $name, $controller); + $this->controller($args, $name, (string)$args->getOption('controller')); $this->model($name); if ($template && $action === null) { @@ -171,7 +168,7 @@ public function model(string $table): void $tableName = $this->_camelize($table); $plugin = $this->plugin; if ($plugin) { - $plugin = $plugin . '.'; + $plugin .= '.'; } $this->modelName = $plugin . $tableName; } @@ -213,9 +210,8 @@ public function controller(Arguments $args, string $table, ?string $controller = public function getTemplatePath(Arguments $args, ?string $container = null): string { $path = parent::getTemplatePath($args, $container); - $path .= $this->controllerName . DS; - return $path; + return $path . $this->controllerName . DS; } /** @@ -316,6 +312,12 @@ protected function _loadController(ConsoleIo $io): array $pluralVar = Inflector::variable($this->controllerName); $pluralHumanName = $this->_pluralHumanName($this->controllerName); + // Handle cases where singular and plural are identical (e.g., "news", "sheep") + // to avoid generating invalid code like `foreach ($news as $news)` + if ($singularVar === $pluralVar) { + $singularVar .= 'Entity'; + } + return compact( 'modelObject', 'modelClass', @@ -360,14 +362,14 @@ public function bake( } if (empty($content)) { // phpcs:ignore Generic.Files.LineLength - $io->err("No generated content for '{$template}.{$this->ext}', not generating template."); + $io->warning("No generated content for '{$template}.{$this->ext}', not generating template."); return; } $path = $this->getTemplatePath($args); $filename = $path . Inflector::underscore($outputFile) . '.' . $this->ext; - $io->out("\n" . sprintf('Baking `%s` view template file...', $outputFile), 1, ConsoleIo::NORMAL); + $io->out("\n" . sprintf('Baking `%s` view template file...', $outputFile)); $io->createFile($filename, $content, $this->force); } @@ -406,7 +408,7 @@ public function getContent(Arguments $args, ConsoleIo $io, string $action, ?arra } $renderer->set('indexColumns', $indexColumns); - return $renderer->generate("Bake.Template/$action"); + return $renderer->generate("Bake.Template/{$action}"); } /** @@ -415,7 +417,7 @@ public function getContent(Arguments $args, ConsoleIo $io, string $action, ?arra * @param \Cake\Console\ConsoleOptionParser $parser The option parser to update. * @return \Cake\Console\ConsoleOptionParser */ - public function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser + protected function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser { $parser = $this->_setCommonOptions($parser); @@ -448,7 +450,7 @@ public function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionPar */ protected function _filteredAssociations(Table $model): array { - if ($this->_associationFilter === null) { + if (!$this->_associationFilter instanceof AssociationFilter) { $this->_associationFilter = new AssociationFilter(); } diff --git a/app/vendor/cakephp/bake/src/Command/TestCommand.php b/app/vendor/cakephp/bake/src/Command/TestCommand.php index dd5e6c301..c62c4c191 100644 --- a/app/vendor/cakephp/bake/src/Command/TestCommand.php +++ b/app/vendor/cakephp/bake/src/Command/TestCommand.php @@ -55,6 +55,7 @@ class TestCommand extends BakeCommand 'Command' => 'Command', 'CommandHelper' => 'Command\Helper', 'Middleware' => 'Middleware', + 'Class' => '', ]; /** @@ -75,6 +76,7 @@ class TestCommand extends BakeCommand 'Command' => 'Command', 'CommandHelper' => 'Helper', 'Middleware' => 'Middleware', + 'Class' => '', ]; /** @@ -108,7 +110,7 @@ public function execute(Arguments $args, ConsoleIo $io): ?int return null; } - $type = $this->normalize($args->getArgument('type')); + $type = $this->normalize((string)$args->getArgument('type')); if ($args->getOption('all')) { $this->_bakeAll($type, $args, $io); @@ -120,11 +122,15 @@ public function execute(Arguments $args, ConsoleIo $io): ?int return null; } - $name = $args->getArgument('name'); + $name = (string)$args->getArgument('name'); $name = $this->_getName($name); - if ($this->bake($type, $name, $args, $io)) { - $io->out('Done'); + $result = $this->bake($type, $name, $args, $io); + if ($result === static::CODE_ERROR) { + return static::CODE_ERROR; + } + if ($result) { + $io->success('Done'); } return static::CODE_SUCCESS; @@ -143,7 +149,7 @@ protected function outputTypeChoices(ConsoleIo $io): void 2, ); $i = 0; - foreach ($this->classTypes as $option => $package) { + foreach (array_keys($this->classTypes) as $option) { $io->out(++$i . '. ' . $option); } $io->out(''); @@ -188,13 +194,13 @@ protected function _bakeAll(string $type, Arguments $args, ConsoleIo $io): void foreach ($classes as $class) { if ($this->bake($type, $class, $args, $io)) { - $io->out('Done - ' . $class . ''); + $io->success('Done - ' . $class); } else { - $io->out('Failed - ' . $class . ''); + $io->error('Failed - ' . $class); } } - $io->out('Bake finished'); + $io->info('Bake finished'); } /** @@ -212,10 +218,26 @@ protected function _getClassOptions(string $namespace): array } $path = $base . str_replace('\\', DS, $namespace); - $files = (new Filesystem())->find($path); - foreach ($files as $fileObj) { - if ($fileObj->isFile()) { - $classes[] = substr($fileObj->getFileName(), 0, -4) ?: ''; + + // For generic Class type (empty namespace), search recursively + if ($namespace === '') { + $files = (new Filesystem())->findRecursive($path, '/\.php$/'); + foreach ($files as $fileObj) { + if ($fileObj->isFile() && $fileObj->getFileName() !== 'Application.php') { + // Build the namespace path relative to App directory + /** @var string $relativePath */ + $relativePath = str_replace($base, '', $fileObj->getPath()); + $relativePath = trim(str_replace(DIRECTORY_SEPARATOR, '\\', $relativePath), '\\'); + $className = substr((string)$fileObj->getFileName(), 0, -4) ?: ''; + $classes[] = $relativePath ? $relativePath . '\\' . $className : $className; + } + } + } else { + $files = (new Filesystem())->find($path); + foreach ($files as $fileObj) { + if ($fileObj->isFile()) { + $classes[] = substr((string)$fileObj->getFileName(), 0, -4) ?: ''; + } } } sort($classes); @@ -230,26 +252,58 @@ protected function _getClassOptions(string $namespace): array * @param string $className the 'cake name' for the class ie. Posts for the PostsController * @param \Cake\Console\Arguments $args Arguments * @param \Cake\Console\ConsoleIo $io ConsoleIo instance - * @return string|bool + * @return string|bool|int Returns the generated code as string on success, false on failure, or CODE_ERROR for validation errors */ - public function bake(string $type, string $className, Arguments $args, ConsoleIo $io): string|bool + public function bake(string $type, string $className, Arguments $args, ConsoleIo $io): string|bool|int { $type = $this->normalize($type); if (!isset($this->classSuffixes[$type]) || !isset($this->classTypes[$type])) { return false; } + // For Class type, validate that backslashes are properly escaped + if ($type === 'Class' && !str_contains($className, '\\')) { + $io->error('Class name appears to have no namespace separators.'); + $io->out(''); + $io->out('If you meant to specify a namespaced class, please use quotes:'); + $io->out(" bin/cake bake test class '{$className}'"); + $io->out(''); + $io->out('Or specify without the base namespace:'); + $io->out(' bin/cake bake test class YourNamespace\ClassName'); + + return static::CODE_ERROR; + } + $prefix = $this->getPrefix($args); $fullClassName = $this->getRealClassName($type, $className, $prefix); + // For Class type, validate that the class exists + if ($type === 'Class' && !class_exists($fullClassName)) { + $io->error("Class '{$fullClassName}' does not exist or cannot be loaded."); + $io->out(''); + $io->out('Please check:'); + $io->out(' - The class file exists in the correct location'); + $io->out(' - The class is properly autoloaded'); + $io->out(' - The namespace and class name are correct'); + + return static::CODE_ERROR; + } + + // Check if fixture factories plugin is available + $hasFixtureFactories = $this->hasFixtureFactories(); + if (!$args->getOption('no-fixture')) { - if ($args->getOption('fixtures')) { - $fixtures = array_map('trim', explode(',', $args->getOption('fixtures'))); + if ($hasFixtureFactories) { + $io->info('Fixture Factories plugin detected - skipping fixture property generation.'); + } elseif ($args->getOption('fixtures')) { + $fixtures = array_map('trim', explode(',', (string)$args->getOption('fixtures'))); $this->_fixtures = array_filter($fixtures); } elseif ($this->typeCanDetectFixtures($type) && class_exists($fullClassName)) { $io->out('Bake is detecting possible fixtures...'); $testSubject = $this->buildTestSubject($type, $fullClassName); - $this->generateFixtureList($testSubject); + if ($testSubject instanceof Table || $testSubject instanceof Controller) { + $this->generateFixtureList($testSubject); + } } } @@ -261,14 +315,20 @@ public function bake(string $type, string $className, Arguments $args, ConsoleIo [$preConstruct, $construction, $postConstruct] = $this->generateConstructor($type, $fullClassName); $uses = $this->generateUses($type, $fullClassName); - $subject = $className; - [$namespace, $className] = namespaceSplit($fullClassName); + // For generic Class type, extract just the class name for the subject + if ($type === 'Class') { + [$namespace, $className] = namespaceSplit($fullClassName); + $subject = $className; + } else { + $subject = $className; + [$namespace, $className] = namespaceSplit($fullClassName); + } $baseNamespace = Configure::read('App.namespace'); if ($this->plugin) { $baseNamespace = $this->_pluginNamespace($this->plugin); } - $subNamespace = substr($namespace, strlen($baseNamespace) + 1); + $subNamespace = substr($namespace, strlen((string)$baseNamespace) + 1); $properties = $this->generateProperties($type, $subject, $fullClassName); @@ -277,6 +337,7 @@ public function bake(string $type, string $className, Arguments $args, ConsoleIo $contents = $this->createTemplateRenderer() ->set('fixtures', $this->_fixtures) ->set('plugin', $this->plugin) + ->set('hasFixtureFactories', $hasFixtureFactories) ->set(compact( 'subject', 'className', @@ -305,6 +366,17 @@ public function bake(string $type, string $className, Arguments $args, ConsoleIo return false; } + /** + * Check if the CakePHP Fixture Factories plugin is available + * + * @return bool + */ + protected function hasFixtureFactories(): bool + { + return class_exists('CakephpFixtureFactories\Plugin') + || class_exists('CakephpFixtureFactories\CakephpFixtureFactoriesPlugin'); + } + /** * Checks whether the chosen type can find its own fixtures. * Currently only model, and controller are supported @@ -364,9 +436,20 @@ public function getRealClassName(string $type, string $class, ?string $prefix = if ($this->plugin) { $namespace = str_replace('/', '\\', $this->plugin); } + + // For generic Class type, the class name contains the full subnamespace path + if ($type === 'Class') { + // Strip base namespace if user included it + if (str_starts_with($class, $namespace . '\\')) { + $class = substr($class, strlen((string)$namespace) + 1); + } + + return $namespace . '\\' . $class; + } + $suffix = $this->classSuffixes[$type]; $subSpace = $this->mapType($type); - if ($suffix && strpos($class, $suffix) === false) { + if ($suffix && !str_contains($class, $suffix)) { $class .= $suffix; } if (in_array($type, ['Controller', 'Cell'], true) && $prefix) { @@ -398,7 +481,7 @@ public function getSubspacePath(string $type): string */ public function mapType(string $type): string { - if (empty($this->classTypes[$type])) { + if (!isset($this->classTypes[$type])) { throw new CakeException('Invalid object type: ' . $type); } @@ -409,7 +492,7 @@ public function mapType(string $type): string * Get methods declared in the class given. * No parent methods will be returned * - * @param string $className Name of class to look at. + * @param class-string $className Name of class to look at. * @return array Array of method names. * @throws \ReflectionException */ @@ -462,9 +545,9 @@ protected function _processModel(Table $subject): void $assoc = $subject->getAssociation($alias); $target = $assoc->getTarget(); $name = $target->getAlias(); - $subjectClass = get_class($subject); + $subjectClass = $subject::class; - if ($subjectClass !== Table::class && $subjectClass === get_class($target)) { + if ($subjectClass !== Table::class && $subjectClass === $target::class) { continue; } if (!isset($this->_fixtures[$name])) { @@ -484,7 +567,7 @@ protected function _processController(Controller $subject): void { try { $model = $subject->fetchTable(); - } catch (UnexpectedValueException $exception) { + } catch (UnexpectedValueException) { // No fixtures needed or possible return; } @@ -505,11 +588,7 @@ protected function _processController(Controller $subject): void */ protected function _addFixture(string $name): void { - if ($this->plugin) { - $prefix = 'plugin.' . $this->plugin . '.'; - } else { - $prefix = 'app.'; - } + $prefix = $this->plugin ? 'plugin.' . $this->plugin . '.' : 'app.'; $fixture = $prefix . $this->_fixtureName($name); $this->_fixtures[$name] = $fixture; } @@ -568,6 +647,18 @@ public function generateConstructor(string $type, string $fullClassName): array $pre .= ' $this->io = new ConsoleIo($this->stub);'; $construct = "new {$className}(\$this->io);"; } + if ($type === 'Class') { + // Check if class has required constructor parameters + if (class_exists($fullClassName)) { + $reflection = new ReflectionClass($fullClassName); + $constructor = $reflection->getConstructor(); + if (!$constructor || $constructor->getNumberOfRequiredParameters() === 0) { + $construct = "new {$className}();"; + } + } else { + $construct = "new {$className}();"; + } + } return [$pre, $construct, $post]; } @@ -618,7 +709,17 @@ public function generateProperties(string $type, string $subject, string $fullCl break; } - if (!in_array($type, ['Controller', 'Command'])) { + // Skip test subject property for Controller, Command, and Class types with required constructor params + $skipProperty = in_array($type, ['Controller', 'Command'], true); + if ($type === 'Class' && class_exists($fullClassName)) { + $reflection = new ReflectionClass($fullClassName); + $constructor = $reflection->getConstructor(); + if ($constructor && $constructor->getNumberOfRequiredParameters() > 0) { + $skipProperty = true; + } + } + + if (!$skipProperty) { $properties[] = [ 'description' => 'Test subject', 'type' => '\\' . $fullClassName, @@ -665,12 +766,11 @@ public function generateUses(string $type, string $fullClassName): array public function getBasePath(): string { $dir = 'TestCase/'; - $path = defined('TESTS') ? TESTS . $dir : ROOT . DS . 'tests' . DS . $dir; if ($this->plugin) { - $path = $this->_pluginPath($this->plugin) . 'tests/' . $dir; + return $this->_pluginPath($this->plugin) . 'tests/' . $dir; } - return $path; + return defined('TESTS') ? TESTS . $dir : ROOT . DS . 'tests' . DS . $dir; } /** @@ -689,7 +789,7 @@ public function testCaseFileName(string $type, string $className): string $namespace = $this->plugin; } - $classTail = substr($className, strlen($namespace) + 1); + $classTail = substr($className, strlen((string)$namespace) + 1); $path = $path . $classTail . 'Test.php'; return str_replace(['/', '\\'], DS, $path); @@ -701,12 +801,12 @@ public function testCaseFileName(string $type, string $className): string * @param \Cake\Console\ConsoleOptionParser $parser Option parser to update * @return \Cake\Console\ConsoleOptionParser */ - public function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser + protected function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser { $parser = $this->_setCommonOptions($parser); $types = array_keys($this->classTypes); - $types = array_merge($types, array_map([$this, 'underscore'], $types)); + $types = array_merge($types, array_map($this->underscore(...), $types)); $parser->setDescription( 'Bake test case skeletons for classes.', diff --git a/app/vendor/cakephp/bake/src/Utility/CommonOptionsTrait.php b/app/vendor/cakephp/bake/src/Utility/CommonOptionsTrait.php index fde67f954..29541216d 100644 --- a/app/vendor/cakephp/bake/src/Utility/CommonOptionsTrait.php +++ b/app/vendor/cakephp/bake/src/Utility/CommonOptionsTrait.php @@ -30,24 +30,12 @@ */ trait CommonOptionsTrait { - /** - * @var string - */ public ?string $plugin = null; - /** - * @var string|null - */ public ?string $theme = null; - /** - * @var string - */ public string $connection; - /** - * @var bool - */ public bool $force = false; /** @@ -62,7 +50,7 @@ protected function extractCommonProperties(Arguments $args): void // These properties should ideally not exist, but until ConsoleOptionParser // gets validation and transform logic they will have to stay. if ($args->hasOption('plugin')) { - $plugin = $args->getOption('plugin'); + $plugin = (string)$args->getOption('plugin'); $parts = explode('/', $plugin); $this->plugin = implode('/', array_map([$this, '_camelize'], $parts)); @@ -73,9 +61,11 @@ protected function extractCommonProperties(Arguments $args): void } } - $this->theme = $args->getOption('theme'); - $this->connection = $args->getOption('connection'); - $this->force = $args->getOption('force'); + $theme = $args->getOption('theme'); + $this->theme = is_string($theme) ? $theme : null; + $connection = $args->getOption('connection'); + $this->connection = is_string($connection) ? $connection : 'default'; + $this->force = (bool)$args->getOption('force'); } /** diff --git a/app/vendor/cakephp/bake/src/Utility/Model/AssociationFilter.php b/app/vendor/cakephp/bake/src/Utility/Model/AssociationFilter.php index c6f6a47c5..db3d16923 100644 --- a/app/vendor/cakephp/bake/src/Utility/Model/AssociationFilter.php +++ b/app/vendor/cakephp/bake/src/Utility/Model/AssociationFilter.php @@ -78,11 +78,11 @@ public function filterAssociations(Table $model): array if ($type === 'HasMany' && in_array($alias, $belongsToManyJunctionsAliases)) { continue; } - $targetClass = get_class($target); + $targetClass = $target::class; [, $className] = namespaceSplit($targetClass); $navLink = true; - $modelClass = get_class($model); + $modelClass = $model::class; if ($modelClass !== Table::class && $targetClass === $modelClass) { $navLink = false; } @@ -93,6 +93,7 @@ public function filterAssociations(Table $model): array } try { + $foreignKey = (array)$assoc->getForeignKey(); $associations[$type][$assocName] = [ 'property' => $assoc->getProperty(), 'variable' => Inflector::variable($assocName), @@ -101,10 +102,10 @@ public function filterAssociations(Table $model): array 'foreignKey' => $assoc->getForeignKey(), 'alias' => $alias, 'controller' => $className, - 'fields' => $target->getSchema()->columns(), + 'fields' => array_values(array_diff($target->getSchema()->columns(), $foreignKey)), 'navLink' => $navLink, ]; - } catch (Exception $e) { + } catch (Exception) { // Do nothing it could be a bogus association name. } } diff --git a/app/vendor/cakephp/bake/src/Utility/Model/EnumParser.php b/app/vendor/cakephp/bake/src/Utility/Model/EnumParser.php index e559fe03e..ac80024b8 100644 --- a/app/vendor/cakephp/bake/src/Utility/Model/EnumParser.php +++ b/app/vendor/cakephp/bake/src/Utility/Model/EnumParser.php @@ -8,8 +8,6 @@ class EnumParser { /** - * @param string|null $casesString - * @param bool $int * @return array */ public static function parseCases(?string $casesString, bool $int): array @@ -23,9 +21,10 @@ public static function parseCases(?string $casesString, bool $int): array $definition = []; foreach ($enumCases as $k => $enumCase) { $case = $value = trim($enumCase); - if (str_contains($case, ':')) { - $value = trim(mb_substr($case, strpos($case, ':') + 1)); - $case = mb_substr($case, 0, strpos($case, ':')); + $pos = strpos($case, ':'); + if ($pos !== false) { + $value = trim(mb_substr($case, $pos + 1)); + $case = mb_substr($case, 0, $pos); } elseif ($int) { $value = $k; } @@ -33,8 +32,8 @@ public static function parseCases(?string $casesString, bool $int): array if (!preg_match('/^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$/', $case)) { throw new InvalidArgumentException(sprintf('`%s` is not a valid enum case', $case)); } - if (is_string($value) && str_contains($value, '\'')) { - throw new InvalidArgumentException(sprintf('`%s` value cannot contain `\'` character', $case)); + if (is_string($value) && str_contains($value, "'")) { + throw new InvalidArgumentException(sprintf("`%s` value cannot contain `'` character", $case)); } $definition[$case] = $int ? (int)$value : $value; @@ -46,14 +45,14 @@ public static function parseCases(?string $casesString, bool $int): array /** * Parses an enum definition from a DB column comment. * - * @param string $comment * @return string */ public static function parseDefinitionString(string $comment): string { $string = trim(mb_substr($comment, strpos($comment, '[enum]') + 6)); - if (str_contains($string, ';')) { - $string = trim(mb_substr($string, 0, strpos($string, ';'))); + $pos = strpos($string, ';'); + if ($pos !== false) { + return trim(mb_substr($string, 0, $pos)); } return $string; diff --git a/app/vendor/cakephp/bake/src/Utility/Process.php b/app/vendor/cakephp/bake/src/Utility/Process.php index 78686c334..27c9cc155 100644 --- a/app/vendor/cakephp/bake/src/Utility/Process.php +++ b/app/vendor/cakephp/bake/src/Utility/Process.php @@ -26,9 +26,6 @@ */ class Process { - /** - * @var \Cake\Console\ConsoleIo - */ protected ConsoleIo $io; /** @@ -62,7 +59,7 @@ public function call(string $command): string $pipes, ); if (!is_resource($process)) { - throw new RuntimeException("Could not start subprocess for `$command`"); + throw new RuntimeException("Could not start subprocess for `{$command}`"); } fclose($pipes[0]); diff --git a/app/vendor/cakephp/bake/src/Utility/SubsetSchemaCollection.php b/app/vendor/cakephp/bake/src/Utility/SubsetSchemaCollection.php index 290332159..995a31e65 100644 --- a/app/vendor/cakephp/bake/src/Utility/SubsetSchemaCollection.php +++ b/app/vendor/cakephp/bake/src/Utility/SubsetSchemaCollection.php @@ -27,13 +27,10 @@ */ class SubsetSchemaCollection implements CollectionInterface { - /** - * @var \Cake\Database\Schema\CollectionInterface - */ protected CollectionInterface $collection; /** - * @var list + * @var array */ protected array $tables = []; @@ -60,7 +57,7 @@ public function getInnerCollection(): CollectionInterface /** * Get the list of tables in this schema collection. * - * @return list + * @return array */ public function listTables(): array { diff --git a/app/vendor/cakephp/bake/src/Utility/TableScanner.php b/app/vendor/cakephp/bake/src/Utility/TableScanner.php index b10be2c0e..ace2b00ca 100644 --- a/app/vendor/cakephp/bake/src/Utility/TableScanner.php +++ b/app/vendor/cakephp/bake/src/Utility/TableScanner.php @@ -29,9 +29,6 @@ */ class TableScanner { - /** - * @var \Cake\Database\Connection - */ protected Connection $connection; /** @@ -50,7 +47,7 @@ public function __construct(Connection $connection, ?array $ignore = null) { $this->connection = $connection; if ($ignore === null) { - $ignore = ['i18n', 'cake_sessions', 'sessions', '/phinxlog/']; + $ignore = ['i18n', 'cake_sessions', 'cake_migrations', 'cake_seeds', 'sessions', '/phinxlog/']; } $this->ignore = $ignore; } @@ -120,10 +117,8 @@ public function removeShadowTranslationTables(array $tables): array protected function shouldSkip(string $table): bool { foreach ($this->ignore as $ignore) { - if (str_starts_with($ignore, '/')) { - if ((bool)preg_match($ignore, $table)) { - return true; - } + if (str_starts_with($ignore, '/') && (bool)preg_match($ignore, $table)) { + return true; } if ($ignore === $table) { diff --git a/app/vendor/cakephp/bake/src/Utility/TemplateRenderer.php b/app/vendor/cakephp/bake/src/Utility/TemplateRenderer.php index d3f8eb633..7566cd070 100644 --- a/app/vendor/cakephp/bake/src/Utility/TemplateRenderer.php +++ b/app/vendor/cakephp/bake/src/Utility/TemplateRenderer.php @@ -34,15 +34,11 @@ class TemplateRenderer /** * BakeView instance - * - * @var \Bake\View\BakeView|null */ protected ?BakeView $view = null; /** * Template theme - * - * @var string|null */ protected ?string $theme; @@ -59,12 +55,12 @@ public function __construct(?string $theme = null) /** * Get view instance * - * @return \Cake\View\View + * @return \Bake\View\BakeView * @triggers Bake.initialize $view */ public function getView(): View { - if ($this->view) { + if ($this->view instanceof BakeView) { return $this->view; } @@ -99,7 +95,7 @@ public function generate(string $template, ?array $vars = null): string try { return $view->render($template); - } catch (MissingTemplateException $e) { + } catch (MissingTemplateException) { $message = sprintf('No bake template found for "%s" skipping file generation.', $template); throw new MissingTemplateException($message); } diff --git a/app/vendor/cakephp/bake/src/View/BakeView.php b/app/vendor/cakephp/bake/src/View/BakeView.php index 841865434..ebc623dfa 100644 --- a/app/vendor/cakephp/bake/src/View/BakeView.php +++ b/app/vendor/cakephp/bake/src/View/BakeView.php @@ -18,17 +18,12 @@ use Cake\Core\Configure; use Cake\Core\ConventionsTrait; -use Cake\Event\EventDispatcherTrait; use Cake\Event\EventInterface; use Cake\TwigView\View\TwigView; use function Cake\Core\pluginSplit; class BakeView extends TwigView { - /** - * @use \Cake\Event\EventDispatcherTrait<\Cake\View\View> - */ - use EventDispatcherTrait; use ConventionsTrait; /** @@ -81,6 +76,8 @@ public function initialize(): void */ public function render(?string $template = null, string|false|null $layout = null): string { + assert($template !== null, 'Template name must be provided.'); + $viewFileName = $this->_getTemplateFileName($template); [, $templateEventName] = pluginSplit($template); $templateEventName = str_replace(['/', '\\'], '.', $templateEventName); @@ -107,19 +104,19 @@ public function render(?string $template = null, string|false|null $layout = nul * * Use the Bake prefix for bake related view events * - * @template TSubject of \Cake\View\View * @param string $name Name of the event. * @param array $data Any value you wish to be transported with this event to * it can be read by listeners. - * - * @param TSubject|null $subject The object that this event applies to + * @param object|null $subject The object that this event applies to * ($this by default). - * @return \Cake\Event\EventInterface<\Cake\View\View> + * @return \Cake\Event\EventInterface + * @phpstan-ignore missingType.generics */ public function dispatchEvent(string $name, array $data = [], ?object $subject = null): EventInterface { - $name = preg_replace('/^View\./', 'Bake.', $name); + $name = (string)preg_replace('/^View\./', 'Bake.', $name); + /** @phpstan-ignore-next-line missingType.generics */ return parent::dispatchEvent($name, $data, $subject); } @@ -128,14 +125,14 @@ public function dispatchEvent(string $name, array $data = [], ?object $subject = * * @param ?string $plugin Optional plugin name to scan for view files. * @param bool $cached Set to false to force a refresh of view paths. Default true. - * @return list paths + * @return array paths */ protected function _paths(?string $plugin = null, bool $cached = true): array { $paths = parent::_paths($plugin, false); foreach ($paths as &$path) { // Append 'bake' to all directories that aren't the application override directory. - if (strpos($path, 'plugin' . DS . 'Bake') === false) { + if (!str_contains($path, 'plugin' . DS . 'Bake')) { $path .= static::BAKE_TEMPLATE_FOLDER . DS; } } diff --git a/app/vendor/cakephp/bake/src/View/Helper/BakeHelper.php b/app/vendor/cakephp/bake/src/View/Helper/BakeHelper.php index 41b48a9e7..e73388c64 100644 --- a/app/vendor/cakephp/bake/src/View/Helper/BakeHelper.php +++ b/app/vendor/cakephp/bake/src/View/Helper/BakeHelper.php @@ -21,6 +21,8 @@ /** * Bake helper + * + * @extends \Cake\View\Helper<\Cake\View\View> */ class BakeHelper extends Helper { @@ -35,8 +37,6 @@ class BakeHelper extends Helper /** * AssociationFilter utility - * - * @var \Bake\Utility\Model\AssociationFilter|null */ protected ?AssociationFilter $_associationFilter = null; @@ -150,7 +150,7 @@ public function classInfo(string $class, string $type, string $suffix): array if ($plugin !== null) { $base = $plugin; } - $base = str_replace('/', '\\', trim($base, '\\')); + $base = str_replace('/', '\\', trim((string)$base, '\\')); $sub = '\\' . str_replace('/', '\\', trim($type, '\\')); $qn = $sub . '\\' . $name . $suffix; @@ -196,12 +196,12 @@ public function filterFields( array $filterTypes = ['binary'], ): array { $fields = collection($fields) - ->filter(function ($field) use ($schema, $filterTypes) { + ->filter(function ($field) use ($schema, $filterTypes): bool { return !in_array($schema->getColumnType($field), $filterTypes); }); if (isset($modelObject) && $modelObject->hasBehavior('Tree')) { - $fields = $fields->reject(function ($field) { + $fields = $fields->reject(function ($field): bool { return $field === 'lft' || $field === 'rght'; }); } @@ -233,15 +233,15 @@ public function getViewFieldsData(array $fields, SchemaInterface $schema, array } }) ->filter() - ->reduce(function ($fields, $value) { + ->reduce(function ($fields, $value): float|int|array { return $fields + $value; }, []); $groupedFields = collection($fields) - ->filter(function ($field) use ($schema) { + ->filter(function ($field) use ($schema): bool { return $schema->getColumnType($field) !== 'binary'; }) - ->groupBy(function ($field) use ($schema, $associationFields) { + ->groupBy(function ($field) use ($schema, $associationFields): string { $type = $schema->getColumnType($field); if (isset($associationFields[$field])) { return 'string'; @@ -262,11 +262,11 @@ public function getViewFieldsData(array $fields, SchemaInterface $schema, array 'timestampfractional', 'timestamptimezone', ]; - if (in_array($type, $dateTypes)) { + if (in_array($type, $dateTypes, true)) { return 'date'; } - return in_array($type, ['text', 'boolean']) ? $type : 'string'; + return in_array($type, ['text', 'boolean'], true) ? $type : 'string'; }) ->toArray(); @@ -304,7 +304,7 @@ public function columnData(string $field, TableSchema $schema): ?array public function enumSupportsLabel(string $field, TableSchema $schema): bool { $typeName = $schema->getColumnType($field); - if (!str_starts_with($typeName, 'enum-')) { + if (!$typeName || !str_starts_with($typeName, 'enum-')) { return false; } $type = TypeFactory::build($typeName); @@ -365,7 +365,7 @@ public function getValidationMethods(string $field, array $rules): array continue; } - $rule['args'] = array_map(function ($item) { + $rule['args'] = array_map(function ($item): string { return $this->exportVar( $item, is_array($item) ? 3 : 0, @@ -421,7 +421,7 @@ public function escapeArguments(array $args): array return array_map(function ($v) { if (is_string($v)) { $v = strtr($v, ["'" => "\'"]); - $v = "'$v'"; + $v = "'{$v}'"; } return $v; @@ -494,7 +494,7 @@ public function getConstUses(array $imports): string */ protected function getUseType(string $alias, string $name): string { - if ($name == $alias || substr($name, -strlen("\\{$alias}")) === "\\{$alias}") { + if ($name === $alias || str_ends_with($name, "\\{$alias}")) { return $name; } @@ -518,7 +518,7 @@ public function concat( ): string { $output = implode( $delimiter, - array_map(function ($string) use ($delimiter) { + array_map(function ($string) use ($delimiter): string { if (is_string($string)) { return $string; } diff --git a/app/vendor/cakephp/bake/src/View/Helper/DocBlockHelper.php b/app/vendor/cakephp/bake/src/View/Helper/DocBlockHelper.php index 05b988f1a..014c3d9b4 100644 --- a/app/vendor/cakephp/bake/src/View/Helper/DocBlockHelper.php +++ b/app/vendor/cakephp/bake/src/View/Helper/DocBlockHelper.php @@ -13,6 +13,8 @@ /** * DocBlock helper + * + * @extends \Cake\View\Helper<\Cake\View\View> */ class DocBlockHelper extends Helper { @@ -57,7 +59,7 @@ public function classDescription(string $className, string $classType, array $an $lines[] = $annotation; } - $lines = array_merge(['/**'], (new Collection($lines))->map(function ($line) { + $lines = array_merge(['/**'], (new Collection($lines))->map(function ($line): string { return rtrim(" * {$line}"); })->toArray(), [' */']); @@ -305,7 +307,7 @@ public function buildTableAnnotations( $annotations[] = "@method iterable<\\{$namespace}\\Model\\Entity\\{$entity}>|\Cake\Datasource\ResultSetInterface<\\{$namespace}\\Model\\Entity\\{$entity}>|false deleteMany(iterable \$entities, array \$options = [])"; $annotations[] = "@method iterable<\\{$namespace}\\Model\\Entity\\{$entity}>|\Cake\Datasource\ResultSetInterface<\\{$namespace}\\Model\\Entity\\{$entity}> deleteManyOrFail(iterable \$entities, array \$options = [])"; // phpcs:enable - foreach ($behaviors as $behavior => $behaviorData) { + foreach (array_keys($behaviors) as $behavior) { $className = App::className($behavior, 'Model/Behavior', 'Behavior'); if (!$className) { $className = "Cake\ORM\Behavior\\{$behavior}Behavior"; @@ -329,12 +331,12 @@ public function buildTableAnnotations( */ protected function _insertAfter(array $target, string $key, mixed $value): array { - $index = array_search($key, array_keys($target)); + $index = array_search($key, array_keys($target), true); if ($index !== false) { $target = array_merge( array_slice($target, 0, $index + 1), $value, - array_slice($target, $index + 1, null), + array_slice($target, $index + 1), ); } else { $target += (array)$value; diff --git a/app/vendor/cakephp/bake/templates/bake/Command/command.twig b/app/vendor/cakephp/bake/templates/bake/Command/command.twig index 9580b3fa4..54aec5479 100644 --- a/app/vendor/cakephp/bake/templates/bake/Command/command.twig +++ b/app/vendor/cakephp/bake/templates/bake/Command/command.twig @@ -33,7 +33,7 @@ class {{ name }}Command extends Command * * @var string */ - protected string $name = '{{ command_name }}'; + protected string $name = 'cake {{ command_name }}'; /** * Get the default command name. @@ -58,7 +58,7 @@ class {{ name }}Command extends Command /** * Hook method for defining this command's option parser. * - * @see https://book.cakephp.org/5/en/console-commands/commands.html#defining-arguments-and-options + * @link https://book.cakephp.org/5/en/console-commands/commands.html#defining-arguments-and-options * @param \Cake\Console\ConsoleOptionParser $parser The parser to be defined * @return \Cake\Console\ConsoleOptionParser The built parser. */ diff --git a/app/vendor/cakephp/bake/templates/bake/Controller/controller.twig b/app/vendor/cakephp/bake/templates/bake/Controller/controller.twig index 83a843e1c..3212114f6 100644 --- a/app/vendor/cakephp/bake/templates/bake/Controller/controller.twig +++ b/app/vendor/cakephp/bake/templates/bake/Controller/controller.twig @@ -32,7 +32,7 @@ {% endif %} {%- for component in components %} -{% set classInfo = Bake.classInfo(component, 'Controller/Component', 'Component') %} + {%~ set classInfo = Bake.classInfo(component, 'Controller/Component', 'Component') %} * @property {{ classInfo.fqn }} ${{ classInfo.name }} {% endfor %} */ @@ -48,20 +48,20 @@ class {{ name }}Controller extends AppController { parent::initialize(); -{% for component in components %} + {%~ for component in components %} $this->loadComponent('{{ component }}'); -{% endfor %} -{% if helpers %} + {%~ endfor %} + {%~ if helpers %} $this->viewBuilder()->setHelpers({{ Bake.exportArray(helpers)|raw }}); -{% endif %} -{% if has_login %} + {%~ endif %} + {%~ if has_login %} $this->Authentication->allowUnauthenticated(['login']); -{% endif %} + {%~ endif %} } -{% if actions|length %}{{ "\n" }}{% endif %} + {%~ if actions|length %}{{ "\n" }}{% endif %} {% endif %} -{%- for action in actions %} -{% if loop.index > 1 %}{{ "\n" }}{% endif %} +{% for action in actions %} + {%~ if loop.index > 1 %}{{ "\n" }}{% endif %} {{- element('Bake.Controller/' ~ action) -}} {% endfor %} } diff --git a/app/vendor/cakephp/bake/templates/bake/Model/entity.twig b/app/vendor/cakephp/bake/templates/bake/Model/entity.twig index 2524788ee..ab924dd7b 100644 --- a/app/vendor/cakephp/bake/templates/bake/Model/entity.twig +++ b/app/vendor/cakephp/bake/templates/bake/Model/entity.twig @@ -18,8 +18,8 @@ {% set annotations = DocBlock.propertyHints(propertyHintMap) %} {%- if associationHintMap %} - {%- set annotations = annotations|merge(['']) %} - {%- set annotations = annotations|merge(DocBlock.propertyHints(associationHintMap)) %} + {%~ set annotations = annotations|merge(['']) %} + {%~ set annotations = annotations|merge(DocBlock.propertyHints(associationHintMap)) %} {% endif %} {%- set accessible = Bake.getFieldAccessibility(fields, primaryKey) %} @@ -39,7 +39,7 @@ class {{ name }} extends Entity{{ fileBuilder.classBuilder.implements ? ' implem {% endif %} {% if accessible %} -{%- set generatedProperties = generatedProperties|merge(['_accessible']) %} +{%~ set generatedProperties = generatedProperties|merge(['_accessible']) %} /** * Fields that can be mass assigned using newEntity() or patchEntity(). * @@ -54,12 +54,12 @@ class {{ name }} extends Entity{{ fileBuilder.classBuilder.implements ? ' implem {% if accessible and hidden %} {% endif %} -{%- if hidden %} -{%- set generatedProperties = generatedProperties|merge(['_hidden']) %} +{% if hidden %} + {%~ set generatedProperties = generatedProperties|merge(['_hidden']) %} /** * Fields that are excluded from JSON versions of the entity. * - * @var list + * @var array */ protected array $_hidden = {{ Bake.exportVar(hidden, 1)|raw }}; {% endif %} diff --git a/app/vendor/cakephp/bake/templates/bake/Model/table.twig b/app/vendor/cakephp/bake/templates/bake/Model/table.twig index acd786fae..76511babc 100644 --- a/app/vendor/cakephp/bake/templates/bake/Model/table.twig +++ b/app/vendor/cakephp/bake/templates/bake/Model/table.twig @@ -50,58 +50,49 @@ class {{ name }}Table extends Table{{ fileBuilder.classBuilder.implements ? ' im {%- if displayField %} $this->setDisplayField({{ (displayField is iterable ? Bake.exportArray(displayField) : Bake.exportVar(displayField))|raw }}); {% endif %} - -{%- if primaryKey %} - {%- if primaryKey is iterable and primaryKey|length > 1 %} +{% if primaryKey %} + {%~ if primaryKey is iterable and primaryKey|length > 1 %} $this->setPrimaryKey({{ Bake.exportArray(primaryKey)|raw }}); - {{- "\n" }} - {%- else %} + {%~ else %} $this->setPrimaryKey('{{ primaryKey|as_array|first }}'); - {{- "\n" }} - {%- endif %} -{% endif %} - -{%- if enums %} - + {%~ endif %} {% endif %} +{% if enums %} -{%- if enums %} - -{%- for name, className in enums %} + {%~ for name, className in enums %} $this->getSchema()->setColumnType('{{ name }}', \Cake\Database\Type\EnumType::from(\{{ className }}::class)); -{% endfor %} + {%~ endfor %} {% endif %} +{% if customColumnTypes is defined and customColumnTypes %} -{%- if behaviors %} - + {%~ for columnName, typeExpression in customColumnTypes %} + $this->getSchema()->setColumnType('{{ columnName }}', {{ typeExpression|raw }}); + {%~ endfor %} {% endif %} +{% if behaviors %} -{%- for behavior, behaviorData in behaviors %} + {%~ for behavior, behaviorData in behaviors %} $this->addBehavior('{{ behavior }}'{{ (behaviorData ? (", " ~ Bake.exportArray(behaviorData, 2)|raw ~ '') : '')|raw }}); -{% endfor %} - -{%- if associations.belongsTo or associations.hasMany or associations.belongsToMany %} - + {%~ endfor %} {% endif %} - -{%- for type, assocs in associations %} - {%- for assoc in assocs %} - {%- set assocData = [] %} - {%- for key, val in assoc %} - {%- if key is not same as('alias') %} - {%- set assocData = assocData|merge({(key): val}) %} - {%- endif %} - {%- endfor %} +{% if associations.belongsTo or associations.hasMany or associations.belongsToMany %} + + {%~ for type, assocs in associations %} + {%~ for assoc in assocs %} + {%~ set assocData = [] %} + {%~ for key, val in assoc %} + {%~ if key is not same as('alias') %} + {%~ set assocData = assocData|merge({(key): val}) %} + {%~ endif %} + {%~ endfor %} $this->{{ type }}('{{ assoc.alias }}', {{ Bake.exportArray(assocData, 2)|raw }}); - {{- "\n" }} - {%- endfor %} -{% endfor %} + {%~ endfor %} + {%~ endfor %} +{% endif %} } -{{- "\n" }} - -{%- if validation %} -{% set generatedFunctions = generatedFunctions|merge(['validationDefault']) %} +{% if validation %} + {%~ set generatedFunctions = generatedFunctions|merge(['validationDefault']) %} /** * Default validation rules. * @@ -110,25 +101,24 @@ class {{ name }}Table extends Table{{ fileBuilder.classBuilder.implements ? ' im */ public function validationDefault(Validator $validator): Validator { -{% for field, rules in validation %} -{% set validationMethods = Bake.getValidationMethods(field, rules) %} -{% if validationMethods %} + {%~ for field, rules in validation %} + {%~ set validationMethods = Bake.getValidationMethods(field, rules) %} + {%~ if validationMethods %} $validator -{% for validationMethod in validationMethods %} -{% if loop.last %} -{% set validationMethod = validationMethod ~ ';' %} -{% endif %} + {%~ for validationMethod in validationMethods %} + {%~ if loop.last %} + {%~ set validationMethod = validationMethod ~ ';' %} + {%~ endif %} {{ validationMethod|raw }} -{% endfor %} + {%~ endfor %} -{% endif %} -{% endfor %} + {%~ endif %} + {%~ endfor %} return $validator; } {% endif %} - {%- if rulesChecker %} -{% set generatedFunctions = generatedFunctions|merge(['buildRules']) %} + {%~ set generatedFunctions = generatedFunctions|merge(['buildRules']) %} /** * Returns a rules checker object that will be used for validating @@ -139,21 +129,24 @@ class {{ name }}Table extends Table{{ fileBuilder.classBuilder.implements ? ' im */ public function buildRules(RulesChecker $rules): RulesChecker { -{% for rule in rulesChecker %} -{% set fields = Bake.exportArray(rule.fields) %} -{% set options = '' %} -{% for optionName, optionValue in rule.options %} - {%~ set options = (loop.first ? '[' : options) ~ "'#{optionName}' => " ~ Bake.exportVar(optionValue) ~ (loop.last ? ']' : ', ') %} -{% endfor %} - $rules->add($rules->{{ rule.name }}({{ fields|raw }}{{ (rule.extra|default ? ", '#{rule.extra}'" : '')|raw }}{{ (options ? ', ' ~ options : '')|raw }}), ['errorField' => '{{ rule.fields[0] }}']); -{% endfor %} + {%~ for rule in rulesChecker %} + {%~ set fields = Bake.exportArray(rule.fields) %} + {%~ set options = '' %} + {%~ for optionName, optionValue in rule.options %} + {%~ set options = (loop.first ? '[' : options) ~ "'#{optionName}' => " ~ Bake.exportVar(optionValue) ~ (loop.last ? ']' : ', ') %} + {%~ endfor %} + {%~ set ruleOptions = "'errorField' => '" ~ rule.fields[0] ~ "'" %} + {%~ if rule.message is defined %} + {%~ set ruleOptions = ruleOptions ~ ", 'message' => __(" ~ Bake.exportVar(rule.message) ~ ")" %} + {%~ endif %} + $rules->add($rules->{{ rule.name }}({{ fields|raw }}{{ (rule.extra|default ? ", '#{rule.extra}'" : '')|raw }}{{ (options ? ', ' ~ options : '')|raw }}), [{{ ruleOptions|raw }}]); + {%~ endfor %} return $rules; } {% endif %} - -{%- if connection is not same as('default') %} -{% set generatedFunctions = generatedFunctions|merge(['defaultConnectionName']) %} +{% if connection is not same as('default') %} + {%~ set generatedFunctions = generatedFunctions|merge(['defaultConnectionName']) %} /** * Returns the database connection name to use by default. diff --git a/app/vendor/cakephp/bake/templates/bake/Template/add.twig b/app/vendor/cakephp/bake/templates/bake/Template/add.twig index c21d7c1d2..bfbfcbada 100644 --- a/app/vendor/cakephp/bake/templates/bake/Template/add.twig +++ b/app/vendor/cakephp/bake/templates/bake/Template/add.twig @@ -17,18 +17,15 @@ /** * @var \{{ namespace }}\View\AppView $this * @var \{{ entityClass }} ${{ singularVar }} - {{- "\n" }} -{%- if associations.BelongsTo is defined %} - {%- for assocName, assocData in associations.BelongsTo %} +{% if associations.BelongsTo is defined %} + {%~ for assocName, assocData in associations.BelongsTo %} * @var \Cake\Collection\CollectionInterface|string[] ${{ assocData.variable }} - {{- "\n" }} - {%- endfor %} + {%~ endfor %} {% endif %} -{%- if associations.BelongsToMany is defined %} - {%- for assocName, assocData in associations.BelongsToMany %} +{% if associations.BelongsToMany is defined %} + {%~ for assocName, assocData in associations.BelongsToMany %} * @var \Cake\Collection\CollectionInterface|string[] ${{ assocData.variable }} - {{- "\n" }} - {%- endfor %} + {%~ endfor %} {% endif %} */ ?> diff --git a/app/vendor/cakephp/bake/templates/bake/Template/edit.twig b/app/vendor/cakephp/bake/templates/bake/Template/edit.twig index 90fed4ec4..a7d57e8ff 100644 --- a/app/vendor/cakephp/bake/templates/bake/Template/edit.twig +++ b/app/vendor/cakephp/bake/templates/bake/Template/edit.twig @@ -17,18 +17,15 @@ /** * @var \{{ namespace }}\View\AppView $this * @var \{{ entityClass }} ${{ singularVar }} - {{- "\n" }} -{%- if associations.BelongsTo is defined %} - {%- for assocName, assocData in associations.BelongsTo %} +{% if associations.BelongsTo is defined %} + {%~ for assocName, assocData in associations.BelongsTo %} * @var string[]|\Cake\Collection\CollectionInterface ${{ assocData.variable }} - {{- "\n" }} - {%- endfor %} + {%~ endfor %} {% endif %} -{%- if associations.BelongsToMany is defined %} - {%- for assocName, assocData in associations.BelongsToMany %} +{% if associations.BelongsToMany is defined %} + {%~ for assocName, assocData in associations.BelongsToMany %} * @var string[]|\Cake\Collection\CollectionInterface ${{ assocData.variable }} - {{- "\n" }} - {%- endfor %} + {%~ endfor %} {% endif %} */ ?> diff --git a/app/vendor/cakephp/bake/templates/bake/Template/index.twig b/app/vendor/cakephp/bake/templates/bake/Template/index.twig index 7cab8aa11..4a81b76fe 100644 --- a/app/vendor/cakephp/bake/templates/bake/Template/index.twig +++ b/app/vendor/cakephp/bake/templates/bake/Template/index.twig @@ -38,28 +38,28 @@ {% for field in fields %} -{% set isKey = false %} -{% if associations.BelongsTo is defined %} -{% for alias, details in associations.BelongsTo %} -{% if field == details.foreignKey %} -{% set isKey = true %} + {%~ set isKey = false %} + {%~ if associations.BelongsTo is defined %} + {%~ for alias, details in associations.BelongsTo %} + {%~ if field == details.foreignKey %} + {%~ set isKey = true %} hasValue('{{ details.property }}') ? $this->Html->link(${{ singularVar }}->{{ details.property }}->{{ details.displayField }}, ['controller' => '{{ details.controller }}', 'action' => 'view', ${{ singularVar }}->{{ details.property }}->{{ details.primaryKey[0] }}]) : '' ?> -{% endif %} -{% endfor %} -{% endif %} -{% if isKey is not same as(true) %} -{% set columnData = Bake.columnData(field, schema) %} -{% set supportsLabel = Bake.enumSupportsLabel(field, schema) %} -{% if columnData.type starts with 'enum-' %} + {%~ endif %} + {%~ endfor %} + {%~ endif %} + {%~ if isKey is not same as(true) %} + {%~ set columnData = Bake.columnData(field, schema) %} + {%~ set supportsLabel = Bake.enumSupportsLabel(field, schema) %} + {%~ if columnData.type starts with 'enum-' %} {{ field }} === null ? '' : h(${{ singularVar }}->{{ field }}->{% if supportsLabel %}label(){% else %}value{% endif %}) ?> -{% elseif columnData.type not in ['integer', 'float', 'decimal', 'biginteger', 'smallinteger', 'tinyinteger'] %} + {%~ elseif columnData.type not in ['integer', 'float', 'decimal', 'biginteger', 'smallinteger', 'tinyinteger'] %} {{ field }}) ?> -{% elseif columnData.null %} + {%~ elseif columnData.null %} {{ field }} === null ? '' : $this->Number->format(${{ singularVar }}->{{ field }}) ?> -{% else %} + {%~ else %} Number->format(${{ singularVar }}->{{ field }}) ?> -{% endif %} -{% endif %} + {%~ endif %} + {%~ endif %} {% endfor %} {% set pk = '$' ~ singularVar ~ '->' ~ primaryKey[0] %} diff --git a/app/vendor/cakephp/bake/templates/bake/Template/view.twig b/app/vendor/cakephp/bake/templates/bake/Template/view.twig index de4141355..a6841f352 100644 --- a/app/vendor/cakephp/bake/templates/bake/Template/view.twig +++ b/app/vendor/cakephp/bake/templates/bake/Template/view.twig @@ -24,6 +24,7 @@ {% set associationFields = fieldsData.associationFields %} {% set groupedFields = fieldsData.groupedFields %} {% set pK = '$' ~ singularVar ~ '->' ~ primaryKey[0] %} +{% set done = [] %}
@@ -40,104 +40,107 @@

{{ displayField }}) ?>

{% if groupedFields['string'] %} -{% for field in groupedFields['string'] %} -{% if associationFields[field] is defined %} -{% set details = associationFields[field] %} + {%~ for field in groupedFields['string'] %} + {%~ if associationFields[field] is defined %} + {%~ set details = associationFields[field] %} -{% else %} + {%~ else %} -{% endif %} -{% endfor %} + {%~ endif %} + {%~ endfor %} {% endif %} {% if associations.HasOne %} -{% for alias, details in associations.HasOne %} + {%~ for alias, details in associations.HasOne %} -{% endfor %} + {%~ endfor %} {% endif %} {% if groupedFields.number %} -{% for field in groupedFields.number %} + {%~ for field in groupedFields.number %} -{% set columnData = Bake.columnData(field, schema) %} -{% if columnData.null %} + {%~ set columnData = Bake.columnData(field, schema) %} + {%~ if columnData.null %} -{% else %} + {%~ else %} -{% endif %} + {%~ endif %} -{% endfor %} + {%~ endfor %} {% endif %} {% if groupedFields.enum %} -{% for field in groupedFields.enum %} + {%~ for field in groupedFields.enum %} -{% set columnData = Bake.columnData(field, schema) %} -{% set supportsLabel = Bake.enumSupportsLabel(field, schema) %} -{% if columnData.null %} + {%~ set columnData = Bake.columnData(field, schema) %} + {%~ set supportsLabel = Bake.enumSupportsLabel(field, schema) %} + {%~ if columnData.null %} -{% else %} + {%~ else %} -{% endif %} + {%~ endif %} -{% endfor %} + {%~ endfor %} {% endif %} {% if groupedFields.date %} -{% for field in groupedFields.date %} + {%~ for field in groupedFields.date %} -{% endfor %} + {%~ endfor %} {% endif %} {% if groupedFields.boolean %} -{% for field in groupedFields.boolean %} + {%~ for field in groupedFields.boolean %} -{% endfor %} + {%~ endfor %} {% endif %}
hasValue('{{ details.property }}') ? $this->Html->link(${{ singularVar }}->{{ details.property }}->{{ details.displayField }}, ['controller' => '{{ details.controller }}', 'action' => 'view', ${{ singularVar }}->{{ details.property }}->{{ details.primaryKey[0] }}]) : '' ?>
{{ field }}) ?>
hasValue('{{ details.property }}') ? $this->Html->link(${{ singularVar }}->{{ details.property }}->{{ details.displayField }}, ['controller' => '{{ details.controller }}', 'action' => 'view', ${{ singularVar }}->{{ details.property }}->{{ details.primaryKey[0] }}]) : '' ?>
{{ field }} === null ? '' : $this->Number->format(${{ singularVar }}->{{ field }}) ?>Number->format(${{ singularVar }}->{{ field }}) ?>
{{ field }} === null ? '' : h(${{ singularVar }}->{{ field }}->{% if supportsLabel %}label(){% else %}value{% endif %}) ?>{{ field }}->{% if supportsLabel %}label(){% else %}value{% endif %}) ?>
{{ field }}) ?>
{{ field }} ? __('Yes') : __('No'); ?>
{% if groupedFields.text %} -{% for field in groupedFields.text %} + {%~ for field in groupedFields.text %}
Text->autoParagraph(h(${{ singularVar }}->{{ field }})); ?>
-{% endfor %} + {%~ endfor %} {% endif %} {% set relations = associations.BelongsToMany|merge(associations.HasMany) %} {% for alias, details in relations %} -{% set otherSingularVar = alias|singularize|variable %} -{% set otherPluralHumanName = details.controller|underscore|humanize %} + {%~ set otherSingularVar = alias|singularize|variable %} + {%~ if otherSingularVar == singularVar %} + {%~ set otherSingularVar = otherSingularVar ~ 'Related' %} + {%~ endif %} + {%~ set otherPluralHumanName = details.controller|underscore|humanize %}