wesmiler hace 2 años
padre
commit
49c9183352
Se han modificado 85 ficheros con 3163 adiciones y 181 borrados
  1. 40 40
      composer.lock
  2. 1 0
      vendor/composer/autoload_classmap.php
  3. 1 0
      vendor/composer/autoload_static.php
  4. 71 79
      vendor/composer/installed.json
  5. 24 24
      vendor/composer/installed.php
  6. 8 0
      vendor/phpunit/php-file-iterator/.psalm/baseline.xml
  7. 16 0
      vendor/phpunit/php-file-iterator/.psalm/config.xml
  8. 144 0
      vendor/phpunit/php-file-iterator/ChangeLog.md
  9. 33 0
      vendor/phpunit/php-file-iterator/LICENSE
  10. 14 0
      vendor/phpunit/php-file-iterator/README.md
  11. 45 0
      vendor/phpunit/php-file-iterator/composer.json
  12. 115 0
      vendor/phpunit/php-file-iterator/src/Facade.php
  13. 91 0
      vendor/phpunit/php-file-iterator/src/Factory.php
  14. 119 0
      vendor/phpunit/php-file-iterator/src/Iterator.php
  15. 14 0
      vendor/sebastian/complexity/.gitattributes
  16. 1 0
      vendor/sebastian/complexity/.github/FUNDING.yml
  17. 131 0
      vendor/sebastian/complexity/.github/workflows/ci.yml
  18. 6 0
      vendor/sebastian/complexity/.gitignore
  19. 7 0
      vendor/sebastian/complexity/.phive/phars.xml
  20. 230 0
      vendor/sebastian/complexity/.php_cs.dist
  21. 7 0
      vendor/sebastian/complexity/ChangeLog.md
  22. 31 0
      vendor/sebastian/complexity/build.xml
  23. 2 1
      vendor/sebastian/complexity/composer.json
  24. 23 0
      vendor/sebastian/complexity/infection.json
  25. 24 0
      vendor/sebastian/complexity/phpunit.xml
  26. 1 8
      vendor/sebastian/complexity/src/Calculator.php
  27. 46 0
      vendor/sebastian/complexity/tests/_fixture/ExampleClass.php
  28. 46 0
      vendor/sebastian/complexity/tests/_fixture/ExampleTrait.php
  29. 43 0
      vendor/sebastian/complexity/tests/_fixture/example_function.php
  30. 72 0
      vendor/sebastian/complexity/tests/integration/CalculatorTest.php
  31. 84 0
      vendor/sebastian/complexity/tests/unit/ComplexityCalculatingVisitorTest.php
  32. 78 0
      vendor/sebastian/complexity/tests/unit/ComplexityCollectionTest.php
  33. 35 0
      vendor/sebastian/complexity/tests/unit/ComplexityTest.php
  34. 41 0
      vendor/sebastian/complexity/tests/unit/CyclomaticComplexityCalculatingVisitorTest.php
  35. BIN
      vendor/sebastian/complexity/tools/composer
  36. BIN
      vendor/sebastian/complexity/tools/infection
  37. BIN
      vendor/sebastian/complexity/tools/php-cs-fixer
  38. BIN
      vendor/sebastian/complexity/tools/psalm
  39. BIN
      vendor/sebastian/complexity/tools/roave-backward-compatibility-check
  40. 14 0
      vendor/sebastian/lines-of-code/.gitattributes
  41. 1 0
      vendor/sebastian/lines-of-code/.github/FUNDING.yml
  42. 98 0
      vendor/sebastian/lines-of-code/.github/workflows/ci.yml
  43. 6 0
      vendor/sebastian/lines-of-code/.gitignore
  44. 8 0
      vendor/sebastian/lines-of-code/.phive/phars.xml
  45. 230 0
      vendor/sebastian/lines-of-code/.php_cs.dist
  46. 7 0
      vendor/sebastian/lines-of-code/ChangeLog.md
  47. 27 0
      vendor/sebastian/lines-of-code/build.xml
  48. 1 1
      vendor/sebastian/lines-of-code/composer.json
  49. 12 0
      vendor/sebastian/lines-of-code/infection.json
  50. 24 0
      vendor/sebastian/lines-of-code/phpunit.xml
  51. 1 8
      vendor/sebastian/lines-of-code/src/Counter.php
  52. 43 0
      vendor/sebastian/lines-of-code/tests/_fixture/ExampleClass.php
  53. 36 0
      vendor/sebastian/lines-of-code/tests/_fixture/source_with_ignore.php
  54. 1 0
      vendor/sebastian/lines-of-code/tests/_fixture/source_without_newline.php
  55. 71 0
      vendor/sebastian/lines-of-code/tests/integration/CounterTest.php
  56. 76 0
      vendor/sebastian/lines-of-code/tests/unit/LineCountingVisitorTest.php
  57. 113 0
      vendor/sebastian/lines-of-code/tests/unit/LinesOfCodeTest.php
  58. BIN
      vendor/sebastian/lines-of-code/tools/composer
  59. BIN
      vendor/sebastian/lines-of-code/tools/infection
  60. BIN
      vendor/sebastian/lines-of-code/tools/php-cs-fixer
  61. BIN
      vendor/sebastian/lines-of-code/tools/psalm
  62. BIN
      vendor/sebastian/lines-of-code/tools/roave-backward-compatibility-check
  63. 11 0
      vendor/yansongda/supports/.gitattributes
  64. 45 0
      vendor/yansongda/supports/.github/workflows/style.yml
  65. 29 0
      vendor/yansongda/supports/.github/workflows/tester.yml
  66. 4 0
      vendor/yansongda/supports/.gitignore
  67. 1 0
      vendor/yansongda/supports/.php-cs-fixer.php
  68. 19 0
      vendor/yansongda/supports/phpunit.xml
  69. 5 5
      vendor/yansongda/supports/src/Arr.php
  70. 5 5
      vendor/yansongda/supports/src/Collection.php
  71. 1 3
      vendor/yansongda/supports/src/Config.php
  72. 1 1
      vendor/yansongda/supports/src/Functions.php
  73. 2 2
      vendor/yansongda/supports/src/Str.php
  74. 1 3
      vendor/yansongda/supports/src/Traits/Accessable.php
  75. 1 1
      vendor/yansongda/supports/src/Traits/Serializable.php
  76. 107 0
      vendor/yansongda/supports/tests/ArrTest.php
  77. 102 0
      vendor/yansongda/supports/tests/CollectionTest.php
  78. 17 0
      vendor/yansongda/supports/tests/ConfigTest.php
  79. 18 0
      vendor/yansongda/supports/tests/FunctionTest.php
  80. 239 0
      vendor/yansongda/supports/tests/PipelineTest.php
  81. 33 0
      vendor/yansongda/supports/tests/StrTest.php
  82. 19 0
      vendor/yansongda/supports/tests/Stubs/FooPipeline.php
  83. 31 0
      vendor/yansongda/supports/tests/Stubs/TraitStub.php
  84. 29 0
      vendor/yansongda/supports/tests/Traits/ArrayAccessTest.php
  85. 30 0
      vendor/yansongda/supports/tests/Traits/SerializableTest.php

+ 40 - 40
composer.lock

@@ -3120,16 +3120,16 @@
         },
         {
             "name": "maatwebsite/excel",
-            "version": "3.1.50",
+            "version": "3.1.51",
             "source": {
                 "type": "git",
                 "url": "https://github.com/SpartnerNL/Laravel-Excel.git",
-                "reference": "d79e66391aa306983bb7e234503f5605c3e33348"
+                "reference": "6d3c78ce6645abada32e03b40dc7f3c561878bc3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/SpartnerNL/Laravel-Excel/zipball/d79e66391aa306983bb7e234503f5605c3e33348",
-                "reference": "d79e66391aa306983bb7e234503f5605c3e33348",
+                "url": "https://api.github.com/repos/SpartnerNL/Laravel-Excel/zipball/6d3c78ce6645abada32e03b40dc7f3c561878bc3",
+                "reference": "6d3c78ce6645abada32e03b40dc7f3c561878bc3",
                 "shasum": ""
             },
             "require": {
@@ -3184,7 +3184,7 @@
             ],
             "support": {
                 "issues": "https://github.com/SpartnerNL/Laravel-Excel/issues",
-                "source": "https://github.com/SpartnerNL/Laravel-Excel/tree/3.1.50"
+                "source": "https://github.com/SpartnerNL/Laravel-Excel/tree/3.1.51"
             },
             "funding": [
                 {
@@ -3196,7 +3196,7 @@
                     "type": "github"
                 }
             ],
-            "time": "2023-11-06T11:29:48+00:00"
+            "time": "2023-12-08T12:44:49+00:00"
         },
         {
             "name": "maennchen/zipstream-php",
@@ -5218,16 +5218,16 @@
         },
         {
             "name": "react/socket",
-            "version": "v1.14.0",
+            "version": "v1.15.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/reactphp/socket.git",
-                "reference": "21591111d3ea62e31f2254280ca0656bc2b1bda6"
+                "reference": "216d3aec0b87f04a40ca04f481e6af01bdd1d038"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/reactphp/socket/zipball/21591111d3ea62e31f2254280ca0656bc2b1bda6",
-                "reference": "21591111d3ea62e31f2254280ca0656bc2b1bda6",
+                "url": "https://api.github.com/repos/reactphp/socket/zipball/216d3aec0b87f04a40ca04f481e6af01bdd1d038",
+                "reference": "216d3aec0b87f04a40ca04f481e6af01bdd1d038",
                 "shasum": ""
             },
             "require": {
@@ -5239,7 +5239,7 @@
                 "react/stream": "^1.2"
             },
             "require-dev": {
-                "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35",
+                "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36",
                 "react/async": "^4 || ^3 || ^2",
                 "react/promise-stream": "^1.4",
                 "react/promise-timer": "^1.10"
@@ -5247,7 +5247,7 @@
             "type": "library",
             "autoload": {
                 "psr-4": {
-                    "React\\Socket\\": "src"
+                    "React\\Socket\\": "src/"
                 }
             },
             "notification-url": "https://packagist.org/downloads/",
@@ -5286,7 +5286,7 @@
             ],
             "support": {
                 "issues": "https://github.com/reactphp/socket/issues",
-                "source": "https://github.com/reactphp/socket/tree/v1.14.0"
+                "source": "https://github.com/reactphp/socket/tree/v1.15.0"
             },
             "funding": [
                 {
@@ -5294,7 +5294,7 @@
                     "type": "open_collective"
                 }
             ],
-            "time": "2023-08-25T13:48:09+00:00"
+            "time": "2023-12-15T11:02:10+00:00"
         },
         {
             "name": "react/stream",
@@ -8263,16 +8263,16 @@
         },
         {
             "name": "yansongda/supports",
-            "version": "v4.0.2",
+            "version": "v4.0.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/yansongda/supports.git",
-                "reference": "4a9cefecfcbe3f6826b6ae2d803f5094bd923498"
+                "reference": "73e01ed827202b33395c0827943410f6dbd790a4"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/yansongda/supports/zipball/4a9cefecfcbe3f6826b6ae2d803f5094bd923498",
-                "reference": "4a9cefecfcbe3f6826b6ae2d803f5094bd923498",
+                "url": "https://api.github.com/repos/yansongda/supports/zipball/73e01ed827202b33395c0827943410f6dbd790a4",
+                "reference": "73e01ed827202b33395c0827943410f6dbd790a4",
                 "shasum": ""
             },
             "require": {
@@ -8318,7 +8318,7 @@
                 "issues": "https://github.com/yansongda/supports/issues",
                 "source": "https://github.com/yansongda/supports"
             },
