├── 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 |
--------------------------------------------------------------------------------