├── phpunit.xml ├── .gitignore ├── .github └── workflows │ ├── lint.yml │ └── unit-tests.yml ├── phpcs.xml ├── composer.json ├── README.md ├── src ├── Clsx.php └── Cva.php ├── tests ├── ClsxTest.php └── CvaTest.php └── composer.lock /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | ./tests 8 | 9 | 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Composer dependencies 2 | /vendor/ 3 | 4 | # PHPUnit result cache 5 | .phpunit.result.cache 6 | 7 | # Node modules (if any JS tooling is used) 8 | /node_modules/ 9 | 10 | # Coverage reports 11 | /coverage/ 12 | 13 | # Build output 14 | /dist/ 15 | 16 | # IDE and editor folders 17 | /.idea/ 18 | /.vscode/ 19 | 20 | # OS generated files 21 | .DS_Store 22 | Thumbs.db 23 | 24 | # Log files 25 | *.log 26 | 27 | # Other 28 | *.swp 29 | *.swo 30 | 31 | # Ignore test output 32 | /test-output/ -------------------------------------------------------------------------------- /.github/workflows/lint.yml: -------------------------------------------------------------------------------- 1 | name: Lint 2 | 3 | on: 4 | push: 5 | branches: [main] 6 | pull_request: 7 | branches: [main] 8 | 9 | jobs: 10 | lint: 11 | runs-on: ubuntu-latest 12 | name: Lint 13 | steps: 14 | - uses: actions/checkout@v4 15 | - name: Set up PHP 16 | uses: shivammathur/setup-php@v2 17 | with: 18 | php-version: 8.3 19 | - name: Cache Composer dependencies 20 | uses: actions/cache@v4 21 | with: 22 | path: ~/.composer/cache 23 | key: ${{ runner.os }}-php-8.3-composer-${{ hashFiles('**/composer.lock') }} 24 | restore-keys: | 25 | ${{ runner.os }}-php-8.3-composer- 26 | - name: Install dependencies 27 | run: composer install --no-interaction --prefer-dist 28 | - name: Run linter 29 | run: composer lint -------------------------------------------------------------------------------- /.github/workflows/unit-tests.yml: -------------------------------------------------------------------------------- 1 | name: Unit Tests 2 | 3 | on: 4 | push: 5 | branches: [main] 6 | pull_request: 7 | branches: [main] 8 | 9 | jobs: 10 | test: 11 | runs-on: ubuntu-latest 12 | strategy: 13 | matrix: 14 | php-version: [8.3, 8.4] 15 | name: PHP ${{ matrix.php-version }} 16 | steps: 17 | - uses: actions/checkout@v4 18 | - name: Set up PHP 19 | uses: shivammathur/setup-php@v2 20 | with: 21 | php-version: ${{ matrix.php-version }} 22 | - name: Cache Composer dependencies 23 | uses: actions/cache@v4 24 | with: 25 | path: ~/.composer/cache 26 | key: ${{ runner.os }}-php-${{ matrix.php-version }}-composer-${{ hashFiles('**/composer.lock') }} 27 | restore-keys: | 28 | ${{ runner.os }}-php-${{ matrix.php-version }}-composer- 29 | - name: Install dependencies 30 | run: composer install --no-interaction --prefer-dist 31 | - name: Run tests 32 | run: composer test -------------------------------------------------------------------------------- /phpcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10up PHPCS extended. 4 | 5 | 6 | src 7 | tests 8 | 9 | 10 | node_modules/ 11 | vendor/ 12 | dist/ 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | tests/* 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "derweili/cva-php", 3 | "description": "PHP clone of class-variance-authority (CVA)", 4 | "license": "MIT", 5 | "keywords": ["cva", "class-variance-authority", "utility", "css", "php"], 6 | "homepage": "https://github.com/derweili/cva-php", 7 | "repository": { 8 | "type": "git", 9 | "url": "https://github.com/derweili/cva-php.git" 10 | }, 11 | "version": "0.1.0", 12 | "require": { 13 | "php": "^8.1" 14 | }, 15 | "autoload": { 16 | "psr-4": { 17 | "CvaPhp\\": "src/" 18 | } 19 | }, 20 | "authors": [ 21 | { 22 | "name": "Julian Weiland" 23 | } 24 | ], 25 | "require-dev": { 26 | "phpunit/phpunit": "^12.1", 27 | "10up/phpcs-composer": "^3.0" 28 | }, 29 | "scripts": { 30 | "test": "phpunit --testdox", 31 | "lint": "./vendor/bin/phpcs --standard=./phpcs.xml", 32 | "lint-fix": "./vendor/bin/phpcbf --standard=./phpcs.xml" 33 | }, 34 | "config": { 35 | "allow-plugins": { 36 | "dealerdirect/phpcodesniffer-composer-installer": true 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # cva-php 2 | 3 | A PHP clone of the [class-variance-authority (CVA)](https://github.com/joe-bell/cva) utility, inspired by the original npm package. This package provides utility functions for composing CSS class names based on variants, similar to the original JavaScript/TypeScript version. 4 | 5 | ## Installation 6 | 7 | ```bash 8 | composer require derweili/cva-php 9 | ``` 10 | 11 | ## Usage 12 | 13 | ### 1. `Clsx::cx` — Class Name Combiner 14 | 15 | Combine class names, arrays, and objects into a single string, ignoring falsy values (like `null`, `false`, `0`, empty string, etc.). 16 | 17 | ```php 18 | use CvaPhp\Clsx; 19 | 20 | // Simple usage 21 | $class = Clsx::cx('foo', null, 'bar', ['baz', false, 'qux']); 22 | // $class === 'foo bar baz qux' 23 | 24 | // With associative arrays (object syntax) 25 | $class = Clsx::cx(['foo' => true, 'bar' => false, 'baz' => true]); 26 | // $class === 'foo baz' 27 | ``` 28 | 29 | ### 2. `Cva::cva` — Class Variance Authority 30 | 31 | Create a function that generates class names based on variants and options. 32 | 33 | ```php 34 | use CvaPhp\Cva; 35 | 36 | $button = Cva::cva('button', [ 37 | 'variants' => [ 38 | 'intent' => [ 39 | 'primary' => 'button--primary', 40 | 'secondary' => 'button--secondary', 41 | ], 42 | 'size' => [ 43 | 'small' => 'button--small', 44 | 'large' => 'button--large', 45 | ], 46 | ], 47 | 'compoundVariants' => [ 48 | [ 49 | 'intent' => 'primary', 50 | 'size' => 'large', 51 | 'class' => 'button--primary-large', 52 | ], 53 | ], 54 | 'defaultVariants' => [ 55 | 'intent' => 'primary', 56 | 'size' => 'small', 57 | ], 58 | ]); 59 | 60 | // Usage: 61 | echo $button(); // "button button--primary button--small" 62 | echo $button(['intent' => 'secondary']); // "button button--secondary button--small" 63 | echo $button(['size' => 'large']); // "button button--primary button--large button--primary-large" 64 | echo $button(['class' => 'my-custom-class']); // "button button--primary button--small my-custom-class" 65 | ``` 66 | 67 | ## Running Tests 68 | 69 | ```bash 70 | composer test 71 | ``` -------------------------------------------------------------------------------- /src/Clsx.php: -------------------------------------------------------------------------------- 1 | $value ) { 57 | if ( is_int( $key ) ) { 58 | self::collect( $value, $classes ); 59 | } elseif ( 60 | is_array( $value ) 61 | ) { 62 | // For associative arrays, include key if value is any array 63 | $classes[] = $key; 64 | } elseif ( 65 | $value && ! is_array( $value ) && ! ( is_float( $value ) && is_nan( $value ) ) 66 | ) { 67 | // Or if value is truthy and not NAN 68 | $classes[] = $key; 69 | } 70 | } 71 | } elseif ( is_object( $arg ) ) { 72 | $classes[] = is_callable( $arg ) ? 'function' : 'emptyObject'; 73 | } elseif ( is_callable( $arg ) ) { 74 | $classes[] = 'function'; 75 | } 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /src/Cva.php: -------------------------------------------------------------------------------- 1 | $variant_options ) { 42 | $variant_value = $merged_props[ $variant ] ?? null; 43 | if ( $variant_value === null ) { 44 | continue; 45 | } 46 | if ( isset( $variant_options[ $variant_value ] ) ) { 47 | $get_variant_class_names[] = $variant_options[ $variant_value ]; 48 | } 49 | } 50 | 51 | // Remove undefined (null) props for compound_variants 52 | $props_without_undefined = []; 53 | foreach ( $merged_props as $key => $value ) { 54 | if ( $value !== null ) { 55 | $props_without_undefined[ $key ] = $value; 56 | } 57 | } 58 | 59 | // Compute compound variant class names 60 | $get_compound_variant_class_names = []; 61 | foreach ( $compound_variants as $compound ) { 62 | $compound = (array) $compound; 63 | $cv_class = $compound['class'] ?? null; 64 | $cv_class_name = $compound['className'] ?? null; 65 | $compound_variant_options = $compound; 66 | unset( $compound_variant_options['class'], $compound_variant_options['className'] ); 67 | $all_match = true; 68 | foreach ( $compound_variant_options as $key => $value ) { 69 | $actual = $props_without_undefined[ $key ] ?? null; 70 | if ( is_array( $value ) ) { 71 | if ( ! in_array( $actual, $value, true ) ) { 72 | $all_match = false; 73 | break; 74 | } 75 | } elseif ( $actual !== $value ) { 76 | $all_match = false; 77 | break; 78 | } 79 | } 80 | if ( $all_match ) { 81 | if ( $cv_class ) { 82 | $get_compound_variant_class_names[] = $cv_class; 83 | } 84 | if ( $cv_class_name ) { 85 | $get_compound_variant_class_names[] = $cv_class_name; 86 | } 87 | } 88 | } 89 | 90 | return $cx( 91 | $base, 92 | $get_variant_class_names, 93 | $get_compound_variant_class_names, 94 | $merged_props['class'] ?? null, 95 | $merged_props['className'] ?? null 96 | ); 97 | }; 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /tests/ClsxTest.php: -------------------------------------------------------------------------------- 1 | true, 25 | 'b' => false, 26 | 'c' => 0, 27 | 'd' => null, 28 | 'e' => null, 29 | 'f' => 1, 30 | ] 31 | ); 32 | $this->assertSame( 'a f', $out ); 33 | } 34 | 35 | /** 36 | * Test that arrays of class names are joined and falsy values are ignored. 37 | */ 38 | public function testJoinsArraysOfClassNamesAndIgnoresFalsyValues() { 39 | $out = Clsx::cx( 'a', 0, null, null, true, 1, 'b' ); 40 | $this->assertSame( 'a 1 b', $out ); 41 | } 42 | 43 | /** 44 | * Test that heterogenous arguments are supported. 45 | */ 46 | public function testSupportsHeterogenousArguments() { 47 | $this->assertSame( 'a b', Clsx::cx( [ 'a' => true ], 'b', 0 ) ); 48 | } 49 | 50 | /** 51 | * Test that the result is trimmed. 52 | */ 53 | public function testShouldBeTrimmed() { 54 | $this->assertSame( 'b', Clsx::cx( '', 'b', [], '' ) ); 55 | } 56 | 57 | /** 58 | * Test that empty config returns an empty string. 59 | */ 60 | public function testReturnsEmptyStringForEmptyConfig() { 61 | $this->assertSame( '', Clsx::cx( [] ) ); 62 | $this->assertSame( '', Clsx::cx( '' ) ); 63 | } 64 | 65 | /** 66 | * Test that array of class names is supported. 67 | */ 68 | public function testSupportsArrayOfClassNames() { 69 | $this->assertSame( 'a b', Clsx::cx( [ 'a', 'b' ] ) ); 70 | } 71 | 72 | /** 73 | * Test that array arguments are joined with string arguments. 74 | */ 75 | public function testJoinsArrayArgumentsWithStringArguments() { 76 | $this->assertSame( 'a b c', Clsx::cx( [ 'a', 'b' ], 'c' ) ); 77 | $this->assertSame( 'c a b', Clsx::cx( 'c', [ 'a', 'b' ] ) ); 78 | } 79 | 80 | /** 81 | * Test that multiple array arguments are handled. 82 | */ 83 | public function testHandlesMultipleArrayArguments() { 84 | $this->assertSame( 'a b c d', Clsx::cx( [ 'a', 'b' ], [ 'c', 'd' ] ) ); 85 | } 86 | 87 | /** 88 | * Test that arrays with falsy and true values are handled. 89 | */ 90 | public function testHandlesArraysWithFalsyAndTrueValues() { 91 | $this->assertSame( 'a b', Clsx::cx( [ 'a', 0, null, null, false, true, 'b' ] ) ); 92 | } 93 | 94 | /** 95 | * Test that arrays that include arrays are handled. 96 | */ 97 | public function testHandlesArraysThatIncludeArrays() { 98 | $this->assertSame( 'a b c', Clsx::cx( [ 'a', [ 'b', 'c' ] ] ) ); 99 | } 100 | 101 | /** 102 | * Test that arrays that include objects are handled. 103 | */ 104 | public function testHandlesArraysThatIncludeObjects() { 105 | $this->assertSame( 106 | 'a b', 107 | Clsx::cx( 108 | [ 109 | 'a', 110 | [ 111 | 'b' => true, 112 | 'c' => false, 113 | ], 114 | ] 115 | ) 116 | ); 117 | } 118 | 119 | /** 120 | * Test that deep array recursion is handled. 121 | */ 122 | public function testHandlesDeepArrayRecursion() { 123 | $this->assertSame( 'a b c d', Clsx::cx( [ 'a', [ 'b', [ 'c', [ 'd' => true ] ] ] ] ) ); 124 | } 125 | 126 | /** 127 | * Test that empty arrays are handled. 128 | */ 129 | public function testHandlesEmptyArrays() { 130 | $this->assertSame( 'a', Clsx::cx( 'a', [] ) ); 131 | } 132 | 133 | /** 134 | * Test that nested empty arrays are handled. 135 | */ 136 | public function testHandlesNestedEmptyArrays() { 137 | $this->assertSame( 'a', Clsx::cx( 'a', [ [] ] ) ); 138 | } 139 | 140 | /** 141 | * Test that all types of truthy and falsy property values are handled. 142 | */ 143 | public function testHandlesAllTypesOfTruthyAndFalsyPropertyValues() { 144 | $out = Clsx::cx( 145 | [ 146 | // falsy: 147 | 'null' => null, 148 | 'emptyString' => '', 149 | 'noNumber' => NAN, 150 | 'zero' => 0, 151 | 'negativeZero' => -0, 152 | 'false' => false, 153 | 'undefined' => null, 154 | // truthy (literally anything else): 155 | 'nonEmptyString' => 'foobar', 156 | 'whitespace' => ' ', 157 | 'function' => function () {}, 158 | 'emptyObject' => (object) [], 159 | 'nonEmptyObject' => (object) [ 160 | 'a' => 1, 161 | 'b' => 2, 162 | ], 163 | 'emptyList' => [], 164 | 'nonEmptyList' => [ 1, 2, 3 ], 165 | 'greaterZero' => 1, 166 | ] 167 | ); 168 | $this->assertSame( 'nonEmptyString whitespace function emptyObject nonEmptyObject emptyList nonEmptyList greaterZero', $out ); 169 | } 170 | } 171 | -------------------------------------------------------------------------------- /tests/CvaTest.php: -------------------------------------------------------------------------------- 1 | assertSame( '', $example() ); 24 | $this->assertSame( '', $example( [ 'aCheekyInvalidProp' => 'lol' ] ) ); 25 | $this->assertSame( 'adhoc-class', $example( [ 'class' => 'adhoc-class' ] ) ); 26 | $this->assertSame( 'adhoc-className', $example( [ 'className' => 'adhoc-className' ] ) ); 27 | $this->assertSame( 28 | 'adhoc-class adhoc-className', 29 | $example( 30 | [ 31 | 'class' => 'adhoc-class', 32 | 'className' => 'adhoc-className', 33 | ] 34 | ) 35 | ); 36 | } 37 | public function testUndefinedBaseReturnsEmptyString() { 38 | /* 39 | * PHP does not have 'undefined', so this is equivalent to null 40 | */ 41 | $example = Cva::cva( null ); 42 | $this->assertSame( '', $example() ); 43 | $this->assertSame( '', $example( [ 'aCheekyInvalidProp' => 'lol' ] ) ); 44 | $this->assertSame( 'adhoc-class', $example( [ 'class' => 'adhoc-class' ] ) ); 45 | $this->assertSame( 'adhoc-className', $example( [ 'className' => 'adhoc-className' ] ) ); 46 | $this->assertSame( 47 | 'adhoc-class adhoc-className', 48 | $example( 49 | [ 50 | 'class' => 'adhoc-class', 51 | 'className' => 'adhoc-className', 52 | ] 53 | ) 54 | ); 55 | } 56 | public function testNullBaseReturnsEmptyString() { 57 | $example = Cva::cva( null ); 58 | $this->assertSame( '', $example() ); 59 | $this->assertSame( '', $example( [ 'aCheekyInvalidProp' => 'lol' ] ) ); 60 | $this->assertSame( 'adhoc-class', $example( [ 'class' => 'adhoc-class' ] ) ); 61 | $this->assertSame( 'adhoc-className', $example( [ 'className' => 'adhoc-className' ] ) ); 62 | $this->assertSame( 63 | 'adhoc-class adhoc-className', 64 | $example( 65 | [ 66 | 'class' => 'adhoc-class', 67 | 'className' => 'adhoc-className', 68 | ] 69 | ) 70 | ); 71 | } 72 | public function testAdhocClassAndClassNameProps() { 73 | $example = Cva::cva(); 74 | $this->assertSame( 'adhoc-class', $example( [ 'class' => 'adhoc-class' ] ) ); 75 | $this->assertSame( 'adhoc-className', $example( [ 'className' => 'adhoc-className' ] ) ); 76 | $this->assertSame( 77 | 'adhoc-class adhoc-className', 78 | $example( 79 | [ 80 | 'class' => 'adhoc-class', 81 | 'className' => 'adhoc-className', 82 | ] 83 | ) 84 | ); 85 | } 86 | 87 | /** 88 | * Without defaults 89 | */ 90 | public function testVariantsStringValues() { 91 | $button = Cva::cva( 92 | null, 93 | [ 94 | 'variants' => [ 95 | 'intent' => [ 96 | 'primary' => 'button--primary', 97 | 'secondary' => 'button--secondary', 98 | ], 99 | 'size' => [ 100 | 'small' => 'button--small', 101 | 'large' => 'button--large', 102 | ], 103 | ], 104 | ] 105 | ); 106 | $this->assertSame( '', $button() ); 107 | $this->assertSame( 'button--primary', $button( [ 'intent' => 'primary' ] ) ); 108 | $this->assertSame( 'button--secondary', $button( [ 'intent' => 'secondary' ] ) ); 109 | $this->assertSame( 110 | 'button--primary button--small', 111 | $button( 112 | [ 113 | 'intent' => 'primary', 114 | 'size' => 'small', 115 | ] 116 | ) 117 | ); 118 | $this->assertSame( 119 | 'button--secondary button--large', 120 | $button( 121 | [ 122 | 'intent' => 'secondary', 123 | 'size' => 'large', 124 | ] 125 | ) 126 | ); 127 | } 128 | 129 | public function testVariantsArrayValues() { 130 | $button = Cva::cva( 131 | null, 132 | [ 133 | 'variants' => [ 134 | 'intent' => [ 135 | 'primary' => [ 'button--primary', 'bg-blue-500' ], 136 | 'secondary' => [ 'button--secondary', 'bg-white' ], 137 | ], 138 | 'size' => [ 139 | 'small' => [ 'button--small', 'text-sm' ], 140 | 'large' => [ 'button--large', 'text-lg' ], 141 | ], 142 | ], 143 | ] 144 | ); 145 | $this->assertSame( '', $button() ); 146 | $this->assertSame( 'button--primary bg-blue-500', $button( [ 'intent' => 'primary' ] ) ); 147 | $this->assertSame( 'button--secondary bg-white', $button( [ 'intent' => 'secondary' ] ) ); 148 | $this->assertSame( 149 | 'button--primary bg-blue-500 button--small text-sm', 150 | $button( 151 | [ 152 | 'intent' => 'primary', 153 | 'size' => 'small', 154 | ] 155 | ) 156 | ); 157 | $this->assertSame( 158 | 'button--secondary bg-white button--large text-lg', 159 | $button( 160 | [ 161 | 'intent' => 'secondary', 162 | 'size' => 'large', 163 | ] 164 | ) 165 | ); 166 | } 167 | 168 | public function testCompoundVariants() { 169 | $button = Cva::cva( 170 | null, 171 | [ 172 | 'variants' => [ 173 | 'intent' => [ 174 | 'primary' => 'button--primary', 175 | 'secondary' => 'button--secondary', 176 | ], 177 | 'size' => [ 178 | 'small' => 'button--small', 179 | 'large' => 'button--large', 180 | ], 181 | ], 182 | 'compoundVariants' => [ 183 | [ 184 | 'intent' => 'primary', 185 | 'size' => 'large', 186 | 'class' => 'button--primary-large', 187 | ], 188 | [ 189 | 'intent' => 'secondary', 190 | 'size' => 'small', 191 | 'class' => 'button--secondary-small', 192 | ], 193 | ], 194 | ] 195 | ); 196 | $this->assertSame( '', $button() ); 197 | $this->assertSame( 'button--primary', $button( [ 'intent' => 'primary' ] ) ); 198 | $this->assertSame( 'button--secondary', $button( [ 'intent' => 'secondary' ] ) ); 199 | $this->assertSame( 200 | 'button--primary button--large button--primary-large', 201 | $button( 202 | [ 203 | 'intent' => 'primary', 204 | 'size' => 'large', 205 | ] 206 | ) 207 | ); 208 | $this->assertSame( 209 | 'button--secondary button--small button--secondary-small', 210 | $button( 211 | [ 212 | 'intent' => 'secondary', 213 | 'size' => 'small', 214 | ] 215 | ) 216 | ); 217 | } 218 | 219 | public function testCompoundVariantsWithClassName() { 220 | $button = Cva::cva( 221 | null, 222 | [ 223 | 'variants' => [ 224 | 'intent' => [ 225 | 'primary' => 'button--primary', 226 | 'secondary' => 'button--secondary', 227 | ], 228 | 'size' => [ 229 | 'small' => 'button--small', 230 | 'large' => 'button--large', 231 | ], 232 | ], 233 | 'compoundVariants' => [ 234 | [ 235 | 'intent' => 'primary', 236 | 'size' => 'large', 237 | 'className' => 'button--primary-large', 238 | ], 239 | [ 240 | 'intent' => 'secondary', 241 | 'size' => 'small', 242 | 'className' => 'button--secondary-small', 243 | ], 244 | ], 245 | ] 246 | ); 247 | $this->assertSame( 248 | 'button--primary button--large button--primary-large', 249 | $button( 250 | [ 251 | 'intent' => 'primary', 252 | 'size' => 'large', 253 | ] 254 | ) 255 | ); 256 | $this->assertSame( 257 | 'button--secondary button--small button--secondary-small', 258 | $button( 259 | [ 260 | 'intent' => 'secondary', 261 | 'size' => 'small', 262 | ] 263 | ) 264 | ); 265 | } 266 | public function testCompoundVariantsWithArray() { 267 | $button = Cva::cva( 268 | null, 269 | [ 270 | 'variants' => [ 271 | 'intent' => [ 272 | 'primary' => 'button--primary', 273 | 'secondary' => 'button--secondary', 274 | ], 275 | 'size' => [ 276 | 'small' => 'button--small', 277 | 'medium' => 'button--medium', 278 | ], 279 | ], 280 | 'compoundVariants' => [ 281 | [ 282 | 'intent' => 'primary', 283 | 'size' => 'medium', 284 | 'class' => [ 'button--primary-medium', 'uppercase' ], 285 | ], 286 | [ 287 | 'intent' => 'secondary', 288 | 'size' => 'small', 289 | 'class' => [ 'button--secondary-small', 'lowercase' ], 290 | ], 291 | ], 292 | ] 293 | ); 294 | $this->assertSame( 295 | 'button--primary button--medium button--primary-medium uppercase', 296 | $button( 297 | [ 298 | 'intent' => 'primary', 299 | 'size' => 'medium', 300 | ] 301 | ) 302 | ); 303 | $this->assertSame( 304 | 'button--secondary button--small button--secondary-small lowercase', 305 | $button( 306 | [ 307 | 'intent' => 'secondary', 308 | 'size' => 'small', 309 | ] 310 | ) 311 | ); 312 | } 313 | public function testCompoundVariantsWithClassNameArray() { 314 | $button = Cva::cva( 315 | null, 316 | [ 317 | 'variants' => [ 318 | 'intent' => [ 319 | 'primary' => 'button--primary', 320 | 'secondary' => 'button--secondary', 321 | ], 322 | 'size' => [ 323 | 'small' => 'button--small', 324 | 'large' => 'button--large', 325 | ], 326 | ], 327 | 'compoundVariants' => [ 328 | [ 329 | 'intent' => 'primary', 330 | 'size' => 'large', 331 | 'className' => [ 'button--primary-large', 'uppercase' ], 332 | ], 333 | [ 334 | 'intent' => 'secondary', 335 | 'size' => 'small', 336 | 'className' => [ 'button--secondary-small', 'lowercase' ], 337 | ], 338 | ], 339 | ] 340 | ); 341 | $this->assertSame( 342 | 'button--primary button--large button--primary-large uppercase', 343 | $button( 344 | [ 345 | 'intent' => 'primary', 346 | 'size' => 'large', 347 | ] 348 | ) 349 | ); 350 | $this->assertSame( 351 | 'button--secondary button--small button--secondary-small lowercase', 352 | $button( 353 | [ 354 | 'intent' => 'secondary', 355 | 'size' => 'small', 356 | ] 357 | ) 358 | ); 359 | } 360 | public function testDefaultVariants() { 361 | $button = Cva::cva( 362 | null, 363 | [ 364 | 'variants' => [ 365 | 'intent' => [ 366 | 'primary' => 'button--primary', 367 | 'secondary' => 'button--secondary', 368 | ], 369 | 'size' => [ 370 | 'small' => 'button--small', 371 | 'large' => 'button--large', 372 | ], 373 | ], 374 | 'defaultVariants' => [ 375 | 'intent' => 'primary', 376 | 'size' => 'small', 377 | ], 378 | ] 379 | ); 380 | $this->assertSame( 'button--primary button--small', $button() ); 381 | $this->assertSame( 'button--secondary button--small', $button( [ 'intent' => 'secondary' ] ) ); 382 | $this->assertSame( 'button--primary button--large', $button( [ 'size' => 'large' ] ) ); 383 | } 384 | public function testDefaultVariantsWithClassName() { 385 | $button = Cva::cva( 386 | null, 387 | [ 388 | 'variants' => [ 389 | 'intent' => [ 390 | 'primary' => 'button--primary', 391 | 'secondary' => 'button--secondary', 392 | ], 393 | 'size' => [ 394 | 'small' => 'button--small', 395 | 'large' => 'button--large', 396 | ], 397 | ], 398 | 'defaultVariants' => [ 399 | 'intent' => 'primary', 400 | 'size' => 'small', 401 | ], 402 | ] 403 | ); 404 | $this->assertSame( 'button--primary button--small', $button() ); 405 | $this->assertSame( 'button--secondary button--small', $button( [ 'intent' => 'secondary' ] ) ); 406 | $this->assertSame( 'button--primary button--large', $button( [ 'size' => 'large' ] ) ); 407 | } 408 | public function testDefaultVariantsWithArray() { 409 | $button = Cva::cva( 410 | null, 411 | [ 412 | 'variants' => [ 413 | 'intent' => [ 414 | 'primary' => [ 'button--primary', 'bg-blue-500' ], 415 | 'secondary' => [ 'button--secondary', 'bg-white' ], 416 | ], 417 | 'size' => [ 418 | 'small' => [ 'button--small', 'text-sm' ], 419 | 'large' => [ 'button--large', 'text-lg' ], 420 | ], 421 | ], 422 | 'defaultVariants' => [ 423 | 'intent' => 'primary', 424 | 'size' => 'small', 425 | ], 426 | ] 427 | ); 428 | $this->assertSame( 'button--primary bg-blue-500 button--small text-sm', $button() ); 429 | $this->assertSame( 'button--secondary bg-white button--small text-sm', $button( [ 'intent' => 'secondary' ] ) ); 430 | $this->assertSame( 'button--primary bg-blue-500 button--large text-lg', $button( [ 'size' => 'large' ] ) ); 431 | } 432 | public function testDefaultVariantsWithClassNameArray() { 433 | $button = Cva::cva( 434 | null, 435 | [ 436 | 'variants' => [ 437 | 'intent' => [ 438 | 'primary' => [ 'button--primary', 'bg-blue-500' ], 439 | 'secondary' => [ 'button--secondary', 'bg-white' ], 440 | ], 441 | 'size' => [ 442 | 'small' => [ 'button--small', 'text-sm' ], 443 | 'large' => [ 'button--large', 'text-lg' ], 444 | ], 445 | ], 446 | 'defaultVariants' => [ 447 | 'intent' => 'primary', 448 | 'size' => 'small', 449 | ], 450 | ] 451 | ); 452 | $this->assertSame( 'button--primary bg-blue-500 button--small text-sm', $button() ); 453 | $this->assertSame( 'button--secondary bg-white button--small text-sm', $button( [ 'intent' => 'secondary' ] ) ); 454 | $this->assertSame( 'button--primary bg-blue-500 button--large text-lg', $button( [ 'size' => 'large' ] ) ); 455 | } 456 | 457 | /** 458 | * With base 459 | */ 460 | public function testWithBaseClass() { 461 | $button = Cva::cva( 462 | 'button', 463 | [ 464 | 'variants' => [ 465 | 'intent' => [ 466 | 'primary' => 'button--primary', 467 | 'secondary' => 'button--secondary', 468 | ], 469 | 'size' => [ 470 | 'small' => 'button--small', 471 | 'large' => 'button--large', 472 | ], 473 | ], 474 | ] 475 | ); 476 | $this->assertSame( 'button', $button() ); 477 | $this->assertSame( 'button button--primary', $button( [ 'intent' => 'primary' ] ) ); 478 | $this->assertSame( 479 | 'button button--primary button--small', 480 | $button( 481 | [ 482 | 'intent' => 'primary', 483 | 'size' => 'small', 484 | ] 485 | ) 486 | ); 487 | } 488 | public function testWithBaseClassWithDefaults() { 489 | $button = Cva::cva( 490 | 'button', 491 | [ 492 | 'variants' => [ 493 | 'intent' => [ 494 | 'primary' => 'button--primary', 495 | 'secondary' => 'button--secondary', 496 | ], 497 | 'size' => [ 498 | 'small' => 'button--small', 499 | 'large' => 'button--large', 500 | ], 501 | ], 502 | 'defaultVariants' => [ 503 | 'intent' => 'primary', 504 | 'size' => 'small', 505 | ], 506 | ] 507 | ); 508 | $this->assertSame( 'button button--primary button--small', $button() ); 509 | $this->assertSame( 'button button--secondary button--small', $button( [ 'intent' => 'secondary' ] ) ); 510 | $this->assertSame( 'button button--primary button--large', $button( [ 'size' => 'large' ] ) ); 511 | } 512 | public function testWithBaseClassWithVariants() { 513 | $button = Cva::cva( 514 | 'button', 515 | [ 516 | 'variants' => [ 517 | 'intent' => [ 518 | 'primary' => 'button--primary', 519 | 'secondary' => 'button--secondary', 520 | ], 521 | 'size' => [ 522 | 'small' => 'button--small', 523 | 'large' => 'button--large', 524 | ], 525 | ], 526 | ] 527 | ); 528 | $this->assertSame( 'button button--primary', $button( [ 'intent' => 'primary' ] ) ); 529 | $this->assertSame( 'button button--secondary', $button( [ 'intent' => 'secondary' ] ) ); 530 | $this->assertSame( 531 | 'button button--primary button--small', 532 | $button( 533 | [ 534 | 'intent' => 'primary', 535 | 'size' => 'small', 536 | ] 537 | ) 538 | ); 539 | } 540 | public function testWithBaseClassWithCompoundVariants() { 541 | $button = Cva::cva( 542 | 'button', 543 | [ 544 | 'variants' => [ 545 | 'intent' => [ 546 | 'primary' => 'button--primary', 547 | 'secondary' => 'button--secondary', 548 | ], 549 | 'size' => [ 550 | 'small' => 'button--small', 551 | 'large' => 'button--large', 552 | ], 553 | ], 554 | 'compoundVariants' => [ 555 | [ 556 | 'intent' => 'primary', 557 | 'size' => 'large', 558 | 'class' => 'button--primary-large', 559 | ], 560 | ], 561 | ] 562 | ); 563 | $this->assertSame( 564 | 'button button--primary button--large button--primary-large', 565 | $button( 566 | [ 567 | 'intent' => 'primary', 568 | 'size' => 'large', 569 | ] 570 | ) 571 | ); 572 | } 573 | public function testWithBaseClassWithDefaultVariants() { 574 | $button = Cva::cva( 575 | 'button', 576 | [ 577 | 'variants' => [ 578 | 'intent' => [ 579 | 'primary' => 'button--primary', 580 | 'secondary' => 'button--secondary', 581 | ], 582 | 'size' => [ 583 | 'small' => 'button--small', 584 | 'large' => 'button--large', 585 | ], 586 | ], 587 | 'defaultVariants' => [ 588 | 'intent' => 'primary', 589 | 'size' => 'small', 590 | ], 591 | ] 592 | ); 593 | $this->assertSame( 'button button--primary button--small', $button() ); 594 | } 595 | public function testWithBaseClassWithAdhocClass() { 596 | $button = Cva::cva( 597 | 'button', 598 | [ 599 | 'variants' => [ 600 | 'intent' => [ 601 | 'primary' => 'button--primary', 602 | 'secondary' => 'button--secondary', 603 | ], 604 | ], 605 | ] 606 | ); 607 | $this->assertSame( 'button adhoc-class', $button( [ 'class' => 'adhoc-class' ] ) ); 608 | } 609 | public function testWithBaseClassWithAdhocClassName() { 610 | $button = Cva::cva( 611 | 'button', 612 | [ 613 | 'variants' => [ 614 | 'intent' => [ 615 | 'primary' => 'button--primary', 616 | 'secondary' => 'button--secondary', 617 | ], 618 | ], 619 | ] 620 | ); 621 | $this->assertSame( 'button adhoc-className', $button( [ 'className' => 'adhoc-className' ] ) ); 622 | } 623 | 624 | /** 625 | * With defaults 626 | */ 627 | public function testWithDefaults() { 628 | $button = Cva::cva( 629 | null, 630 | [ 631 | 'variants' => [ 632 | 'intent' => [ 633 | 'primary' => 'button--primary', 634 | 'secondary' => 'button--secondary', 635 | ], 636 | ], 637 | 'defaultVariants' => [ 638 | 'intent' => 'primary', 639 | ], 640 | ] 641 | ); 642 | $this->assertSame( 'button--primary', $button() ); 643 | $this->assertSame( 'button--secondary', $button( [ 'intent' => 'secondary' ] ) ); 644 | } 645 | public function testWithDefaultsWithVariants() { 646 | $button = Cva::cva( 647 | null, 648 | [ 649 | 'variants' => [ 650 | 'intent' => [ 651 | 'primary' => 'button--primary', 652 | 'secondary' => 'button--secondary', 653 | ], 654 | ], 655 | 'defaultVariants' => [ 656 | 'intent' => 'primary', 657 | ], 658 | ] 659 | ); 660 | $this->assertSame( 'button--primary', $button() ); 661 | $this->assertSame( 'button--secondary', $button( [ 'intent' => 'secondary' ] ) ); 662 | } 663 | public function testWithDefaultsWithCompoundVariants() { 664 | $button = Cva::cva( 665 | null, 666 | [ 667 | 'variants' => [ 668 | 'intent' => [ 669 | 'primary' => 'button--primary', 670 | 'secondary' => 'button--secondary', 671 | ], 672 | ], 673 | 'defaultVariants' => [ 674 | 'intent' => 'primary', 675 | ], 676 | 'compoundVariants' => [ 677 | [ 678 | 'intent' => 'primary', 679 | 'class' => 'button--primary-compound', 680 | ], 681 | ], 682 | ] 683 | ); 684 | $this->assertSame( 'button--primary button--primary-compound', $button() ); 685 | $this->assertSame( 'button--secondary', $button( [ 'intent' => 'secondary' ] ) ); 686 | } 687 | public function testWithDefaultsWithAdhocClass() { 688 | $button = Cva::cva( 689 | null, 690 | [ 691 | 'variants' => [ 692 | 'intent' => [ 693 | 'primary' => 'button--primary', 694 | 'secondary' => 'button--secondary', 695 | ], 696 | ], 697 | 'defaultVariants' => [ 698 | 'intent' => 'primary', 699 | ], 700 | ] 701 | ); 702 | $this->assertSame( 'button--primary adhoc-class', $button( [ 'class' => 'adhoc-class' ] ) ); 703 | } 704 | public function testWithDefaultsWithAdhocClassName() { 705 | $button = Cva::cva( 706 | null, 707 | [ 708 | 'variants' => [ 709 | 'intent' => [ 710 | 'primary' => 'button--primary', 711 | 'secondary' => 'button--secondary', 712 | ], 713 | ], 714 | 'defaultVariants' => [ 715 | 'intent' => 'primary', 716 | ], 717 | ] 718 | ); 719 | $this->assertSame( 'button--primary adhoc-className', $button( [ 'className' => 'adhoc-className' ] ) ); 720 | } 721 | 722 | /** 723 | * Composing classes 724 | */ 725 | public function testComposingClasses() { 726 | $box = Cva::cva( 727 | [ 'box', 'box-border' ], 728 | [ 729 | 'variants' => [ 730 | 'margin' => [ 731 | 0 => 'm-0', 732 | 2 => 'm-2', 733 | 4 => 'm-4', 734 | 8 => 'm-8', 735 | ], 736 | 'padding' => [ 737 | 0 => 'p-0', 738 | 2 => 'p-2', 739 | 4 => 'p-4', 740 | 8 => 'p-8', 741 | ], 742 | ], 743 | 'defaultVariants' => [ 744 | 'margin' => 0, 745 | 'padding' => 0, 746 | ], 747 | ] 748 | ); 749 | $card_base = Cva::cva( 750 | [ 'card', 'border-solid', 'border-slate-300', 'rounded' ], 751 | [ 752 | 'variants' => [ 753 | 'shadow' => [ 754 | 'md' => 'drop-shadow-md', 755 | 'lg' => 'drop-shadow-lg', 756 | 'xl' => 'drop-shadow-xl', 757 | ], 758 | ], 759 | ] 760 | ); 761 | $card = function ( $props = [] ) use ( $box, $card_base ) { 762 | return CvaPhp\Clsx::cx( $box( $props ), $card_base( $props ) ); 763 | }; 764 | $this->assertSame( 'box box-border m-0 p-0 card border-solid border-slate-300 rounded', $card() ); 765 | $this->assertSame( 'box box-border m-4 p-0 card border-solid border-slate-300 rounded', $card( [ 'margin' => 4 ] ) ); 766 | $this->assertSame( 'box box-border m-0 p-4 card border-solid border-slate-300 rounded', $card( [ 'padding' => 4 ] ) ); 767 | $this->assertSame( 768 | 'box box-border m-2 p-4 card border-solid border-slate-300 rounded', 769 | $card( 770 | [ 771 | 'margin' => 2, 772 | 'padding' => 4, 773 | ] 774 | ) 775 | ); 776 | $this->assertSame( 'box box-border m-0 p-0 card border-solid border-slate-300 rounded drop-shadow-md', $card( [ 'shadow' => 'md' ] ) ); 777 | } 778 | public function testComposingClassesWithVariants() { 779 | $box = Cva::cva( 780 | [ 'box', 'box-border' ], 781 | [ 782 | 'variants' => [ 783 | 'margin' => [ 784 | 0 => 'm-0', 785 | 2 => 'm-2', 786 | 4 => 'm-4', 787 | 8 => 'm-8', 788 | ], 789 | 'padding' => [ 790 | 0 => 'p-0', 791 | 2 => 'p-2', 792 | 4 => 'p-4', 793 | 8 => 'p-8', 794 | ], 795 | ], 796 | ] 797 | ); 798 | $card_base = Cva::cva( 799 | [ 'card', 'border-solid', 'border-slate-300', 'rounded' ], 800 | [ 801 | 'variants' => [ 802 | 'shadow' => [ 803 | 'md' => 'drop-shadow-md', 804 | 'lg' => 'drop-shadow-lg', 805 | 'xl' => 'drop-shadow-xl', 806 | ], 807 | ], 808 | ] 809 | ); 810 | $card = function ( $props = [] ) use ( $box, $card_base ) { 811 | return CvaPhp\Clsx::cx( $box( $props ), $card_base( $props ) ); 812 | }; 813 | $this->assertSame( 'box box-border card border-solid border-slate-300 rounded', $card() ); 814 | $this->assertSame( 'box box-border m-4 card border-solid border-slate-300 rounded', $card( [ 'margin' => 4 ] ) ); 815 | $this->assertSame( 'box box-border card border-solid border-slate-300 rounded drop-shadow-md', $card( [ 'shadow' => 'md' ] ) ); 816 | } 817 | public function testComposingClassesWithDefaultVariants() { 818 | $box = Cva::cva( 819 | [ 'box', 'box-border' ], 820 | [ 821 | 'variants' => [ 822 | 'margin' => [ 823 | 0 => 'm-0', 824 | 2 => 'm-2', 825 | 4 => 'm-4', 826 | 8 => 'm-8', 827 | ], 828 | 'padding' => [ 829 | 0 => 'p-0', 830 | 2 => 'p-2', 831 | 4 => 'p-4', 832 | 8 => 'p-8', 833 | ], 834 | ], 835 | 'defaultVariants' => [ 836 | 'margin' => 0, 837 | 'padding' => 0, 838 | ], 839 | ] 840 | ); 841 | $card_base = Cva::cva( 842 | [ 'card', 'border-solid', 'border-slate-300', 'rounded' ], 843 | [ 844 | 'variants' => [ 845 | 'shadow' => [ 846 | 'md' => 'drop-shadow-md', 847 | 'lg' => 'drop-shadow-lg', 848 | 'xl' => 'drop-shadow-xl', 849 | ], 850 | ], 851 | ] 852 | ); 853 | $card = function ( $props = [] ) use ( $box, $card_base ) { 854 | return CvaPhp\Clsx::cx( $box( $props ), $card_base( $props ) ); 855 | }; 856 | $this->assertSame( 'box box-border m-0 p-0 card border-solid border-slate-300 rounded', $card() ); 857 | $this->assertSame( 'box box-border m-2 p-0 card border-solid border-slate-300 rounded', $card( [ 'margin' => 2 ] ) ); 858 | $this->assertSame( 'box box-border m-0 p-0 card border-solid border-slate-300 rounded drop-shadow-lg', $card( [ 'shadow' => 'lg' ] ) ); 859 | } 860 | public function testComposingClassesWithCompoundVariants() { 861 | $box = Cva::cva( 862 | [ 'box', 'box-border' ], 863 | [ 864 | 'variants' => [ 865 | 'margin' => [ 866 | 0 => 'm-0', 867 | 2 => 'm-2', 868 | 4 => 'm-4', 869 | 8 => 'm-8', 870 | ], 871 | 'padding' => [ 872 | 0 => 'p-0', 873 | 2 => 'p-2', 874 | 4 => 'p-4', 875 | 8 => 'p-8', 876 | ], 877 | ], 878 | 'defaultVariants' => [ 879 | 'margin' => 0, 880 | 'padding' => 0, 881 | ], 882 | ] 883 | ); 884 | $card_base = Cva::cva( 885 | [ 'card', 'border-solid', 'border-slate-300', 'rounded' ], 886 | [ 887 | 'variants' => [ 888 | 'shadow' => [ 889 | 'md' => 'drop-shadow-md', 890 | 'lg' => 'drop-shadow-lg', 891 | 'xl' => 'drop-shadow-xl', 892 | ], 893 | ], 894 | 'compoundVariants' => [ 895 | [ 896 | 'shadow' => 'md', 897 | 'class' => 'card-md', 898 | ], 899 | ], 900 | ] 901 | ); 902 | $card = function ( $props = [] ) use ( $box, $card_base ) { 903 | return CvaPhp\Clsx::cx( $box( $props ), $card_base( $props ) ); 904 | }; 905 | $this->assertSame( 'box box-border m-0 p-0 card border-solid border-slate-300 rounded', $card() ); 906 | $this->assertSame( 'box box-border m-0 p-0 card border-solid border-slate-300 rounded drop-shadow-md card-md', $card( [ 'shadow' => 'md' ] ) ); 907 | } 908 | 909 | /** 910 | * Edge cases and type extractor 911 | */ 912 | public function testEdgeCases() { 913 | $button = Cva::cva( 914 | null, 915 | [ 916 | 'variants' => [ 917 | 'intent' => [ 918 | 'primary' => 'button--primary', 919 | 'secondary' => 'button--secondary', 920 | ], 921 | ], 922 | ] 923 | ); 924 | $this->assertSame( '', $button( [ 'intent' => null ] ) ); 925 | $this->assertSame( 926 | 'button--primary', 927 | $button( 928 | [ 929 | 'intent' => 'primary', 930 | 'class' => null, 931 | ] 932 | ) 933 | ); 934 | } 935 | public function testTypeExtractorOrInvalidProps() { 936 | $button = Cva::cva( 937 | null, 938 | [ 939 | 'variants' => [ 940 | 'intent' => [ 941 | 'primary' => 'button--primary', 942 | 'secondary' => 'button--secondary', 943 | ], 944 | ], 945 | ] 946 | ); 947 | $this->assertSame( 948 | 'button--primary', 949 | $button( 950 | [ 951 | 'intent' => 'primary', 952 | 'extraProp' => 'shouldBeIgnored', 953 | ] 954 | ) 955 | ); 956 | } 957 | } 958 | -------------------------------------------------------------------------------- /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": "591c443a682a2847414bcd000b4988d6", 8 | "packages": [], 9 | "packages-dev": [ 10 | { 11 | "name": "10up/phpcs-composer", 12 | "version": "3.0.0", 13 | "source": { 14 | "type": "git", 15 | "url": "https://github.com/10up/phpcs-composer.git", 16 | "reference": "04fe5f0d61948f9e38e9cd037a5ee50dcdbf4688" 17 | }, 18 | "dist": { 19 | "type": "zip", 20 | "url": "https://api.github.com/repos/10up/phpcs-composer/zipball/04fe5f0d61948f9e38e9cd037a5ee50dcdbf4688", 21 | "reference": "04fe5f0d61948f9e38e9cd037a5ee50dcdbf4688", 22 | "shasum": "" 23 | }, 24 | "require": { 25 | "automattic/vipwpcs": "^3.0", 26 | "phpcompatibility/phpcompatibility-wp": "^2" 27 | }, 28 | "require-dev": { 29 | "dealerdirect/phpcodesniffer-composer-installer": "*", 30 | "phpcompatibility/php-compatibility": "dev-develop as 9.99.99" 31 | }, 32 | "type": "phpcodesniffer-standard", 33 | "notification-url": "https://packagist.org/downloads/", 34 | "license": [ 35 | "MIT" 36 | ], 37 | "authors": [ 38 | { 39 | "name": "10up", 40 | "homepage": "https://10up.com/" 41 | } 42 | ], 43 | "description": "10up's PHP CodeSniffer Ruleset", 44 | "support": { 45 | "issues": "https://github.com/10up/phpcs-composer/issues", 46 | "source": "https://github.com/10up/phpcs-composer/tree/3.0.0" 47 | }, 48 | "time": "2023-12-14T15:37:22+00:00" 49 | }, 50 | { 51 | "name": "automattic/vipwpcs", 52 | "version": "3.0.1", 53 | "source": { 54 | "type": "git", 55 | "url": "https://github.com/Automattic/VIP-Coding-Standards.git", 56 | "reference": "2b1d206d81b74ed999023cffd924f862ff2753c8" 57 | }, 58 | "dist": { 59 | "type": "zip", 60 | "url": "https://api.github.com/repos/Automattic/VIP-Coding-Standards/zipball/2b1d206d81b74ed999023cffd924f862ff2753c8", 61 | "reference": "2b1d206d81b74ed999023cffd924f862ff2753c8", 62 | "shasum": "" 63 | }, 64 | "require": { 65 | "php": ">=5.4", 66 | "phpcsstandards/phpcsextra": "^1.2.1", 67 | "phpcsstandards/phpcsutils": "^1.0.11", 68 | "sirbrillig/phpcs-variable-analysis": "^2.11.18", 69 | "squizlabs/php_codesniffer": "^3.9.2", 70 | "wp-coding-standards/wpcs": "^3.1.0" 71 | }, 72 | "require-dev": { 73 | "php-parallel-lint/php-console-highlighter": "^1.0.0", 74 | "php-parallel-lint/php-parallel-lint": "^1.3.2", 75 | "phpcompatibility/php-compatibility": "^9", 76 | "phpcsstandards/phpcsdevtools": "^1.0", 77 | "phpunit/phpunit": "^4 || ^5 || ^6 || ^7 || ^8 || ^9" 78 | }, 79 | "type": "phpcodesniffer-standard", 80 | "notification-url": "https://packagist.org/downloads/", 81 | "license": [ 82 | "MIT" 83 | ], 84 | "authors": [ 85 | { 86 | "name": "Contributors", 87 | "homepage": "https://github.com/Automattic/VIP-Coding-Standards/graphs/contributors" 88 | } 89 | ], 90 | "description": "PHP_CodeSniffer rules (sniffs) to enforce WordPress VIP minimum coding conventions", 91 | "keywords": [ 92 | "phpcs", 93 | "standards", 94 | "static analysis", 95 | "wordpress" 96 | ], 97 | "support": { 98 | "issues": "https://github.com/Automattic/VIP-Coding-Standards/issues", 99 | "source": "https://github.com/Automattic/VIP-Coding-Standards", 100 | "wiki": "https://github.com/Automattic/VIP-Coding-Standards/wiki" 101 | }, 102 | "time": "2024-05-10T20:31:09+00:00" 103 | }, 104 | { 105 | "name": "dealerdirect/phpcodesniffer-composer-installer", 106 | "version": "v1.0.0", 107 | "source": { 108 | "type": "git", 109 | "url": "https://github.com/PHPCSStandards/composer-installer.git", 110 | "reference": "4be43904336affa5c2f70744a348312336afd0da" 111 | }, 112 | "dist": { 113 | "type": "zip", 114 | "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/4be43904336affa5c2f70744a348312336afd0da", 115 | "reference": "4be43904336affa5c2f70744a348312336afd0da", 116 | "shasum": "" 117 | }, 118 | "require": { 119 | "composer-plugin-api": "^1.0 || ^2.0", 120 | "php": ">=5.4", 121 | "squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0" 122 | }, 123 | "require-dev": { 124 | "composer/composer": "*", 125 | "ext-json": "*", 126 | "ext-zip": "*", 127 | "php-parallel-lint/php-parallel-lint": "^1.3.1", 128 | "phpcompatibility/php-compatibility": "^9.0", 129 | "yoast/phpunit-polyfills": "^1.0" 130 | }, 131 | "type": "composer-plugin", 132 | "extra": { 133 | "class": "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" 134 | }, 135 | "autoload": { 136 | "psr-4": { 137 | "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" 138 | } 139 | }, 140 | "notification-url": "https://packagist.org/downloads/", 141 | "license": [ 142 | "MIT" 143 | ], 144 | "authors": [ 145 | { 146 | "name": "Franck Nijhof", 147 | "email": "franck.nijhof@dealerdirect.com", 148 | "homepage": "http://www.frenck.nl", 149 | "role": "Developer / IT Manager" 150 | }, 151 | { 152 | "name": "Contributors", 153 | "homepage": "https://github.com/PHPCSStandards/composer-installer/graphs/contributors" 154 | } 155 | ], 156 | "description": "PHP_CodeSniffer Standards Composer Installer Plugin", 157 | "homepage": "http://www.dealerdirect.com", 158 | "keywords": [ 159 | "PHPCodeSniffer", 160 | "PHP_CodeSniffer", 161 | "code quality", 162 | "codesniffer", 163 | "composer", 164 | "installer", 165 | "phpcbf", 166 | "phpcs", 167 | "plugin", 168 | "qa", 169 | "quality", 170 | "standard", 171 | "standards", 172 | "style guide", 173 | "stylecheck", 174 | "tests" 175 | ], 176 | "support": { 177 | "issues": "https://github.com/PHPCSStandards/composer-installer/issues", 178 | "source": "https://github.com/PHPCSStandards/composer-installer" 179 | }, 180 | "time": "2023-01-05T11:28:13+00:00" 181 | }, 182 | { 183 | "name": "myclabs/deep-copy", 184 | "version": "1.13.1", 185 | "source": { 186 | "type": "git", 187 | "url": "https://github.com/myclabs/DeepCopy.git", 188 | "reference": "1720ddd719e16cf0db4eb1c6eca108031636d46c" 189 | }, 190 | "dist": { 191 | "type": "zip", 192 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/1720ddd719e16cf0db4eb1c6eca108031636d46c", 193 | "reference": "1720ddd719e16cf0db4eb1c6eca108031636d46c", 194 | "shasum": "" 195 | }, 196 | "require": { 197 | "php": "^7.1 || ^8.0" 198 | }, 199 | "conflict": { 200 | "doctrine/collections": "<1.6.8", 201 | "doctrine/common": "<2.13.3 || >=3 <3.2.2" 202 | }, 203 | "require-dev": { 204 | "doctrine/collections": "^1.6.8", 205 | "doctrine/common": "^2.13.3 || ^3.2.2", 206 | "phpspec/prophecy": "^1.10", 207 | "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" 208 | }, 209 | "type": "library", 210 | "autoload": { 211 | "files": [ 212 | "src/DeepCopy/deep_copy.php" 213 | ], 214 | "psr-4": { 215 | "DeepCopy\\": "src/DeepCopy/" 216 | } 217 | }, 218 | "notification-url": "https://packagist.org/downloads/", 219 | "license": [ 220 | "MIT" 221 | ], 222 | "description": "Create deep copies (clones) of your objects", 223 | "keywords": [ 224 | "clone", 225 | "copy", 226 | "duplicate", 227 | "object", 228 | "object graph" 229 | ], 230 | "support": { 231 | "issues": "https://github.com/myclabs/DeepCopy/issues", 232 | "source": "https://github.com/myclabs/DeepCopy/tree/1.13.1" 233 | }, 234 | "funding": [ 235 | { 236 | "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", 237 | "type": "tidelift" 238 | } 239 | ], 240 | "time": "2025-04-29T12:36:36+00:00" 241 | }, 242 | { 243 | "name": "nikic/php-parser", 244 | "version": "v5.5.0", 245 | "source": { 246 | "type": "git", 247 | "url": "https://github.com/nikic/PHP-Parser.git", 248 | "reference": "ae59794362fe85e051a58ad36b289443f57be7a9" 249 | }, 250 | "dist": { 251 | "type": "zip", 252 | "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/ae59794362fe85e051a58ad36b289443f57be7a9", 253 | "reference": "ae59794362fe85e051a58ad36b289443f57be7a9", 254 | "shasum": "" 255 | }, 256 | "require": { 257 | "ext-ctype": "*", 258 | "ext-json": "*", 259 | "ext-tokenizer": "*", 260 | "php": ">=7.4" 261 | }, 262 | "require-dev": { 263 | "ircmaxell/php-yacc": "^0.0.7", 264 | "phpunit/phpunit": "^9.0" 265 | }, 266 | "bin": [ 267 | "bin/php-parse" 268 | ], 269 | "type": "library", 270 | "extra": { 271 | "branch-alias": { 272 | "dev-master": "5.0-dev" 273 | } 274 | }, 275 | "autoload": { 276 | "psr-4": { 277 | "PhpParser\\": "lib/PhpParser" 278 | } 279 | }, 280 | "notification-url": "https://packagist.org/downloads/", 281 | "license": [ 282 | "BSD-3-Clause" 283 | ], 284 | "authors": [ 285 | { 286 | "name": "Nikita Popov" 287 | } 288 | ], 289 | "description": "A PHP parser written in PHP", 290 | "keywords": [ 291 | "parser", 292 | "php" 293 | ], 294 | "support": { 295 | "issues": "https://github.com/nikic/PHP-Parser/issues", 296 | "source": "https://github.com/nikic/PHP-Parser/tree/v5.5.0" 297 | }, 298 | "time": "2025-05-31T08:24:38+00:00" 299 | }, 300 | { 301 | "name": "phar-io/manifest", 302 | "version": "2.0.4", 303 | "source": { 304 | "type": "git", 305 | "url": "https://github.com/phar-io/manifest.git", 306 | "reference": "54750ef60c58e43759730615a392c31c80e23176" 307 | }, 308 | "dist": { 309 | "type": "zip", 310 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", 311 | "reference": "54750ef60c58e43759730615a392c31c80e23176", 312 | "shasum": "" 313 | }, 314 | "require": { 315 | "ext-dom": "*", 316 | "ext-libxml": "*", 317 | "ext-phar": "*", 318 | "ext-xmlwriter": "*", 319 | "phar-io/version": "^3.0.1", 320 | "php": "^7.2 || ^8.0" 321 | }, 322 | "type": "library", 323 | "extra": { 324 | "branch-alias": { 325 | "dev-master": "2.0.x-dev" 326 | } 327 | }, 328 | "autoload": { 329 | "classmap": [ 330 | "src/" 331 | ] 332 | }, 333 | "notification-url": "https://packagist.org/downloads/", 334 | "license": [ 335 | "BSD-3-Clause" 336 | ], 337 | "authors": [ 338 | { 339 | "name": "Arne Blankerts", 340 | "email": "arne@blankerts.de", 341 | "role": "Developer" 342 | }, 343 | { 344 | "name": "Sebastian Heuer", 345 | "email": "sebastian@phpeople.de", 346 | "role": "Developer" 347 | }, 348 | { 349 | "name": "Sebastian Bergmann", 350 | "email": "sebastian@phpunit.de", 351 | "role": "Developer" 352 | } 353 | ], 354 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 355 | "support": { 356 | "issues": "https://github.com/phar-io/manifest/issues", 357 | "source": "https://github.com/phar-io/manifest/tree/2.0.4" 358 | }, 359 | "funding": [ 360 | { 361 | "url": "https://github.com/theseer", 362 | "type": "github" 363 | } 364 | ], 365 | "time": "2024-03-03T12:33:53+00:00" 366 | }, 367 | { 368 | "name": "phar-io/version", 369 | "version": "3.2.1", 370 | "source": { 371 | "type": "git", 372 | "url": "https://github.com/phar-io/version.git", 373 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" 374 | }, 375 | "dist": { 376 | "type": "zip", 377 | "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 378 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 379 | "shasum": "" 380 | }, 381 | "require": { 382 | "php": "^7.2 || ^8.0" 383 | }, 384 | "type": "library", 385 | "autoload": { 386 | "classmap": [ 387 | "src/" 388 | ] 389 | }, 390 | "notification-url": "https://packagist.org/downloads/", 391 | "license": [ 392 | "BSD-3-Clause" 393 | ], 394 | "authors": [ 395 | { 396 | "name": "Arne Blankerts", 397 | "email": "arne@blankerts.de", 398 | "role": "Developer" 399 | }, 400 | { 401 | "name": "Sebastian Heuer", 402 | "email": "sebastian@phpeople.de", 403 | "role": "Developer" 404 | }, 405 | { 406 | "name": "Sebastian Bergmann", 407 | "email": "sebastian@phpunit.de", 408 | "role": "Developer" 409 | } 410 | ], 411 | "description": "Library for handling version information and constraints", 412 | "support": { 413 | "issues": "https://github.com/phar-io/version/issues", 414 | "source": "https://github.com/phar-io/version/tree/3.2.1" 415 | }, 416 | "time": "2022-02-21T01:04:05+00:00" 417 | }, 418 | { 419 | "name": "phpcompatibility/php-compatibility", 420 | "version": "9.3.5", 421 | "source": { 422 | "type": "git", 423 | "url": "https://github.com/PHPCompatibility/PHPCompatibility.git", 424 | "reference": "9fb324479acf6f39452e0655d2429cc0d3914243" 425 | }, 426 | "dist": { 427 | "type": "zip", 428 | "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibility/zipball/9fb324479acf6f39452e0655d2429cc0d3914243", 429 | "reference": "9fb324479acf6f39452e0655d2429cc0d3914243", 430 | "shasum": "" 431 | }, 432 | "require": { 433 | "php": ">=5.3", 434 | "squizlabs/php_codesniffer": "^2.3 || ^3.0.2" 435 | }, 436 | "conflict": { 437 | "squizlabs/php_codesniffer": "2.6.2" 438 | }, 439 | "require-dev": { 440 | "phpunit/phpunit": "~4.5 || ^5.0 || ^6.0 || ^7.0" 441 | }, 442 | "suggest": { 443 | "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically.", 444 | "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." 445 | }, 446 | "type": "phpcodesniffer-standard", 447 | "notification-url": "https://packagist.org/downloads/", 448 | "license": [ 449 | "LGPL-3.0-or-later" 450 | ], 451 | "authors": [ 452 | { 453 | "name": "Wim Godden", 454 | "homepage": "https://github.com/wimg", 455 | "role": "lead" 456 | }, 457 | { 458 | "name": "Juliette Reinders Folmer", 459 | "homepage": "https://github.com/jrfnl", 460 | "role": "lead" 461 | }, 462 | { 463 | "name": "Contributors", 464 | "homepage": "https://github.com/PHPCompatibility/PHPCompatibility/graphs/contributors" 465 | } 466 | ], 467 | "description": "A set of sniffs for PHP_CodeSniffer that checks for PHP cross-version compatibility.", 468 | "homepage": "http://techblog.wimgodden.be/tag/codesniffer/", 469 | "keywords": [ 470 | "compatibility", 471 | "phpcs", 472 | "standards" 473 | ], 474 | "support": { 475 | "issues": "https://github.com/PHPCompatibility/PHPCompatibility/issues", 476 | "source": "https://github.com/PHPCompatibility/PHPCompatibility" 477 | }, 478 | "time": "2019-12-27T09:44:58+00:00" 479 | }, 480 | { 481 | "name": "phpcompatibility/phpcompatibility-paragonie", 482 | "version": "1.3.3", 483 | "source": { 484 | "type": "git", 485 | "url": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie.git", 486 | "reference": "293975b465e0e709b571cbf0c957c6c0a7b9a2ac" 487 | }, 488 | "dist": { 489 | "type": "zip", 490 | "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityParagonie/zipball/293975b465e0e709b571cbf0c957c6c0a7b9a2ac", 491 | "reference": "293975b465e0e709b571cbf0c957c6c0a7b9a2ac", 492 | "shasum": "" 493 | }, 494 | "require": { 495 | "phpcompatibility/php-compatibility": "^9.0" 496 | }, 497 | "require-dev": { 498 | "dealerdirect/phpcodesniffer-composer-installer": "^1.0", 499 | "paragonie/random_compat": "dev-master", 500 | "paragonie/sodium_compat": "dev-master" 501 | }, 502 | "suggest": { 503 | "dealerdirect/phpcodesniffer-composer-installer": "^1.0 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.", 504 | "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." 505 | }, 506 | "type": "phpcodesniffer-standard", 507 | "notification-url": "https://packagist.org/downloads/", 508 | "license": [ 509 | "LGPL-3.0-or-later" 510 | ], 511 | "authors": [ 512 | { 513 | "name": "Wim Godden", 514 | "role": "lead" 515 | }, 516 | { 517 | "name": "Juliette Reinders Folmer", 518 | "role": "lead" 519 | } 520 | ], 521 | "description": "A set of rulesets for PHP_CodeSniffer to check for PHP cross-version compatibility issues in projects, while accounting for polyfills provided by the Paragonie polyfill libraries.", 522 | "homepage": "http://phpcompatibility.com/", 523 | "keywords": [ 524 | "compatibility", 525 | "paragonie", 526 | "phpcs", 527 | "polyfill", 528 | "standards", 529 | "static analysis" 530 | ], 531 | "support": { 532 | "issues": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie/issues", 533 | "security": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie/security/policy", 534 | "source": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie" 535 | }, 536 | "funding": [ 537 | { 538 | "url": "https://github.com/PHPCompatibility", 539 | "type": "github" 540 | }, 541 | { 542 | "url": "https://github.com/jrfnl", 543 | "type": "github" 544 | }, 545 | { 546 | "url": "https://opencollective.com/php_codesniffer", 547 | "type": "open_collective" 548 | } 549 | ], 550 | "time": "2024-04-24T21:30:46+00:00" 551 | }, 552 | { 553 | "name": "phpcompatibility/phpcompatibility-wp", 554 | "version": "2.1.7", 555 | "source": { 556 | "type": "git", 557 | "url": "https://github.com/PHPCompatibility/PHPCompatibilityWP.git", 558 | "reference": "5bfbbfbabb3df2b9a83e601de9153e4a7111962c" 559 | }, 560 | "dist": { 561 | "type": "zip", 562 | "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityWP/zipball/5bfbbfbabb3df2b9a83e601de9153e4a7111962c", 563 | "reference": "5bfbbfbabb3df2b9a83e601de9153e4a7111962c", 564 | "shasum": "" 565 | }, 566 | "require": { 567 | "phpcompatibility/php-compatibility": "^9.0", 568 | "phpcompatibility/phpcompatibility-paragonie": "^1.0", 569 | "squizlabs/php_codesniffer": "^3.3" 570 | }, 571 | "require-dev": { 572 | "dealerdirect/phpcodesniffer-composer-installer": "^1.0" 573 | }, 574 | "suggest": { 575 | "dealerdirect/phpcodesniffer-composer-installer": "^1.0 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.", 576 | "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." 577 | }, 578 | "type": "phpcodesniffer-standard", 579 | "notification-url": "https://packagist.org/downloads/", 580 | "license": [ 581 | "LGPL-3.0-or-later" 582 | ], 583 | "authors": [ 584 | { 585 | "name": "Wim Godden", 586 | "role": "lead" 587 | }, 588 | { 589 | "name": "Juliette Reinders Folmer", 590 | "role": "lead" 591 | } 592 | ], 593 | "description": "A ruleset for PHP_CodeSniffer to check for PHP cross-version compatibility issues in projects, while accounting for polyfills provided by WordPress.", 594 | "homepage": "http://phpcompatibility.com/", 595 | "keywords": [ 596 | "compatibility", 597 | "phpcs", 598 | "standards", 599 | "static analysis", 600 | "wordpress" 601 | ], 602 | "support": { 603 | "issues": "https://github.com/PHPCompatibility/PHPCompatibilityWP/issues", 604 | "security": "https://github.com/PHPCompatibility/PHPCompatibilityWP/security/policy", 605 | "source": "https://github.com/PHPCompatibility/PHPCompatibilityWP" 606 | }, 607 | "funding": [ 608 | { 609 | "url": "https://github.com/PHPCompatibility", 610 | "type": "github" 611 | }, 612 | { 613 | "url": "https://github.com/jrfnl", 614 | "type": "github" 615 | }, 616 | { 617 | "url": "https://opencollective.com/php_codesniffer", 618 | "type": "open_collective" 619 | }, 620 | { 621 | "url": "https://thanks.dev/u/gh/phpcompatibility", 622 | "type": "thanks_dev" 623 | } 624 | ], 625 | "time": "2025-05-12T16:38:37+00:00" 626 | }, 627 | { 628 | "name": "phpcsstandards/phpcsextra", 629 | "version": "1.3.0", 630 | "source": { 631 | "type": "git", 632 | "url": "https://github.com/PHPCSStandards/PHPCSExtra.git", 633 | "reference": "46d08eb86eec622b96c466adec3063adfed280dd" 634 | }, 635 | "dist": { 636 | "type": "zip", 637 | "url": "https://api.github.com/repos/PHPCSStandards/PHPCSExtra/zipball/46d08eb86eec622b96c466adec3063adfed280dd", 638 | "reference": "46d08eb86eec622b96c466adec3063adfed280dd", 639 | "shasum": "" 640 | }, 641 | "require": { 642 | "php": ">=5.4", 643 | "phpcsstandards/phpcsutils": "^1.0.9", 644 | "squizlabs/php_codesniffer": "^3.12.1" 645 | }, 646 | "require-dev": { 647 | "php-parallel-lint/php-console-highlighter": "^1.0", 648 | "php-parallel-lint/php-parallel-lint": "^1.3.2", 649 | "phpcsstandards/phpcsdevcs": "^1.1.6", 650 | "phpcsstandards/phpcsdevtools": "^1.2.1", 651 | "phpunit/phpunit": "^4.5 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0" 652 | }, 653 | "type": "phpcodesniffer-standard", 654 | "extra": { 655 | "branch-alias": { 656 | "dev-stable": "1.x-dev", 657 | "dev-develop": "1.x-dev" 658 | } 659 | }, 660 | "notification-url": "https://packagist.org/downloads/", 661 | "license": [ 662 | "LGPL-3.0-or-later" 663 | ], 664 | "authors": [ 665 | { 666 | "name": "Juliette Reinders Folmer", 667 | "homepage": "https://github.com/jrfnl", 668 | "role": "lead" 669 | }, 670 | { 671 | "name": "Contributors", 672 | "homepage": "https://github.com/PHPCSStandards/PHPCSExtra/graphs/contributors" 673 | } 674 | ], 675 | "description": "A collection of sniffs and standards for use with PHP_CodeSniffer.", 676 | "keywords": [ 677 | "PHP_CodeSniffer", 678 | "phpcbf", 679 | "phpcodesniffer-standard", 680 | "phpcs", 681 | "standards", 682 | "static analysis" 683 | ], 684 | "support": { 685 | "issues": "https://github.com/PHPCSStandards/PHPCSExtra/issues", 686 | "security": "https://github.com/PHPCSStandards/PHPCSExtra/security/policy", 687 | "source": "https://github.com/PHPCSStandards/PHPCSExtra" 688 | }, 689 | "funding": [ 690 | { 691 | "url": "https://github.com/PHPCSStandards", 692 | "type": "github" 693 | }, 694 | { 695 | "url": "https://github.com/jrfnl", 696 | "type": "github" 697 | }, 698 | { 699 | "url": "https://opencollective.com/php_codesniffer", 700 | "type": "open_collective" 701 | }, 702 | { 703 | "url": "https://thanks.dev/u/gh/phpcsstandards", 704 | "type": "thanks_dev" 705 | } 706 | ], 707 | "time": "2025-04-20T23:35:32+00:00" 708 | }, 709 | { 710 | "name": "phpcsstandards/phpcsutils", 711 | "version": "1.0.12", 712 | "source": { 713 | "type": "git", 714 | "url": "https://github.com/PHPCSStandards/PHPCSUtils.git", 715 | "reference": "87b233b00daf83fb70f40c9a28692be017ea7c6c" 716 | }, 717 | "dist": { 718 | "type": "zip", 719 | "url": "https://api.github.com/repos/PHPCSStandards/PHPCSUtils/zipball/87b233b00daf83fb70f40c9a28692be017ea7c6c", 720 | "reference": "87b233b00daf83fb70f40c9a28692be017ea7c6c", 721 | "shasum": "" 722 | }, 723 | "require": { 724 | "dealerdirect/phpcodesniffer-composer-installer": "^0.4.1 || ^0.5 || ^0.6.2 || ^0.7 || ^1.0", 725 | "php": ">=5.4", 726 | "squizlabs/php_codesniffer": "^3.10.0 || 4.0.x-dev@dev" 727 | }, 728 | "require-dev": { 729 | "ext-filter": "*", 730 | "php-parallel-lint/php-console-highlighter": "^1.0", 731 | "php-parallel-lint/php-parallel-lint": "^1.3.2", 732 | "phpcsstandards/phpcsdevcs": "^1.1.6", 733 | "yoast/phpunit-polyfills": "^1.1.0 || ^2.0.0" 734 | }, 735 | "type": "phpcodesniffer-standard", 736 | "extra": { 737 | "branch-alias": { 738 | "dev-stable": "1.x-dev", 739 | "dev-develop": "1.x-dev" 740 | } 741 | }, 742 | "autoload": { 743 | "classmap": [ 744 | "PHPCSUtils/" 745 | ] 746 | }, 747 | "notification-url": "https://packagist.org/downloads/", 748 | "license": [ 749 | "LGPL-3.0-or-later" 750 | ], 751 | "authors": [ 752 | { 753 | "name": "Juliette Reinders Folmer", 754 | "homepage": "https://github.com/jrfnl", 755 | "role": "lead" 756 | }, 757 | { 758 | "name": "Contributors", 759 | "homepage": "https://github.com/PHPCSStandards/PHPCSUtils/graphs/contributors" 760 | } 761 | ], 762 | "description": "A suite of utility functions for use with PHP_CodeSniffer", 763 | "homepage": "https://phpcsutils.com/", 764 | "keywords": [ 765 | "PHP_CodeSniffer", 766 | "phpcbf", 767 | "phpcodesniffer-standard", 768 | "phpcs", 769 | "phpcs3", 770 | "standards", 771 | "static analysis", 772 | "tokens", 773 | "utility" 774 | ], 775 | "support": { 776 | "docs": "https://phpcsutils.com/", 777 | "issues": "https://github.com/PHPCSStandards/PHPCSUtils/issues", 778 | "security": "https://github.com/PHPCSStandards/PHPCSUtils/security/policy", 779 | "source": "https://github.com/PHPCSStandards/PHPCSUtils" 780 | }, 781 | "funding": [ 782 | { 783 | "url": "https://github.com/PHPCSStandards", 784 | "type": "github" 785 | }, 786 | { 787 | "url": "https://github.com/jrfnl", 788 | "type": "github" 789 | }, 790 | { 791 | "url": "https://opencollective.com/php_codesniffer", 792 | "type": "open_collective" 793 | } 794 | ], 795 | "time": "2024-05-20T13:34:27+00:00" 796 | }, 797 | { 798 | "name": "phpunit/php-code-coverage", 799 | "version": "12.3.0", 800 | "source": { 801 | "type": "git", 802 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 803 | "reference": "9075a8efc66e11bc55c319062e147bdb06777267" 804 | }, 805 | "dist": { 806 | "type": "zip", 807 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/9075a8efc66e11bc55c319062e147bdb06777267", 808 | "reference": "9075a8efc66e11bc55c319062e147bdb06777267", 809 | "shasum": "" 810 | }, 811 | "require": { 812 | "ext-dom": "*", 813 | "ext-libxml": "*", 814 | "ext-xmlwriter": "*", 815 | "nikic/php-parser": "^5.4.0", 816 | "php": ">=8.3", 817 | "phpunit/php-file-iterator": "^6.0", 818 | "phpunit/php-text-template": "^5.0", 819 | "sebastian/complexity": "^5.0", 820 | "sebastian/environment": "^8.0", 821 | "sebastian/lines-of-code": "^4.0", 822 | "sebastian/version": "^6.0", 823 | "theseer/tokenizer": "^1.2.3" 824 | }, 825 | "require-dev": { 826 | "phpunit/phpunit": "^12.1" 827 | }, 828 | "suggest": { 829 | "ext-pcov": "PHP extension that provides line coverage", 830 | "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" 831 | }, 832 | "type": "library", 833 | "extra": { 834 | "branch-alias": { 835 | "dev-main": "12.3.x-dev" 836 | } 837 | }, 838 | "autoload": { 839 | "classmap": [ 840 | "src/" 841 | ] 842 | }, 843 | "notification-url": "https://packagist.org/downloads/", 844 | "license": [ 845 | "BSD-3-Clause" 846 | ], 847 | "authors": [ 848 | { 849 | "name": "Sebastian Bergmann", 850 | "email": "sebastian@phpunit.de", 851 | "role": "lead" 852 | } 853 | ], 854 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 855 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 856 | "keywords": [ 857 | "coverage", 858 | "testing", 859 | "xunit" 860 | ], 861 | "support": { 862 | "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", 863 | "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", 864 | "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.3.0" 865 | }, 866 | "funding": [ 867 | { 868 | "url": "https://github.com/sebastianbergmann", 869 | "type": "github" 870 | }, 871 | { 872 | "url": "https://liberapay.com/sebastianbergmann", 873 | "type": "liberapay" 874 | }, 875 | { 876 | "url": "https://thanks.dev/u/gh/sebastianbergmann", 877 | "type": "thanks_dev" 878 | }, 879 | { 880 | "url": "https://tidelift.com/funding/github/packagist/phpunit/php-code-coverage", 881 | "type": "tidelift" 882 | } 883 | ], 884 | "time": "2025-05-23T15:49:03+00:00" 885 | }, 886 | { 887 | "name": "phpunit/php-file-iterator", 888 | "version": "6.0.0", 889 | "source": { 890 | "type": "git", 891 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 892 | "reference": "961bc913d42fe24a257bfff826a5068079ac7782" 893 | }, 894 | "dist": { 895 | "type": "zip", 896 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/961bc913d42fe24a257bfff826a5068079ac7782", 897 | "reference": "961bc913d42fe24a257bfff826a5068079ac7782", 898 | "shasum": "" 899 | }, 900 | "require": { 901 | "php": ">=8.3" 902 | }, 903 | "require-dev": { 904 | "phpunit/phpunit": "^12.0" 905 | }, 906 | "type": "library", 907 | "extra": { 908 | "branch-alias": { 909 | "dev-main": "6.0-dev" 910 | } 911 | }, 912 | "autoload": { 913 | "classmap": [ 914 | "src/" 915 | ] 916 | }, 917 | "notification-url": "https://packagist.org/downloads/", 918 | "license": [ 919 | "BSD-3-Clause" 920 | ], 921 | "authors": [ 922 | { 923 | "name": "Sebastian Bergmann", 924 | "email": "sebastian@phpunit.de", 925 | "role": "lead" 926 | } 927 | ], 928 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 929 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 930 | "keywords": [ 931 | "filesystem", 932 | "iterator" 933 | ], 934 | "support": { 935 | "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", 936 | "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", 937 | "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/6.0.0" 938 | }, 939 | "funding": [ 940 | { 941 | "url": "https://github.com/sebastianbergmann", 942 | "type": "github" 943 | } 944 | ], 945 | "time": "2025-02-07T04:58:37+00:00" 946 | }, 947 | { 948 | "name": "phpunit/php-invoker", 949 | "version": "6.0.0", 950 | "source": { 951 | "type": "git", 952 | "url": "https://github.com/sebastianbergmann/php-invoker.git", 953 | "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406" 954 | }, 955 | "dist": { 956 | "type": "zip", 957 | "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/12b54e689b07a25a9b41e57736dfab6ec9ae5406", 958 | "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406", 959 | "shasum": "" 960 | }, 961 | "require": { 962 | "php": ">=8.3" 963 | }, 964 | "require-dev": { 965 | "ext-pcntl": "*", 966 | "phpunit/phpunit": "^12.0" 967 | }, 968 | "suggest": { 969 | "ext-pcntl": "*" 970 | }, 971 | "type": "library", 972 | "extra": { 973 | "branch-alias": { 974 | "dev-main": "6.0-dev" 975 | } 976 | }, 977 | "autoload": { 978 | "classmap": [ 979 | "src/" 980 | ] 981 | }, 982 | "notification-url": "https://packagist.org/downloads/", 983 | "license": [ 984 | "BSD-3-Clause" 985 | ], 986 | "authors": [ 987 | { 988 | "name": "Sebastian Bergmann", 989 | "email": "sebastian@phpunit.de", 990 | "role": "lead" 991 | } 992 | ], 993 | "description": "Invoke callables with a timeout", 994 | "homepage": "https://github.com/sebastianbergmann/php-invoker/", 995 | "keywords": [ 996 | "process" 997 | ], 998 | "support": { 999 | "issues": "https://github.com/sebastianbergmann/php-invoker/issues", 1000 | "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", 1001 | "source": "https://github.com/sebastianbergmann/php-invoker/tree/6.0.0" 1002 | }, 1003 | "funding": [ 1004 | { 1005 | "url": "https://github.com/sebastianbergmann", 1006 | "type": "github" 1007 | } 1008 | ], 1009 | "time": "2025-02-07T04:58:58+00:00" 1010 | }, 1011 | { 1012 | "name": "phpunit/php-text-template", 1013 | "version": "5.0.0", 1014 | "source": { 1015 | "type": "git", 1016 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 1017 | "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53" 1018 | }, 1019 | "dist": { 1020 | "type": "zip", 1021 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/e1367a453f0eda562eedb4f659e13aa900d66c53", 1022 | "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53", 1023 | "shasum": "" 1024 | }, 1025 | "require": { 1026 | "php": ">=8.3" 1027 | }, 1028 | "require-dev": { 1029 | "phpunit/phpunit": "^12.0" 1030 | }, 1031 | "type": "library", 1032 | "extra": { 1033 | "branch-alias": { 1034 | "dev-main": "5.0-dev" 1035 | } 1036 | }, 1037 | "autoload": { 1038 | "classmap": [ 1039 | "src/" 1040 | ] 1041 | }, 1042 | "notification-url": "https://packagist.org/downloads/", 1043 | "license": [ 1044 | "BSD-3-Clause" 1045 | ], 1046 | "authors": [ 1047 | { 1048 | "name": "Sebastian Bergmann", 1049 | "email": "sebastian@phpunit.de", 1050 | "role": "lead" 1051 | } 1052 | ], 1053 | "description": "Simple template engine.", 1054 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 1055 | "keywords": [ 1056 | "template" 1057 | ], 1058 | "support": { 1059 | "issues": "https://github.com/sebastianbergmann/php-text-template/issues", 1060 | "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", 1061 | "source": "https://github.com/sebastianbergmann/php-text-template/tree/5.0.0" 1062 | }, 1063 | "funding": [ 1064 | { 1065 | "url": "https://github.com/sebastianbergmann", 1066 | "type": "github" 1067 | } 1068 | ], 1069 | "time": "2025-02-07T04:59:16+00:00" 1070 | }, 1071 | { 1072 | "name": "phpunit/php-timer", 1073 | "version": "8.0.0", 1074 | "source": { 1075 | "type": "git", 1076 | "url": "https://github.com/sebastianbergmann/php-timer.git", 1077 | "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc" 1078 | }, 1079 | "dist": { 1080 | "type": "zip", 1081 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", 1082 | "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", 1083 | "shasum": "" 1084 | }, 1085 | "require": { 1086 | "php": ">=8.3" 1087 | }, 1088 | "require-dev": { 1089 | "phpunit/phpunit": "^12.0" 1090 | }, 1091 | "type": "library", 1092 | "extra": { 1093 | "branch-alias": { 1094 | "dev-main": "8.0-dev" 1095 | } 1096 | }, 1097 | "autoload": { 1098 | "classmap": [ 1099 | "src/" 1100 | ] 1101 | }, 1102 | "notification-url": "https://packagist.org/downloads/", 1103 | "license": [ 1104 | "BSD-3-Clause" 1105 | ], 1106 | "authors": [ 1107 | { 1108 | "name": "Sebastian Bergmann", 1109 | "email": "sebastian@phpunit.de", 1110 | "role": "lead" 1111 | } 1112 | ], 1113 | "description": "Utility class for timing", 1114 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 1115 | "keywords": [ 1116 | "timer" 1117 | ], 1118 | "support": { 1119 | "issues": "https://github.com/sebastianbergmann/php-timer/issues", 1120 | "security": "https://github.com/sebastianbergmann/php-timer/security/policy", 1121 | "source": "https://github.com/sebastianbergmann/php-timer/tree/8.0.0" 1122 | }, 1123 | "funding": [ 1124 | { 1125 | "url": "https://github.com/sebastianbergmann", 1126 | "type": "github" 1127 | } 1128 | ], 1129 | "time": "2025-02-07T04:59:38+00:00" 1130 | }, 1131 | { 1132 | "name": "phpunit/phpunit", 1133 | "version": "12.1.6", 1134 | "source": { 1135 | "type": "git", 1136 | "url": "https://github.com/sebastianbergmann/phpunit.git", 1137 | "reference": "2fdf0056c673c8f0f1eed00030be5f8243c1e6e0" 1138 | }, 1139 | "dist": { 1140 | "type": "zip", 1141 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/2fdf0056c673c8f0f1eed00030be5f8243c1e6e0", 1142 | "reference": "2fdf0056c673c8f0f1eed00030be5f8243c1e6e0", 1143 | "shasum": "" 1144 | }, 1145 | "require": { 1146 | "ext-dom": "*", 1147 | "ext-json": "*", 1148 | "ext-libxml": "*", 1149 | "ext-mbstring": "*", 1150 | "ext-xml": "*", 1151 | "ext-xmlwriter": "*", 1152 | "myclabs/deep-copy": "^1.13.1", 1153 | "phar-io/manifest": "^2.0.4", 1154 | "phar-io/version": "^3.2.1", 1155 | "php": ">=8.3", 1156 | "phpunit/php-code-coverage": "^12.2.1", 1157 | "phpunit/php-file-iterator": "^6.0.0", 1158 | "phpunit/php-invoker": "^6.0.0", 1159 | "phpunit/php-text-template": "^5.0.0", 1160 | "phpunit/php-timer": "^8.0.0", 1161 | "sebastian/cli-parser": "^4.0.0", 1162 | "sebastian/comparator": "^7.0.1", 1163 | "sebastian/diff": "^7.0.0", 1164 | "sebastian/environment": "^8.0.1", 1165 | "sebastian/exporter": "^7.0.0", 1166 | "sebastian/global-state": "^8.0.0", 1167 | "sebastian/object-enumerator": "^7.0.0", 1168 | "sebastian/type": "^6.0.2", 1169 | "sebastian/version": "^6.0.0", 1170 | "staabm/side-effects-detector": "^1.0.5" 1171 | }, 1172 | "bin": [ 1173 | "phpunit" 1174 | ], 1175 | "type": "library", 1176 | "extra": { 1177 | "branch-alias": { 1178 | "dev-main": "12.1-dev" 1179 | } 1180 | }, 1181 | "autoload": { 1182 | "files": [ 1183 | "src/Framework/Assert/Functions.php" 1184 | ], 1185 | "classmap": [ 1186 | "src/" 1187 | ] 1188 | }, 1189 | "notification-url": "https://packagist.org/downloads/", 1190 | "license": [ 1191 | "BSD-3-Clause" 1192 | ], 1193 | "authors": [ 1194 | { 1195 | "name": "Sebastian Bergmann", 1196 | "email": "sebastian@phpunit.de", 1197 | "role": "lead" 1198 | } 1199 | ], 1200 | "description": "The PHP Unit Testing framework.", 1201 | "homepage": "https://phpunit.de/", 1202 | "keywords": [ 1203 | "phpunit", 1204 | "testing", 1205 | "xunit" 1206 | ], 1207 | "support": { 1208 | "issues": "https://github.com/sebastianbergmann/phpunit/issues", 1209 | "security": "https://github.com/sebastianbergmann/phpunit/security/policy", 1210 | "source": "https://github.com/sebastianbergmann/phpunit/tree/12.1.6" 1211 | }, 1212 | "funding": [ 1213 | { 1214 | "url": "https://phpunit.de/sponsors.html", 1215 | "type": "custom" 1216 | }, 1217 | { 1218 | "url": "https://github.com/sebastianbergmann", 1219 | "type": "github" 1220 | }, 1221 | { 1222 | "url": "https://liberapay.com/sebastianbergmann", 1223 | "type": "liberapay" 1224 | }, 1225 | { 1226 | "url": "https://thanks.dev/u/gh/sebastianbergmann", 1227 | "type": "thanks_dev" 1228 | }, 1229 | { 1230 | "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", 1231 | "type": "tidelift" 1232 | } 1233 | ], 1234 | "time": "2025-05-21T12:36:31+00:00" 1235 | }, 1236 | { 1237 | "name": "sebastian/cli-parser", 1238 | "version": "4.0.0", 1239 | "source": { 1240 | "type": "git", 1241 | "url": "https://github.com/sebastianbergmann/cli-parser.git", 1242 | "reference": "6d584c727d9114bcdc14c86711cd1cad51778e7c" 1243 | }, 1244 | "dist": { 1245 | "type": "zip", 1246 | "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/6d584c727d9114bcdc14c86711cd1cad51778e7c", 1247 | "reference": "6d584c727d9114bcdc14c86711cd1cad51778e7c", 1248 | "shasum": "" 1249 | }, 1250 | "require": { 1251 | "php": ">=8.3" 1252 | }, 1253 | "require-dev": { 1254 | "phpunit/phpunit": "^12.0" 1255 | }, 1256 | "type": "library", 1257 | "extra": { 1258 | "branch-alias": { 1259 | "dev-main": "4.0-dev" 1260 | } 1261 | }, 1262 | "autoload": { 1263 | "classmap": [ 1264 | "src/" 1265 | ] 1266 | }, 1267 | "notification-url": "https://packagist.org/downloads/", 1268 | "license": [ 1269 | "BSD-3-Clause" 1270 | ], 1271 | "authors": [ 1272 | { 1273 | "name": "Sebastian Bergmann", 1274 | "email": "sebastian@phpunit.de", 1275 | "role": "lead" 1276 | } 1277 | ], 1278 | "description": "Library for parsing CLI options", 1279 | "homepage": "https://github.com/sebastianbergmann/cli-parser", 1280 | "support": { 1281 | "issues": "https://github.com/sebastianbergmann/cli-parser/issues", 1282 | "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", 1283 | "source": "https://github.com/sebastianbergmann/cli-parser/tree/4.0.0" 1284 | }, 1285 | "funding": [ 1286 | { 1287 | "url": "https://github.com/sebastianbergmann", 1288 | "type": "github" 1289 | } 1290 | ], 1291 | "time": "2025-02-07T04:53:50+00:00" 1292 | }, 1293 | { 1294 | "name": "sebastian/comparator", 1295 | "version": "7.0.1", 1296 | "source": { 1297 | "type": "git", 1298 | "url": "https://github.com/sebastianbergmann/comparator.git", 1299 | "reference": "b478f34614f934e0291598d0c08cbaba9644bee5" 1300 | }, 1301 | "dist": { 1302 | "type": "zip", 1303 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/b478f34614f934e0291598d0c08cbaba9644bee5", 1304 | "reference": "b478f34614f934e0291598d0c08cbaba9644bee5", 1305 | "shasum": "" 1306 | }, 1307 | "require": { 1308 | "ext-dom": "*", 1309 | "ext-mbstring": "*", 1310 | "php": ">=8.3", 1311 | "sebastian/diff": "^7.0", 1312 | "sebastian/exporter": "^7.0" 1313 | }, 1314 | "require-dev": { 1315 | "phpunit/phpunit": "^12.0" 1316 | }, 1317 | "suggest": { 1318 | "ext-bcmath": "For comparing BcMath\\Number objects" 1319 | }, 1320 | "type": "library", 1321 | "extra": { 1322 | "branch-alias": { 1323 | "dev-main": "7.0-dev" 1324 | } 1325 | }, 1326 | "autoload": { 1327 | "classmap": [ 1328 | "src/" 1329 | ] 1330 | }, 1331 | "notification-url": "https://packagist.org/downloads/", 1332 | "license": [ 1333 | "BSD-3-Clause" 1334 | ], 1335 | "authors": [ 1336 | { 1337 | "name": "Sebastian Bergmann", 1338 | "email": "sebastian@phpunit.de" 1339 | }, 1340 | { 1341 | "name": "Jeff Welch", 1342 | "email": "whatthejeff@gmail.com" 1343 | }, 1344 | { 1345 | "name": "Volker Dusch", 1346 | "email": "github@wallbash.com" 1347 | }, 1348 | { 1349 | "name": "Bernhard Schussek", 1350 | "email": "bschussek@2bepublished.at" 1351 | } 1352 | ], 1353 | "description": "Provides the functionality to compare PHP values for equality", 1354 | "homepage": "https://github.com/sebastianbergmann/comparator", 1355 | "keywords": [ 1356 | "comparator", 1357 | "compare", 1358 | "equality" 1359 | ], 1360 | "support": { 1361 | "issues": "https://github.com/sebastianbergmann/comparator/issues", 1362 | "security": "https://github.com/sebastianbergmann/comparator/security/policy", 1363 | "source": "https://github.com/sebastianbergmann/comparator/tree/7.0.1" 1364 | }, 1365 | "funding": [ 1366 | { 1367 | "url": "https://github.com/sebastianbergmann", 1368 | "type": "github" 1369 | } 1370 | ], 1371 | "time": "2025-03-07T07:00:32+00:00" 1372 | }, 1373 | { 1374 | "name": "sebastian/complexity", 1375 | "version": "5.0.0", 1376 | "source": { 1377 | "type": "git", 1378 | "url": "https://github.com/sebastianbergmann/complexity.git", 1379 | "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb" 1380 | }, 1381 | "dist": { 1382 | "type": "zip", 1383 | "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/bad4316aba5303d0221f43f8cee37eb58d384bbb", 1384 | "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb", 1385 | "shasum": "" 1386 | }, 1387 | "require": { 1388 | "nikic/php-parser": "^5.0", 1389 | "php": ">=8.3" 1390 | }, 1391 | "require-dev": { 1392 | "phpunit/phpunit": "^12.0" 1393 | }, 1394 | "type": "library", 1395 | "extra": { 1396 | "branch-alias": { 1397 | "dev-main": "5.0-dev" 1398 | } 1399 | }, 1400 | "autoload": { 1401 | "classmap": [ 1402 | "src/" 1403 | ] 1404 | }, 1405 | "notification-url": "https://packagist.org/downloads/", 1406 | "license": [ 1407 | "BSD-3-Clause" 1408 | ], 1409 | "authors": [ 1410 | { 1411 | "name": "Sebastian Bergmann", 1412 | "email": "sebastian@phpunit.de", 1413 | "role": "lead" 1414 | } 1415 | ], 1416 | "description": "Library for calculating the complexity of PHP code units", 1417 | "homepage": "https://github.com/sebastianbergmann/complexity", 1418 | "support": { 1419 | "issues": "https://github.com/sebastianbergmann/complexity/issues", 1420 | "security": "https://github.com/sebastianbergmann/complexity/security/policy", 1421 | "source": "https://github.com/sebastianbergmann/complexity/tree/5.0.0" 1422 | }, 1423 | "funding": [ 1424 | { 1425 | "url": "https://github.com/sebastianbergmann", 1426 | "type": "github" 1427 | } 1428 | ], 1429 | "time": "2025-02-07T04:55:25+00:00" 1430 | }, 1431 | { 1432 | "name": "sebastian/diff", 1433 | "version": "7.0.0", 1434 | "source": { 1435 | "type": "git", 1436 | "url": "https://github.com/sebastianbergmann/diff.git", 1437 | "reference": "7ab1ea946c012266ca32390913653d844ecd085f" 1438 | }, 1439 | "dist": { 1440 | "type": "zip", 1441 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7ab1ea946c012266ca32390913653d844ecd085f", 1442 | "reference": "7ab1ea946c012266ca32390913653d844ecd085f", 1443 | "shasum": "" 1444 | }, 1445 | "require": { 1446 | "php": ">=8.3" 1447 | }, 1448 | "require-dev": { 1449 | "phpunit/phpunit": "^12.0", 1450 | "symfony/process": "^7.2" 1451 | }, 1452 | "type": "library", 1453 | "extra": { 1454 | "branch-alias": { 1455 | "dev-main": "7.0-dev" 1456 | } 1457 | }, 1458 | "autoload": { 1459 | "classmap": [ 1460 | "src/" 1461 | ] 1462 | }, 1463 | "notification-url": "https://packagist.org/downloads/", 1464 | "license": [ 1465 | "BSD-3-Clause" 1466 | ], 1467 | "authors": [ 1468 | { 1469 | "name": "Sebastian Bergmann", 1470 | "email": "sebastian@phpunit.de" 1471 | }, 1472 | { 1473 | "name": "Kore Nordmann", 1474 | "email": "mail@kore-nordmann.de" 1475 | } 1476 | ], 1477 | "description": "Diff implementation", 1478 | "homepage": "https://github.com/sebastianbergmann/diff", 1479 | "keywords": [ 1480 | "diff", 1481 | "udiff", 1482 | "unidiff", 1483 | "unified diff" 1484 | ], 1485 | "support": { 1486 | "issues": "https://github.com/sebastianbergmann/diff/issues", 1487 | "security": "https://github.com/sebastianbergmann/diff/security/policy", 1488 | "source": "https://github.com/sebastianbergmann/diff/tree/7.0.0" 1489 | }, 1490 | "funding": [ 1491 | { 1492 | "url": "https://github.com/sebastianbergmann", 1493 | "type": "github" 1494 | } 1495 | ], 1496 | "time": "2025-02-07T04:55:46+00:00" 1497 | }, 1498 | { 1499 | "name": "sebastian/environment", 1500 | "version": "8.0.2", 1501 | "source": { 1502 | "type": "git", 1503 | "url": "https://github.com/sebastianbergmann/environment.git", 1504 | "reference": "d364b9e5d0d3b18a2573351a1786fbf96b7e0792" 1505 | }, 1506 | "dist": { 1507 | "type": "zip", 1508 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/d364b9e5d0d3b18a2573351a1786fbf96b7e0792", 1509 | "reference": "d364b9e5d0d3b18a2573351a1786fbf96b7e0792", 1510 | "shasum": "" 1511 | }, 1512 | "require": { 1513 | "php": ">=8.3" 1514 | }, 1515 | "require-dev": { 1516 | "phpunit/phpunit": "^12.0" 1517 | }, 1518 | "suggest": { 1519 | "ext-posix": "*" 1520 | }, 1521 | "type": "library", 1522 | "extra": { 1523 | "branch-alias": { 1524 | "dev-main": "8.0-dev" 1525 | } 1526 | }, 1527 | "autoload": { 1528 | "classmap": [ 1529 | "src/" 1530 | ] 1531 | }, 1532 | "notification-url": "https://packagist.org/downloads/", 1533 | "license": [ 1534 | "BSD-3-Clause" 1535 | ], 1536 | "authors": [ 1537 | { 1538 | "name": "Sebastian Bergmann", 1539 | "email": "sebastian@phpunit.de" 1540 | } 1541 | ], 1542 | "description": "Provides functionality to handle HHVM/PHP environments", 1543 | "homepage": "https://github.com/sebastianbergmann/environment", 1544 | "keywords": [ 1545 | "Xdebug", 1546 | "environment", 1547 | "hhvm" 1548 | ], 1549 | "support": { 1550 | "issues": "https://github.com/sebastianbergmann/environment/issues", 1551 | "security": "https://github.com/sebastianbergmann/environment/security/policy", 1552 | "source": "https://github.com/sebastianbergmann/environment/tree/8.0.2" 1553 | }, 1554 | "funding": [ 1555 | { 1556 | "url": "https://github.com/sebastianbergmann", 1557 | "type": "github" 1558 | }, 1559 | { 1560 | "url": "https://liberapay.com/sebastianbergmann", 1561 | "type": "liberapay" 1562 | }, 1563 | { 1564 | "url": "https://thanks.dev/u/gh/sebastianbergmann", 1565 | "type": "thanks_dev" 1566 | }, 1567 | { 1568 | "url": "https://tidelift.com/funding/github/packagist/sebastian/environment", 1569 | "type": "tidelift" 1570 | } 1571 | ], 1572 | "time": "2025-05-21T15:05:44+00:00" 1573 | }, 1574 | { 1575 | "name": "sebastian/exporter", 1576 | "version": "7.0.0", 1577 | "source": { 1578 | "type": "git", 1579 | "url": "https://github.com/sebastianbergmann/exporter.git", 1580 | "reference": "76432aafc58d50691a00d86d0632f1217a47b688" 1581 | }, 1582 | "dist": { 1583 | "type": "zip", 1584 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/76432aafc58d50691a00d86d0632f1217a47b688", 1585 | "reference": "76432aafc58d50691a00d86d0632f1217a47b688", 1586 | "shasum": "" 1587 | }, 1588 | "require": { 1589 | "ext-mbstring": "*", 1590 | "php": ">=8.3", 1591 | "sebastian/recursion-context": "^7.0" 1592 | }, 1593 | "require-dev": { 1594 | "phpunit/phpunit": "^12.0" 1595 | }, 1596 | "type": "library", 1597 | "extra": { 1598 | "branch-alias": { 1599 | "dev-main": "7.0-dev" 1600 | } 1601 | }, 1602 | "autoload": { 1603 | "classmap": [ 1604 | "src/" 1605 | ] 1606 | }, 1607 | "notification-url": "https://packagist.org/downloads/", 1608 | "license": [ 1609 | "BSD-3-Clause" 1610 | ], 1611 | "authors": [ 1612 | { 1613 | "name": "Sebastian Bergmann", 1614 | "email": "sebastian@phpunit.de" 1615 | }, 1616 | { 1617 | "name": "Jeff Welch", 1618 | "email": "whatthejeff@gmail.com" 1619 | }, 1620 | { 1621 | "name": "Volker Dusch", 1622 | "email": "github@wallbash.com" 1623 | }, 1624 | { 1625 | "name": "Adam Harvey", 1626 | "email": "aharvey@php.net" 1627 | }, 1628 | { 1629 | "name": "Bernhard Schussek", 1630 | "email": "bschussek@gmail.com" 1631 | } 1632 | ], 1633 | "description": "Provides the functionality to export PHP variables for visualization", 1634 | "homepage": "https://www.github.com/sebastianbergmann/exporter", 1635 | "keywords": [ 1636 | "export", 1637 | "exporter" 1638 | ], 1639 | "support": { 1640 | "issues": "https://github.com/sebastianbergmann/exporter/issues", 1641 | "security": "https://github.com/sebastianbergmann/exporter/security/policy", 1642 | "source": "https://github.com/sebastianbergmann/exporter/tree/7.0.0" 1643 | }, 1644 | "funding": [ 1645 | { 1646 | "url": "https://github.com/sebastianbergmann", 1647 | "type": "github" 1648 | } 1649 | ], 1650 | "time": "2025-02-07T04:56:42+00:00" 1651 | }, 1652 | { 1653 | "name": "sebastian/global-state", 1654 | "version": "8.0.0", 1655 | "source": { 1656 | "type": "git", 1657 | "url": "https://github.com/sebastianbergmann/global-state.git", 1658 | "reference": "570a2aeb26d40f057af686d63c4e99b075fb6cbc" 1659 | }, 1660 | "dist": { 1661 | "type": "zip", 1662 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/570a2aeb26d40f057af686d63c4e99b075fb6cbc", 1663 | "reference": "570a2aeb26d40f057af686d63c4e99b075fb6cbc", 1664 | "shasum": "" 1665 | }, 1666 | "require": { 1667 | "php": ">=8.3", 1668 | "sebastian/object-reflector": "^5.0", 1669 | "sebastian/recursion-context": "^7.0" 1670 | }, 1671 | "require-dev": { 1672 | "ext-dom": "*", 1673 | "phpunit/phpunit": "^12.0" 1674 | }, 1675 | "type": "library", 1676 | "extra": { 1677 | "branch-alias": { 1678 | "dev-main": "8.0-dev" 1679 | } 1680 | }, 1681 | "autoload": { 1682 | "classmap": [ 1683 | "src/" 1684 | ] 1685 | }, 1686 | "notification-url": "https://packagist.org/downloads/", 1687 | "license": [ 1688 | "BSD-3-Clause" 1689 | ], 1690 | "authors": [ 1691 | { 1692 | "name": "Sebastian Bergmann", 1693 | "email": "sebastian@phpunit.de" 1694 | } 1695 | ], 1696 | "description": "Snapshotting of global state", 1697 | "homepage": "https://www.github.com/sebastianbergmann/global-state", 1698 | "keywords": [ 1699 | "global state" 1700 | ], 1701 | "support": { 1702 | "issues": "https://github.com/sebastianbergmann/global-state/issues", 1703 | "security": "https://github.com/sebastianbergmann/global-state/security/policy", 1704 | "source": "https://github.com/sebastianbergmann/global-state/tree/8.0.0" 1705 | }, 1706 | "funding": [ 1707 | { 1708 | "url": "https://github.com/sebastianbergmann", 1709 | "type": "github" 1710 | } 1711 | ], 1712 | "time": "2025-02-07T04:56:59+00:00" 1713 | }, 1714 | { 1715 | "name": "sebastian/lines-of-code", 1716 | "version": "4.0.0", 1717 | "source": { 1718 | "type": "git", 1719 | "url": "https://github.com/sebastianbergmann/lines-of-code.git", 1720 | "reference": "97ffee3bcfb5805568d6af7f0f893678fc076d2f" 1721 | }, 1722 | "dist": { 1723 | "type": "zip", 1724 | "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/97ffee3bcfb5805568d6af7f0f893678fc076d2f", 1725 | "reference": "97ffee3bcfb5805568d6af7f0f893678fc076d2f", 1726 | "shasum": "" 1727 | }, 1728 | "require": { 1729 | "nikic/php-parser": "^5.0", 1730 | "php": ">=8.3" 1731 | }, 1732 | "require-dev": { 1733 | "phpunit/phpunit": "^12.0" 1734 | }, 1735 | "type": "library", 1736 | "extra": { 1737 | "branch-alias": { 1738 | "dev-main": "4.0-dev" 1739 | } 1740 | }, 1741 | "autoload": { 1742 | "classmap": [ 1743 | "src/" 1744 | ] 1745 | }, 1746 | "notification-url": "https://packagist.org/downloads/", 1747 | "license": [ 1748 | "BSD-3-Clause" 1749 | ], 1750 | "authors": [ 1751 | { 1752 | "name": "Sebastian Bergmann", 1753 | "email": "sebastian@phpunit.de", 1754 | "role": "lead" 1755 | } 1756 | ], 1757 | "description": "Library for counting the lines of code in PHP source code", 1758 | "homepage": "https://github.com/sebastianbergmann/lines-of-code", 1759 | "support": { 1760 | "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", 1761 | "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", 1762 | "source": "https://github.com/sebastianbergmann/lines-of-code/tree/4.0.0" 1763 | }, 1764 | "funding": [ 1765 | { 1766 | "url": "https://github.com/sebastianbergmann", 1767 | "type": "github" 1768 | } 1769 | ], 1770 | "time": "2025-02-07T04:57:28+00:00" 1771 | }, 1772 | { 1773 | "name": "sebastian/object-enumerator", 1774 | "version": "7.0.0", 1775 | "source": { 1776 | "type": "git", 1777 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 1778 | "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894" 1779 | }, 1780 | "dist": { 1781 | "type": "zip", 1782 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1effe8e9b8e068e9ae228e542d5d11b5d16db894", 1783 | "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894", 1784 | "shasum": "" 1785 | }, 1786 | "require": { 1787 | "php": ">=8.3", 1788 | "sebastian/object-reflector": "^5.0", 1789 | "sebastian/recursion-context": "^7.0" 1790 | }, 1791 | "require-dev": { 1792 | "phpunit/phpunit": "^12.0" 1793 | }, 1794 | "type": "library", 1795 | "extra": { 1796 | "branch-alias": { 1797 | "dev-main": "7.0-dev" 1798 | } 1799 | }, 1800 | "autoload": { 1801 | "classmap": [ 1802 | "src/" 1803 | ] 1804 | }, 1805 | "notification-url": "https://packagist.org/downloads/", 1806 | "license": [ 1807 | "BSD-3-Clause" 1808 | ], 1809 | "authors": [ 1810 | { 1811 | "name": "Sebastian Bergmann", 1812 | "email": "sebastian@phpunit.de" 1813 | } 1814 | ], 1815 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 1816 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 1817 | "support": { 1818 | "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", 1819 | "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", 1820 | "source": "https://github.com/sebastianbergmann/object-enumerator/tree/7.0.0" 1821 | }, 1822 | "funding": [ 1823 | { 1824 | "url": "https://github.com/sebastianbergmann", 1825 | "type": "github" 1826 | } 1827 | ], 1828 | "time": "2025-02-07T04:57:48+00:00" 1829 | }, 1830 | { 1831 | "name": "sebastian/object-reflector", 1832 | "version": "5.0.0", 1833 | "source": { 1834 | "type": "git", 1835 | "url": "https://github.com/sebastianbergmann/object-reflector.git", 1836 | "reference": "4bfa827c969c98be1e527abd576533293c634f6a" 1837 | }, 1838 | "dist": { 1839 | "type": "zip", 1840 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/4bfa827c969c98be1e527abd576533293c634f6a", 1841 | "reference": "4bfa827c969c98be1e527abd576533293c634f6a", 1842 | "shasum": "" 1843 | }, 1844 | "require": { 1845 | "php": ">=8.3" 1846 | }, 1847 | "require-dev": { 1848 | "phpunit/phpunit": "^12.0" 1849 | }, 1850 | "type": "library", 1851 | "extra": { 1852 | "branch-alias": { 1853 | "dev-main": "5.0-dev" 1854 | } 1855 | }, 1856 | "autoload": { 1857 | "classmap": [ 1858 | "src/" 1859 | ] 1860 | }, 1861 | "notification-url": "https://packagist.org/downloads/", 1862 | "license": [ 1863 | "BSD-3-Clause" 1864 | ], 1865 | "authors": [ 1866 | { 1867 | "name": "Sebastian Bergmann", 1868 | "email": "sebastian@phpunit.de" 1869 | } 1870 | ], 1871 | "description": "Allows reflection of object attributes, including inherited and non-public ones", 1872 | "homepage": "https://github.com/sebastianbergmann/object-reflector/", 1873 | "support": { 1874 | "issues": "https://github.com/sebastianbergmann/object-reflector/issues", 1875 | "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", 1876 | "source": "https://github.com/sebastianbergmann/object-reflector/tree/5.0.0" 1877 | }, 1878 | "funding": [ 1879 | { 1880 | "url": "https://github.com/sebastianbergmann", 1881 | "type": "github" 1882 | } 1883 | ], 1884 | "time": "2025-02-07T04:58:17+00:00" 1885 | }, 1886 | { 1887 | "name": "sebastian/recursion-context", 1888 | "version": "7.0.0", 1889 | "source": { 1890 | "type": "git", 1891 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 1892 | "reference": "c405ae3a63e01b32eb71577f8ec1604e39858a7c" 1893 | }, 1894 | "dist": { 1895 | "type": "zip", 1896 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/c405ae3a63e01b32eb71577f8ec1604e39858a7c", 1897 | "reference": "c405ae3a63e01b32eb71577f8ec1604e39858a7c", 1898 | "shasum": "" 1899 | }, 1900 | "require": { 1901 | "php": ">=8.3" 1902 | }, 1903 | "require-dev": { 1904 | "phpunit/phpunit": "^12.0" 1905 | }, 1906 | "type": "library", 1907 | "extra": { 1908 | "branch-alias": { 1909 | "dev-main": "7.0-dev" 1910 | } 1911 | }, 1912 | "autoload": { 1913 | "classmap": [ 1914 | "src/" 1915 | ] 1916 | }, 1917 | "notification-url": "https://packagist.org/downloads/", 1918 | "license": [ 1919 | "BSD-3-Clause" 1920 | ], 1921 | "authors": [ 1922 | { 1923 | "name": "Sebastian Bergmann", 1924 | "email": "sebastian@phpunit.de" 1925 | }, 1926 | { 1927 | "name": "Jeff Welch", 1928 | "email": "whatthejeff@gmail.com" 1929 | }, 1930 | { 1931 | "name": "Adam Harvey", 1932 | "email": "aharvey@php.net" 1933 | } 1934 | ], 1935 | "description": "Provides functionality to recursively process PHP variables", 1936 | "homepage": "https://github.com/sebastianbergmann/recursion-context", 1937 | "support": { 1938 | "issues": "https://github.com/sebastianbergmann/recursion-context/issues", 1939 | "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", 1940 | "source": "https://github.com/sebastianbergmann/recursion-context/tree/7.0.0" 1941 | }, 1942 | "funding": [ 1943 | { 1944 | "url": "https://github.com/sebastianbergmann", 1945 | "type": "github" 1946 | } 1947 | ], 1948 | "time": "2025-02-07T05:00:01+00:00" 1949 | }, 1950 | { 1951 | "name": "sebastian/type", 1952 | "version": "6.0.2", 1953 | "source": { 1954 | "type": "git", 1955 | "url": "https://github.com/sebastianbergmann/type.git", 1956 | "reference": "1d7cd6e514384c36d7a390347f57c385d4be6069" 1957 | }, 1958 | "dist": { 1959 | "type": "zip", 1960 | "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/1d7cd6e514384c36d7a390347f57c385d4be6069", 1961 | "reference": "1d7cd6e514384c36d7a390347f57c385d4be6069", 1962 | "shasum": "" 1963 | }, 1964 | "require": { 1965 | "php": ">=8.3" 1966 | }, 1967 | "require-dev": { 1968 | "phpunit/phpunit": "^12.0" 1969 | }, 1970 | "type": "library", 1971 | "extra": { 1972 | "branch-alias": { 1973 | "dev-main": "6.0-dev" 1974 | } 1975 | }, 1976 | "autoload": { 1977 | "classmap": [ 1978 | "src/" 1979 | ] 1980 | }, 1981 | "notification-url": "https://packagist.org/downloads/", 1982 | "license": [ 1983 | "BSD-3-Clause" 1984 | ], 1985 | "authors": [ 1986 | { 1987 | "name": "Sebastian Bergmann", 1988 | "email": "sebastian@phpunit.de", 1989 | "role": "lead" 1990 | } 1991 | ], 1992 | "description": "Collection of value objects that represent the types of the PHP type system", 1993 | "homepage": "https://github.com/sebastianbergmann/type", 1994 | "support": { 1995 | "issues": "https://github.com/sebastianbergmann/type/issues", 1996 | "security": "https://github.com/sebastianbergmann/type/security/policy", 1997 | "source": "https://github.com/sebastianbergmann/type/tree/6.0.2" 1998 | }, 1999 | "funding": [ 2000 | { 2001 | "url": "https://github.com/sebastianbergmann", 2002 | "type": "github" 2003 | } 2004 | ], 2005 | "time": "2025-03-18T13:37:31+00:00" 2006 | }, 2007 | { 2008 | "name": "sebastian/version", 2009 | "version": "6.0.0", 2010 | "source": { 2011 | "type": "git", 2012 | "url": "https://github.com/sebastianbergmann/version.git", 2013 | "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c" 2014 | }, 2015 | "dist": { 2016 | "type": "zip", 2017 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/3e6ccf7657d4f0a59200564b08cead899313b53c", 2018 | "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c", 2019 | "shasum": "" 2020 | }, 2021 | "require": { 2022 | "php": ">=8.3" 2023 | }, 2024 | "type": "library", 2025 | "extra": { 2026 | "branch-alias": { 2027 | "dev-main": "6.0-dev" 2028 | } 2029 | }, 2030 | "autoload": { 2031 | "classmap": [ 2032 | "src/" 2033 | ] 2034 | }, 2035 | "notification-url": "https://packagist.org/downloads/", 2036 | "license": [ 2037 | "BSD-3-Clause" 2038 | ], 2039 | "authors": [ 2040 | { 2041 | "name": "Sebastian Bergmann", 2042 | "email": "sebastian@phpunit.de", 2043 | "role": "lead" 2044 | } 2045 | ], 2046 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 2047 | "homepage": "https://github.com/sebastianbergmann/version", 2048 | "support": { 2049 | "issues": "https://github.com/sebastianbergmann/version/issues", 2050 | "security": "https://github.com/sebastianbergmann/version/security/policy", 2051 | "source": "https://github.com/sebastianbergmann/version/tree/6.0.0" 2052 | }, 2053 | "funding": [ 2054 | { 2055 | "url": "https://github.com/sebastianbergmann", 2056 | "type": "github" 2057 | } 2058 | ], 2059 | "time": "2025-02-07T05:00:38+00:00" 2060 | }, 2061 | { 2062 | "name": "sirbrillig/phpcs-variable-analysis", 2063 | "version": "v2.12.0", 2064 | "source": { 2065 | "type": "git", 2066 | "url": "https://github.com/sirbrillig/phpcs-variable-analysis.git", 2067 | "reference": "4debf5383d9ade705e0a25121f16c3fecaf433a7" 2068 | }, 2069 | "dist": { 2070 | "type": "zip", 2071 | "url": "https://api.github.com/repos/sirbrillig/phpcs-variable-analysis/zipball/4debf5383d9ade705e0a25121f16c3fecaf433a7", 2072 | "reference": "4debf5383d9ade705e0a25121f16c3fecaf433a7", 2073 | "shasum": "" 2074 | }, 2075 | "require": { 2076 | "php": ">=5.4.0", 2077 | "squizlabs/php_codesniffer": "^3.5.6" 2078 | }, 2079 | "require-dev": { 2080 | "dealerdirect/phpcodesniffer-composer-installer": "^0.7 || ^1.0", 2081 | "phpcsstandards/phpcsdevcs": "^1.1", 2082 | "phpstan/phpstan": "^1.7", 2083 | "phpunit/phpunit": "^4.8.36 || ^5.7.21 || ^6.5 || ^7.0 || ^8.0 || ^9.0 || ^10.5.32 || ^11.3.3", 2084 | "vimeo/psalm": "^0.2 || ^0.3 || ^1.1 || ^4.24 || ^5.0" 2085 | }, 2086 | "type": "phpcodesniffer-standard", 2087 | "autoload": { 2088 | "psr-4": { 2089 | "VariableAnalysis\\": "VariableAnalysis/" 2090 | } 2091 | }, 2092 | "notification-url": "https://packagist.org/downloads/", 2093 | "license": [ 2094 | "BSD-2-Clause" 2095 | ], 2096 | "authors": [ 2097 | { 2098 | "name": "Sam Graham", 2099 | "email": "php-codesniffer-variableanalysis@illusori.co.uk" 2100 | }, 2101 | { 2102 | "name": "Payton Swick", 2103 | "email": "payton@foolord.com" 2104 | } 2105 | ], 2106 | "description": "A PHPCS sniff to detect problems with variables.", 2107 | "keywords": [ 2108 | "phpcs", 2109 | "static analysis" 2110 | ], 2111 | "support": { 2112 | "issues": "https://github.com/sirbrillig/phpcs-variable-analysis/issues", 2113 | "source": "https://github.com/sirbrillig/phpcs-variable-analysis", 2114 | "wiki": "https://github.com/sirbrillig/phpcs-variable-analysis/wiki" 2115 | }, 2116 | "time": "2025-03-17T16:17:38+00:00" 2117 | }, 2118 | { 2119 | "name": "squizlabs/php_codesniffer", 2120 | "version": "3.13.0", 2121 | "source": { 2122 | "type": "git", 2123 | "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", 2124 | "reference": "65ff2489553b83b4597e89c3b8b721487011d186" 2125 | }, 2126 | "dist": { 2127 | "type": "zip", 2128 | "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/65ff2489553b83b4597e89c3b8b721487011d186", 2129 | "reference": "65ff2489553b83b4597e89c3b8b721487011d186", 2130 | "shasum": "" 2131 | }, 2132 | "require": { 2133 | "ext-simplexml": "*", 2134 | "ext-tokenizer": "*", 2135 | "ext-xmlwriter": "*", 2136 | "php": ">=5.4.0" 2137 | }, 2138 | "require-dev": { 2139 | "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" 2140 | }, 2141 | "bin": [ 2142 | "bin/phpcbf", 2143 | "bin/phpcs" 2144 | ], 2145 | "type": "library", 2146 | "extra": { 2147 | "branch-alias": { 2148 | "dev-master": "3.x-dev" 2149 | } 2150 | }, 2151 | "notification-url": "https://packagist.org/downloads/", 2152 | "license": [ 2153 | "BSD-3-Clause" 2154 | ], 2155 | "authors": [ 2156 | { 2157 | "name": "Greg Sherwood", 2158 | "role": "Former lead" 2159 | }, 2160 | { 2161 | "name": "Juliette Reinders Folmer", 2162 | "role": "Current lead" 2163 | }, 2164 | { 2165 | "name": "Contributors", 2166 | "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" 2167 | } 2168 | ], 2169 | "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", 2170 | "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", 2171 | "keywords": [ 2172 | "phpcs", 2173 | "standards", 2174 | "static analysis" 2175 | ], 2176 | "support": { 2177 | "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", 2178 | "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", 2179 | "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", 2180 | "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" 2181 | }, 2182 | "funding": [ 2183 | { 2184 | "url": "https://github.com/PHPCSStandards", 2185 | "type": "github" 2186 | }, 2187 | { 2188 | "url": "https://github.com/jrfnl", 2189 | "type": "github" 2190 | }, 2191 | { 2192 | "url": "https://opencollective.com/php_codesniffer", 2193 | "type": "open_collective" 2194 | }, 2195 | { 2196 | "url": "https://thanks.dev/u/gh/phpcsstandards", 2197 | "type": "thanks_dev" 2198 | } 2199 | ], 2200 | "time": "2025-05-11T03:36:00+00:00" 2201 | }, 2202 | { 2203 | "name": "staabm/side-effects-detector", 2204 | "version": "1.0.5", 2205 | "source": { 2206 | "type": "git", 2207 | "url": "https://github.com/staabm/side-effects-detector.git", 2208 | "reference": "d8334211a140ce329c13726d4a715adbddd0a163" 2209 | }, 2210 | "dist": { 2211 | "type": "zip", 2212 | "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", 2213 | "reference": "d8334211a140ce329c13726d4a715adbddd0a163", 2214 | "shasum": "" 2215 | }, 2216 | "require": { 2217 | "ext-tokenizer": "*", 2218 | "php": "^7.4 || ^8.0" 2219 | }, 2220 | "require-dev": { 2221 | "phpstan/extension-installer": "^1.4.3", 2222 | "phpstan/phpstan": "^1.12.6", 2223 | "phpunit/phpunit": "^9.6.21", 2224 | "symfony/var-dumper": "^5.4.43", 2225 | "tomasvotruba/type-coverage": "1.0.0", 2226 | "tomasvotruba/unused-public": "1.0.0" 2227 | }, 2228 | "type": "library", 2229 | "autoload": { 2230 | "classmap": [ 2231 | "lib/" 2232 | ] 2233 | }, 2234 | "notification-url": "https://packagist.org/downloads/", 2235 | "license": [ 2236 | "MIT" 2237 | ], 2238 | "description": "A static analysis tool to detect side effects in PHP code", 2239 | "keywords": [ 2240 | "static analysis" 2241 | ], 2242 | "support": { 2243 | "issues": "https://github.com/staabm/side-effects-detector/issues", 2244 | "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" 2245 | }, 2246 | "funding": [ 2247 | { 2248 | "url": "https://github.com/staabm", 2249 | "type": "github" 2250 | } 2251 | ], 2252 | "time": "2024-10-20T05:08:20+00:00" 2253 | }, 2254 | { 2255 | "name": "theseer/tokenizer", 2256 | "version": "1.2.3", 2257 | "source": { 2258 | "type": "git", 2259 | "url": "https://github.com/theseer/tokenizer.git", 2260 | "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" 2261 | }, 2262 | "dist": { 2263 | "type": "zip", 2264 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", 2265 | "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", 2266 | "shasum": "" 2267 | }, 2268 | "require": { 2269 | "ext-dom": "*", 2270 | "ext-tokenizer": "*", 2271 | "ext-xmlwriter": "*", 2272 | "php": "^7.2 || ^8.0" 2273 | }, 2274 | "type": "library", 2275 | "autoload": { 2276 | "classmap": [ 2277 | "src/" 2278 | ] 2279 | }, 2280 | "notification-url": "https://packagist.org/downloads/", 2281 | "license": [ 2282 | "BSD-3-Clause" 2283 | ], 2284 | "authors": [ 2285 | { 2286 | "name": "Arne Blankerts", 2287 | "email": "arne@blankerts.de", 2288 | "role": "Developer" 2289 | } 2290 | ], 2291 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 2292 | "support": { 2293 | "issues": "https://github.com/theseer/tokenizer/issues", 2294 | "source": "https://github.com/theseer/tokenizer/tree/1.2.3" 2295 | }, 2296 | "funding": [ 2297 | { 2298 | "url": "https://github.com/theseer", 2299 | "type": "github" 2300 | } 2301 | ], 2302 | "time": "2024-03-03T12:36:25+00:00" 2303 | }, 2304 | { 2305 | "name": "wp-coding-standards/wpcs", 2306 | "version": "3.1.0", 2307 | "source": { 2308 | "type": "git", 2309 | "url": "https://github.com/WordPress/WordPress-Coding-Standards.git", 2310 | "reference": "9333efcbff231f10dfd9c56bb7b65818b4733ca7" 2311 | }, 2312 | "dist": { 2313 | "type": "zip", 2314 | "url": "https://api.github.com/repos/WordPress/WordPress-Coding-Standards/zipball/9333efcbff231f10dfd9c56bb7b65818b4733ca7", 2315 | "reference": "9333efcbff231f10dfd9c56bb7b65818b4733ca7", 2316 | "shasum": "" 2317 | }, 2318 | "require": { 2319 | "ext-filter": "*", 2320 | "ext-libxml": "*", 2321 | "ext-tokenizer": "*", 2322 | "ext-xmlreader": "*", 2323 | "php": ">=5.4", 2324 | "phpcsstandards/phpcsextra": "^1.2.1", 2325 | "phpcsstandards/phpcsutils": "^1.0.10", 2326 | "squizlabs/php_codesniffer": "^3.9.0" 2327 | }, 2328 | "require-dev": { 2329 | "php-parallel-lint/php-console-highlighter": "^1.0.0", 2330 | "php-parallel-lint/php-parallel-lint": "^1.3.2", 2331 | "phpcompatibility/php-compatibility": "^9.0", 2332 | "phpcsstandards/phpcsdevtools": "^1.2.0", 2333 | "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0" 2334 | }, 2335 | "suggest": { 2336 | "ext-iconv": "For improved results", 2337 | "ext-mbstring": "For improved results" 2338 | }, 2339 | "type": "phpcodesniffer-standard", 2340 | "notification-url": "https://packagist.org/downloads/", 2341 | "license": [ 2342 | "MIT" 2343 | ], 2344 | "authors": [ 2345 | { 2346 | "name": "Contributors", 2347 | "homepage": "https://github.com/WordPress/WordPress-Coding-Standards/graphs/contributors" 2348 | } 2349 | ], 2350 | "description": "PHP_CodeSniffer rules (sniffs) to enforce WordPress coding conventions", 2351 | "keywords": [ 2352 | "phpcs", 2353 | "standards", 2354 | "static analysis", 2355 | "wordpress" 2356 | ], 2357 | "support": { 2358 | "issues": "https://github.com/WordPress/WordPress-Coding-Standards/issues", 2359 | "source": "https://github.com/WordPress/WordPress-Coding-Standards", 2360 | "wiki": "https://github.com/WordPress/WordPress-Coding-Standards/wiki" 2361 | }, 2362 | "funding": [ 2363 | { 2364 | "url": "https://opencollective.com/php_codesniffer", 2365 | "type": "custom" 2366 | } 2367 | ], 2368 | "time": "2024-03-25T16:39:00+00:00" 2369 | } 2370 | ], 2371 | "aliases": [], 2372 | "minimum-stability": "stable", 2373 | "stability-flags": {}, 2374 | "prefer-stable": false, 2375 | "prefer-lowest": false, 2376 | "platform": { 2377 | "php": "^8.1" 2378 | }, 2379 | "platform-dev": {}, 2380 | "plugin-api-version": "2.6.0" 2381 | } 2382 | --------------------------------------------------------------------------------