diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..d3c80ac --- /dev/null +++ b/.editorconfig @@ -0,0 +1,40 @@ +# https://editorconfig.org + +# SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors +# SPDX-License-Identifier: AGPL-3.0-or-later + +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = tab +insert_final_newline = true +trim_trailing_whitespace = true + +[*.feature] +indent_size = 2 +indent_style = space + +[*.yml] +indent_size = 2 +indent_style = space + +[*.md] +trim_trailing_whitespace = false + +[*.svg] +insert_final_newline = false + +[package*.json] +indent_size = 2 +indent_style = space + +[build/psalm-baseline.xml] +indent_size = 2 +indent_style = space + +[config/*config.php] +indent_size = 2 +indent_style = space \ No newline at end of file diff --git a/.github/workflows/phpunit-mysql.yml b/.github/workflows/phpunit-mysql.yml index 5d7ecdb..7f5e21b 100644 --- a/.github/workflows/phpunit-mysql.yml +++ b/.github/workflows/phpunit-mysql.yml @@ -21,7 +21,7 @@ jobs: strategy: matrix: php-versions: ['8.1', '8.2'] - server-versions: ['stable29'] + server-versions: ['stable30'] services: mysql: diff --git a/.github/workflows/phpunit-oci.yml b/.github/workflows/phpunit-oci.yml index 7498aac..472c67c 100644 --- a/.github/workflows/phpunit-oci.yml +++ b/.github/workflows/phpunit-oci.yml @@ -21,7 +21,7 @@ jobs: strategy: matrix: php-versions: ['8.1', '8.2'] - server-versions: ['stable29'] + server-versions: ['stable30'] services: oracle: diff --git a/.github/workflows/phpunit-pgsql.yml b/.github/workflows/phpunit-pgsql.yml index 4da8374..9fb0a2c 100644 --- a/.github/workflows/phpunit-pgsql.yml +++ b/.github/workflows/phpunit-pgsql.yml @@ -21,7 +21,7 @@ jobs: strategy: matrix: php-versions: ['8.1', '8.2'] - server-versions: ['stable29'] + server-versions: ['stable30'] services: postgres: diff --git a/.github/workflows/phpunit-sqlite.yml b/.github/workflows/phpunit-sqlite.yml index 50aa331..f4f0a59 100644 --- a/.github/workflows/phpunit-sqlite.yml +++ b/.github/workflows/phpunit-sqlite.yml @@ -21,7 +21,7 @@ jobs: strategy: matrix: php-versions: ['8.1', '8.2'] - server-versions: ['stable29'] + server-versions: ['stable30'] steps: - name: Set app env diff --git a/.gitignore b/.gitignore index 794f5ef..5fdf2d1 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,11 @@ # SPDX-License-Identifier: AGPL-3.0-or-later .idea *.iml +/coverage +clover.xml +/tests/coverage* /vendor/ +/vendor-bin/*/vendor/ /build/ node_modules/ /.php_cs.cache diff --git a/.php_cs-fixer.dist.php b/.php-cs-fixer.dist.php similarity index 87% rename from .php_cs-fixer.dist.php rename to .php-cs-fixer.dist.php index 433d2f2..814ea2c 100644 --- a/.php_cs-fixer.dist.php +++ b/.php-cs-fixer.dist.php @@ -4,7 +4,7 @@ // SPDX-FileCopyrightText: Mikhailo Matiyenko-Kupriyanov // SPDX-License-Identifier: AGPL-3.0-or-later -require_once './vendor/autoload.php'; +require_once './vendor-bin/cs-fixer/vendor/autoload.php'; use Nextcloud\CodingStandard\Config; diff --git a/.reuse/dep5 b/.reuse/dep5 index 7ca4733..bb0ee02 100644 --- a/.reuse/dep5 +++ b/.reuse/dep5 @@ -1,12 +1,16 @@ Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ -Upstream-Name: ENC Analytics +Upstream-Name: HiDrive Next Analytics Upstream-Contact: Mikhailo Matiyenko-Kupriyanov Source: https://github.com/nextcloud/profiler -Files: package-lock.json package.json composer.json composer.lock lib/*.php lib/**/*.php appinfo/* js/*.js README.md +Files: package-lock.json package.json composer.json composer.lock lib/**/* lib/**/ appinfo/* js/* test/**/* README.md Copyright: Mikhailo Matiyenko-Kupriyanov License: AGPL-3.0-or-later Files: l10n/*.js l10n/*.json Copyright: Nextcloud translators License: AGPL-3.0-or-later + +Files: vendor-bin/*/composer.json vendor-bin/*/composer.lock +Copyright: 2024 STRATO AG +License: AGPL-3.0-or-later diff --git a/README.md b/README.md index f2efe03..bffb3e4 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# ENC Analytics +# HiDrive Next Analytics Place this app in **nextcloud/apps/** App folder should be "googleanalytics" diff --git a/appinfo/routes.php b/appinfo/routes.php index ddb3d40..646d36f 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -2,7 +2,7 @@ declare(strict_types=1); return [ - 'routes' => [ - ['name' => 'JavaScript#tracking', 'url' => '/js/tracking', 'verb' => 'GET'] - ] + 'routes' => [ + ['name' => 'JavaScript#tracking', 'url' => '/js/tracking', 'verb' => 'GET'] + ] ]; diff --git a/composer.json b/composer.json index 3b97c50..4902d4d 100644 --- a/composer.json +++ b/composer.json @@ -9,15 +9,22 @@ } ], "require-dev": { + "bamarni/composer-bin-plugin": "^1.4", "phpunit/phpunit": "^9", "sabre/dav": "^4.1", "sabre/xml": "^2.2", "symfony/event-dispatcher": "^5.3.11", - "nextcloud/ocp": "v29.0.1", + "nextcloud/ocp": "^v30.0.4", "psalm/phar": "^4.10", - "nextcloud/coding-standard": "^1.0" + "nextcloud/coding-standard": "^1.3.2" }, "scripts": { + "post-install-cmd": [ + "@composer bin all install --ansi" + ], + "post-update-cmd": [ + "@composer bin all update --ansi" + ], "lint": "find . -name \\*.php -not -path './vendor/*' -print0 | xargs -0 -n1 php -l", "cs:check": "php-cs-fixer fix --dry-run --diff .", "cs:fix": "php-cs-fixer fix .", @@ -25,14 +32,26 @@ "psalm:update-baseline": "psalm.phar --threads=1 --update-baseline", "psalm:update-baseline:force": "psalm.phar --threads=1 --update-baseline --set-baseline=tests/psalm-baseline.xml", "psalm:clear": "psalm.phar --clear-cache && psalm --clear-global-cache", - "psalm:fix": "psalm.phar --alter --issues=InvalidReturnType,InvalidNullableReturnType,MissingParamType,InvalidFalsableReturnType" + "psalm:fix": "psalm.phar --alter --issues=InvalidReturnType,InvalidNullableReturnType,MissingParamType,InvalidFalsableReturnType", + "test": "phpunit", + "test:unit": "phpunit tests -c tests/phpunit.xml --colors=always --fail-on-warning --fail-on-risky", + "test:unit:coverage": "export XDEBUG_MODE=coverage && phpunit --configuration tests/phpunit.xml --coverage-html coverage", + "test:unit:integration": "phpunit tests -c tests/phpunit.integration.xml --colors=always --fail-on-warning --fail-on-risky", + "test:unit:integration:coverage": "export XDEBUG_MODE=coverage && phpunit --configuration tests/phpunit.integration.xml --coverage-html coverage" }, "config": { "allow-plugins": { - "composer/package-versions-deprecated": true + "composer/package-versions-deprecated": true, + "bamarni/composer-bin-plugin": true }, "platform": { "php": "8.1" } + }, + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } } } diff --git a/composer.lock b/composer.lock index f88e53e..fc0885c 100644 --- a/composer.lock +++ b/composer.lock @@ -4,9 +4,66 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "072bc933995f431206aa3ece8e0539c4", + "content-hash": "d6d253dd1e24ff4dbcbaa7452945060a", "packages": [], "packages-dev": [ + { + "name": "bamarni/composer-bin-plugin", + "version": "1.8.2", + "source": { + "type": "git", + "url": "https://github.com/bamarni/composer-bin-plugin.git", + "reference": "92fd7b1e6e9cdae19b0d57369d8ad31a37b6a880" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bamarni/composer-bin-plugin/zipball/92fd7b1e6e9cdae19b0d57369d8ad31a37b6a880", + "reference": "92fd7b1e6e9cdae19b0d57369d8ad31a37b6a880", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.0", + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "composer/composer": "^2.0", + "ext-json": "*", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^8.5 || ^9.5", + "symfony/console": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", + "symfony/finder": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", + "symfony/process": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Bamarni\\Composer\\Bin\\BamarniBinPlugin" + }, + "autoload": { + "psr-4": { + "Bamarni\\Composer\\Bin\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "No conflicts for your bin dependencies", + "keywords": [ + "composer", + "conflict", + "dependency", + "executable", + "isolation", + "tool" + ], + "support": { + "issues": "https://github.com/bamarni/composer-bin-plugin/issues", + "source": "https://github.com/bamarni/composer-bin-plugin/tree/1.8.2" + }, + "time": "2022-10-31T08:38:03+00:00" + }, { "name": "doctrine/instantiator", "version": "2.0.0", @@ -77,18 +134,64 @@ ], "time": "2022-12-30T00:23:10+00:00" }, + { + "name": "kubawerlos/php-cs-fixer-custom-fixers", + "version": "v3.22.0", + "source": { + "type": "git", + "url": "https://github.com/kubawerlos/php-cs-fixer-custom-fixers.git", + "reference": "8701394f0c7cd450ac4fa577d24589122c1d5d5e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/kubawerlos/php-cs-fixer-custom-fixers/zipball/8701394f0c7cd450ac4fa577d24589122c1d5d5e", + "reference": "8701394f0c7cd450ac4fa577d24589122c1d5d5e", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "ext-tokenizer": "*", + "friendsofphp/php-cs-fixer": "^3.61.1", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.6.4 || ^10.5.29" + }, + "type": "library", + "autoload": { + "psr-4": { + "PhpCsFixerCustomFixers\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kuba Werłos", + "email": "werlos@gmail.com" + } + ], + "description": "A set of custom fixers for PHP CS Fixer", + "support": { + "issues": "https://github.com/kubawerlos/php-cs-fixer-custom-fixers/issues", + "source": "https://github.com/kubawerlos/php-cs-fixer-custom-fixers/tree/v3.22.0" + }, + "time": "2024-08-16T20:44:35+00:00" + }, { "name": "myclabs/deep-copy", - "version": "1.11.1", + "version": "1.12.1", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" + "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845", + "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845", "shasum": "" }, "require": { @@ -96,11 +199,12 @@ }, "conflict": { "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3,<3.2.2" + "doctrine/common": "<2.13.3 || >=3 <3.2.2" }, "require-dev": { "doctrine/collections": "^1.6.8", "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" }, "type": "library", @@ -126,7 +230,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1" }, "funding": [ { @@ -134,23 +238,24 @@ "type": "tidelift" } ], - "time": "2023-03-08T13:26:56+00:00" + "time": "2024-11-08T17:47:46+00:00" }, { "name": "nextcloud/coding-standard", - "version": "v1.2.1", + "version": "v1.3.2", "source": { "type": "git", "url": "https://github.com/nextcloud/coding-standard.git", - "reference": "cf5f18d989ec62fb4cdc7fc92a36baf34b3d829e" + "reference": "9c719c4747fa26efc12f2e8b21c14a9a75c6ba6d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nextcloud/coding-standard/zipball/cf5f18d989ec62fb4cdc7fc92a36baf34b3d829e", - "reference": "cf5f18d989ec62fb4cdc7fc92a36baf34b3d829e", + "url": "https://api.github.com/repos/nextcloud/coding-standard/zipball/9c719c4747fa26efc12f2e8b21c14a9a75c6ba6d", + "reference": "9c719c4747fa26efc12f2e8b21c14a9a75c6ba6d", "shasum": "" }, "require": { + "kubawerlos/php-cs-fixer-custom-fixers": "^3.22", "php": "^7.3|^8.0", "php-cs-fixer/shim": "^3.17" }, @@ -173,22 +278,22 @@ "description": "Nextcloud coding standards for the php cs fixer", "support": { "issues": "https://github.com/nextcloud/coding-standard/issues", - "source": "https://github.com/nextcloud/coding-standard/tree/v1.2.1" + "source": "https://github.com/nextcloud/coding-standard/tree/v1.3.2" }, - "time": "2024-02-01T14:54:37+00:00" + "time": "2024-10-14T16:49:05+00:00" }, { "name": "nextcloud/ocp", - "version": "v29.0.1", + "version": "v30.0.4", "source": { "type": "git", "url": "https://github.com/nextcloud-deps/ocp.git", - "reference": "dec26e2d00da921341ec04aa97f7eb7cf766a81d" + "reference": "6f98dac2ddd6c42e605bc453e5328c0a61f75b8d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nextcloud-deps/ocp/zipball/dec26e2d00da921341ec04aa97f7eb7cf766a81d", - "reference": "dec26e2d00da921341ec04aa97f7eb7cf766a81d", + "url": "https://api.github.com/repos/nextcloud-deps/ocp/zipball/6f98dac2ddd6c42e605bc453e5328c0a61f75b8d", + "reference": "6f98dac2ddd6c42e605bc453e5328c0a61f75b8d", "shasum": "" }, "require": { @@ -196,12 +301,12 @@ "psr/clock": "^1.0", "psr/container": "^2.0.2", "psr/event-dispatcher": "^1.0", - "psr/log": "^1.1.4" + "psr/log": "^2.0.0" }, "type": "library", "extra": { "branch-alias": { - "dev-stable29": "29.0.0-dev" + "dev-stable30": "30.0.0-dev" } }, "notification-url": "https://packagist.org/downloads/", @@ -217,22 +322,22 @@ "description": "Composer package containing Nextcloud's public API (classes, interfaces)", "support": { "issues": "https://github.com/nextcloud-deps/ocp/issues", - "source": "https://github.com/nextcloud-deps/ocp/tree/v29.0.1" + "source": "https://github.com/nextcloud-deps/ocp/tree/v30.0.4" }, - "time": "2024-05-22T00:34:34+00:00" + "time": "2024-11-29T00:46:59+00:00" }, { "name": "nikic/php-parser", - "version": "v5.0.2", + "version": "v5.3.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13" + "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/139676794dc1e9231bf7bcd123cfc0c99182cb13", - "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/8eea230464783aa9671db8eea6f8c6ac5285794b", + "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b", "shasum": "" }, "require": { @@ -243,7 +348,7 @@ }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + "phpunit/phpunit": "^9.0" }, "bin": [ "bin/php-parse" @@ -275,9 +380,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.0.2" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.3.1" }, - "time": "2024-03-05T20:51:40+00:00" + "time": "2024-10-08T18:51:32+00:00" }, { "name": "phar-io/manifest", @@ -399,16 +504,16 @@ }, { "name": "php-cs-fixer/shim", - "version": "v3.58.1", + "version": "v3.65.0", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/shim.git", - "reference": "a6af3df8516033b450a220003c673b9393d68f55" + "reference": "4983ec79b9dee926695ac324ea6e8d291935525d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/shim/zipball/a6af3df8516033b450a220003c673b9393d68f55", - "reference": "a6af3df8516033b450a220003c673b9393d68f55", + "url": "https://api.github.com/repos/PHP-CS-Fixer/shim/zipball/4983ec79b9dee926695ac324ea6e8d291935525d", + "reference": "4983ec79b9dee926695ac324ea6e8d291935525d", "shasum": "" }, "require": { @@ -445,41 +550,41 @@ "description": "A tool to automatically fix PHP code style", "support": { "issues": "https://github.com/PHP-CS-Fixer/shim/issues", - "source": "https://github.com/PHP-CS-Fixer/shim/tree/v3.58.1" + "source": "https://github.com/PHP-CS-Fixer/shim/tree/v3.65.0" }, - "time": "2024-05-29T16:39:49+00:00" + "time": "2024-11-25T00:39:41+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.31", + "version": "9.2.32", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965" + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/48c34b5d8d983006bd2adc2d0de92963b9155965", - "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/85402a822d1ecf1db1096959413d35e1c37cf1a5", + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.18 || ^5.0", + "nikic/php-parser": "^4.19.1 || ^5.1.0", "php": ">=7.3", - "phpunit/php-file-iterator": "^3.0.3", - "phpunit/php-text-template": "^2.0.2", - "sebastian/code-unit-reverse-lookup": "^2.0.2", - "sebastian/complexity": "^2.0", - "sebastian/environment": "^5.1.2", - "sebastian/lines-of-code": "^1.0.3", - "sebastian/version": "^3.0.1", - "theseer/tokenizer": "^1.2.0" + "phpunit/php-file-iterator": "^3.0.6", + "phpunit/php-text-template": "^2.0.4", + "sebastian/code-unit-reverse-lookup": "^2.0.3", + "sebastian/complexity": "^2.0.3", + "sebastian/environment": "^5.1.5", + "sebastian/lines-of-code": "^1.0.4", + "sebastian/version": "^3.0.2", + "theseer/tokenizer": "^1.2.3" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^9.6" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -488,7 +593,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "9.2-dev" + "dev-main": "9.2.x-dev" } }, "autoload": { @@ -517,7 +622,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.31" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.32" }, "funding": [ { @@ -525,7 +630,7 @@ "type": "github" } ], - "time": "2024-03-02T06:37:42+00:00" + "time": "2024-08-22T04:23:01+00:00" }, { "name": "phpunit/php-file-iterator", @@ -770,45 +875,45 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.19", + "version": "9.6.22", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "a1a54a473501ef4cdeaae4e06891674114d79db8" + "reference": "f80235cb4d3caa59ae09be3adf1ded27521d1a9c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a1a54a473501ef4cdeaae4e06891674114d79db8", - "reference": "a1a54a473501ef4cdeaae4e06891674114d79db8", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f80235cb4d3caa59ae09be3adf1ded27521d1a9c", + "reference": "f80235cb4d3caa59ae09be3adf1ded27521d1a9c", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.3.1 || ^2", + "doctrine/instantiator": "^1.5.0 || ^2", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.10.1", - "phar-io/manifest": "^2.0.3", - "phar-io/version": "^3.0.2", + "myclabs/deep-copy": "^1.12.1", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", "php": ">=7.3", - "phpunit/php-code-coverage": "^9.2.28", - "phpunit/php-file-iterator": "^3.0.5", + "phpunit/php-code-coverage": "^9.2.32", + "phpunit/php-file-iterator": "^3.0.6", "phpunit/php-invoker": "^3.1.1", - "phpunit/php-text-template": "^2.0.3", - "phpunit/php-timer": "^5.0.2", - "sebastian/cli-parser": "^1.0.1", - "sebastian/code-unit": "^1.0.6", + "phpunit/php-text-template": "^2.0.4", + "phpunit/php-timer": "^5.0.3", + "sebastian/cli-parser": "^1.0.2", + "sebastian/code-unit": "^1.0.8", "sebastian/comparator": "^4.0.8", - "sebastian/diff": "^4.0.3", - "sebastian/environment": "^5.1.3", - "sebastian/exporter": "^4.0.5", - "sebastian/global-state": "^5.0.1", - "sebastian/object-enumerator": "^4.0.3", - "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^3.2", + "sebastian/diff": "^4.0.6", + "sebastian/environment": "^5.1.5", + "sebastian/exporter": "^4.0.6", + "sebastian/global-state": "^5.0.7", + "sebastian/object-enumerator": "^4.0.4", + "sebastian/resource-operations": "^3.0.4", + "sebastian/type": "^3.2.1", "sebastian/version": "^3.0.2" }, "suggest": { @@ -853,7 +958,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.19" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.22" }, "funding": [ { @@ -869,7 +974,7 @@ "type": "tidelift" } ], - "time": "2024-04-05T04:35:58+00:00" + "time": "2024-12-05T13:48:26+00:00" }, { "name": "psalm/phar", @@ -1059,30 +1164,30 @@ }, { "name": "psr/log", - "version": "1.1.4", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376", + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=8.0.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { "psr-4": { - "Psr\\Log\\": "Psr/Log/" + "Psr\\Log\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1103,22 +1208,22 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/1.1.4" + "source": "https://github.com/php-fig/log/tree/2.0.0" }, - "time": "2021-05-03T11:20:27+00:00" + "time": "2021-07-14T16:41:46+00:00" }, { "name": "sabre/dav", - "version": "4.6.0", + "version": "4.7.0", "source": { "type": "git", "url": "https://github.com/sabre-io/dav.git", - "reference": "554145304b4a026477d130928d16e626939b0b2a" + "reference": "074373bcd689a30bcf5aaa6bbb20a3395964ce7a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sabre-io/dav/zipball/554145304b4a026477d130928d16e626939b0b2a", - "reference": "554145304b4a026477d130928d16e626939b0b2a", + "url": "https://api.github.com/repos/sabre-io/dav/zipball/074373bcd689a30bcf5aaa6bbb20a3395964ce7a", + "reference": "074373bcd689a30bcf5aaa6bbb20a3395964ce7a", "shasum": "" }, "require": { @@ -1188,29 +1293,29 @@ "issues": "https://github.com/sabre-io/dav/issues", "source": "https://github.com/fruux/sabre-dav" }, - "time": "2023-12-11T13:01:23+00:00" + "time": "2024-10-29T11:46:02+00:00" }, { "name": "sabre/event", - "version": "5.1.4", + "version": "5.1.7", "source": { "type": "git", "url": "https://github.com/sabre-io/event.git", - "reference": "d7da22897125d34d7eddf7977758191c06a74497" + "reference": "86d57e305c272898ba3c28e9bd3d65d5464587c2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sabre-io/event/zipball/d7da22897125d34d7eddf7977758191c06a74497", - "reference": "d7da22897125d34d7eddf7977758191c06a74497", + "url": "https://api.github.com/repos/sabre-io/event/zipball/86d57e305c272898ba3c28e9bd3d65d5464587c2", + "reference": "86d57e305c272898ba3c28e9bd3d65d5464587c2", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "~2.17.1", + "friendsofphp/php-cs-fixer": "~2.17.1||^3.63", "phpstan/phpstan": "^0.12", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.0" + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6" }, "type": "library", "autoload": { @@ -1254,20 +1359,20 @@ "issues": "https://github.com/sabre-io/event/issues", "source": "https://github.com/fruux/sabre-event" }, - "time": "2021-11-04T06:51:17+00:00" + "time": "2024-08-27T11:23:05+00:00" }, { "name": "sabre/http", - "version": "5.1.10", + "version": "5.1.12", "source": { "type": "git", "url": "https://github.com/sabre-io/http.git", - "reference": "f9f3d1fba8916fa2f4ec25636c4fedc26cb94e02" + "reference": "dedff73f3995578bc942fa4c8484190cac14f139" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sabre-io/http/zipball/f9f3d1fba8916fa2f4ec25636c4fedc26cb94e02", - "reference": "f9f3d1fba8916fa2f4ec25636c4fedc26cb94e02", + "url": "https://api.github.com/repos/sabre-io/http/zipball/dedff73f3995578bc942fa4c8484190cac14f139", + "reference": "dedff73f3995578bc942fa4c8484190cac14f139", "shasum": "" }, "require": { @@ -1279,9 +1384,9 @@ "sabre/uri": "^2.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "~2.17.1", + "friendsofphp/php-cs-fixer": "~2.17.1||^3.63", "phpstan/phpstan": "^0.12", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.0" + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6" }, "suggest": { "ext-curl": " to make http requests with the Client class" @@ -1317,31 +1422,31 @@ "issues": "https://github.com/sabre-io/http/issues", "source": "https://github.com/fruux/sabre-http" }, - "time": "2023-08-18T01:55:28+00:00" + "time": "2024-08-27T16:07:41+00:00" }, { "name": "sabre/uri", - "version": "2.3.3", + "version": "2.3.4", "source": { "type": "git", "url": "https://github.com/sabre-io/uri.git", - "reference": "7e0e7dfd0b7e14346a27eabd66e843a6e7f1812b" + "reference": "b76524c22de90d80ca73143680a8e77b1266c291" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sabre-io/uri/zipball/7e0e7dfd0b7e14346a27eabd66e843a6e7f1812b", - "reference": "7e0e7dfd0b7e14346a27eabd66e843a6e7f1812b", + "url": "https://api.github.com/repos/sabre-io/uri/zipball/b76524c22de90d80ca73143680a8e77b1266c291", + "reference": "b76524c22de90d80ca73143680a8e77b1266c291", "shasum": "" }, "require": { "php": "^7.4 || ^8.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.17", - "phpstan/extension-installer": "^1.3", - "phpstan/phpstan": "^1.10", - "phpstan/phpstan-phpunit": "^1.3", - "phpstan/phpstan-strict-rules": "^1.5", + "friendsofphp/php-cs-fixer": "^3.63", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^1.12", + "phpstan/phpstan-phpunit": "^1.4", + "phpstan/phpstan-strict-rules": "^1.6", "phpunit/phpunit": "^9.6" }, "type": "library", @@ -1377,20 +1482,20 @@ "issues": "https://github.com/sabre-io/uri/issues", "source": "https://github.com/fruux/sabre-uri" }, - "time": "2023-06-09T06:54:04+00:00" + "time": "2024-08-27T12:18:16+00:00" }, { "name": "sabre/vobject", - "version": "4.5.4", + "version": "4.5.6", "source": { "type": "git", "url": "https://github.com/sabre-io/vobject.git", - "reference": "a6d53a3e5bec85ed3dd78868b7de0f5b4e12f772" + "reference": "900266bb3bd448a9f7f41f82344ad0aba237cb27" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sabre-io/vobject/zipball/a6d53a3e5bec85ed3dd78868b7de0f5b4e12f772", - "reference": "a6d53a3e5bec85ed3dd78868b7de0f5b4e12f772", + "url": "https://api.github.com/repos/sabre-io/vobject/zipball/900266bb3bd448a9f7f41f82344ad0aba237cb27", + "reference": "900266bb3bd448a9f7f41f82344ad0aba237cb27", "shasum": "" }, "require": { @@ -1400,9 +1505,9 @@ }, "require-dev": { "friendsofphp/php-cs-fixer": "~2.17.1", - "phpstan/phpstan": "^0.12", + "phpstan/phpstan": "^0.12 || ^1.11", "phpunit/php-invoker": "^2.0 || ^3.1", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.0" + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6" }, "suggest": { "hoa/bench": "If you would like to run the benchmark scripts" @@ -1481,20 +1586,20 @@ "issues": "https://github.com/sabre-io/vobject/issues", "source": "https://github.com/fruux/sabre-vobject" }, - "time": "2023-11-09T12:54:37+00:00" + "time": "2024-10-14T11:53:54+00:00" }, { "name": "sabre/xml", - "version": "2.2.7", + "version": "2.2.11", "source": { "type": "git", "url": "https://github.com/sabre-io/xml.git", - "reference": "f1d53d55976bbd4cf3e640dda6ebc31120c71a4e" + "reference": "01a7927842abf3e10df3d9c2d9b0cc9d813a3fcc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sabre-io/xml/zipball/f1d53d55976bbd4cf3e640dda6ebc31120c71a4e", - "reference": "f1d53d55976bbd4cf3e640dda6ebc31120c71a4e", + "url": "https://api.github.com/repos/sabre-io/xml/zipball/01a7927842abf3e10df3d9c2d9b0cc9d813a3fcc", + "reference": "01a7927842abf3e10df3d9c2d9b0cc9d813a3fcc", "shasum": "" }, "require": { @@ -1506,9 +1611,9 @@ "sabre/uri": ">=1.0,<3.0.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "~2.17.1", + "friendsofphp/php-cs-fixer": "~2.17.1||3.63.2", "phpstan/phpstan": "^0.12", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.0" + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6" }, "type": "library", "autoload": { @@ -1550,7 +1655,7 @@ "issues": "https://github.com/sabre-io/xml/issues", "source": "https://github.com/fruux/sabre-xml" }, - "time": "2024-04-18T10:15:43+00:00" + "time": "2024-09-06T07:37:46+00:00" }, { "name": "sebastian/cli-parser", @@ -2517,16 +2622,16 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v3.5.0", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" + "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", - "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", "shasum": "" }, "require": { @@ -2564,7 +2669,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1" }, "funding": [ { @@ -2580,20 +2685,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:32:20+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v5.4.39", + "version": "v5.4.45", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "d40fae9fd85c762b6ba378152fdd1157a85d7e4f" + "reference": "72982eb416f61003e9bb6e91f8b3213600dcf9e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d40fae9fd85c762b6ba378152fdd1157a85d7e4f", - "reference": "d40fae9fd85c762b6ba378152fdd1157a85d7e4f", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/72982eb416f61003e9bb6e91f8b3213600dcf9e9", + "reference": "72982eb416f61003e9bb6e91f8b3213600dcf9e9", "shasum": "" }, "require": { @@ -2649,7 +2754,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.39" + "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.45" }, "funding": [ { @@ -2665,20 +2770,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T08:26:06+00:00" + "time": "2024-09-25T14:11:13+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.5.0", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50" + "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50", - "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7642f5e970b672283b7823222ae8ef8bbc160b9f", + "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f", "shasum": "" }, "require": { @@ -2725,7 +2830,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.1" }, "funding": [ { @@ -2741,30 +2846,30 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:32:20+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.29.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", - "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -2805,7 +2910,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" }, "funding": [ { @@ -2821,7 +2926,7 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "theseer/tokenizer", @@ -2876,11 +2981,11 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": {}, "prefer-stable": false, "prefer-lowest": false, - "platform": [], - "platform-dev": [], + "platform": {}, + "platform-dev": {}, "platform-overrides": { "php": "8.1" }, diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php index ac0d46b..671056f 100644 --- a/lib/AppInfo/Application.php +++ b/lib/AppInfo/Application.php @@ -1,11 +1,17 @@ injectFn([$this, 'addTrackingScript']); - $context->injectFn([$this, 'addContentSecurityPolicy']); - } - - public function addTrackingScript(IURLGenerator $urlGenerator, ContentSecurityPolicyNonceManager $nonceManager): void - { - Util::addHeader( - 'script', - [ - 'src' => $urlGenerator->linkToRoute('googleanalytics.JavaScript.tracking'), - 'nonce' => $nonceManager->getNonce(), - ], - '' - ); - } - - /** - * Add the Content Security Policy for the Google Analytics tracking according - * to https://developers.google.com/tag-platform/security/guides/csp - * - * @param ContentSecurityPolicyManager $policyManager - * @return void - */ - public function addContentSecurityPolicy(ContentSecurityPolicyManager $policyManager): void - { - $policy = new ContentSecurityPolicy(); - - $policy->addAllowedScriptDomain("*.googletagmanager.com"); - $policy->addAllowedImageDomain("*.googletagmanager.com"); - $policy->addAllowedConnectDomain("*.googletagmanager.com"); - - $policy->addAllowedScriptDomain("tagmanager.google.com"); - $policy->addAllowedImageDomain("tagmanager.google.com"); - $policy->addAllowedConnectDomain("tagmanager.google.com"); - - $policy->addAllowedScriptDomain("*.google-analytics.com"); - $policy->addAllowedImageDomain("*.google-analytics.com"); - $policy->addAllowedConnectDomain("*.google-analytics.com"); - - // additional SCP for GTM preview mode - $policy->addAllowedStyleDomain("https://www.googletagmanager.com"); - $policy->addAllowedStyleDomain("https://fonts.googleapis.com"); - - $policy->addAllowedFontDomain("https://fonts.gstatic.com"); - - $policy->addAllowedImageDomain("https://fonts.gstatic.com"); - $policy->addAllowedImageDomain("https://fonts.googleapis.com"); - - $policyManager->addDefaultPolicy($policy); - } +use Psr\Container\ContainerInterface; + +class Application extends App implements IBootstrap { + public const APP_ID = 'googleanalytics'; + + public function __construct() { + parent::__construct(self::APP_ID); + } + + public function register(IRegistrationContext $context): void { + $context->registerService(IConsentService::class, function (ContainerInterface $c): IonosConsentService { + return new IonosConsentService(); + }); + } + + public function boot(IBootContext $context): void { + $context->injectFn([$this, 'addTrackingScript']); + $context->injectFn([$this, 'addContentSecurityPolicy']); + } + + public function addTrackingScript(IURLGenerator $urlGenerator, ContentSecurityPolicyNonceManager $nonceManager): void { + Util::addHeader( + 'script', + [ + 'src' => $urlGenerator->linkToRoute('googleanalytics.JavaScript.tracking'), + 'nonce' => $nonceManager->getNonce(), + ], + '' + ); + } + + /** + * Add the Content Security Policy for the Google Analytics tracking according + * to https://developers.google.com/tag-platform/security/guides/csp + * + * @param ContentSecurityPolicyManager $policyManager + * @return void + */ + public function addContentSecurityPolicy(ContentSecurityPolicyManager $policyManager): void { + $policy = new ContentSecurityPolicy(); + + $policy->addAllowedScriptDomain('*.googletagmanager.com'); + $policy->addAllowedImageDomain('*.googletagmanager.com'); + $policy->addAllowedConnectDomain('*.googletagmanager.com'); + + $policy->addAllowedScriptDomain('tagmanager.google.com'); + $policy->addAllowedImageDomain('tagmanager.google.com'); + $policy->addAllowedConnectDomain('tagmanager.google.com'); + + $policy->addAllowedScriptDomain('*.google-analytics.com'); + $policy->addAllowedImageDomain('*.google-analytics.com'); + $policy->addAllowedConnectDomain('*.google-analytics.com'); + + // additional SCP for GTM preview mode + $policy->addAllowedStyleDomain('https://www.googletagmanager.com'); + $policy->addAllowedStyleDomain('https://fonts.googleapis.com'); + + $policy->addAllowedFontDomain('https://fonts.gstatic.com'); + + $policy->addAllowedImageDomain('https://fonts.gstatic.com'); + $policy->addAllowedImageDomain('https://fonts.googleapis.com'); + + $policyManager->addDefaultPolicy($policy); + } } diff --git a/lib/Config.php b/lib/Config.php index af6fb1b..3b94b73 100644 --- a/lib/Config.php +++ b/lib/Config.php @@ -1,20 +1,24 @@ appName = $appName; - $this->config = $config; - } +class Config { + public function __construct( + protected string $appName, + protected IConfig $config, + ) { + } - public function getTrackingKey(): ?string - { - $value = $this->config->getSystemValueString('googleanalytics_tracking_key', ''); - return (empty($value)) ? null : $value; - } + public function getTrackingKey(): ?string { + $value = $this->config->getSystemValueString('googleanalytics_tracking_key'); + return (empty($value)) ? null : $value; + } } diff --git a/lib/Controller/JavaScriptController.php b/lib/Controller/JavaScriptController.php index 0c41986..17aea09 100644 --- a/lib/Controller/JavaScriptController.php +++ b/lib/Controller/JavaScriptController.php @@ -1,55 +1,72 @@ config = $config; - } - - /** - * @NoAdminRequired - * @NoCSRFRequired - * @PublicPage - * - * @return TextPlainResponse|DataDownloadResponse - */ - public function tracking(): TextPlainResponse|DataDownloadResponse - { - $gtmId = $this->config->getTrackingKey(); - - if (!isset($gtmId)) { - $response = new TextPlainResponse('// tracking disabled'); - $response->addHeader('Content-Type', 'text/javascript'); - return $response; - } - - $script = file_get_contents(__DIR__ . '/../../js/track.js'); - $script = str_replace('%GTM_ID%', $gtmId, $script); - - return new DataDownloadResponse($script, 'gtm.js', 'text/javascript'); - } +class JavaScriptController extends Controller { + /** + * constructor of the controller + * + * @param string $appName + * @param IRequest $request + * @param Config $config + * @param IConsentService $consentService + */ + public function __construct( + $appName, + IRequest $request, + protected Config $config, + protected IConsentService $consentService, + ) { + parent::__construct($appName, $request); + } + + /** + * @return TextPlainResponse|DataDownloadResponse + */ + #[NoAdminRequired] + #[NoCSRFRequired] + #[PublicPage] + public function tracking(): TextPlainResponse|DataDownloadResponse { + $gtmId = $this->config->getTrackingKey(); + + if (!isset($gtmId)) { + $response = new TextPlainResponse('// tracking disabled'); + $response->addHeader('Content-Type', 'text/javascript'); + return $response; + } + + try { + $consent = $this->consentService->getConsent($_COOKIE); + } catch (Exception) { + $response = new TextPlainResponse('// tracking disabled: no consent data'); + $response->addHeader('Content-Type', 'text/javascript'); + return $response; + } + + if (!$consent->hasStatisticsConsent()) { + $response = new TextPlainResponse('// tracking disabled: no statistics consent'); + $response->addHeader('Content-Type', 'text/javascript'); + return $response; + } + + $script = file_get_contents(__DIR__ . '/../../js/track.js'); + $script = str_replace('%GTM_ID%', $gtmId, $script); + + return new DataDownloadResponse($script, 'gtm.js', 'text/javascript'); + } } diff --git a/lib/Migration/Version000000Date20181013124731.php b/lib/Migration/Version000000Date20181013124731.php index 94305cc..0633117 100644 --- a/lib/Migration/Version000000Date20181013124731.php +++ b/lib/Migration/Version000000Date20181013124731.php @@ -1,5 +1,9 @@ technical; + } + + public function hasStatisticsConsent(): bool { + return $this->statistics; + } + + public function hasMarketingConsent(): bool { + return $this->marketing; + } + + public function hasPartnershipsConsent(): bool { + return $this->partnerships; + } +} diff --git a/lib/Service/Consent/ConsentCategory.php b/lib/Service/Consent/ConsentCategory.php new file mode 100644 index 0000000..b898aaf --- /dev/null +++ b/lib/Service/Consent/ConsentCategory.php @@ -0,0 +1,16 @@ +value] ?? false, + $data[ConsentCategory::STATISTICS->value] ?? false, + $data[ConsentCategory::MARKETING->value] ?? false, + $data[ConsentCategory::PARTNERSHIPS->value] ?? false + ); + } +} diff --git a/tests/Integration/GoogleAnalyticsTest.php b/tests/Integration/GoogleAnalyticsTest.php index af76c20..7092bb1 100644 --- a/tests/Integration/GoogleAnalyticsTest.php +++ b/tests/Integration/GoogleAnalyticsTest.php @@ -17,54 +17,77 @@ use Psr\Container\ContainerExceptionInterface; use Psr\Container\NotFoundExceptionInterface; -class GoogleAnalyticsTest extends TestCase -{ - private JavaScriptController $controller; - - private IConfig $config; - - /** - * @throws ContainerExceptionInterface - * @throws HintException - * @throws NotFoundExceptionInterface - */ - public function setUp(): void - { - $this->config = \OC::$server->getConfig(); - $this->config->setSystemValue('googleanalytics_tracking_key', null); - - $app = new App('googleanalytics'); - $container = $app->getContainer(); - - $this->controller = $container->get(JavaScriptController::class); - } - - public function tearDown(): void - { - $this->config->setSystemValue('googleanalytics_tracking_key', null); - } - - /** - * @throws Exception - */ - public function testTrackingReturnsDisabledResponseWhenNoKey(): void - { - $response = $this->controller->tracking(); - - $this->assertInstanceOf(TextPlainResponse::class, $response); - $this->assertEquals('// tracking disabled', $response->render()); - } - - /** - * @throws Exception - */ - public function testTrackingReturnsScriptResponseWhenKeyExists(): void - { - $this->config->setSystemValue('googleanalytics_tracking_key', 'UA-123456-1'); - - $response = $this->controller->tracking(); - - $this->assertInstanceOf(DataDownloadResponse::class, $response); - $this->assertStringContainsString('UA-123456-1', $response->render()); - } +/** + * @backupGlobals enabled + */ +class GoogleAnalyticsTest extends TestCase { + private JavaScriptController $controller; + + private IConfig $config; + + /** + * @throws ContainerExceptionInterface + * @throws HintException + * @throws NotFoundExceptionInterface + */ + public function setUp(): void { + $this->config = \OC::$server->getConfig(); + $this->config->setSystemValue('googleanalytics_tracking_key', null); + + $app = new App('googleanalytics'); + $container = $app->getContainer(); + + $this->controller = $container->get(JavaScriptController::class); + } + + private function mockContentServiceState(bool $statistics = false): void { + $cookieValue = base64_encode(json_encode([ + 'technical' => false, + 'statistics' => $statistics, + 'marketing' => false, + 'partnerships' => false, + ])); + + $_COOKIE = ['PRIVACY_CONSENT' => $cookieValue]; + } + + public function tearDown(): void { + $this->config->setSystemValue('googleanalytics_tracking_key', null); + unset($_COOKIE['PRIVACY_CONSENT']); + } + + /** + * @throws Exception + */ + public function testTrackingReturnsDisabledResponseWhenNoKey(): void { + $this->mockContentServiceState(true); + $response = $this->controller->tracking(); + + $this->assertInstanceOf(TextPlainResponse::class, $response); + $this->assertEquals('// tracking disabled', $response->render()); + } + + /** + * @throws Exception + */ + public function testTrackingReturnsDisabledResponseWhenNoConsent(): void { + $this->mockContentServiceState(true); + $response = $this->controller->tracking(); + + $this->assertInstanceOf(TextPlainResponse::class, $response); + $this->assertEquals('// tracking disabled', $response->render()); + } + + /** + * @throws Exception + */ + public function testTrackingReturnsScriptResponseWhenKeyExists(): void { + $this->mockContentServiceState(true); + $this->config->setSystemValue('googleanalytics_tracking_key', 'UA-123456-1'); + + $response = $this->controller->tracking(); + + $this->assertInstanceOf(DataDownloadResponse::class, $response); + $this->assertStringContainsString('UA-123456-1', $response->render()); + } } diff --git a/tests/Unit/AppInfo/ApplicationTest.php b/tests/Unit/AppInfo/ApplicationTest.php index e4f1469..7958411 100644 --- a/tests/Unit/AppInfo/ApplicationTest.php +++ b/tests/Unit/AppInfo/ApplicationTest.php @@ -6,87 +6,107 @@ namespace OCA\NCGoogleAnalytics\Tests\AppInfo; -use PHPUnit\Framework\TestCase; use OC\Security\CSP\ContentSecurityPolicyManager; use OC\Security\CSP\ContentSecurityPolicyNonceManager; use OCA\NCGoogleAnalytics\AppInfo\Application; +use OCA\NCGoogleAnalytics\Service\Consent\IConsentService; +use OCA\NCGoogleAnalytics\Service\Consent\IonosConsentService; use OCP\AppFramework\Bootstrap\IBootContext; +use OCP\AppFramework\Bootstrap\IRegistrationContext; use OCP\AppFramework\Http\ContentSecurityPolicy; use OCP\IURLGenerator; +use PHPUnit\Framework\MockObject\MockObject; +use PHPUnit\Framework\TestCase; -class ApplicationTest extends TestCase -{ - private Application $application; - private $urlGenerator; - private $nonceManager; - private $contentSecurityPolicyManager; - private $context; - - protected function setUp(): void - { - $this->urlGenerator = $this->createMock(IURLGenerator::class); - $this->nonceManager = $this->createMock(ContentSecurityPolicyNonceManager::class); - $this->contentSecurityPolicyManager = $this->createMock(ContentSecurityPolicyManager::class); - $this->context = $this->createMock(IBootContext::class); - $this->application = new Application(); - } - - public function testBoot(): void - { - $this->context->expects($this->exactly(2)) - ->method('injectFn') - ->withConsecutive( - [[$this->application, 'addTrackingScript']], - [[$this->application, 'addContentSecurityPolicy']] - ); - - $this->application->boot($this->context); - } - public function testTrackingScriptAddition(): void - { - $this->urlGenerator->method('linkToRoute')->willReturn('someUrl'); - $this->nonceManager->method('getNonce')->willReturn('someNonce'); - - $this->urlGenerator->expects($this->once()) - ->method('linkToRoute') - ->with('googleanalytics.JavaScript.tracking'); - - $this->nonceManager->expects($this->once()) - ->method('getNonce'); - - // @todo Util::addHeader method call is not tested - - $this->application->addTrackingScript($this->urlGenerator, $this->nonceManager); - } - - public function testContentSecurityPolicyAddition(): void - { - $policy = new ContentSecurityPolicy(); - - $policy->addAllowedScriptDomain("*.googletagmanager.com"); - $policy->addAllowedImageDomain("*.googletagmanager.com"); - $policy->addAllowedConnectDomain("*.googletagmanager.com"); - - $policy->addAllowedScriptDomain("tagmanager.google.com"); - $policy->addAllowedImageDomain("tagmanager.google.com"); - $policy->addAllowedConnectDomain("tagmanager.google.com"); - - $policy->addAllowedScriptDomain("*.google-analytics.com"); - $policy->addAllowedImageDomain("*.google-analytics.com"); - $policy->addAllowedConnectDomain("*.google-analytics.com"); - - $policy->addAllowedStyleDomain("https://www.googletagmanager.com"); - $policy->addAllowedStyleDomain("https://fonts.googleapis.com"); - - $policy->addAllowedFontDomain("https://fonts.gstatic.com"); - - $policy->addAllowedImageDomain("https://fonts.gstatic.com"); - $policy->addAllowedImageDomain("https://fonts.googleapis.com"); - - $this->contentSecurityPolicyManager->expects($this->once()) - ->method('addDefaultPolicy') - ->with($policy); - - $this->application->addContentSecurityPolicy($this->contentSecurityPolicyManager); - } +class ApplicationTest extends TestCase { + private Application $application; + private IURLGenerator|MockObject $urlGenerator; + private ContentSecurityPolicyNonceManager|MockObject $nonceManager; + private ContentSecurityPolicyManager|MockObject $contentSecurityPolicyManager; + private IBootContext|MockObject $context; + private $registrationContext; + + protected function setUp(): void { + $this->urlGenerator = $this->createMock(IURLGenerator::class); + $this->nonceManager = $this->createMock(ContentSecurityPolicyNonceManager::class); + $this->contentSecurityPolicyManager = $this->createMock(ContentSecurityPolicyManager::class); + $this->context = $this->createMock(IBootContext::class); + $this->registrationContext = $this->createMock(IRegistrationContext::class); + $this->application = new Application(); + } + + public function testBoot(): void { + $this->context->expects($this->exactly(2)) + ->method('injectFn') + ->withConsecutive( + [[$this->application, 'addTrackingScript']], + [[$this->application, 'addContentSecurityPolicy']] + ); + + $this->application->boot($this->context); + } + + public function testRegister(): void { + $this->registrationContext->expects($this->exactly(1)) + ->method('registerService') + ->with( + IConsentService::class, + $this->isInstanceOf(\Closure::class), + true + ); + + $this->application->register($this->registrationContext); + } + + public function testConsentServiceRegistration(): void { + $consentService = \OC::$server->getRegisteredAppContainer(Application::APP_ID)->get(IConsentService::class); + + $this->assertInstanceOf(IonosConsentService::class, $consentService, 'FATAL: IonosConsentService is not registered!'); + } + + public function testTrackingScriptAddition(): void { + $this->urlGenerator->method('linkToRoute')->willReturn('someUrl'); + $this->nonceManager->method('getNonce')->willReturn('someNonce'); + + $this->urlGenerator->expects($this->once()) + ->method('linkToRoute') + ->with('googleanalytics.JavaScript.tracking'); + + $this->nonceManager->expects($this->once()) + ->method('getNonce'); + + // @todo Util::addHeader method call is not tested + + $this->application->addTrackingScript($this->urlGenerator, $this->nonceManager); + } + + public function testContentSecurityPolicyAddition(): void { + $policy = new ContentSecurityPolicy(); + + $policy->addAllowedScriptDomain('*.googletagmanager.com'); + $policy->addAllowedImageDomain('*.googletagmanager.com'); + $policy->addAllowedConnectDomain('*.googletagmanager.com'); + + $policy->addAllowedScriptDomain('tagmanager.google.com'); + $policy->addAllowedImageDomain('tagmanager.google.com'); + $policy->addAllowedConnectDomain('tagmanager.google.com'); + + $policy->addAllowedScriptDomain('*.google-analytics.com'); + $policy->addAllowedImageDomain('*.google-analytics.com'); + $policy->addAllowedConnectDomain('*.google-analytics.com'); + + $policy->addAllowedStyleDomain('https://www.googletagmanager.com'); + $policy->addAllowedStyleDomain('https://fonts.googleapis.com'); + + $policy->addAllowedFontDomain('https://fonts.gstatic.com'); + + $policy->addAllowedImageDomain('https://fonts.gstatic.com'); + $policy->addAllowedImageDomain('https://fonts.googleapis.com'); + + $this->contentSecurityPolicyManager->expects($this->once()) + ->method('addDefaultPolicy') + ->with($policy); + + $this->application->addContentSecurityPolicy($this->contentSecurityPolicyManager); + } } diff --git a/tests/Unit/ConfigTest.php b/tests/Unit/ConfigTest.php index 569b993..99be455 100644 --- a/tests/Unit/ConfigTest.php +++ b/tests/Unit/ConfigTest.php @@ -10,34 +10,30 @@ use OCP\IConfig; use PHPUnit\Framework\TestCase; -class ConfigTest extends TestCase -{ - private $config; - private $appName; - private $systemConfig; - - protected function setUp(): void - { - $this->appName = 'googleanalytics'; - $this->systemConfig = $this->createMock(IConfig::class); - $this->config = new Config($this->appName, $this->systemConfig); - } - - public function testTrackingKeyRetrievalWithExistingKey(): void - { - $this->systemConfig->method('getSystemValueString') - ->with('googleanalytics_tracking_key', '') - ->willReturn('UA-123456-1'); - - $this->assertEquals('UA-123456-1', $this->config->getTrackingKey()); - } - - public function testTrackingKeyRetrievalWithNoKey(): void - { - $this->systemConfig->method('getSystemValueString') - ->with('googleanalytics_tracking_key', '') - ->willReturn(''); - - $this->assertNull($this->config->getTrackingKey()); - } +class ConfigTest extends TestCase { + private $config; + private $appName; + private $systemConfig; + + protected function setUp(): void { + $this->appName = 'googleanalytics'; + $this->systemConfig = $this->createMock(IConfig::class); + $this->config = new Config($this->appName, $this->systemConfig); + } + + public function testTrackingKeyRetrievalWithExistingKey(): void { + $this->systemConfig->method('getSystemValueString') + ->with('googleanalytics_tracking_key', '') + ->willReturn('UA-123456-1'); + + $this->assertEquals('UA-123456-1', $this->config->getTrackingKey()); + } + + public function testTrackingKeyRetrievalWithNoKey(): void { + $this->systemConfig->method('getSystemValueString') + ->with('googleanalytics_tracking_key', '') + ->willReturn(''); + + $this->assertNull($this->config->getTrackingKey()); + } } diff --git a/tests/Unit/Controller/JavaScriptControllerTest.php b/tests/Unit/Controller/JavaScriptControllerTest.php index 6e90b04..0cfd2d0 100644 --- a/tests/Unit/Controller/JavaScriptControllerTest.php +++ b/tests/Unit/Controller/JavaScriptControllerTest.php @@ -8,46 +8,134 @@ use OCA\NCGoogleAnalytics\Config; use OCA\NCGoogleAnalytics\Controller\JavaScriptController; +use OCA\NCGoogleAnalytics\Service\Consent\IConsent; +use OCA\NCGoogleAnalytics\Service\Consent\IConsentService; use OCP\AppFramework\Http\DataDownloadResponse; use OCP\AppFramework\Http\TextPlainResponse; use OCP\IRequest; use PHPUnit\Framework\TestCase; -class JavaScriptControllerTest extends TestCase -{ - private $controller; - private $request; - private $config; +/** + * @backupGlobals enabled + */ +class JavaScriptControllerTest extends TestCase { + private $controller; + private $request; + private $config; + private IConsentService $consentServiceMock; - protected function setUp(): void - { - $this->request = $this->createMock(IRequest::class); - $this->config = $this->createMock(Config::class); - $this->controller = new JavaScriptController('NCGoogleAnalytics', $this->request, $this->config); - } + protected function setUp(): void { + $this->request = $this->createMock(IRequest::class); + $this->config = $this->createMock(Config::class); + $this->consentServiceMock = $this->createMock(IConsentService::class); + $this->controller = new JavaScriptController('NCGoogleAnalytics', $this->request, $this->config, $this->consentServiceMock); + } + public function tearDown(): void { + unset($_COOKIE['PRIVACY_CONSENT']); + } - public function testTrackingReturnsDisabledResponseWhenNoKey(): void - { - $this->config->method('getTrackingKey')->willReturn(null); + public function testTrackingReturnsDisabledResponseWhenNoKey(): void { + $this->config->method('getTrackingKey')->willReturn(null); - $response = $this->controller->tracking(); + $response = $this->controller->tracking(); - $this->assertInstanceOf(TextPlainResponse::class, $response); + $this->assertInstanceOf(TextPlainResponse::class, $response); - $this->assertArrayHasKey('Content-Type', $response->getHeaders()); - $this->assertEquals('text/javascript', $response->getHeaders()['Content-Type']); - $this->assertEquals('// tracking disabled', $response->render()); - } + $this->assertArrayHasKey('Content-Type', $response->getHeaders()); + $this->assertEquals('text/javascript', $response->getHeaders()['Content-Type']); + $this->assertEquals('// tracking disabled', $response->render()); + } - public function testTrackingReturnsScriptResponseWhenKeyExists(): void - { - $this->config->method('getTrackingKey')->willReturn('UA-123456-1'); + public function testValidTrackingKeyWithoutValidConsent() { + $this->config->method('getTrackingKey')->willReturn('GTM-XXXXXX'); - $response = $this->controller->tracking(); + $_COOKIE['PRIVACY_CONSENT'] = 'mocked_cookie_value'; - $this->assertInstanceOf(DataDownloadResponse::class, $response); - $this->assertArrayHasKey('Content-Type', $response->getHeaders()); - $this->assertEquals('text/javascript', $response->getHeaders()['Content-Type']); - $this->assertStringContainsString('UA-123456-1', $response->render()); - } + $this->consentServiceMock->expects($this->once()) + ->method('getConsent') + ->with($_COOKIE) + ->willThrowException(new \InvalidArgumentException('mocked exception')); + + $response = $this->controller->tracking(); + + $this->assertInstanceOf(TextPlainResponse::class, $response); + + $this->assertArrayHasKey('Content-Type', $response->getHeaders()); + $this->assertEquals('text/javascript', $response->getHeaders()['Content-Type']); + $this->assertEquals('// tracking disabled: no consent data', $response->render()); + } + + public function testValidTrackingKeyWithoutConsent() { + $this->config->method('getTrackingKey')->willReturn('GTM-XXXXXX'); + + $_COOKIE['PRIVACY_CONSENT'] = 'mocked_cookie_value'; + + $this->consentServiceMock->expects($this->once()) + ->method('getConsent') + ->with($_COOKIE) + ->willThrowException(new \Exception('mocked exception')); + + $response = $this->controller->tracking(); + + $this->assertInstanceOf(TextPlainResponse::class, $response); + + $this->assertArrayHasKey('Content-Type', $response->getHeaders()); + $this->assertEquals('text/javascript', $response->getHeaders()['Content-Type']); + $this->assertEquals('// tracking disabled: no consent data', $response->render()); + } + + public function testTrackingReturnsScriptResponseWithNoConsentAndKeyExists(): void { + $this->config->method('getTrackingKey')->willReturn('UA-123456-1'); + + $_COOKIE['PRIVACY_CONSENT'] = 'mocked_cookie_value'; + + $consentMock = $this->createMock(IConsent::class); + $consentMock->expects($this->once()) + ->method('hasStatisticsConsent') + ->willReturn(false); + + $consentMock->expects($this->never())->method('hasTechnicalConsent'); + $consentMock->expects($this->never())->method('hasMarketingConsent'); + $consentMock->expects($this->never())->method('hasPartnershipsConsent'); + + $this->consentServiceMock->expects($this->once()) + ->method('getConsent') + ->with($_COOKIE) + ->willReturn($consentMock); + + $response = $this->controller->tracking(); + + $this->assertInstanceOf(TextPlainResponse::class, $response); + + $this->assertArrayHasKey('Content-Type', $response->getHeaders()); + $this->assertEquals('text/javascript', $response->getHeaders()['Content-Type']); + $this->assertEquals('// tracking disabled: no statistics consent', $response->render()); + } + + public function testTrackingReturnsScriptResponseWithConsentAndKeyExists(): void { + $this->config->method('getTrackingKey')->willReturn('UA-123456-1'); + + $_COOKIE['PRIVACY_CONSENT'] = 'mocked_cookie_value'; + + $consentMock = $this->createMock(IConsent::class); + $consentMock->expects($this->once()) + ->method('hasStatisticsConsent') + ->willReturn(true); + + $consentMock->expects($this->never())->method('hasTechnicalConsent'); + $consentMock->expects($this->never())->method('hasMarketingConsent'); + $consentMock->expects($this->never())->method('hasPartnershipsConsent'); + + $this->consentServiceMock->expects($this->once()) + ->method('getConsent') + ->with($_COOKIE) + ->willReturn($consentMock); + + $response = $this->controller->tracking(); + + $this->assertInstanceOf(DataDownloadResponse::class, $response); + $this->assertArrayHasKey('Content-Type', $response->getHeaders()); + $this->assertEquals('text/javascript', $response->getHeaders()['Content-Type']); + $this->assertStringContainsString('UA-123456-1', $response->render()); + } } diff --git a/tests/Unit/Service/Consent/IonosConsentServiceTest.php b/tests/Unit/Service/Consent/IonosConsentServiceTest.php new file mode 100644 index 0000000..bade465 --- /dev/null +++ b/tests/Unit/Service/Consent/IonosConsentServiceTest.php @@ -0,0 +1,61 @@ + true, + 'statistics' => false, + 'marketing' => true, + 'partnerships' => false, + ])); + + $cookies = ['PRIVACY_CONSENT' => $cookieValue]; + $consent = (new IonosConsentService())->getConsent($cookies); + + $this->assertInstanceOf(\OCA\NCGoogleAnalytics\Service\Consent\IConsent::class, $consent); + $this->assertTrue($consent->hasTechnicalConsent()); + $this->assertFalse($consent->hasStatisticsConsent()); + $this->assertTrue($consent->hasMarketingConsent()); + $this->assertFalse($consent->hasPartnershipsConsent()); + } + + public function testInvalidBase64Cookie() { + $this->expectException(\InvalidArgumentException::class); + $this->expectExceptionMessage('Invalid base64 string'); + + $cookies = ['PRIVACY_CONSENT' => 'invalid_base64']; + (new IonosConsentService())->getConsent($cookies); + } + + public function testInvalidJsonCookie() { + $this->expectException(\InvalidArgumentException::class); + $this->expectExceptionMessage('Invalid JSON string'); + + $cookieValue = base64_encode('invalid_json'); + $cookies = ['PRIVACY_CONSENT' => $cookieValue]; + (new IonosConsentService())->getConsent($cookies); + } + + public function testMissingCookie() { + $this->expectException(\InvalidArgumentException::class); + $this->expectExceptionMessage('No consent cookie found'); + + $cookies = []; + $consent = (new IonosConsentService())->getConsent($cookies); + + $this->assertFalse($consent->hasTechnicalConsent()); + $this->assertFalse($consent->hasStatisticsConsent()); + $this->assertFalse($consent->hasMarketingConsent()); + $this->assertFalse($consent->hasPartnershipsConsent()); + } +} diff --git a/tests/phpunit.xml b/tests/phpunit.xml index 3a7557d..a40ff5d 100644 --- a/tests/phpunit.xml +++ b/tests/phpunit.xml @@ -1,11 +1,31 @@ - + + - ./Unit + ./Unit + + + ../lib + ../appinfo + + + + + + diff --git a/vendor-bin/cs-fixer/composer.json b/vendor-bin/cs-fixer/composer.json new file mode 100644 index 0000000..13cc12d --- /dev/null +++ b/vendor-bin/cs-fixer/composer.json @@ -0,0 +1,12 @@ +{ + "config": { + "sort-packages": true, + "platform": { + "php": "8.1" + } + }, + "require": { + "friendsofphp/php-cs-fixer": "^3.37", + "nextcloud/coding-standard": "^1.1.1" + } +} diff --git a/vendor-bin/cs-fixer/composer.lock b/vendor-bin/cs-fixer/composer.lock new file mode 100644 index 0000000..200650b --- /dev/null +++ b/vendor-bin/cs-fixer/composer.lock @@ -0,0 +1,162 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "80901a880a6a35944b750b56c0e85620", + "packages": [ + { + "name": "kubawerlos/php-cs-fixer-custom-fixers", + "version": "v3.22.0", + "source": { + "type": "git", + "url": "https://github.com/kubawerlos/php-cs-fixer-custom-fixers.git", + "reference": "8701394f0c7cd450ac4fa577d24589122c1d5d5e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/kubawerlos/php-cs-fixer-custom-fixers/zipball/8701394f0c7cd450ac4fa577d24589122c1d5d5e", + "reference": "8701394f0c7cd450ac4fa577d24589122c1d5d5e", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "ext-tokenizer": "*", + "friendsofphp/php-cs-fixer": "^3.61.1", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.6.4 || ^10.5.29" + }, + "type": "library", + "autoload": { + "psr-4": { + "PhpCsFixerCustomFixers\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kuba Werłos", + "email": "werlos@gmail.com" + } + ], + "description": "A set of custom fixers for PHP CS Fixer", + "support": { + "issues": "https://github.com/kubawerlos/php-cs-fixer-custom-fixers/issues", + "source": "https://github.com/kubawerlos/php-cs-fixer-custom-fixers/tree/v3.22.0" + }, + "time": "2024-08-16T20:44:35+00:00" + }, + { + "name": "nextcloud/coding-standard", + "version": "v1.3.2", + "source": { + "type": "git", + "url": "https://github.com/nextcloud/coding-standard.git", + "reference": "9c719c4747fa26efc12f2e8b21c14a9a75c6ba6d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nextcloud/coding-standard/zipball/9c719c4747fa26efc12f2e8b21c14a9a75c6ba6d", + "reference": "9c719c4747fa26efc12f2e8b21c14a9a75c6ba6d", + "shasum": "" + }, + "require": { + "kubawerlos/php-cs-fixer-custom-fixers": "^3.22", + "php": "^7.3|^8.0", + "php-cs-fixer/shim": "^3.17" + }, + "type": "library", + "autoload": { + "psr-4": { + "Nextcloud\\CodingStandard\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christoph Wurst", + "email": "christoph@winzerhof-wurst.at" + } + ], + "description": "Nextcloud coding standards for the php cs fixer", + "support": { + "issues": "https://github.com/nextcloud/coding-standard/issues", + "source": "https://github.com/nextcloud/coding-standard/tree/v1.3.2" + }, + "time": "2024-10-14T16:49:05+00:00" + }, + { + "name": "php-cs-fixer/shim", + "version": "v3.65.0", + "source": { + "type": "git", + "url": "https://github.com/PHP-CS-Fixer/shim.git", + "reference": "4983ec79b9dee926695ac324ea6e8d291935525d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-CS-Fixer/shim/zipball/4983ec79b9dee926695ac324ea6e8d291935525d", + "reference": "4983ec79b9dee926695ac324ea6e8d291935525d", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0" + }, + "replace": { + "friendsofphp/php-cs-fixer": "self.version" + }, + "suggest": { + "ext-dom": "For handling output formats in XML", + "ext-mbstring": "For handling non-UTF8 characters." + }, + "bin": [ + "php-cs-fixer", + "php-cs-fixer.phar" + ], + "type": "application", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Dariusz Rumiński", + "email": "dariusz.ruminski@gmail.com" + } + ], + "description": "A tool to automatically fix PHP code style", + "support": { + "issues": "https://github.com/PHP-CS-Fixer/shim/issues", + "source": "https://github.com/PHP-CS-Fixer/shim/tree/v3.65.0" + }, + "time": "2024-11-25T00:39:41+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": {}, + "prefer-stable": false, + "prefer-lowest": false, + "platform": {}, + "platform-dev": {}, + "platform-overrides": { + "php": "8.1" + }, + "plugin-api-version": "2.6.0" +} diff --git a/vendor-bin/phpunit/composer.json b/vendor-bin/phpunit/composer.json new file mode 100644 index 0000000..d71dcb0 --- /dev/null +++ b/vendor-bin/phpunit/composer.json @@ -0,0 +1,10 @@ +{ + "require-dev": { + "phpunit/phpunit": "^9.6.22" + }, + "config": { + "platform": { + "php": "8.1" + } + } +} diff --git a/vendor-bin/phpunit/composer.lock b/vendor-bin/phpunit/composer.lock new file mode 100644 index 0000000..b2efb5d --- /dev/null +++ b/vendor-bin/phpunit/composer.lock @@ -0,0 +1,1763 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "32ab488c6c82e655f346d95fbf635ed3", + "packages": [], + "packages-dev": [ + { + "name": "doctrine/instantiator", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^11", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^1.2", + "phpstan/phpstan": "^1.9.4", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5.27", + "vimeo/psalm": "^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/2.0.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2022-12-30T00:23:10+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.12.1", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845", + "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2024-11-08T17:47:46+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.3.1", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/8eea230464783aa9671db8eea6f8c6ac5285794b", + "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.3.1" + }, + "time": "2024-10-08T18:51:32+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "9.2.32", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/85402a822d1ecf1db1096959413d35e1c37cf1a5", + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.19.1 || ^5.1.0", + "php": ">=7.3", + "phpunit/php-file-iterator": "^3.0.6", + "phpunit/php-text-template": "^2.0.4", + "sebastian/code-unit-reverse-lookup": "^2.0.3", + "sebastian/complexity": "^2.0.3", + "sebastian/environment": "^5.1.5", + "sebastian/lines-of-code": "^1.0.4", + "sebastian/version": "^3.0.2", + "theseer/tokenizer": "^1.2.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.6" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "9.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.32" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-08-22T04:23:01+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "3.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-12-02T12:48:52+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:58:55+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "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", + "type": "github" + } + ], + "time": "2020-10-26T05:33:50+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "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", + "type": "github" + } + ], + "time": "2020-10-26T13:16:10+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "9.6.22", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "f80235cb4d3caa59ae09be3adf1ded27521d1a9c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f80235cb4d3caa59ae09be3adf1ded27521d1a9c", + "reference": "f80235cb4d3caa59ae09be3adf1ded27521d1a9c", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.5.0 || ^2", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.12.1", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=7.3", + "phpunit/php-code-coverage": "^9.2.32", + "phpunit/php-file-iterator": "^3.0.6", + "phpunit/php-invoker": "^3.1.1", + "phpunit/php-text-template": "^2.0.4", + "phpunit/php-timer": "^5.0.3", + "sebastian/cli-parser": "^1.0.2", + "sebastian/code-unit": "^1.0.8", + "sebastian/comparator": "^4.0.8", + "sebastian/diff": "^4.0.6", + "sebastian/environment": "^5.1.5", + "sebastian/exporter": "^4.0.6", + "sebastian/global-state": "^5.0.7", + "sebastian/object-enumerator": "^4.0.4", + "sebastian/resource-operations": "^3.0.4", + "sebastian/type": "^3.2.1", + "sebastian/version": "^3.0.2" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.6-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.22" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2024-12-05T13:48:26+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b", + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:27:43+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "1.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:08:54+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:30:19+00:00" + }, + { + "name": "sebastian/comparator", + "version": "4.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/diff": "^4.0", + "sebastian/exporter": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-09-14T12:41:17+00:00" + }, + { + "name": "sebastian/complexity", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "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", + "type": "github" + } + ], + "time": "2023-12-22T06:19:30+00:00" + }, + { + "name": "sebastian/diff", + "version": "4.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:30:58+00:00" + }, + { + "name": "sebastian/environment", + "version": "5.1.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:03:51+00:00" + }, + { + "name": "sebastian/exporter", + "version": "4.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72", + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:33:00+00:00" + }, + { + "name": "sebastian/global-state", + "version": "5.0.7", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", + "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:35:11+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "1.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-22T06:20:34+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:12:34+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:14:26+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "4.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:07:39+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "3.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "support": { + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-14T16:00:52+00:00" + }, + { + "name": "sebastian/type", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:13:03+00:00" + }, + { + "name": "sebastian/version", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c6c1022351a901512170118436c764e473f6de8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", + "reference": "c6c1022351a901512170118436c764e473f6de8c", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:39:44+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:36:25+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": {}, + "prefer-stable": false, + "prefer-lowest": false, + "platform": {}, + "platform-dev": {}, + "platform-overrides": { + "php": "8.1" + }, + "plugin-api-version": "2.6.0" +}