-            "time": "2023-06-19T13:04:31+00:00"
+            "time": "2023-12-23T15:04:07+00:00"
         }
     ],
     "packages-dev": [
@@ -9120,23 +9120,23 @@
         },
         {
             "name": "phpunit/php-code-coverage",
-            "version": "9.2.29",
+            "version": "9.2.30",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
-                "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76"
+                "reference": "ca2bd87d2f9215904682a9cb9bb37dda98e76089"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/6a3a87ac2bbe33b25042753df8195ba4aa534c76",
-                "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ca2bd87d2f9215904682a9cb9bb37dda98e76089",
+                "reference": "ca2bd87d2f9215904682a9cb9bb37dda98e76089",
                 "shasum": ""
             },
             "require": {
                 "ext-dom": "*",
                 "ext-libxml": "*",
                 "ext-xmlwriter": "*",
-                "nikic/php-parser": "^4.15",
+                "nikic/php-parser": "^4.18 || ^5.0",
                 "php": ">=7.3",
                 "phpunit/php-file-iterator": "^3.0.3",
                 "phpunit/php-text-template": "^2.0.2",
@@ -9186,7 +9186,7 @@
             "support": {
                 "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
                 "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
-                "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.29"
+                "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.30"
             },
             "funding": [
                 {
@@ -9194,7 +9194,7 @@
                     "type": "github"
                 }
             ],
-            "time": "2023-09-19T04:57:46+00:00"
+            "time": "2023-12-22T06:47:57+00:00"
         },
         {
             "name": "phpunit/php-file-iterator",
@@ -9783,20 +9783,20 @@
         },
         {
             "name": "sebastian/complexity",
-            "version": "2.0.2",
+            "version": "2.0.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/complexity.git",
-                "reference": "739b35e53379900cc9ac327b2147867b8b6efd88"
+                "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88",
-                "reference": "739b35e53379900cc9ac327b2147867b8b6efd88",
+                "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a",
+                "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a",
                 "shasum": ""
             },
             "require": {
-                "nikic/php-parser": "^4.7",
+                "nikic/php-parser": "^4.18 || ^5.0",
                 "php": ">=7.3"
             },
             "require-dev": {
@@ -9828,7 +9828,7 @@
             "homepage": "https://github.com/sebastianbergmann/complexity",
             "support": {
                 "issues": "https://github.com/sebastianbergmann/complexity/issues",
-                "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2"
+                "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3"
             },
             "funding": [
                 {
@@ -9836,7 +9836,7 @@
                     "type": "github"
                 }
             ],
-            "time": "2020-10-26T15:52:27+00:00"
+            "time": "2023-12-22T06:19:30+00:00"
         },
         {
             "name": "sebastian/diff",
@@ -10110,20 +10110,20 @@
         },
         {
             "name": "sebastian/lines-of-code",
-            "version": "1.0.3",
+            "version": "1.0.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/lines-of-code.git",
-                "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc"
+                "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc",
-                "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc",
+                "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5",
+                "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5",
                 "shasum": ""
             },
             "require": {
-                "nikic/php-parser": "^4.6",
+                "nikic/php-parser": "^4.18 || ^5.0",
                 "php": ">=7.3"
             },
             "require-dev": {
@@ -10155,7 +10155,7 @@
             "homepage": "https://github.com/sebastianbergmann/lines-of-code",
             "support": {
                 "issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
-                "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3"
+                "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4"
             },
             "funding": [
                 {
@@ -10163,7 +10163,7 @@
                     "type": "github"
                 }
             ],
-            "time": "2020-11-28T06:42:11+00:00"
+            "time": "2023-12-22T06:20:34+00:00"
         },
         {
             "name": "sebastian/object-enumerator",

+ 1 - 0
vendor/composer/autoload_classmap.php

@@ -3317,6 +3317,7 @@ return array(
     'Maatwebsite\\Excel\\Imports\\ModelManager' => $vendorDir . '/maatwebsite/excel/src/Imports/ModelManager.php',
     'Maatwebsite\\Excel\\Jobs\\AfterImportJob' => $vendorDir . '/maatwebsite/excel/src/Jobs/AfterImportJob.php',
     'Maatwebsite\\Excel\\Jobs\\AppendDataToSheet' => $vendorDir . '/maatwebsite/excel/src/Jobs/AppendDataToSheet.php',
+    'Maatwebsite\\Excel\\Jobs\\AppendPaginatedToSheet' => $vendorDir . '/maatwebsite/excel/src/Jobs/AppendPaginatedToSheet.php',
     'Maatwebsite\\Excel\\Jobs\\AppendQueryToSheet' => $vendorDir . '/maatwebsite/excel/src/Jobs/AppendQueryToSheet.php',
     'Maatwebsite\\Excel\\Jobs\\AppendViewToSheet' => $vendorDir . '/maatwebsite/excel/src/Jobs/AppendViewToSheet.php',
     'Maatwebsite\\Excel\\Jobs\\CloseSheet' => $vendorDir . '/maatwebsite/excel/src/Jobs/CloseSheet.php',

+ 1 - 0
vendor/composer/autoload_static.php

@@ -4061,6 +4061,7 @@ class ComposerStaticInit1a9b1e9644d804e0a8b273eb5675a9b4
         'Maatwebsite\\Excel\\Imports\\ModelManager' => __DIR__ . '/..' . '/maatwebsite/excel/src/Imports/ModelManager.php',
         'Maatwebsite\\Excel\\Jobs\\AfterImportJob' => __DIR__ . '/..' . '/maatwebsite/excel/src/Jobs/AfterImportJob.php',
         'Maatwebsite\\Excel\\Jobs\\AppendDataToSheet' => __DIR__ . '/..' . '/maatwebsite/excel/src/Jobs/AppendDataToSheet.php',
+        'Maatwebsite\\Excel\\Jobs\\AppendPaginatedToSheet' => __DIR__ . '/..' . '/maatwebsite/excel/src/Jobs/AppendPaginatedToSheet.php',
         'Maatwebsite\\Excel\\Jobs\\AppendQueryToSheet' => __DIR__ . '/..' . '/maatwebsite/excel/src/Jobs/AppendQueryToSheet.php',
         'Maatwebsite\\Excel\\Jobs\\AppendViewToSheet' => __DIR__ . '/..' . '/maatwebsite/excel/src/Jobs/AppendViewToSheet.php',
         'Maatwebsite\\Excel\\Jobs\\CloseSheet' => __DIR__ . '/..' . '/maatwebsite/excel/src/Jobs/CloseSheet.php',

+ 71 - 79
vendor/composer/installed.json

@@ -3733,17 +3733,17 @@
         },
         {
             "name": "maatwebsite/excel",
-            "version": "3.1.50",
-            "version_normalized": "3.1.50.0",
+            "version": "3.1.51",
+            "version_normalized": "3.1.51.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/SpartnerNL/Laravel-Excel.git",
-                "reference": "d79e66391aa306983bb7e234503f5605c3e33348"
+                "reference": "6d3c78ce6645abada32e03b40dc7f3c561878bc3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/SpartnerNL/Laravel-Excel/zipball/d79e66391aa306983bb7e234503f5605c3e33348",
-                "reference": "d79e66391aa306983bb7e234503f5605c3e33348",
+                "url": "https://api.github.com/repos/SpartnerNL/Laravel-Excel/zipball/6d3c78ce6645abada32e03b40dc7f3c561878bc3",
+                "reference": "6d3c78ce6645abada32e03b40dc7f3c561878bc3",
                 "shasum": ""
             },
             "require": {
@@ -3758,7 +3758,7 @@
                 "orchestra/testbench": "^6.0||^7.0||^8.0",
                 "predis/predis": "^1.1"
             },
-            "time": "2023-11-06T11:29:48+00:00",
+            "time": "2023-12-08T12:44:49+00:00",
             "type": "library",
             "extra": {
                 "laravel": {
@@ -3800,7 +3800,7 @@
             ],
             "support": {
                 "issues": "https://github.com/SpartnerNL/Laravel-Excel/issues",
-                "source": "https://github.com/SpartnerNL/Laravel-Excel/tree/3.1.50"
+                "source": "https://github.com/SpartnerNL/Laravel-Excel/tree/3.1.51"
             },
             "funding": [
                 {
@@ -5113,24 +5113,24 @@
         },
         {
             "name": "phpunit/php-code-coverage",
-            "version": "9.2.29",
-            "version_normalized": "9.2.29.0",
+            "version": "9.2.30",
+            "version_normalized": "9.2.30.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
-                "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76"
+                "reference": "ca2bd87d2f9215904682a9cb9bb37dda98e76089"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/6a3a87ac2bbe33b25042753df8195ba4aa534c76",
-                "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ca2bd87d2f9215904682a9cb9bb37dda98e76089",
+                "reference": "ca2bd87d2f9215904682a9cb9bb37dda98e76089",
                 "shasum": ""
             },
             "require": {
                 "ext-dom": "*",
                 "ext-libxml": "*",
                 "ext-xmlwriter": "*",
-                "nikic/php-parser": "^4.15",
+                "nikic/php-parser": "^4.18 || ^5.0",
                 "php": ">=7.3",
                 "phpunit/php-file-iterator": "^3.0.3",
                 "phpunit/php-text-template": "^2.0.2",
@@ -5148,7 +5148,7 @@
                 "ext-pcov": "PHP extension that provides line coverage",
                 "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage"
             },
-            "time": "2023-09-19T04:57:46+00:00",
+            "time": "2023-12-22T06:47:57+00:00",
             "type": "library",
             "extra": {
                 "branch-alias": {
@@ -5182,7 +5182,7 @@
             "support": {
                 "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
                 "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
-                "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.29"
+                "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.30"
             },
             "funding": [
                 {
@@ -5268,13 +5268,7 @@
                 "type": "zip",
                 "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
                 "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
-                "shasum": "",
-                "mirrors": [
-                    {
-                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                        "preferred": true
-                    }
-                ]
+                "shasum": ""
             },
             "require": {
                 "php": ">=7.3"
@@ -5293,7 +5287,7 @@
                     "dev-master": "3.1-dev"
                 }
             },
-            "installation-source": "dist",
+            "installation-source": "source",
             "autoload": {
                 "classmap": [
                     "src/"
@@ -5315,6 +5309,10 @@
             "keywords": [
                 "process"
             ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/php-invoker/issues",
+                "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1"
+            },
             "funding": [
                 {
                     "url": "https://github.com/sebastianbergmann",
@@ -5336,13 +5334,7 @@
                 "type": "zip",
                 "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
                 "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
-                "shasum": "",
-                "mirrors": [
-                    {
-                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                        "preferred": true
-                    }
-                ]
+                "shasum": ""
             },
             "require": {
                 "php": ">=7.3"
@@ -5357,7 +5349,7 @@
                     "dev-master": "2.0-dev"
                 }
             },
-            "installation-source": "dist",
+            "installation-source": "source",
             "autoload": {
                 "classmap": [
                     "src/"
@@ -5379,6 +5371,10 @@
             "keywords": [
                 "template"
             ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
+                "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4"
+            },
             "funding": [
                 {
                     "url": "https://github.com/sebastianbergmann",
@@ -5400,13 +5396,7 @@
                 "type": "zip",
                 "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
                 "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
-                "shasum": "",
-                "mirrors": [
-                    {
-                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                        "preferred": true
-                    }
-                ]
+                "shasum": ""
             },
             "require": {
                 "php": ">=7.3"
@@ -5421,7 +5411,7 @@
                     "dev-master": "5.0-dev"
                 }
             },
-            "installation-source": "dist",
+            "installation-source": "source",
             "autoload": {
                 "classmap": [
                     "src/"
@@ -5443,6 +5433,10 @@
             "keywords": [
                 "timer"
             ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/php-timer/issues",
+                "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3"
+            },
             "funding": [
                 {
                     "url": "https://github.com/sebastianbergmann",
@@ -6732,17 +6726,17 @@
         },
         {
             "name": "react/socket",
-            "version": "v1.14.0",
-            "version_normalized": "1.14.0.0",
+            "version": "v1.15.0",
+            "version_normalized": "1.15.0.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/reactphp/socket.git",
-                "reference": "21591111d3ea62e31f2254280ca0656bc2b1bda6"
+                "reference": "216d3aec0b87f04a40ca04f481e6af01bdd1d038"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/reactphp/socket/zipball/21591111d3ea62e31f2254280ca0656bc2b1bda6",
-                "reference": "21591111d3ea62e31f2254280ca0656bc2b1bda6",
+                "url": "https://api.github.com/repos/reactphp/socket/zipball/216d3aec0b87f04a40ca04f481e6af01bdd1d038",
+                "reference": "216d3aec0b87f04a40ca04f481e6af01bdd1d038",
                 "shasum": ""
             },
             "require": {
@@ -6754,17 +6748,17 @@
                 "react/stream": "^1.2"
             },
             "require-dev": {
-                "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35",
+                "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36",
                 "react/async": "^4 || ^3 || ^2",
                 "react/promise-stream": "^1.4",
                 "react/promise-timer": "^1.10"
             },
-            "time": "2023-08-25T13:48:09+00:00",
+            "time": "2023-12-15T11:02:10+00:00",
             "type": "library",
             "installation-source": "source",
             "autoload": {
                 "psr-4": {
-                    "React\\Socket\\": "src"
+                    "React\\Socket\\": "src/"
                 }
             },
             "notification-url": "https://packagist.org/downloads/",
@@ -6803,7 +6797,7 @@
             ],
             "support": {
                 "issues": "https://github.com/reactphp/socket/issues",
-                "source": "https://github.com/reactphp/socket/tree/v1.14.0"
+                "source": "https://github.com/reactphp/socket/tree/v1.15.0"
             },
             "funding": [
                 {
@@ -7155,40 +7149,34 @@
         },
         {
             "name": "sebastian/complexity",
-            "version": "2.0.2",
-            "version_normalized": "2.0.2.0",
+            "version": "2.0.3",
+            "version_normalized": "2.0.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/complexity.git",
-                "reference": "739b35e53379900cc9ac327b2147867b8b6efd88"
+                "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88",
-                "reference": "739b35e53379900cc9ac327b2147867b8b6efd88",
-                "shasum": "",
-                "mirrors": [
-                    {
-                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                        "preferred": true
-                    }
-                ]
+                "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a",
+                "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a",
+                "shasum": ""
             },
             "require": {
-                "nikic/php-parser": "^4.7",
+                "nikic/php-parser": "^4.18 || ^5.0",
                 "php": ">=7.3"
             },
             "require-dev": {
                 "phpunit/phpunit": "^9.3"
             },
-            "time": "2020-10-26T15:52:27+00:00",
+            "time": "2023-12-22T06:19:30+00:00",
             "type": "library",
             "extra": {
                 "branch-alias": {
                     "dev-master": "2.0-dev"
                 }
             },
-            "installation-source": "dist",
+            "installation-source": "source",
             "autoload": {
                 "classmap": [
                     "src/"
@@ -7207,6 +7195,10 @@
             ],
             "description": "Library for calculating the complexity of PHP code units",
             "homepage": "https://github.com/sebastianbergmann/complexity",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/complexity/issues",
+                "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3"
+            },
             "funding": [
                 {
                     "url": "https://github.com/sebastianbergmann",
@@ -7499,34 +7491,34 @@
         },
         {
             "name": "sebastian/lines-of-code",
-            "version": "1.0.3",
-            "version_normalized": "1.0.3.0",
+            "version": "1.0.4",
+            "version_normalized": "1.0.4.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/lines-of-code.git",
-                "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc"
+                "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc",
-                "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc",
+                "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5",
+                "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5",
                 "shasum": ""
             },
             "require": {
-                "nikic/php-parser": "^4.6",
+                "nikic/php-parser": "^4.18 || ^5.0",
                 "php": ">=7.3"
             },
             "require-dev": {
                 "phpunit/phpunit": "^9.3"
             },
-            "time": "2020-11-28T06:42:11+00:00",
+            "time": "2023-12-22T06:20:34+00:00",
             "type": "library",
             "extra": {
                 "branch-alias": {
                     "dev-master": "1.0-dev"
                 }
             },
-            "installation-source": "dist",
+            "installation-source": "source",
             "autoload": {
                 "classmap": [
                     "src/"
@@ -7547,7 +7539,7 @@
             "homepage": "https://github.com/sebastianbergmann/lines-of-code",
             "support": {
                 "issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
-                "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3"
+                "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4"
             },
             "funding": [
                 {
@@ -10978,17 +10970,17 @@
         },
         {
             "name": "yansongda/supports",
-            "version": "v4.0.2",
-            "version_normalized": "4.0.2.0",
+            "version": "v4.0.3",
+            "version_normalized": "4.0.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/yansongda/supports.git",
-                "reference": "4a9cefecfcbe3f6826b6ae2d803f5094bd923498"
+                "reference": "73e01ed827202b33395c0827943410f6dbd790a4"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/yansongda/supports/zipball/4a9cefecfcbe3f6826b6ae2d803f5094bd923498",
-                "reference": "4a9cefecfcbe3f6826b6ae2d803f5094bd923498",
+                "url": "https://api.github.com/repos/yansongda/supports/zipball/73e01ed827202b33395c0827943410f6dbd790a4",
+                "reference": "73e01ed827202b33395c0827943410f6dbd790a4",
                 "shasum": ""
             },
             "require": {
@@ -11004,9 +10996,9 @@
                 "monolog/monolog": "Use logger",
                 "symfony/console": "Use stdout logger"
             },
-            "time": "2023-06-19T13:04:31+00:00",
+            "time": "2023-12-23T15:04:07+00:00",
             "type": "library",
-            "installation-source": "dist",
+            "installation-source": "source",
             "autoload": {
                 "files": [
                     "src/Functions.php"

+ 24 - 24
vendor/composer/installed.php

@@ -1,9 +1,9 @@
 <?php return array(
     'root' => array(
         'name' => 'laravel/laravel',
-        'pretty_version' => '1.0.0+no-version-set',
-        'version' => '1.0.0.0',
-        'reference' => NULL,
+        'pretty_version' => 'dev-master',
+        'version' => 'dev-master',
+        'reference' => '644ec6fffdee1e0f3c8f4dba80a91bbc6c1fc3b6',
         'type' => 'project',
         'install_path' => __DIR__ . '/../../',
         'aliases' => array(),
@@ -613,9 +613,9 @@
             'dev_requirement' => false,
         ),
         'laravel/laravel' => array(
-            'pretty_version' => '1.0.0+no-version-set',
-            'version' => '1.0.0.0',
-            'reference' => NULL,
+            'pretty_version' => 'dev-master',
+            'version' => 'dev-master',
+            'reference' => '644ec6fffdee1e0f3c8f4dba80a91bbc6c1fc3b6',
             'type' => 'project',
             'install_path' => __DIR__ . '/../../',
             'aliases' => array(),
@@ -703,9 +703,9 @@
             'dev_requirement' => false,
         ),
         'maatwebsite/excel' => array(
-            'pretty_version' => '3.1.50',
-            'version' => '3.1.50.0',
-            'reference' => 'd79e66391aa306983bb7e234503f5605c3e33348',
+            'pretty_version' => '3.1.51',
+            'version' => '3.1.51.0',
+            'reference' => '6d3c78ce6645abada32e03b40dc7f3c561878bc3',
             'type' => 'library',
             'install_path' => __DIR__ . '/../maatwebsite/excel',
             'aliases' => array(),
@@ -871,9 +871,9 @@
             'dev_requirement' => false,
         ),
         'phpunit/php-code-coverage' => array(
-            'pretty_version' => '9.2.29',
-            'version' => '9.2.29.0',
-            'reference' => '6a3a87ac2bbe33b25042753df8195ba4aa534c76',
+            'pretty_version' => '9.2.30',
+            'version' => '9.2.30.0',
+            'reference' => 'ca2bd87d2f9215904682a9cb9bb37dda98e76089',
             'type' => 'library',
             'install_path' => __DIR__ . '/../phpunit/php-code-coverage',
             'aliases' => array(),
@@ -1143,9 +1143,9 @@
             'dev_requirement' => false,
         ),
         'react/socket' => array(
-            'pretty_version' => 'v1.14.0',
-            'version' => '1.14.0.0',
-            'reference' => '21591111d3ea62e31f2254280ca0656bc2b1bda6',
+            'pretty_version' => 'v1.15.0',
+            'version' => '1.15.0.0',
+            'reference' => '216d3aec0b87f04a40ca04f481e6af01bdd1d038',
             'type' => 'library',
             'install_path' => __DIR__ . '/../react/socket',
             'aliases' => array(),
@@ -1203,9 +1203,9 @@
             'dev_requirement' => true,
         ),
         'sebastian/complexity' => array(
-            'pretty_version' => '2.0.2',
-            'version' => '2.0.2.0',
-            'reference' => '739b35e53379900cc9ac327b2147867b8b6efd88',
+            'pretty_version' => '2.0.3',
+            'version' => '2.0.3.0',
+            'reference' => '25f207c40d62b8b7aa32f5ab026c53561964053a',
             'type' => 'library',
             'install_path' => __DIR__ . '/../sebastian/complexity',
             'aliases' => array(),
@@ -1248,9 +1248,9 @@
             'dev_requirement' => true,
         ),
         'sebastian/lines-of-code' => array(
-            'pretty_version' => '1.0.3',
-            'version' => '1.0.3.0',
-            'reference' => 'c1c2e997aa3146983ed888ad08b15470a2e22ecc',
+            'pretty_version' => '1.0.4',
+            'version' => '1.0.4.0',
+            'reference' => 'e1e4a170560925c26d424b6a03aed157e7dcc5c5',
             'type' => 'library',
             'install_path' => __DIR__ . '/../sebastian/lines-of-code',
             'aliases' => array(),
@@ -1674,9 +1674,9 @@
             'dev_requirement' => false,
         ),
         'yansongda/supports' => array(
-            'pretty_version' => 'v4.0.2',
-            'version' => '4.0.2.0',
-            'reference' => '4a9cefecfcbe3f6826b6ae2d803f5094bd923498',
+            'pretty_version' => 'v4.0.3',
+            'version' => '4.0.3.0',
+            'reference' => '73e01ed827202b33395c0827943410f6dbd790a4',
             'type' => 'library',
             'install_path' => __DIR__ . '/../yansongda/supports',
             'aliases' => array(),

+ 8 - 0
vendor/phpunit/php-file-iterator/.psalm/baseline.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<files psalm-version="4.x-dev@">
+  <file src="src/Iterator.php">
+    <UndefinedInterfaceMethod occurrences="1">
+      <code>current</code>
+    </UndefinedInterfaceMethod>
+  </file>
+</files>

+ 16 - 0
vendor/phpunit/php-file-iterator/.psalm/config.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<psalm
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns="https://getpsalm.org/schema/config"
+    xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"
+    resolveFromConfigFile="false"
+    totallyTyped="false"
+    errorBaseline=".psalm/baseline.xml"
+>
+    <projectFiles>
+        <directory name="src" />
+        <ignoreFiles>
+            <directory name="vendor" />
+        </ignoreFiles>
+    </projectFiles>
+</psalm>

+ 144 - 0
vendor/phpunit/php-file-iterator/ChangeLog.md

@@ -0,0 +1,144 @@
+# Change Log
+
+All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/).
+
+## [3.0.6] - 2021-12-02
+
+### Changed
+
+* [#73](https://github.com/sebastianbergmann/php-file-iterator/pull/73): Micro performance improvements on parsing paths
+
+## [3.0.5] - 2020-09-28
+
+### Changed
+
+* Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3`
+
+## [3.0.4] - 2020-07-11
+
+### Fixed
+
+* [#67](https://github.com/sebastianbergmann/php-file-iterator/issues/67): `TypeError` in `SebastianBergmann\FileIterator\Iterator::accept()`
+
+## [3.0.3] - 2020-06-26
+
+### Added
+
+* This component is now supported on PHP 8
+
+## [3.0.2] - 2020-06-15
+
+### Changed
+
+* Tests etc. are now ignored for archive exports
+
+## [3.0.1] - 2020-04-18
+
+### Fixed
+
+* [#64](https://github.com/sebastianbergmann/php-file-iterator/issues/64): Release tarball contains Composer PHAR
+
+## [3.0.0] - 2020-02-07
+
+### Removed
+
+* This component is no longer supported on PHP 7.1 and PHP 7.2
+
+## [2.0.5] - 2021-12-02
+
+### Changed
+
+* [#73](https://github.com/sebastianbergmann/php-file-iterator/pull/73): Micro performance improvements on parsing paths
+
+### Fixed
+
+* [#74](https://github.com/sebastianbergmann/php-file-iterator/pull/74): Document return type of `SebastianBergmann\FileIterator\Iterator::accept()` so that Symfony's `DebugClassLoader` does not trigger a deprecation warning
+
+## [2.0.4] - 2021-07-19
+
+### Changed
+
+* Added `ReturnTypeWillChange` attribute to `SebastianBergmann\FileIterator\Iterator::accept()` because the return type of `\FilterIterator::accept()` will change in PHP 8.1
+
+## [2.0.3] - 2020-11-30
+
+### Changed
+
+* Changed PHP version constraint in `composer.json` from `^7.1` to `>=7.1`
+
+## [2.0.2] - 2018-09-13
+
+### Fixed
+
+* [#48](https://github.com/sebastianbergmann/php-file-iterator/issues/48): Excluding an array that contains false ends up excluding the current working directory
+
+## [2.0.1] - 2018-06-11
+
+### Fixed
+
+* [#46](https://github.com/sebastianbergmann/php-file-iterator/issues/46): Regression with hidden parent directory
+
+## [2.0.0] - 2018-05-28
+
+### Fixed
+
+* [#30](https://github.com/sebastianbergmann/php-file-iterator/issues/30): Exclude is not considered if it is a parent of the base path
+
+### Changed
+
+* This component now uses namespaces
+
+### Removed
+
+* This component is no longer supported on PHP 5.3, PHP 5.4, PHP 5.5, PHP 5.6, and PHP 7.0
+
+## [1.4.5] - 2017-11-27
+
+### Fixed
+
+* [#37](https://github.com/sebastianbergmann/php-file-iterator/issues/37): Regression caused by fix for [#30](https://github.com/sebastianbergmann/php-file-iterator/issues/30)
+
+## [1.4.4] - 2017-11-27
+
+### Fixed
+
+* [#30](https://github.com/sebastianbergmann/php-file-iterator/issues/30): Exclude is not considered if it is a parent of the base path
+
+## [1.4.3] - 2017-11-25
+
+### Fixed
+
+* [#34](https://github.com/sebastianbergmann/php-file-iterator/issues/34): Factory should use canonical directory names
+
+## [1.4.2] - 2016-11-26
+
+No changes
+
+## [1.4.1] - 2015-07-26
+
+No changes
+
+## 1.4.0 - 2015-04-02
+
+### Added
+
+* [#23](https://github.com/sebastianbergmann/php-file-iterator/pull/23): Added support for wildcards (glob) in exclude
+
+[3.0.6]: https://github.com/sebastianbergmann/php-file-iterator/compare/3.0.5...3.0.6
+[3.0.5]: https://github.com/sebastianbergmann/php-file-iterator/compare/3.0.4...3.0.5
+[3.0.4]: https://github.com/sebastianbergmann/php-file-iterator/compare/3.0.3...3.0.4
+[3.0.3]: https://github.com/sebastianbergmann/php-file-iterator/compare/3.0.2...3.0.3
+[3.0.2]: https://github.com/sebastianbergmann/php-file-iterator/compare/3.0.1...3.0.2
+[3.0.1]: https://github.com/sebastianbergmann/php-file-iterator/compare/3.0.0...3.0.1
+[3.0.0]: https://github.com/sebastianbergmann/php-file-iterator/compare/2.0.5...3.0.0
+[2.0.5]: https://github.com/sebastianbergmann/php-file-iterator/compare/2.0.4...2.0.5
+[2.0.4]: https://github.com/sebastianbergmann/php-file-iterator/compare/2.0.3...2.0.4
+[2.0.3]: https://github.com/sebastianbergmann/php-file-iterator/compare/2.0.2...2.0.3
+[2.0.2]: https://github.com/sebastianbergmann/php-file-iterator/compare/2.0.1...2.0.2
+[2.0.1]: https://github.com/sebastianbergmann/php-file-iterator/compare/2.0.0...2.0.1
+[2.0.0]: https://github.com/sebastianbergmann/php-file-iterator/compare/1.4.5...2.0.0
+[1.4.5]: https://github.com/sebastianbergmann/php-file-iterator/compare/1.4.4...1.4.5
+[1.4.4]: https://github.com/sebastianbergmann/php-file-iterator/compare/1.4.3...1.4.4
+[1.4.3]: https://github.com/sebastianbergmann/php-file-iterator/compare/1.4.2...1.4.3
+[1.4.2]: https://github.com/sebastianbergmann/php-file-iterator/compare/1.4.1...1.4.2
+[1.4.1]: https://github.com/sebastianbergmann/php-file-iterator/compare/1.4.0...1.4.1

+ 33 - 0
vendor/phpunit/php-file-iterator/LICENSE

@@ -0,0 +1,33 @@
+php-file-iterator
+
+Copyright (c) 2009-2021, Sebastian Bergmann <sebastian@phpunit.de>.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+ * Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in
+   the documentation and/or other materials provided with the
+   distribution.
+
+ * Neither the name of Sebastian Bergmann nor the names of his
+   contributors may be used to endorse or promote products derived
+   from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.

+ 14 - 0
vendor/phpunit/php-file-iterator/README.md

@@ -0,0 +1,14 @@
+[![Build Status](https://travis-ci.org/sebastianbergmann/php-file-iterator.svg?branch=master)](https://travis-ci.org/sebastianbergmann/php-file-iterator)
+
+# php-file-iterator
+
+## Installation
+
+You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/):
+
+    composer require phpunit/php-file-iterator
+
+If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency:
+
+    composer require --dev phpunit/php-file-iterator
+

+ 45 - 0
vendor/phpunit/php-file-iterator/composer.json

@@ -0,0 +1,45 @@
+{
+    "name": "phpunit/php-file-iterator",
+    "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+    "type": "library",
+    "keywords": [
+        "iterator",
+        "filesystem"
+    ],
+    "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+    "license": "BSD-3-Clause",
+    "authors": [
+        {
+            "name": "Sebastian Bergmann",
+            "email": "sebastian@phpunit.de",
+            "role": "lead"
+        }
+    ],
+    "support": {
+        "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues"
+    },
+    "config": {
+        "platform": {
+            "php": "7.3.0"
+        },
+        "optimize-autoloader": true,
+        "sort-packages": true
+    },
+    "prefer-stable": true,
+    "require": {
+        "php": ">=7.3"
+    },
+    "require-dev": {
+        "phpunit/phpunit": "^9.3"
+    },
+    "autoload": {
+        "classmap": [
+            "src/"
+        ]
+    },
+    "extra": {
+        "branch-alias": {
+            "dev-master": "3.0-dev"
+        }
+    }
+}

+ 115 - 0
vendor/phpunit/php-file-iterator/src/Facade.php

@@ -0,0 +1,115 @@
+<?php declare(strict_types=1);
+/*
+ * This file is part of phpunit/php-file-iterator.
+ *
+ * (c) Sebastian Bergmann <sebastian@phpunit.de>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace SebastianBergmann\FileIterator;
+
+use const DIRECTORY_SEPARATOR;
+use function array_unique;
+use function count;
+use function dirname;
+use function explode;
+use function is_file;
+use function is_string;
+use function realpath;
+use function sort;
+
+class Facade
+{
+    /**
+     * @param array|string $paths
+     * @param array|string $suffixes
+     * @param array|string $prefixes
+     */
+    public function getFilesAsArray($paths, $suffixes = '', $prefixes = '', array $exclude = [], bool $commonPath = false): array
+    {
+        if (is_string($paths)) {
+            $paths = [$paths];
+        }
+
+        $iterator = (new Factory)->getFileIterator($paths, $suffixes, $prefixes, $exclude);
+
+        $files = [];
+
+        foreach ($iterator as $file) {
+            $file = $file->getRealPath();
+
+            if ($file) {
+                $files[] = $file;
+            }
+        }
+
+        foreach ($paths as $path) {
+            if (is_file($path)) {
+                $files[] = realpath($path);
+            }
+        }
+
+        $files = array_unique($files);
+        sort($files);
+
+        if ($commonPath) {
+            return [
+                'commonPath' => $this->getCommonPath($files),
+                'files'      => $files,
+            ];
+        }
+
+        return $files;
+    }
+
+    protected function getCommonPath(array $files): string
+    {
+        $count = count($files);
+
+        if ($count === 0) {
+            return '';
+        }
+
+        if ($count === 1) {
+            return dirname($files[0]) . DIRECTORY_SEPARATOR;
+        }
+
+        $_files = [];
+
+        foreach ($files as $file) {
+            $_files[] = $_fileParts = explode(DIRECTORY_SEPARATOR, $file);
+
+            if (empty($_fileParts[0])) {
+                $_fileParts[0] = DIRECTORY_SEPARATOR;
+            }
+        }
+
+        $common = '';
+        $done   = false;
+        $j      = 0;
+        $count--;
+
+        while (!$done) {
+            for ($i = 0; $i < $count; $i++) {
+                if ($_files[$i][$j] != $_files[$i + 1][$j]) {
+                    $done = true;
+
+                    break;
+                }
+            }
+
+            if (!$done) {
+                $common .= $_files[0][$j];
+
+                if ($j > 0) {
+                    $common .= DIRECTORY_SEPARATOR;
+                }
+            }
+
+            $j++;
+        }
+
+        return DIRECTORY_SEPARATOR . $common;
+    }
+}

+ 91 - 0
vendor/phpunit/php-file-iterator/src/Factory.php

@@ -0,0 +1,91 @@
+<?php declare(strict_types=1);
+/*
+ * This file is part of phpunit/php-file-iterator.
+ *
+ * (c) Sebastian Bergmann <sebastian@phpunit.de>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace SebastianBergmann\FileIterator;
+
+use const GLOB_ONLYDIR;
+use function array_filter;
+use function array_map;
+use function array_merge;
+use function glob;
+use function is_dir;
+use function is_string;
+use function realpath;
+use AppendIterator;
+use RecursiveDirectoryIterator;
+use RecursiveIteratorIterator;
+
+class Factory
+{
+    /**
+     * @param array|string $paths
+     * @param array|string $suffixes
+     * @param array|string $prefixes
+     */
+    public function getFileIterator($paths, $suffixes = '', $prefixes = '', array $exclude = []): AppendIterator
+    {
+        if (is_string($paths)) {
+            $paths = [$paths];
+        }
+
+        $paths   = $this->getPathsAfterResolvingWildcards($paths);
+        $exclude = $this->getPathsAfterResolvingWildcards($exclude);
+
+        if (is_string($prefixes)) {
+            if ($prefixes !== '') {
+                $prefixes = [$prefixes];
+            } else {
+                $prefixes = [];
+            }
+        }
+
+        if (is_string($suffixes)) {
+            if ($suffixes !== '') {
+                $suffixes = [$suffixes];
+            } else {
+                $suffixes = [];
+            }
+        }
+
+        $iterator = new AppendIterator;
+
+        foreach ($paths as $path) {
+            if (is_dir($path)) {
+                $iterator->append(
+                    new Iterator(
+                        $path,
+                        new RecursiveIteratorIterator(
+                            new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::FOLLOW_SYMLINKS | RecursiveDirectoryIterator::SKIP_DOTS)
+                        ),
+                        $suffixes,
+                        $prefixes,
+                        $exclude
+                    )
+                );
+            }
+        }
+
+        return $iterator;
+    }
+
+    protected function getPathsAfterResolvingWildcards(array $paths): array
+    {
+        $_paths = [[]];
+
+        foreach ($paths as $path) {
+            if ($locals = glob($path, GLOB_ONLYDIR)) {
+                $_paths[] = array_map('\realpath', $locals);
+            } else {
+                $_paths[] = [realpath($path)];
+            }
+        }
+
+        return array_filter(array_merge(...$_paths));
+    }
+}

+ 119 - 0
vendor/phpunit/php-file-iterator/src/Iterator.php

@@ -0,0 +1,119 @@
+<?php declare(strict_types=1);
+/*
+ * This file is part of phpunit/php-file-iterator.
+ *
+ * (c) Sebastian Bergmann <sebastian@phpunit.de>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace SebastianBergmann\FileIterator;
+
+use function array_filter;
+use function array_map;
+use function preg_match;
+use function realpath;
+use function str_replace;
+use function strlen;
+use function strpos;
+use function substr;
+use FilterIterator;
+
+class Iterator extends FilterIterator
+{
+    public const PREFIX = 0;
+
+    public const SUFFIX = 1;
+
+    /**
+     * @var string
+     */
+    private $basePath;
+
+    /**
+     * @var array
+     */
+    private $suffixes = [];
+
+    /**
+     * @var array
+     */
+    private $prefixes = [];
+
+    /**
+     * @var array
+     */
+    private $exclude = [];
+
+    public function __construct(string $basePath, \Iterator $iterator, array $suffixes = [], array $prefixes = [], array $exclude = [])
+    {
+        $this->basePath = realpath($basePath);
+        $this->prefixes = $prefixes;
+        $this->suffixes = $suffixes;
+        $this->exclude  = array_filter(array_map('realpath', $exclude));
+
+        parent::__construct($iterator);
+    }
+
+    public function accept(): bool
+    {
+        $current  = $this->getInnerIterator()->current();
+        $filename = $current->getFilename();
+        $realPath = $current->getRealPath();
+
+        if ($realPath === false) {
+            return false;
+        }
+
+        return $this->acceptPath($realPath) &&
+               $this->acceptPrefix($filename) &&
+               $this->acceptSuffix($filename);
+    }
+
+    private function acceptPath(string $path): bool
+    {
+        // Filter files in hidden directories by checking path that is relative to the base path.
+        if (preg_match('=/\.[^/]*/=', str_replace($this->basePath, '', $path))) {
+            return false;
+        }
+
+        foreach ($this->exclude as $exclude) {
+            if (strpos($path, $exclude) === 0) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    private function acceptPrefix(string $filename): bool
+    {
+        return $this->acceptSubString($filename, $this->prefixes, self::PREFIX);
+    }
+
+    private function acceptSuffix(string $filename): bool
+    {
+        return $this->acceptSubString($filename, $this->suffixes, self::SUFFIX);
+    }
+
+    private function acceptSubString(string $filename, array $subStrings, int $type): bool
+    {
+        if (empty($subStrings)) {
+            return true;
+        }
+
+        $matched = false;
+
+        foreach ($subStrings as $string) {
+            if (($type === self::PREFIX && strpos($filename, $string) === 0) ||
+                ($type === self::SUFFIX &&
+                 substr($filename, -1 * strlen($string)) === $string)) {
+                $matched = true;
+
+                break;
+            }
+        }
+
+        return $matched;
+    }
+}

+ 14 - 0
vendor/sebastian/complexity/.gitattributes

@@ -0,0 +1,14 @@
+/.github        export-ignore
+/.phive         export-ignore
+/tests          export-ignore
+/tools          export-ignore
+/tools/*        binary
+/.gitattributes export-ignore
+/.gitignore     export-ignore
+/.php_cs.dist   export-ignore
+/build.xml      export-ignore
+/infection.json export-ignore
+/phpunit.xml    export-ignore
+/psalm.xml      export-ignore
+
+*.php diff=php

+ 1 - 0
vendor/sebastian/complexity/.github/FUNDING.yml

@@ -0,0 +1 @@
+github: sebastianbergmann

+ 131 - 0
vendor/sebastian/complexity/.github/workflows/ci.yml

@@ -0,0 +1,131 @@
+# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
+
+on:
+  - "pull_request"
+  - "push"
+
+name: "CI"
+
+jobs:
+  coding-guidelines:
+    name: "Coding Guidelines"
+
+    runs-on: "ubuntu-latest"
+
+    steps:
+      - name: "Checkout"
+        uses: "actions/checkout@v2"
+
+      - name: "Run friendsofphp/php-cs-fixer"
+        run: "php7.4 ./tools/php-cs-fixer fix --diff-format=udiff --dry-run --show-progress=dots --using-cache=no --verbose"
+
+  type-checker:
+    name: "Type Checker"
+
+    runs-on: "ubuntu-latest"
+
+    steps:
+      - name: "Checkout"
+        uses: "actions/checkout@v2"
+
+      - name: "Update dependencies with composer"
+        run: "php7.4 ./tools/composer update --no-ansi --no-interaction --no-progress"
+
+      - name: "Run vimeo/psalm"
+        run: "php7.4 ./tools/psalm --config=.psalm/config.xml --no-progress --shepherd --show-info=false --stats"
+
+  backward-compatibility:
+    name: Backward Compatibility
+
+    runs-on: ubuntu-latest
+
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v2
+        with:
+          fetch-depth: 0
+
+      - name: Fetch tags
+        run: git fetch --depth=1 origin +refs/tags/*:refs/tags/*
+
+      - name: Install PHP with extensions
+        uses: shivammathur/setup-php@v2
+        with:
+          php-version: 7.4
+          coverage: none
+          extensions: intl
+
+  tests:
+    name: "Tests"
+
+    runs-on: "ubuntu-latest"
+
+    strategy:
+      fail-fast: false
+      matrix:
+        php-version:
+          - "7.3"
+          - "7.4"
+          - "8.0"
+          - "8.1"
+
+    steps:
+      - name: "Checkout"
+        uses: "actions/checkout@v2"
+
+      - name: "Install PHP with extensions"
+        uses: "shivammathur/setup-php@v2"
+        with:
+          php-version: "${{ matrix.php-version }}"
+          coverage: "pcov"
+
+      - name: "Cache dependencies installed with composer"
+        uses: "actions/cache@v1"
+        with:
+          path: "~/.composer/cache"
+          key: "php${{ matrix.php-version }}-composer-${{ matrix.dependencies }}-${{ hashFiles('**/composer.json') }}"
+          restore-keys: "php${{ matrix.php-version }}-composer-${{ matrix.dependencies }}-"
+
+      - name: "Install dependencies with composer"
+        run: "./tools/composer update --no-ansi --no-interaction --no-progress"
+
+      - name: "Run tests with phpunit/phpunit"
+        run: "vendor/bin/phpunit --coverage-clover=coverage.xml"
+
+      - name: "Send code coverage report to Codecov.io"
+        env:
+          CODECOV_TOKEN: "${{ secrets.CODECOV_TOKEN }}"
+        run: "bash <(curl -s https://codecov.io/bash) || true"
+
+  mutation-tests:
+    name: "Mutation Tests"
+
+    runs-on: "ubuntu-latest"
+
+    strategy:
+      matrix:
+        php-version:
+          - "7.4"
+
+    steps:
+      - name: "Checkout"
+        uses: "actions/checkout@v2"
+
+      - name: "Install PHP with extensions"
+        uses: "shivammathur/setup-php@v2"
+        with:
+          php-version: "${{ matrix.php-version }}"
+          coverage: "pcov"
+
+      - name: "Cache dependencies installed with composer"
+        uses: "actions/cache@v1"
+        with:
+          path: "~/.composer/cache"
+          key: "php${{ matrix.php-version }}-composer-${{ matrix.dependencies }}-${{ hashFiles('**/composer.json') }}"
+          restore-keys: "php${{ matrix.php-version }}-composer-${{ matrix.dependencies }}-"
+
+      - name: "Install dependencies with composer"
+        run: "./tools/composer update --no-ansi --no-interaction --no-progress"
+
+      - name: "Run mutation tests with infection/infection"
+        run: "./tools/infection --show-mutations --only-covered"

+ 6 - 0
vendor/sebastian/complexity/.gitignore

@@ -0,0 +1,6 @@
+/.idea
+/.php_cs
+/.php_cs.cache
+/.phpunit.result.cache
+/composer.lock
+/vendor

+ 7 - 0
vendor/sebastian/complexity/.phive/phars.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<phive xmlns="https://phar.io/phive">
+  <phar name="php-cs-fixer" version="^2.16" installed="2.16.4" location="./tools/php-cs-fixer" copy="true"/>
+  <phar name="psalm" version="^4.0" installed="4.0.1" location="./tools/psalm" copy="true"/>
+  <phar name="roave/backwardcompatibilitycheck" version="^5.0" installed="5.0.0" location="./tools/roave-backward-compatibility-check" copy="true"/>
+  <phar name="infection" version="^0.16" installed="0.18.2" location="./tools/infection" copy="true"/>
+</phive>

+ 230 - 0
vendor/sebastian/complexity/.php_cs.dist

@@ -0,0 +1,230 @@
+<?php declare(strict_types=1);
+$header = <<<'EOF'
+This file is part of sebastian/complexity.
+
+(c) Sebastian Bergmann <sebastian@phpunit.de>
+
+For the full copyright and license information, please view the LICENSE
+file that was distributed with this source code.
+EOF;
+
+$finder = PhpCsFixer\Finder::create()
+    ->files()
+    ->in(__DIR__ . '/src')
+    ->in(__DIR__ . '/tests/unit')
+    ->in(__DIR__ . '/tests/integration');
+
+return PhpCsFixer\Config::create()
+    ->setFinder($finder)
+    ->setRiskyAllowed(true)
+    ->setRules([
+        'align_multiline_comment' => true,
+        'array_indentation' => true,
+        'array_syntax' => ['syntax' => 'short'],
+        'binary_operator_spaces' => [
+            'operators' => [
+                '=' => 'align_single_space_minimal',
+                '=>' => 'align_single_space_minimal',
+            ],
+        ],
+        'blank_line_after_namespace' => true,
+        'blank_line_before_statement' => [
+            'statements' => [
+                'break',
+                'continue',
+                'declare',
+                'default',
+                'die',
+                'do',
+                'exit',
+                'for',
+                'foreach',
+                'goto',
+                'if',
+                'include',
+                'include_once',
+                'require',
+                'require_once',
+                'return',
+                'switch',
+                'throw',
+                'try',
+                'while',
+                'yield',
+            ],
+        ],
+        'braces' => true,
+        'cast_spaces' => true,
+        'class_attributes_separation' => ['elements' => ['const', 'method', 'property']],
+        'combine_consecutive_issets' => true,
+        'combine_consecutive_unsets' => true,
+        'compact_nullable_typehint' => true,
+        'concat_space' => ['spacing' => 'one'],
+        'constant_case' => true,
+        'declare_equal_normalize' => ['space' => 'none'],
+        'declare_strict_types' => true,
+        'dir_constant' => true,
+        'elseif' => true,
+        'encoding' => true,
+        'explicit_indirect_variable' => true,
+        'explicit_string_variable' => true,
+        'full_opening_tag' => true,
+        'fully_qualified_strict_types' => true,
+        'function_declaration' => true,
+        'global_namespace_import' => [
+            'import_classes' => true,
+            'import_constants' => true,
+            'import_functions' => true,
+        ],
+        'header_comment' => ['header' => $header, 'separate' => 'none'],
+        'heredoc_to_nowdoc' => true,
+        'increment_style' => [
+            'style' => PhpCsFixer\Fixer\Operator\IncrementStyleFixer::STYLE_POST,
+        ],
+        'indentation_type' => true,
+        'is_null' => true,
+        'line_ending' => true,
+        'list_syntax' => ['syntax' => 'short'],
+        'logical_operators' => true,
+        'lowercase_keywords' => true,
+        'lowercase_static_reference' => true,
+        'magic_constant_casing' => true,
+        'magic_method_casing' => true,
+        'method_argument_space' => ['ensure_fully_multiline' => true],
+        'modernize_types_casting' => true,
+        'multiline_comment_opening_closing' => true,
+        'multiline_whitespace_before_semicolons' => true,
+        'native_constant_invocation' => false,
+        'native_function_casing' => false,
+        'native_function_invocation' => false,
+        'native_function_type_declaration_casing' => true,
+        'new_with_braces' => false,
+        'no_alias_functions' => true,
+        'no_alternative_syntax' => true,
+        'no_blank_lines_after_class_opening' => true,
+        'no_blank_lines_after_phpdoc' => true,
+        'no_blank_lines_before_namespace' => true,
+        'no_closing_tag' => true,
+        'no_empty_comment' => true,
+        'no_empty_phpdoc' => true,
+        'no_empty_statement' => true,
+        'no_extra_blank_lines' => true,
+        'no_homoglyph_names' => true,
+        'no_leading_import_slash' => true,
+        'no_leading_namespace_whitespace' => true,
+        'no_mixed_echo_print' => ['use' => 'print'],
+        'no_multiline_whitespace_around_double_arrow' => true,
+        'no_null_property_initialization' => true,
+        'no_php4_constructor' => true,
+        'no_short_bool_cast' => true,
+        'no_short_echo_tag' => true,
+        'no_singleline_whitespace_before_semicolons' => true,
+        'no_spaces_after_function_name' => true,
+        'no_spaces_around_offset' => true,
+        'no_spaces_inside_parenthesis' => true,
+        'no_superfluous_elseif' => true,
+        'no_superfluous_phpdoc_tags' => [
+            'allow_mixed' => true,
+        ],
+        'no_trailing_comma_in_list_call' => true,
+        'no_trailing_comma_in_singleline_array' => true,
+        'no_trailing_whitespace' => true,
+        'no_trailing_whitespace_in_comment' => true,
+        'no_unneeded_control_parentheses' => true,
+        'no_unneeded_curly_braces' => true,
+        'no_unneeded_final_method' => true,
+        'no_unreachable_default_argument_value' => true,
+        'no_unset_on_property' => true,
+        'no_unused_imports' => true,
+        'no_useless_else' => true,
+        'no_useless_return' => true,
+        'no_whitespace_before_comma_in_array' => true,
+        'no_whitespace_in_blank_line' => true,
+        'non_printable_character' => true,
+        'normalize_index_brace' => true,
+        'object_operator_without_whitespace' => true,
+        'ordered_class_elements' => [
+            'order' => [
+                'use_trait',
+                'constant_public',
+                'constant_protected',
+                'constant_private',
+                'property_public_static',
+                'property_protected_static',
+                'property_private_static',
+                'property_public',
+                'property_protected',
+                'property_private',
+                'method_public_static',
+                'construct',
+                'destruct',
+                'magic',
+                'phpunit',
+                'method_public',
+                'method_protected',
+                'method_private',
+                'method_protected_static',
+                'method_private_static',
+            ],
+        ],
+        'ordered_imports' => [
+            'imports_order' => [
+                PhpCsFixer\Fixer\Import\OrderedImportsFixer::IMPORT_TYPE_CONST,
+                PhpCsFixer\Fixer\Import\OrderedImportsFixer::IMPORT_TYPE_FUNCTION,
+                PhpCsFixer\Fixer\Import\OrderedImportsFixer::IMPORT_TYPE_CLASS,
+            ]
+        ],
+        'ordered_interfaces' => [
+            'direction' => 'ascend',
+            'order' => 'alpha',
+        ],
+        'phpdoc_add_missing_param_annotation' => false,
+        'phpdoc_align' => true,
+        'phpdoc_annotation_without_dot' => true,
+        'phpdoc_indent' => true,
+        'phpdoc_no_access' => true,
+        'phpdoc_no_empty_return' => true,
+        'phpdoc_no_package' => true,
+        'phpdoc_order' => true,
+        'phpdoc_return_self_reference' => true,
+        'phpdoc_scalar' => true,
+        'phpdoc_separation' => true,
+        'phpdoc_single_line_var_spacing' => true,
+        'phpdoc_summary' => true,
+        'phpdoc_to_comment' => true,
+        'phpdoc_trim' => true,
+        'phpdoc_trim_consecutive_blank_line_separation' => true,
+        'phpdoc_types' => ['groups' => ['simple', 'meta']],
+        'phpdoc_types_order' => true,
+        'phpdoc_var_without_name' => true,
+        'pow_to_exponentiation' => true,
+        'protected_to_private' => true,
+        'return_assignment' => true,
+        'return_type_declaration' => ['space_before' => 'none'],
+        'self_accessor' => true,
+        'self_static_accessor' => true,
+        'semicolon_after_instruction' => true,
+        'set_type_to_cast' => true,
+        'short_scalar_cast' => true,
+        'simple_to_complex_string_variable' => true,
+        'simplified_null_return' => false,
+        'single_blank_line_at_eof' => true,
+        'single_import_per_statement' => true,
+        'single_line_after_imports' => true,
+        'single_quote' => true,
+        'standardize_not_equals' => true,
+        'strict_param' => true,
+        'ternary_to_null_coalescing' => true,
+        'trailing_comma_in_multiline_array' => true,
+        'trim_array_spaces' => true,
+        'unary_operator_spaces' => true,
+        'visibility_required' => [
+            'elements' => [
+                'const',
+                'method',
+                'property',
+            ],
+        ],
+        'void_return' => true,
+        'whitespace_after_comma_in_array' => true,
+    ]);

+ 7 - 0
vendor/sebastian/complexity/ChangeLog.md

@@ -2,6 +2,12 @@
 
 All notable changes are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles.
 
+## [2.0.3] - 2023-12-22
+
+### Changed
+
+* This component is now compatible with `nikic/php-parser` 5.0
+
 ## [2.0.2] - 2020-10-26
 
 ### Fixed
@@ -24,6 +30,7 @@ All notable changes are documented in this file using the [Keep a CHANGELOG](htt
 
 * Initial release
 
+[2.0.3]: https://github.com/sebastianbergmann/complexity/compare/2.0.2...2.0.3
 [2.0.2]: https://github.com/sebastianbergmann/complexity/compare/2.0.1...2.0.2
 [2.0.1]: https://github.com/sebastianbergmann/complexity/compare/2.0.0...2.0.1
 [2.0.0]: https://github.com/sebastianbergmann/complexity/compare/1.0.0...2.0.0

+ 31 - 0
vendor/sebastian/complexity/build.xml

@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="complexity" default="setup">
+    <target name="setup" depends="clean,composer"/>
+
+    <target name="clean" description="Cleanup build artifacts">
+        <delete dir="${basedir}/vendor"/>
+        <delete file="${basedir}/composer.lock"/>
+    </target>
+
+    <target name="composer" depends="clean" description="Install dependencies with Composer">
+        <exec executable="${basedir}/tools/composer" taskname="composer">
+            <arg value="update"/>
+            <arg value="--no-interaction"/>
+            <arg value="--no-progress"/>
+            <arg value="--no-ansi"/>
+        </exec>
+    </target>
+
+    <target name="update-tools">
+        <exec executable="phive" taskname="phive">
+            <arg value="--no-progress"/>
+            <arg value="update"/>
+            <arg value="--force-accept-unsigned"/>
+        </exec>
+
+        <exec executable="${basedir}/tools/composer" taskname="composer">
+            <arg value="self-update"/>
+        </exec>
+    </target>
+</project>
+

+ 2 - 1
vendor/sebastian/complexity/composer.json

@@ -14,9 +14,10 @@
     "support": {
         "issues": "https://github.com/sebastianbergmann/complexity/issues"
     },
+    "prefer-stable": true,
     "require": {
         "php": ">=7.3",
-        "nikic/php-parser": "^4.7"
+        "nikic/php-parser": "^4.18 || ^5.0"
     },
     "require-dev": {
         "phpunit/phpunit": "^9.3"

+ 23 - 0
vendor/sebastian/complexity/infection.json

@@ -0,0 +1,23 @@
+{
+    "source": {
+        "directories": [
+            "src"
+        ]
+    },
+    "mutators": {
+        "@default": true,
+        "TrueValue": {
+            "ignore": [
+                "SebastianBergmann\\Complexity\\Calculator::calculateForAbstractSyntaxTree"
+            ]
+        },
+        "InstanceOf_": {
+            "ignore": [
+                "SebastianBergmann\\Complexity\\ComplexityCalculatingVisitor::classMethodName",
+                "SebastianBergmann\\Complexity\\ComplexityCalculatingVisitor::functionName"
+            ]
+        }
+    },
+    "minMsi": 100,
+    "minCoveredMsi": 100
+}

+ 24 - 0
vendor/sebastian/complexity/phpunit.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd"
+         bootstrap="vendor/autoload.php"
+         executionOrder="depends,defects"
+         forceCoversAnnotation="true"
+         beStrictAboutCoversAnnotation="true"
+         beStrictAboutOutputDuringTests="true"
+         beStrictAboutTodoAnnotatedTests="true"
+         failOnRisky="true"
+         failOnWarning="true"
+         verbose="true">
+    <testsuites>
+        <testsuite name="default">
+            <directory suffix="Test.php">tests</directory>
+        </testsuite>
+    </testsuites>
+
+    <coverage processUncoveredFiles="true">
+        <include>
+            <directory suffix=".php">src</directory>
+        </include>
+    </coverage>
+</phpunit>

+ 1 - 8
vendor/sebastian/complexity/src/Calculator.php

@@ -10,12 +10,10 @@
 namespace SebastianBergmann\Complexity;
 
 use PhpParser\Error;
-use PhpParser\Lexer;
 use PhpParser\Node;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\NodeVisitor\ParentConnectingVisitor;
-use PhpParser\Parser;
 use PhpParser\ParserFactory;
 
 final class Calculator
@@ -34,7 +32,7 @@ final class Calculator
     public function calculateForSourceString(string $source): ComplexityCollection
     {
         try {
-            $nodes = $this->parser()->parse($source);
+            $nodes = (new ParserFactory)->createForHostVersion()->parse($source);
 
             assert($nodes !== null);
 
@@ -80,9 +78,4 @@ final class Calculator
 
         return $complexityCalculatingVisitor->result();
     }
-
-    private function parser(): Parser
-    {
-        return (new ParserFactory)->create(ParserFactory::PREFER_PHP7, new Lexer);
-    }
 }

+ 46 - 0
vendor/sebastian/complexity/tests/_fixture/ExampleClass.php

@@ -0,0 +1,46 @@
+<?php declare(strict_types=1);
+/*
+ * This file is part of sebastian/complexity.
+ *
+ * (c) Sebastian Bergmann <sebastian@phpunit.de>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace SebastianBergmann\Complexity\TestFixture;
+
+final class ExampleClass
+{
+    public function method(): void
+    {
+        if (true || false) {
+            if (true && false) {
+                for ($i = 0; $i <= 1; $i++) {
+                    $a = true ? 'foo' : 'bar';
+                }
+
+                foreach (range(0, 1) as $i) {
+                    switch ($i) {
+                        case 0:
+                            break;
+
+                        case 1:
+                            break;
+
+                        default:
+                    }
+                }
+            }
+        } elseif (null) {
+            try {
+            } catch (Throwable $t) {
+            }
+        }
+
+        while (true) {
+        }
+
+        do {
+        } while (false);
+    }
+}

+ 46 - 0
vendor/sebastian/complexity/tests/_fixture/ExampleTrait.php

@@ -0,0 +1,46 @@
+<?php declare(strict_types=1);
+/*
+ * This file is part of sebastian/complexity.
+ *
+ * (c) Sebastian Bergmann <sebastian@phpunit.de>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace SebastianBergmann\Complexity\TestFixture;
+
+trait ExampleTrait
+{
+    public function method(): void
+    {
+        if (true || false) {
+            if (true && false) {
+                for ($i = 0; $i <= 1; $i++) {
+                    $a = true ? 'foo' : 'bar';
+                }
+
+                foreach (range(0, 1) as $i) {
+                    switch ($i) {
+                        case 0:
+                            break;
+
+                        case 1:
+                            break;
+
+                        default:
+                    }
+                }
+            }
+        } elseif (null) {
+            try {
+            } catch (Throwable $t) {
+            }
+        }
+
+        while (true) {
+        }
+
+        do {
+        } while (false);
+    }
+}

+ 43 - 0
vendor/sebastian/complexity/tests/_fixture/example_function.php

@@ -0,0 +1,43 @@
+<?php declare(strict_types=1);
+/*
+ * This file is part of sebastian/complexity.
+ *
+ * (c) Sebastian Bergmann <sebastian@phpunit.de>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace SebastianBergmann\Complexity\TestFixture;
+
+function example_function(): void
+{
+    if (true or false) {
+        if (true and false) {
+            for ($i = 0; $i <= 1; $i++) {
+                $a = true ? 'foo' : 'bar';
+            }
+
+            foreach (range(0, 1) as $i) {
+                switch ($i) {
+                    case 0:
+                        break;
+
+                    case 1:
+                        break;
+
+                    default:
+                }
+            }
+        }
+    } elseif (null) {
+        try {
+        } catch (Throwable $t) {
+        }
+    }
+
+    while (true) {
+    }
+
+    do {
+    } while (false);
+}

+ 72 - 0
vendor/sebastian/complexity/tests/integration/CalculatorTest.php

@@ -0,0 +1,72 @@
+<?php declare(strict_types=1);
+/*
+ * This file is part of sebastian/complexity.
+ *
+ * (c) Sebastian Bergmann <sebastian@phpunit.de>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace SebastianBergmann\Complexity;
+
+use function file_get_contents;
+use PhpParser\ParserFactory;
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @covers \SebastianBergmann\Complexity\Calculator
+ * @covers \SebastianBergmann\Complexity\ComplexityCalculatingVisitor
+ * @covers \SebastianBergmann\Complexity\CyclomaticComplexityCalculatingVisitor
+ *
+ * @uses \SebastianBergmann\Complexity\Complexity
+ * @uses \SebastianBergmann\Complexity\ComplexityCollection
+ * @uses \SebastianBergmann\Complexity\ComplexityCollectionIterator
+ *
+ * @medium
+ */
+final class CalculatorTest extends TestCase
+{
+    public function testCalculatesCyclomaticComplexityOfClassMethodInSourceFile(): void
+    {
+        $result = (new Calculator)->calculateForSourceFile(__DIR__ . '/../_fixture/ExampleClass.php')->asArray();
+
+        $this->assertSame('SebastianBergmann\Complexity\TestFixture\ExampleClass::method', $result[0]->name());
+        $this->assertSame(14, $result[0]->cyclomaticComplexity());
+    }
+
+    public function testCalculatesCyclomaticComplexityOfTraitMethodInSourceFile(): void
+    {
+        $result = (new Calculator)->calculateForSourceFile(__DIR__ . '/../_fixture/ExampleTrait.php')->asArray();
+
+        $this->assertSame('SebastianBergmann\Complexity\TestFixture\ExampleTrait::method', $result[0]->name());
+        $this->assertSame(14, $result[0]->cyclomaticComplexity());
+    }
+
+    public function testCalculatesCyclomaticComplexityOfFunctionInSourceFile(): void
+    {
+        $result = (new Calculator)->calculateForSourceFile(__DIR__ . '/../_fixture/example_function.php')->asArray();
+
+        $this->assertSame('SebastianBergmann\Complexity\TestFixture\example_function', $result[0]->name());
+        $this->assertSame(14, $result[0]->cyclomaticComplexity());
+    }
+
+    public function testCalculatesCyclomaticComplexityInSourceString(): void
+    {
+        $result = (new Calculator)->calculateForSourceString(file_get_contents(__DIR__ . '/../_fixture/ExampleClass.php'))->asArray();
+
+        $this->assertSame('SebastianBergmann\Complexity\TestFixture\ExampleClass::method', $result[0]->name());
+        $this->assertSame(14, $result[0]->cyclomaticComplexity());
+    }
+
+    public function testCalculatesCyclomaticComplexityInAbstractSyntaxTree(): void
+    {
+        $nodes = (new ParserFactory)->createForHostVersion()->parse(file_get_contents(__DIR__ . '/../_fixture/ExampleClass.php'));
+
+        assert($nodes !== null);
+
+        $result = (new Calculator)->calculateForAbstractSyntaxTree($nodes)->asArray();
+
+        $this->assertSame('SebastianBergmann\Complexity\TestFixture\ExampleClass::method', $result[0]->name());
+        $this->assertSame(14, $result[0]->cyclomaticComplexity());
+    }
+}

+ 84 - 0
vendor/sebastian/complexity/tests/unit/ComplexityCalculatingVisitorTest.php

@@ -0,0 +1,84 @@
+<?php declare(strict_types=1);
+/*
+ * This file is part of sebastian/complexity.
+ *
+ * (c) Sebastian Bergmann <sebastian@phpunit.de>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace SebastianBergmann\Complexity;
+
+use function file_get_contents;
+use PhpParser\Node;
+use PhpParser\NodeTraverser;
+use PhpParser\NodeVisitor\NameResolver;
+use PhpParser\NodeVisitor\ParentConnectingVisitor;
+use PhpParser\NodeVisitorAbstract;
+use PhpParser\ParserFactory;
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @covers \SebastianBergmann\Complexity\ComplexityCalculatingVisitor
+ *
+ * @uses \SebastianBergmann\Complexity\Complexity
+ * @uses \SebastianBergmann\Complexity\ComplexityCollection
+ * @uses \SebastianBergmann\Complexity\ComplexityCollectionIterator
+ * @uses \SebastianBergmann\Complexity\CyclomaticComplexityCalculatingVisitor
+ *
+ * @small
+ */
+final class ComplexityCalculatingVisitorTest extends TestCase
+{
+    /**
+     * @dataProvider shortCircuitTraversalProvider
+     */
+    public function testCalculatesComplexityForAbstractSyntaxTree(bool $shortCircuitTraversal): void
+    {
+        $nodes = (new ParserFactory)->createForHostVersion()->parse(
+            file_get_contents(__DIR__ . '/../_fixture/ExampleClass.php')
+        );
+
+        $traverser = new NodeTraverser;
+
+        $complexityCalculatingVisitor = new ComplexityCalculatingVisitor($shortCircuitTraversal);
+
+        $shortCircuitVisitor              = new class extends NodeVisitorAbstract {
+            private $numberOfNodesVisited = 0;
+
+            public function enterNode(Node $node): void
+            {
+                $this->numberOfNodesVisited++;
+            }
+
+            public function numberOfNodesVisited(): int
+            {
+                return $this->numberOfNodesVisited;
+            }
+        };
+
+        $traverser->addVisitor(new NameResolver);
+        $traverser->addVisitor(new ParentConnectingVisitor);
+        $traverser->addVisitor($complexityCalculatingVisitor);
+        $traverser->addVisitor($shortCircuitVisitor);
+
+        /* @noinspection UnusedFunctionResultInspection */
+        $traverser->traverse($nodes);
+
+        $this->assertSame(14, $complexityCalculatingVisitor->result()->cyclomaticComplexity());
+
+        if ($shortCircuitTraversal) {
+            $this->assertSame(9, $shortCircuitVisitor->numberOfNodesVisited());
+        } else {
+            $this->assertSame(70, $shortCircuitVisitor->numberOfNodesVisited());
+        }
+    }
+
+    public function shortCircuitTraversalProvider(): array
+    {
+        return [
+            'short-circuit traversal'    => [true],
+            'no short-circuit traversal' => [false],
+        ];
+    }
+}

+ 78 - 0
vendor/sebastian/complexity/tests/unit/ComplexityCollectionTest.php

@@ -0,0 +1,78 @@
+<?php declare(strict_types=1);
+/*
+ * This file is part of sebastian/complexity.
+ *
+ * (c) Sebastian Bergmann <sebastian@phpunit.de>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace SebastianBergmann\Complexity;
+
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @covers \SebastianBergmann\Complexity\ComplexityCollection
+ * @covers \SebastianBergmann\Complexity\ComplexityCollectionIterator
+ *
+ * @uses \SebastianBergmann\Complexity\Complexity
+ *
+ * @small
+ */
+final class ComplexityCollectionTest extends TestCase
+{
+    /**
+     * @psalm-var list<Complexity>
+     */
+    private $array;
+
+    protected function setUp(): void
+    {
+        $this->array = [
+            new Complexity('Class::method', 1),
+            new Complexity('function', 2),
+        ];
+    }
+
+    /**
+     * @testdox Can be created from list of Complexity objects
+     */
+    public function testCanBeCreatedFromListOfObjects(): void
+    {
+        $collection = ComplexityCollection::fromList($this->array[0], $this->array[1]);
+
+        $this->assertSame($this->array, $collection->asArray());
+    }
+
+    public function testCanBeCounted(): void
+    {
+        $collection = ComplexityCollection::fromList($this->array[0], $this->array[1]);
+
+        $this->assertCount(2, $collection);
+        $this->assertFalse($collection->isEmpty());
+    }
+
+    public function testCanBeIterated(): void
+    {
+        $array = [];
+
+        foreach (ComplexityCollection::fromList($this->array[0], $this->array[1]) as $key => $value) {
+            $array[$key] = $value;
+        }
+
+        $this->assertCount(2, $array);
+
+        $this->assertArrayHasKey(0, $array);
+        $this->assertSame($this->array[0], $array[0]);
+
+        $this->assertArrayHasKey(1, $array);
+        $this->assertSame($this->array[1], $array[1]);
+    }
+
+    public function testHasCyclomaticComplexity(): void
+    {
+        $collection = ComplexityCollection::fromList($this->array[0], $this->array[1]);
+
+        $this->assertSame(3, $collection->cyclomaticComplexity());
+    }
+}

+ 35 - 0
vendor/sebastian/complexity/tests/unit/ComplexityTest.php

@@ -0,0 +1,35 @@
+<?php declare(strict_types=1);
+/*
+ * This file is part of sebastian/complexity.
+ *
+ * (c) Sebastian Bergmann <sebastian@phpunit.de>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace SebastianBergmann\Complexity;
+
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @covers \SebastianBergmann\Complexity\Complexity
+ *
+ * @small
+ */
+final class ComplexityTest extends TestCase
+{
+    public function testHasName(): void
+    {
+        $this->assertSame('Foo::bar', $this->complexity()->name());
+    }
+
+    public function testHasCyclomaticComplexity(): void
+    {
+        $this->assertSame(1, $this->complexity()->cyclomaticComplexity());
+    }
+
+    private function complexity(): Complexity
+    {
+        return new Complexity('Foo::bar', 1);
+    }
+}

+ 41 - 0
vendor/sebastian/complexity/tests/unit/CyclomaticComplexityCalculatingVisitorTest.php

@@ -0,0 +1,41 @@
+<?php declare(strict_types=1);
+/*
+ * This file is part of sebastian/complexity.
+ *
+ * (c) Sebastian Bergmann <sebastian@phpunit.de>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace SebastianBergmann\Complexity;
+
+use function file_get_contents;
+use PhpParser\NodeTraverser;
+use PhpParser\ParserFactory;
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @covers \SebastianBergmann\Complexity\CyclomaticComplexityCalculatingVisitor
+ *
+ * @small
+ */
+final class CyclomaticComplexityCalculatingVisitorTest extends TestCase
+{
+    public function testCalculatesCyclomaticComplexityForAbstractSyntaxTree(): void
+    {
+        $nodes = (new ParserFactory)->createForHostVersion()->parse(
+            file_get_contents(__DIR__ . '/../_fixture/example_function.php')
+        );
+
+        $traverser = new NodeTraverser;
+
+        $visitor = new CyclomaticComplexityCalculatingVisitor;
+
+        $traverser->addVisitor($visitor);
+
+        /* @noinspection UnusedFunctionResultInspection */
+        $traverser->traverse($nodes);
+
+        $this->assertSame(14, $visitor->cyclomaticComplexity());
+    }
+}

BIN
vendor/sebastian/complexity/tools/composer


BIN
vendor/sebastian/complexity/tools/infection


BIN
vendor/sebastian/complexity/tools/php-cs-fixer


BIN
vendor/sebastian/complexity/tools/psalm


BIN
vendor/sebastian/complexity/tools/roave-backward-compatibility-check


+ 14 - 0
vendor/sebastian/lines-of-code/.gitattributes

@@ -0,0 +1,14 @@
+/.github        export-ignore
+/.phive         export-ignore
+/tests          export-ignore
+/tools          export-ignore
+/tools/*        binary
+/.gitattributes export-ignore
+/.gitignore     export-ignore
+/.php_cs.dist   export-ignore
+/build.xml      export-ignore
+/infection.json export-ignore
+/phpunit.xml    export-ignore
+/psalm.xml      export-ignore
+
+*.php diff=php

+ 1 - 0
vendor/sebastian/lines-of-code/.github/FUNDING.yml

@@ -0,0 +1 @@
+github: sebastianbergmann

+ 98 - 0
vendor/sebastian/lines-of-code/.github/workflows/ci.yml

@@ -0,0 +1,98 @@
+# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
+
+on:
+  - "pull_request"
+  - "push"
+
+name: "CI"
+
+jobs:
+  coding-guidelines:
+    name: "Coding Guidelines"
+
+    runs-on: "ubuntu-latest"
+
+    steps:
+      - name: "Checkout"
+        uses: "actions/checkout@v2"
+
+      - name: "Run friendsofphp/php-cs-fixer"
+        run: "php7.4 ./tools/php-cs-fixer fix --diff-format=udiff --dry-run --show-progress=dots --using-cache=no --verbose"
+
+  type-checker:
+    name: "Type Checker"
+
+    runs-on: "ubuntu-latest"
+
+    steps:
+      - name: "Checkout"
+        uses: "actions/checkout@v2"
+
+      - name: "Update dependencies with composer"
+        run: "php7.4 ./tools/composer update --no-ansi --no-interaction --no-progress"
+
+      - name: "Run vimeo/psalm"
+        run: "php7.4 ./tools/psalm --config=.psalm/config.xml --no-progress --shepherd --show-info=false --stats"
+
+  backward-compatibility:
+    name: Backward Compatibility
+
+    runs-on: ubuntu-latest
+
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v2
+        with:
+          fetch-depth: 0
+
+      - name: Fetch tags
+        run: git fetch --depth=1 origin +refs/tags/*:refs/tags/*
+
+      - name: Install PHP with extensions
+        uses: shivammathur/setup-php@v2
+        with:
+          php-version: 7.4
+          coverage: none
+          extensions: intl
+
+  tests:
+    name: "Tests"
+
+    runs-on: "ubuntu-latest"
+
+    strategy:
+      fail-fast: false
+      matrix:
+        php-version:
+          - "7.3"
+          - "7.4"
+          - "8.0"
+          - "8.1"
+
+    steps:
+      - name: "Checkout"
+        uses: "actions/checkout@v2"
+
+      - name: "Install PHP with extensions"
+        uses: "shivammathur/setup-php@v2"
+        with:
+          php-version: "${{ matrix.php-version }}"
+          coverage: "pcov"
+
+      - name: "Cache dependencies installed with composer"
+        uses: "actions/cache@v1"
+        with:
+          path: "~/.composer/cache"
+          key: "php${{ matrix.php-version }}-composer-${{ matrix.dependencies }}-${{ hashFiles('**/composer.json') }}"
+          restore-keys: "php${{ matrix.php-version }}-composer-${{ matrix.dependencies }}-"
+
+      - name: "Install dependencies with composer"
+        run: "./tools/composer update --no-ansi --no-interaction --no-progress"
+
+      - name: "Run tests with phpunit/phpunit"
+        run: "vendor/bin/phpunit --coverage-clover=coverage.xml"
+
+      - name: "Send code coverage report to Codecov.io"
+        env:
+          CODECOV_TOKEN: "${{ secrets.CODECOV_TOKEN }}"
+        run: "bash <(curl -s https://codecov.io/bash) || true"

+ 6 - 0
vendor/sebastian/lines-of-code/.gitignore

@@ -0,0 +1,6 @@
+/.idea
+/.php_cs
+/.php_cs.cache
+/.phpunit.result.cache
+/composer.lock
+/vendor

+ 8 - 0
vendor/sebastian/lines-of-code/.phive/phars.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<phive xmlns="https://phar.io/phive">
+  <phar name="php-cs-fixer" version="^2.16" installed="2.16.7" location="./tools/php-cs-fixer" copy="true"/>
+  <phar name="psalm" version="^4.0" installed="4.2.1" location="./tools/psalm" copy="true"/>
+  <phar name="roave/backwardcompatibilitycheck" version="^5.0" installed="5.0.0" location="./tools/roave-backward-compatibility-check" copy="true"/>
+  <phar name="infection" version="^0.16" installed="0.20.2" location="./tools/infection" copy="true"/>
+  <phar name="composer" version="^2.0.3" installed="2.0.7" location="./tools/composer" copy="true"/>
+</phive>

+ 230 - 0
vendor/sebastian/lines-of-code/.php_cs.dist

@@ -0,0 +1,230 @@
+<?php declare(strict_types=1);
+$header = <<<'EOF'
+This file is part of sebastian/lines-of-code.
+
+(c) Sebastian Bergmann <sebastian@phpunit.de>
+
+For the full copyright and license information, please view the LICENSE
+file that was distributed with this source code.
+EOF;
+
+$finder = PhpCsFixer\Finder::create()
+    ->files()
+    ->in(__DIR__ . '/src')
+    ->in(__DIR__ . '/tests/integration')
+    ->in(__DIR__ . '/tests/unit');
+
+return PhpCsFixer\Config::create()
+    ->setFinder($finder)
+    ->setRiskyAllowed(true)
+    ->setRules([
+        'align_multiline_comment' => true,
+        'array_indentation' => true,
+        'array_syntax' => ['syntax' => 'short'],
+        'binary_operator_spaces' => [
+            'operators' => [
+                '=' => 'align_single_space_minimal',
+                '=>' => 'align_single_space_minimal',
+            ],
+        ],
+        'blank_line_after_namespace' => true,
+        'blank_line_before_statement' => [
+            'statements' => [
+                'break',
+                'continue',
+                'declare',
+                'default',
+                'die',
+                'do',
+                'exit',
+                'for',
+                'foreach',
+                'goto',
+                'if',
+                'include',
+                'include_once',
+                'require',
+                'require_once',
+                'return',
+                'switch',
+                'throw',
+                'try',
+                'while',
+                'yield',
+            ],
+        ],
+        'braces' => true,
+        'cast_spaces' => true,
+        'class_attributes_separation' => ['elements' => ['const', 'method', 'property']],
+        'combine_consecutive_issets' => true,
+        'combine_consecutive_unsets' => true,
+        'compact_nullable_typehint' => true,
+        'concat_space' => ['spacing' => 'one'],
+        'constant_case' => true,
+        'declare_equal_normalize' => ['space' => 'none'],
+        'declare_strict_types' => true,
+        'dir_constant' => true,
+        'elseif' => true,
+        'encoding' => true,
+        'explicit_indirect_variable' => true,
+        'explicit_string_variable' => true,
+        'full_opening_tag' => true,
+        'fully_qualified_strict_types' => true,
+        'function_declaration' => true,
+        'global_namespace_import' => [
+            'import_classes' => true,
+            'import_constants' => true,
+            'import_functions' => true,
+        ],
+        'header_comment' => ['header' => $header, 'separate' => 'none'],
+        'heredoc_to_nowdoc' => true,
+        'increment_style' => [
+            'style' => PhpCsFixer\Fixer\Operator\IncrementStyleFixer::STYLE_POST,
+        ],
+        'indentation_type' => true,
+        'is_null' => true,
+        'line_ending' => true,
+        'list_syntax' => ['syntax' => 'short'],
+        'logical_operators' => true,
+        'lowercase_keywords' => true,
+        'lowercase_static_reference' => true,
+        'magic_constant_casing' => true,
+        'magic_method_casing' => true,
+        'method_argument_space' => ['ensure_fully_multiline' => true],
+        'modernize_types_casting' => true,
+        'multiline_comment_opening_closing' => true,
+        'multiline_whitespace_before_semicolons' => true,
+        'native_constant_invocation' => false,
+        'native_function_casing' => false,
+        'native_function_invocation' => false,
+        'native_function_type_declaration_casing' => true,
+        'new_with_braces' => false,
+        'no_alias_functions' => true,
+        'no_alternative_syntax' => true,
+        'no_blank_lines_after_class_opening' => true,
+        'no_blank_lines_after_phpdoc' => true,
+        'no_blank_lines_before_namespace' => true,
+        'no_closing_tag' => true,
+        'no_empty_comment' => true,
+        'no_empty_phpdoc' => true,
+        'no_empty_statement' => true,
+        'no_extra_blank_lines' => true,
+        'no_homoglyph_names' => true,
+        'no_leading_import_slash' => true,
+        'no_leading_namespace_whitespace' => true,
+        'no_mixed_echo_print' => ['use' => 'print'],
+        'no_multiline_whitespace_around_double_arrow' => true,
+        'no_null_property_initialization' => true,
+        'no_php4_constructor' => true,
+        'no_short_bool_cast' => true,
+        'no_short_echo_tag' => true,
+        'no_singleline_whitespace_before_semicolons' => true,
+        'no_spaces_after_function_name' => true,
+        'no_spaces_around_offset' => true,
+        'no_spaces_inside_parenthesis' => true,
+        'no_superfluous_elseif' => true,
+        'no_superfluous_phpdoc_tags' => [
+            'allow_mixed' => true,
+        ],
+        'no_trailing_comma_in_list_call' => true,
+        'no_trailing_comma_in_singleline_array' => true,
+        'no_trailing_whitespace' => true,
+        'no_trailing_whitespace_in_comment' => true,
+        'no_unneeded_control_parentheses' => true,
+        'no_unneeded_curly_braces' => true,
+        'no_unneeded_final_method' => true,
+        'no_unreachable_default_argument_value' => true,
+        'no_unset_on_property' => true,
+        'no_unused_imports' => true,
+        'no_useless_else' => true,
+        'no_useless_return' => true,
+        'no_whitespace_before_comma_in_array' => true,
+        'no_whitespace_in_blank_line' => true,
+        'non_printable_character' => true,
+        'normalize_index_brace' => true,
+        'object_operator_without_whitespace' => true,
+        'ordered_class_elements' => [
+            'order' => [
+                'use_trait',
+                'constant_public',
+                'constant_protected',
+                'constant_private',
+                'property_public_static',
+                'property_protected_static',
+                'property_private_static',
+                'property_public',
+                'property_protected',
+                'property_private',
+                'method_public_static',
+                'construct',
+                'destruct',
+                'magic',
+                'phpunit',
+                'method_public',
+                'method_protected',
+                'method_private',
+                'method_protected_static',
+                'method_private_static',
+            ],
+        ],
+        'ordered_imports' => [
+            'imports_order' => [
+                PhpCsFixer\Fixer\Import\OrderedImportsFixer::IMPORT_TYPE_CONST,
+                PhpCsFixer\Fixer\Import\OrderedImportsFixer::IMPORT_TYPE_FUNCTION,
+                PhpCsFixer\Fixer\Import\OrderedImportsFixer::IMPORT_TYPE_CLASS,
+            ]
+        ],
+        'ordered_interfaces' => [
+            'direction' => 'ascend',
+            'order' => 'alpha',
+        ],
+        'phpdoc_add_missing_param_annotation' => false,
+        'phpdoc_align' => true,
+        'phpdoc_annotation_without_dot' => true,
+        'phpdoc_indent' => true,
+        'phpdoc_no_access' => true,
+        'phpdoc_no_empty_return' => true,
+        'phpdoc_no_package' => true,
+        'phpdoc_order' => true,
+        'phpdoc_return_self_reference' => true,
+        'phpdoc_scalar' => true,
+        'phpdoc_separation' => true,
+        'phpdoc_single_line_var_spacing' => true,
+        'phpdoc_summary' => true,
+        'phpdoc_to_comment' => true,
+        'phpdoc_trim' => true,
+        'phpdoc_trim_consecutive_blank_line_separation' => true,
+        'phpdoc_types' => ['groups' => ['simple', 'meta']],
+        'phpdoc_types_order' => true,
+        'phpdoc_var_without_name' => true,
+        'pow_to_exponentiation' => true,
+        'protected_to_private' => true,
+        'return_assignment' => true,
+        'return_type_declaration' => ['space_before' => 'none'],
+        'self_accessor' => true,
+        'self_static_accessor' => true,
+        'semicolon_after_instruction' => true,
+        'set_type_to_cast' => true,
+        'short_scalar_cast' => true,
+        'simple_to_complex_string_variable' => true,
+        'simplified_null_return' => false,
+        'single_blank_line_at_eof' => true,
+        'single_import_per_statement' => true,
+        'single_line_after_imports' => true,
+        'single_quote' => true,
+        'standardize_not_equals' => true,
+        'strict_param' => true,
+        'ternary_to_null_coalescing' => true,
+        'trailing_comma_in_multiline_array' => true,
+        'trim_array_spaces' => true,
+        'unary_operator_spaces' => true,
+        'visibility_required' => [
+            'elements' => [
+                'const',
+                'method',
+                'property',
+            ],
+        ],
+        'void_return' => true,
+        'whitespace_after_comma_in_array' => true,
+    ]);

+ 7 - 0
vendor/sebastian/lines-of-code/ChangeLog.md

@@ -2,6 +2,12 @@
 
 All notable changes are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles.
 
+## [1.0.4] - 2023-12-22
+
+### Changed
+
+* This component is now compatible with `nikic/php-parser` 5.0
+
 ## [1.0.3] - 2020-11-28
 
 ### Fixed
@@ -28,6 +34,7 @@ All notable changes are documented in this file using the [Keep a CHANGELOG](htt
 
 * Initial release
 
+[1.0.4]: https://github.com/sebastianbergmann/lines-of-code/compare/1.0.3...1.0.4
 [1.0.3]: https://github.com/sebastianbergmann/lines-of-code/compare/1.0.2...1.0.3
 [1.0.2]: https://github.com/sebastianbergmann/lines-of-code/compare/1.0.1...1.0.2
 [1.0.1]: https://github.com/sebastianbergmann/lines-of-code/compare/1.0.0...1.0.1

+ 27 - 0
vendor/sebastian/lines-of-code/build.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="lines-of-code" default="setup">
+    <target name="setup" depends="clean,composer"/>
+
+    <target name="clean" description="Cleanup build artifacts">
+        <delete dir="${basedir}/vendor"/>
+        <delete file="${basedir}/composer.lock"/>
+    </target>
+
+    <target name="composer" depends="clean" description="Install dependencies with Composer">
+        <exec executable="${basedir}/tools/composer" taskname="composer">
+            <arg value="update"/>
+            <arg value="--no-interaction"/>
+            <arg value="--no-progress"/>
+            <arg value="--no-ansi"/>
+        </exec>
+    </target>
+
+    <target name="update-tools">
+        <exec executable="phive" taskname="phive">
+            <arg value="--no-progress"/>
+            <arg value="update"/>
+            <arg value="--force-accept-unsigned"/>
+        </exec>
+    </target>
+</project>
+

+ 1 - 1
vendor/sebastian/lines-of-code/composer.json

@@ -17,7 +17,7 @@
     "prefer-stable": true,
     "require": {
         "php": ">=7.3",
-        "nikic/php-parser": "^4.6"
+        "nikic/php-parser": "^4.18 || ^5.0"
     },
     "require-dev": {
         "phpunit/phpunit": "^9.3"

+ 12 - 0
vendor/sebastian/lines-of-code/infection.json

@@ -0,0 +1,12 @@
+{
+    "source": {
+        "directories": [
+            "src"
+        ]
+    },
+    "mutators": {
+        "@default": true
+    },
+    "minMsi": 100,
+    "minCoveredMsi": 100
+}

+ 24 - 0
vendor/sebastian/lines-of-code/phpunit.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd"
+         bootstrap="vendor/autoload.php"
+         executionOrder="depends,defects"
+         forceCoversAnnotation="true"
+         beStrictAboutCoversAnnotation="true"
+         beStrictAboutOutputDuringTests="true"
+         beStrictAboutTodoAnnotatedTests="true"
+         failOnRisky="true"
+         failOnWarning="true"
+         verbose="true">
+    <testsuites>
+        <testsuite name="default">
+            <directory suffix="Test.php">tests</directory>
+        </testsuite>
+    </testsuites>
+
+    <coverage processUncoveredFiles="true">
+        <include>
+            <directory suffix=".php">src</directory>
+        </include>
+    </coverage>
+</phpunit>

+ 1 - 8
vendor/sebastian/lines-of-code/src/Counter.php

@@ -11,10 +11,8 @@ namespace SebastianBergmann\LinesOfCode;
 
 use function substr_count;
 use PhpParser\Error;
-use PhpParser\Lexer;
 use PhpParser\Node;
 use PhpParser\NodeTraverser;
-use PhpParser\Parser;
 use PhpParser\ParserFactory;
 
 final class Counter
@@ -39,7 +37,7 @@ final class Counter
         }
 
         try {
-            $nodes = $this->parser()->parse($source);
+            $nodes = (new ParserFactory)->createForHostVersion()->parse($source);
 
             assert($nodes !== null);
 
@@ -83,9 +81,4 @@ final class Counter
 
         return $visitor->result();
     }
-
-    private function parser(): Parser
-    {
-        return (new ParserFactory)->create(ParserFactory::PREFER_PHP7, new Lexer);
-    }
 }

+ 43 - 0
vendor/sebastian/lines-of-code/tests/_fixture/ExampleClass.php

@@ -0,0 +1,43 @@
+<?php declare(strict_types=1);
+namespace SebastianBergmann\Complexity\TestFixture;
+
+final class ExampleClass
+{
+    public function method(): void
+    {
+        if (true || false) {
+            if (true && false) {
+                for ($i = 0; $i <= 1; $i++) {
+                    $a = true ? 'foo' : 'bar';
+                }
+
+                foreach (range(0, 1) as $i) {
+                    switch ($i) {
+                        case 0:
+                            break;
+
+                        case 1:
+                            break;
+
+                        default:
+                    }
+                }
+            }
+        } elseif (null) {
+            try {
+                // ...
+            } catch (Throwable $t) {
+                /* ... */
+            }
+        }
+
+        /*
+         * ...
+         */
+        while (true) {
+        }
+
+        do {
+        } while (false);
+    }
+}

+ 36 - 0
vendor/sebastian/lines-of-code/tests/_fixture/source_with_ignore.php

@@ -0,0 +1,36 @@
+<?php declare(strict_types=1);
+if ($neverHappens) {
+    // @codeCoverageIgnoreStart
+    print '*';
+    // @codeCoverageIgnoreEnd
+}
+
+/**
+ * @codeCoverageIgnore
+ */
+class Foo
+{
+    public function bar(): void
+    {
+    }
+}
+
+class Bar
+{
+    /**
+     * @codeCoverageIgnore
+     */
+    public function foo(): void
+    {
+    }
+}
+
+function baz(): void
+{
+    print '*'; // @codeCoverageIgnore
+}
+
+interface Bor
+{
+    public function foo();
+}

+ 1 - 0
vendor/sebastian/lines-of-code/tests/_fixture/source_without_newline.php

@@ -0,0 +1 @@
+<?php // This file contains no newline.

+ 71 - 0
vendor/sebastian/lines-of-code/tests/integration/CounterTest.php

@@ -0,0 +1,71 @@
+<?php declare(strict_types=1);
+/*
+ * This file is part of sebastian/lines-of-code.
+ *
+ * (c) Sebastian Bergmann <sebastian@phpunit.de>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace SebastianBergmann\LinesOfCode;
+
+use function file_get_contents;
+use PhpParser\ParserFactory;
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @covers \SebastianBergmann\LinesOfCode\Counter
+ * @covers \SebastianBergmann\LinesOfCode\LineCountingVisitor
+ *
+ * @uses \SebastianBergmann\LinesOfCode\LinesOfCode
+ *
+ * @medium
+ */
+final class CounterTest extends TestCase
+{
+    public function testCountsLinesOfCodeInSourceFile(): void
+    {
+        $count = (new Counter)->countInSourceFile(__DIR__ . '/../_fixture/ExampleClass.php');
+
+        $this->assertSame(43, $count->linesOfCode());
+        $this->assertSame(5, $count->commentLinesOfCode());
+        $this->assertSame(38, $count->nonCommentLinesOfCode());
+        $this->assertSame(13, $count->logicalLinesOfCode());
+    }
+
+    public function testCountsLinesOfCodeInSourceString(): void
+    {
+        $count = (new Counter)->countInSourceString(file_get_contents(__DIR__ . '/../_fixture/ExampleClass.php'));
+
+        $this->assertSame(43, $count->linesOfCode());
+        $this->assertSame(5, $count->commentLinesOfCode());
+        $this->assertSame(38, $count->nonCommentLinesOfCode());
+        $this->assertSame(13, $count->logicalLinesOfCode());
+    }
+
+    public function testCountsLinesOfCodeInAbstractSyntaxTree(): void
+    {
+        $nodes = (new ParserFactory)->createForHostVersion()->parse(
+            file_get_contents(__DIR__ . '/../_fixture/ExampleClass.php')
+        );
+
+        assert($nodes !== null);
+
+        $count = (new Counter)->countInAbstractSyntaxTree(51, $nodes);
+
+        $this->assertSame(51, $count->linesOfCode());
+        $this->assertSame(5, $count->commentLinesOfCode());
+        $this->assertSame(46, $count->nonCommentLinesOfCode());
+        $this->assertSame(13, $count->logicalLinesOfCode());
+    }
+
+    public function testHandlesFileWithoutNewline(): void
+    {
+        $count = (new Counter)->countInSourceFile(__DIR__ . '/../_fixture/source_without_newline.php');
+
+        $this->assertSame(1, $count->linesOfCode());
+        $this->assertSame(1, $count->commentLinesOfCode());
+        $this->assertSame(0, $count->nonCommentLinesOfCode());
+        $this->assertSame(0, $count->logicalLinesOfCode());
+    }
+}

+ 76 - 0
vendor/sebastian/lines-of-code/tests/unit/LineCountingVisitorTest.php

@@ -0,0 +1,76 @@
+<?php declare(strict_types=1);
+/*
+ * This file is part of sebastian/lines-of-code.
+ *
+ * (c) Sebastian Bergmann <sebastian@phpunit.de>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace SebastianBergmann\LinesOfCode;
+
+use function file_get_contents;
+use PhpParser\NodeTraverser;
+use PhpParser\ParserFactory;
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @covers \SebastianBergmann\LinesOfCode\LineCountingVisitor
+ *
+ * @uses \SebastianBergmann\LinesOfCode\LinesOfCode
+ *
+ * @small
+ */
+final class LineCountingVisitorTest extends TestCase
+{
+    /**
+     * @dataProvider provideData
+     */
+    public function testCountsLinesOfCodeInAbstractSyntaxTree(string $sourceFile, int $linesOfCode, int $commentLinesOfCode, int $nonCommentLinesOfCode, int $logicalLinesOfCode): void
+    {
+        $nodes = (new ParserFactory)->createForHostVersion()->parse(
+            file_get_contents($sourceFile)
+        );
+
+        $traverser = new NodeTraverser;
+
+        $visitor = new LineCountingVisitor($linesOfCode);
+
+        $traverser->addVisitor($visitor);
+
+        /* @noinspection UnusedFunctionResultInspection */
+        $traverser->traverse($nodes);
+
+        $this->assertSame($linesOfCode, $visitor->result()->linesOfCode());
+        $this->assertSame($commentLinesOfCode, $visitor->result()->commentLinesOfCode());
+        $this->assertSame($nonCommentLinesOfCode, $visitor->result()->nonCommentLinesOfCode());
+        $this->assertSame($logicalLinesOfCode, $visitor->result()->logicalLinesOfCode());
+    }
+
+    public function provideData(): array
+    {
+        return [
+            [
+                __DIR__ . '/../_fixture/ExampleClass.php',
+                51,
+                5,
+                46,
+                13,
+            ],
+            [
+                __DIR__ . '/../_fixture/source_with_ignore.php',
+                44,
+                9,
+                35,
+                4,
+            ],
+            [
+                __DIR__ . '/../_fixture/source_without_newline.php',
+                1,
+                1,
+                0,
+                0,
+            ],
+        ];
+    }
+}

+ 113 - 0
vendor/sebastian/lines-of-code/tests/unit/LinesOfCodeTest.php

@@ -0,0 +1,113 @@
+<?php declare(strict_types=1);
+/*
+ * This file is part of sebastian/lines-of-code.
+ *
+ * (c) Sebastian Bergmann <sebastian@phpunit.de>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace SebastianBergmann\LinesOfCode;
+
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @covers \SebastianBergmann\LinesOfCode\LinesOfCode
+ *
+ * @small
+ */
+final class LinesOfCodeTest extends TestCase
+{
+    /**
+     * @testdox Has Lines of Code (LOC)
+     */
+    public function testHasLinesOfCode(): void
+    {
+        $this->assertSame(1, $this->linesOfCode()->linesOfCode());
+    }
+
+    /**
+     * @testdox Has Comment Lines of Code (CLOC)
+     */
+    public function testHasCommentLinesOfCode(): void
+    {
+        $this->assertSame(1, $this->linesOfCode()->commentLinesOfCode());
+    }
+
+    /**
+     * @testdox Has Non-Comment Lines of Code (NCLOC)
+     */
+    public function testHasNonCommentLinesOfCode(): void
+    {
+        $this->assertSame(0, $this->linesOfCode()->nonCommentLinesOfCode());
+    }
+
+    /**
+     * @testdox Has Logical Lines of Code (LLOC)
+     */
+    public function testHasLogicalLinesOfCode(): void
+    {
+        $this->assertSame(0, $this->linesOfCode()->logicalLinesOfCode());
+    }
+
+    public function testLinesOfCodeCannotBeNegative(): void
+    {
+        $this->expectException(NegativeValueException::class);
+        $this->expectExceptionMessage('$linesOfCode must not be negative');
+
+        new LinesOfCode(-1, 0, 0, 0);
+    }
+
+    public function testCommentLinesOfCodeCannotBeNegative(): void
+    {
+        $this->expectException(NegativeValueException::class);
+        $this->expectExceptionMessage('$commentLinesOfCode must not be negative');
+
+        new LinesOfCode(0, -1, 0, 0);
+    }
+
+    public function testNonCommentLinesOfCodeCannotBeNegative(): void
+    {
+        $this->expectException(NegativeValueException::class);
+        $this->expectExceptionMessage('$nonCommentLinesOfCode must not be negative');
+
+        new LinesOfCode(0, 0, -1, 0);
+    }
+
+    public function testLogicalLinesOfCodeCannotBeNegative(): void
+    {
+        $this->expectException(NegativeValueException::class);
+        $this->expectExceptionMessage('$logicalLinesOfCode must not be negative');
+
+        new LinesOfCode(0, 0, 0, -1);
+    }
+
+    /**
+     * @testdox Lines of Code = Comment Lines of Code + Non-Comment Lines of Code
+     */
+    public function testNumbersHaveToMakeSense(): void
+    {
+        $this->expectException(IllogicalValuesException::class);
+        $this->expectExceptionMessage('$linesOfCode !== $commentLinesOfCode + $nonCommentLinesOfCode');
+
+        new LinesOfCode(1, 2, 2, 0);
+    }
+
+    public function testTwoInstancesCanBeAdded(): void
+    {
+        $a = new LinesOfCode(2, 1, 1, 1);
+        $b = new LinesOfCode(4, 2, 2, 2);
+
+        $sum = $a->plus($b);
+
+        $this->assertSame(6, $sum->linesOfCode());
+        $this->assertSame(3, $sum->commentLinesOfCode());
+        $this->assertSame(3, $sum->nonCommentLinesOfCode());
+        $this->assertSame(3, $sum->logicalLinesOfCode());
+    }
+
+    private function linesOfCode(): LinesOfCode
+    {
+        return new LinesOfCode(1, 1, 0, 0);
+    }
+}

BIN
vendor/sebastian/lines-of-code/tools/composer


BIN
vendor/sebastian/lines-of-code/tools/infection


BIN
vendor/sebastian/lines-of-code/tools/php-cs-fixer


BIN
vendor/sebastian/lines-of-code/tools/psalm


BIN
vendor/sebastian/lines-of-code/tools/roave-backward-compatibility-check


+ 11 - 0
vendor/yansongda/supports/.gitattributes

@@ -0,0 +1,11 @@
+* text=auto
+
+/tests export-ignore
+/.github export-ignore
+
+.gitattributes export-ignore
+.gitignore export-ignore
+phpunit.php export-ignore
+phpunit.xml export-ignore
+phpunit.xml.dist export-ignore
+.php_cs  export-ignore

+ 45 - 0
vendor/yansongda/supports/.github/workflows/style.yml

@@ -0,0 +1,45 @@
+name: Coding Style
+on:
+  push:
+    branches:
+      - master
+  pull_request:
+
+jobs:
+  php_cs_fixer:
+    name: php_cs_fixer
+    runs-on: "ubuntu-latest"
+    steps:
+      - name: Checkout Code
+        uses: actions/checkout@v4
+      - name: PHP
+        uses: shivammathur/setup-php@v2
+        with:
+          php-version: '8.3'
+          coverage: none
+      - name: Install Dependencies
+        run: composer install --no-progress
+      - name: Run PHP-CS-Fixer
+        run: composer cs-fix
+  php_stan:
+    name: php_stan-php${{ matrix.php-version }}
+    runs-on: "ubuntu-latest"
+    strategy:
+      fail-fast: true
+      matrix:
+        php-version:
+          - 8.1
+          - 8.2
+          - 8.3
+    steps:
+      -   name: Checkout Code
+          uses: actions/checkout@v4
+      -   name: PHP
+          uses: shivammathur/setup-php@v2
+          with:
+            php-version: ${{ matrix.php-version }}
+            coverage: none
+      -   name: Install Dependencies
+          run: composer install --no-progress
+      -   name: Run PHP-Stan
+          run: composer analyse

+ 29 - 0
vendor/yansongda/supports/.github/workflows/tester.yml

@@ -0,0 +1,29 @@
+name: Tester
+on:
+  push:
+    branches:
+      - master
+  pull_request:
+
+jobs:
+  PHPUnit:
+    name: phpunit-php${{ matrix.php-version }}
+    runs-on: "ubuntu-latest"
+    strategy:
+      fail-fast: true
+      matrix:
+        php-version:
+          - 8.1
+          - 8.2
+          - 8.3
+    steps:
+      - name: Checkout Code
+        uses: actions/checkout@v4
+      - name: PHP
+        uses: shivammathur/setup-php@v2
+        with:
+          php-version: ${{ matrix.php-version }}
+      - name: Install Dependencies
+        run: composer install --no-progress
+      - name: Run PHPUnit
+        run: composer test

+ 4 - 0
vendor/yansongda/supports/.gitignore

@@ -0,0 +1,4 @@
+vendor/
+*.log
+composer.lock
+.DS_Store

+ 1 - 0
vendor/yansongda/supports/.php-cs-fixer.php

@@ -18,5 +18,6 @@ return (new PhpCsFixer\Config())
             'import_constants' => true,
             'import_functions' => true,
         ],
+        'multiline_whitespace_before_semicolons' => ['strategy' => 'no_multi_line'],
     ])
     ->setFinder($finder);

+ 19 - 0
vendor/yansongda/supports/phpunit.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd"
+         backupGlobals="false"
+         backupStaticAttributes="false"
+         bootstrap="./vendor/autoload.php"
+         colors="true"
+         convertErrorsToExceptions="true"
+         convertNoticesToExceptions="true"
+         convertWarningsToExceptions="true"
+         processIsolation="false"
+         stopOnFailure="false"
+         cacheResult="false">
+    <testsuites>
+        <testsuite name="Tests">
+            <directory suffix="Test.php">./tests</directory>
+        </testsuite>
+    </testsuites>
+</phpunit>

+ 5 - 5
vendor/yansongda/supports/src/Arr.php

@@ -85,7 +85,7 @@ class Arr
         return $array;
     }
 
-    public static function exists(ArrayAccess|array $array, int|string $key): bool
+    public static function exists(array|ArrayAccess $array, int|string $key): bool
     {
         if ($array instanceof ArrayAccess) {
             return $array->offsetExists($key);
@@ -168,7 +168,7 @@ class Arr
         }
     }
 
-    public static function get(ArrayAccess|array $array, int|string $key = null, mixed $default = null): mixed
+    public static function get(array|ArrayAccess $array, int|string $key = null, mixed $default = null): mixed
     {
         if (!static::accessible($array)) {
             return $default;
@@ -193,7 +193,7 @@ class Arr
         return $array;
     }
 
-    public static function has(ArrayAccess|array $array, array|string|null $keys): bool
+    public static function has(array|ArrayAccess $array, null|array|string $keys): bool
     {
         if (is_null($keys)) {
             return false;
@@ -234,7 +234,7 @@ class Arr
         return array_intersect_key($array, array_flip((array) $keys));
     }
 
-    public static function pluck(array $array, array|string $value, array|string|null $key = null): array
+    public static function pluck(array $array, array|string $value, null|array|string $key = null): array
     {
         $results = [];
 
@@ -303,7 +303,7 @@ class Arr
      * Set an array item to a given value using "dot" notation.
      * If no key is given to the method, the entire array will be replaced.
      */
-    public static function set(array &$array, int|string|null $key, mixed $value): array
+    public static function set(array &$array, null|int|string $key, mixed $value): array
     {
         if (is_null($key)) {
             return $array = $value;

+ 5 - 5
vendor/yansongda/supports/src/Collection.php

@@ -35,7 +35,7 @@ class Collection implements ArrayAccess, Countable, IteratorAggregate, JsonSeria
         return $value instanceof self ? new static($value) : new static(Arr::wrap($value));
     }
 
-    public static function unwrap(Collection|array $value): array
+    public static function unwrap(array|Collection $value): array
     {
         return $value instanceof self ? $value->all() : $value;
     }
@@ -100,17 +100,17 @@ class Collection implements ArrayAccess, Countable, IteratorAggregate, JsonSeria
         return $end;
     }
 
-    public function add(int|string|null $key, mixed $value): void
+    public function add(null|int|string $key, mixed $value): void
     {
         Arr::set($this->items, $key, $value);
     }
 
-    public function set(string|int|null $key, mixed $value): void
+    public function set(null|int|string $key, mixed $value): void
     {
         Arr::set($this->items, $key, $value);
     }
 
-    public function get(string|int|null $key = null, mixed $default = null): mixed
+    public function get(null|int|string $key = null, mixed $default = null): mixed
     {
         return Arr::get($this->items, $key, $default);
     }
@@ -172,7 +172,7 @@ class Collection implements ArrayAccess, Countable, IteratorAggregate, JsonSeria
         return new static(Arr::random($this->items, $number ?? 1));
     }
 
-    public function reduce(callable $callback, mixed $initial = null)
+    public function reduce(callable $callback, mixed $initial = null): mixed
     {
         return array_reduce($this->items, $callback, $initial);
     }

+ 1 - 3
vendor/yansongda/supports/src/Config.php

@@ -4,6 +4,4 @@ declare(strict_types=1);
 
 namespace Yansongda\Supports;
 
-class Config extends Collection
-{
-}
+class Config extends Collection {}

+ 1 - 1
vendor/yansongda/supports/src/Functions.php

@@ -21,7 +21,7 @@ if (!function_exists('value')) {
 }
 
 if (!function_exists('data_get')) {
-    function data_get(mixed $target, array|int|string|null $key, mixed $default = null): mixed
+    function data_get(mixed $target, null|array|int|string $key, mixed $default = null): mixed
     {
         if (is_null($key)) {
             return $target;

+ 2 - 2
vendor/yansongda/supports/src/Str.php

@@ -4,7 +4,7 @@ declare(strict_types=1);
 
 namespace Yansongda\Supports;
 
-use Exception;
+use Random\RandomException;
 
 /**
  * Most of the methods in this file come from illuminate/support.
@@ -147,7 +147,7 @@ class Str
     }
 
     /**
-     * @throws Exception
+     * @throws RandomException
      */
     public static function random(int $length = 16): string
     {

+ 1 - 3
vendor/yansongda/supports/src/Traits/Accessable.php

@@ -69,7 +69,5 @@ trait Accessable
         $this->set($offset, $value);
     }
 
-    public function offsetUnset(mixed $offset): void
-    {
-    }
+    public function offsetUnset(mixed $offset): void {}
 }

+ 1 - 1
vendor/yansongda/supports/src/Traits/Serializable.php

@@ -30,7 +30,7 @@ trait Serializable
         return serialize($this);
     }
 
-    public function unserialize($data): void
+    public function unserialize(string $data): void
     {
         unserialize($data);
     }

+ 107 - 0
vendor/yansongda/supports/tests/ArrTest.php

@@ -0,0 +1,107 @@
+<?php
+
+namespace Yansongda\Supports\Tests;
+
+use PHPUnit\Framework\TestCase;
+use stdClass;
+use Yansongda\Supports\Arr;
+
+class ArrTest extends TestCase
+{
+    public function testSnakeCaseKey()
+    {
+        $a = [
+            'myName' => 'yansongda',
+            'myAge' => 27,
+            'family' => [
+                'hasChildren' => false,
+            ]
+        ];
+        $expect = [
+            'my_name' => 'yansongda',
+            'my_age' => 27,
+            'family' => [
+                'has_children' => false,
+            ]
+        ];
+        self::assertEqualsCanonicalizing($expect, Arr::snakeCaseKey($a));
+
+        $obj =  new stdClass();
+        $a = [
+            'myName' => 'yansongda',
+            'myAge' => 27,
+            'family' => [
+                'hasChildren' => $obj,
+            ]
+        ];
+        $expect = [
+            'my_name' => 'yansongda',
+            'my_age' => 27,
+            'family' => [
+                'has_children' => $obj,
+            ]
+        ];
+        self::assertEqualsCanonicalizing($expect, Arr::snakeCaseKey($a));
+    }
+
+    public function testCamelCaseKey()
+    {
+        $a = [
+            'my_name' => 'yansongda',
+            'my_age' => 27,
+            'family' => [
+                'has_children' => false,
+            ]
+        ];
+        $expect = [
+            'myName' => 'yansongda',
+            'myAge' => 27,
+            'family' => [
+                'hasChildren' => false,
+            ]
+        ];
+        self::assertEqualsCanonicalizing($expect, Arr::camelCaseKey($a));
+    }
+
+    public function testCamelCaseKeyWithObject()
+    {
+        $obj = new Class {
+            public function toArray(): array
+            {
+                return ['name' => 'yansongda'];
+            }
+        };
+
+        $a = [
+            'my_name' => 'yansongda',
+            'my_age' => 27,
+            'family' => [
+                'has_children' => false,
+            ],
+            'objs' => [
+                $obj,
+            ]
+        ];
+        $expect = [
+            'myName' => 'yansongda',
+            'myAge' => 27,
+            'family' => [
+                'hasChildren' => false,
+            ],
+            'objs' => [
+                ['name' => 'yansongda'],
+            ]
+        ];
+        self::assertEqualsCanonicalizing($expect, Arr::camelCaseKey($a));
+    }
+
+    public function testToString()
+    {
+        $a = [
+            'my_name' => 'yansongda',
+            'my_age' => 27,
+        ];
+
+        self::assertEquals('my_name=yansongda&my_age=27', Arr::toString($a));
+    }
+}

+ 102 - 0
vendor/yansongda/supports/tests/CollectionTest.php

@@ -0,0 +1,102 @@
+<?php
+
+namespace Yansongda\Supports\Tests;
+
+use PHPUnit\Framework\TestCase;
+use Yansongda\Supports\Collection;
+
+class CollectionTest extends TestCase
+{
+    /**
+     * data.
+     *
+     * @var array
+     */
+    protected $data = [];
+
+    /**
+     * collection.
+     *
+     * @var Collection
+     */
+    protected $collection;
+
+    protected function setUp(): void
+    {
+        $this->data = [
+            'name' => 'yansongda',
+            'age' => 26,
+            'sex' => 1,
+            'language' => [
+                'php',
+                'java',
+                'rust',
+            ],
+        ];
+        $this->collection = new Collection($this->data);
+    }
+
+    public function testToString()
+    {
+        $json = json_encode($this->data);
+
+        self::assertEquals($json, $this->collection->toJson());
+        self::assertEquals($json, $this->collection->__toString());
+    }
+
+    public function testMagicGet()
+    {
+        self::assertEquals('yansongda', $this->collection->name);
+        self::assertEqualsCanonicalizing(['php', 'java', 'rust'], $this->collection->language);
+    }
+
+    public function testMagicSet()
+    {
+        $this->collection->fuck = 'ok';
+        $this->collection->foo = ['bar', 'fuck'];
+
+        self::assertEquals('ok', $this->collection->get('fuck'));
+        self::assertEquals(['bar', 'fuck'], $this->collection->get('foo'));
+    }
+
+    public function testIsset()
+    {
+        self::assertTrue(isset($this->collection['name']));
+        self::assertFalse(isset($this->collection['notExistKey']));
+    }
+
+    public function testUnset()
+    {
+        unset($this->collection['name']);
+
+        self::assertFalse(isset($this->collection['name']));
+    }
+
+    public function testAll()
+    {
+        self::assertEquals($this->data, $this->collection->all());
+    }
+
+    public function testOnly()
+    {
+        self::assertEquals([
+            'name' => 'yansongda',
+        ], $this->collection->only(['name']));
+    }
+
+    public function testExcept()
+    {
+        self::assertEquals([
+            'name' => 'yansongda',
+            'age' => 26,
+            'sex' => 1,
+        ], $this->collection->except('language')->all());
+    }
+
+    public function testMerge()
+    {
+        $merge = ['haha' => 'enen'];
+
+        self::assertEqualsCanonicalizing(array_merge($this->data, $merge), $this->collection->merge($merge)->all());
+    }
+}

+ 17 - 0
vendor/yansongda/supports/tests/ConfigTest.php

@@ -0,0 +1,17 @@
+<?php
+
+namespace Yansongda\Supports\Tests;
+
+use PHPUnit\Framework\TestCase;
+use Yansongda\Supports\Collection;
+use Yansongda\Supports\Config;
+
+class ConfigTest extends TestCase
+{
+    public function testBootstrap()
+    {
+        $config = [];
+
+        self::assertInstanceOf(Collection::class, new Config($config));
+    }
+}

+ 18 - 0
vendor/yansongda/supports/tests/FunctionTest.php

@@ -0,0 +1,18 @@
+<?php
+
+namespace Yansongda\Supports\Tests;
+
+use PHPUnit\Framework\TestCase;
+
+class FunctionTest extends TestCase
+{
+    public function testNamespace()
+    {
+        self::assertFalse(function_exists('collect'));
+        self::assertFalse(function_exists('value'));
+        self::assertFalse(function_exists('data_get'));
+        self::assertTrue(function_exists('Yansongda\Supports\collect'));
+        self::assertTrue(function_exists('Yansongda\Supports\value'));
+        self::assertTrue(function_exists('Yansongda\Supports\data_get'));
+    }
+}

+ 239 - 0
vendor/yansongda/supports/tests/PipelineTest.php

@@ -0,0 +1,239 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Yansongda\Supports\Tests;
+
+use Yansongda\Supports\Pipeline;
+use Yansongda\Supports\Tests\Stubs\FooPipeline;
+use Mockery;
+use PHPUnit\Framework\TestCase;
+use Psr\Container\ContainerInterface;
+
+/**
+ * @internal
+ * @coversNothing
+ */
+class PipelineTest extends TestCase
+{
+    protected function tearDown(): void
+    {
+        Mockery::close();
+    }
+
+    public function testPipelineBasicUsage()
+    {
+        $pipeTwo = function ($piped, $next) {
+            $_SERVER['__test.pipe.two'] = $piped;
+
+            return $next($piped);
+        };
+
+        $result = (new Pipeline($this->getContainer()))
+            ->send('foo')
+            ->through([PipelineTestPipeOne::class, $pipeTwo])
+            ->then(function ($piped) {
+                return $piped;
+            });
+
+        static::assertSame('foo', $result);
+        static::assertSame('foo', $_SERVER['__test.pipe.one']);
+        static::assertSame('foo', $_SERVER['__test.pipe.two']);
+
+        unset($_SERVER['__test.pipe.one'], $_SERVER['__test.pipe.two']);
+    }
+
+    public function testPipelineUsageWithObjects()
+    {
+        $result = (new Pipeline($this->getContainer()))
+            ->send('foo')
+            ->through([new PipelineTestPipeOne()])
+            ->then(function ($piped) {
+                return $piped;
+            });
+
+        static::assertSame('foo', $result);
+        static::assertSame('foo', $_SERVER['__test.pipe.one']);
+
+        unset($_SERVER['__test.pipe.one']);
+    }
+
+    public function testPipelineUsageWithInvokableObjects()
+    {
+        $result = (new Pipeline($this->getContainer()))
+            ->send('foo')
+            ->through([new PipelineTestPipeTwo()])
+            ->then(
+                function ($piped) {
+                    return $piped;
+                }
+            );
+
+        static::assertSame('foo', $result);
+        static::assertSame('foo', $_SERVER['__test.pipe.one']);
+
+        unset($_SERVER['__test.pipe.one']);
+    }
+
+    public function testPipelineUsageWithCallable()
+    {
+        $function = function ($piped, $next) {
+            $_SERVER['__test.pipe.one'] = 'foo';
+
+            return $next($piped);
+        };
+
+        $result = (new Pipeline($this->getContainer()))
+            ->send('foo')
+            ->through([$function])
+            ->then(
+                function ($piped) {
+                    return $piped;
+                }
+            );
+
+        static::assertSame('foo', $result);
+        static::assertSame('foo', $_SERVER['__test.pipe.one']);
+
+        unset($_SERVER['__test.pipe.one']);
+
+        $result = (new Pipeline($this->getContainer()))
+            ->send('bar')
+            ->through($function)
+            ->then(static function ($passable) {
+                return $passable;
+            });
+
+        static::assertSame('bar', $result);
+        static::assertSame('foo', $_SERVER['__test.pipe.one']);
+
+        unset($_SERVER['__test.pipe.one']);
+    }
+
+    public function testPipelineUsageWithInvokableClass()
+    {
+        $result = (new Pipeline($this->getContainer()))
+            ->send('foo')
+            ->through([PipelineTestPipeTwo::class])
+            ->then(
+                function ($piped) {
+                    return $piped;
+                }
+            );
+
+        static::assertSame('foo', $result);
+        static::assertSame('foo', $_SERVER['__test.pipe.one']);
+
+        unset($_SERVER['__test.pipe.one']);
+    }
+
+    public function testPipelineUsageWithParameters()
+    {
+        $parameters = ['one', 'two'];
+
+        $result = (new Pipeline($this->getContainer()))
+            ->send('foo')
+            ->through(PipelineTestParameterPipe::class . ':' . implode(',', $parameters))
+            ->then(function ($piped) {
+                return $piped;
+            });
+
+        static::assertSame('foo', $result);
+        static::assertEquals($parameters, $_SERVER['__test.pipe.parameters']);
+
+        unset($_SERVER['__test.pipe.parameters']);
+    }
+
+    public function testPipelineViaChangesTheMethodBeingCalledOnThePipes()
+    {
+        $pipelineInstance = new Pipeline($this->getContainer());
+        $result = $pipelineInstance->send('data')
+            ->through(PipelineTestPipeOne::class)
+            ->via('differentMethod')
+            ->then(function ($piped) {
+                return $piped;
+            });
+        static::assertSame('data', $result);
+    }
+
+    public function testPipelineThenReturnMethodRunsPipelineThenReturnsPassable()
+    {
+        $result = (new Pipeline($this->getContainer()))
+            ->send('foo')
+            ->through([PipelineTestPipeOne::class])
+            ->then(static function ($passable) {
+                return $passable;
+            });
+
+        static::assertSame('foo', $result);
+        static::assertSame('foo', $_SERVER['__test.pipe.one']);
+
+        unset($_SERVER['__test.pipe.one']);
+    }
+
+    public function testHandleCarry()
+    {
+        $result = (new FooPipeline($this->getContainer()))
+            ->send($id = rand(0, 99))
+            ->through([PipelineTestPipeOne::class])
+            ->via('incr')
+            ->then(static function ($passable) {
+                if (is_int($passable)) {
+                    $passable += 3;
+                }
+                return $passable;
+            });
+
+        static::assertSame($id + 6, $result);
+    }
+
+    protected function getContainer()
+    {
+        $container = Mockery::mock(ContainerInterface::class);
+        $container->shouldReceive('get')->with(PipelineTestPipeOne::class)->andReturn(new PipelineTestPipeOne());
+        $container->shouldReceive('get')->with(PipelineTestPipeTwo::class)->andReturn(new PipelineTestPipeTwo());
+        $container->shouldReceive('get')->with(PipelineTestParameterPipe::class)->andReturn(new PipelineTestParameterPipe());
+
+        return $container;
+    }
+}
+
+class PipelineTestPipeOne
+{
+    public function handle($piped, $next)
+    {
+        $_SERVER['__test.pipe.one'] = $piped;
+
+        return $next($piped);
+    }
+
+    public function differentMethod($piped, $next)
+    {
+        return $next($piped);
+    }
+
+    public function incr($piped, $next)
+    {
+        return $next(++$piped);
+    }
+}
+
+class PipelineTestPipeTwo
+{
+    public function __invoke($piped, $next)
+    {
+        $_SERVER['__test.pipe.one'] = $piped;
+
+        return $next($piped);
+    }
+}
+
+class PipelineTestParameterPipe
+{
+    public function handle($piped, $next, $parameter1 = null, $parameter2 = null)
+    {
+        $_SERVER['__test.pipe.parameters'] = [$parameter1, $parameter2];
+
+        return $next($piped);
+    }
+}

+ 33 - 0
vendor/yansongda/supports/tests/StrTest.php

@@ -0,0 +1,33 @@
+<?php
+
+namespace Yansongda\Supports\Tests;
+
+use PHPUnit\Framework\TestCase;
+use Yansongda\Supports\Str;
+
+class StrTest extends TestCase
+{
+    public function testCamel()
+    {
+        self::assertSame('helloWorld', Str::camel('HelloWorld'));
+        self::assertSame('helloWorld', Str::camel('hello_world'));
+        self::assertSame('helloWorld', Str::camel('hello-world'));
+        self::assertSame('helloWorld', Str::camel('hello world'));
+    }
+
+    public function testSnake()
+    {
+        self::assertSame('hello_world', Str::snake('HelloWorld'));
+        self::assertSame('hello_world', Str::snake('hello_world'));
+        self::assertSame('hello_world', Str::snake('hello world'));
+    }
+
+    public function testStudly()
+    {
+        self::assertSame('HelloWorld', Str::studly('helloWorld'));
+        self::assertSame('HelloWorld', Str::studly('hello_world'));
+        self::assertSame('HelloWorld', Str::studly('hello-world'));
+        self::assertSame('HelloWorld', Str::studly('hello world'));
+        self::assertSame('Hello-World', Str::studly('hello world', '-'));
+    }
+}

+ 19 - 0
vendor/yansongda/supports/tests/Stubs/FooPipeline.php

@@ -0,0 +1,19 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Yansongda\Supports\Tests\Stubs;
+
+use Yansongda\Supports\Pipeline;
+
+class FooPipeline extends Pipeline
+{
+    protected function handleCarry(mixed $carry): mixed
+    {
+        $carry = parent::handleCarry($carry);
+        if (is_int($carry)) {
+            $carry += 2;
+        }
+        return $carry;
+    }
+}

+ 31 - 0
vendor/yansongda/supports/tests/Stubs/TraitStub.php

@@ -0,0 +1,31 @@
+<?php
+
+namespace Yansongda\Supports\Tests\Stubs;
+
+use ArrayAccess;
+use JsonSerializable as JsonSerializableInterface;
+use Yansongda\Supports\Traits\Accessable;
+use Yansongda\Supports\Traits\Arrayable;
+use Yansongda\Supports\Traits\Serializable;
+
+class TraitStub  implements JsonSerializableInterface, ArrayAccess, \Serializable
+{
+    use Accessable;
+    use Arrayable;
+    use Serializable;
+
+    private $name = 'yansongda';
+
+    private $fooBar = 'name';
+
+    public function getName(): string
+    {
+        return $this->name;
+    }
+
+    public function setName(string $name): TraitStub
+    {
+        $this->name = $name;
+        return $this;
+    }
+}

+ 29 - 0
vendor/yansongda/supports/tests/Traits/ArrayAccessTest.php

@@ -0,0 +1,29 @@
+<?php
+
+namespace Yansongda\Supports\Tests\Traits;
+
+use PHPUnit\Framework\TestCase;
+use Yansongda\Supports\Tests\Stubs\TraitStub;
+
+class ArrayAccessTest extends TestCase
+{
+    protected $class;
+
+    protected function setUp(): void
+    {
+        $this->class = new TraitStub();
+    }
+
+    public function testAccess()
+    {
+        self::assertEquals('yansongda', $this->class->name);
+
+        $this->class->name = 'you';
+        self::assertEquals('you', $this->class->name);
+    }
+
+    public function testArray()
+    {
+        self::assertEqualsCanonicalizing(['name' => 'yansongda', 'foo_bar' => 'name'], $this->class->toArray());
+    }
+}

+ 30 - 0
vendor/yansongda/supports/tests/Traits/SerializableTest.php

@@ -0,0 +1,30 @@
+<?php
+
+namespace Yansongda\Supports\Tests\Traits;
+
+use PHPUnit\Framework\TestCase;
+use Yansongda\Supports\Tests\Stubs\TraitStub;
+
+class SerializableTest extends TestCase
+{
+    protected $class;
+
+    protected function setUp(): void
+    {
+        $this->class = new TraitStub();
+    }
+
+    public function testSerializeFunction()
+    {
+        self::assertStringContainsString('yansongda', serialize($this->class));
+        self::assertEquals('yansongda', unserialize(serialize($this->class))->getName());
+    }
+
+    public function testUnserializeArray()
+    {
+        $traitStub = $this->class->unserializeArray(['name' => 'yansongda-a']);
+
+        self::assertInstanceOf(TraitStub::class, $traitStub);
+        self::assertEquals('yansongda-a', $traitStub->getName());
+    }
+}