├── .editorconfig ├── .github ├── FUNDING.yml ├── dependabot.yml └── workflows │ ├── auto-approve.yml │ ├── auto-merge.yml │ └── test.yml ├── .gitignore ├── LICENSE.md ├── README.md ├── Shorten.php ├── composer.json ├── composer.lock ├── example.html.php ├── phpunit.xml └── tests └── ShortenTest.php /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 4 6 | tab_width = 4 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: mrcgrtz 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: mrcgrtz 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 13 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | 4 | # Maintain dependencies for Composer 5 | - package-ecosystem: "composer" 6 | directory: "/" 7 | schedule: 8 | interval: "monthly" 9 | assignees: 10 | - "mrcgrtz" 11 | 12 | # Check for updates to GitHub Actions 13 | - package-ecosystem: "github-actions" 14 | directory: "/" 15 | schedule: 16 | interval: "daily" 17 | assignees: 18 | - "mrcgrtz" 19 | -------------------------------------------------------------------------------- /.github/workflows/auto-approve.yml: -------------------------------------------------------------------------------- 1 | name: Dependabot auto-approve 2 | 3 | on: pull_request 4 | 5 | permissions: 6 | pull-requests: write 7 | 8 | jobs: 9 | dependabot: 10 | runs-on: ubuntu-latest 11 | 12 | if: ${{ github.actor == 'dependabot[bot]' }} 13 | 14 | steps: 15 | - name: Dependabot metadata 16 | id: metadata 17 | uses: dependabot/fetch-metadata@v2 18 | with: 19 | github-token: "${{ secrets.GITHUB_TOKEN }}" 20 | 21 | - name: Approve a PR 22 | run: gh pr review --approve "$PR_URL" 23 | env: 24 | PR_URL: ${{github.event.pull_request.html_url}} 25 | GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} 26 | -------------------------------------------------------------------------------- /.github/workflows/auto-merge.yml: -------------------------------------------------------------------------------- 1 | name: Dependabot auto-merge 2 | 3 | on: pull_request 4 | 5 | permissions: 6 | contents: write 7 | pull-requests: write 8 | 9 | jobs: 10 | dependabot: 11 | runs-on: ubuntu-latest 12 | 13 | if: ${{ github.actor == 'dependabot[bot]' }} 14 | 15 | steps: 16 | - name: Dependabot metadata 17 | id: metadata 18 | uses: dependabot/fetch-metadata@v2 19 | with: 20 | github-token: '${{ secrets.GITHUB_TOKEN }}' 21 | 22 | - name: Enable auto-merge for Dependabot PRs 23 | if: ${{contains(steps.metadata.outputs.dependency-names, 'my-dependency') && steps.metadata.outputs.update-type == 'version-update:semver-patch'}} 24 | run: gh pr merge --auto --merge "$PR_URL" 25 | env: 26 | PR_URL: ${{github.event.pull_request.html_url}} 27 | GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} 28 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: Test 2 | 3 | on: 4 | push: 5 | branches: [ main ] 6 | pull_request: 7 | branches: [ main ] 8 | 9 | jobs: 10 | test: 11 | 12 | strategy: 13 | matrix: 14 | php-versions: ['8.2', '8.3', '8.4'] 15 | 16 | runs-on: ubuntu-latest 17 | 18 | steps: 19 | - name: Checkout 20 | uses: actions/checkout@v4 21 | 22 | - name: Setup PHP with Xdebug 23 | uses: shivammathur/setup-php@v2 24 | with: 25 | php-version: ${{ matrix.php-versions }} 26 | coverage: xdebug 27 | 28 | - name: Validate composer.json and composer.lock 29 | run: composer validate --strict 30 | 31 | - name: Cache Composer packages 32 | id: composer-cache 33 | uses: actions/cache@v4 34 | with: 35 | path: vendor 36 | key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }} 37 | restore-keys: | 38 | ${{ runner.os }}-php- 39 | 40 | - name: Install dependencies 41 | run: composer install --dev --prefer-dist --no-progress --no-interaction 42 | 43 | - name: Run test suite 44 | run: composer run-script test 45 | 46 | - name: Upload coverage results to Coveralls 47 | env: 48 | COVERALLS_REPO_TOKEN: ${{ secrets.GITHUB_TOKEN }} 49 | run: php vendor/bin/php-coveralls --coverage_clover=build/logs/clover.xml -v 50 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /vendor/ 2 | /build/ 3 | .phpunit.result.cache 4 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Marc Görtz 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Shorten 2 | 3 | > Provides additional truncation functions in PHP. 4 | 5 | [![Test](https://github.com/mrcgrtz/php-shorten/actions/workflows/test.yml/badge.svg)](https://github.com/mrcgrtz/php-shorten/actions/workflows/test.yml) 6 | [![Coverage Status](https://coveralls.io/repos/github/mrcgrtz/php-shorten/badge.svg?branch=main)](https://coveralls.io/github/mrcgrtz/php-shorten?branch=main) 7 | ![Packagist PHP Version Support](https://img.shields.io/packagist/php-v/marcgoertz/shorten) 8 | ![Packagist Downloads](https://img.shields.io/packagist/dt/marcgoertz/shorten) 9 | ![Packagist Stars](https://img.shields.io/packagist/stars/marcgoertz/shorten) 10 | [![MIT License](https://img.shields.io/github/license/mrcgrtz/php-shorten)](https://github.com/mrcgrtz/php-shorten/blob/main/LICENSE.md) 11 | 12 | ## Installation 13 | 14 | I recommend using [Composer](https://getcomposer.org/) for installing and using Shorten: 15 | 16 | ```bash 17 | composer require marcgoertz/shorten 18 | ``` 19 | 20 | Of course you can also just require it in your scripts directly. 21 | 22 | ## Usage 23 | 24 | ```php 25 | truncateMarkup('Go to example site', 10); 31 | ?> 32 | ``` 33 | 34 | Output: 35 | 36 | ```html 37 | Go to exam… 38 | ``` 39 | 40 | ## Functions 41 | 42 | ```php 43 | truncateMarkup( 44 | string $markup, 45 | int $length = 400, 46 | string $appendix = '…', 47 | bool $appendixInside = false, 48 | bool $wordsafe = false 49 | ): string 50 | ``` 51 | 52 | * String `$markup`: Text containing markup 53 | * Integer `$length`: Maximum length of truncated text (default: `400`) 54 | * String `$appendix`: Text added after truncated text (default: `'…'`) 55 | * Boolean `$appendixInside`: Add appendix to last content in tags, increases `$length` by 1 (default: `false`) 56 | * Boolean `$wordsafe`: Wordsafe truncation (default: `false`) 57 | * String `$delimiter`: Delimiter for wordsafe truncation (default: `' '`) 58 | 59 | ## License 60 | 61 | MIT © [Marc Görtz](https://marcgoertz.de/) 62 | -------------------------------------------------------------------------------- /Shorten.php: -------------------------------------------------------------------------------- 1 | ]*>|&#?[a-zA-Z0-9]+;/i'; 11 | private const SELF_CLOSING_TAGS = [ 12 | 'area', 13 | 'base', 14 | 'br', 15 | 'col', 16 | 'embed', 17 | 'hr', 18 | 'img', 19 | 'input', 20 | 'link', 21 | 'meta', 22 | 'param', 23 | 'source', 24 | 'track', 25 | 'wbr', 26 | 'command', 27 | 'keygen', 28 | 'menuitem', 29 | ]; 30 | 31 | /** 32 | * Safely truncate text containing markup. 33 | * 34 | * @param string $markup text containing markup 35 | * @param int $length maximum length of truncated text 36 | * @param string $appendix text added after truncated text 37 | * @param bool $appendixInside add appendix to last content in tags, 38 | * increases $length by 1 39 | * @param bool $wordsafe wordsafe truncation 40 | * @param string $delimiter delimiter for wordsafe truncation 41 | * 42 | * @return string truncated markup 43 | */ 44 | public function truncateMarkup( 45 | string $markup, 46 | int $length = 400, 47 | string $appendix = '…', 48 | bool $appendixInside = false, 49 | bool $wordsafe = false, 50 | string $delimiter = ' ' 51 | ): string { 52 | $truncated = ''; 53 | $lengthOutput = 0; 54 | $position = 0; 55 | $tags = []; 56 | 57 | // check for existing entities 58 | $hasEntities = preg_match(self::ENTITIES_PATTERN, $markup); 59 | 60 | // just return the markup if text does not need be truncated 61 | if (mb_strlen(trim(strip_tags($markup))) <= $length) { 62 | return $markup; 63 | } 64 | 65 | // to avoid UTF-8 multibyte glitches we need entities, 66 | // but no special characters for tags or existing entities 67 | $markup = str_replace( 68 | ['<', '>', '&'], 69 | ['<', '>', '&'], 70 | htmlentities($markup, ENT_NOQUOTES, 'UTF-8') 71 | ); 72 | 73 | // loop thru text 74 | while ( 75 | $lengthOutput < $length && 76 | preg_match( 77 | self::TAGS_AND_ENTITIES_PATTERN, 78 | $markup, 79 | $match, 80 | PREG_OFFSET_CAPTURE, 81 | $position 82 | ) 83 | ) { 84 | list($tag, $positionTag) = $match[0]; 85 | 86 | // add text leading up to the tag or entity 87 | $text = substr($markup, $position, $positionTag - $position); 88 | if ($lengthOutput + mb_strlen($text) > $length) { 89 | $truncated .= mb_substr($text, 0, $length - $lengthOutput); 90 | $lengthOutput = $length; 91 | break; 92 | } 93 | $truncated .= $text; 94 | $lengthOutput += mb_strlen($text); 95 | 96 | // add tags and entities 97 | if ($tag[0] === '&') { 98 | // handle the entity... 99 | $truncated .= $tag; 100 | // ... which is only one character 101 | $lengthOutput++; 102 | } else { 103 | // handle the tag 104 | $tagName = $match[1][0]; 105 | if ($tag[1] === '/') { 106 | // this is a closing tag 107 | $openingTag = array_pop($tags); 108 | // check that tags are properly nested 109 | assert($openingTag === $tagName); 110 | $truncated .= $tag; 111 | } elseif ($tag[mb_strlen($tag) - 2] === '/') { 112 | // self-closing tag in XML dialect 113 | $truncated .= $tag; 114 | } elseif (in_array($tagName, self::SELF_CLOSING_TAGS)) { 115 | // self-closing tag in non-XML dialect 116 | $truncated .= $tag; 117 | } else { 118 | // opening tag 119 | $truncated .= $tag; 120 | $tags[] = $tagName; 121 | } 122 | } 123 | 124 | // continue after the tag 125 | $position = $positionTag + mb_strlen($tag); 126 | } 127 | 128 | // add any remaining text 129 | if ($lengthOutput < $length && $position < mb_strlen($markup)) { 130 | $truncated .= mb_substr($markup, $position, $length - $lengthOutput); 131 | } 132 | 133 | // if the words shouldn't be cut in the middle... 134 | if ($wordsafe) { 135 | // ... search the last occurance of the delimiter... 136 | $spacepos = mb_strrpos($truncated, $delimiter); 137 | if (isset($spacepos)) { 138 | // ... and cut the text in this position 139 | $truncated = mb_substr($truncated, 0, $spacepos); 140 | } 141 | } 142 | 143 | // add appendix to last tag content 144 | if ($appendixInside) { 145 | $truncated .= $appendix; 146 | } 147 | 148 | // close any open tags 149 | while (!empty($tags)) { 150 | $truncated .= sprintf('', array_pop($tags)); 151 | } 152 | 153 | // decode entities again if markup did not contain any entities 154 | if ($hasEntities === 0) { 155 | $truncated = html_entity_decode($truncated, ENT_COMPAT, 'UTF-8'); 156 | } 157 | 158 | if ($appendixInside) { 159 | return $truncated; 160 | } else { 161 | return $truncated . $appendix; 162 | } 163 | } 164 | } 165 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "marcgoertz/shorten", 3 | "description": "Provides truncation functions.", 4 | "homepage": "https://github.com/mrcgrtz/php-shorten", 5 | "keywords": [ 6 | "truncation", 7 | "shorten", 8 | "markup" 9 | ], 10 | "license": "MIT", 11 | "authors": [ 12 | { 13 | "name": "Marc Görtz", 14 | "email": "git@marcgoertz.de", 15 | "homepage": "https://marcgoertz.de/" 16 | } 17 | ], 18 | "funding": [ 19 | { 20 | "type": "kofi", 21 | "url": "https://ko-fi.com/mrcgrtz" 22 | }, 23 | { 24 | "type": "liberapay", 25 | "url": "https://liberapy.com/mrcgrtz" 26 | } 27 | ], 28 | "autoload": { 29 | "psr-0": {"Marcgoertz\\Shorten\\": ""}, 30 | "psr-4": {"Marcgoertz\\Shorten\\": ""} 31 | }, 32 | "scripts": { 33 | "fix": "phpcbf --standard=PSR12 --ignore=vendor ./", 34 | "lint": "phpcs --standard=PSR12 --ignore=vendor --no-cache ./", 35 | "test": "phpunit" 36 | }, 37 | "minimum-stability": "stable", 38 | "require": { 39 | "php": ">=8.2" 40 | }, 41 | "require-dev": { 42 | "phpunit/phpunit": "^11.3.1", 43 | "squizlabs/php_codesniffer": "^3.6.0", 44 | "php-coveralls/php-coveralls": "^2.4.3" 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "8d01c8a28af008e60aabdaec85814546", 8 | "packages": [], 9 | "packages-dev": [ 10 | { 11 | "name": "guzzlehttp/guzzle", 12 | "version": "7.9.3", 13 | "source": { 14 | "type": "git", 15 | "url": "https://github.com/guzzle/guzzle.git", 16 | "reference": "7b2f29fe81dc4da0ca0ea7d42107a0845946ea77" 17 | }, 18 | "dist": { 19 | "type": "zip", 20 | "url": "https://api.github.com/repos/guzzle/guzzle/zipball/7b2f29fe81dc4da0ca0ea7d42107a0845946ea77", 21 | "reference": "7b2f29fe81dc4da0ca0ea7d42107a0845946ea77", 22 | "shasum": "" 23 | }, 24 | "require": { 25 | "ext-json": "*", 26 | "guzzlehttp/promises": "^1.5.3 || ^2.0.3", 27 | "guzzlehttp/psr7": "^2.7.0", 28 | "php": "^7.2.5 || ^8.0", 29 | "psr/http-client": "^1.0", 30 | "symfony/deprecation-contracts": "^2.2 || ^3.0" 31 | }, 32 | "provide": { 33 | "psr/http-client-implementation": "1.0" 34 | }, 35 | "require-dev": { 36 | "bamarni/composer-bin-plugin": "^1.8.2", 37 | "ext-curl": "*", 38 | "guzzle/client-integration-tests": "3.0.2", 39 | "php-http/message-factory": "^1.1", 40 | "phpunit/phpunit": "^8.5.39 || ^9.6.20", 41 | "psr/log": "^1.1 || ^2.0 || ^3.0" 42 | }, 43 | "suggest": { 44 | "ext-curl": "Required for CURL handler support", 45 | "ext-intl": "Required for Internationalized Domain Name (IDN) support", 46 | "psr/log": "Required for using the Log middleware" 47 | }, 48 | "type": "library", 49 | "extra": { 50 | "bamarni-bin": { 51 | "bin-links": true, 52 | "forward-command": false 53 | } 54 | }, 55 | "autoload": { 56 | "files": [ 57 | "src/functions_include.php" 58 | ], 59 | "psr-4": { 60 | "GuzzleHttp\\": "src/" 61 | } 62 | }, 63 | "notification-url": "https://packagist.org/downloads/", 64 | "license": [ 65 | "MIT" 66 | ], 67 | "authors": [ 68 | { 69 | "name": "Graham Campbell", 70 | "email": "hello@gjcampbell.co.uk", 71 | "homepage": "https://github.com/GrahamCampbell" 72 | }, 73 | { 74 | "name": "Michael Dowling", 75 | "email": "mtdowling@gmail.com", 76 | "homepage": "https://github.com/mtdowling" 77 | }, 78 | { 79 | "name": "Jeremy Lindblom", 80 | "email": "jeremeamia@gmail.com", 81 | "homepage": "https://github.com/jeremeamia" 82 | }, 83 | { 84 | "name": "George Mponos", 85 | "email": "gmponos@gmail.com", 86 | "homepage": "https://github.com/gmponos" 87 | }, 88 | { 89 | "name": "Tobias Nyholm", 90 | "email": "tobias.nyholm@gmail.com", 91 | "homepage": "https://github.com/Nyholm" 92 | }, 93 | { 94 | "name": "Márk Sági-Kazár", 95 | "email": "mark.sagikazar@gmail.com", 96 | "homepage": "https://github.com/sagikazarmark" 97 | }, 98 | { 99 | "name": "Tobias Schultze", 100 | "email": "webmaster@tubo-world.de", 101 | "homepage": "https://github.com/Tobion" 102 | } 103 | ], 104 | "description": "Guzzle is a PHP HTTP client library", 105 | "keywords": [ 106 | "client", 107 | "curl", 108 | "framework", 109 | "http", 110 | "http client", 111 | "psr-18", 112 | "psr-7", 113 | "rest", 114 | "web service" 115 | ], 116 | "support": { 117 | "issues": "https://github.com/guzzle/guzzle/issues", 118 | "source": "https://github.com/guzzle/guzzle/tree/7.9.3" 119 | }, 120 | "funding": [ 121 | { 122 | "url": "https://github.com/GrahamCampbell", 123 | "type": "github" 124 | }, 125 | { 126 | "url": "https://github.com/Nyholm", 127 | "type": "github" 128 | }, 129 | { 130 | "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", 131 | "type": "tidelift" 132 | } 133 | ], 134 | "time": "2025-03-27T13:37:11+00:00" 135 | }, 136 | { 137 | "name": "guzzlehttp/promises", 138 | "version": "2.2.0", 139 | "source": { 140 | "type": "git", 141 | "url": "https://github.com/guzzle/promises.git", 142 | "reference": "7c69f28996b0a6920945dd20b3857e499d9ca96c" 143 | }, 144 | "dist": { 145 | "type": "zip", 146 | "url": "https://api.github.com/repos/guzzle/promises/zipball/7c69f28996b0a6920945dd20b3857e499d9ca96c", 147 | "reference": "7c69f28996b0a6920945dd20b3857e499d9ca96c", 148 | "shasum": "" 149 | }, 150 | "require": { 151 | "php": "^7.2.5 || ^8.0" 152 | }, 153 | "require-dev": { 154 | "bamarni/composer-bin-plugin": "^1.8.2", 155 | "phpunit/phpunit": "^8.5.39 || ^9.6.20" 156 | }, 157 | "type": "library", 158 | "extra": { 159 | "bamarni-bin": { 160 | "bin-links": true, 161 | "forward-command": false 162 | } 163 | }, 164 | "autoload": { 165 | "psr-4": { 166 | "GuzzleHttp\\Promise\\": "src/" 167 | } 168 | }, 169 | "notification-url": "https://packagist.org/downloads/", 170 | "license": [ 171 | "MIT" 172 | ], 173 | "authors": [ 174 | { 175 | "name": "Graham Campbell", 176 | "email": "hello@gjcampbell.co.uk", 177 | "homepage": "https://github.com/GrahamCampbell" 178 | }, 179 | { 180 | "name": "Michael Dowling", 181 | "email": "mtdowling@gmail.com", 182 | "homepage": "https://github.com/mtdowling" 183 | }, 184 | { 185 | "name": "Tobias Nyholm", 186 | "email": "tobias.nyholm@gmail.com", 187 | "homepage": "https://github.com/Nyholm" 188 | }, 189 | { 190 | "name": "Tobias Schultze", 191 | "email": "webmaster@tubo-world.de", 192 | "homepage": "https://github.com/Tobion" 193 | } 194 | ], 195 | "description": "Guzzle promises library", 196 | "keywords": [ 197 | "promise" 198 | ], 199 | "support": { 200 | "issues": "https://github.com/guzzle/promises/issues", 201 | "source": "https://github.com/guzzle/promises/tree/2.2.0" 202 | }, 203 | "funding": [ 204 | { 205 | "url": "https://github.com/GrahamCampbell", 206 | "type": "github" 207 | }, 208 | { 209 | "url": "https://github.com/Nyholm", 210 | "type": "github" 211 | }, 212 | { 213 | "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", 214 | "type": "tidelift" 215 | } 216 | ], 217 | "time": "2025-03-27T13:27:01+00:00" 218 | }, 219 | { 220 | "name": "guzzlehttp/psr7", 221 | "version": "2.7.1", 222 | "source": { 223 | "type": "git", 224 | "url": "https://github.com/guzzle/psr7.git", 225 | "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16" 226 | }, 227 | "dist": { 228 | "type": "zip", 229 | "url": "https://api.github.com/repos/guzzle/psr7/zipball/c2270caaabe631b3b44c85f99e5a04bbb8060d16", 230 | "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16", 231 | "shasum": "" 232 | }, 233 | "require": { 234 | "php": "^7.2.5 || ^8.0", 235 | "psr/http-factory": "^1.0", 236 | "psr/http-message": "^1.1 || ^2.0", 237 | "ralouphie/getallheaders": "^3.0" 238 | }, 239 | "provide": { 240 | "psr/http-factory-implementation": "1.0", 241 | "psr/http-message-implementation": "1.0" 242 | }, 243 | "require-dev": { 244 | "bamarni/composer-bin-plugin": "^1.8.2", 245 | "http-interop/http-factory-tests": "0.9.0", 246 | "phpunit/phpunit": "^8.5.39 || ^9.6.20" 247 | }, 248 | "suggest": { 249 | "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" 250 | }, 251 | "type": "library", 252 | "extra": { 253 | "bamarni-bin": { 254 | "bin-links": true, 255 | "forward-command": false 256 | } 257 | }, 258 | "autoload": { 259 | "psr-4": { 260 | "GuzzleHttp\\Psr7\\": "src/" 261 | } 262 | }, 263 | "notification-url": "https://packagist.org/downloads/", 264 | "license": [ 265 | "MIT" 266 | ], 267 | "authors": [ 268 | { 269 | "name": "Graham Campbell", 270 | "email": "hello@gjcampbell.co.uk", 271 | "homepage": "https://github.com/GrahamCampbell" 272 | }, 273 | { 274 | "name": "Michael Dowling", 275 | "email": "mtdowling@gmail.com", 276 | "homepage": "https://github.com/mtdowling" 277 | }, 278 | { 279 | "name": "George Mponos", 280 | "email": "gmponos@gmail.com", 281 | "homepage": "https://github.com/gmponos" 282 | }, 283 | { 284 | "name": "Tobias Nyholm", 285 | "email": "tobias.nyholm@gmail.com", 286 | "homepage": "https://github.com/Nyholm" 287 | }, 288 | { 289 | "name": "Márk Sági-Kazár", 290 | "email": "mark.sagikazar@gmail.com", 291 | "homepage": "https://github.com/sagikazarmark" 292 | }, 293 | { 294 | "name": "Tobias Schultze", 295 | "email": "webmaster@tubo-world.de", 296 | "homepage": "https://github.com/Tobion" 297 | }, 298 | { 299 | "name": "Márk Sági-Kazár", 300 | "email": "mark.sagikazar@gmail.com", 301 | "homepage": "https://sagikazarmark.hu" 302 | } 303 | ], 304 | "description": "PSR-7 message implementation that also provides common utility methods", 305 | "keywords": [ 306 | "http", 307 | "message", 308 | "psr-7", 309 | "request", 310 | "response", 311 | "stream", 312 | "uri", 313 | "url" 314 | ], 315 | "support": { 316 | "issues": "https://github.com/guzzle/psr7/issues", 317 | "source": "https://github.com/guzzle/psr7/tree/2.7.1" 318 | }, 319 | "funding": [ 320 | { 321 | "url": "https://github.com/GrahamCampbell", 322 | "type": "github" 323 | }, 324 | { 325 | "url": "https://github.com/Nyholm", 326 | "type": "github" 327 | }, 328 | { 329 | "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", 330 | "type": "tidelift" 331 | } 332 | ], 333 | "time": "2025-03-27T12:30:47+00:00" 334 | }, 335 | { 336 | "name": "myclabs/deep-copy", 337 | "version": "1.12.1", 338 | "source": { 339 | "type": "git", 340 | "url": "https://github.com/myclabs/DeepCopy.git", 341 | "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845" 342 | }, 343 | "dist": { 344 | "type": "zip", 345 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845", 346 | "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845", 347 | "shasum": "" 348 | }, 349 | "require": { 350 | "php": "^7.1 || ^8.0" 351 | }, 352 | "conflict": { 353 | "doctrine/collections": "<1.6.8", 354 | "doctrine/common": "<2.13.3 || >=3 <3.2.2" 355 | }, 356 | "require-dev": { 357 | "doctrine/collections": "^1.6.8", 358 | "doctrine/common": "^2.13.3 || ^3.2.2", 359 | "phpspec/prophecy": "^1.10", 360 | "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" 361 | }, 362 | "type": "library", 363 | "autoload": { 364 | "files": [ 365 | "src/DeepCopy/deep_copy.php" 366 | ], 367 | "psr-4": { 368 | "DeepCopy\\": "src/DeepCopy/" 369 | } 370 | }, 371 | "notification-url": "https://packagist.org/downloads/", 372 | "license": [ 373 | "MIT" 374 | ], 375 | "description": "Create deep copies (clones) of your objects", 376 | "keywords": [ 377 | "clone", 378 | "copy", 379 | "duplicate", 380 | "object", 381 | "object graph" 382 | ], 383 | "support": { 384 | "issues": "https://github.com/myclabs/DeepCopy/issues", 385 | "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1" 386 | }, 387 | "funding": [ 388 | { 389 | "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", 390 | "type": "tidelift" 391 | } 392 | ], 393 | "time": "2024-11-08T17:47:46+00:00" 394 | }, 395 | { 396 | "name": "nikic/php-parser", 397 | "version": "v5.4.0", 398 | "source": { 399 | "type": "git", 400 | "url": "https://github.com/nikic/PHP-Parser.git", 401 | "reference": "447a020a1f875a434d62f2a401f53b82a396e494" 402 | }, 403 | "dist": { 404 | "type": "zip", 405 | "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/447a020a1f875a434d62f2a401f53b82a396e494", 406 | "reference": "447a020a1f875a434d62f2a401f53b82a396e494", 407 | "shasum": "" 408 | }, 409 | "require": { 410 | "ext-ctype": "*", 411 | "ext-json": "*", 412 | "ext-tokenizer": "*", 413 | "php": ">=7.4" 414 | }, 415 | "require-dev": { 416 | "ircmaxell/php-yacc": "^0.0.7", 417 | "phpunit/phpunit": "^9.0" 418 | }, 419 | "bin": [ 420 | "bin/php-parse" 421 | ], 422 | "type": "library", 423 | "extra": { 424 | "branch-alias": { 425 | "dev-master": "5.0-dev" 426 | } 427 | }, 428 | "autoload": { 429 | "psr-4": { 430 | "PhpParser\\": "lib/PhpParser" 431 | } 432 | }, 433 | "notification-url": "https://packagist.org/downloads/", 434 | "license": [ 435 | "BSD-3-Clause" 436 | ], 437 | "authors": [ 438 | { 439 | "name": "Nikita Popov" 440 | } 441 | ], 442 | "description": "A PHP parser written in PHP", 443 | "keywords": [ 444 | "parser", 445 | "php" 446 | ], 447 | "support": { 448 | "issues": "https://github.com/nikic/PHP-Parser/issues", 449 | "source": "https://github.com/nikic/PHP-Parser/tree/v5.4.0" 450 | }, 451 | "time": "2024-12-30T11:07:19+00:00" 452 | }, 453 | { 454 | "name": "phar-io/manifest", 455 | "version": "2.0.4", 456 | "source": { 457 | "type": "git", 458 | "url": "https://github.com/phar-io/manifest.git", 459 | "reference": "54750ef60c58e43759730615a392c31c80e23176" 460 | }, 461 | "dist": { 462 | "type": "zip", 463 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", 464 | "reference": "54750ef60c58e43759730615a392c31c80e23176", 465 | "shasum": "" 466 | }, 467 | "require": { 468 | "ext-dom": "*", 469 | "ext-libxml": "*", 470 | "ext-phar": "*", 471 | "ext-xmlwriter": "*", 472 | "phar-io/version": "^3.0.1", 473 | "php": "^7.2 || ^8.0" 474 | }, 475 | "type": "library", 476 | "extra": { 477 | "branch-alias": { 478 | "dev-master": "2.0.x-dev" 479 | } 480 | }, 481 | "autoload": { 482 | "classmap": [ 483 | "src/" 484 | ] 485 | }, 486 | "notification-url": "https://packagist.org/downloads/", 487 | "license": [ 488 | "BSD-3-Clause" 489 | ], 490 | "authors": [ 491 | { 492 | "name": "Arne Blankerts", 493 | "email": "arne@blankerts.de", 494 | "role": "Developer" 495 | }, 496 | { 497 | "name": "Sebastian Heuer", 498 | "email": "sebastian@phpeople.de", 499 | "role": "Developer" 500 | }, 501 | { 502 | "name": "Sebastian Bergmann", 503 | "email": "sebastian@phpunit.de", 504 | "role": "Developer" 505 | } 506 | ], 507 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 508 | "support": { 509 | "issues": "https://github.com/phar-io/manifest/issues", 510 | "source": "https://github.com/phar-io/manifest/tree/2.0.4" 511 | }, 512 | "funding": [ 513 | { 514 | "url": "https://github.com/theseer", 515 | "type": "github" 516 | } 517 | ], 518 | "time": "2024-03-03T12:33:53+00:00" 519 | }, 520 | { 521 | "name": "phar-io/version", 522 | "version": "3.2.1", 523 | "source": { 524 | "type": "git", 525 | "url": "https://github.com/phar-io/version.git", 526 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" 527 | }, 528 | "dist": { 529 | "type": "zip", 530 | "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 531 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 532 | "shasum": "" 533 | }, 534 | "require": { 535 | "php": "^7.2 || ^8.0" 536 | }, 537 | "type": "library", 538 | "autoload": { 539 | "classmap": [ 540 | "src/" 541 | ] 542 | }, 543 | "notification-url": "https://packagist.org/downloads/", 544 | "license": [ 545 | "BSD-3-Clause" 546 | ], 547 | "authors": [ 548 | { 549 | "name": "Arne Blankerts", 550 | "email": "arne@blankerts.de", 551 | "role": "Developer" 552 | }, 553 | { 554 | "name": "Sebastian Heuer", 555 | "email": "sebastian@phpeople.de", 556 | "role": "Developer" 557 | }, 558 | { 559 | "name": "Sebastian Bergmann", 560 | "email": "sebastian@phpunit.de", 561 | "role": "Developer" 562 | } 563 | ], 564 | "description": "Library for handling version information and constraints", 565 | "support": { 566 | "issues": "https://github.com/phar-io/version/issues", 567 | "source": "https://github.com/phar-io/version/tree/3.2.1" 568 | }, 569 | "time": "2022-02-21T01:04:05+00:00" 570 | }, 571 | { 572 | "name": "php-coveralls/php-coveralls", 573 | "version": "v2.8.0", 574 | "source": { 575 | "type": "git", 576 | "url": "https://github.com/php-coveralls/php-coveralls.git", 577 | "reference": "00b9fce4d785a98760ca02f305c197f5fcfb6004" 578 | }, 579 | "dist": { 580 | "type": "zip", 581 | "url": "https://api.github.com/repos/php-coveralls/php-coveralls/zipball/00b9fce4d785a98760ca02f305c197f5fcfb6004", 582 | "reference": "00b9fce4d785a98760ca02f305c197f5fcfb6004", 583 | "shasum": "" 584 | }, 585 | "require": { 586 | "ext-json": "*", 587 | "ext-simplexml": "*", 588 | "guzzlehttp/guzzle": "^6.0 || ^7.0", 589 | "php": "^7.0 || ^8.0", 590 | "psr/log": "^1.0 || ^2.0", 591 | "symfony/config": "^2.1 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0", 592 | "symfony/console": "^2.1 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0", 593 | "symfony/stopwatch": "^2.0 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0", 594 | "symfony/yaml": "^2.0.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0" 595 | }, 596 | "require-dev": { 597 | "phpspec/prophecy-phpunit": "^1.1 || ^2.3", 598 | "phpunit/phpunit": "^4.8.35 || ^5.4.3 || ^6.0 || ^7.0 || >=8.0 <8.5.29 || >=9.0 <9.5.23", 599 | "sanmai/phpunit-legacy-adapter": "^6.1 || ^8.0" 600 | }, 601 | "suggest": { 602 | "symfony/http-kernel": "Allows Symfony integration" 603 | }, 604 | "bin": [ 605 | "bin/php-coveralls" 606 | ], 607 | "type": "library", 608 | "autoload": { 609 | "psr-4": { 610 | "PhpCoveralls\\": "src/" 611 | } 612 | }, 613 | "notification-url": "https://packagist.org/downloads/", 614 | "license": [ 615 | "MIT" 616 | ], 617 | "authors": [ 618 | { 619 | "name": "Kitamura Satoshi", 620 | "email": "with.no.parachute@gmail.com", 621 | "homepage": "https://www.facebook.com/satooshi.jp", 622 | "role": "Original creator" 623 | }, 624 | { 625 | "name": "Takashi Matsuo", 626 | "email": "tmatsuo@google.com" 627 | }, 628 | { 629 | "name": "Google Inc" 630 | }, 631 | { 632 | "name": "Dariusz Ruminski", 633 | "email": "dariusz.ruminski@gmail.com", 634 | "homepage": "https://github.com/keradus" 635 | }, 636 | { 637 | "name": "Contributors", 638 | "homepage": "https://github.com/php-coveralls/php-coveralls/graphs/contributors" 639 | } 640 | ], 641 | "description": "PHP client library for Coveralls API", 642 | "homepage": "https://github.com/php-coveralls/php-coveralls", 643 | "keywords": [ 644 | "ci", 645 | "coverage", 646 | "github", 647 | "test" 648 | ], 649 | "support": { 650 | "issues": "https://github.com/php-coveralls/php-coveralls/issues", 651 | "source": "https://github.com/php-coveralls/php-coveralls/tree/v2.8.0" 652 | }, 653 | "time": "2025-05-12T08:35:27+00:00" 654 | }, 655 | { 656 | "name": "phpunit/php-code-coverage", 657 | "version": "11.0.8", 658 | "source": { 659 | "type": "git", 660 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 661 | "reference": "418c59fd080954f8c4aa5631d9502ecda2387118" 662 | }, 663 | "dist": { 664 | "type": "zip", 665 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/418c59fd080954f8c4aa5631d9502ecda2387118", 666 | "reference": "418c59fd080954f8c4aa5631d9502ecda2387118", 667 | "shasum": "" 668 | }, 669 | "require": { 670 | "ext-dom": "*", 671 | "ext-libxml": "*", 672 | "ext-xmlwriter": "*", 673 | "nikic/php-parser": "^5.3.1", 674 | "php": ">=8.2", 675 | "phpunit/php-file-iterator": "^5.1.0", 676 | "phpunit/php-text-template": "^4.0.1", 677 | "sebastian/code-unit-reverse-lookup": "^4.0.1", 678 | "sebastian/complexity": "^4.0.1", 679 | "sebastian/environment": "^7.2.0", 680 | "sebastian/lines-of-code": "^3.0.1", 681 | "sebastian/version": "^5.0.2", 682 | "theseer/tokenizer": "^1.2.3" 683 | }, 684 | "require-dev": { 685 | "phpunit/phpunit": "^11.5.0" 686 | }, 687 | "suggest": { 688 | "ext-pcov": "PHP extension that provides line coverage", 689 | "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" 690 | }, 691 | "type": "library", 692 | "extra": { 693 | "branch-alias": { 694 | "dev-main": "11.0.x-dev" 695 | } 696 | }, 697 | "autoload": { 698 | "classmap": [ 699 | "src/" 700 | ] 701 | }, 702 | "notification-url": "https://packagist.org/downloads/", 703 | "license": [ 704 | "BSD-3-Clause" 705 | ], 706 | "authors": [ 707 | { 708 | "name": "Sebastian Bergmann", 709 | "email": "sebastian@phpunit.de", 710 | "role": "lead" 711 | } 712 | ], 713 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 714 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 715 | "keywords": [ 716 | "coverage", 717 | "testing", 718 | "xunit" 719 | ], 720 | "support": { 721 | "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", 722 | "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", 723 | "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.8" 724 | }, 725 | "funding": [ 726 | { 727 | "url": "https://github.com/sebastianbergmann", 728 | "type": "github" 729 | } 730 | ], 731 | "time": "2024-12-11T12:34:27+00:00" 732 | }, 733 | { 734 | "name": "phpunit/php-file-iterator", 735 | "version": "5.1.0", 736 | "source": { 737 | "type": "git", 738 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 739 | "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6" 740 | }, 741 | "dist": { 742 | "type": "zip", 743 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/118cfaaa8bc5aef3287bf315b6060b1174754af6", 744 | "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6", 745 | "shasum": "" 746 | }, 747 | "require": { 748 | "php": ">=8.2" 749 | }, 750 | "require-dev": { 751 | "phpunit/phpunit": "^11.0" 752 | }, 753 | "type": "library", 754 | "extra": { 755 | "branch-alias": { 756 | "dev-main": "5.0-dev" 757 | } 758 | }, 759 | "autoload": { 760 | "classmap": [ 761 | "src/" 762 | ] 763 | }, 764 | "notification-url": "https://packagist.org/downloads/", 765 | "license": [ 766 | "BSD-3-Clause" 767 | ], 768 | "authors": [ 769 | { 770 | "name": "Sebastian Bergmann", 771 | "email": "sebastian@phpunit.de", 772 | "role": "lead" 773 | } 774 | ], 775 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 776 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 777 | "keywords": [ 778 | "filesystem", 779 | "iterator" 780 | ], 781 | "support": { 782 | "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", 783 | "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", 784 | "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.0" 785 | }, 786 | "funding": [ 787 | { 788 | "url": "https://github.com/sebastianbergmann", 789 | "type": "github" 790 | } 791 | ], 792 | "time": "2024-08-27T05:02:59+00:00" 793 | }, 794 | { 795 | "name": "phpunit/php-invoker", 796 | "version": "5.0.1", 797 | "source": { 798 | "type": "git", 799 | "url": "https://github.com/sebastianbergmann/php-invoker.git", 800 | "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2" 801 | }, 802 | "dist": { 803 | "type": "zip", 804 | "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2", 805 | "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2", 806 | "shasum": "" 807 | }, 808 | "require": { 809 | "php": ">=8.2" 810 | }, 811 | "require-dev": { 812 | "ext-pcntl": "*", 813 | "phpunit/phpunit": "^11.0" 814 | }, 815 | "suggest": { 816 | "ext-pcntl": "*" 817 | }, 818 | "type": "library", 819 | "extra": { 820 | "branch-alias": { 821 | "dev-main": "5.0-dev" 822 | } 823 | }, 824 | "autoload": { 825 | "classmap": [ 826 | "src/" 827 | ] 828 | }, 829 | "notification-url": "https://packagist.org/downloads/", 830 | "license": [ 831 | "BSD-3-Clause" 832 | ], 833 | "authors": [ 834 | { 835 | "name": "Sebastian Bergmann", 836 | "email": "sebastian@phpunit.de", 837 | "role": "lead" 838 | } 839 | ], 840 | "description": "Invoke callables with a timeout", 841 | "homepage": "https://github.com/sebastianbergmann/php-invoker/", 842 | "keywords": [ 843 | "process" 844 | ], 845 | "support": { 846 | "issues": "https://github.com/sebastianbergmann/php-invoker/issues", 847 | "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", 848 | "source": "https://github.com/sebastianbergmann/php-invoker/tree/5.0.1" 849 | }, 850 | "funding": [ 851 | { 852 | "url": "https://github.com/sebastianbergmann", 853 | "type": "github" 854 | } 855 | ], 856 | "time": "2024-07-03T05:07:44+00:00" 857 | }, 858 | { 859 | "name": "phpunit/php-text-template", 860 | "version": "4.0.1", 861 | "source": { 862 | "type": "git", 863 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 864 | "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964" 865 | }, 866 | "dist": { 867 | "type": "zip", 868 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964", 869 | "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964", 870 | "shasum": "" 871 | }, 872 | "require": { 873 | "php": ">=8.2" 874 | }, 875 | "require-dev": { 876 | "phpunit/phpunit": "^11.0" 877 | }, 878 | "type": "library", 879 | "extra": { 880 | "branch-alias": { 881 | "dev-main": "4.0-dev" 882 | } 883 | }, 884 | "autoload": { 885 | "classmap": [ 886 | "src/" 887 | ] 888 | }, 889 | "notification-url": "https://packagist.org/downloads/", 890 | "license": [ 891 | "BSD-3-Clause" 892 | ], 893 | "authors": [ 894 | { 895 | "name": "Sebastian Bergmann", 896 | "email": "sebastian@phpunit.de", 897 | "role": "lead" 898 | } 899 | ], 900 | "description": "Simple template engine.", 901 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 902 | "keywords": [ 903 | "template" 904 | ], 905 | "support": { 906 | "issues": "https://github.com/sebastianbergmann/php-text-template/issues", 907 | "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", 908 | "source": "https://github.com/sebastianbergmann/php-text-template/tree/4.0.1" 909 | }, 910 | "funding": [ 911 | { 912 | "url": "https://github.com/sebastianbergmann", 913 | "type": "github" 914 | } 915 | ], 916 | "time": "2024-07-03T05:08:43+00:00" 917 | }, 918 | { 919 | "name": "phpunit/php-timer", 920 | "version": "7.0.1", 921 | "source": { 922 | "type": "git", 923 | "url": "https://github.com/sebastianbergmann/php-timer.git", 924 | "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3" 925 | }, 926 | "dist": { 927 | "type": "zip", 928 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", 929 | "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", 930 | "shasum": "" 931 | }, 932 | "require": { 933 | "php": ">=8.2" 934 | }, 935 | "require-dev": { 936 | "phpunit/phpunit": "^11.0" 937 | }, 938 | "type": "library", 939 | "extra": { 940 | "branch-alias": { 941 | "dev-main": "7.0-dev" 942 | } 943 | }, 944 | "autoload": { 945 | "classmap": [ 946 | "src/" 947 | ] 948 | }, 949 | "notification-url": "https://packagist.org/downloads/", 950 | "license": [ 951 | "BSD-3-Clause" 952 | ], 953 | "authors": [ 954 | { 955 | "name": "Sebastian Bergmann", 956 | "email": "sebastian@phpunit.de", 957 | "role": "lead" 958 | } 959 | ], 960 | "description": "Utility class for timing", 961 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 962 | "keywords": [ 963 | "timer" 964 | ], 965 | "support": { 966 | "issues": "https://github.com/sebastianbergmann/php-timer/issues", 967 | "security": "https://github.com/sebastianbergmann/php-timer/security/policy", 968 | "source": "https://github.com/sebastianbergmann/php-timer/tree/7.0.1" 969 | }, 970 | "funding": [ 971 | { 972 | "url": "https://github.com/sebastianbergmann", 973 | "type": "github" 974 | } 975 | ], 976 | "time": "2024-07-03T05:09:35+00:00" 977 | }, 978 | { 979 | "name": "phpunit/phpunit", 980 | "version": "11.5.6", 981 | "source": { 982 | "type": "git", 983 | "url": "https://github.com/sebastianbergmann/phpunit.git", 984 | "reference": "3c3ae14c90f244cdda95028c3e469028e8d1c02c" 985 | }, 986 | "dist": { 987 | "type": "zip", 988 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3c3ae14c90f244cdda95028c3e469028e8d1c02c", 989 | "reference": "3c3ae14c90f244cdda95028c3e469028e8d1c02c", 990 | "shasum": "" 991 | }, 992 | "require": { 993 | "ext-dom": "*", 994 | "ext-json": "*", 995 | "ext-libxml": "*", 996 | "ext-mbstring": "*", 997 | "ext-xml": "*", 998 | "ext-xmlwriter": "*", 999 | "myclabs/deep-copy": "^1.12.1", 1000 | "phar-io/manifest": "^2.0.4", 1001 | "phar-io/version": "^3.2.1", 1002 | "php": ">=8.2", 1003 | "phpunit/php-code-coverage": "^11.0.8", 1004 | "phpunit/php-file-iterator": "^5.1.0", 1005 | "phpunit/php-invoker": "^5.0.1", 1006 | "phpunit/php-text-template": "^4.0.1", 1007 | "phpunit/php-timer": "^7.0.1", 1008 | "sebastian/cli-parser": "^3.0.2", 1009 | "sebastian/code-unit": "^3.0.2", 1010 | "sebastian/comparator": "^6.3.0", 1011 | "sebastian/diff": "^6.0.2", 1012 | "sebastian/environment": "^7.2.0", 1013 | "sebastian/exporter": "^6.3.0", 1014 | "sebastian/global-state": "^7.0.2", 1015 | "sebastian/object-enumerator": "^6.0.1", 1016 | "sebastian/type": "^5.1.0", 1017 | "sebastian/version": "^5.0.2", 1018 | "staabm/side-effects-detector": "^1.0.5" 1019 | }, 1020 | "suggest": { 1021 | "ext-soap": "To be able to generate mocks based on WSDL files" 1022 | }, 1023 | "bin": [ 1024 | "phpunit" 1025 | ], 1026 | "type": "library", 1027 | "extra": { 1028 | "branch-alias": { 1029 | "dev-main": "11.5-dev" 1030 | } 1031 | }, 1032 | "autoload": { 1033 | "files": [ 1034 | "src/Framework/Assert/Functions.php" 1035 | ], 1036 | "classmap": [ 1037 | "src/" 1038 | ] 1039 | }, 1040 | "notification-url": "https://packagist.org/downloads/", 1041 | "license": [ 1042 | "BSD-3-Clause" 1043 | ], 1044 | "authors": [ 1045 | { 1046 | "name": "Sebastian Bergmann", 1047 | "email": "sebastian@phpunit.de", 1048 | "role": "lead" 1049 | } 1050 | ], 1051 | "description": "The PHP Unit Testing framework.", 1052 | "homepage": "https://phpunit.de/", 1053 | "keywords": [ 1054 | "phpunit", 1055 | "testing", 1056 | "xunit" 1057 | ], 1058 | "support": { 1059 | "issues": "https://github.com/sebastianbergmann/phpunit/issues", 1060 | "security": "https://github.com/sebastianbergmann/phpunit/security/policy", 1061 | "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.6" 1062 | }, 1063 | "funding": [ 1064 | { 1065 | "url": "https://phpunit.de/sponsors.html", 1066 | "type": "custom" 1067 | }, 1068 | { 1069 | "url": "https://github.com/sebastianbergmann", 1070 | "type": "github" 1071 | }, 1072 | { 1073 | "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", 1074 | "type": "tidelift" 1075 | } 1076 | ], 1077 | "time": "2025-01-31T07:03:30+00:00" 1078 | }, 1079 | { 1080 | "name": "psr/container", 1081 | "version": "2.0.2", 1082 | "source": { 1083 | "type": "git", 1084 | "url": "https://github.com/php-fig/container.git", 1085 | "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" 1086 | }, 1087 | "dist": { 1088 | "type": "zip", 1089 | "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", 1090 | "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", 1091 | "shasum": "" 1092 | }, 1093 | "require": { 1094 | "php": ">=7.4.0" 1095 | }, 1096 | "type": "library", 1097 | "extra": { 1098 | "branch-alias": { 1099 | "dev-master": "2.0.x-dev" 1100 | } 1101 | }, 1102 | "autoload": { 1103 | "psr-4": { 1104 | "Psr\\Container\\": "src/" 1105 | } 1106 | }, 1107 | "notification-url": "https://packagist.org/downloads/", 1108 | "license": [ 1109 | "MIT" 1110 | ], 1111 | "authors": [ 1112 | { 1113 | "name": "PHP-FIG", 1114 | "homepage": "https://www.php-fig.org/" 1115 | } 1116 | ], 1117 | "description": "Common Container Interface (PHP FIG PSR-11)", 1118 | "homepage": "https://github.com/php-fig/container", 1119 | "keywords": [ 1120 | "PSR-11", 1121 | "container", 1122 | "container-interface", 1123 | "container-interop", 1124 | "psr" 1125 | ], 1126 | "support": { 1127 | "issues": "https://github.com/php-fig/container/issues", 1128 | "source": "https://github.com/php-fig/container/tree/2.0.2" 1129 | }, 1130 | "time": "2021-11-05T16:47:00+00:00" 1131 | }, 1132 | { 1133 | "name": "psr/http-client", 1134 | "version": "1.0.3", 1135 | "source": { 1136 | "type": "git", 1137 | "url": "https://github.com/php-fig/http-client.git", 1138 | "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" 1139 | }, 1140 | "dist": { 1141 | "type": "zip", 1142 | "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", 1143 | "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", 1144 | "shasum": "" 1145 | }, 1146 | "require": { 1147 | "php": "^7.0 || ^8.0", 1148 | "psr/http-message": "^1.0 || ^2.0" 1149 | }, 1150 | "type": "library", 1151 | "extra": { 1152 | "branch-alias": { 1153 | "dev-master": "1.0.x-dev" 1154 | } 1155 | }, 1156 | "autoload": { 1157 | "psr-4": { 1158 | "Psr\\Http\\Client\\": "src/" 1159 | } 1160 | }, 1161 | "notification-url": "https://packagist.org/downloads/", 1162 | "license": [ 1163 | "MIT" 1164 | ], 1165 | "authors": [ 1166 | { 1167 | "name": "PHP-FIG", 1168 | "homepage": "https://www.php-fig.org/" 1169 | } 1170 | ], 1171 | "description": "Common interface for HTTP clients", 1172 | "homepage": "https://github.com/php-fig/http-client", 1173 | "keywords": [ 1174 | "http", 1175 | "http-client", 1176 | "psr", 1177 | "psr-18" 1178 | ], 1179 | "support": { 1180 | "source": "https://github.com/php-fig/http-client" 1181 | }, 1182 | "time": "2023-09-23T14:17:50+00:00" 1183 | }, 1184 | { 1185 | "name": "psr/http-factory", 1186 | "version": "1.1.0", 1187 | "source": { 1188 | "type": "git", 1189 | "url": "https://github.com/php-fig/http-factory.git", 1190 | "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" 1191 | }, 1192 | "dist": { 1193 | "type": "zip", 1194 | "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", 1195 | "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", 1196 | "shasum": "" 1197 | }, 1198 | "require": { 1199 | "php": ">=7.1", 1200 | "psr/http-message": "^1.0 || ^2.0" 1201 | }, 1202 | "type": "library", 1203 | "extra": { 1204 | "branch-alias": { 1205 | "dev-master": "1.0.x-dev" 1206 | } 1207 | }, 1208 | "autoload": { 1209 | "psr-4": { 1210 | "Psr\\Http\\Message\\": "src/" 1211 | } 1212 | }, 1213 | "notification-url": "https://packagist.org/downloads/", 1214 | "license": [ 1215 | "MIT" 1216 | ], 1217 | "authors": [ 1218 | { 1219 | "name": "PHP-FIG", 1220 | "homepage": "https://www.php-fig.org/" 1221 | } 1222 | ], 1223 | "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", 1224 | "keywords": [ 1225 | "factory", 1226 | "http", 1227 | "message", 1228 | "psr", 1229 | "psr-17", 1230 | "psr-7", 1231 | "request", 1232 | "response" 1233 | ], 1234 | "support": { 1235 | "source": "https://github.com/php-fig/http-factory" 1236 | }, 1237 | "time": "2024-04-15T12:06:14+00:00" 1238 | }, 1239 | { 1240 | "name": "psr/http-message", 1241 | "version": "2.0", 1242 | "source": { 1243 | "type": "git", 1244 | "url": "https://github.com/php-fig/http-message.git", 1245 | "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" 1246 | }, 1247 | "dist": { 1248 | "type": "zip", 1249 | "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", 1250 | "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", 1251 | "shasum": "" 1252 | }, 1253 | "require": { 1254 | "php": "^7.2 || ^8.0" 1255 | }, 1256 | "type": "library", 1257 | "extra": { 1258 | "branch-alias": { 1259 | "dev-master": "2.0.x-dev" 1260 | } 1261 | }, 1262 | "autoload": { 1263 | "psr-4": { 1264 | "Psr\\Http\\Message\\": "src/" 1265 | } 1266 | }, 1267 | "notification-url": "https://packagist.org/downloads/", 1268 | "license": [ 1269 | "MIT" 1270 | ], 1271 | "authors": [ 1272 | { 1273 | "name": "PHP-FIG", 1274 | "homepage": "https://www.php-fig.org/" 1275 | } 1276 | ], 1277 | "description": "Common interface for HTTP messages", 1278 | "homepage": "https://github.com/php-fig/http-message", 1279 | "keywords": [ 1280 | "http", 1281 | "http-message", 1282 | "psr", 1283 | "psr-7", 1284 | "request", 1285 | "response" 1286 | ], 1287 | "support": { 1288 | "source": "https://github.com/php-fig/http-message/tree/2.0" 1289 | }, 1290 | "time": "2023-04-04T09:54:51+00:00" 1291 | }, 1292 | { 1293 | "name": "psr/log", 1294 | "version": "2.0.0", 1295 | "source": { 1296 | "type": "git", 1297 | "url": "https://github.com/php-fig/log.git", 1298 | "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376" 1299 | }, 1300 | "dist": { 1301 | "type": "zip", 1302 | "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376", 1303 | "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376", 1304 | "shasum": "" 1305 | }, 1306 | "require": { 1307 | "php": ">=8.0.0" 1308 | }, 1309 | "type": "library", 1310 | "extra": { 1311 | "branch-alias": { 1312 | "dev-master": "2.0.x-dev" 1313 | } 1314 | }, 1315 | "autoload": { 1316 | "psr-4": { 1317 | "Psr\\Log\\": "src" 1318 | } 1319 | }, 1320 | "notification-url": "https://packagist.org/downloads/", 1321 | "license": [ 1322 | "MIT" 1323 | ], 1324 | "authors": [ 1325 | { 1326 | "name": "PHP-FIG", 1327 | "homepage": "https://www.php-fig.org/" 1328 | } 1329 | ], 1330 | "description": "Common interface for logging libraries", 1331 | "homepage": "https://github.com/php-fig/log", 1332 | "keywords": [ 1333 | "log", 1334 | "psr", 1335 | "psr-3" 1336 | ], 1337 | "support": { 1338 | "source": "https://github.com/php-fig/log/tree/2.0.0" 1339 | }, 1340 | "time": "2021-07-14T16:41:46+00:00" 1341 | }, 1342 | { 1343 | "name": "ralouphie/getallheaders", 1344 | "version": "3.0.3", 1345 | "source": { 1346 | "type": "git", 1347 | "url": "https://github.com/ralouphie/getallheaders.git", 1348 | "reference": "120b605dfeb996808c31b6477290a714d356e822" 1349 | }, 1350 | "dist": { 1351 | "type": "zip", 1352 | "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", 1353 | "reference": "120b605dfeb996808c31b6477290a714d356e822", 1354 | "shasum": "" 1355 | }, 1356 | "require": { 1357 | "php": ">=5.6" 1358 | }, 1359 | "require-dev": { 1360 | "php-coveralls/php-coveralls": "^2.1", 1361 | "phpunit/phpunit": "^5 || ^6.5" 1362 | }, 1363 | "type": "library", 1364 | "autoload": { 1365 | "files": [ 1366 | "src/getallheaders.php" 1367 | ] 1368 | }, 1369 | "notification-url": "https://packagist.org/downloads/", 1370 | "license": [ 1371 | "MIT" 1372 | ], 1373 | "authors": [ 1374 | { 1375 | "name": "Ralph Khattar", 1376 | "email": "ralph.khattar@gmail.com" 1377 | } 1378 | ], 1379 | "description": "A polyfill for getallheaders.", 1380 | "support": { 1381 | "issues": "https://github.com/ralouphie/getallheaders/issues", 1382 | "source": "https://github.com/ralouphie/getallheaders/tree/develop" 1383 | }, 1384 | "time": "2019-03-08T08:55:37+00:00" 1385 | }, 1386 | { 1387 | "name": "sebastian/cli-parser", 1388 | "version": "3.0.2", 1389 | "source": { 1390 | "type": "git", 1391 | "url": "https://github.com/sebastianbergmann/cli-parser.git", 1392 | "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180" 1393 | }, 1394 | "dist": { 1395 | "type": "zip", 1396 | "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180", 1397 | "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180", 1398 | "shasum": "" 1399 | }, 1400 | "require": { 1401 | "php": ">=8.2" 1402 | }, 1403 | "require-dev": { 1404 | "phpunit/phpunit": "^11.0" 1405 | }, 1406 | "type": "library", 1407 | "extra": { 1408 | "branch-alias": { 1409 | "dev-main": "3.0-dev" 1410 | } 1411 | }, 1412 | "autoload": { 1413 | "classmap": [ 1414 | "src/" 1415 | ] 1416 | }, 1417 | "notification-url": "https://packagist.org/downloads/", 1418 | "license": [ 1419 | "BSD-3-Clause" 1420 | ], 1421 | "authors": [ 1422 | { 1423 | "name": "Sebastian Bergmann", 1424 | "email": "sebastian@phpunit.de", 1425 | "role": "lead" 1426 | } 1427 | ], 1428 | "description": "Library for parsing CLI options", 1429 | "homepage": "https://github.com/sebastianbergmann/cli-parser", 1430 | "support": { 1431 | "issues": "https://github.com/sebastianbergmann/cli-parser/issues", 1432 | "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", 1433 | "source": "https://github.com/sebastianbergmann/cli-parser/tree/3.0.2" 1434 | }, 1435 | "funding": [ 1436 | { 1437 | "url": "https://github.com/sebastianbergmann", 1438 | "type": "github" 1439 | } 1440 | ], 1441 | "time": "2024-07-03T04:41:36+00:00" 1442 | }, 1443 | { 1444 | "name": "sebastian/code-unit", 1445 | "version": "3.0.2", 1446 | "source": { 1447 | "type": "git", 1448 | "url": "https://github.com/sebastianbergmann/code-unit.git", 1449 | "reference": "ee88b0cdbe74cf8dd3b54940ff17643c0d6543ca" 1450 | }, 1451 | "dist": { 1452 | "type": "zip", 1453 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/ee88b0cdbe74cf8dd3b54940ff17643c0d6543ca", 1454 | "reference": "ee88b0cdbe74cf8dd3b54940ff17643c0d6543ca", 1455 | "shasum": "" 1456 | }, 1457 | "require": { 1458 | "php": ">=8.2" 1459 | }, 1460 | "require-dev": { 1461 | "phpunit/phpunit": "^11.5" 1462 | }, 1463 | "type": "library", 1464 | "extra": { 1465 | "branch-alias": { 1466 | "dev-main": "3.0-dev" 1467 | } 1468 | }, 1469 | "autoload": { 1470 | "classmap": [ 1471 | "src/" 1472 | ] 1473 | }, 1474 | "notification-url": "https://packagist.org/downloads/", 1475 | "license": [ 1476 | "BSD-3-Clause" 1477 | ], 1478 | "authors": [ 1479 | { 1480 | "name": "Sebastian Bergmann", 1481 | "email": "sebastian@phpunit.de", 1482 | "role": "lead" 1483 | } 1484 | ], 1485 | "description": "Collection of value objects that represent the PHP code units", 1486 | "homepage": "https://github.com/sebastianbergmann/code-unit", 1487 | "support": { 1488 | "issues": "https://github.com/sebastianbergmann/code-unit/issues", 1489 | "security": "https://github.com/sebastianbergmann/code-unit/security/policy", 1490 | "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.2" 1491 | }, 1492 | "funding": [ 1493 | { 1494 | "url": "https://github.com/sebastianbergmann", 1495 | "type": "github" 1496 | } 1497 | ], 1498 | "time": "2024-12-12T09:59:06+00:00" 1499 | }, 1500 | { 1501 | "name": "sebastian/code-unit-reverse-lookup", 1502 | "version": "4.0.1", 1503 | "source": { 1504 | "type": "git", 1505 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 1506 | "reference": "183a9b2632194febd219bb9246eee421dad8d45e" 1507 | }, 1508 | "dist": { 1509 | "type": "zip", 1510 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e", 1511 | "reference": "183a9b2632194febd219bb9246eee421dad8d45e", 1512 | "shasum": "" 1513 | }, 1514 | "require": { 1515 | "php": ">=8.2" 1516 | }, 1517 | "require-dev": { 1518 | "phpunit/phpunit": "^11.0" 1519 | }, 1520 | "type": "library", 1521 | "extra": { 1522 | "branch-alias": { 1523 | "dev-main": "4.0-dev" 1524 | } 1525 | }, 1526 | "autoload": { 1527 | "classmap": [ 1528 | "src/" 1529 | ] 1530 | }, 1531 | "notification-url": "https://packagist.org/downloads/", 1532 | "license": [ 1533 | "BSD-3-Clause" 1534 | ], 1535 | "authors": [ 1536 | { 1537 | "name": "Sebastian Bergmann", 1538 | "email": "sebastian@phpunit.de" 1539 | } 1540 | ], 1541 | "description": "Looks up which function or method a line of code belongs to", 1542 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 1543 | "support": { 1544 | "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", 1545 | "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy", 1546 | "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.1" 1547 | }, 1548 | "funding": [ 1549 | { 1550 | "url": "https://github.com/sebastianbergmann", 1551 | "type": "github" 1552 | } 1553 | ], 1554 | "time": "2024-07-03T04:45:54+00:00" 1555 | }, 1556 | { 1557 | "name": "sebastian/comparator", 1558 | "version": "6.3.0", 1559 | "source": { 1560 | "type": "git", 1561 | "url": "https://github.com/sebastianbergmann/comparator.git", 1562 | "reference": "d4e47a769525c4dd38cea90e5dcd435ddbbc7115" 1563 | }, 1564 | "dist": { 1565 | "type": "zip", 1566 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/d4e47a769525c4dd38cea90e5dcd435ddbbc7115", 1567 | "reference": "d4e47a769525c4dd38cea90e5dcd435ddbbc7115", 1568 | "shasum": "" 1569 | }, 1570 | "require": { 1571 | "ext-dom": "*", 1572 | "ext-mbstring": "*", 1573 | "php": ">=8.2", 1574 | "sebastian/diff": "^6.0", 1575 | "sebastian/exporter": "^6.0" 1576 | }, 1577 | "require-dev": { 1578 | "phpunit/phpunit": "^11.4" 1579 | }, 1580 | "suggest": { 1581 | "ext-bcmath": "For comparing BcMath\\Number objects" 1582 | }, 1583 | "type": "library", 1584 | "extra": { 1585 | "branch-alias": { 1586 | "dev-main": "6.2-dev" 1587 | } 1588 | }, 1589 | "autoload": { 1590 | "classmap": [ 1591 | "src/" 1592 | ] 1593 | }, 1594 | "notification-url": "https://packagist.org/downloads/", 1595 | "license": [ 1596 | "BSD-3-Clause" 1597 | ], 1598 | "authors": [ 1599 | { 1600 | "name": "Sebastian Bergmann", 1601 | "email": "sebastian@phpunit.de" 1602 | }, 1603 | { 1604 | "name": "Jeff Welch", 1605 | "email": "whatthejeff@gmail.com" 1606 | }, 1607 | { 1608 | "name": "Volker Dusch", 1609 | "email": "github@wallbash.com" 1610 | }, 1611 | { 1612 | "name": "Bernhard Schussek", 1613 | "email": "bschussek@2bepublished.at" 1614 | } 1615 | ], 1616 | "description": "Provides the functionality to compare PHP values for equality", 1617 | "homepage": "https://github.com/sebastianbergmann/comparator", 1618 | "keywords": [ 1619 | "comparator", 1620 | "compare", 1621 | "equality" 1622 | ], 1623 | "support": { 1624 | "issues": "https://github.com/sebastianbergmann/comparator/issues", 1625 | "security": "https://github.com/sebastianbergmann/comparator/security/policy", 1626 | "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.0" 1627 | }, 1628 | "funding": [ 1629 | { 1630 | "url": "https://github.com/sebastianbergmann", 1631 | "type": "github" 1632 | } 1633 | ], 1634 | "time": "2025-01-06T10:28:19+00:00" 1635 | }, 1636 | { 1637 | "name": "sebastian/complexity", 1638 | "version": "4.0.1", 1639 | "source": { 1640 | "type": "git", 1641 | "url": "https://github.com/sebastianbergmann/complexity.git", 1642 | "reference": "ee41d384ab1906c68852636b6de493846e13e5a0" 1643 | }, 1644 | "dist": { 1645 | "type": "zip", 1646 | "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0", 1647 | "reference": "ee41d384ab1906c68852636b6de493846e13e5a0", 1648 | "shasum": "" 1649 | }, 1650 | "require": { 1651 | "nikic/php-parser": "^5.0", 1652 | "php": ">=8.2" 1653 | }, 1654 | "require-dev": { 1655 | "phpunit/phpunit": "^11.0" 1656 | }, 1657 | "type": "library", 1658 | "extra": { 1659 | "branch-alias": { 1660 | "dev-main": "4.0-dev" 1661 | } 1662 | }, 1663 | "autoload": { 1664 | "classmap": [ 1665 | "src/" 1666 | ] 1667 | }, 1668 | "notification-url": "https://packagist.org/downloads/", 1669 | "license": [ 1670 | "BSD-3-Clause" 1671 | ], 1672 | "authors": [ 1673 | { 1674 | "name": "Sebastian Bergmann", 1675 | "email": "sebastian@phpunit.de", 1676 | "role": "lead" 1677 | } 1678 | ], 1679 | "description": "Library for calculating the complexity of PHP code units", 1680 | "homepage": "https://github.com/sebastianbergmann/complexity", 1681 | "support": { 1682 | "issues": "https://github.com/sebastianbergmann/complexity/issues", 1683 | "security": "https://github.com/sebastianbergmann/complexity/security/policy", 1684 | "source": "https://github.com/sebastianbergmann/complexity/tree/4.0.1" 1685 | }, 1686 | "funding": [ 1687 | { 1688 | "url": "https://github.com/sebastianbergmann", 1689 | "type": "github" 1690 | } 1691 | ], 1692 | "time": "2024-07-03T04:49:50+00:00" 1693 | }, 1694 | { 1695 | "name": "sebastian/diff", 1696 | "version": "6.0.2", 1697 | "source": { 1698 | "type": "git", 1699 | "url": "https://github.com/sebastianbergmann/diff.git", 1700 | "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544" 1701 | }, 1702 | "dist": { 1703 | "type": "zip", 1704 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544", 1705 | "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544", 1706 | "shasum": "" 1707 | }, 1708 | "require": { 1709 | "php": ">=8.2" 1710 | }, 1711 | "require-dev": { 1712 | "phpunit/phpunit": "^11.0", 1713 | "symfony/process": "^4.2 || ^5" 1714 | }, 1715 | "type": "library", 1716 | "extra": { 1717 | "branch-alias": { 1718 | "dev-main": "6.0-dev" 1719 | } 1720 | }, 1721 | "autoload": { 1722 | "classmap": [ 1723 | "src/" 1724 | ] 1725 | }, 1726 | "notification-url": "https://packagist.org/downloads/", 1727 | "license": [ 1728 | "BSD-3-Clause" 1729 | ], 1730 | "authors": [ 1731 | { 1732 | "name": "Sebastian Bergmann", 1733 | "email": "sebastian@phpunit.de" 1734 | }, 1735 | { 1736 | "name": "Kore Nordmann", 1737 | "email": "mail@kore-nordmann.de" 1738 | } 1739 | ], 1740 | "description": "Diff implementation", 1741 | "homepage": "https://github.com/sebastianbergmann/diff", 1742 | "keywords": [ 1743 | "diff", 1744 | "udiff", 1745 | "unidiff", 1746 | "unified diff" 1747 | ], 1748 | "support": { 1749 | "issues": "https://github.com/sebastianbergmann/diff/issues", 1750 | "security": "https://github.com/sebastianbergmann/diff/security/policy", 1751 | "source": "https://github.com/sebastianbergmann/diff/tree/6.0.2" 1752 | }, 1753 | "funding": [ 1754 | { 1755 | "url": "https://github.com/sebastianbergmann", 1756 | "type": "github" 1757 | } 1758 | ], 1759 | "time": "2024-07-03T04:53:05+00:00" 1760 | }, 1761 | { 1762 | "name": "sebastian/environment", 1763 | "version": "7.2.0", 1764 | "source": { 1765 | "type": "git", 1766 | "url": "https://github.com/sebastianbergmann/environment.git", 1767 | "reference": "855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5" 1768 | }, 1769 | "dist": { 1770 | "type": "zip", 1771 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5", 1772 | "reference": "855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5", 1773 | "shasum": "" 1774 | }, 1775 | "require": { 1776 | "php": ">=8.2" 1777 | }, 1778 | "require-dev": { 1779 | "phpunit/phpunit": "^11.0" 1780 | }, 1781 | "suggest": { 1782 | "ext-posix": "*" 1783 | }, 1784 | "type": "library", 1785 | "extra": { 1786 | "branch-alias": { 1787 | "dev-main": "7.2-dev" 1788 | } 1789 | }, 1790 | "autoload": { 1791 | "classmap": [ 1792 | "src/" 1793 | ] 1794 | }, 1795 | "notification-url": "https://packagist.org/downloads/", 1796 | "license": [ 1797 | "BSD-3-Clause" 1798 | ], 1799 | "authors": [ 1800 | { 1801 | "name": "Sebastian Bergmann", 1802 | "email": "sebastian@phpunit.de" 1803 | } 1804 | ], 1805 | "description": "Provides functionality to handle HHVM/PHP environments", 1806 | "homepage": "https://github.com/sebastianbergmann/environment", 1807 | "keywords": [ 1808 | "Xdebug", 1809 | "environment", 1810 | "hhvm" 1811 | ], 1812 | "support": { 1813 | "issues": "https://github.com/sebastianbergmann/environment/issues", 1814 | "security": "https://github.com/sebastianbergmann/environment/security/policy", 1815 | "source": "https://github.com/sebastianbergmann/environment/tree/7.2.0" 1816 | }, 1817 | "funding": [ 1818 | { 1819 | "url": "https://github.com/sebastianbergmann", 1820 | "type": "github" 1821 | } 1822 | ], 1823 | "time": "2024-07-03T04:54:44+00:00" 1824 | }, 1825 | { 1826 | "name": "sebastian/exporter", 1827 | "version": "6.3.0", 1828 | "source": { 1829 | "type": "git", 1830 | "url": "https://github.com/sebastianbergmann/exporter.git", 1831 | "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3" 1832 | }, 1833 | "dist": { 1834 | "type": "zip", 1835 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/3473f61172093b2da7de1fb5782e1f24cc036dc3", 1836 | "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3", 1837 | "shasum": "" 1838 | }, 1839 | "require": { 1840 | "ext-mbstring": "*", 1841 | "php": ">=8.2", 1842 | "sebastian/recursion-context": "^6.0" 1843 | }, 1844 | "require-dev": { 1845 | "phpunit/phpunit": "^11.3" 1846 | }, 1847 | "type": "library", 1848 | "extra": { 1849 | "branch-alias": { 1850 | "dev-main": "6.1-dev" 1851 | } 1852 | }, 1853 | "autoload": { 1854 | "classmap": [ 1855 | "src/" 1856 | ] 1857 | }, 1858 | "notification-url": "https://packagist.org/downloads/", 1859 | "license": [ 1860 | "BSD-3-Clause" 1861 | ], 1862 | "authors": [ 1863 | { 1864 | "name": "Sebastian Bergmann", 1865 | "email": "sebastian@phpunit.de" 1866 | }, 1867 | { 1868 | "name": "Jeff Welch", 1869 | "email": "whatthejeff@gmail.com" 1870 | }, 1871 | { 1872 | "name": "Volker Dusch", 1873 | "email": "github@wallbash.com" 1874 | }, 1875 | { 1876 | "name": "Adam Harvey", 1877 | "email": "aharvey@php.net" 1878 | }, 1879 | { 1880 | "name": "Bernhard Schussek", 1881 | "email": "bschussek@gmail.com" 1882 | } 1883 | ], 1884 | "description": "Provides the functionality to export PHP variables for visualization", 1885 | "homepage": "https://www.github.com/sebastianbergmann/exporter", 1886 | "keywords": [ 1887 | "export", 1888 | "exporter" 1889 | ], 1890 | "support": { 1891 | "issues": "https://github.com/sebastianbergmann/exporter/issues", 1892 | "security": "https://github.com/sebastianbergmann/exporter/security/policy", 1893 | "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.0" 1894 | }, 1895 | "funding": [ 1896 | { 1897 | "url": "https://github.com/sebastianbergmann", 1898 | "type": "github" 1899 | } 1900 | ], 1901 | "time": "2024-12-05T09:17:50+00:00" 1902 | }, 1903 | { 1904 | "name": "sebastian/global-state", 1905 | "version": "7.0.2", 1906 | "source": { 1907 | "type": "git", 1908 | "url": "https://github.com/sebastianbergmann/global-state.git", 1909 | "reference": "3be331570a721f9a4b5917f4209773de17f747d7" 1910 | }, 1911 | "dist": { 1912 | "type": "zip", 1913 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7", 1914 | "reference": "3be331570a721f9a4b5917f4209773de17f747d7", 1915 | "shasum": "" 1916 | }, 1917 | "require": { 1918 | "php": ">=8.2", 1919 | "sebastian/object-reflector": "^4.0", 1920 | "sebastian/recursion-context": "^6.0" 1921 | }, 1922 | "require-dev": { 1923 | "ext-dom": "*", 1924 | "phpunit/phpunit": "^11.0" 1925 | }, 1926 | "type": "library", 1927 | "extra": { 1928 | "branch-alias": { 1929 | "dev-main": "7.0-dev" 1930 | } 1931 | }, 1932 | "autoload": { 1933 | "classmap": [ 1934 | "src/" 1935 | ] 1936 | }, 1937 | "notification-url": "https://packagist.org/downloads/", 1938 | "license": [ 1939 | "BSD-3-Clause" 1940 | ], 1941 | "authors": [ 1942 | { 1943 | "name": "Sebastian Bergmann", 1944 | "email": "sebastian@phpunit.de" 1945 | } 1946 | ], 1947 | "description": "Snapshotting of global state", 1948 | "homepage": "https://www.github.com/sebastianbergmann/global-state", 1949 | "keywords": [ 1950 | "global state" 1951 | ], 1952 | "support": { 1953 | "issues": "https://github.com/sebastianbergmann/global-state/issues", 1954 | "security": "https://github.com/sebastianbergmann/global-state/security/policy", 1955 | "source": "https://github.com/sebastianbergmann/global-state/tree/7.0.2" 1956 | }, 1957 | "funding": [ 1958 | { 1959 | "url": "https://github.com/sebastianbergmann", 1960 | "type": "github" 1961 | } 1962 | ], 1963 | "time": "2024-07-03T04:57:36+00:00" 1964 | }, 1965 | { 1966 | "name": "sebastian/lines-of-code", 1967 | "version": "3.0.1", 1968 | "source": { 1969 | "type": "git", 1970 | "url": "https://github.com/sebastianbergmann/lines-of-code.git", 1971 | "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a" 1972 | }, 1973 | "dist": { 1974 | "type": "zip", 1975 | "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a", 1976 | "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a", 1977 | "shasum": "" 1978 | }, 1979 | "require": { 1980 | "nikic/php-parser": "^5.0", 1981 | "php": ">=8.2" 1982 | }, 1983 | "require-dev": { 1984 | "phpunit/phpunit": "^11.0" 1985 | }, 1986 | "type": "library", 1987 | "extra": { 1988 | "branch-alias": { 1989 | "dev-main": "3.0-dev" 1990 | } 1991 | }, 1992 | "autoload": { 1993 | "classmap": [ 1994 | "src/" 1995 | ] 1996 | }, 1997 | "notification-url": "https://packagist.org/downloads/", 1998 | "license": [ 1999 | "BSD-3-Clause" 2000 | ], 2001 | "authors": [ 2002 | { 2003 | "name": "Sebastian Bergmann", 2004 | "email": "sebastian@phpunit.de", 2005 | "role": "lead" 2006 | } 2007 | ], 2008 | "description": "Library for counting the lines of code in PHP source code", 2009 | "homepage": "https://github.com/sebastianbergmann/lines-of-code", 2010 | "support": { 2011 | "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", 2012 | "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", 2013 | "source": "https://github.com/sebastianbergmann/lines-of-code/tree/3.0.1" 2014 | }, 2015 | "funding": [ 2016 | { 2017 | "url": "https://github.com/sebastianbergmann", 2018 | "type": "github" 2019 | } 2020 | ], 2021 | "time": "2024-07-03T04:58:38+00:00" 2022 | }, 2023 | { 2024 | "name": "sebastian/object-enumerator", 2025 | "version": "6.0.1", 2026 | "source": { 2027 | "type": "git", 2028 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 2029 | "reference": "f5b498e631a74204185071eb41f33f38d64608aa" 2030 | }, 2031 | "dist": { 2032 | "type": "zip", 2033 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa", 2034 | "reference": "f5b498e631a74204185071eb41f33f38d64608aa", 2035 | "shasum": "" 2036 | }, 2037 | "require": { 2038 | "php": ">=8.2", 2039 | "sebastian/object-reflector": "^4.0", 2040 | "sebastian/recursion-context": "^6.0" 2041 | }, 2042 | "require-dev": { 2043 | "phpunit/phpunit": "^11.0" 2044 | }, 2045 | "type": "library", 2046 | "extra": { 2047 | "branch-alias": { 2048 | "dev-main": "6.0-dev" 2049 | } 2050 | }, 2051 | "autoload": { 2052 | "classmap": [ 2053 | "src/" 2054 | ] 2055 | }, 2056 | "notification-url": "https://packagist.org/downloads/", 2057 | "license": [ 2058 | "BSD-3-Clause" 2059 | ], 2060 | "authors": [ 2061 | { 2062 | "name": "Sebastian Bergmann", 2063 | "email": "sebastian@phpunit.de" 2064 | } 2065 | ], 2066 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 2067 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 2068 | "support": { 2069 | "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", 2070 | "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", 2071 | "source": "https://github.com/sebastianbergmann/object-enumerator/tree/6.0.1" 2072 | }, 2073 | "funding": [ 2074 | { 2075 | "url": "https://github.com/sebastianbergmann", 2076 | "type": "github" 2077 | } 2078 | ], 2079 | "time": "2024-07-03T05:00:13+00:00" 2080 | }, 2081 | { 2082 | "name": "sebastian/object-reflector", 2083 | "version": "4.0.1", 2084 | "source": { 2085 | "type": "git", 2086 | "url": "https://github.com/sebastianbergmann/object-reflector.git", 2087 | "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9" 2088 | }, 2089 | "dist": { 2090 | "type": "zip", 2091 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9", 2092 | "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9", 2093 | "shasum": "" 2094 | }, 2095 | "require": { 2096 | "php": ">=8.2" 2097 | }, 2098 | "require-dev": { 2099 | "phpunit/phpunit": "^11.0" 2100 | }, 2101 | "type": "library", 2102 | "extra": { 2103 | "branch-alias": { 2104 | "dev-main": "4.0-dev" 2105 | } 2106 | }, 2107 | "autoload": { 2108 | "classmap": [ 2109 | "src/" 2110 | ] 2111 | }, 2112 | "notification-url": "https://packagist.org/downloads/", 2113 | "license": [ 2114 | "BSD-3-Clause" 2115 | ], 2116 | "authors": [ 2117 | { 2118 | "name": "Sebastian Bergmann", 2119 | "email": "sebastian@phpunit.de" 2120 | } 2121 | ], 2122 | "description": "Allows reflection of object attributes, including inherited and non-public ones", 2123 | "homepage": "https://github.com/sebastianbergmann/object-reflector/", 2124 | "support": { 2125 | "issues": "https://github.com/sebastianbergmann/object-reflector/issues", 2126 | "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", 2127 | "source": "https://github.com/sebastianbergmann/object-reflector/tree/4.0.1" 2128 | }, 2129 | "funding": [ 2130 | { 2131 | "url": "https://github.com/sebastianbergmann", 2132 | "type": "github" 2133 | } 2134 | ], 2135 | "time": "2024-07-03T05:01:32+00:00" 2136 | }, 2137 | { 2138 | "name": "sebastian/recursion-context", 2139 | "version": "6.0.2", 2140 | "source": { 2141 | "type": "git", 2142 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 2143 | "reference": "694d156164372abbd149a4b85ccda2e4670c0e16" 2144 | }, 2145 | "dist": { 2146 | "type": "zip", 2147 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/694d156164372abbd149a4b85ccda2e4670c0e16", 2148 | "reference": "694d156164372abbd149a4b85ccda2e4670c0e16", 2149 | "shasum": "" 2150 | }, 2151 | "require": { 2152 | "php": ">=8.2" 2153 | }, 2154 | "require-dev": { 2155 | "phpunit/phpunit": "^11.0" 2156 | }, 2157 | "type": "library", 2158 | "extra": { 2159 | "branch-alias": { 2160 | "dev-main": "6.0-dev" 2161 | } 2162 | }, 2163 | "autoload": { 2164 | "classmap": [ 2165 | "src/" 2166 | ] 2167 | }, 2168 | "notification-url": "https://packagist.org/downloads/", 2169 | "license": [ 2170 | "BSD-3-Clause" 2171 | ], 2172 | "authors": [ 2173 | { 2174 | "name": "Sebastian Bergmann", 2175 | "email": "sebastian@phpunit.de" 2176 | }, 2177 | { 2178 | "name": "Jeff Welch", 2179 | "email": "whatthejeff@gmail.com" 2180 | }, 2181 | { 2182 | "name": "Adam Harvey", 2183 | "email": "aharvey@php.net" 2184 | } 2185 | ], 2186 | "description": "Provides functionality to recursively process PHP variables", 2187 | "homepage": "https://github.com/sebastianbergmann/recursion-context", 2188 | "support": { 2189 | "issues": "https://github.com/sebastianbergmann/recursion-context/issues", 2190 | "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", 2191 | "source": "https://github.com/sebastianbergmann/recursion-context/tree/6.0.2" 2192 | }, 2193 | "funding": [ 2194 | { 2195 | "url": "https://github.com/sebastianbergmann", 2196 | "type": "github" 2197 | } 2198 | ], 2199 | "time": "2024-07-03T05:10:34+00:00" 2200 | }, 2201 | { 2202 | "name": "sebastian/type", 2203 | "version": "5.1.0", 2204 | "source": { 2205 | "type": "git", 2206 | "url": "https://github.com/sebastianbergmann/type.git", 2207 | "reference": "461b9c5da241511a2a0e8f240814fb23ce5c0aac" 2208 | }, 2209 | "dist": { 2210 | "type": "zip", 2211 | "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/461b9c5da241511a2a0e8f240814fb23ce5c0aac", 2212 | "reference": "461b9c5da241511a2a0e8f240814fb23ce5c0aac", 2213 | "shasum": "" 2214 | }, 2215 | "require": { 2216 | "php": ">=8.2" 2217 | }, 2218 | "require-dev": { 2219 | "phpunit/phpunit": "^11.3" 2220 | }, 2221 | "type": "library", 2222 | "extra": { 2223 | "branch-alias": { 2224 | "dev-main": "5.1-dev" 2225 | } 2226 | }, 2227 | "autoload": { 2228 | "classmap": [ 2229 | "src/" 2230 | ] 2231 | }, 2232 | "notification-url": "https://packagist.org/downloads/", 2233 | "license": [ 2234 | "BSD-3-Clause" 2235 | ], 2236 | "authors": [ 2237 | { 2238 | "name": "Sebastian Bergmann", 2239 | "email": "sebastian@phpunit.de", 2240 | "role": "lead" 2241 | } 2242 | ], 2243 | "description": "Collection of value objects that represent the types of the PHP type system", 2244 | "homepage": "https://github.com/sebastianbergmann/type", 2245 | "support": { 2246 | "issues": "https://github.com/sebastianbergmann/type/issues", 2247 | "security": "https://github.com/sebastianbergmann/type/security/policy", 2248 | "source": "https://github.com/sebastianbergmann/type/tree/5.1.0" 2249 | }, 2250 | "funding": [ 2251 | { 2252 | "url": "https://github.com/sebastianbergmann", 2253 | "type": "github" 2254 | } 2255 | ], 2256 | "time": "2024-09-17T13:12:04+00:00" 2257 | }, 2258 | { 2259 | "name": "sebastian/version", 2260 | "version": "5.0.2", 2261 | "source": { 2262 | "type": "git", 2263 | "url": "https://github.com/sebastianbergmann/version.git", 2264 | "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874" 2265 | }, 2266 | "dist": { 2267 | "type": "zip", 2268 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874", 2269 | "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874", 2270 | "shasum": "" 2271 | }, 2272 | "require": { 2273 | "php": ">=8.2" 2274 | }, 2275 | "type": "library", 2276 | "extra": { 2277 | "branch-alias": { 2278 | "dev-main": "5.0-dev" 2279 | } 2280 | }, 2281 | "autoload": { 2282 | "classmap": [ 2283 | "src/" 2284 | ] 2285 | }, 2286 | "notification-url": "https://packagist.org/downloads/", 2287 | "license": [ 2288 | "BSD-3-Clause" 2289 | ], 2290 | "authors": [ 2291 | { 2292 | "name": "Sebastian Bergmann", 2293 | "email": "sebastian@phpunit.de", 2294 | "role": "lead" 2295 | } 2296 | ], 2297 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 2298 | "homepage": "https://github.com/sebastianbergmann/version", 2299 | "support": { 2300 | "issues": "https://github.com/sebastianbergmann/version/issues", 2301 | "security": "https://github.com/sebastianbergmann/version/security/policy", 2302 | "source": "https://github.com/sebastianbergmann/version/tree/5.0.2" 2303 | }, 2304 | "funding": [ 2305 | { 2306 | "url": "https://github.com/sebastianbergmann", 2307 | "type": "github" 2308 | } 2309 | ], 2310 | "time": "2024-10-09T05:16:32+00:00" 2311 | }, 2312 | { 2313 | "name": "squizlabs/php_codesniffer", 2314 | "version": "3.13.0", 2315 | "source": { 2316 | "type": "git", 2317 | "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", 2318 | "reference": "65ff2489553b83b4597e89c3b8b721487011d186" 2319 | }, 2320 | "dist": { 2321 | "type": "zip", 2322 | "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/65ff2489553b83b4597e89c3b8b721487011d186", 2323 | "reference": "65ff2489553b83b4597e89c3b8b721487011d186", 2324 | "shasum": "" 2325 | }, 2326 | "require": { 2327 | "ext-simplexml": "*", 2328 | "ext-tokenizer": "*", 2329 | "ext-xmlwriter": "*", 2330 | "php": ">=5.4.0" 2331 | }, 2332 | "require-dev": { 2333 | "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" 2334 | }, 2335 | "bin": [ 2336 | "bin/phpcbf", 2337 | "bin/phpcs" 2338 | ], 2339 | "type": "library", 2340 | "extra": { 2341 | "branch-alias": { 2342 | "dev-master": "3.x-dev" 2343 | } 2344 | }, 2345 | "notification-url": "https://packagist.org/downloads/", 2346 | "license": [ 2347 | "BSD-3-Clause" 2348 | ], 2349 | "authors": [ 2350 | { 2351 | "name": "Greg Sherwood", 2352 | "role": "Former lead" 2353 | }, 2354 | { 2355 | "name": "Juliette Reinders Folmer", 2356 | "role": "Current lead" 2357 | }, 2358 | { 2359 | "name": "Contributors", 2360 | "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" 2361 | } 2362 | ], 2363 | "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", 2364 | "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", 2365 | "keywords": [ 2366 | "phpcs", 2367 | "standards", 2368 | "static analysis" 2369 | ], 2370 | "support": { 2371 | "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", 2372 | "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", 2373 | "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", 2374 | "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" 2375 | }, 2376 | "funding": [ 2377 | { 2378 | "url": "https://github.com/PHPCSStandards", 2379 | "type": "github" 2380 | }, 2381 | { 2382 | "url": "https://github.com/jrfnl", 2383 | "type": "github" 2384 | }, 2385 | { 2386 | "url": "https://opencollective.com/php_codesniffer", 2387 | "type": "open_collective" 2388 | }, 2389 | { 2390 | "url": "https://thanks.dev/u/gh/phpcsstandards", 2391 | "type": "thanks_dev" 2392 | } 2393 | ], 2394 | "time": "2025-05-11T03:36:00+00:00" 2395 | }, 2396 | { 2397 | "name": "staabm/side-effects-detector", 2398 | "version": "1.0.5", 2399 | "source": { 2400 | "type": "git", 2401 | "url": "https://github.com/staabm/side-effects-detector.git", 2402 | "reference": "d8334211a140ce329c13726d4a715adbddd0a163" 2403 | }, 2404 | "dist": { 2405 | "type": "zip", 2406 | "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", 2407 | "reference": "d8334211a140ce329c13726d4a715adbddd0a163", 2408 | "shasum": "" 2409 | }, 2410 | "require": { 2411 | "ext-tokenizer": "*", 2412 | "php": "^7.4 || ^8.0" 2413 | }, 2414 | "require-dev": { 2415 | "phpstan/extension-installer": "^1.4.3", 2416 | "phpstan/phpstan": "^1.12.6", 2417 | "phpunit/phpunit": "^9.6.21", 2418 | "symfony/var-dumper": "^5.4.43", 2419 | "tomasvotruba/type-coverage": "1.0.0", 2420 | "tomasvotruba/unused-public": "1.0.0" 2421 | }, 2422 | "type": "library", 2423 | "autoload": { 2424 | "classmap": [ 2425 | "lib/" 2426 | ] 2427 | }, 2428 | "notification-url": "https://packagist.org/downloads/", 2429 | "license": [ 2430 | "MIT" 2431 | ], 2432 | "description": "A static analysis tool to detect side effects in PHP code", 2433 | "keywords": [ 2434 | "static analysis" 2435 | ], 2436 | "support": { 2437 | "issues": "https://github.com/staabm/side-effects-detector/issues", 2438 | "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" 2439 | }, 2440 | "funding": [ 2441 | { 2442 | "url": "https://github.com/staabm", 2443 | "type": "github" 2444 | } 2445 | ], 2446 | "time": "2024-10-20T05:08:20+00:00" 2447 | }, 2448 | { 2449 | "name": "symfony/config", 2450 | "version": "v7.3.0", 2451 | "source": { 2452 | "type": "git", 2453 | "url": "https://github.com/symfony/config.git", 2454 | "reference": "ba62ae565f1327c2f6366726312ed828c85853bc" 2455 | }, 2456 | "dist": { 2457 | "type": "zip", 2458 | "url": "https://api.github.com/repos/symfony/config/zipball/ba62ae565f1327c2f6366726312ed828c85853bc", 2459 | "reference": "ba62ae565f1327c2f6366726312ed828c85853bc", 2460 | "shasum": "" 2461 | }, 2462 | "require": { 2463 | "php": ">=8.2", 2464 | "symfony/deprecation-contracts": "^2.5|^3", 2465 | "symfony/filesystem": "^7.1", 2466 | "symfony/polyfill-ctype": "~1.8" 2467 | }, 2468 | "conflict": { 2469 | "symfony/finder": "<6.4", 2470 | "symfony/service-contracts": "<2.5" 2471 | }, 2472 | "require-dev": { 2473 | "symfony/event-dispatcher": "^6.4|^7.0", 2474 | "symfony/finder": "^6.4|^7.0", 2475 | "symfony/messenger": "^6.4|^7.0", 2476 | "symfony/service-contracts": "^2.5|^3", 2477 | "symfony/yaml": "^6.4|^7.0" 2478 | }, 2479 | "type": "library", 2480 | "autoload": { 2481 | "psr-4": { 2482 | "Symfony\\Component\\Config\\": "" 2483 | }, 2484 | "exclude-from-classmap": [ 2485 | "/Tests/" 2486 | ] 2487 | }, 2488 | "notification-url": "https://packagist.org/downloads/", 2489 | "license": [ 2490 | "MIT" 2491 | ], 2492 | "authors": [ 2493 | { 2494 | "name": "Fabien Potencier", 2495 | "email": "fabien@symfony.com" 2496 | }, 2497 | { 2498 | "name": "Symfony Community", 2499 | "homepage": "https://symfony.com/contributors" 2500 | } 2501 | ], 2502 | "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", 2503 | "homepage": "https://symfony.com", 2504 | "support": { 2505 | "source": "https://github.com/symfony/config/tree/v7.3.0" 2506 | }, 2507 | "funding": [ 2508 | { 2509 | "url": "https://symfony.com/sponsor", 2510 | "type": "custom" 2511 | }, 2512 | { 2513 | "url": "https://github.com/fabpot", 2514 | "type": "github" 2515 | }, 2516 | { 2517 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2518 | "type": "tidelift" 2519 | } 2520 | ], 2521 | "time": "2025-05-15T09:04:05+00:00" 2522 | }, 2523 | { 2524 | "name": "symfony/console", 2525 | "version": "v7.3.0", 2526 | "source": { 2527 | "type": "git", 2528 | "url": "https://github.com/symfony/console.git", 2529 | "reference": "66c1440edf6f339fd82ed6c7caa76cb006211b44" 2530 | }, 2531 | "dist": { 2532 | "type": "zip", 2533 | "url": "https://api.github.com/repos/symfony/console/zipball/66c1440edf6f339fd82ed6c7caa76cb006211b44", 2534 | "reference": "66c1440edf6f339fd82ed6c7caa76cb006211b44", 2535 | "shasum": "" 2536 | }, 2537 | "require": { 2538 | "php": ">=8.2", 2539 | "symfony/deprecation-contracts": "^2.5|^3", 2540 | "symfony/polyfill-mbstring": "~1.0", 2541 | "symfony/service-contracts": "^2.5|^3", 2542 | "symfony/string": "^7.2" 2543 | }, 2544 | "conflict": { 2545 | "symfony/dependency-injection": "<6.4", 2546 | "symfony/dotenv": "<6.4", 2547 | "symfony/event-dispatcher": "<6.4", 2548 | "symfony/lock": "<6.4", 2549 | "symfony/process": "<6.4" 2550 | }, 2551 | "provide": { 2552 | "psr/log-implementation": "1.0|2.0|3.0" 2553 | }, 2554 | "require-dev": { 2555 | "psr/log": "^1|^2|^3", 2556 | "symfony/config": "^6.4|^7.0", 2557 | "symfony/dependency-injection": "^6.4|^7.0", 2558 | "symfony/event-dispatcher": "^6.4|^7.0", 2559 | "symfony/http-foundation": "^6.4|^7.0", 2560 | "symfony/http-kernel": "^6.4|^7.0", 2561 | "symfony/lock": "^6.4|^7.0", 2562 | "symfony/messenger": "^6.4|^7.0", 2563 | "symfony/process": "^6.4|^7.0", 2564 | "symfony/stopwatch": "^6.4|^7.0", 2565 | "symfony/var-dumper": "^6.4|^7.0" 2566 | }, 2567 | "type": "library", 2568 | "autoload": { 2569 | "psr-4": { 2570 | "Symfony\\Component\\Console\\": "" 2571 | }, 2572 | "exclude-from-classmap": [ 2573 | "/Tests/" 2574 | ] 2575 | }, 2576 | "notification-url": "https://packagist.org/downloads/", 2577 | "license": [ 2578 | "MIT" 2579 | ], 2580 | "authors": [ 2581 | { 2582 | "name": "Fabien Potencier", 2583 | "email": "fabien@symfony.com" 2584 | }, 2585 | { 2586 | "name": "Symfony Community", 2587 | "homepage": "https://symfony.com/contributors" 2588 | } 2589 | ], 2590 | "description": "Eases the creation of beautiful and testable command line interfaces", 2591 | "homepage": "https://symfony.com", 2592 | "keywords": [ 2593 | "cli", 2594 | "command-line", 2595 | "console", 2596 | "terminal" 2597 | ], 2598 | "support": { 2599 | "source": "https://github.com/symfony/console/tree/v7.3.0" 2600 | }, 2601 | "funding": [ 2602 | { 2603 | "url": "https://symfony.com/sponsor", 2604 | "type": "custom" 2605 | }, 2606 | { 2607 | "url": "https://github.com/fabpot", 2608 | "type": "github" 2609 | }, 2610 | { 2611 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2612 | "type": "tidelift" 2613 | } 2614 | ], 2615 | "time": "2025-05-24T10:34:04+00:00" 2616 | }, 2617 | { 2618 | "name": "symfony/deprecation-contracts", 2619 | "version": "v3.6.0", 2620 | "source": { 2621 | "type": "git", 2622 | "url": "https://github.com/symfony/deprecation-contracts.git", 2623 | "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" 2624 | }, 2625 | "dist": { 2626 | "type": "zip", 2627 | "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", 2628 | "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", 2629 | "shasum": "" 2630 | }, 2631 | "require": { 2632 | "php": ">=8.1" 2633 | }, 2634 | "type": "library", 2635 | "extra": { 2636 | "thanks": { 2637 | "url": "https://github.com/symfony/contracts", 2638 | "name": "symfony/contracts" 2639 | }, 2640 | "branch-alias": { 2641 | "dev-main": "3.6-dev" 2642 | } 2643 | }, 2644 | "autoload": { 2645 | "files": [ 2646 | "function.php" 2647 | ] 2648 | }, 2649 | "notification-url": "https://packagist.org/downloads/", 2650 | "license": [ 2651 | "MIT" 2652 | ], 2653 | "authors": [ 2654 | { 2655 | "name": "Nicolas Grekas", 2656 | "email": "p@tchwork.com" 2657 | }, 2658 | { 2659 | "name": "Symfony Community", 2660 | "homepage": "https://symfony.com/contributors" 2661 | } 2662 | ], 2663 | "description": "A generic function and convention to trigger deprecation notices", 2664 | "homepage": "https://symfony.com", 2665 | "support": { 2666 | "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" 2667 | }, 2668 | "funding": [ 2669 | { 2670 | "url": "https://symfony.com/sponsor", 2671 | "type": "custom" 2672 | }, 2673 | { 2674 | "url": "https://github.com/fabpot", 2675 | "type": "github" 2676 | }, 2677 | { 2678 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2679 | "type": "tidelift" 2680 | } 2681 | ], 2682 | "time": "2024-09-25T14:21:43+00:00" 2683 | }, 2684 | { 2685 | "name": "symfony/filesystem", 2686 | "version": "v7.3.0", 2687 | "source": { 2688 | "type": "git", 2689 | "url": "https://github.com/symfony/filesystem.git", 2690 | "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb" 2691 | }, 2692 | "dist": { 2693 | "type": "zip", 2694 | "url": "https://api.github.com/repos/symfony/filesystem/zipball/b8dce482de9d7c9fe2891155035a7248ab5c7fdb", 2695 | "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb", 2696 | "shasum": "" 2697 | }, 2698 | "require": { 2699 | "php": ">=8.2", 2700 | "symfony/polyfill-ctype": "~1.8", 2701 | "symfony/polyfill-mbstring": "~1.8" 2702 | }, 2703 | "require-dev": { 2704 | "symfony/process": "^6.4|^7.0" 2705 | }, 2706 | "type": "library", 2707 | "autoload": { 2708 | "psr-4": { 2709 | "Symfony\\Component\\Filesystem\\": "" 2710 | }, 2711 | "exclude-from-classmap": [ 2712 | "/Tests/" 2713 | ] 2714 | }, 2715 | "notification-url": "https://packagist.org/downloads/", 2716 | "license": [ 2717 | "MIT" 2718 | ], 2719 | "authors": [ 2720 | { 2721 | "name": "Fabien Potencier", 2722 | "email": "fabien@symfony.com" 2723 | }, 2724 | { 2725 | "name": "Symfony Community", 2726 | "homepage": "https://symfony.com/contributors" 2727 | } 2728 | ], 2729 | "description": "Provides basic utilities for the filesystem", 2730 | "homepage": "https://symfony.com", 2731 | "support": { 2732 | "source": "https://github.com/symfony/filesystem/tree/v7.3.0" 2733 | }, 2734 | "funding": [ 2735 | { 2736 | "url": "https://symfony.com/sponsor", 2737 | "type": "custom" 2738 | }, 2739 | { 2740 | "url": "https://github.com/fabpot", 2741 | "type": "github" 2742 | }, 2743 | { 2744 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2745 | "type": "tidelift" 2746 | } 2747 | ], 2748 | "time": "2024-10-25T15:15:23+00:00" 2749 | }, 2750 | { 2751 | "name": "symfony/polyfill-ctype", 2752 | "version": "v1.32.0", 2753 | "source": { 2754 | "type": "git", 2755 | "url": "https://github.com/symfony/polyfill-ctype.git", 2756 | "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" 2757 | }, 2758 | "dist": { 2759 | "type": "zip", 2760 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", 2761 | "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", 2762 | "shasum": "" 2763 | }, 2764 | "require": { 2765 | "php": ">=7.2" 2766 | }, 2767 | "provide": { 2768 | "ext-ctype": "*" 2769 | }, 2770 | "suggest": { 2771 | "ext-ctype": "For best performance" 2772 | }, 2773 | "type": "library", 2774 | "extra": { 2775 | "thanks": { 2776 | "url": "https://github.com/symfony/polyfill", 2777 | "name": "symfony/polyfill" 2778 | } 2779 | }, 2780 | "autoload": { 2781 | "files": [ 2782 | "bootstrap.php" 2783 | ], 2784 | "psr-4": { 2785 | "Symfony\\Polyfill\\Ctype\\": "" 2786 | } 2787 | }, 2788 | "notification-url": "https://packagist.org/downloads/", 2789 | "license": [ 2790 | "MIT" 2791 | ], 2792 | "authors": [ 2793 | { 2794 | "name": "Gert de Pagter", 2795 | "email": "BackEndTea@gmail.com" 2796 | }, 2797 | { 2798 | "name": "Symfony Community", 2799 | "homepage": "https://symfony.com/contributors" 2800 | } 2801 | ], 2802 | "description": "Symfony polyfill for ctype functions", 2803 | "homepage": "https://symfony.com", 2804 | "keywords": [ 2805 | "compatibility", 2806 | "ctype", 2807 | "polyfill", 2808 | "portable" 2809 | ], 2810 | "support": { 2811 | "source": "https://github.com/symfony/polyfill-ctype/tree/v1.32.0" 2812 | }, 2813 | "funding": [ 2814 | { 2815 | "url": "https://symfony.com/sponsor", 2816 | "type": "custom" 2817 | }, 2818 | { 2819 | "url": "https://github.com/fabpot", 2820 | "type": "github" 2821 | }, 2822 | { 2823 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2824 | "type": "tidelift" 2825 | } 2826 | ], 2827 | "time": "2024-09-09T11:45:10+00:00" 2828 | }, 2829 | { 2830 | "name": "symfony/polyfill-intl-grapheme", 2831 | "version": "v1.32.0", 2832 | "source": { 2833 | "type": "git", 2834 | "url": "https://github.com/symfony/polyfill-intl-grapheme.git", 2835 | "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" 2836 | }, 2837 | "dist": { 2838 | "type": "zip", 2839 | "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", 2840 | "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", 2841 | "shasum": "" 2842 | }, 2843 | "require": { 2844 | "php": ">=7.2" 2845 | }, 2846 | "suggest": { 2847 | "ext-intl": "For best performance" 2848 | }, 2849 | "type": "library", 2850 | "extra": { 2851 | "thanks": { 2852 | "url": "https://github.com/symfony/polyfill", 2853 | "name": "symfony/polyfill" 2854 | } 2855 | }, 2856 | "autoload": { 2857 | "files": [ 2858 | "bootstrap.php" 2859 | ], 2860 | "psr-4": { 2861 | "Symfony\\Polyfill\\Intl\\Grapheme\\": "" 2862 | } 2863 | }, 2864 | "notification-url": "https://packagist.org/downloads/", 2865 | "license": [ 2866 | "MIT" 2867 | ], 2868 | "authors": [ 2869 | { 2870 | "name": "Nicolas Grekas", 2871 | "email": "p@tchwork.com" 2872 | }, 2873 | { 2874 | "name": "Symfony Community", 2875 | "homepage": "https://symfony.com/contributors" 2876 | } 2877 | ], 2878 | "description": "Symfony polyfill for intl's grapheme_* functions", 2879 | "homepage": "https://symfony.com", 2880 | "keywords": [ 2881 | "compatibility", 2882 | "grapheme", 2883 | "intl", 2884 | "polyfill", 2885 | "portable", 2886 | "shim" 2887 | ], 2888 | "support": { 2889 | "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.32.0" 2890 | }, 2891 | "funding": [ 2892 | { 2893 | "url": "https://symfony.com/sponsor", 2894 | "type": "custom" 2895 | }, 2896 | { 2897 | "url": "https://github.com/fabpot", 2898 | "type": "github" 2899 | }, 2900 | { 2901 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2902 | "type": "tidelift" 2903 | } 2904 | ], 2905 | "time": "2024-09-09T11:45:10+00:00" 2906 | }, 2907 | { 2908 | "name": "symfony/polyfill-intl-normalizer", 2909 | "version": "v1.32.0", 2910 | "source": { 2911 | "type": "git", 2912 | "url": "https://github.com/symfony/polyfill-intl-normalizer.git", 2913 | "reference": "3833d7255cc303546435cb650316bff708a1c75c" 2914 | }, 2915 | "dist": { 2916 | "type": "zip", 2917 | "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", 2918 | "reference": "3833d7255cc303546435cb650316bff708a1c75c", 2919 | "shasum": "" 2920 | }, 2921 | "require": { 2922 | "php": ">=7.2" 2923 | }, 2924 | "suggest": { 2925 | "ext-intl": "For best performance" 2926 | }, 2927 | "type": "library", 2928 | "extra": { 2929 | "thanks": { 2930 | "url": "https://github.com/symfony/polyfill", 2931 | "name": "symfony/polyfill" 2932 | } 2933 | }, 2934 | "autoload": { 2935 | "files": [ 2936 | "bootstrap.php" 2937 | ], 2938 | "psr-4": { 2939 | "Symfony\\Polyfill\\Intl\\Normalizer\\": "" 2940 | }, 2941 | "classmap": [ 2942 | "Resources/stubs" 2943 | ] 2944 | }, 2945 | "notification-url": "https://packagist.org/downloads/", 2946 | "license": [ 2947 | "MIT" 2948 | ], 2949 | "authors": [ 2950 | { 2951 | "name": "Nicolas Grekas", 2952 | "email": "p@tchwork.com" 2953 | }, 2954 | { 2955 | "name": "Symfony Community", 2956 | "homepage": "https://symfony.com/contributors" 2957 | } 2958 | ], 2959 | "description": "Symfony polyfill for intl's Normalizer class and related functions", 2960 | "homepage": "https://symfony.com", 2961 | "keywords": [ 2962 | "compatibility", 2963 | "intl", 2964 | "normalizer", 2965 | "polyfill", 2966 | "portable", 2967 | "shim" 2968 | ], 2969 | "support": { 2970 | "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.32.0" 2971 | }, 2972 | "funding": [ 2973 | { 2974 | "url": "https://symfony.com/sponsor", 2975 | "type": "custom" 2976 | }, 2977 | { 2978 | "url": "https://github.com/fabpot", 2979 | "type": "github" 2980 | }, 2981 | { 2982 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2983 | "type": "tidelift" 2984 | } 2985 | ], 2986 | "time": "2024-09-09T11:45:10+00:00" 2987 | }, 2988 | { 2989 | "name": "symfony/polyfill-mbstring", 2990 | "version": "v1.32.0", 2991 | "source": { 2992 | "type": "git", 2993 | "url": "https://github.com/symfony/polyfill-mbstring.git", 2994 | "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" 2995 | }, 2996 | "dist": { 2997 | "type": "zip", 2998 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", 2999 | "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", 3000 | "shasum": "" 3001 | }, 3002 | "require": { 3003 | "ext-iconv": "*", 3004 | "php": ">=7.2" 3005 | }, 3006 | "provide": { 3007 | "ext-mbstring": "*" 3008 | }, 3009 | "suggest": { 3010 | "ext-mbstring": "For best performance" 3011 | }, 3012 | "type": "library", 3013 | "extra": { 3014 | "thanks": { 3015 | "url": "https://github.com/symfony/polyfill", 3016 | "name": "symfony/polyfill" 3017 | } 3018 | }, 3019 | "autoload": { 3020 | "files": [ 3021 | "bootstrap.php" 3022 | ], 3023 | "psr-4": { 3024 | "Symfony\\Polyfill\\Mbstring\\": "" 3025 | } 3026 | }, 3027 | "notification-url": "https://packagist.org/downloads/", 3028 | "license": [ 3029 | "MIT" 3030 | ], 3031 | "authors": [ 3032 | { 3033 | "name": "Nicolas Grekas", 3034 | "email": "p@tchwork.com" 3035 | }, 3036 | { 3037 | "name": "Symfony Community", 3038 | "homepage": "https://symfony.com/contributors" 3039 | } 3040 | ], 3041 | "description": "Symfony polyfill for the Mbstring extension", 3042 | "homepage": "https://symfony.com", 3043 | "keywords": [ 3044 | "compatibility", 3045 | "mbstring", 3046 | "polyfill", 3047 | "portable", 3048 | "shim" 3049 | ], 3050 | "support": { 3051 | "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.32.0" 3052 | }, 3053 | "funding": [ 3054 | { 3055 | "url": "https://symfony.com/sponsor", 3056 | "type": "custom" 3057 | }, 3058 | { 3059 | "url": "https://github.com/fabpot", 3060 | "type": "github" 3061 | }, 3062 | { 3063 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3064 | "type": "tidelift" 3065 | } 3066 | ], 3067 | "time": "2024-12-23T08:48:59+00:00" 3068 | }, 3069 | { 3070 | "name": "symfony/service-contracts", 3071 | "version": "v3.6.0", 3072 | "source": { 3073 | "type": "git", 3074 | "url": "https://github.com/symfony/service-contracts.git", 3075 | "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4" 3076 | }, 3077 | "dist": { 3078 | "type": "zip", 3079 | "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f021b05a130d35510bd6b25fe9053c2a8a15d5d4", 3080 | "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4", 3081 | "shasum": "" 3082 | }, 3083 | "require": { 3084 | "php": ">=8.1", 3085 | "psr/container": "^1.1|^2.0", 3086 | "symfony/deprecation-contracts": "^2.5|^3" 3087 | }, 3088 | "conflict": { 3089 | "ext-psr": "<1.1|>=2" 3090 | }, 3091 | "type": "library", 3092 | "extra": { 3093 | "thanks": { 3094 | "url": "https://github.com/symfony/contracts", 3095 | "name": "symfony/contracts" 3096 | }, 3097 | "branch-alias": { 3098 | "dev-main": "3.6-dev" 3099 | } 3100 | }, 3101 | "autoload": { 3102 | "psr-4": { 3103 | "Symfony\\Contracts\\Service\\": "" 3104 | }, 3105 | "exclude-from-classmap": [ 3106 | "/Test/" 3107 | ] 3108 | }, 3109 | "notification-url": "https://packagist.org/downloads/", 3110 | "license": [ 3111 | "MIT" 3112 | ], 3113 | "authors": [ 3114 | { 3115 | "name": "Nicolas Grekas", 3116 | "email": "p@tchwork.com" 3117 | }, 3118 | { 3119 | "name": "Symfony Community", 3120 | "homepage": "https://symfony.com/contributors" 3121 | } 3122 | ], 3123 | "description": "Generic abstractions related to writing services", 3124 | "homepage": "https://symfony.com", 3125 | "keywords": [ 3126 | "abstractions", 3127 | "contracts", 3128 | "decoupling", 3129 | "interfaces", 3130 | "interoperability", 3131 | "standards" 3132 | ], 3133 | "support": { 3134 | "source": "https://github.com/symfony/service-contracts/tree/v3.6.0" 3135 | }, 3136 | "funding": [ 3137 | { 3138 | "url": "https://symfony.com/sponsor", 3139 | "type": "custom" 3140 | }, 3141 | { 3142 | "url": "https://github.com/fabpot", 3143 | "type": "github" 3144 | }, 3145 | { 3146 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3147 | "type": "tidelift" 3148 | } 3149 | ], 3150 | "time": "2025-04-25T09:37:31+00:00" 3151 | }, 3152 | { 3153 | "name": "symfony/stopwatch", 3154 | "version": "v7.3.0", 3155 | "source": { 3156 | "type": "git", 3157 | "url": "https://github.com/symfony/stopwatch.git", 3158 | "reference": "5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd" 3159 | }, 3160 | "dist": { 3161 | "type": "zip", 3162 | "url": "https://api.github.com/repos/symfony/stopwatch/zipball/5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd", 3163 | "reference": "5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd", 3164 | "shasum": "" 3165 | }, 3166 | "require": { 3167 | "php": ">=8.2", 3168 | "symfony/service-contracts": "^2.5|^3" 3169 | }, 3170 | "type": "library", 3171 | "autoload": { 3172 | "psr-4": { 3173 | "Symfony\\Component\\Stopwatch\\": "" 3174 | }, 3175 | "exclude-from-classmap": [ 3176 | "/Tests/" 3177 | ] 3178 | }, 3179 | "notification-url": "https://packagist.org/downloads/", 3180 | "license": [ 3181 | "MIT" 3182 | ], 3183 | "authors": [ 3184 | { 3185 | "name": "Fabien Potencier", 3186 | "email": "fabien@symfony.com" 3187 | }, 3188 | { 3189 | "name": "Symfony Community", 3190 | "homepage": "https://symfony.com/contributors" 3191 | } 3192 | ], 3193 | "description": "Provides a way to profile code", 3194 | "homepage": "https://symfony.com", 3195 | "support": { 3196 | "source": "https://github.com/symfony/stopwatch/tree/v7.3.0" 3197 | }, 3198 | "funding": [ 3199 | { 3200 | "url": "https://symfony.com/sponsor", 3201 | "type": "custom" 3202 | }, 3203 | { 3204 | "url": "https://github.com/fabpot", 3205 | "type": "github" 3206 | }, 3207 | { 3208 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3209 | "type": "tidelift" 3210 | } 3211 | ], 3212 | "time": "2025-02-24T10:49:57+00:00" 3213 | }, 3214 | { 3215 | "name": "symfony/string", 3216 | "version": "v7.3.0", 3217 | "source": { 3218 | "type": "git", 3219 | "url": "https://github.com/symfony/string.git", 3220 | "reference": "f3570b8c61ca887a9e2938e85cb6458515d2b125" 3221 | }, 3222 | "dist": { 3223 | "type": "zip", 3224 | "url": "https://api.github.com/repos/symfony/string/zipball/f3570b8c61ca887a9e2938e85cb6458515d2b125", 3225 | "reference": "f3570b8c61ca887a9e2938e85cb6458515d2b125", 3226 | "shasum": "" 3227 | }, 3228 | "require": { 3229 | "php": ">=8.2", 3230 | "symfony/polyfill-ctype": "~1.8", 3231 | "symfony/polyfill-intl-grapheme": "~1.0", 3232 | "symfony/polyfill-intl-normalizer": "~1.0", 3233 | "symfony/polyfill-mbstring": "~1.0" 3234 | }, 3235 | "conflict": { 3236 | "symfony/translation-contracts": "<2.5" 3237 | }, 3238 | "require-dev": { 3239 | "symfony/emoji": "^7.1", 3240 | "symfony/error-handler": "^6.4|^7.0", 3241 | "symfony/http-client": "^6.4|^7.0", 3242 | "symfony/intl": "^6.4|^7.0", 3243 | "symfony/translation-contracts": "^2.5|^3.0", 3244 | "symfony/var-exporter": "^6.4|^7.0" 3245 | }, 3246 | "type": "library", 3247 | "autoload": { 3248 | "files": [ 3249 | "Resources/functions.php" 3250 | ], 3251 | "psr-4": { 3252 | "Symfony\\Component\\String\\": "" 3253 | }, 3254 | "exclude-from-classmap": [ 3255 | "/Tests/" 3256 | ] 3257 | }, 3258 | "notification-url": "https://packagist.org/downloads/", 3259 | "license": [ 3260 | "MIT" 3261 | ], 3262 | "authors": [ 3263 | { 3264 | "name": "Nicolas Grekas", 3265 | "email": "p@tchwork.com" 3266 | }, 3267 | { 3268 | "name": "Symfony Community", 3269 | "homepage": "https://symfony.com/contributors" 3270 | } 3271 | ], 3272 | "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", 3273 | "homepage": "https://symfony.com", 3274 | "keywords": [ 3275 | "grapheme", 3276 | "i18n", 3277 | "string", 3278 | "unicode", 3279 | "utf-8", 3280 | "utf8" 3281 | ], 3282 | "support": { 3283 | "source": "https://github.com/symfony/string/tree/v7.3.0" 3284 | }, 3285 | "funding": [ 3286 | { 3287 | "url": "https://symfony.com/sponsor", 3288 | "type": "custom" 3289 | }, 3290 | { 3291 | "url": "https://github.com/fabpot", 3292 | "type": "github" 3293 | }, 3294 | { 3295 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3296 | "type": "tidelift" 3297 | } 3298 | ], 3299 | "time": "2025-04-20T20:19:01+00:00" 3300 | }, 3301 | { 3302 | "name": "symfony/yaml", 3303 | "version": "v7.3.0", 3304 | "source": { 3305 | "type": "git", 3306 | "url": "https://github.com/symfony/yaml.git", 3307 | "reference": "cea40a48279d58dc3efee8112634cb90141156c2" 3308 | }, 3309 | "dist": { 3310 | "type": "zip", 3311 | "url": "https://api.github.com/repos/symfony/yaml/zipball/cea40a48279d58dc3efee8112634cb90141156c2", 3312 | "reference": "cea40a48279d58dc3efee8112634cb90141156c2", 3313 | "shasum": "" 3314 | }, 3315 | "require": { 3316 | "php": ">=8.2", 3317 | "symfony/deprecation-contracts": "^2.5|^3.0", 3318 | "symfony/polyfill-ctype": "^1.8" 3319 | }, 3320 | "conflict": { 3321 | "symfony/console": "<6.4" 3322 | }, 3323 | "require-dev": { 3324 | "symfony/console": "^6.4|^7.0" 3325 | }, 3326 | "bin": [ 3327 | "Resources/bin/yaml-lint" 3328 | ], 3329 | "type": "library", 3330 | "autoload": { 3331 | "psr-4": { 3332 | "Symfony\\Component\\Yaml\\": "" 3333 | }, 3334 | "exclude-from-classmap": [ 3335 | "/Tests/" 3336 | ] 3337 | }, 3338 | "notification-url": "https://packagist.org/downloads/", 3339 | "license": [ 3340 | "MIT" 3341 | ], 3342 | "authors": [ 3343 | { 3344 | "name": "Fabien Potencier", 3345 | "email": "fabien@symfony.com" 3346 | }, 3347 | { 3348 | "name": "Symfony Community", 3349 | "homepage": "https://symfony.com/contributors" 3350 | } 3351 | ], 3352 | "description": "Loads and dumps YAML files", 3353 | "homepage": "https://symfony.com", 3354 | "support": { 3355 | "source": "https://github.com/symfony/yaml/tree/v7.3.0" 3356 | }, 3357 | "funding": [ 3358 | { 3359 | "url": "https://symfony.com/sponsor", 3360 | "type": "custom" 3361 | }, 3362 | { 3363 | "url": "https://github.com/fabpot", 3364 | "type": "github" 3365 | }, 3366 | { 3367 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3368 | "type": "tidelift" 3369 | } 3370 | ], 3371 | "time": "2025-04-04T10:10:33+00:00" 3372 | }, 3373 | { 3374 | "name": "theseer/tokenizer", 3375 | "version": "1.2.3", 3376 | "source": { 3377 | "type": "git", 3378 | "url": "https://github.com/theseer/tokenizer.git", 3379 | "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" 3380 | }, 3381 | "dist": { 3382 | "type": "zip", 3383 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", 3384 | "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", 3385 | "shasum": "" 3386 | }, 3387 | "require": { 3388 | "ext-dom": "*", 3389 | "ext-tokenizer": "*", 3390 | "ext-xmlwriter": "*", 3391 | "php": "^7.2 || ^8.0" 3392 | }, 3393 | "type": "library", 3394 | "autoload": { 3395 | "classmap": [ 3396 | "src/" 3397 | ] 3398 | }, 3399 | "notification-url": "https://packagist.org/downloads/", 3400 | "license": [ 3401 | "BSD-3-Clause" 3402 | ], 3403 | "authors": [ 3404 | { 3405 | "name": "Arne Blankerts", 3406 | "email": "arne@blankerts.de", 3407 | "role": "Developer" 3408 | } 3409 | ], 3410 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 3411 | "support": { 3412 | "issues": "https://github.com/theseer/tokenizer/issues", 3413 | "source": "https://github.com/theseer/tokenizer/tree/1.2.3" 3414 | }, 3415 | "funding": [ 3416 | { 3417 | "url": "https://github.com/theseer", 3418 | "type": "github" 3419 | } 3420 | ], 3421 | "time": "2024-03-03T12:36:25+00:00" 3422 | } 3423 | ], 3424 | "aliases": [], 3425 | "minimum-stability": "stable", 3426 | "stability-flags": [], 3427 | "prefer-stable": false, 3428 | "prefer-lowest": false, 3429 | "platform": { 3430 | "php": ">=8.2" 3431 | }, 3432 | "platform-dev": [], 3433 | "plugin-api-version": "2.3.0" 3434 | } 3435 | -------------------------------------------------------------------------------- /example.html.php: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | Shorten examples 8 |

