diff --git a/app/src/GraphGenerator/ContextPreparator.php b/app/src/GraphGenerator/ContextPreparator.php
new file mode 100644
index 00000000..67e88e04
--- /dev/null
+++ b/app/src/GraphGenerator/ContextPreparator.php
@@ -0,0 +1,25 @@
+getContext();
+
+ if ('user' !== $context->getName()) {
+ return;
+ }
+
+ $event->getContext()
+ ->setIgnoreAll(true)
+ ->forEntityCluster(User::class)
+ ;
+ }
+}
diff --git a/composer.json b/composer.json
index b099e445..68a37087 100644
--- a/composer.json
+++ b/composer.json
@@ -296,7 +296,8 @@
],
"generate:artifact": [
"Composer\\Config::disableProcessTimeout",
- "bin/console draw:doctrine:generate-graph-schema | dot -Tsvg -o doc/databse.svg"
+ "bin/console draw:doctrine:generate-graph-schema | dot -Tsvg -o doc/database.svg",
+ "bin/console draw:doctrine:generate-graph-schema user | dot -Tsvg -o doc/user.svg"
]
},
"minimum-stability": "dev",
diff --git a/composer.lock b/composer.lock
index 632366fb..72521489 100644
--- a/composer.lock
+++ b/composer.lock
@@ -62,16 +62,16 @@
},
{
"name": "aws/aws-sdk-php",
- "version": "3.322.7",
+ "version": "3.324.6",
"source": {
"type": "git",
"url": "https://github.com/aws/aws-sdk-php.git",
- "reference": "ea3563a7f10fa562796f712fa306c1dca41a45d7"
+ "reference": "7412a44da62fd607efbaac4084e69d6621f29de1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/ea3563a7f10fa562796f712fa306c1dca41a45d7",
- "reference": "ea3563a7f10fa562796f712fa306c1dca41a45d7",
+ "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/7412a44da62fd607efbaac4084e69d6621f29de1",
+ "reference": "7412a44da62fd607efbaac4084e69d6621f29de1",
"shasum": ""
},
"require": {
@@ -154,9 +154,9 @@
"support": {
"forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
"issues": "https://github.com/aws/aws-sdk-php/issues",
- "source": "https://github.com/aws/aws-sdk-php/tree/3.322.7"
+ "source": "https://github.com/aws/aws-sdk-php/tree/3.324.6"
},
- "time": "2024-09-27T18:34:08+00:00"
+ "time": "2024-10-18T18:06:33+00:00"
},
{
"name": "brick/math",
@@ -742,16 +742,16 @@
},
{
"name": "doctrine/common",
- "version": "3.4.4",
+ "version": "3.4.5",
"source": {
"type": "git",
"url": "https://github.com/doctrine/common.git",
- "reference": "0aad4b7ab7ce8c6602dfbb1e1a24581275fb9d1a"
+ "reference": "6c8fef961f67b8bc802ce3e32e3ebd1022907286"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/common/zipball/0aad4b7ab7ce8c6602dfbb1e1a24581275fb9d1a",
- "reference": "0aad4b7ab7ce8c6602dfbb1e1a24581275fb9d1a",
+ "url": "https://api.github.com/repos/doctrine/common/zipball/6c8fef961f67b8bc802ce3e32e3ebd1022907286",
+ "reference": "6c8fef961f67b8bc802ce3e32e3ebd1022907286",
"shasum": ""
},
"require": {
@@ -813,7 +813,7 @@
],
"support": {
"issues": "https://github.com/doctrine/common/issues",
- "source": "https://github.com/doctrine/common/tree/3.4.4"
+ "source": "https://github.com/doctrine/common/tree/3.4.5"
},
"funding": [
{
@@ -829,7 +829,7 @@
"type": "tidelift"
}
],
- "time": "2024-04-16T13:35:33+00:00"
+ "time": "2024-10-08T15:53:43+00:00"
},
{
"name": "doctrine/data-fixtures",
@@ -917,16 +917,16 @@
},
{
"name": "doctrine/dbal",
- "version": "3.9.1",
+ "version": "3.9.3",
"source": {
"type": "git",
"url": "https://github.com/doctrine/dbal.git",
- "reference": "d7dc08f98cba352b2bab5d32c5e58f7e745c11a7"
+ "reference": "61446f07fcb522414d6cfd8b1c3e5f9e18c579ba"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/dbal/zipball/d7dc08f98cba352b2bab5d32c5e58f7e745c11a7",
- "reference": "d7dc08f98cba352b2bab5d32c5e58f7e745c11a7",
+ "url": "https://api.github.com/repos/doctrine/dbal/zipball/61446f07fcb522414d6cfd8b1c3e5f9e18c579ba",
+ "reference": "61446f07fcb522414d6cfd8b1c3e5f9e18c579ba",
"shasum": ""
},
"require": {
@@ -942,7 +942,7 @@
"doctrine/coding-standard": "12.0.0",
"fig/log-test": "^1",
"jetbrains/phpstorm-stubs": "2023.1",
- "phpstan/phpstan": "1.12.0",
+ "phpstan/phpstan": "1.12.6",
"phpstan/phpstan-strict-rules": "^1.6",
"phpunit/phpunit": "9.6.20",
"psalm/plugin-phpunit": "0.18.4",
@@ -1010,7 +1010,7 @@
],
"support": {
"issues": "https://github.com/doctrine/dbal/issues",
- "source": "https://github.com/doctrine/dbal/tree/3.9.1"
+ "source": "https://github.com/doctrine/dbal/tree/3.9.3"
},
"funding": [
{
@@ -1026,7 +1026,7 @@
"type": "tidelift"
}
],
- "time": "2024-09-01T13:49:23+00:00"
+ "time": "2024-10-10T17:56:43+00:00"
},
{
"name": "doctrine/deprecations",
@@ -1726,16 +1726,16 @@
},
{
"name": "doctrine/orm",
- "version": "2.19.7",
+ "version": "2.20.0",
"source": {
"type": "git",
"url": "https://github.com/doctrine/orm.git",
- "reference": "168ac31084226f94d42e7461a40ff5607a56bd35"
+ "reference": "8ed6c2234aba019f9737a6bcc9516438e62da27c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/orm/zipball/168ac31084226f94d42e7461a40ff5607a56bd35",
- "reference": "168ac31084226f94d42e7461a40ff5607a56bd35",
+ "url": "https://api.github.com/repos/doctrine/orm/zipball/8ed6c2234aba019f9737a6bcc9516438e62da27c",
+ "reference": "8ed6c2234aba019f9737a6bcc9516438e62da27c",
"shasum": ""
},
"require": {
@@ -1764,7 +1764,9 @@
"doctrine/annotations": "^1.13 || ^2",
"doctrine/coding-standard": "^9.0.2 || ^12.0",
"phpbench/phpbench": "^0.16.10 || ^1.0",
- "phpstan/phpstan": "~1.4.10 || 1.11.1",
+ "phpstan/extension-installer": "~1.1.0 || ^1.4",
+ "phpstan/phpstan": "~1.4.10 || 1.12.6",
+ "phpstan/phpstan-deprecation-rules": "^1",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.6",
"psr/log": "^1 || ^2 || ^3",
"squizlabs/php_codesniffer": "3.7.2",
@@ -1821,9 +1823,9 @@
],
"support": {
"issues": "https://github.com/doctrine/orm/issues",
- "source": "https://github.com/doctrine/orm/tree/2.19.7"
+ "source": "https://github.com/doctrine/orm/tree/2.20.0"
},
- "time": "2024-08-23T06:54:57+00:00"
+ "time": "2024-10-11T11:47:24+00:00"
},
{
"name": "doctrine/persistence",
@@ -1924,16 +1926,16 @@
},
{
"name": "doctrine/sql-formatter",
- "version": "1.4.1",
+ "version": "1.5.0",
"source": {
"type": "git",
"url": "https://github.com/doctrine/sql-formatter.git",
- "reference": "7f83911cc5eba870de7ebb11283972483f7e2891"
+ "reference": "16ca9e39877369d664f06dacde468548298bdc40"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/7f83911cc5eba870de7ebb11283972483f7e2891",
- "reference": "7f83911cc5eba870de7ebb11283972483f7e2891",
+ "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/16ca9e39877369d664f06dacde468548298bdc40",
+ "reference": "16ca9e39877369d664f06dacde468548298bdc40",
"shasum": ""
},
"require": {
@@ -1941,6 +1943,7 @@
},
"require-dev": {
"doctrine/coding-standard": "^12",
+ "ergebnis/phpunit-slow-test-detector": "^2.14",
"phpstan/phpstan": "^1.10",
"phpunit/phpunit": "^10.5",
"vimeo/psalm": "^5.24"
@@ -1973,22 +1976,22 @@
],
"support": {
"issues": "https://github.com/doctrine/sql-formatter/issues",
- "source": "https://github.com/doctrine/sql-formatter/tree/1.4.1"
+ "source": "https://github.com/doctrine/sql-formatter/tree/1.5.0"
},
- "time": "2024-08-05T20:32:22+00:00"
+ "time": "2024-09-11T07:29:40+00:00"
},
{
"name": "dragonmantank/cron-expression",
- "version": "v3.3.3",
+ "version": "v3.4.0",
"source": {
"type": "git",
"url": "https://github.com/dragonmantank/cron-expression.git",
- "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a"
+ "reference": "8c784d071debd117328803d86b2097615b457500"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/adfb1f505deb6384dc8b39804c5065dd3c8c8c0a",
- "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a",
+ "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/8c784d071debd117328803d86b2097615b457500",
+ "reference": "8c784d071debd117328803d86b2097615b457500",
"shasum": ""
},
"require": {
@@ -2001,10 +2004,14 @@
"require-dev": {
"phpstan/extension-installer": "^1.0",
"phpstan/phpstan": "^1.0",
- "phpstan/phpstan-webmozart-assert": "^1.0",
"phpunit/phpunit": "^7.0|^8.0|^9.0"
},
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.x-dev"
+ }
+ },
"autoload": {
"psr-4": {
"Cron\\": "src/Cron/"
@@ -2028,7 +2035,7 @@
],
"support": {
"issues": "https://github.com/dragonmantank/cron-expression/issues",
- "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.3"
+ "source": "https://github.com/dragonmantank/cron-expression/tree/v3.4.0"
},
"funding": [
{
@@ -2036,7 +2043,7 @@
"type": "github"
}
],
- "time": "2023-08-10T19:36:49+00:00"
+ "time": "2024-10-09T13:47:03+00:00"
},
{
"name": "egulias/email-validator",
@@ -2526,16 +2533,16 @@
},
{
"name": "guzzlehttp/promises",
- "version": "2.0.3",
+ "version": "2.0.4",
"source": {
"type": "git",
"url": "https://github.com/guzzle/promises.git",
- "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8"
+ "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/promises/zipball/6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8",
- "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8",
+ "url": "https://api.github.com/repos/guzzle/promises/zipball/f9c436286ab2892c7db7be8c8da4ef61ccf7b455",
+ "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455",
"shasum": ""
},
"require": {
@@ -2589,7 +2596,7 @@
],
"support": {
"issues": "https://github.com/guzzle/promises/issues",
- "source": "https://github.com/guzzle/promises/tree/2.0.3"
+ "source": "https://github.com/guzzle/promises/tree/2.0.4"
},
"funding": [
{
@@ -2605,7 +2612,7 @@
"type": "tidelift"
}
],
- "time": "2024-07-18T10:29:17+00:00"
+ "time": "2024-10-17T10:06:22+00:00"
},
{
"name": "guzzlehttp/psr7",
@@ -3789,16 +3796,16 @@
},
{
"name": "nikic/php-parser",
- "version": "v5.3.0",
+ "version": "v5.3.1",
"source": {
"type": "git",
"url": "https://github.com/nikic/PHP-Parser.git",
- "reference": "3abf7425cd284141dc5d8d14a9ee444de3345d1a"
+ "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/3abf7425cd284141dc5d8d14a9ee444de3345d1a",
- "reference": "3abf7425cd284141dc5d8d14a9ee444de3345d1a",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/8eea230464783aa9671db8eea6f8c6ac5285794b",
+ "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b",
"shasum": ""
},
"require": {
@@ -3841,9 +3848,9 @@
],
"support": {
"issues": "https://github.com/nikic/PHP-Parser/issues",
- "source": "https://github.com/nikic/PHP-Parser/tree/v5.3.0"
+ "source": "https://github.com/nikic/PHP-Parser/tree/v5.3.1"
},
- "time": "2024-09-29T13:56:26+00:00"
+ "time": "2024-10-08T18:51:32+00:00"
},
{
"name": "phar-io/manifest",
@@ -4140,16 +4147,16 @@
},
{
"name": "phpstan/phpdoc-parser",
- "version": "1.32.0",
+ "version": "1.33.0",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpdoc-parser.git",
- "reference": "6ca22b154efdd9e3c68c56f5d94670920a1c19a4"
+ "reference": "82a311fd3690fb2bf7b64d5c98f912b3dd746140"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/6ca22b154efdd9e3c68c56f5d94670920a1c19a4",
- "reference": "6ca22b154efdd9e3c68c56f5d94670920a1c19a4",
+ "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/82a311fd3690fb2bf7b64d5c98f912b3dd746140",
+ "reference": "82a311fd3690fb2bf7b64d5c98f912b3dd746140",
"shasum": ""
},
"require": {
@@ -4181,41 +4188,41 @@
"description": "PHPDoc parser with support for nullable, intersection and generic types",
"support": {
"issues": "https://github.com/phpstan/phpdoc-parser/issues",
- "source": "https://github.com/phpstan/phpdoc-parser/tree/1.32.0"
+ "source": "https://github.com/phpstan/phpdoc-parser/tree/1.33.0"
},
- "time": "2024-09-26T07:23:32+00:00"
+ "time": "2024-10-13T11:25:22+00:00"
},
{
"name": "phpunit/php-code-coverage",
- "version": "11.0.6",
+ "version": "11.0.7",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
- "reference": "ebdffc9e09585dafa71b9bffcdb0a229d4704c45"
+ "reference": "f7f08030e8811582cc459871d28d6f5a1a4d35ca"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ebdffc9e09585dafa71b9bffcdb0a229d4704c45",
- "reference": "ebdffc9e09585dafa71b9bffcdb0a229d4704c45",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f7f08030e8811582cc459871d28d6f5a1a4d35ca",
+ "reference": "f7f08030e8811582cc459871d28d6f5a1a4d35ca",
"shasum": ""
},
"require": {
"ext-dom": "*",
"ext-libxml": "*",
"ext-xmlwriter": "*",
- "nikic/php-parser": "^5.1.0",
+ "nikic/php-parser": "^5.3.1",
"php": ">=8.2",
- "phpunit/php-file-iterator": "^5.0.1",
+ "phpunit/php-file-iterator": "^5.1.0",
"phpunit/php-text-template": "^4.0.1",
"sebastian/code-unit-reverse-lookup": "^4.0.1",
"sebastian/complexity": "^4.0.1",
"sebastian/environment": "^7.2.0",
"sebastian/lines-of-code": "^3.0.1",
- "sebastian/version": "^5.0.1",
+ "sebastian/version": "^5.0.2",
"theseer/tokenizer": "^1.2.3"
},
"require-dev": {
- "phpunit/phpunit": "^11.0"
+ "phpunit/phpunit": "^11.4.1"
},
"suggest": {
"ext-pcov": "PHP extension that provides line coverage",
@@ -4253,7 +4260,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
"security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
- "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.6"
+ "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.7"
},
"funding": [
{
@@ -4261,7 +4268,7 @@
"type": "github"
}
],
- "time": "2024-08-22T04:37:56+00:00"
+ "time": "2024-10-09T06:21:38+00:00"
},
{
"name": "phpunit/php-file-iterator",
@@ -4510,16 +4517,16 @@
},
{
"name": "phpunit/phpunit",
- "version": "11.3.6",
+ "version": "11.4.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "d62c45a19c665bb872c2a47023a0baf41a98bb2b"
+ "reference": "1863643c3f04ad03dcb9c6996c294784cdda4805"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d62c45a19c665bb872c2a47023a0baf41a98bb2b",
- "reference": "d62c45a19c665bb872c2a47023a0baf41a98bb2b",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1863643c3f04ad03dcb9c6996c294784cdda4805",
+ "reference": "1863643c3f04ad03dcb9c6996c294784cdda4805",
"shasum": ""
},
"require": {
@@ -4533,21 +4540,21 @@
"phar-io/manifest": "^2.0.4",
"phar-io/version": "^3.2.1",
"php": ">=8.2",
- "phpunit/php-code-coverage": "^11.0.6",
+ "phpunit/php-code-coverage": "^11.0.7",
"phpunit/php-file-iterator": "^5.1.0",
"phpunit/php-invoker": "^5.0.1",
"phpunit/php-text-template": "^4.0.1",
"phpunit/php-timer": "^7.0.1",
"sebastian/cli-parser": "^3.0.2",
"sebastian/code-unit": "^3.0.1",
- "sebastian/comparator": "^6.1.0",
+ "sebastian/comparator": "^6.1.1",
"sebastian/diff": "^6.0.2",
"sebastian/environment": "^7.2.0",
"sebastian/exporter": "^6.1.3",
"sebastian/global-state": "^7.0.2",
"sebastian/object-enumerator": "^6.0.1",
"sebastian/type": "^5.1.0",
- "sebastian/version": "^5.0.1"
+ "sebastian/version": "^5.0.2"
},
"suggest": {
"ext-soap": "To be able to generate mocks based on WSDL files"
@@ -4558,7 +4565,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "11.3-dev"
+ "dev-main": "11.4-dev"
}
},
"autoload": {
@@ -4590,7 +4597,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
"security": "https://github.com/sebastianbergmann/phpunit/security/policy",
- "source": "https://github.com/sebastianbergmann/phpunit/tree/11.3.6"
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/11.4.2"
},
"funding": [
{
@@ -4606,7 +4613,7 @@
"type": "tidelift"
}
],
- "time": "2024-09-19T10:54:28+00:00"
+ "time": "2024-10-19T13:05:19+00:00"
},
{
"name": "psr/cache",
@@ -5945,16 +5952,16 @@
},
{
"name": "sebastian/comparator",
- "version": "6.1.0",
+ "version": "6.1.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/comparator.git",
- "reference": "fa37b9e2ca618cb051d71b60120952ee8ca8b03d"
+ "reference": "5ef523a49ae7a302b87b2102b72b1eda8918d686"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa37b9e2ca618cb051d71b60120952ee8ca8b03d",
- "reference": "fa37b9e2ca618cb051d71b60120952ee8ca8b03d",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5ef523a49ae7a302b87b2102b72b1eda8918d686",
+ "reference": "5ef523a49ae7a302b87b2102b72b1eda8918d686",
"shasum": ""
},
"require": {
@@ -6010,7 +6017,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/comparator/issues",
"security": "https://github.com/sebastianbergmann/comparator/security/policy",
- "source": "https://github.com/sebastianbergmann/comparator/tree/6.1.0"
+ "source": "https://github.com/sebastianbergmann/comparator/tree/6.1.1"
},
"funding": [
{
@@ -6018,7 +6025,7 @@
"type": "github"
}
],
- "time": "2024-09-11T15:42:56+00:00"
+ "time": "2024-10-18T15:00:48+00:00"
},
{
"name": "sebastian/complexity",
@@ -6644,16 +6651,16 @@
},
{
"name": "sebastian/version",
- "version": "5.0.1",
+ "version": "5.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/version.git",
- "reference": "45c9debb7d039ce9b97de2f749c2cf5832a06ac4"
+ "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/45c9debb7d039ce9b97de2f749c2cf5832a06ac4",
- "reference": "45c9debb7d039ce9b97de2f749c2cf5832a06ac4",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874",
+ "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874",
"shasum": ""
},
"require": {
@@ -6686,7 +6693,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/version/issues",
"security": "https://github.com/sebastianbergmann/version/security/policy",
- "source": "https://github.com/sebastianbergmann/version/tree/5.0.1"
+ "source": "https://github.com/sebastianbergmann/version/tree/5.0.2"
},
"funding": [
{
@@ -6694,7 +6701,7 @@
"type": "github"
}
],
- "time": "2024-07-03T05:13:08+00:00"
+ "time": "2024-10-09T05:16:32+00:00"
},
{
"name": "sensiolabs/ansi-to-html",
@@ -6889,16 +6896,16 @@
},
{
"name": "sonata-project/block-bundle",
- "version": "5.1.0",
+ "version": "5.1.1",
"source": {
"type": "git",
"url": "https://github.com/sonata-project/SonataBlockBundle.git",
- "reference": "95bedc0f472f27c58fd2c9e99e810aa5bee14876"
+ "reference": "039764d75c9c73a0022534676f317c9ffb9bdaac"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sonata-project/SonataBlockBundle/zipball/95bedc0f472f27c58fd2c9e99e810aa5bee14876",
- "reference": "95bedc0f472f27c58fd2c9e99e810aa5bee14876",
+ "url": "https://api.github.com/repos/sonata-project/SonataBlockBundle/zipball/039764d75c9c73a0022534676f317c9ffb9bdaac",
+ "reference": "039764d75c9c73a0022534676f317c9ffb9bdaac",
"shasum": ""
},
"require": {
@@ -6940,7 +6947,7 @@
"phpunit/phpunit": "^9.5.13",
"psalm/plugin-phpunit": "^0.18",
"psalm/plugin-symfony": "^5.0",
- "rector/rector": "^0.18",
+ "rector/rector": "^1.1",
"symfony/browser-kit": "^5.4 || ^6.2 || ^7.0",
"symfony/error-handler": "^5.4 || ^6.2 || ^7.0",
"symfony/phpunit-bridge": "^6.2 || ^7.0",
@@ -6979,7 +6986,7 @@
],
"support": {
"issues": "https://github.com/sonata-project/SonataBlockBundle/issues",
- "source": "https://github.com/sonata-project/SonataBlockBundle/tree/5.1.0"
+ "source": "https://github.com/sonata-project/SonataBlockBundle/tree/5.1.1"
},
"funding": [
{
@@ -6999,7 +7006,7 @@
"type": "github"
}
],
- "time": "2023-11-23T21:14:33+00:00"
+ "time": "2024-10-18T11:50:20+00:00"
},
{
"name": "sonata-project/doctrine-extensions",
@@ -10994,16 +11001,16 @@
},
{
"name": "symfony/security-acl",
- "version": "v3.3.3",
+ "version": "v3.3.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/security-acl.git",
- "reference": "15b96b5dd6a65cafdc96b38ef3c3cebaa8b19cb7"
+ "reference": "96a1d7e22fd456b231ab256509d492f29dfcd4c1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/security-acl/zipball/15b96b5dd6a65cafdc96b38ef3c3cebaa8b19cb7",
- "reference": "15b96b5dd6a65cafdc96b38ef3c3cebaa8b19cb7",
+ "url": "https://api.github.com/repos/symfony/security-acl/zipball/96a1d7e22fd456b231ab256509d492f29dfcd4c1",
+ "reference": "96a1d7e22fd456b231ab256509d492f29dfcd4c1",
"shasum": ""
},
"require": {
@@ -11056,7 +11063,7 @@
"homepage": "https://symfony.com",
"support": {
"issues": "https://github.com/symfony/security-acl/issues",
- "source": "https://github.com/symfony/security-acl/tree/v3.3.3"
+ "source": "https://github.com/symfony/security-acl/tree/v3.3.4"
},
"funding": [
{
@@ -11072,7 +11079,7 @@
"type": "tidelift"
}
],
- "time": "2023-05-23T18:46:27+00:00"
+ "time": "2024-10-18T06:15:14+00:00"
},
{
"name": "symfony/security-bundle",
@@ -12909,16 +12916,16 @@
},
{
"name": "bacon/bacon-qr-code",
- "version": "v3.0.0",
+ "version": "v3.0.1",
"source": {
"type": "git",
"url": "https://github.com/Bacon/BaconQrCode.git",
- "reference": "510de6eca6248d77d31b339d62437cc995e2fb41"
+ "reference": "f9cc1f52b5a463062251d666761178dbdb6b544f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/510de6eca6248d77d31b339d62437cc995e2fb41",
- "reference": "510de6eca6248d77d31b339d62437cc995e2fb41",
+ "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/f9cc1f52b5a463062251d666761178dbdb6b544f",
+ "reference": "f9cc1f52b5a463062251d666761178dbdb6b544f",
"shasum": ""
},
"require": {
@@ -12957,9 +12964,9 @@
"homepage": "https://github.com/Bacon/BaconQrCode",
"support": {
"issues": "https://github.com/Bacon/BaconQrCode/issues",
- "source": "https://github.com/Bacon/BaconQrCode/tree/v3.0.0"
+ "source": "https://github.com/Bacon/BaconQrCode/tree/v3.0.1"
},
- "time": "2024-04-18T11:16:25+00:00"
+ "time": "2024-10-01T13:55:55+00:00"
},
{
"name": "bamarni/composer-bin-plugin",
@@ -13443,16 +13450,16 @@
},
{
"name": "doctrine/migrations",
- "version": "3.8.1",
+ "version": "3.8.2",
"source": {
"type": "git",
"url": "https://github.com/doctrine/migrations.git",
- "reference": "7760fbd0b7cb58bfb50415505a7bab821adf0877"
+ "reference": "5007eb1168691225ac305fe16856755c20860842"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/migrations/zipball/7760fbd0b7cb58bfb50415505a7bab821adf0877",
- "reference": "7760fbd0b7cb58bfb50415505a7bab821adf0877",
+ "url": "https://api.github.com/repos/doctrine/migrations/zipball/5007eb1168691225ac305fe16856755c20860842",
+ "reference": "5007eb1168691225ac305fe16856755c20860842",
"shasum": ""
},
"require": {
@@ -13526,7 +13533,7 @@
],
"support": {
"issues": "https://github.com/doctrine/migrations/issues",
- "source": "https://github.com/doctrine/migrations/tree/3.8.1"
+ "source": "https://github.com/doctrine/migrations/tree/3.8.2"
},
"funding": [
{
@@ -13542,7 +13549,7 @@
"type": "tidelift"
}
],
- "time": "2024-08-28T13:17:28+00:00"
+ "time": "2024-10-10T21:35:27+00:00"
},
{
"name": "endroid/qr-code",
@@ -14192,16 +14199,16 @@
},
{
"name": "phpstan/phpstan",
- "version": "1.12.5",
+ "version": "1.12.7",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan.git",
- "reference": "7e6c6cb7cecb0a6254009a1a8a7d54ec99812b17"
+ "reference": "dc2b9976bd8b0f84ec9b0e50cc35378551de7af0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan/zipball/7e6c6cb7cecb0a6254009a1a8a7d54ec99812b17",
- "reference": "7e6c6cb7cecb0a6254009a1a8a7d54ec99812b17",
+ "url": "https://api.github.com/repos/phpstan/phpstan/zipball/dc2b9976bd8b0f84ec9b0e50cc35378551de7af0",
+ "reference": "dc2b9976bd8b0f84ec9b0e50cc35378551de7af0",
"shasum": ""
},
"require": {
@@ -14246,7 +14253,7 @@
"type": "github"
}
],
- "time": "2024-09-26T12:45:22+00:00"
+ "time": "2024-10-18T11:12:07+00:00"
},
{
"name": "phpstan/phpstan-phpunit",
@@ -14837,22 +14844,25 @@
},
{
"name": "symfony/flex",
- "version": "v1.21.7",
+ "version": "v1.21.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/flex.git",
- "reference": "33ce7c1c0fe78f8c3a106f193b6c0a7d82384462"
+ "reference": "bda5f869ac51c8e985a6fe9f964c4cb78228a369"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/flex/zipball/33ce7c1c0fe78f8c3a106f193b6c0a7d82384462",
- "reference": "33ce7c1c0fe78f8c3a106f193b6c0a7d82384462",
+ "url": "https://api.github.com/repos/symfony/flex/zipball/bda5f869ac51c8e985a6fe9f964c4cb78228a369",
+ "reference": "bda5f869ac51c8e985a6fe9f964c4cb78228a369",
"shasum": ""
},
"require": {
"composer-plugin-api": "^1.0|^2.0",
"php": ">=7.1"
},
+ "conflict": {
+ "composer/semver": "<1.7.2"
+ },
"require-dev": {
"composer/composer": "^1.0.2|^2.0",
"symfony/dotenv": "^4.4|^5.0|^6.0",
@@ -14882,7 +14892,7 @@
"description": "Composer plugin for Symfony",
"support": {
"issues": "https://github.com/symfony/flex/issues",
- "source": "https://github.com/symfony/flex/tree/v1.21.7"
+ "source": "https://github.com/symfony/flex/tree/v1.21.8"
},
"funding": [
{
@@ -14898,7 +14908,7 @@
"type": "tidelift"
}
],
- "time": "2024-04-27T10:20:37+00:00"
+ "time": "2024-10-07T08:51:39+00:00"
},
{
"name": "symfony/http-client",
@@ -15556,7 +15566,7 @@
],
"aliases": [],
"minimum-stability": "dev",
- "stability-flags": [],
+ "stability-flags": {},
"prefer-stable": true,
"prefer-lowest": false,
"platform": {
diff --git a/doc/databse.svg b/doc/database.svg
similarity index 100%
rename from doc/databse.svg
rename to doc/database.svg
diff --git a/doc/user.svg b/doc/user.svg
new file mode 100644
index 00000000..ab83d643
--- /dev/null
+++ b/doc/user.svg
@@ -0,0 +1,482 @@
+
+
+
+
+
diff --git a/packages/dependency-injection/Integration/Test/IntegrationTestCase.php b/packages/dependency-injection/Integration/Test/IntegrationTestCase.php
index 71ceab9b..0efc1999 100644
--- a/packages/dependency-injection/Integration/Test/IntegrationTestCase.php
+++ b/packages/dependency-injection/Integration/Test/IntegrationTestCase.php
@@ -59,11 +59,9 @@ public function testGetConfigSectionName(): void
public function testDefaultConfiguration(): void
{
- $config = $this->processConfiguration([[]]);
-
- static::assertEqualsCanonicalizing(
- $this->getDefaultConfiguration(),
- $config
+ static::assertJsonStringEqualsJsonString(
+ json_encode($this->processConfiguration()),
+ json_encode($this->getDefaultConfiguration()),
);
}
diff --git a/packages/doctrine-extra/ORM/Command/GenerateGraphSchemaCommand.php b/packages/doctrine-extra/ORM/Command/GenerateGraphSchemaCommand.php
index 9c4ac595..6a89cd41 100644
--- a/packages/doctrine-extra/ORM/Command/GenerateGraphSchemaCommand.php
+++ b/packages/doctrine-extra/ORM/Command/GenerateGraphSchemaCommand.php
@@ -2,11 +2,11 @@
namespace Draw\DoctrineExtra\ORM\Command;
-use Doctrine\DBAL\Schema\Visitor\Graphviz;
use Doctrine\ORM\EntityManagerInterface;
-use Doctrine\ORM\Mapping\ClassMetadata;
-use Doctrine\ORM\Tools\SchemaTool;
+use Draw\DoctrineExtra\ORM\GraphSchema\Context;
+use Draw\DoctrineExtra\ORM\GraphSchema\GraphGenerator;
use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
@@ -14,8 +14,9 @@
class GenerateGraphSchemaCommand extends Command
{
public function __construct(
- private EntityManagerInterface $entityManager)
- {
+ private EntityManagerInterface $entityManager,
+ private GraphGenerator $graphGenerator,
+ ) {
parent::__construct();
}
@@ -23,6 +24,7 @@ protected function configure(): void
{
$this
->setName('draw:doctrine:generate-graph-schema')
+ ->addArgument('context-name', InputArgument::OPTIONAL, 'The context name to use.', 'default')
->setDescription('Get dot from database schema.')
->setHelp(\sprintf('Usage: bin/console %s | dot -Tsvg -o /tmp/databse.svg', $this->getName()))
;
@@ -31,45 +33,13 @@ protected function configure(): void
protected function execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
- $io->writeln($this->getDot());
+ $io->writeln(
+ $this->graphGenerator
+ ->generate(
+ new Context($this->entityManager, $input->getArgument('context-name'))
+ )
+ );
return Command::SUCCESS;
}
-
- /**
- * Get dot from database schema.
- */
- protected function getDot(): string
- {
- /** @var array> $metadata */
- $metadata = $this->entityManager->getMetadataFactory()->getAllMetadata();
-
- usort($metadata, static fn (ClassMetadata $a, ClassMetadata $b): int => $a->getTableName() <=> $b->getTableName());
-
- $tool = new SchemaTool($this->entityManager);
- $schema = $tool->getSchemaFromMetadata($metadata);
-
- $visitor = new Graphviz();
-
- $visitor->acceptSchema($schema);
-
- foreach ($schema->getTables() as $table) {
- $visitor->acceptTable($table);
- foreach ($table->getColumns() as $column) {
- $visitor->acceptColumn($table, $column);
- }
- foreach ($table->getIndexes() as $index) {
- $visitor->acceptIndex($table, $index);
- }
- foreach ($table->getForeignKeys() as $foreignKey) {
- $visitor->acceptForeignKey($table, $foreignKey);
- }
- }
-
- foreach ($schema->getSequences() as $sequence) {
- $visitor->acceptSequence($sequence);
- }
-
- return $visitor->getOutput();
- }
}
diff --git a/packages/doctrine-extra/ORM/GraphSchema/Context.php b/packages/doctrine-extra/ORM/GraphSchema/Context.php
new file mode 100644
index 00000000..65671e91
--- /dev/null
+++ b/packages/doctrine-extra/ORM/GraphSchema/Context.php
@@ -0,0 +1,93 @@
+entityManager;
+ }
+
+ public function getName(): string
+ {
+ return $this->name;
+ }
+
+ public function setIgnoreAll(bool $ignoreAll): self
+ {
+ $this->ignoreAll = $ignoreAll;
+
+ return $this;
+ }
+
+ public function getIgnoreAll(): bool
+ {
+ return $this->ignoreAll;
+ }
+
+ public function forEntity(string $entity): self
+ {
+ if (!\in_array($entity, $this->ignoreEntities, true)) {
+ $this->forEntities[] = $entity;
+ }
+
+ return $this;
+ }
+
+ public function getForEntities(): array
+ {
+ return $this->forEntities;
+ }
+
+ public function forEntityCluster(string $entity, bool $includeReverseRelation = true): self
+ {
+ $this->forEntities[] = $entity;
+
+ foreach ($this->entityManager->getClassMetadata($entity)->getAssociationMappings() as $associationMapping) {
+ $this->forEntity($associationMapping['targetEntity']);
+ }
+
+ if ($includeReverseRelation) {
+ foreach ($this->entityManager->getMetadataFactory()->getAllMetadata() as $metadata) {
+ foreach ($metadata->getAssociationMappings() as $associationMapping) {
+ if ($associationMapping['targetEntity'] !== $entity) {
+ continue;
+ }
+
+ $this->forEntity($associationMapping['sourceEntity']);
+ }
+ }
+ }
+
+ return $this;
+ }
+
+ public function ignoreEntity(string $entity): self
+ {
+ $this->ignoreEntities[] = $entity;
+
+ return $this;
+ }
+
+ public function getIgnoreEntities(): array
+ {
+ return $this->ignoreEntities;
+ }
+}
diff --git a/packages/doctrine-extra/ORM/GraphSchema/Event/PrepareContextEvent.php b/packages/doctrine-extra/ORM/GraphSchema/Event/PrepareContextEvent.php
new file mode 100644
index 00000000..0a5c7eb3
--- /dev/null
+++ b/packages/doctrine-extra/ORM/GraphSchema/Event/PrepareContextEvent.php
@@ -0,0 +1,20 @@
+context;
+ }
+}
diff --git a/packages/doctrine-extra/ORM/GraphSchema/GraphGenerator.php b/packages/doctrine-extra/ORM/GraphSchema/GraphGenerator.php
new file mode 100644
index 00000000..f871e98e
--- /dev/null
+++ b/packages/doctrine-extra/ORM/GraphSchema/GraphGenerator.php
@@ -0,0 +1,105 @@
+eventDispatcher->dispatch(new Event\PrepareContextEvent($context));
+
+ $entityManager = $context->getEntityManager();
+
+ /** @var array> $metadata */
+ $metadata = $entityManager->getMetadataFactory()->getAllMetadata();
+
+ usort($metadata, static fn (ClassMetadata $a, ClassMetadata $b): int => $a->getTableName() <=> $b->getTableName());
+
+ $tool = new SchemaTool($entityManager);
+ $schema = $tool->getSchemaFromMetadata($metadata);
+
+ $visitor = new Graphviz();
+
+ $visitor->acceptSchema($schema);
+
+ $ignoreTables = $this->buildIgnoreTables($context);
+
+ foreach ($schema->getTables() as $table) {
+ if (\in_array($table->getName(), $ignoreTables, true)) {
+ continue;
+ }
+
+ $visitor->acceptTable($table);
+ foreach ($table->getColumns() as $column) {
+ $visitor->acceptColumn($table, $column);
+ }
+ foreach ($table->getIndexes() as $index) {
+ $visitor->acceptIndex($table, $index);
+ }
+ foreach ($table->getForeignKeys() as $foreignKey) {
+ $visitor->acceptForeignKey($table, $foreignKey);
+ }
+ }
+
+ foreach ($schema->getSequences() as $sequence) {
+ $visitor->acceptSequence($sequence);
+ }
+
+ return $visitor->getOutput();
+ }
+
+ private function buildIgnoreTables(Context $context): array
+ {
+ $entityManager = $context->getEntityManager();
+ $ignoreTables = [];
+
+ if ($context->getIgnoreAll()) {
+ foreach ($entityManager->getMetadataFactory()->getAllMetadata() as $metadata) {
+ $ignoreTables[] = $metadata->getTableName();
+ foreach ($metadata->getAssociationMappings() as $associationMapping) {
+ if (!isset($associationMapping['joinTable'])) {
+ continue;
+ }
+
+ $ignoreTables[] = $associationMapping['joinTable']['name'];
+ }
+ }
+ }
+
+ $forEntities = $context->getForEntities();
+ foreach ($forEntities as $entity) {
+ $metadata = $entityManager->getClassMetadata($entity);
+ $ignoreTables = array_diff(
+ $ignoreTables,
+ [$metadata->getTableName()],
+ );
+
+ foreach ($metadata->getAssociationMappings() as $associationMapping) {
+ if (!isset($associationMapping['joinTable'])) {
+ continue;
+ }
+
+ if (!\in_array($associationMapping['targetEntity'], $forEntities, true)) {
+ continue;
+ }
+
+ $ignoreTables = array_diff(
+ $ignoreTables,
+ [$associationMapping['joinTable']['name']],
+ );
+ }
+ }
+
+ return array_values($ignoreTables);
+ }
+}
diff --git a/packages/doctrine-extra/Tests/DependencyInjection/DoctrineExtraIntegrationTest.php b/packages/doctrine-extra/Tests/DependencyInjection/DoctrineExtraIntegrationTest.php
index 10b271ff..222c7eea 100644
--- a/packages/doctrine-extra/Tests/DependencyInjection/DoctrineExtraIntegrationTest.php
+++ b/packages/doctrine-extra/Tests/DependencyInjection/DoctrineExtraIntegrationTest.php
@@ -12,6 +12,7 @@
use Draw\DoctrineExtra\ORM\Command\MysqlDumpCommand;
use Draw\DoctrineExtra\ORM\Command\MysqlImportFileCommand;
use Draw\DoctrineExtra\ORM\EntityHandler;
+use Draw\DoctrineExtra\ORM\GraphSchema\GraphGenerator;
use PHPUnit\Framework\Attributes\CoversClass;
use Symfony\Component\DependencyInjection\ContainerBuilder;
@@ -83,6 +84,12 @@ public static function provideTestLoad(): iterable
GenerateGraphSchemaCommand::class,
]
),
+ new ServiceConfiguration(
+ 'draw.doctrine_extra.orm.graph_schema.graph_generator',
+ [
+ GraphGenerator::class,
+ ]
+ ),
],
[
'doctrine' => [
diff --git a/packages/tester/Test/DependencyInjection/ConfigurationTestCase.php b/packages/tester/Test/DependencyInjection/ConfigurationTestCase.php
index 6f0754a9..53497877 100644
--- a/packages/tester/Test/DependencyInjection/ConfigurationTestCase.php
+++ b/packages/tester/Test/DependencyInjection/ConfigurationTestCase.php
@@ -47,11 +47,9 @@ public function testInvalidConfiguration(array $configuration, string $expectedM
public function testDefault(): void
{
- $config = $this->processConfiguration([[]]);
-
- static::assertEqualsCanonicalizing(
- $this->getDefaultConfiguration(),
- $config
+ static::assertJsonStringEqualsJsonString(
+ json_encode($this->getDefaultConfiguration()),
+ json_encode($this->processConfiguration([[]]))
);
}
diff --git a/tests/AppKernelTest.php b/tests/AppKernelTest.php
index f397366d..856c6fec 100644
--- a/tests/AppKernelTest.php
+++ b/tests/AppKernelTest.php
@@ -12,10 +12,16 @@ class AppKernelTest extends KernelTestCase
{
use EventDispatcherTesterTrait;
+ private bool $resetFile = false;
+
public function testEventDispatcherConfiguration(): void
{
- $this->assertEventDispatcherConfiguration(
- __DIR__.'/fixtures/AppKernelTest/testEventDispatcherConfiguration/event_dispatcher.xml'
- );
+ $path = __DIR__.'/fixtures/AppKernelTest/testEventDispatcherConfiguration/event_dispatcher.xml';
+
+ if ($this->resetFile && file_exists($path)) {
+ unlink($path);
+ }
+
+ $this->assertEventDispatcherConfiguration($path);
}
}
diff --git a/tests/DoctrineExtra/ORM/Command/GenerateGraphSchemaCommandTest.php b/tests/DoctrineExtra/ORM/Command/GenerateGraphSchemaCommandTest.php
index 20b9befe..7437adee 100644
--- a/tests/DoctrineExtra/ORM/Command/GenerateGraphSchemaCommandTest.php
+++ b/tests/DoctrineExtra/ORM/Command/GenerateGraphSchemaCommandTest.php
@@ -9,6 +9,7 @@
use Draw\DoctrineExtra\ORM\Command\GenerateGraphSchemaCommand;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
/**
* @internal
@@ -27,7 +28,11 @@ public function getCommandName(): string
public static function provideTestArgument(): iterable
{
- return [];
+ yield [
+ 'context-name',
+ InputArgument::OPTIONAL,
+ 'default',
+ ];
}
public static function provideTestOption(): iterable
@@ -42,7 +47,7 @@ public static function provideTestOption(): iterable
*/
public function testExecute(): void
{
- $this->execute([])
+ $this->execute(['context-name' => 'user'])
->test(
CommandDataTester::create()
->setExpectedDisplay(null)
diff --git a/tests/fixtures/AppKernelTest/testEventDispatcherConfiguration/event_dispatcher.xml b/tests/fixtures/AppKernelTest/testEventDispatcherConfiguration/event_dispatcher.xml
index 3f94383e..bb8dc50e 100644
--- a/tests/fixtures/AppKernelTest/testEventDispatcherConfiguration/event_dispatcher.xml
+++ b/tests/fixtures/AppKernelTest/testEventDispatcherConfiguration/event_dispatcher.xml
@@ -89,6 +89,9 @@
+
+
+
diff --git a/vendor-bin/monorepo/composer.lock b/vendor-bin/monorepo/composer.lock
index 6e449505..8d5719a2 100644
--- a/vendor-bin/monorepo/composer.lock
+++ b/vendor-bin/monorepo/composer.lock
@@ -62,10 +62,10 @@
"packages-dev": [],
"aliases": [],
"minimum-stability": "stable",
- "stability-flags": [],
+ "stability-flags": {},
"prefer-stable": false,
"prefer-lowest": false,
- "platform": [],
- "platform-dev": [],
+ "platform": {},
+ "platform-dev": {},
"plugin-api-version": "2.6.0"
}