diff --git a/.gitignore b/.gitignore
index 98aa1de4..c173028b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,6 +6,3 @@ vendor/
# All zip files
*.zip
-
-# IDE files
-.vscode/*
\ No newline at end of file
diff --git a/bin/build b/bin/build
new file mode 100755
index 00000000..e56e39ef
--- /dev/null
+++ b/bin/build
@@ -0,0 +1,16 @@
+#!/bin/bash
+
+source ~/.nvm/nvm.sh
+nvm use || nvm install $(cat .nvmrc)
+
+case $1 in
+ pnpm)
+ pnpm install && pnpm run build
+ ;;
+ npm)
+ npm install && npm run build
+ ;;
+ *)
+ eval $1
+ ;;
+esac
diff --git a/bin/nvm b/bin/nvm
new file mode 100755
index 00000000..30ce7764
--- /dev/null
+++ b/bin/nvm
@@ -0,0 +1,20 @@
+#! /bin/bash
+
+do_check=false
+do_use=false
+while getopts eu opt; do
+ case $opt in
+ e) do_check=true;;
+ u) do_use=true;;
+ esac
+done
+
+source ~/.nvm/nvm.sh
+
+if $do_check; then
+ command -v nvm
+fi
+
+if $do_use; then
+ nvm use || nvm install $(cat .nvmrc)
+fi
diff --git a/bin/wr b/bin/wr
index 62a8fbe7..13a9d009 100755
--- a/bin/wr
+++ b/bin/wr
@@ -1,7 +1,10 @@
#!/usr/bin/env php
addCommands(
[
new Bulk(),
new VersionReplace(),
+ new Release(),
+ new Simulate(),
+ new Branch(),
]
);
diff --git a/composer.json b/composer.json
index 69988e97..a35dc38e 100644
--- a/composer.json
+++ b/composer.json
@@ -11,7 +11,7 @@
"ext-zip": "*",
"phpcompatibility/php-compatibility": "^9.0",
"php-parallel-lint/php-parallel-lint": "^1.3.1",
- "woocommerce/woorelease": "^2.4",
+ "woocommerce/woorelease": "dev-trunk",
"yoast/phpunit-polyfills": "^1.0",
"dealerdirect/phpcodesniffer-composer-installer": "^1.0",
"wp-coding-standards/wpcs": "^3.0"
diff --git a/composer.lock b/composer.lock
index 8597d933..b5cbe28d 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "fad753b0dacd3ea0a19af9ec6b179c13",
+ "content-hash": "334c7a01cf649a340011cceeafe3ef22",
"packages": [],
"packages-dev": [
{
@@ -97,6 +97,58 @@
},
"time": "2021-12-05T09:10:49+00:00"
},
+ {
+ "name": "czproject/git-php",
+ "version": "v4.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/czproject/git-php.git",
+ "reference": "f7fe85cc526c5f8e7ed809f7f9c68f2696940a8a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/czproject/git-php/zipball/f7fe85cc526c5f8e7ed809f7f9c68f2696940a8a",
+ "reference": "f7fe85cc526c5f8e7ed809f7f9c68f2696940a8a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6.0"
+ },
+ "require-dev": {
+ "nette/tester": "^2.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jan Pecha",
+ "email": "janpecha@email.cz"
+ }
+ ],
+ "description": "Library for work with Git repository in PHP.",
+ "keywords": [
+ "git"
+ ],
+ "support": {
+ "issues": "https://github.com/czproject/git-php/issues",
+ "source": "https://github.com/czproject/git-php/tree/v4.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://www.janpecha.cz/donate/git-php/",
+ "type": "other"
+ }
+ ],
+ "time": "2024-08-05T13:28:31+00:00"
+ },
{
"name": "dealerdirect/phpcodesniffer-composer-installer",
"version": "v1.0.0",
@@ -247,16 +299,16 @@
},
{
"name": "monolog/monolog",
- "version": "2.9.1",
+ "version": "2.9.3",
"source": {
"type": "git",
"url": "https://github.com/Seldaek/monolog.git",
- "reference": "f259e2b15fb95494c83f52d3caad003bbf5ffaa1"
+ "reference": "a30bfe2e142720dfa990d0a7e573997f5d884215"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f259e2b15fb95494c83f52d3caad003bbf5ffaa1",
- "reference": "f259e2b15fb95494c83f52d3caad003bbf5ffaa1",
+ "url": "https://api.github.com/repos/Seldaek/monolog/zipball/a30bfe2e142720dfa990d0a7e573997f5d884215",
+ "reference": "a30bfe2e142720dfa990d0a7e573997f5d884215",
"shasum": ""
},
"require": {
@@ -277,8 +329,8 @@
"mongodb/mongodb": "^1.8",
"php-amqplib/php-amqplib": "~2.4 || ^3",
"phpspec/prophecy": "^1.15",
- "phpstan/phpstan": "^0.12.91",
- "phpunit/phpunit": "^8.5.14",
+ "phpstan/phpstan": "^1.10",
+ "phpunit/phpunit": "^8.5.38 || ^9.6.19",
"predis/predis": "^1.1 || ^2.0",
"rollbar/rollbar": "^1.3 || ^2 || ^3",
"ruflin/elastica": "^7",
@@ -333,7 +385,7 @@
],
"support": {
"issues": "https://github.com/Seldaek/monolog/issues",
- "source": "https://github.com/Seldaek/monolog/tree/2.9.1"
+ "source": "https://github.com/Seldaek/monolog/tree/2.9.3"
},
"funding": [
{
@@ -345,20 +397,20 @@
"type": "tidelift"
}
],
- "time": "2023-02-06T13:44:46+00:00"
+ "time": "2024-04-12T20:52:51+00:00"
},
{
"name": "myclabs/deep-copy",
- "version": "1.11.1",
+ "version": "1.12.0",
"source": {
"type": "git",
"url": "https://github.com/myclabs/DeepCopy.git",
- "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c"
+ "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
- "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c",
+ "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c",
"shasum": ""
},
"require": {
@@ -366,11 +418,12 @@
},
"conflict": {
"doctrine/collections": "<1.6.8",
- "doctrine/common": "<2.13.3 || >=3,<3.2.2"
+ "doctrine/common": "<2.13.3 || >=3 <3.2.2"
},
"require-dev": {
"doctrine/collections": "^1.6.8",
"doctrine/common": "^2.13.3 || ^3.2.2",
+ "phpspec/prophecy": "^1.10",
"phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
},
"type": "library",
@@ -396,7 +449,7 @@
],
"support": {
"issues": "https://github.com/myclabs/DeepCopy/issues",
- "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1"
+ "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0"
},
"funding": [
{
@@ -404,29 +457,31 @@
"type": "tidelift"
}
],
- "time": "2023-03-08T13:26:56+00:00"
+ "time": "2024-06-12T14:39:25+00:00"
},
{
"name": "nikic/php-parser",
- "version": "v4.15.4",
+ "version": "v5.2.0",
"source": {
"type": "git",
"url": "https://github.com/nikic/PHP-Parser.git",
- "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290"
+ "reference": "23c79fbbfb725fb92af9bcf41065c8e9a0d49ddb"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/6bb5176bc4af8bcb7d926f88718db9b96a2d4290",
- "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/23c79fbbfb725fb92af9bcf41065c8e9a0d49ddb",
+ "reference": "23c79fbbfb725fb92af9bcf41065c8e9a0d49ddb",
"shasum": ""
},
"require": {
+ "ext-ctype": "*",
+ "ext-json": "*",
"ext-tokenizer": "*",
- "php": ">=7.0"
+ "php": ">=7.4"
},
"require-dev": {
"ircmaxell/php-yacc": "^0.0.7",
- "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
+ "phpunit/phpunit": "^9.0"
},
"bin": [
"bin/php-parse"
@@ -434,7 +489,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "4.9-dev"
+ "dev-master": "5.0-dev"
}
},
"autoload": {
@@ -458,26 +513,27 @@
],
"support": {
"issues": "https://github.com/nikic/PHP-Parser/issues",
- "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.4"
+ "source": "https://github.com/nikic/PHP-Parser/tree/v5.2.0"
},
- "time": "2023-03-05T19:49:14+00:00"
+ "time": "2024-09-15T16:40:33+00:00"
},
{
"name": "phar-io/manifest",
- "version": "2.0.3",
+ "version": "2.0.4",
"source": {
"type": "git",
"url": "https://github.com/phar-io/manifest.git",
- "reference": "97803eca37d319dfa7826cc2437fc020857acb53"
+ "reference": "54750ef60c58e43759730615a392c31c80e23176"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53",
- "reference": "97803eca37d319dfa7826cc2437fc020857acb53",
+ "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176",
+ "reference": "54750ef60c58e43759730615a392c31c80e23176",
"shasum": ""
},
"require": {
"ext-dom": "*",
+ "ext-libxml": "*",
"ext-phar": "*",
"ext-xmlwriter": "*",
"phar-io/version": "^3.0.1",
@@ -518,9 +574,15 @@
"description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
"support": {
"issues": "https://github.com/phar-io/manifest/issues",
- "source": "https://github.com/phar-io/manifest/tree/2.0.3"
+ "source": "https://github.com/phar-io/manifest/tree/2.0.4"
},
- "time": "2021-07-20T11:28:43+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/theseer",
+ "type": "github"
+ }
+ ],
+ "time": "2024-03-03T12:33:53+00:00"
},
{
"name": "phar-io/version",
@@ -575,16 +637,16 @@
},
{
"name": "php-parallel-lint/php-parallel-lint",
- "version": "v1.3.2",
+ "version": "v1.4.0",
"source": {
"type": "git",
"url": "https://github.com/php-parallel-lint/PHP-Parallel-Lint.git",
- "reference": "6483c9832e71973ed29cf71bd6b3f4fde438a9de"
+ "reference": "6db563514f27e19595a19f45a4bf757b6401194e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-parallel-lint/PHP-Parallel-Lint/zipball/6483c9832e71973ed29cf71bd6b3f4fde438a9de",
- "reference": "6483c9832e71973ed29cf71bd6b3f4fde438a9de",
+ "url": "https://api.github.com/repos/php-parallel-lint/PHP-Parallel-Lint/zipball/6db563514f27e19595a19f45a4bf757b6401194e",
+ "reference": "6db563514f27e19595a19f45a4bf757b6401194e",
"shasum": ""
},
"require": {
@@ -622,13 +684,17 @@
"email": "ahoj@jakubonderka.cz"
}
],
- "description": "This tool check syntax of PHP files about 20x faster than serial check.",
+ "description": "This tool checks the syntax of PHP files about 20x faster than serial check.",
"homepage": "https://github.com/php-parallel-lint/PHP-Parallel-Lint",
+ "keywords": [
+ "lint",
+ "static analysis"
+ ],
"support": {
"issues": "https://github.com/php-parallel-lint/PHP-Parallel-Lint/issues",
- "source": "https://github.com/php-parallel-lint/PHP-Parallel-Lint/tree/v1.3.2"
+ "source": "https://github.com/php-parallel-lint/PHP-Parallel-Lint/tree/v1.4.0"
},
- "time": "2022-02-21T12:50:22+00:00"
+ "time": "2024-03-27T12:14:49+00:00"
},
{
"name": "phpcompatibility/php-compatibility",
@@ -694,29 +760,29 @@
},
{
"name": "phpcsstandards/phpcsextra",
- "version": "1.2.0",
+ "version": "1.2.1",
"source": {
"type": "git",
"url": "https://github.com/PHPCSStandards/PHPCSExtra.git",
- "reference": "78b2cae1e9de1c05f0416de6f9a658cbb83ac324"
+ "reference": "11d387c6642b6e4acaf0bd9bf5203b8cca1ec489"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/PHPCSStandards/PHPCSExtra/zipball/78b2cae1e9de1c05f0416de6f9a658cbb83ac324",
- "reference": "78b2cae1e9de1c05f0416de6f9a658cbb83ac324",
+ "url": "https://api.github.com/repos/PHPCSStandards/PHPCSExtra/zipball/11d387c6642b6e4acaf0bd9bf5203b8cca1ec489",
+ "reference": "11d387c6642b6e4acaf0bd9bf5203b8cca1ec489",
"shasum": ""
},
"require": {
"php": ">=5.4",
- "phpcsstandards/phpcsutils": "^1.0.8",
- "squizlabs/php_codesniffer": "^3.7.1"
+ "phpcsstandards/phpcsutils": "^1.0.9",
+ "squizlabs/php_codesniffer": "^3.8.0"
},
"require-dev": {
"php-parallel-lint/php-console-highlighter": "^1.0",
"php-parallel-lint/php-parallel-lint": "^1.3.2",
"phpcsstandards/phpcsdevcs": "^1.1.6",
"phpcsstandards/phpcsdevtools": "^1.2.1",
- "phpunit/phpunit": "^4.5 || ^5.0 || ^6.0 || ^7.0"
+ "phpunit/phpunit": "^4.5 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0"
},
"type": "phpcodesniffer-standard",
"extra": {
@@ -768,33 +834,33 @@
"type": "open_collective"
}
],
- "time": "2023-12-02T14:30:12+00:00"
+ "time": "2023-12-08T16:49:07+00:00"
},
{
"name": "phpcsstandards/phpcsutils",
- "version": "1.0.8",
+ "version": "1.0.12",
"source": {
"type": "git",
"url": "https://github.com/PHPCSStandards/PHPCSUtils.git",
- "reference": "69465cab9d12454e5e7767b9041af0cd8cd13be7"
+ "reference": "87b233b00daf83fb70f40c9a28692be017ea7c6c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/PHPCSStandards/PHPCSUtils/zipball/69465cab9d12454e5e7767b9041af0cd8cd13be7",
- "reference": "69465cab9d12454e5e7767b9041af0cd8cd13be7",
+ "url": "https://api.github.com/repos/PHPCSStandards/PHPCSUtils/zipball/87b233b00daf83fb70f40c9a28692be017ea7c6c",
+ "reference": "87b233b00daf83fb70f40c9a28692be017ea7c6c",
"shasum": ""
},
"require": {
"dealerdirect/phpcodesniffer-composer-installer": "^0.4.1 || ^0.5 || ^0.6.2 || ^0.7 || ^1.0",
"php": ">=5.4",
- "squizlabs/php_codesniffer": "^3.7.1 || 4.0.x-dev@dev"
+ "squizlabs/php_codesniffer": "^3.10.0 || 4.0.x-dev@dev"
},
"require-dev": {
"ext-filter": "*",
"php-parallel-lint/php-console-highlighter": "^1.0",
"php-parallel-lint/php-parallel-lint": "^1.3.2",
"phpcsstandards/phpcsdevcs": "^1.1.6",
- "yoast/phpunit-polyfills": "^1.0.5 || ^2.0.0"
+ "yoast/phpunit-polyfills": "^1.1.0 || ^2.0.0"
},
"type": "phpcodesniffer-standard",
"extra": {
@@ -839,41 +905,56 @@
"support": {
"docs": "https://phpcsutils.com/",
"issues": "https://github.com/PHPCSStandards/PHPCSUtils/issues",
+ "security": "https://github.com/PHPCSStandards/PHPCSUtils/security/policy",
"source": "https://github.com/PHPCSStandards/PHPCSUtils"
},
- "time": "2023-07-16T21:39:41+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/PHPCSStandards",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/jrfnl",
+ "type": "github"
+ },
+ {
+ "url": "https://opencollective.com/php_codesniffer",
+ "type": "open_collective"
+ }
+ ],
+ "time": "2024-05-20T13:34:27+00:00"
},
{
"name": "phpunit/php-code-coverage",
- "version": "9.2.26",
+ "version": "9.2.32",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
- "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1"
+ "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/443bc6912c9bd5b409254a40f4b0f4ced7c80ea1",
- "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/85402a822d1ecf1db1096959413d35e1c37cf1a5",
+ "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5",
"shasum": ""
},
"require": {
"ext-dom": "*",
"ext-libxml": "*",
"ext-xmlwriter": "*",
- "nikic/php-parser": "^4.15",
+ "nikic/php-parser": "^4.19.1 || ^5.1.0",
"php": ">=7.3",
- "phpunit/php-file-iterator": "^3.0.3",
- "phpunit/php-text-template": "^2.0.2",
- "sebastian/code-unit-reverse-lookup": "^2.0.2",
- "sebastian/complexity": "^2.0",
- "sebastian/environment": "^5.1.2",
- "sebastian/lines-of-code": "^1.0.3",
- "sebastian/version": "^3.0.1",
- "theseer/tokenizer": "^1.2.0"
+ "phpunit/php-file-iterator": "^3.0.6",
+ "phpunit/php-text-template": "^2.0.4",
+ "sebastian/code-unit-reverse-lookup": "^2.0.3",
+ "sebastian/complexity": "^2.0.3",
+ "sebastian/environment": "^5.1.5",
+ "sebastian/lines-of-code": "^1.0.4",
+ "sebastian/version": "^3.0.2",
+ "theseer/tokenizer": "^1.2.3"
},
"require-dev": {
- "phpunit/phpunit": "^9.3"
+ "phpunit/phpunit": "^9.6"
},
"suggest": {
"ext-pcov": "PHP extension that provides line coverage",
@@ -882,7 +963,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "9.2-dev"
+ "dev-main": "9.2.x-dev"
}
},
"autoload": {
@@ -910,7 +991,8 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
- "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.26"
+ "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.32"
},
"funding": [
{
@@ -918,7 +1000,7 @@
"type": "github"
}
],
- "time": "2023-03-06T12:58:08+00:00"
+ "time": "2024-08-22T04:23:01+00:00"
},
{
"name": "phpunit/php-file-iterator",
@@ -1163,45 +1245,45 @@
},
{
"name": "phpunit/phpunit",
- "version": "9.6.6",
+ "version": "9.6.21",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "b65d59a059d3004a040c16a82e07bbdf6cfdd115"
+ "reference": "de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b65d59a059d3004a040c16a82e07bbdf6cfdd115",
- "reference": "b65d59a059d3004a040c16a82e07bbdf6cfdd115",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa",
+ "reference": "de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa",
"shasum": ""
},
"require": {
- "doctrine/instantiator": "^1.3.1 || ^2",
+ "doctrine/instantiator": "^1.5.0 || ^2",
"ext-dom": "*",
"ext-json": "*",
"ext-libxml": "*",
"ext-mbstring": "*",
"ext-xml": "*",
"ext-xmlwriter": "*",
- "myclabs/deep-copy": "^1.10.1",
- "phar-io/manifest": "^2.0.3",
- "phar-io/version": "^3.0.2",
+ "myclabs/deep-copy": "^1.12.0",
+ "phar-io/manifest": "^2.0.4",
+ "phar-io/version": "^3.2.1",
"php": ">=7.3",
- "phpunit/php-code-coverage": "^9.2.13",
- "phpunit/php-file-iterator": "^3.0.5",
+ "phpunit/php-code-coverage": "^9.2.32",
+ "phpunit/php-file-iterator": "^3.0.6",
"phpunit/php-invoker": "^3.1.1",
- "phpunit/php-text-template": "^2.0.3",
- "phpunit/php-timer": "^5.0.2",
- "sebastian/cli-parser": "^1.0.1",
- "sebastian/code-unit": "^1.0.6",
+ "phpunit/php-text-template": "^2.0.4",
+ "phpunit/php-timer": "^5.0.3",
+ "sebastian/cli-parser": "^1.0.2",
+ "sebastian/code-unit": "^1.0.8",
"sebastian/comparator": "^4.0.8",
- "sebastian/diff": "^4.0.3",
- "sebastian/environment": "^5.1.3",
- "sebastian/exporter": "^4.0.5",
- "sebastian/global-state": "^5.0.1",
- "sebastian/object-enumerator": "^4.0.3",
- "sebastian/resource-operations": "^3.0.3",
- "sebastian/type": "^3.2",
+ "sebastian/diff": "^4.0.6",
+ "sebastian/environment": "^5.1.5",
+ "sebastian/exporter": "^4.0.6",
+ "sebastian/global-state": "^5.0.7",
+ "sebastian/object-enumerator": "^4.0.4",
+ "sebastian/resource-operations": "^3.0.4",
+ "sebastian/type": "^3.2.1",
"sebastian/version": "^3.0.2"
},
"suggest": {
@@ -1246,7 +1328,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
"security": "https://github.com/sebastianbergmann/phpunit/security/policy",
- "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.6"
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.21"
},
"funding": [
{
@@ -1262,7 +1344,7 @@
"type": "tidelift"
}
],
- "time": "2023-03-27T11:43:46+00:00"
+ "time": "2024-09-19T10:50:18+00:00"
},
{
"name": "psr/container",
@@ -1414,16 +1496,16 @@
},
{
"name": "sebastian/cli-parser",
- "version": "1.0.1",
+ "version": "1.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/cli-parser.git",
- "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2"
+ "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2",
- "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2",
+ "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b",
+ "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b",
"shasum": ""
},
"require": {
@@ -1458,7 +1540,7 @@
"homepage": "https://github.com/sebastianbergmann/cli-parser",
"support": {
"issues": "https://github.com/sebastianbergmann/cli-parser/issues",
- "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1"
+ "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2"
},
"funding": [
{
@@ -1466,7 +1548,7 @@
"type": "github"
}
],
- "time": "2020-09-28T06:08:49+00:00"
+ "time": "2024-03-02T06:27:43+00:00"
},
{
"name": "sebastian/code-unit",
@@ -1655,20 +1737,20 @@
},
{
"name": "sebastian/complexity",
- "version": "2.0.2",
+ "version": "2.0.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/complexity.git",
- "reference": "739b35e53379900cc9ac327b2147867b8b6efd88"
+ "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88",
- "reference": "739b35e53379900cc9ac327b2147867b8b6efd88",
+ "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a",
+ "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a",
"shasum": ""
},
"require": {
- "nikic/php-parser": "^4.7",
+ "nikic/php-parser": "^4.18 || ^5.0",
"php": ">=7.3"
},
"require-dev": {
@@ -1700,7 +1782,7 @@
"homepage": "https://github.com/sebastianbergmann/complexity",
"support": {
"issues": "https://github.com/sebastianbergmann/complexity/issues",
- "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2"
+ "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3"
},
"funding": [
{
@@ -1708,20 +1790,20 @@
"type": "github"
}
],
- "time": "2020-10-26T15:52:27+00:00"
+ "time": "2023-12-22T06:19:30+00:00"
},
{
"name": "sebastian/diff",
- "version": "4.0.4",
+ "version": "4.0.6",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/diff.git",
- "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d"
+ "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d",
- "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc",
+ "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc",
"shasum": ""
},
"require": {
@@ -1766,7 +1848,7 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/diff/issues",
- "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4"
+ "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6"
},
"funding": [
{
@@ -1774,7 +1856,7 @@
"type": "github"
}
],
- "time": "2020-10-26T13:10:38+00:00"
+ "time": "2024-03-02T06:30:58+00:00"
},
{
"name": "sebastian/environment",
@@ -1841,16 +1923,16 @@
},
{
"name": "sebastian/exporter",
- "version": "4.0.5",
+ "version": "4.0.6",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/exporter.git",
- "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d"
+ "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d",
- "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72",
+ "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72",
"shasum": ""
},
"require": {
@@ -1906,7 +1988,7 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/exporter/issues",
- "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5"
+ "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6"
},
"funding": [
{
@@ -1914,20 +1996,20 @@
"type": "github"
}
],
- "time": "2022-09-14T06:03:37+00:00"
+ "time": "2024-03-02T06:33:00+00:00"
},
{
"name": "sebastian/global-state",
- "version": "5.0.5",
+ "version": "5.0.7",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/global-state.git",
- "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2"
+ "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2",
- "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9",
+ "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9",
"shasum": ""
},
"require": {
@@ -1970,7 +2052,7 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/global-state/issues",
- "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5"
+ "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7"
},
"funding": [
{
@@ -1978,24 +2060,24 @@
"type": "github"
}
],
- "time": "2022-02-14T08:28:10+00:00"
+ "time": "2024-03-02T06:35:11+00:00"
},
{
"name": "sebastian/lines-of-code",
- "version": "1.0.3",
+ "version": "1.0.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/lines-of-code.git",
- "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc"
+ "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc",
- "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc",
+ "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5",
+ "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5",
"shasum": ""
},
"require": {
- "nikic/php-parser": "^4.6",
+ "nikic/php-parser": "^4.18 || ^5.0",
"php": ">=7.3"
},
"require-dev": {
@@ -2027,7 +2109,7 @@
"homepage": "https://github.com/sebastianbergmann/lines-of-code",
"support": {
"issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
- "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3"
+ "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4"
},
"funding": [
{
@@ -2035,7 +2117,7 @@
"type": "github"
}
],
- "time": "2020-11-28T06:42:11+00:00"
+ "time": "2023-12-22T06:20:34+00:00"
},
{
"name": "sebastian/object-enumerator",
@@ -2214,16 +2296,16 @@
},
{
"name": "sebastian/resource-operations",
- "version": "3.0.3",
+ "version": "3.0.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/resource-operations.git",
- "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8"
+ "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
- "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
+ "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e",
+ "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e",
"shasum": ""
},
"require": {
@@ -2235,7 +2317,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.0-dev"
+ "dev-main": "3.0-dev"
}
},
"autoload": {
@@ -2256,8 +2338,7 @@
"description": "Provides a list of PHP built-in functions that operate on resources",
"homepage": "https://www.github.com/sebastianbergmann/resource-operations",
"support": {
- "issues": "https://github.com/sebastianbergmann/resource-operations/issues",
- "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3"
+ "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4"
},
"funding": [
{
@@ -2265,7 +2346,7 @@
"type": "github"
}
],
- "time": "2020-09-28T06:45:17+00:00"
+ "time": "2024-03-14T16:00:52+00:00"
},
{
"name": "sebastian/type",
@@ -2378,16 +2459,16 @@
},
{
"name": "squizlabs/php_codesniffer",
- "version": "3.7.2",
+ "version": "3.10.3",
"source": {
"type": "git",
- "url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
- "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879"
+ "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git",
+ "reference": "62d32998e820bddc40f99f8251958aed187a5c9c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/ed8e00df0a83aa96acf703f8c2979ff33341f879",
- "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879",
+ "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/62d32998e820bddc40f99f8251958aed187a5c9c",
+ "reference": "62d32998e820bddc40f99f8251958aed187a5c9c",
"shasum": ""
},
"require": {
@@ -2397,11 +2478,11 @@
"php": ">=5.4.0"
},
"require-dev": {
- "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0"
+ "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4"
},
"bin": [
- "bin/phpcs",
- "bin/phpcbf"
+ "bin/phpcbf",
+ "bin/phpcs"
],
"type": "library",
"extra": {
@@ -2416,35 +2497,58 @@
"authors": [
{
"name": "Greg Sherwood",
- "role": "lead"
+ "role": "Former lead"
+ },
+ {
+ "name": "Juliette Reinders Folmer",
+ "role": "Current lead"
+ },
+ {
+ "name": "Contributors",
+ "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors"
}
],
"description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
- "homepage": "https://github.com/squizlabs/PHP_CodeSniffer",
+ "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer",
"keywords": [
"phpcs",
"standards",
"static analysis"
],
"support": {
- "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues",
- "source": "https://github.com/squizlabs/PHP_CodeSniffer",
- "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki"
+ "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues",
+ "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy",
+ "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer",
+ "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki"
},
- "time": "2023-02-22T23:07:41+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/PHPCSStandards",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/jrfnl",
+ "type": "github"
+ },
+ {
+ "url": "https://opencollective.com/php_codesniffer",
+ "type": "open_collective"
+ }
+ ],
+ "time": "2024-09-18T10:38:58+00:00"
},
{
"name": "symfony/config",
- "version": "v5.4.21",
+ "version": "v5.4.40",
"source": {
"type": "git",
"url": "https://github.com/symfony/config.git",
- "reference": "2a6b1111d038adfa15d52c0871e540f3b352d1e4"
+ "reference": "d4e1db78421163b98dd9971d247fd0df4a57ee5e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/config/zipball/2a6b1111d038adfa15d52c0871e540f3b352d1e4",
- "reference": "2a6b1111d038adfa15d52c0871e540f3b352d1e4",
+ "url": "https://api.github.com/repos/symfony/config/zipball/d4e1db78421163b98dd9971d247fd0df4a57ee5e",
+ "reference": "d4e1db78421163b98dd9971d247fd0df4a57ee5e",
"shasum": ""
},
"require": {
@@ -2494,7 +2598,7 @@
"description": "Helps you find, load, combine, autofill and validate configuration values of any kind",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/config/tree/v5.4.21"
+ "source": "https://github.com/symfony/config/tree/v5.4.40"
},
"funding": [
{
@@ -2510,20 +2614,20 @@
"type": "tidelift"
}
],
- "time": "2023-02-14T08:03:56+00:00"
+ "time": "2024-05-31T14:33:22+00:00"
},
{
"name": "symfony/console",
- "version": "v5.4.22",
+ "version": "v5.4.44",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "3cd51fd2e6c461ca678f84d419461281bd87a0a8"
+ "reference": "5b5a0aa66e3296e303e22490f90f521551835a83"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/3cd51fd2e6c461ca678f84d419461281bd87a0a8",
- "reference": "3cd51fd2e6c461ca678f84d419461281bd87a0a8",
+ "url": "https://api.github.com/repos/symfony/console/zipball/5b5a0aa66e3296e303e22490f90f521551835a83",
+ "reference": "5b5a0aa66e3296e303e22490f90f521551835a83",
"shasum": ""
},
"require": {
@@ -2593,7 +2697,7 @@
"terminal"
],
"support": {
- "source": "https://github.com/symfony/console/tree/v5.4.22"
+ "source": "https://github.com/symfony/console/tree/v5.4.44"
},
"funding": [
{
@@ -2609,20 +2713,20 @@
"type": "tidelift"
}
],
- "time": "2023-03-25T09:27:28+00:00"
+ "time": "2024-09-20T07:56:40+00:00"
},
{
"name": "symfony/dependency-injection",
- "version": "v5.4.22",
+ "version": "v5.4.44",
"source": {
"type": "git",
"url": "https://github.com/symfony/dependency-injection.git",
- "reference": "e1b7c1432efb4ad1dd89d62906187271e2601ed9"
+ "reference": "23eb9f3803a931aef16a65f362a9aeb0640a1374"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/e1b7c1432efb4ad1dd89d62906187271e2601ed9",
- "reference": "e1b7c1432efb4ad1dd89d62906187271e2601ed9",
+ "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/23eb9f3803a931aef16a65f362a9aeb0640a1374",
+ "reference": "23eb9f3803a931aef16a65f362a9aeb0640a1374",
"shasum": ""
},
"require": {
@@ -2682,7 +2786,7 @@
"description": "Allows you to standardize and centralize the way objects are constructed in your application",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/dependency-injection/tree/v5.4.22"
+ "source": "https://github.com/symfony/dependency-injection/tree/v5.4.44"
},
"funding": [
{
@@ -2698,20 +2802,20 @@
"type": "tidelift"
}
],
- "time": "2023-03-10T10:02:45+00:00"
+ "time": "2024-09-12T20:01:35+00:00"
},
{
"name": "symfony/deprecation-contracts",
- "version": "v2.5.2",
+ "version": "v2.5.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/deprecation-contracts.git",
- "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66"
+ "reference": "80d075412b557d41002320b96a096ca65aa2c98d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
- "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/80d075412b557d41002320b96a096ca65aa2c98d",
+ "reference": "80d075412b557d41002320b96a096ca65aa2c98d",
"shasum": ""
},
"require": {
@@ -2749,7 +2853,7 @@
"description": "A generic function and convention to trigger deprecation notices",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2"
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.3"
},
"funding": [
{
@@ -2765,20 +2869,20 @@
"type": "tidelift"
}
],
- "time": "2022-01-02T09:53:40+00:00"
+ "time": "2023-01-24T14:02:46+00:00"
},
{
"name": "symfony/error-handler",
- "version": "v5.4.21",
+ "version": "v5.4.42",
"source": {
"type": "git",
"url": "https://github.com/symfony/error-handler.git",
- "reference": "56a94aa8cb5a5fbc411551d8d014a296b5456549"
+ "reference": "db15ba0fd50890156ed40087ccedc7851a1f5b76"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/error-handler/zipball/56a94aa8cb5a5fbc411551d8d014a296b5456549",
- "reference": "56a94aa8cb5a5fbc411551d8d014a296b5456549",
+ "url": "https://api.github.com/repos/symfony/error-handler/zipball/db15ba0fd50890156ed40087ccedc7851a1f5b76",
+ "reference": "db15ba0fd50890156ed40087ccedc7851a1f5b76",
"shasum": ""
},
"require": {
@@ -2820,7 +2924,7 @@
"description": "Provides tools to manage errors and ease debugging PHP code",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/error-handler/tree/v5.4.21"
+ "source": "https://github.com/symfony/error-handler/tree/v5.4.42"
},
"funding": [
{
@@ -2836,20 +2940,20 @@
"type": "tidelift"
}
],
- "time": "2023-02-14T08:03:56+00:00"
+ "time": "2024-07-23T12:34:05+00:00"
},
{
"name": "symfony/event-dispatcher",
- "version": "v5.4.22",
+ "version": "v5.4.40",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher.git",
- "reference": "1df20e45d56da29a4b1d8259dd6e950acbf1b13f"
+ "reference": "a54e2a8a114065f31020d6a89ede83e34c3b27a4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/1df20e45d56da29a4b1d8259dd6e950acbf1b13f",
- "reference": "1df20e45d56da29a4b1d8259dd6e950acbf1b13f",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/a54e2a8a114065f31020d6a89ede83e34c3b27a4",
+ "reference": "a54e2a8a114065f31020d6a89ede83e34c3b27a4",
"shasum": ""
},
"require": {
@@ -2905,7 +3009,7 @@
"description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.22"
+ "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.40"
},
"funding": [
{
@@ -2921,20 +3025,20 @@
"type": "tidelift"
}
],
- "time": "2023-03-17T11:31:58+00:00"
+ "time": "2024-05-31T14:33:22+00:00"
},
{
"name": "symfony/event-dispatcher-contracts",
- "version": "v2.5.2",
+ "version": "v2.5.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher-contracts.git",
- "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1"
+ "reference": "540f4c73e87fd0c71ca44a6aa305d024ac68cb73"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/f98b54df6ad059855739db6fcbc2d36995283fe1",
- "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/540f4c73e87fd0c71ca44a6aa305d024ac68cb73",
+ "reference": "540f4c73e87fd0c71ca44a6aa305d024ac68cb73",
"shasum": ""
},
"require": {
@@ -2984,7 +3088,7 @@
"standards"
],
"support": {
- "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.2"
+ "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.3"
},
"funding": [
{
@@ -3000,20 +3104,20 @@
"type": "tidelift"
}
],
- "time": "2022-01-02T09:53:40+00:00"
+ "time": "2024-01-23T13:51:25+00:00"
},
{
"name": "symfony/filesystem",
- "version": "v5.4.21",
+ "version": "v5.4.44",
"source": {
"type": "git",
"url": "https://github.com/symfony/filesystem.git",
- "reference": "e75960b1bbfd2b8c9e483e0d74811d555ca3de9f"
+ "reference": "76c3818964e9d32be3862c9318ae3ba9aa280ddc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/filesystem/zipball/e75960b1bbfd2b8c9e483e0d74811d555ca3de9f",
- "reference": "e75960b1bbfd2b8c9e483e0d74811d555ca3de9f",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/76c3818964e9d32be3862c9318ae3ba9aa280ddc",
+ "reference": "76c3818964e9d32be3862c9318ae3ba9aa280ddc",
"shasum": ""
},
"require": {
@@ -3022,6 +3126,9 @@
"symfony/polyfill-mbstring": "~1.8",
"symfony/polyfill-php80": "^1.16"
},
+ "require-dev": {
+ "symfony/process": "^5.4|^6.4"
+ },
"type": "library",
"autoload": {
"psr-4": {
@@ -3048,7 +3155,7 @@
"description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/filesystem/tree/v5.4.21"
+ "source": "https://github.com/symfony/filesystem/tree/v5.4.44"
},
"funding": [
{
@@ -3064,20 +3171,20 @@
"type": "tidelift"
}
],
- "time": "2023-02-14T08:03:56+00:00"
+ "time": "2024-09-16T14:52:48+00:00"
},
{
"name": "symfony/http-foundation",
- "version": "v5.4.22",
+ "version": "v5.4.44",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-foundation.git",
- "reference": "05cd1acdd0e3ce8473aaba1d86c188321d85f313"
+ "reference": "ae0d217e5932aa0b70ddb4cf7822cc76d48aee53"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-foundation/zipball/05cd1acdd0e3ce8473aaba1d86c188321d85f313",
- "reference": "05cd1acdd0e3ce8473aaba1d86c188321d85f313",
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ae0d217e5932aa0b70ddb4cf7822cc76d48aee53",
+ "reference": "ae0d217e5932aa0b70ddb4cf7822cc76d48aee53",
"shasum": ""
},
"require": {
@@ -3087,7 +3194,7 @@
"symfony/polyfill-php80": "^1.16"
},
"require-dev": {
- "predis/predis": "~1.0",
+ "predis/predis": "^1.0|^2.0",
"symfony/cache": "^4.4|^5.0|^6.0",
"symfony/dependency-injection": "^5.4|^6.0",
"symfony/expression-language": "^4.4|^5.0|^6.0",
@@ -3124,7 +3231,7 @@
"description": "Defines an object-oriented layer for the HTTP specification",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/http-foundation/tree/v5.4.22"
+ "source": "https://github.com/symfony/http-foundation/tree/v5.4.44"
},
"funding": [
{
@@ -3140,20 +3247,20 @@
"type": "tidelift"
}
],
- "time": "2023-03-28T07:28:17+00:00"
+ "time": "2024-09-15T07:55:06+00:00"
},
{
"name": "symfony/http-kernel",
- "version": "v5.4.22",
+ "version": "v5.4.44",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-kernel.git",
- "reference": "2d3a8be2c756353627398827c409af6f126c096d"
+ "reference": "788dcf72d9af7432a886aa3b0c5904d68087ba13"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-kernel/zipball/2d3a8be2c756353627398827c409af6f126c096d",
- "reference": "2d3a8be2c756353627398827c409af6f126c096d",
+ "url": "https://api.github.com/repos/symfony/http-kernel/zipball/788dcf72d9af7432a886aa3b0c5904d68087ba13",
+ "reference": "788dcf72d9af7432a886aa3b0c5904d68087ba13",
"shasum": ""
},
"require": {
@@ -3202,6 +3309,7 @@
"symfony/stopwatch": "^4.4|^5.0|^6.0",
"symfony/translation": "^4.4|^5.0|^6.0",
"symfony/translation-contracts": "^1.1|^2|^3",
+ "symfony/var-dumper": "^4.4.31|^5.4",
"twig/twig": "^2.13|^3.0.4"
},
"suggest": {
@@ -3236,7 +3344,7 @@
"description": "Provides a structured process for converting a Request into a Response",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/http-kernel/tree/v5.4.22"
+ "source": "https://github.com/symfony/http-kernel/tree/v5.4.44"
},
"funding": [
{
@@ -3252,20 +3360,20 @@
"type": "tidelift"
}
],
- "time": "2023-03-31T11:54:37+00:00"
+ "time": "2024-09-21T05:47:58+00:00"
},
{
"name": "symfony/monolog-bridge",
- "version": "v5.4.22",
+ "version": "v5.4.40",
"source": {
"type": "git",
"url": "https://github.com/symfony/monolog-bridge.git",
- "reference": "34be6f0695e4187dbb832a05905fb4c6581ac39a"
+ "reference": "ac6e0bf2a275e017c1dedd54dd0f1fbf252a9351"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/34be6f0695e4187dbb832a05905fb4c6581ac39a",
- "reference": "34be6f0695e4187dbb832a05905fb4c6581ac39a",
+ "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/ac6e0bf2a275e017c1dedd54dd0f1fbf252a9351",
+ "reference": "ac6e0bf2a275e017c1dedd54dd0f1fbf252a9351",
"shasum": ""
},
"require": {
@@ -3320,7 +3428,7 @@
"description": "Provides integration for Monolog with various Symfony components",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/monolog-bridge/tree/v5.4.22"
+ "source": "https://github.com/symfony/monolog-bridge/tree/v5.4.40"
},
"funding": [
{
@@ -3336,34 +3444,34 @@
"type": "tidelift"
}
],
- "time": "2023-03-06T21:29:33+00:00"
+ "time": "2024-05-31T14:33:22+00:00"
},
{
"name": "symfony/monolog-bundle",
- "version": "v3.8.0",
+ "version": "v3.10.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/monolog-bundle.git",
- "reference": "a41bbcdc1105603b6d73a7d9a43a3788f8e0fb7d"
+ "reference": "414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/a41bbcdc1105603b6d73a7d9a43a3788f8e0fb7d",
- "reference": "a41bbcdc1105603b6d73a7d9a43a3788f8e0fb7d",
+ "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181",
+ "reference": "414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181",
"shasum": ""
},
"require": {
- "monolog/monolog": "^1.22 || ^2.0 || ^3.0",
- "php": ">=7.1.3",
- "symfony/config": "~4.4 || ^5.0 || ^6.0",
- "symfony/dependency-injection": "^4.4 || ^5.0 || ^6.0",
- "symfony/http-kernel": "~4.4 || ^5.0 || ^6.0",
- "symfony/monolog-bridge": "~4.4 || ^5.0 || ^6.0"
+ "monolog/monolog": "^1.25.1 || ^2.0 || ^3.0",
+ "php": ">=7.2.5",
+ "symfony/config": "^5.4 || ^6.0 || ^7.0",
+ "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0",
+ "symfony/http-kernel": "^5.4 || ^6.0 || ^7.0",
+ "symfony/monolog-bridge": "^5.4 || ^6.0 || ^7.0"
},
"require-dev": {
- "symfony/console": "~4.4 || ^5.0 || ^6.0",
- "symfony/phpunit-bridge": "^5.2 || ^6.0",
- "symfony/yaml": "~4.4 || ^5.0 || ^6.0"
+ "symfony/console": "^5.4 || ^6.0 || ^7.0",
+ "symfony/phpunit-bridge": "^6.3 || ^7.0",
+ "symfony/yaml": "^5.4 || ^6.0 || ^7.0"
},
"type": "symfony-bundle",
"extra": {
@@ -3401,7 +3509,7 @@
],
"support": {
"issues": "https://github.com/symfony/monolog-bundle/issues",
- "source": "https://github.com/symfony/monolog-bundle/tree/v3.8.0"
+ "source": "https://github.com/symfony/monolog-bundle/tree/v3.10.0"
},
"funding": [
{
@@ -3417,24 +3525,24 @@
"type": "tidelift"
}
],
- "time": "2022-05-10T14:24:36+00:00"
+ "time": "2023-11-06T17:08:13+00:00"
},
{
"name": "symfony/polyfill-ctype",
- "version": "v1.27.0",
+ "version": "v1.31.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git",
- "reference": "5bbc823adecdae860bb64756d639ecfec17b050a"
+ "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a",
- "reference": "5bbc823adecdae860bb64756d639ecfec17b050a",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638",
+ "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=7.2"
},
"provide": {
"ext-ctype": "*"
@@ -3444,9 +3552,6 @@
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.27-dev"
- },
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
@@ -3483,7 +3588,7 @@
"portable"
],
"support": {
- "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0"
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0"
},
"funding": [
{
@@ -3499,33 +3604,30 @@
"type": "tidelift"
}
],
- "time": "2022-11-03T14:55:06+00:00"
+ "time": "2024-09-09T11:45:10+00:00"
},
{
"name": "symfony/polyfill-intl-grapheme",
- "version": "v1.27.0",
+ "version": "v1.31.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-grapheme.git",
- "reference": "511a08c03c1960e08a883f4cffcacd219b758354"
+ "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354",
- "reference": "511a08c03c1960e08a883f4cffcacd219b758354",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
+ "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=7.2"
},
"suggest": {
"ext-intl": "For best performance"
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.27-dev"
- },
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
@@ -3564,7 +3666,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0"
+ "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0"
},
"funding": [
{
@@ -3580,33 +3682,30 @@
"type": "tidelift"
}
],
- "time": "2022-11-03T14:55:06+00:00"
+ "time": "2024-09-09T11:45:10+00:00"
},
{
"name": "symfony/polyfill-intl-normalizer",
- "version": "v1.27.0",
+ "version": "v1.31.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
- "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6"
+ "reference": "3833d7255cc303546435cb650316bff708a1c75c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6",
- "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c",
+ "reference": "3833d7255cc303546435cb650316bff708a1c75c",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=7.2"
},
"suggest": {
"ext-intl": "For best performance"
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.27-dev"
- },
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
@@ -3648,7 +3747,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0"
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0"
},
"funding": [
{
@@ -3664,24 +3763,24 @@
"type": "tidelift"
}
],
- "time": "2022-11-03T14:55:06+00:00"
+ "time": "2024-09-09T11:45:10+00:00"
},
{
"name": "symfony/polyfill-mbstring",
- "version": "v1.27.0",
+ "version": "v1.31.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534"
+ "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
- "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341",
+ "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=7.2"
},
"provide": {
"ext-mbstring": "*"
@@ -3691,9 +3790,6 @@
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.27-dev"
- },
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
@@ -3731,7 +3827,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0"
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0"
},
"funding": [
{
@@ -3747,30 +3843,27 @@
"type": "tidelift"
}
],
- "time": "2022-11-03T14:55:06+00:00"
+ "time": "2024-09-09T11:45:10+00:00"
},
{
"name": "symfony/polyfill-php73",
- "version": "v1.27.0",
+ "version": "v1.31.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php73.git",
- "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9"
+ "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/9e8ecb5f92152187c4799efd3c96b78ccab18ff9",
- "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9",
+ "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb",
+ "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=7.2"
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.27-dev"
- },
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
@@ -3810,7 +3903,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php73/tree/v1.27.0"
+ "source": "https://github.com/symfony/polyfill-php73/tree/v1.31.0"
},
"funding": [
{
@@ -3826,30 +3919,27 @@
"type": "tidelift"
}
],
- "time": "2022-11-03T14:55:06+00:00"
+ "time": "2024-09-09T11:45:10+00:00"
},
{
"name": "symfony/polyfill-php80",
- "version": "v1.27.0",
+ "version": "v1.31.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php80.git",
- "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936"
+ "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936",
- "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8",
+ "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=7.2"
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.27-dev"
- },
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
@@ -3893,7 +3983,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0"
+ "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0"
},
"funding": [
{
@@ -3909,30 +3999,27 @@
"type": "tidelift"
}
],
- "time": "2022-11-03T14:55:06+00:00"
+ "time": "2024-09-09T11:45:10+00:00"
},
{
"name": "symfony/polyfill-php81",
- "version": "v1.27.0",
+ "version": "v1.31.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php81.git",
- "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a"
+ "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a",
- "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a",
+ "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c",
+ "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=7.2"
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.27-dev"
- },
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
@@ -3972,7 +4059,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php81/tree/v1.27.0"
+ "source": "https://github.com/symfony/polyfill-php81/tree/v1.31.0"
},
"funding": [
{
@@ -3988,20 +4075,20 @@
"type": "tidelift"
}
],
- "time": "2022-11-03T14:55:06+00:00"
+ "time": "2024-09-09T11:45:10+00:00"
},
{
"name": "symfony/service-contracts",
- "version": "v2.5.2",
+ "version": "v2.5.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/service-contracts.git",
- "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c"
+ "reference": "a2329596ddc8fd568900e3fc76cba42489ecc7f3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c",
- "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/a2329596ddc8fd568900e3fc76cba42489ecc7f3",
+ "reference": "a2329596ddc8fd568900e3fc76cba42489ecc7f3",
"shasum": ""
},
"require": {
@@ -4055,7 +4142,7 @@
"standards"
],
"support": {
- "source": "https://github.com/symfony/service-contracts/tree/v2.5.2"
+ "source": "https://github.com/symfony/service-contracts/tree/v2.5.3"
},
"funding": [
{
@@ -4071,20 +4158,20 @@
"type": "tidelift"
}
],
- "time": "2022-05-30T19:17:29+00:00"
+ "time": "2023-04-21T15:04:16+00:00"
},
{
"name": "symfony/string",
- "version": "v5.4.22",
+ "version": "v5.4.44",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
- "reference": "8036a4c76c0dd29e60b6a7cafcacc50cf088ea62"
+ "reference": "832caa16b6d9aac6bf11747315225f5aba384c24"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/string/zipball/8036a4c76c0dd29e60b6a7cafcacc50cf088ea62",
- "reference": "8036a4c76c0dd29e60b6a7cafcacc50cf088ea62",
+ "url": "https://api.github.com/repos/symfony/string/zipball/832caa16b6d9aac6bf11747315225f5aba384c24",
+ "reference": "832caa16b6d9aac6bf11747315225f5aba384c24",
"shasum": ""
},
"require": {
@@ -4141,7 +4228,7 @@
"utf8"
],
"support": {
- "source": "https://github.com/symfony/string/tree/v5.4.22"
+ "source": "https://github.com/symfony/string/tree/v5.4.44"
},
"funding": [
{
@@ -4157,20 +4244,20 @@
"type": "tidelift"
}
],
- "time": "2023-03-14T06:11:53+00:00"
+ "time": "2024-09-20T07:56:40+00:00"
},
{
"name": "symfony/var-dumper",
- "version": "v5.4.22",
+ "version": "v5.4.43",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-dumper.git",
- "reference": "e2edac9ce47e6df07e38143c7cfa6bdbc1a6dcc4"
+ "reference": "6be6a6a8af4818564e3726fc65cf936f34743cef"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/var-dumper/zipball/e2edac9ce47e6df07e38143c7cfa6bdbc1a6dcc4",
- "reference": "e2edac9ce47e6df07e38143c7cfa6bdbc1a6dcc4",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/6be6a6a8af4818564e3726fc65cf936f34743cef",
+ "reference": "6be6a6a8af4818564e3726fc65cf936f34743cef",
"shasum": ""
},
"require": {
@@ -4179,12 +4266,12 @@
"symfony/polyfill-php80": "^1.16"
},
"conflict": {
- "phpunit/phpunit": "<5.4.3",
"symfony/console": "<4.4"
},
"require-dev": {
"ext-iconv": "*",
"symfony/console": "^4.4|^5.0|^6.0",
+ "symfony/http-kernel": "^4.4|^5.0|^6.0",
"symfony/process": "^4.4|^5.0|^6.0",
"symfony/uid": "^5.1|^6.0",
"twig/twig": "^2.13|^3.0.4"
@@ -4230,7 +4317,7 @@
"dump"
],
"support": {
- "source": "https://github.com/symfony/var-dumper/tree/v5.4.22"
+ "source": "https://github.com/symfony/var-dumper/tree/v5.4.43"
},
"funding": [
{
@@ -4246,20 +4333,20 @@
"type": "tidelift"
}
],
- "time": "2023-03-25T09:27:28+00:00"
+ "time": "2024-08-30T16:01:46+00:00"
},
{
"name": "theseer/tokenizer",
- "version": "1.2.1",
+ "version": "1.2.3",
"source": {
"type": "git",
"url": "https://github.com/theseer/tokenizer.git",
- "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e"
+ "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e",
- "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e",
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2",
+ "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2",
"shasum": ""
},
"require": {
@@ -4288,7 +4375,7 @@
"description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
"support": {
"issues": "https://github.com/theseer/tokenizer/issues",
- "source": "https://github.com/theseer/tokenizer/tree/1.2.1"
+ "source": "https://github.com/theseer/tokenizer/tree/1.2.3"
},
"funding": [
{
@@ -4296,24 +4383,25 @@
"type": "github"
}
],
- "time": "2021-07-28T10:34:58+00:00"
+ "time": "2024-03-03T12:36:25+00:00"
},
{
"name": "woocommerce/woorelease",
- "version": "2.4.0",
+ "version": "dev-trunk",
"source": {
"type": "git",
"url": "git@github.com:woocommerce/woorelease.git",
- "reference": "92cdac7da77ee204a7145d7029f5f12c11cfcadd"
+ "reference": "6a812502efde955d4efcf78d969365c2c2f95171"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/woocommerce/woorelease/zipball/92cdac7da77ee204a7145d7029f5f12c11cfcadd",
- "reference": "92cdac7da77ee204a7145d7029f5f12c11cfcadd",
+ "url": "https://api.github.com/repos/woocommerce/woorelease/zipball/6a812502efde955d4efcf78d969365c2c2f95171",
+ "reference": "6a812502efde955d4efcf78d969365c2c2f95171",
"shasum": ""
},
"require": {
- "bramus/monolog-colored-line-formatter": "~3.0",
+ "bramus/monolog-colored-line-formatter": "^3.0",
+ "czproject/git-php": "^4.0",
"monolog/monolog": "^2.0",
"symfony/console": "^5.1",
"symfony/event-dispatcher": "^5.1",
@@ -4324,6 +4412,7 @@
"squizlabs/php_codesniffer": "^3.7",
"woocommerce/woocommerce-sniffs": "0.1.0"
},
+ "default-branch": true,
"type": "library",
"autoload": {
"classmap": [
@@ -4342,23 +4431,23 @@
},
"description": "Woorelease automates the deployment of extensions and themes to both woocommerce.com and wordpress.org.",
"support": {
- "source": "https://github.com/woocommerce/woorelease/tree/2.4.0",
+ "source": "https://github.com/woocommerce/woorelease/tree/trunk",
"issues": "https://github.com/woocommerce/woorelease/issues"
},
- "time": "2022-07-21T01:05:57+00:00"
+ "time": "2024-09-04T12:56:29+00:00"
},
{
"name": "wp-coding-standards/wpcs",
- "version": "3.0.1",
+ "version": "3.1.0",
"source": {
"type": "git",
"url": "https://github.com/WordPress/WordPress-Coding-Standards.git",
- "reference": "b4caf9689f1a0e4a4c632679a44e638c1c67aff1"
+ "reference": "9333efcbff231f10dfd9c56bb7b65818b4733ca7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/WordPress/WordPress-Coding-Standards/zipball/b4caf9689f1a0e4a4c632679a44e638c1c67aff1",
- "reference": "b4caf9689f1a0e4a4c632679a44e638c1c67aff1",
+ "url": "https://api.github.com/repos/WordPress/WordPress-Coding-Standards/zipball/9333efcbff231f10dfd9c56bb7b65818b4733ca7",
+ "reference": "9333efcbff231f10dfd9c56bb7b65818b4733ca7",
"shasum": ""
},
"require": {
@@ -4367,16 +4456,16 @@
"ext-tokenizer": "*",
"ext-xmlreader": "*",
"php": ">=5.4",
- "phpcsstandards/phpcsextra": "^1.1.0",
- "phpcsstandards/phpcsutils": "^1.0.8",
- "squizlabs/php_codesniffer": "^3.7.2"
+ "phpcsstandards/phpcsextra": "^1.2.1",
+ "phpcsstandards/phpcsutils": "^1.0.10",
+ "squizlabs/php_codesniffer": "^3.9.0"
},
"require-dev": {
"php-parallel-lint/php-console-highlighter": "^1.0.0",
"php-parallel-lint/php-parallel-lint": "^1.3.2",
"phpcompatibility/php-compatibility": "^9.0",
"phpcsstandards/phpcsdevtools": "^1.2.0",
- "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0"
+ "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0"
},
"suggest": {
"ext-iconv": "For improved results",
@@ -4407,24 +4496,24 @@
},
"funding": [
{
- "url": "https://opencollective.com/thewpcc/contribute/wp-php-63406",
+ "url": "https://opencollective.com/php_codesniffer",
"type": "custom"
}
],
- "time": "2023-09-14T07:06:09+00:00"
+ "time": "2024-03-25T16:39:00+00:00"
},
{
"name": "yoast/phpunit-polyfills",
- "version": "1.0.5",
+ "version": "1.1.2",
"source": {
"type": "git",
"url": "https://github.com/Yoast/PHPUnit-Polyfills.git",
- "reference": "3b59adeef77fb1c03ff5381dbb9d68b0aaff3171"
+ "reference": "e9c8413de4c8ae03d2923a44f17d0d7dad1b96be"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Yoast/PHPUnit-Polyfills/zipball/3b59adeef77fb1c03ff5381dbb9d68b0aaff3171",
- "reference": "3b59adeef77fb1c03ff5381dbb9d68b0aaff3171",
+ "url": "https://api.github.com/repos/Yoast/PHPUnit-Polyfills/zipball/e9c8413de4c8ae03d2923a44f17d0d7dad1b96be",
+ "reference": "e9c8413de4c8ae03d2923a44f17d0d7dad1b96be",
"shasum": ""
},
"require": {
@@ -4432,12 +4521,14 @@
"phpunit/phpunit": "^4.8.36 || ^5.7.21 || ^6.0 || ^7.0 || ^8.0 || ^9.0"
},
"require-dev": {
- "yoast/yoastcs": "^2.3.0"
+ "php-parallel-lint/php-console-highlighter": "^1.0.0",
+ "php-parallel-lint/php-parallel-lint": "^1.4.0",
+ "yoast/yoastcs": "^3.1.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "2.x-dev"
+ "dev-main": "3.x-dev"
}
},
"autoload": {
@@ -4469,14 +4560,17 @@
],
"support": {
"issues": "https://github.com/Yoast/PHPUnit-Polyfills/issues",
+ "security": "https://github.com/Yoast/PHPUnit-Polyfills/security/policy",
"source": "https://github.com/Yoast/PHPUnit-Polyfills"
},
- "time": "2023-03-30T23:39:05+00:00"
+ "time": "2024-09-06T22:03:10+00:00"
}
],
"aliases": [],
"minimum-stability": "stable",
- "stability-flags": [],
+ "stability-flags": {
+ "woocommerce/woorelease": 20
+ },
"prefer-stable": false,
"prefer-lowest": false,
"platform": {
@@ -4486,5 +4580,5 @@
"platform-dev": {
"ext-zip": "*"
},
- "plugin-api-version": "2.3.0"
+ "plugin-api-version": "2.6.0"
}
diff --git a/extensions.json b/extensions.json
index f3f4f558..c97bafd1 100644
--- a/extensions.json
+++ b/extensions.json
@@ -1,16 +1,14 @@
{
- "defaultBranch": "trunk",
+ "defaultBranch": "develop",
"githubOrganization": "woocommerce",
"extensions": [
{
"name": "Facebook for WooCommerce",
- "repoSlug": "facebook-for-woocommerce",
- "defaultBranch": "develop"
+ "repoSlug": "facebook-for-woocommerce"
},
{
"name": "Pinterest for WooCommerce",
- "repoSlug": "pinterest-for-woocommerce",
- "defaultBranch": "develop"
+ "repoSlug": "pinterest-for-woocommerce"
},
{
"name": "Points & Rewards",
diff --git a/packages/php/woorelease-extension/src/Commands/Branch.php b/packages/php/woorelease-extension/src/Commands/Branch.php
new file mode 100644
index 00000000..13ff7cfa
--- /dev/null
+++ b/packages/php/woorelease-extension/src/Commands/Branch.php
@@ -0,0 +1,151 @@
+setDescription( 'Creates a release branch if does not exist.' )
+ ->setHelp( 'This command allows you to create a release branch.' )
+ ->addArgument( 'github_url', InputArgument::REQUIRED, 'Full GitHub URL for product to build.' )
+ ->addArgument( 'default_branch', InputArgument::REQUIRED, 'Default GitHub project branch name.' )
+ ->addOption( 'folder', null, InputOption::VALUE_REQUIRED, 'Folder containing a cloned version of the repository', null )
+ ->addOption( 'cleanup', null, InputOption::VALUE_NONE, 'If specified, it will do the branch cleanup.' );
+ }
+
+ /**
+ * Executes the command.
+ *
+ * @param InputInterface $input Input.
+ * @param OutputInterface $output Output.
+ *
+ * @return int Exit code.
+ * @throws Exception When the command has failed.
+ */
+ protected function execute( InputInterface $input, OutputInterface $output ) {
+ try {
+ $logger = Logger::instance( $output );
+ $github_url = $input->getArgument( 'github_url' );
+ $default_branch = $input->getArgument( 'default_branch' );
+ $folder = $input->getOption( 'folder' );
+ $cleanup = false !== $input->getOption( 'cleanup' );
+
+ list( $product, $gh_org, $branch ) = Utils::parse_product_info( $github_url );
+
+ // Prepare the release: check release/branch to exist.
+ $repository_url = sprintf( 'https://github.com/%1$s/%2$s', $gh_org, $product );
+
+ if ( $cleanup ) {
+ // Not to delete the default repo's branch.
+ if ( $branch !== $default_branch ) {
+ $output->write( sprintf( "\nCleaning up `%s` branch ...\n", $branch ) );
+ return $this->cleanup( $folder, $repository_url, $branch );
+ }
+ $output->write( sprintf( "\nDefault branch `%s` cannot be deleted.\n", $branch ) );
+ return Command::SUCCESS;
+ }
+
+ $is_release_branch = WooGrowGit::does_branch_exist( $repository_url, $branch );
+ if ( ! $is_release_branch ) {
+ $output->writeln( sprintf( "\nRelease branch %s does not exist.\n", $branch ) );
+
+ $do_create_release_branch = Utils::yes_no(
+ sprintf(
+ 'You are trying to release from %s which does not exist. Do you want to create it from %s?',
+ $branch,
+ $default_branch
+ )
+ );
+
+ if ( $do_create_release_branch ) {
+ $create = WooGrowGit::create_branch( $folder, $branch );
+ $push = $create && WooGrowGit::push_branch( $folder, $repository_url, $branch );
+ if ( ! $push ) {
+ $do_release_from_default = Utils::yes_no(
+ sprintf(
+ 'Branch %s has failed to create. Do you want to release from default %s branch?',
+ $branch,
+ $default_branch
+ )
+ );
+
+ if ( ! $do_release_from_default ) {
+ throw new Exception( 'Release cancelled.' );
+ }
+ }
+ } else {
+ $branch = $default_branch;
+ $do_release_from_default = Utils::yes_no(
+ sprintf(
+ 'You\'ve decided not to create %s branch. Do you want to release from the %s branch?',
+ $branch,
+ $default_branch
+ )
+ );
+
+ if ( ! $do_release_from_default ) {
+ throw new Exception( 'Release cancelled.' );
+ }
+ }
+ }
+
+ // End release.
+ $logger->notice( sprintf( 'Release branch %s is ready.', $branch ) );
+
+ // Setting active branch name to the output.
+ $this->getApplication()->set_meta( "{$product}_branch", $branch );
+
+ return Command::SUCCESS;
+ } catch ( \Exception $e ) {
+ Utils::handle_error( $e );
+
+ return Command::FAILURE;
+ }
+ }
+
+ /**
+ * Removes the release branch after the release simulation.
+ *
+ * @param string $folder Current repository path.
+ * @param string $repository_url Repository URL.
+ * @param string $branch Repository's branch.
+ * @return int
+ */
+ protected function cleanup( $folder, $repository_url, $branch ) {
+ WooGrowGit::delete_branch( $folder, $repository_url, $branch );
+ return Command::SUCCESS;
+ }
+}
diff --git a/packages/php/woorelease-extension/src/Commands/Bulk.php b/packages/php/woorelease-extension/src/Commands/Bulk.php
index 631d37ee..e584fa05 100644
--- a/packages/php/woorelease-extension/src/Commands/Bulk.php
+++ b/packages/php/woorelease-extension/src/Commands/Bulk.php
@@ -2,6 +2,7 @@
namespace Automattic\WooCommerce\Grow\WR\Commands;
+use Automattic\WooCommerce\Grow\WR\Utils\Nvm;
use InvalidArgumentException;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Exception\LogicException;
@@ -13,7 +14,6 @@
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Filesystem\Filesystem;
use WR\Application;
-use WR\Command\Release;
/**
* Class Bulk
@@ -56,11 +56,15 @@ protected function configure() {
protected function initialize( InputInterface $input, OutputInterface $output ) {
// This throws an exception if the command is not found, which we want to allow.
$command = $this->getApplication()->get( $input->getArgument( 'release-command' ) );
- if ( ! $command instanceof Release ) {
+
+ $is_not_release = ! $command instanceof Release;
+ $is_not_simulate = ! $command instanceof Simulate;
+ if ( $is_not_release && $is_not_simulate ) {
throw new InvalidArgumentException(
sprintf(
- 'Command "%s" is not an instance of %s',
+ 'Command "%s" (%s) is not an instance of %s',
$command->getName(),
+ get_class( $command ),
Release::class
)
);
@@ -125,9 +129,15 @@ protected function execute( InputInterface $input, OutputInterface $output ) {
[
'github_url' => $git_hub_url,
'--product_version' => $item['version'],
+ '--default_branch' => $item['default_branch'],
]
);
+ $grow_root_path = $this->getApplication()->get_meta( 'root_dir' );
+ if ( Nvm::does_nvm_exist( $grow_root_path ) ) {
+ $args['--nvm_use'] = true;
+ }
+
$result = $release_command->run( new ArrayInput( $args ), $output );
if ( static::SUCCESS !== $result ) {
$output->writeln( sprintf( "\nRelease FAILED for %s\n", $item['name'] ) );
@@ -176,7 +186,7 @@ private function getReleaseData(): array {
// It's a local file.
// phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents
$extension_data = json_decode( file_get_contents( "{$app->get_meta('root_dir')}/extensions.json" ), true );
- $default_branch = $extension_data['defaultBranch'] ?? 'trunk';
+ $default_branch = $extension_data['defaultBranch'] ?? 'develop';
$github_organization = $extension_data['githubOrganization'] ?? 'woocommerce';
$extensions = array_column( $extension_data['extensions'] ?? [], null, 'repoSlug' );
@@ -198,13 +208,14 @@ private function getReleaseData(): array {
continue;
}
- [ $slug, $version, $branch ] = array_pad( explode( "\t", $line ), 3, null );
+ [ $slug, $version, $branch ] = array_pad( explode( "\t", $line ), 4, null );
$to_release[ $slug ] = [
- 'name' => $extensions[ $slug ]['name'],
- 'repo' => $extensions[ $slug ]['repoSlug'],
- 'version' => $version,
- 'organization' => $extensions[ $slug ]['githubOrganization'] ?? $github_organization,
- 'branch' => $branch ?? $extensions[ $slug ]['defaultBranch'] ?? $default_branch,
+ 'name' => $extensions[ $slug ]['name'],
+ 'repo' => $extensions[ $slug ]['repoSlug'],
+ 'version' => $version,
+ 'organization' => $extensions[ $slug ]['githubOrganization'] ?? $github_organization,
+ 'branch' => $branch ?? $extensions[ $slug ]['defaultBranch'] ?? $default_branch,
+ 'default_branch' => $extensions[ $slug ]['defaultBranch'] ?? $default_branch,
];
}
diff --git a/packages/php/woorelease-extension/src/Commands/Release.php b/packages/php/woorelease-extension/src/Commands/Release.php
new file mode 100644
index 00000000..cefdc613
--- /dev/null
+++ b/packages/php/woorelease-extension/src/Commands/Release.php
@@ -0,0 +1,280 @@
+addOption( 'nvm_use', null, InputOption::VALUE_NONE, 'If specified, the release will use `nvm use`' )
+ ->addOption( 'default_branch', null, InputOption::VALUE_OPTIONAL, 'If specified, the release branch will be created from it.' );
+ }
+
+ /**
+ * Executes the command.
+ *
+ * @param InputInterface $input The input interface, to get options, arguments, etc.
+ * @param OutputInterface $output The output interface.
+ *
+ * @return int 0 if everything went fine, or an exit code
+ * @throws Exception In case of error.
+ */
+ protected function execute( InputInterface $input, OutputInterface $output ) {
+ try {
+ $logger = Logger::instance( $output );
+ $github_url = $input->getArgument( 'github_url' );
+ $version = $input->getOption( 'product_version' );
+ $wc_tested = $input->getOption( 'wc_tested' );
+ $wp_tested = $input->getOption( 'wp_tested' );
+ $prerelease = $input->getOption( 'prerelease' );
+ $generate_changelog = $input->getOption( 'generate_changelog' );
+ $nvm_use = $input->getOption( 'nvm_use' );
+ $default_branch = $input->getOption( 'default_branch' );
+ $release = ! $this->simulate;
+ $reauth = false !== $input->getOption( 'svn_reauth' );
+
+ list( $product, $gh_org, $branch ) = Utils::parse_product_info( $github_url );
+
+ $logger->notice( 'Processing product {product}...', [ 'product' => $product ] );
+
+ // Clone product.
+ $folder = WooGrowGit::clone_product_release_or_default( $product, $branch, $default_branch, $gh_org );
+
+ // Call branch command to create release branch or release from default.
+ $command = $this->getApplication()->find( 'branch' );
+ $arguments = [
+ 'github_url' => $github_url,
+ 'default_branch' => $default_branch,
+ '--folder' => $folder,
+ ];
+
+ if ( Command::SUCCESS !== $command->run( new ArrayInput( $arguments ), $output ) ) {
+ return Command::FAILURE;
+ }
+ // Get current active branch name after the branch command.
+ $active_branch = $this->getApplication()->get_meta( "{$product}_branch" ) ?? $branch;
+ // Update $branch and $github_url with currently active branch name.
+ if ( $branch !== $active_branch ) {
+ $branch = $active_branch;
+ $github_url = sprintf( 'https://github.com/%1$s/%2$s/tree/%3$s', $gh_org, $product, $branch );
+ }
+
+ if ( empty( $folder ) ) {
+ $output->writeln( sprintf( "\nRelease FAILED for %s\n", $product ) );
+ throw new Exception( sprintf( 'Cloning %s repository branch %s have failed.', $product, $branch ) );
+ }
+
+ // If $version is not supplied, use current and bump the patch version.
+ if ( ! isset( $version ) ) {
+ $package_file = $folder . '/package.json';
+
+ if ( ! file_exists( $package_file ) ) {
+ throw new \Exception( 'Did not find required "package.json" file in product', 2 );
+ }
+
+ // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents
+ $version_file = file_get_contents( $folder . '/package.json' );
+
+ $entry_regex = '/^\s*"version":\s*"(?\d+\.\d+\.\d+)"/ms';
+
+ if ( preg_match( $entry_regex, $version_file, $matches ) ) {
+ $version_parts = explode( '.', $matches['version'] );
+ $version = $version_parts[0] . '.' . $version_parts[1] . '.' . (int) ++$version_parts[2];
+ }
+ }
+
+ // Call vb:replace command.
+ $command = $this->getApplication()->find( 'vb:replace' );
+ $arguments = [
+ 'github_url' => $github_url,
+ '--folder' => $folder,
+ '--product_version' => $version,
+ // Don't make a separate commit for PHPDoc version replacements
+ '--release' => false,
+ ];
+
+ if ( Command::SUCCESS !== $command->run( new ArrayInput( $arguments ), $output ) ) {
+ return Command::FAILURE;
+ }
+
+ // Call vb:change command.
+ $command = $this->getApplication()->find( 'vb:change' );
+ $arguments = [
+ 'github_url' => $github_url,
+ '--folder' => $folder,
+ '--product_version' => $version,
+ '--wc_tested' => $wc_tested,
+ '--wp_tested' => $wp_tested,
+ '--release' => $release,
+ '--generate_changelog' => $generate_changelog,
+ ];
+
+ if ( Command::SUCCESS !== $command->run( new ArrayInput( $arguments ), $output ) ) {
+ return Command::FAILURE;
+ }
+
+ // Call cl:generate command.
+ $command = $this->getApplication()->find( 'cl:generate' );
+ $arguments = [
+ 'github_url' => $github_url,
+ '--folder' => $folder,
+ '--product_version' => $version,
+ '--wc_tested' => $wc_tested,
+ '--wp_tested' => $wp_tested,
+ '--release' => $release,
+ '--parse_only' => empty( $generate_changelog ),
+ ];
+
+ if ( Command::SUCCESS !== $command->run( new ArrayInput( $arguments ), $output ) ) {
+ return Command::FAILURE;
+ }
+
+ // If version was not specified, attempt to read it from meta added by `cl:generate`.
+ if ( empty( $version ) ) {
+ if ( $this->getApplication()->has_meta( 'version' ) ) {
+ $version = $this->getApplication()->get_meta( 'version' );
+ }
+
+ if ( empty( $version ) ) {
+ throw new \Exception( 'Could not auto-detect version.', 76 );
+ }
+ }
+
+ $logger->notice( 'Building product' );
+ $grow_root_path = $this->getApplication()->get_meta( 'root_dir' );
+ $zip_file = WooGrowProduct::maybe_build_with_nvm( $nvm_use, $grow_root_path, $product, $folder );
+
+ // Call wccom:release or wporg:release command.
+ $wp_org_slug = WP_Org::maybe_get_slug( $product, $folder );
+ $arguments = [
+ 'github_url' => $github_url,
+ '--folder' => $folder,
+ '--zip_file' => $zip_file,
+ '--release' => $release,
+ ];
+ if ( false !== $wp_org_slug ) {
+ $logger->notice( "Found product slug for WordPress.org: '{org_slug}'. Following .org release process.", [ 'org_slug' => $wp_org_slug ] );
+ $release_command = 'wporg:release';
+ if ( $version ) {
+ $arguments['--product_version'] = $version;
+ }
+ if ( $reauth ) {
+ $arguments['--svn_reauth'] = true;
+ }
+ } else {
+ $release_command = 'wccom:release';
+ }
+
+ $command = $this->getApplication()->find( $release_command );
+
+ if ( Command::SUCCESS !== $command->run( new ArrayInput( $arguments ), $output ) ) {
+ return Command::FAILURE;
+ }
+
+ // Create GitHub release with command gh:release.
+ if ( $release ) {
+ $command = $this->getApplication()->find( 'gh:release' );
+ $arguments = [
+ 'github_url' => $github_url,
+ '--folder' => $folder,
+ '--product_version' => $version,
+ '--zip_file' => $zip_file,
+ '--prerelease' => $prerelease,
+ ];
+
+ if ( Command::SUCCESS !== $command->run( new ArrayInput( $arguments ), $output ) ) {
+ return Command::FAILURE;
+ }
+ } else {
+ $logger->notice( 'Simulation mode. Skipping upload of asset {asset} to GH release.', [ 'asset' => $zip_file ] );
+ }
+
+ if ( $release ) {
+ if ( empty( $version ) ) {
+ $logger->warning( 'Could not auto-detect version, optional translation trigger was not executed.' );
+ } else {
+ $command = $this->getApplication()->find( 'translate:trigger' );
+ $arguments = [
+ 'github_url' => $github_url,
+ '--product_version' => $version,
+ '--folder' => $folder,
+ ];
+
+ if ( Command::SUCCESS !== $command->run( new ArrayInput( $arguments ), $output ) ) {
+ return Command::FAILURE;
+ }
+ }
+ } else {
+ $logger->notice( 'Simulation mode. Skipping optional translations trigger.' );
+ }
+
+ // Cleaning up the mess after simulations.
+ if ( ! $release ) {
+ $command = $this->getApplication()->find( 'branch' );
+ $arguments = [
+ 'github_url' => $github_url,
+ 'default_branch' => $default_branch,
+ '--folder' => $folder,
+ '--cleanup' => true,
+ ];
+ if ( Command::SUCCESS === $command->run( new ArrayInput( $arguments ), $output ) ) {
+ $logger->notice( 'Simulation mode. Release branch cleanup has succeeded.' );
+ } else {
+ $logger->error( 'Simulation mode. Release branch cleanup has failed. Please cleanup `{branch}` branch manually.', [ 'branch' => $branch ] );
+ }
+ }
+
+ // End simulation mode.
+ if ( ! $release ) {
+ Git::output_diff( $folder );
+ $logger->notice( WOORELEASE_PRODUCT_NAME . ' simulation finished.' );
+ Utils::display_release_command();
+
+ return Command::SUCCESS;
+ }
+
+ // End release.
+ $logger->notice( WOORELEASE_PRODUCT_NAME . ' finished.' );
+
+ return Command::SUCCESS;
+ } catch ( \Exception $e ) {
+ Utils::handle_error( $e );
+
+ return Command::FAILURE;
+ }
+ }
+}
diff --git a/packages/php/woorelease-extension/src/Commands/Simulate.php b/packages/php/woorelease-extension/src/Commands/Simulate.php
new file mode 100644
index 00000000..5dc97ef8
--- /dev/null
+++ b/packages/php/woorelease-extension/src/Commands/Simulate.php
@@ -0,0 +1,33 @@
+simulate = true;
+
+ $this
+ ->setDescription( 'Simulates the release process, following the standard Woo process.' )
+ ->setHelp( 'This command allows you to create a fully simulated release (skipping the deploy and release to GitHub).' );
+ }
+}
diff --git a/packages/php/woorelease-extension/src/Utils/Git.php b/packages/php/woorelease-extension/src/Utils/Git.php
new file mode 100644
index 00000000..71aa6656
--- /dev/null
+++ b/packages/php/woorelease-extension/src/Utils/Git.php
@@ -0,0 +1,120 @@
+notice( 'Attempting to use the product\'s recommended node version.' );
+ return static::build( $grow_root_path, $product, $folder );
+ } else {
+ return \WR\Tools\Product::build( $product, $folder );
+ }
+ }
+
+ /**
+ * Build the product, handling package.json build process
+ *
+ * @param string $grow_root_path WooGrow root path.
+ * @param string $product Product name.
+ * @param string $folder Product folder.
+ *
+ * @throws \Exception On error.
+ * @return array Zip file path.
+ */
+ public static function build( $grow_root_path, $product, $folder ) {
+ $logger = Logger::default();
+ $package_json = \WR\Tools\Product::get_package_json( $product, $folder );
+ $wp_org_slug = ! empty( $package_json['config']['wp_org_slug'] ) && ( $package_json['config']['wp_org_slug'] !== $product ) ? $package_json['config']['wp_org_slug'] : false;
+ $use_pnpm = (bool) ( $package_json['config']['use_pnpm'] ?? false );
+ $build_step = $package_json['config']['build_step'] ?? false;
+
+ chdir( $folder );
+ Utils::exec_sprintf( 'rm -rf %s.zip', $product );
+ if ( $wp_org_slug ) {
+ Utils::exec_sprintf( 'rm -rf %s.zip', $wp_org_slug );
+ }
+
+ if ( $build_step ) {
+ shell_exec( "{$grow_root_path}/bin/build '{$build_step}'" ); // phpcs:ignore
+ } elseif ( $use_pnpm ) {
+ shell_exec( "{$grow_root_path}/bin/build pnpm" ); // phpcs:ignore
+ } else {
+ shell_exec( "{$grow_root_path}/bin/build npm" ); // phpcs:ignore
+ }
+
+ $zipfile = '';
+ if ( file_exists( sprintf( '%s/%s.zip', $folder, $product ) ) ) {
+ $zipfile = realpath( sprintf( '%s.zip', $product ) );
+ } elseif ( $wp_org_slug && file_exists( sprintf( '%s/%s.zip', $folder, $wp_org_slug ) ) ) {
+ $zipfile = realpath( sprintf( '%s.zip', $wp_org_slug ) );
+ }
+ if ( $zipfile ) {
+ $logger->notice( 'Product build: {zipfile}', [ 'zipfile' => $zipfile ] );
+ return $zipfile;
+ }
+
+ if ( $wp_org_slug ) {
+ throw new \Exception( sprintf( "'npm run build' command did not produce '%s.zip' or '%s.zip'", $product, $wp_org_slug ), 3 );
+ } else {
+ throw new \Exception( sprintf( "'npm run build' command did not produce '%s.zip'", $product ), 3 );
+ }
+ }
+}