9 | Go to exam… 11 | print $shorten->truncateMarkup('Go to example site', 10); 12 | ?> 13 | 14 |

15 | Go to… 17 | print $shorten->truncateMarkup('Go to example site', 10, '…', false, true); 18 | ?> 19 | 20 |

21 | Go to… 23 | print $shorten->truncateMarkup('Go to example site', 10, '…', true, true); 24 | ?> 25 | 26 |

27 | dolor sit amet 29 | print $shorten->truncateMarkup('Lorem ipsum dolor sit amet', 26); 30 | ?> 31 | -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | ./tests/ 11 | 12 | 13 | 14 | 15 | ./ 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /tests/ShortenTest.php: -------------------------------------------------------------------------------- 1 | assertEquals( 16 | 'Go to exam…', 17 | $shorten->truncateMarkup('Go to example site', 10) 18 | ); 19 | } 20 | 21 | public function testTruncatesMarkupWithAppendixOutside(): void 22 | { 23 | $shorten = new Shorten(); 24 | $this->assertEquals( 25 | 'Go to…', 26 | $shorten->truncateMarkup('Go to example site', 10, '…', false, true) 27 | ); 28 | } 29 | 30 | public function testTruncatesMarkupWithAppendixInside(): void 31 | { 32 | $shorten = new Shorten(); 33 | $this->assertEquals( 34 | 'Go to…', 35 | $shorten->truncateMarkup('Go to example site', 10, '…', true, true) 36 | ); 37 | } 38 | 39 | public function testTruncatesMarkupOnlyIfNeeded(): void 40 | { 41 | $shorten = new Shorten(); 42 | $this->assertEquals( 43 | 'Lorem ipsum dolor sit amet', 44 | $shorten->truncateMarkup('Lorem ipsum dolor sit amet', 26) 45 | ); 46 | } 47 | 48 | public function testTruncatesMarkupWithEntities(): void 49 | { 50 | $shorten = new Shorten(); 51 | $this->assertEquals( 52 | '

PHP élé…

', 53 | $shorten->truncateMarkup('

PHP éléphant

', 7, '…', true) 54 | ); 55 | } 56 | 57 | public function testTruncatesMarkupWithUnicodeChars(): void 58 | { 59 | $shorten = new Shorten(); 60 | $this->assertEquals( 61 | '

PHP élé…

', 62 | $shorten->truncateMarkup('

PHP éléphant

', 7, '…', true) 63 | ); 64 | } 65 | 66 | public function testTruncatesMarkupWithEmoji(): void 67 | { 68 | $shorten = new Shorten(); 69 | $this->assertEquals( 70 | '

PHP élé…

', 71 | $shorten->truncateMarkup('

PHP éléphant 🐘

', 7, '…', true) 72 | ); 73 | $this->assertEquals( 74 | '

PHP 🐘 é…

', 75 | $shorten->truncateMarkup('

PHP 🐘 éléphant 🐘

', 7, '…', true) 76 | ); 77 | $this->assertEquals( 78 | '

PHP …

', 79 | $shorten->truncateMarkup('

PHP 🐘 éléphant 🐘

', 4, '…', true) 80 | ); 81 | } 82 | 83 | public function testTruncatesMarkupWithXMLStyledSelfClosingTags(): void 84 | { 85 | $shorten = new Shorten(); 86 | $this->assertEquals( 87 | 'Go to
examp
…', 88 | $shorten->truncateMarkup('Go to
example site
', 10) 89 | ); 90 | } 91 | 92 | public function testTruncatesMarkupWithNonXMLStyledSelfClosingTags(): void 93 | { 94 | $shorten = new Shorten(); 95 | $this->assertEquals( 96 | ' Go to exa…', 97 | $shorten->truncateMarkup(' Go to example site', 10) 98 | ); 99 | } 100 | 101 | public function testTruncatesMarkupWithHeadingTags(): void 102 | { 103 | $shorten = new Shorten(); 104 | $this->assertEquals( 105 | '

Example

…', 106 | $shorten->truncateMarkup('

Example Heading

', 7) 107 | ); 108 | } 109 | } 110 | --------------------------------------------------------------------------------