diff --git a/.github/workflows/code-quality.yml b/.github/workflows/code-quality.yml index b6becea2..09b091d5 100644 --- a/.github/workflows/code-quality.yml +++ b/.github/workflows/code-quality.yml @@ -21,7 +21,7 @@ jobs: - name: Setup proper PHP version uses: shivammathur/setup-php@v2 with: - php-version: 7.4 + php-version: 8.0 - name: Install Composer dependencies run: composer install --no-interaction --no-progress --no-suggest --optimize-autoloader @@ -34,10 +34,10 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - php: [ 5.6, 7.0, 7.1, 7.2, 7.3, 7.4, 8.0, 8.1 ] + php: [ 8.0, 8.1, 8.2, 8.3, 8.4 ] steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: ref: ${{ github.event.inputs.ref }} diff --git a/.gitignore b/.gitignore index cbed23ec..af436c37 100644 --- a/.gitignore +++ b/.gitignore @@ -40,6 +40,7 @@ npm-debug.log .sass-cache* .husky *.lock +!composer.lock # Tests codeception.yml diff --git a/.wordpress-org/banner-1544x500.png b/.wordpress-org/banner-1544x500.png index ed0b7d05..7ff495db 100644 Binary files a/.wordpress-org/banner-1544x500.png and b/.wordpress-org/banner-1544x500.png differ diff --git a/.wordpress-org/banner-772x250.png b/.wordpress-org/banner-772x250.png index 2f4d901f..c7cc37fb 100644 Binary files a/.wordpress-org/banner-772x250.png and b/.wordpress-org/banner-772x250.png differ diff --git a/.wordpress-org/icon-128x128.png b/.wordpress-org/icon-128x128.png index b4121d21..9ebd3136 100644 Binary files a/.wordpress-org/icon-128x128.png and b/.wordpress-org/icon-128x128.png differ diff --git a/.wordpress-org/icon-256x256.png b/.wordpress-org/icon-256x256.png index 91888915..90b76866 100644 Binary files a/.wordpress-org/icon-256x256.png and b/.wordpress-org/icon-256x256.png differ diff --git a/bin/build-zip.sh b/bin/build-zip.sh index 7f7dac3d..e379adb5 100755 --- a/bin/build-zip.sh +++ b/bin/build-zip.sh @@ -12,9 +12,9 @@ fi echo "➤ Preparing zip for $VERSION of $SLUG..." echo "➤ Building plugin..." -npm install && npm run build composer install composer update --no-dev --no-scripts +npm install && npm run build echo "✓ Plugin built!" # if directory already exists, delete it diff --git a/bin/release.sh b/bin/release.sh index 883fa9f2..22ca844d 100755 --- a/bin/release.sh +++ b/bin/release.sh @@ -16,12 +16,6 @@ fi echo "Preparing release $VERSION for $SLUG..." -echo "➤ Building plugin..." -npm install && npm run build -composer install -composer update --no-dev --no-scripts -echo "✓ Plugin built!" - # Check if svn user name is provided with -u flag and password with -p flag while getopts u:p: flag; do case "${flag}" in @@ -36,6 +30,17 @@ if [ -z "$SVN_USER" ] || [ -z "$SVN_PASSWORD" ]; then exit 1 fi +# Replace the version in readme.txt +sed -i '' "s/Stable tag: .*/Stable tag: $VERSION/" readme.txt +# Replace the version in plugin file +sed -i '' "s/Version: .*/Version: $VERSION/" $SLUG.php + +echo "➤ Building plugin..." +npm install && npm run build +composer install +composer update --no-dev --no-scripts +echo "✓ Plugin built!" + # if directory already exists, delete it if [ -d "$SVN_DIR" ]; then rm -rf $SVN_DIR @@ -63,9 +68,9 @@ find "$SVN_DIR/trunk/" -type d -empty -delete # Copy assets # If .wordpress-org is a directory and contains files, copy them to the SVN repo. -if [[ -d "$WORKSPACE/.wordpress-org" ]]; then +if [[ -d "$WORKING_DIR/.wordpress-org" ]]; then echo "➤ Copying assets..." - rsync -rc "$WORKSPACE/.wordpress-org/" "$SVN_DIR/assets/" --delete --delete-excluded + rsync -rc "$WORKING_DIR/.wordpress-org/" "$SVN_DIR/assets/" --delete --delete-excluded # Fix screenshots getting force downloaded when clicking them # https://developer.wordpress.org/plugins/wordpress-org/plugin-assets/ if test -d "$SVN_DIR/assets" && test -n "$(find "$SVN_DIR/assets" -maxdepth 1 -name "*.png" -print -quit)"; then diff --git a/composer.json b/composer.json index 9be86780..219bc5a2 100644 --- a/composer.json +++ b/composer.json @@ -7,10 +7,6 @@ "prefer-stable": true, "minimum-stability": "dev", "repositories": [ - { - "url": "git@github.com:byteever/byteever-sniffs.git", - "type": "github" - }, { "url": "git@github.com:pluginever/framework-plugin.git", "type": "github" @@ -28,7 +24,7 @@ "php": ">=7.0" }, "require-dev": { - "byteever/byteever-sniffs": "dev-master", + "byteever/byteever-sniffs": "^1.0", "codeception/lib-innerbrowser": "^1.0", "codeception/module-asserts": "^1.1", "codeception/module-cli": "^1.0", @@ -42,9 +38,9 @@ "level-level/wp-browser-woocommerce": "^0.1.8", "lucatume/wp-browser": "^3.1", "phpcompatibility/php-compatibility": "9.3.5", + "pluginever/framework-model": "dev-master", "pluginever/framework-plugin": "dev-master", - "pluginever/framework-settings": "dev-master", - "pluginever/framework-model": "dev-master" + "pluginever/framework-settings": "dev-master" }, "config": { "optimize-autoloader": true, diff --git a/composer.lock b/composer.lock new file mode 100644 index 00000000..14e2ee5c --- /dev/null +++ b/composer.lock @@ -0,0 +1,7238 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "1708bb6e2309c5b3f2b0c1d7ea103daf", + "packages": [], + "packages-dev": [ + { + "name": "antecedent/patchwork", + "version": "2.1.26", + "source": { + "type": "git", + "url": "https://github.com/antecedent/patchwork.git", + "reference": "f2dae0851b2eae4c51969af740fdd0356d7f8f55" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/antecedent/patchwork/zipball/f2dae0851b2eae4c51969af740fdd0356d7f8f55", + "reference": "f2dae0851b2eae4c51969af740fdd0356d7f8f55", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": ">=4" + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignas Rudaitis", + "email": "ignas.rudaitis@gmail.com" + } + ], + "description": "Method redefinition (monkey-patching) functionality for PHP.", + "homepage": "http://patchwork2.org/", + "keywords": [ + "aop", + "aspect", + "interception", + "monkeypatching", + "redefinition", + "runkit", + "testing" + ], + "support": { + "issues": "https://github.com/antecedent/patchwork/issues", + "source": "https://github.com/antecedent/patchwork/tree/2.1.26" + }, + "time": "2023-09-18T08:18:37+00:00" + }, + { + "name": "behat/gherkin", + "version": "v4.9.0", + "source": { + "type": "git", + "url": "https://github.com/Behat/Gherkin.git", + "reference": "0bc8d1e30e96183e4f36db9dc79caead300beff4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Behat/Gherkin/zipball/0bc8d1e30e96183e4f36db9dc79caead300beff4", + "reference": "0bc8d1e30e96183e4f36db9dc79caead300beff4", + "shasum": "" + }, + "require": { + "php": "~7.2|~8.0" + }, + "require-dev": { + "cucumber/cucumber": "dev-gherkin-22.0.0", + "phpunit/phpunit": "~8|~9", + "symfony/yaml": "~3|~4|~5" + }, + "suggest": { + "symfony/yaml": "If you want to parse features, represented in YAML files" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + } + }, + "autoload": { + "psr-0": { + "Behat\\Gherkin": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + } + ], + "description": "Gherkin DSL parser for PHP", + "homepage": "http://behat.org/", + "keywords": [ + "BDD", + "Behat", + "Cucumber", + "DSL", + "gherkin", + "parser" + ], + "support": { + "issues": "https://github.com/Behat/Gherkin/issues", + "source": "https://github.com/Behat/Gherkin/tree/v4.9.0" + }, + "time": "2021-10-12T13:05:09+00:00" + }, + { + "name": "bordoni/phpass", + "version": "0.3.6", + "source": { + "type": "git", + "url": "https://github.com/bordoni/phpass.git", + "reference": "12f8f5cc03ebb7efd69554f104afe9aa1aa46e1a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bordoni/phpass/zipball/12f8f5cc03ebb7efd69554f104afe9aa1aa46e1a", + "reference": "12f8f5cc03ebb7efd69554f104afe9aa1aa46e1a", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "replace": { + "hautelook/phpass": "0.3.*" + }, + "type": "library", + "autoload": { + "psr-0": { + "Hautelook": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Public Domain" + ], + "authors": [ + { + "name": "Solar Designer", + "email": "solar@openwall.com", + "homepage": "http://openwall.com/phpass/" + }, + { + "name": "Gustavo Bordoni", + "email": "gustavo@bordoni.me", + "homepage": "https://bordoni.me" + } + ], + "description": "Portable PHP password hashing framework", + "homepage": "http://github.com/bordoni/phpass/", + "keywords": [ + "blowfish", + "crypt", + "password", + "security" + ], + "support": { + "issues": "https://github.com/bordoni/phpass/issues", + "source": "https://github.com/bordoni/phpass/tree/0.3.6" + }, + "time": "2012-08-31T00:00:00+00:00" + }, + { + "name": "byteever/byteever-sniffs", + "version": "v1.0.1", + "source": { + "type": "git", + "url": "https://github.com/byteever/byteever-sniffs.git", + "reference": "8c20a95245a883bcbaea42e46653f7f788bf8290" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/byteever/byteever-sniffs/zipball/8c20a95245a883bcbaea42e46653f7f788bf8290", + "reference": "8c20a95245a883bcbaea42e46653f7f788bf8290", + "shasum": "" + }, + "require": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7", + "phpcompatibility/phpcompatibility-wp": "^2.1", + "wp-coding-standards/wpcs": "^3.0" + }, + "require-dev": { + "roave/security-advisories": "dev-latest" + }, + "type": "phpcodesniffer-standard", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-only" + ], + "authors": [ + { + "name": "Sultan Nasir Uddin", + "email": "sultan@byteever.com" + } + ], + "description": "ByteEver PHP Coding Standards", + "keywords": [ + "byteever", + "phpcs", + "standards", + "wordpress" + ], + "support": { + "issues": "https://github.com/byteever/byteever-sniffs/issues", + "source": "https://github.com/byteever/byteever-sniffs/tree/v1.0.1" + }, + "time": "2023-10-25T04:55:22+00:00" + }, + { + "name": "codeception/codeception", + "version": "4.2.2", + "source": { + "type": "git", + "url": "https://github.com/Codeception/Codeception.git", + "reference": "b88014f3348c93f3df99dc6d0967b0dbfa804474" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/Codeception/zipball/b88014f3348c93f3df99dc6d0967b0dbfa804474", + "reference": "b88014f3348c93f3df99dc6d0967b0dbfa804474", + "shasum": "" + }, + "require": { + "behat/gherkin": "^4.4.0", + "codeception/lib-asserts": "^1.0 | 2.0.*@dev", + "codeception/phpunit-wrapper": ">6.0.15 <6.1.0 | ^6.6.1 | ^7.7.1 | ^8.1.1 | ^9.0", + "codeception/stub": "^2.0 | ^3.0 | ^4.0", + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "guzzlehttp/psr7": "^1.4 | ^2.0", + "php": ">=5.6.0 <9.0", + "symfony/console": ">=2.7 <6.0", + "symfony/css-selector": ">=2.7 <6.0", + "symfony/event-dispatcher": ">=2.7 <6.0", + "symfony/finder": ">=2.7 <6.0", + "symfony/yaml": ">=2.7 <6.0" + }, + "require-dev": { + "codeception/module-asserts": "^1.0 | 2.0.*@dev", + "codeception/module-cli": "^1.0 | 2.0.*@dev", + "codeception/module-db": "^1.0 | 2.0.*@dev", + "codeception/module-filesystem": "^1.0 | 2.0.*@dev", + "codeception/module-phpbrowser": "^1.0 | 2.0.*@dev", + "codeception/specify": "~0.3", + "codeception/util-universalframework": "*@dev", + "monolog/monolog": "~1.8", + "squizlabs/php_codesniffer": "~2.0", + "symfony/process": ">=2.7 <6.0", + "vlucas/phpdotenv": "^2.0 | ^3.0 | ^4.0 | ^5.0" + }, + "suggest": { + "codeception/specify": "BDD-style code blocks", + "codeception/verify": "BDD-style assertions", + "hoa/console": "For interactive console functionality", + "stecman/symfony-console-completion": "For BASH autocompletion", + "symfony/phpunit-bridge": "For phpunit-bridge support" + }, + "bin": [ + "codecept" + ], + "type": "library", + "extra": { + "branch-alias": [] + }, + "autoload": { + "files": [ + "functions.php" + ], + "psr-4": { + "Codeception\\": "src/Codeception", + "Codeception\\Extension\\": "ext" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk", + "email": "davert@mail.ua", + "homepage": "https://codegyre.com" + } + ], + "description": "BDD-style testing framework", + "homepage": "https://codeception.com/", + "keywords": [ + "BDD", + "TDD", + "acceptance testing", + "functional testing", + "unit testing" + ], + "support": { + "issues": "https://github.com/Codeception/Codeception/issues", + "source": "https://github.com/Codeception/Codeception/tree/4.2.2" + }, + "funding": [ + { + "url": "https://opencollective.com/codeception", + "type": "open_collective" + } + ], + "time": "2022-08-13T13:28:25+00:00" + }, + { + "name": "codeception/lib-asserts", + "version": "1.13.2", + "source": { + "type": "git", + "url": "https://github.com/Codeception/lib-asserts.git", + "reference": "184231d5eab66bc69afd6b9429344d80c67a33b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/lib-asserts/zipball/184231d5eab66bc69afd6b9429344d80c67a33b6", + "reference": "184231d5eab66bc69afd6b9429344d80c67a33b6", + "shasum": "" + }, + "require": { + "codeception/phpunit-wrapper": ">6.0.15 <6.1.0 | ^6.6.1 | ^7.7.1 | ^8.0.3 | ^9.0", + "ext-dom": "*", + "php": ">=5.6.0 <9.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk", + "email": "davert@mail.ua", + "homepage": "http://codegyre.com" + }, + { + "name": "Gintautas Miselis" + }, + { + "name": "Gustavo Nieves", + "homepage": "https://medium.com/@ganieves" + } + ], + "description": "Assertion methods used by Codeception core and Asserts module", + "homepage": "https://codeception.com/", + "keywords": [ + "codeception" + ], + "support": { + "issues": "https://github.com/Codeception/lib-asserts/issues", + "source": "https://github.com/Codeception/lib-asserts/tree/1.13.2" + }, + "time": "2020-10-21T16:26:20+00:00" + }, + { + "name": "codeception/lib-innerbrowser", + "version": "1.5.1", + "source": { + "type": "git", + "url": "https://github.com/Codeception/lib-innerbrowser.git", + "reference": "31b4b56ad53c3464fcb2c0a14d55a51a201bd3c2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/lib-innerbrowser/zipball/31b4b56ad53c3464fcb2c0a14d55a51a201bd3c2", + "reference": "31b4b56ad53c3464fcb2c0a14d55a51a201bd3c2", + "shasum": "" + }, + "require": { + "codeception/codeception": "4.*@dev", + "ext-dom": "*", + "ext-json": "*", + "ext-mbstring": "*", + "php": ">=5.6.0 <9.0", + "symfony/browser-kit": ">=2.7 <6.0", + "symfony/dom-crawler": ">=2.7 <6.0" + }, + "conflict": { + "codeception/codeception": "<4.0" + }, + "require-dev": { + "codeception/util-universalframework": "dev-master" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk", + "email": "davert@mail.ua", + "homepage": "http://codegyre.com" + }, + { + "name": "Gintautas Miselis" + } + ], + "description": "Parent library for all Codeception framework modules and PhpBrowser", + "homepage": "https://codeception.com/", + "keywords": [ + "codeception" + ], + "support": { + "issues": "https://github.com/Codeception/lib-innerbrowser/issues", + "source": "https://github.com/Codeception/lib-innerbrowser/tree/1.5.1" + }, + "time": "2021-08-30T15:21:42+00:00" + }, + { + "name": "codeception/module-asserts", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/Codeception/module-asserts.git", + "reference": "59374f2fef0cabb9e8ddb53277e85cdca74328de" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/module-asserts/zipball/59374f2fef0cabb9e8ddb53277e85cdca74328de", + "reference": "59374f2fef0cabb9e8ddb53277e85cdca74328de", + "shasum": "" + }, + "require": { + "codeception/codeception": "*@dev", + "codeception/lib-asserts": "^1.13.1", + "php": ">=5.6.0 <9.0" + }, + "conflict": { + "codeception/codeception": "<4.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk" + }, + { + "name": "Gintautas Miselis" + }, + { + "name": "Gustavo Nieves", + "homepage": "https://medium.com/@ganieves" + } + ], + "description": "Codeception module containing various assertions", + "homepage": "https://codeception.com/", + "keywords": [ + "assertions", + "asserts", + "codeception" + ], + "support": { + "issues": "https://github.com/Codeception/module-asserts/issues", + "source": "https://github.com/Codeception/module-asserts/tree/1.3.1" + }, + "time": "2020-10-21T16:48:15+00:00" + }, + { + "name": "codeception/module-cli", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/Codeception/module-cli.git", + "reference": "1f841ad4a1d43e5d9e60a43c4cc9e5af8008024f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/module-cli/zipball/1f841ad4a1d43e5d9e60a43c4cc9e5af8008024f", + "reference": "1f841ad4a1d43e5d9e60a43c4cc9e5af8008024f", + "shasum": "" + }, + "require": { + "codeception/codeception": "*@dev", + "php": ">=5.6.0 <9.0" + }, + "conflict": { + "codeception/codeception": "<4.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk" + } + ], + "description": "Codeception module for testing basic shell commands and shell output", + "homepage": "http://codeception.com/", + "keywords": [ + "codeception" + ], + "support": { + "issues": "https://github.com/Codeception/module-cli/issues", + "source": "https://github.com/Codeception/module-cli/tree/1.1.1" + }, + "time": "2020-12-26T16:56:19+00:00" + }, + { + "name": "codeception/module-db", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/Codeception/module-db.git", + "reference": "04c3e66fbd3a3ced17fcccc49627f6393a97b04b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/module-db/zipball/04c3e66fbd3a3ced17fcccc49627f6393a97b04b", + "reference": "04c3e66fbd3a3ced17fcccc49627f6393a97b04b", + "shasum": "" + }, + "require": { + "codeception/codeception": "*@dev", + "php": ">=5.6.0 <9.0" + }, + "conflict": { + "codeception/codeception": "<4.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk" + }, + { + "name": "Gintautas Miselis" + } + ], + "description": "DB module for Codeception", + "homepage": "http://codeception.com/", + "keywords": [ + "codeception", + "database-testing", + "db-testing" + ], + "support": { + "issues": "https://github.com/Codeception/module-db/issues", + "source": "https://github.com/Codeception/module-db/tree/1.2.0" + }, + "time": "2022-03-05T19:38:40+00:00" + }, + { + "name": "codeception/module-filesystem", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/Codeception/module-filesystem.git", + "reference": "781be167fb1557bfc9b61e0a4eac60a32c534ec1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/module-filesystem/zipball/781be167fb1557bfc9b61e0a4eac60a32c534ec1", + "reference": "781be167fb1557bfc9b61e0a4eac60a32c534ec1", + "shasum": "" + }, + "require": { + "codeception/codeception": "^4.0", + "php": ">=5.6.0 <9.0", + "symfony/finder": ">=2.7 <6.0" + }, + "conflict": { + "codeception/codeception": "<4.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk" + }, + { + "name": "Gintautas Miselis" + } + ], + "description": "Codeception module for testing local filesystem", + "homepage": "http://codeception.com/", + "keywords": [ + "codeception", + "filesystem" + ], + "support": { + "issues": "https://github.com/Codeception/module-filesystem/issues", + "source": "https://github.com/Codeception/module-filesystem/tree/1.0.3" + }, + "time": "2020-10-24T14:46:40+00:00" + }, + { + "name": "codeception/module-phpbrowser", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/Codeception/module-phpbrowser.git", + "reference": "8ba6bede11d0914e74d98691f427fd8f397f192e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/module-phpbrowser/zipball/8ba6bede11d0914e74d98691f427fd8f397f192e", + "reference": "8ba6bede11d0914e74d98691f427fd8f397f192e", + "shasum": "" + }, + "require": { + "codeception/codeception": "^4.1", + "codeception/lib-innerbrowser": "^1.3", + "guzzlehttp/guzzle": "^6.3|^7.0", + "php": ">=5.6.0 <9.0" + }, + "conflict": { + "codeception/codeception": "<4.0" + }, + "require-dev": { + "codeception/module-rest": "^1.0" + }, + "suggest": { + "codeception/phpbuiltinserver": "Start and stop PHP built-in web server for your tests" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk" + }, + { + "name": "Gintautas Miselis" + } + ], + "description": "Codeception module for testing web application over HTTP", + "homepage": "http://codeception.com/", + "keywords": [ + "codeception", + "functional-testing", + "http" + ], + "support": { + "issues": "https://github.com/Codeception/module-phpbrowser/issues", + "source": "https://github.com/Codeception/module-phpbrowser/tree/1.0.3" + }, + "time": "2022-05-21T13:50:41+00:00" + }, + { + "name": "codeception/module-rest", + "version": "1.4.2", + "source": { + "type": "git", + "url": "https://github.com/Codeception/module-rest.git", + "reference": "9cd7a87fd9343494e7782f7bdb51687c25046917" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/module-rest/zipball/9cd7a87fd9343494e7782f7bdb51687c25046917", + "reference": "9cd7a87fd9343494e7782f7bdb51687c25046917", + "shasum": "" + }, + "require": { + "codeception/codeception": "^4.0", + "justinrainbow/json-schema": "~5.2.9", + "php": ">=5.6.6 <9.0", + "softcreatr/jsonpath": "^0.5 || ^0.7" + }, + "require-dev": { + "codeception/lib-innerbrowser": "^1.0", + "codeception/util-universalframework": "^1.0" + }, + "suggest": { + "aws/aws-sdk-php": "For using AWS Auth" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gintautas Miselis" + } + ], + "description": "REST module for Codeception", + "homepage": "http://codeception.com/", + "keywords": [ + "codeception", + "rest" + ], + "support": { + "issues": "https://github.com/Codeception/module-rest/issues", + "source": "https://github.com/Codeception/module-rest/tree/1.4.2" + }, + "time": "2021-11-18T18:58:15+00:00" + }, + { + "name": "codeception/module-webdriver", + "version": "1.4.1", + "source": { + "type": "git", + "url": "https://github.com/Codeception/module-webdriver.git", + "reference": "e22ac7da756df659df6dd4fac2dff9c859e30131" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/module-webdriver/zipball/e22ac7da756df659df6dd4fac2dff9c859e30131", + "reference": "e22ac7da756df659df6dd4fac2dff9c859e30131", + "shasum": "" + }, + "require": { + "codeception/codeception": "^4.0", + "php": ">=5.6.0 <9.0", + "php-webdriver/webdriver": "^1.8.0" + }, + "suggest": { + "codeception/phpbuiltinserver": "Start and stop PHP built-in web server for your tests" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk" + }, + { + "name": "Gintautas Miselis" + }, + { + "name": "Zaahid Bateson" + } + ], + "description": "WebDriver module for Codeception", + "homepage": "http://codeception.com/", + "keywords": [ + "acceptance-testing", + "browser-testing", + "codeception" + ], + "support": { + "issues": "https://github.com/Codeception/module-webdriver/issues", + "source": "https://github.com/Codeception/module-webdriver/tree/1.4.1" + }, + "time": "2022-09-12T05:09:51+00:00" + }, + { + "name": "codeception/phpunit-wrapper", + "version": "9.0.9", + "source": { + "type": "git", + "url": "https://github.com/Codeception/phpunit-wrapper.git", + "reference": "7439a53ae367986e9c22b2ac00f9d7376bb2f8cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/phpunit-wrapper/zipball/7439a53ae367986e9c22b2ac00f9d7376bb2f8cf", + "reference": "7439a53ae367986e9c22b2ac00f9d7376bb2f8cf", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "phpunit/phpunit": "^9.0" + }, + "require-dev": { + "codeception/specify": "*", + "consolidation/robo": "^3.0.0-alpha3", + "vlucas/phpdotenv": "^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Codeception\\PHPUnit\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Davert", + "email": "davert.php@resend.cc" + }, + { + "name": "Naktibalda" + } + ], + "description": "PHPUnit classes used by Codeception", + "support": { + "issues": "https://github.com/Codeception/phpunit-wrapper/issues", + "source": "https://github.com/Codeception/phpunit-wrapper/tree/9.0.9" + }, + "time": "2022-05-23T06:24:11+00:00" + }, + { + "name": "codeception/stub", + "version": "4.0.2", + "source": { + "type": "git", + "url": "https://github.com/Codeception/Stub.git", + "reference": "18a148dacd293fc7b044042f5aa63a82b08bff5d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/Stub/zipball/18a148dacd293fc7b044042f5aa63a82b08bff5d", + "reference": "18a148dacd293fc7b044042f5aa63a82b08bff5d", + "shasum": "" + }, + "require": { + "php": "^7.4 | ^8.0", + "phpunit/phpunit": "^8.4 | ^9.0 | ^10.0 | 10.0.x-dev" + }, + "require-dev": { + "consolidation/robo": "^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Codeception\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Flexible Stub wrapper for PHPUnit's Mock Builder", + "support": { + "issues": "https://github.com/Codeception/Stub/issues", + "source": "https://github.com/Codeception/Stub/tree/4.0.2" + }, + "time": "2022-01-31T19:25:15+00:00" + }, + { + "name": "codeception/util-universalframework", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/Codeception/util-universalframework.git", + "reference": "cc381f364c6d24f9b9c7b70a4c724949725f491a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/util-universalframework/zipball/cc381f364c6d24f9b9c7b70a4c724949725f491a", + "reference": "cc381f364c6d24f9b9c7b70a4c724949725f491a", + "shasum": "" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gintautas Miselis" + } + ], + "description": "Mock framework module used in internal Codeception tests", + "homepage": "http://codeception.com/", + "support": { + "issues": "https://github.com/Codeception/util-universalframework/issues", + "source": "https://github.com/Codeception/util-universalframework/tree/1.0.0" + }, + "time": "2019-09-22T06:06:49+00:00" + }, + { + "name": "coenjacobs/mozart", + "version": "0.7.1", + "source": { + "type": "git", + "url": "https://github.com/coenjacobs/mozart.git", + "reference": "dbcdeb992d20d9c8914eef090f9a0d684bb1102c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/coenjacobs/mozart/zipball/dbcdeb992d20d9c8914eef090f9a0d684bb1102c", + "reference": "dbcdeb992d20d9c8914eef090f9a0d684bb1102c", + "shasum": "" + }, + "require": { + "league/flysystem": "^1.0", + "php": "^7.3|^8.0", + "symfony/console": "^4|^5", + "symfony/finder": "^4|^5" + }, + "require-dev": { + "mheap/phpunit-github-actions-printer": "^1.4", + "phpunit/phpunit": "^8.5", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.4" + }, + "bin": [ + "bin/mozart" + ], + "type": "library", + "autoload": { + "psr-4": { + "CoenJacobs\\Mozart\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Coen Jacobs", + "email": "coenjacobs@gmail.com" + } + ], + "description": "Composes all dependencies as a package inside a WordPress plugin", + "support": { + "issues": "https://github.com/coenjacobs/mozart/issues", + "source": "https://github.com/coenjacobs/mozart/tree/0.7.1" + }, + "funding": [ + { + "url": "https://github.com/coenjacobs", + "type": "github" + } + ], + "time": "2021-02-02T21:37:03+00:00" + }, + { + "name": "dealerdirect/phpcodesniffer-composer-installer", + "version": "v0.7.2", + "source": { + "type": "git", + "url": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer.git", + "reference": "1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Dealerdirect/phpcodesniffer-composer-installer/zipball/1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db", + "reference": "1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "php": ">=5.3", + "squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0" + }, + "require-dev": { + "composer/composer": "*", + "php-parallel-lint/php-parallel-lint": "^1.3.1", + "phpcompatibility/php-compatibility": "^9.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" + }, + "autoload": { + "psr-4": { + "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Franck Nijhof", + "email": "franck.nijhof@dealerdirect.com", + "homepage": "http://www.frenck.nl", + "role": "Developer / IT Manager" + }, + { + "name": "Contributors", + "homepage": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer Standards Composer Installer Plugin", + "homepage": "http://www.dealerdirect.com", + "keywords": [ + "PHPCodeSniffer", + "PHP_CodeSniffer", + "code quality", + "codesniffer", + "composer", + "installer", + "phpcbf", + "phpcs", + "plugin", + "qa", + "quality", + "standard", + "standards", + "style guide", + "stylecheck", + "tests" + ], + "support": { + "issues": "https://github.com/dealerdirect/phpcodesniffer-composer-installer/issues", + "source": "https://github.com/dealerdirect/phpcodesniffer-composer-installer" + }, + "time": "2022-02-04T12:51:07+00:00" + }, + { + "name": "dg/mysql-dump", + "version": "v1.5.1", + "source": { + "type": "git", + "url": "https://github.com/dg/MySQL-dump.git", + "reference": "e0e287b715b43293773a8b0edf8514f606e01780" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dg/MySQL-dump/zipball/e0e287b715b43293773a8b0edf8514f606e01780", + "reference": "e0e287b715b43293773a8b0edf8514f606e01780", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "http://davidgrudl.com" + } + ], + "description": "MySQL database dump.", + "homepage": "https://github.com/dg/MySQL-dump", + "keywords": [ + "mysql" + ], + "support": { + "source": "https://github.com/dg/MySQL-dump/tree/master" + }, + "time": "2019-09-10T21:36:25+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.0.8", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "f9301a5b2fb1216b2b08f02ba04dc45423db6bff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/f9301a5b2fb1216b2b08f02ba04dc45423db6bff", + "reference": "f9301a5b2fb1216b2b08f02ba04dc45423db6bff", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^11.0", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^8.5 || ^9.5", + "vimeo/psalm": "^4.25 || ^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.8" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2023-06-16T13:40:37+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "1.5.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b", + "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^11", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^0.16 || ^1", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-phpunit": "^1", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.30 || ^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/1.5.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2022-12-30T00:15:36+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.8.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/1110f66a6530a40fe7aea0378fe608ee2b2248f9", + "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5.3 || ^2.0.1", + "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "ext-curl": "*", + "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.29 || ^9.5.23", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.8.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2023-08-27T10:20:53+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "111166291a0f8130081195ac4556a5587d7f1b5d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/111166291a0f8130081195ac4556a5587d7f1b5d", + "reference": "111166291a0f8130081195ac4556a5587d7f1b5d", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.0.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2023-08-03T15:11:55+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.6.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/be45764272e8873c72dbe3d2edcfdfcc3bc9f727", + "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.6.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2023-08-27T10:13:57+00:00" + }, + { + "name": "illuminate/collections", + "version": "v9.52.16", + "source": { + "type": "git", + "url": "https://github.com/illuminate/collections.git", + "reference": "d3710b0b244bfc62c288c1a87eaa62dd28352d1f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/collections/zipball/d3710b0b244bfc62c288c1a87eaa62dd28352d1f", + "reference": "d3710b0b244bfc62c288c1a87eaa62dd28352d1f", + "shasum": "" + }, + "require": { + "illuminate/conditionable": "^9.0", + "illuminate/contracts": "^9.0", + "illuminate/macroable": "^9.0", + "php": "^8.0.2" + }, + "suggest": { + "symfony/var-dumper": "Required to use the dump method (^6.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "autoload": { + "files": [ + "helpers.php" + ], + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Collections package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2023-06-11T21:17:10+00:00" + }, + { + "name": "illuminate/conditionable", + "version": "v9.52.16", + "source": { + "type": "git", + "url": "https://github.com/illuminate/conditionable.git", + "reference": "bea24daa0fa84b7e7b0d5b84f62c71b7e2dc3364" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/conditionable/zipball/bea24daa0fa84b7e7b0d5b84f62c71b7e2dc3364", + "reference": "bea24daa0fa84b7e7b0d5b84f62c71b7e2dc3364", + "shasum": "" + }, + "require": { + "php": "^8.0.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Conditionable package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2023-02-01T21:42:32+00:00" + }, + { + "name": "illuminate/contracts", + "version": "v9.52.16", + "source": { + "type": "git", + "url": "https://github.com/illuminate/contracts.git", + "reference": "44f65d723b13823baa02ff69751a5948bde60c22" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/contracts/zipball/44f65d723b13823baa02ff69751a5948bde60c22", + "reference": "44f65d723b13823baa02ff69751a5948bde60c22", + "shasum": "" + }, + "require": { + "php": "^8.0.2", + "psr/container": "^1.1.1|^2.0.1", + "psr/simple-cache": "^1.0|^2.0|^3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Contracts\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Contracts package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2023-02-08T14:36:30+00:00" + }, + { + "name": "illuminate/macroable", + "version": "v9.52.16", + "source": { + "type": "git", + "url": "https://github.com/illuminate/macroable.git", + "reference": "e3bfaf6401742a9c6abca61b9b10e998e5b6449a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/macroable/zipball/e3bfaf6401742a9c6abca61b9b10e998e5b6449a", + "reference": "e3bfaf6401742a9c6abca61b9b10e998e5b6449a", + "shasum": "" + }, + "require": { + "php": "^8.0.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Macroable package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2022-08-09T13:29:29+00:00" + }, + { + "name": "illuminate/support", + "version": "v9.52.16", + "source": { + "type": "git", + "url": "https://github.com/illuminate/support.git", + "reference": "223c608dbca27232df6213f776bfe7bdeec24874" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/support/zipball/223c608dbca27232df6213f776bfe7bdeec24874", + "reference": "223c608dbca27232df6213f776bfe7bdeec24874", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^2.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-mbstring": "*", + "illuminate/collections": "^9.0", + "illuminate/conditionable": "^9.0", + "illuminate/contracts": "^9.0", + "illuminate/macroable": "^9.0", + "nesbot/carbon": "^2.62.1", + "php": "^8.0.2", + "voku/portable-ascii": "^2.0" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "suggest": { + "illuminate/filesystem": "Required to use the composer class (^9.0).", + "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^2.0.2).", + "ramsey/uuid": "Required to use Str::uuid() (^4.7).", + "symfony/process": "Required to use the composer class (^6.0).", + "symfony/uid": "Required to use Str::ulid() (^6.0).", + "symfony/var-dumper": "Required to use the dd function (^6.0).", + "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.4.1)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "autoload": { + "files": [ + "helpers.php" + ], + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Support package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2023-06-11T21:11:53+00:00" + }, + { + "name": "justinrainbow/json-schema", + "version": "v5.2.13", + "source": { + "type": "git", + "url": "https://github.com/justinrainbow/json-schema.git", + "reference": "fbbe7e5d79f618997bc3332a6f49246036c45793" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/fbbe7e5d79f618997bc3332a6f49246036c45793", + "reference": "fbbe7e5d79f618997bc3332a6f49246036c45793", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", + "json-schema/json-schema-test-suite": "1.2.0", + "phpunit/phpunit": "^4.8.35" + }, + "bin": [ + "bin/validate-json" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "JsonSchema\\": "src/JsonSchema/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bruno Prieto Reis", + "email": "bruno.p.reis@gmail.com" + }, + { + "name": "Justin Rainbow", + "email": "justin.rainbow@gmail.com" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Robert Schönthal", + "email": "seroscho@googlemail.com" + } + ], + "description": "A library to validate a json schema.", + "homepage": "https://github.com/justinrainbow/json-schema", + "keywords": [ + "json", + "schema" + ], + "support": { + "issues": "https://github.com/justinrainbow/json-schema/issues", + "source": "https://github.com/justinrainbow/json-schema/tree/v5.2.13" + }, + "time": "2023-09-26T02:20:38+00:00" + }, + { + "name": "league/flysystem", + "version": "1.1.10", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "3239285c825c152bcc315fe0e87d6b55f5972ed1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/3239285c825c152bcc315fe0e87d6b55f5972ed1", + "reference": "3239285c825c152bcc315fe0e87d6b55f5972ed1", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "league/mime-type-detection": "^1.3", + "php": "^7.2.5 || ^8.0" + }, + "conflict": { + "league/flysystem-sftp": "<1.0.6" + }, + "require-dev": { + "phpspec/prophecy": "^1.11.1", + "phpunit/phpunit": "^8.5.8" + }, + "suggest": { + "ext-ftp": "Allows you to use FTP server storage", + "ext-openssl": "Allows you to use FTPS server storage", + "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", + "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", + "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", + "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", + "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", + "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", + "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", + "league/flysystem-webdav": "Allows you to use WebDAV storage", + "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter", + "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", + "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frenky.net" + } + ], + "description": "Filesystem abstraction: Many filesystems, one API.", + "keywords": [ + "Cloud Files", + "WebDAV", + "abstraction", + "aws", + "cloud", + "copy.com", + "dropbox", + "file systems", + "files", + "filesystem", + "filesystems", + "ftp", + "rackspace", + "remote", + "s3", + "sftp", + "storage" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/1.1.10" + }, + "funding": [ + { + "url": "https://offset.earth/frankdejonge", + "type": "other" + } + ], + "time": "2022-10-04T09:16:37+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.14.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "b6a5854368533df0295c5761a0253656a2e52d9e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/b6a5854368533df0295c5761a0253656a2e52d9e", + "reference": "b6a5854368533df0295c5761a0253656a2e52d9e", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\MimeTypeDetection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Mime-type detection for Flysystem", + "support": { + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.14.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2023-10-17T14:13:20+00:00" + }, + { + "name": "level-level/wp-browser-woocommerce", + "version": "0.1.8", + "source": { + "type": "git", + "url": "https://github.com/level-level/wp-browser-woocommerce.git", + "reference": "89488fbafc8043c3a2e290950b0d36758a566ea5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/level-level/wp-browser-woocommerce/zipball/89488fbafc8043c3a2e290950b0d36758a566ea5", + "reference": "89488fbafc8043c3a2e290950b0d36758a566ea5", + "shasum": "" + }, + "require": { + "lucatume/wp-browser": "^2|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "LevelLevel\\WPBrowserWooCommerce\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "WooCommerce object factories for WP Browser integration tests.", + "support": { + "issues": "https://github.com/level-level/wp-browser-woocommerce/issues", + "source": "https://github.com/level-level/wp-browser-woocommerce/tree/0.1.8" + }, + "time": "2022-12-30T08:36:19+00:00" + }, + { + "name": "lucatume/wp-browser", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/lucatume/wp-browser.git", + "reference": "95a189fda634fd52cb44eebbbda3fabe0fdabdb2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/lucatume/wp-browser/zipball/95a189fda634fd52cb44eebbbda3fabe0fdabdb2", + "reference": "95a189fda634fd52cb44eebbbda3fabe0fdabdb2", + "shasum": "" + }, + "require": { + "antecedent/patchwork": "^2.0", + "bordoni/phpass": "^0.3", + "codeception/codeception": "^4", + "codeception/module-asserts": "^1.0", + "codeception/module-cli": "^1.0", + "codeception/module-db": "^1.0", + "codeception/module-filesystem": "^1.0", + "codeception/module-phpbrowser": "^1.0", + "codeception/module-webdriver": "^1.0", + "codeception/util-universalframework": "^1.0", + "dg/mysql-dump": "^1.3", + "ext-fileinfo": "*", + "ext-json": "*", + "ext-pdo": "*", + "mikehaertl/php-shellcommand": "^1.6", + "mikemclin/laravel-wp-password": "~2.0.0", + "php": ">=5.6.0", + "vria/nodiacritic": "^0.1.2", + "wp-cli/wp-cli": ">=2.0 <3.0.0", + "zordius/lightncandy": "^1.2" + }, + "conflict": { + "codeception/module-asserts": ">=2.0", + "codeception/module-cli": ">=2.0", + "codeception/module-db": ">=2.0", + "codeception/module-filesystem": ">=2.0", + "codeception/module-phpbrowser": ">=2.0", + "codeception/module-webdriver": ">=2.0", + "codeception/util-universalframework": ">=2.0" + }, + "require-dev": { + "erusev/parsedown": "^1.7", + "gumlet/php-image-resize": "^1.6", + "lucatume/codeception-snapshot-assertions": "^0.2", + "mikey179/vfsstream": "^1.6", + "symfony/translation": "^3.4", + "victorjonsson/markdowndocs": "dev-master", + "vlucas/phpdotenv": "^3.0", + "wp-cli/wp-cli-bundle": "*" + }, + "suggest": { + "codeception/module-asserts:^1.0": "Codeception 4.0 compatibility.", + "codeception/module-cli:^1.0": "Codeception 4.0 compatibility; required by the WPCLI module.", + "codeception/module-db:^1.0": "Codeception 4.0 compatibility; required by the WPDb module, PHP 5.6 compatible version.", + "codeception/module-filesystem:^1.0": "Codeception 4.0 compatibility; required by the WPFilesystem module.", + "codeception/module-phpbrowser:^1.0": "Codeception 4.0 compatibility; required by the WPBrowser module.", + "codeception/module-webdriver:^1.0": "Codeception 4.0 compatibility; required by the WPWebDriver module.", + "codeception/util-universalframework:^1.0": "Codeception 4.0 compatibility; required by the WordPress framework module.", + "gumlet/php-image-resize": "To handle runtime image modification in the WPDb::haveAttachmentInDatabase method.", + "vlucas/phpdotenv:^4.0": "To manage more complex environment file based configuration of the suites." + }, + "type": "library", + "extra": { + "_hash": "484f861f69198089cab0e642f27e5653" + }, + "autoload": { + "files": [ + "src/tad/WPBrowser/utils.php", + "src/tad/WPBrowser/wp-polyfills.php" + ], + "psr-4": { + "tad\\": "src/tad", + "Codeception\\": "src/Codeception", + "lucatume\\WPBrowser\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "theAverageDev (Luca Tumedei)", + "email": "luca@theaveragedev.com", + "homepage": "http://theaveragedev.com", + "role": "Developer" + } + ], + "description": "WordPress extension of the PhpBrowser class.", + "homepage": "http://github.com/lucatume/wp-browser", + "keywords": [ + "codeception", + "wordpress" + ], + "support": { + "issues": "https://github.com/lucatume/wp-browser/issues", + "source": "https://github.com/lucatume/wp-browser/tree/3.2.1" + }, + "funding": [ + { + "url": "https://github.com/lucatume", + "type": "github" + } + ], + "time": "2023-09-21T06:36:09+00:00" + }, + { + "name": "mikehaertl/php-shellcommand", + "version": "1.7.0", + "source": { + "type": "git", + "url": "https://github.com/mikehaertl/php-shellcommand.git", + "reference": "e79ea528be155ffdec6f3bf1a4a46307bb49e545" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mikehaertl/php-shellcommand/zipball/e79ea528be155ffdec6f3bf1a4a46307bb49e545", + "reference": "e79ea528be155ffdec6f3bf1a4a46307bb49e545", + "shasum": "" + }, + "require": { + "php": ">= 5.3.0" + }, + "require-dev": { + "phpunit/phpunit": ">4.0 <=9.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "mikehaertl\\shellcommand\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Härtl", + "email": "haertl.mike@gmail.com" + } + ], + "description": "An object oriented interface to shell commands", + "keywords": [ + "shell" + ], + "support": { + "issues": "https://github.com/mikehaertl/php-shellcommand/issues", + "source": "https://github.com/mikehaertl/php-shellcommand/tree/1.7.0" + }, + "time": "2023-04-19T08:25:22+00:00" + }, + { + "name": "mikemclin/laravel-wp-password", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/mikemclin/laravel-wp-password.git", + "reference": "5225c95f75aa0a5ad4040ec2074d1c8d7f10b5f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mikemclin/laravel-wp-password/zipball/5225c95f75aa0a5ad4040ec2074d1c8d7f10b5f4", + "reference": "5225c95f75aa0a5ad4040ec2074d1c8d7f10b5f4", + "shasum": "" + }, + "require": { + "bordoni/phpass": "0.3.*", + "illuminate/support": ">=4.0.0", + "php": ">=5.3.0" + }, + "require-dev": { + "mockery/mockery": "~0.9", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "^2.2" + }, + "type": "laravel-package", + "extra": { + "laravel": { + "providers": [ + "MikeMcLin\\WpPassword\\WpPasswordProvider" + ], + "aliases": { + "WpPassword": "MikeMcLin\\WpPassword\\Facades\\WpPassword" + } + } + }, + "autoload": { + "psr-4": { + "MikeMcLin\\WpPassword\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike McLin", + "email": "mike@mikemclin.com", + "homepage": "http://mikemclin.net" + } + ], + "description": "Laravel package that checks and creates WordPress password hashes", + "homepage": "https://github.com/mikemclin/laravel-wp-password", + "keywords": [ + "hashing", + "laravel", + "password", + "wordpress" + ], + "support": { + "issues": "https://github.com/mikemclin/laravel-wp-password/issues", + "source": "https://github.com/mikemclin/laravel-wp-password/tree/2.0.3" + }, + "time": "2021-09-30T13:48:57+00:00" + }, + { + "name": "mustache/mustache", + "version": "v2.14.2", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/mustache.php.git", + "reference": "e62b7c3849d22ec55f3ec425507bf7968193a6cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/mustache.php/zipball/e62b7c3849d22ec55f3ec425507bf7968193a6cb", + "reference": "e62b7c3849d22ec55f3ec425507bf7968193a6cb", + "shasum": "" + }, + "require": { + "php": ">=5.2.4" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~1.11", + "phpunit/phpunit": "~3.7|~4.0|~5.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "Mustache": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "A Mustache implementation in PHP.", + "homepage": "https://github.com/bobthecow/mustache.php", + "keywords": [ + "mustache", + "templating" + ], + "support": { + "issues": "https://github.com/bobthecow/mustache.php/issues", + "source": "https://github.com/bobthecow/mustache.php/tree/v2.14.2" + }, + "time": "2022-08-23T13:07:01+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.11.1", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3,<3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2023-03-08T13:26:56+00:00" + }, + { + "name": "nesbot/carbon", + "version": "2.71.0", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "98276233188583f2ff845a0f992a235472d9466a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/98276233188583f2ff845a0f992a235472d9466a", + "reference": "98276233188583f2ff845a0f992a235472d9466a", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "psr/clock": "^1.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "doctrine/dbal": "^2.0 || ^3.1.4", + "doctrine/orm": "^2.7", + "friendsofphp/php-cs-fixer": "^3.0", + "kylekatarnls/multi-tester": "^2.0", + "ondrejmirtes/better-reflection": "*", + "phpmd/phpmd": "^2.9", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.99 || ^1.7.14", + "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", + "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", + "squizlabs/php_codesniffer": "^3.4" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-3.x": "3.x-dev", + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "time": "2023-09-25T11:31:05+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.17.1", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.0" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1" + }, + "time": "2023-08-13T19:53:39+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.3" + }, + "time": "2021-07-20T11:28:43+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "php-webdriver/webdriver", + "version": "1.15.1", + "source": { + "type": "git", + "url": "https://github.com/php-webdriver/php-webdriver.git", + "reference": "cd52d9342c5aa738c2e75a67e47a1b6df97154e8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/cd52d9342c5aa738c2e75a67e47a1b6df97154e8", + "reference": "cd52d9342c5aa738c2e75a67e47a1b6df97154e8", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "ext-zip": "*", + "php": "^7.3 || ^8.0", + "symfony/polyfill-mbstring": "^1.12", + "symfony/process": "^5.0 || ^6.0 || ^7.0" + }, + "replace": { + "facebook/webdriver": "*" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.20.0", + "ondram/ci-detector": "^4.0", + "php-coveralls/php-coveralls": "^2.4", + "php-mock/php-mock-phpunit": "^2.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpunit/phpunit": "^9.3", + "squizlabs/php_codesniffer": "^3.5", + "symfony/var-dumper": "^5.0 || ^6.0" + }, + "suggest": { + "ext-SimpleXML": "For Firefox profile creation" + }, + "type": "library", + "autoload": { + "files": [ + "lib/Exception/TimeoutException.php" + ], + "psr-4": { + "Facebook\\WebDriver\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP client for Selenium WebDriver. Previously facebook/webdriver.", + "homepage": "https://github.com/php-webdriver/php-webdriver", + "keywords": [ + "Chromedriver", + "geckodriver", + "php", + "selenium", + "webdriver" + ], + "support": { + "issues": "https://github.com/php-webdriver/php-webdriver/issues", + "source": "https://github.com/php-webdriver/php-webdriver/tree/1.15.1" + }, + "time": "2023-10-20T12:21:20+00:00" + }, + { + "name": "phpcompatibility/php-compatibility", + "version": "9.3.5", + "source": { + "type": "git", + "url": "https://github.com/PHPCompatibility/PHPCompatibility.git", + "reference": "9fb324479acf6f39452e0655d2429cc0d3914243" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibility/zipball/9fb324479acf6f39452e0655d2429cc0d3914243", + "reference": "9fb324479acf6f39452e0655d2429cc0d3914243", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "squizlabs/php_codesniffer": "^2.3 || ^3.0.2" + }, + "conflict": { + "squizlabs/php_codesniffer": "2.6.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.5 || ^5.0 || ^6.0 || ^7.0" + }, + "suggest": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically.", + "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." + }, + "type": "phpcodesniffer-standard", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Wim Godden", + "homepage": "https://github.com/wimg", + "role": "lead" + }, + { + "name": "Juliette Reinders Folmer", + "homepage": "https://github.com/jrfnl", + "role": "lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCompatibility/PHPCompatibility/graphs/contributors" + } + ], + "description": "A set of sniffs for PHP_CodeSniffer that checks for PHP cross-version compatibility.", + "homepage": "http://techblog.wimgodden.be/tag/codesniffer/", + "keywords": [ + "compatibility", + "phpcs", + "standards" + ], + "support": { + "issues": "https://github.com/PHPCompatibility/PHPCompatibility/issues", + "source": "https://github.com/PHPCompatibility/PHPCompatibility" + }, + "time": "2019-12-27T09:44:58+00:00" + }, + { + "name": "phpcompatibility/phpcompatibility-paragonie", + "version": "1.3.2", + "source": { + "type": "git", + "url": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie.git", + "reference": "bba5a9dfec7fcfbd679cfaf611d86b4d3759da26" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityParagonie/zipball/bba5a9dfec7fcfbd679cfaf611d86b4d3759da26", + "reference": "bba5a9dfec7fcfbd679cfaf611d86b4d3759da26", + "shasum": "" + }, + "require": { + "phpcompatibility/php-compatibility": "^9.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7", + "paragonie/random_compat": "dev-master", + "paragonie/sodium_compat": "dev-master" + }, + "suggest": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.", + "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." + }, + "type": "phpcodesniffer-standard", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Wim Godden", + "role": "lead" + }, + { + "name": "Juliette Reinders Folmer", + "role": "lead" + } + ], + "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.", + "homepage": "http://phpcompatibility.com/", + "keywords": [ + "compatibility", + "paragonie", + "phpcs", + "polyfill", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie/issues", + "source": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie" + }, + "time": "2022-10-25T01:46:02+00:00" + }, + { + "name": "phpcompatibility/phpcompatibility-wp", + "version": "2.1.4", + "source": { + "type": "git", + "url": "https://github.com/PHPCompatibility/PHPCompatibilityWP.git", + "reference": "b6c1e3ee1c35de6c41a511d5eb9bd03e447480a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityWP/zipball/b6c1e3ee1c35de6c41a511d5eb9bd03e447480a5", + "reference": "b6c1e3ee1c35de6c41a511d5eb9bd03e447480a5", + "shasum": "" + }, + "require": { + "phpcompatibility/php-compatibility": "^9.0", + "phpcompatibility/phpcompatibility-paragonie": "^1.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7" + }, + "suggest": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.", + "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." + }, + "type": "phpcodesniffer-standard", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Wim Godden", + "role": "lead" + }, + { + "name": "Juliette Reinders Folmer", + "role": "lead" + } + ], + "description": "A ruleset for PHP_CodeSniffer to check for PHP cross-version compatibility issues in projects, while accounting for polyfills provided by WordPress.", + "homepage": "http://phpcompatibility.com/", + "keywords": [ + "compatibility", + "phpcs", + "standards", + "static analysis", + "wordpress" + ], + "support": { + "issues": "https://github.com/PHPCompatibility/PHPCompatibilityWP/issues", + "source": "https://github.com/PHPCompatibility/PHPCompatibilityWP" + }, + "time": "2022-10-24T09:00:36+00:00" + }, + { + "name": "phpcsstandards/phpcsextra", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/PHPCSStandards/PHPCSExtra.git", + "reference": "746c3190ba8eb2f212087c947ba75f4f5b9a58d5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCSStandards/PHPCSExtra/zipball/746c3190ba8eb2f212087c947ba75f4f5b9a58d5", + "reference": "746c3190ba8eb2f212087c947ba75f4f5b9a58d5", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "phpcsstandards/phpcsutils": "^1.0.8", + "squizlabs/php_codesniffer": "^3.7.1" + }, + "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" + }, + "type": "phpcodesniffer-standard", + "extra": { + "branch-alias": { + "dev-stable": "1.x-dev", + "dev-develop": "1.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Juliette Reinders Folmer", + "homepage": "https://github.com/jrfnl", + "role": "lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHPCSExtra/graphs/contributors" + } + ], + "description": "A collection of sniffs and standards for use with PHP_CodeSniffer.", + "keywords": [ + "PHP_CodeSniffer", + "phpcbf", + "phpcodesniffer-standard", + "phpcs", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHPCSStandards/PHPCSExtra/issues", + "source": "https://github.com/PHPCSStandards/PHPCSExtra" + }, + "time": "2023-09-20T22:06:18+00:00" + }, + { + "name": "phpcsstandards/phpcsutils", + "version": "1.0.8", + "source": { + "type": "git", + "url": "https://github.com/PHPCSStandards/PHPCSUtils.git", + "reference": "69465cab9d12454e5e7767b9041af0cd8cd13be7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCSStandards/PHPCSUtils/zipball/69465cab9d12454e5e7767b9041af0cd8cd13be7", + "reference": "69465cab9d12454e5e7767b9041af0cd8cd13be7", + "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" + }, + "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" + }, + "type": "phpcodesniffer-standard", + "extra": { + "branch-alias": { + "dev-stable": "1.x-dev", + "dev-develop": "1.x-dev" + } + }, + "autoload": { + "classmap": [ + "PHPCSUtils/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Juliette Reinders Folmer", + "homepage": "https://github.com/jrfnl", + "role": "lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHPCSUtils/graphs/contributors" + } + ], + "description": "A suite of utility functions for use with PHP_CodeSniffer", + "homepage": "https://phpcsutils.com/", + "keywords": [ + "PHP_CodeSniffer", + "phpcbf", + "phpcodesniffer-standard", + "phpcs", + "phpcs3", + "standards", + "static analysis", + "tokens", + "utility" + ], + "support": { + "docs": "https://phpcsutils.com/", + "issues": "https://github.com/PHPCSStandards/PHPCSUtils/issues", + "source": "https://github.com/PHPCSStandards/PHPCSUtils" + }, + "time": "2023-07-16T21:39:41+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "9.2.29", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/6a3a87ac2bbe33b25042753df8195ba4aa534c76", + "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.15", + "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" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.29" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-09-19T04:57:46+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "3.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-12-02T12:48:52+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:58:55+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T05:33:50+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:16:10+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "9.6.13", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "f3d767f7f9e191eab4189abe41ab37797e30b1be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f3d767f7f9e191eab4189abe41ab37797e30b1be", + "reference": "f3d767f7f9e191eab4189abe41ab37797e30b1be", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.3.1 || ^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", + "php": ">=7.3", + "phpunit/php-code-coverage": "^9.2.28", + "phpunit/php-file-iterator": "^3.0.5", + "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", + "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/version": "^3.0.2" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.6-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.13" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2023-09-19T05:39:22+00:00" + }, + { + "name": "pluginever/framework-model", + "version": "dev-master", + "source": { + "type": "git", + "url": "git@github.com:pluginever/framework-model.git", + "reference": "5a5de16e378f2a7a3b8ba95d1eb3569f7a3a6574" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pluginever/framework-model/zipball/5a5de16e378f2a7a3b8ba95d1eb3569f7a3a6574", + "reference": "5a5de16e378f2a7a3b8ba95d1eb3569f7a3a6574", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "byteever/byteever-sniffs": "dev-master" + }, + "default-branch": true, + "type": "library", + "autoload": { + "psr-4": { + "Lib\\": "src" + } + }, + "scripts": { + "phpcs": [ + "@php ./vendor/bin/phpcs --standard=phpcs.xml -s -v" + ], + "phpcbf": [ + "@php ./vendor/bin/phpcbf --standard=phpcs.xml -v" + ] + }, + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Sultan Nasir Uddin", + "email": "manikdrmc@gmail.com" + } + ], + "description": "Model for the framework", + "support": { + "source": "https://github.com/pluginever/framework-model/tree/v1.0.8", + "issues": "https://github.com/pluginever/framework-model/issues" + }, + "time": "2023-10-25T08:49:24+00:00" + }, + { + "name": "pluginever/framework-plugin", + "version": "dev-master", + "source": { + "type": "git", + "url": "git@github.com:pluginever/framework-plugin.git", + "reference": "dd76127abd4a0c6dd8253fe6b885a807dfe8e4e0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pluginever/framework-plugin/zipball/dd76127abd4a0c6dd8253fe6b885a807dfe8e4e0", + "reference": "dd76127abd4a0c6dd8253fe6b885a807dfe8e4e0", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "byteever/byteever-sniffs": "dev-master" + }, + "default-branch": true, + "type": "library", + "autoload": { + "psr-4": { + "Lib\\": "src" + } + }, + "scripts": { + "phpcs": [ + "@php ./vendor/bin/phpcs --standard=phpcs.xml -s -v" + ], + "phpcbf": [ + "@php ./vendor/bin/phpcbf --standard=phpcs.xml -v" + ] + }, + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Sultan Nasir Uddin", + "email": "manikdrmc@gmail.com" + } + ], + "description": "A set of related classes to kick start WordPress plugin development.", + "support": { + "source": "https://github.com/pluginever/framework-plugin/tree/v1.0.8", + "issues": "https://github.com/pluginever/framework-plugin/issues" + }, + "time": "2023-10-25T08:44:40+00:00" + }, + { + "name": "pluginever/framework-settings", + "version": "dev-master", + "source": { + "type": "git", + "url": "git@github.com:pluginever/framework-settings.git", + "reference": "f80a91b9a3aef06c56d85a5f3e097da7b9386a80" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pluginever/framework-settings/zipball/f80a91b9a3aef06c56d85a5f3e097da7b9386a80", + "reference": "f80a91b9a3aef06c56d85a5f3e097da7b9386a80", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "byteever/byteever-sniffs": "dev-master" + }, + "default-branch": true, + "type": "library", + "autoload": { + "psr-4": { + "Lib\\": "src" + } + }, + "scripts": { + "phpcs": [ + "@php ./vendor/bin/phpcs --standard=phpcs.xml -s -v" + ], + "phpcbf": [ + "@php ./vendor/bin/phpcbf --standard=phpcs.xml -v" + ] + }, + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Sultan Nasir Uddin", + "email": "manikdrmc@gmail.com" + } + ], + "description": "A set of related classes to kick start WordPress plugin development.", + "support": { + "source": "https://github.com/pluginever/framework-settings/tree/v1.0.4", + "issues": "https://github.com/pluginever/framework-settings/issues" + }, + "time": "2023-10-25T08:44:07+00:00" + }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "e616d01114759c4c489f93b099585439f795fe35" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", + "reference": "e616d01114759c4c489f93b099585439f795fe35", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory/tree/1.0.2" + }, + "time": "2023-04-10T20:10:41+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "psr/simple-cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" + }, + "time": "2021-10-29T13:26:27+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:08:49+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "1.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:08:54+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:30:19+00:00" + }, + { + "name": "sebastian/comparator", + "version": "4.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/diff": "^4.0", + "sebastian/exporter": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-09-14T12:41:17+00:00" + }, + { + "name": "sebastian/complexity", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", + "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.7", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T15:52:27+00:00" + }, + { + "name": "sebastian/diff", + "version": "4.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-05-07T05:35:17+00:00" + }, + { + "name": "sebastian/environment", + "version": "5.1.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:03:51+00:00" + }, + { + "name": "sebastian/exporter", + "version": "4.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-09-14T06:03:37+00:00" + }, + { + "name": "sebastian/global-state", + "version": "5.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "bde739e7565280bda77be70044ac1047bc007e34" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bde739e7565280bda77be70044ac1047bc007e34", + "reference": "bde739e7565280bda77be70044ac1047bc007e34", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-02T09:26:13+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.6", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-28T06:42:11+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:12:34+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:14:26+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "4.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:07:39+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "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" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:45:17+00:00" + }, + { + "name": "sebastian/type", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:13:03+00:00" + }, + { + "name": "sebastian/version", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c6c1022351a901512170118436c764e473f6de8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", + "reference": "c6c1022351a901512170118436c764e473f6de8c", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:39:44+00:00" + }, + { + "name": "softcreatr/jsonpath", + "version": "0.7.5", + "source": { + "type": "git", + "url": "https://github.com/SoftCreatR/JSONPath.git", + "reference": "008569bf80aa3584834f7890781576bc7b65afa7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/SoftCreatR/JSONPath/zipball/008569bf80aa3584834f7890781576bc7b65afa7", + "reference": "008569bf80aa3584834f7890781576bc7b65afa7", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": ">=7.1" + }, + "replace": { + "flow/jsonpath": "*" + }, + "require-dev": { + "phpunit/phpunit": ">=7.0", + "roave/security-advisories": "dev-master", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Flow\\JSONPath\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Stephen Frank", + "email": "stephen@flowsa.com", + "homepage": "https://prismaticbytes.com", + "role": "Developer" + }, + { + "name": "Sascha Greuel", + "email": "hello@1-2.dev", + "homepage": "http://1-2.dev", + "role": "Developer" + } + ], + "description": "JSONPath implementation for parsing, searching and flattening arrays", + "support": { + "email": "hello@1-2.dev", + "forum": "https://github.com/SoftCreatR/JSONPath/discussions", + "issues": "https://github.com/SoftCreatR/JSONPath/issues", + "source": "https://github.com/SoftCreatR/JSONPath" + }, + "funding": [ + { + "url": "https://github.com/softcreatr", + "type": "github" + } + ], + "time": "2021-06-02T22:15:26+00:00" + }, + { + "name": "squizlabs/php_codesniffer", + "version": "3.7.2", + "source": { + "type": "git", + "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", + "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/ed8e00df0a83aa96acf703f8c2979ff33341f879", + "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "bin": [ + "bin/phpcs", + "bin/phpcbf" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "lead" + } + ], + "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", + "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" + }, + "time": "2023-02-22T23:07:41+00:00" + }, + { + "name": "symfony/browser-kit", + "version": "v5.4.21", + "source": { + "type": "git", + "url": "https://github.com/symfony/browser-kit.git", + "reference": "a866ca7e396f15d7efb6d74a8a7d364d4e05b704" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/a866ca7e396f15d7efb6d74a8a7d364d4e05b704", + "reference": "a866ca7e396f15d7efb6d74a8a7d364d4e05b704", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/dom-crawler": "^4.4|^5.0|^6.0", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "symfony/css-selector": "^4.4|^5.0|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/mime": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\BrowserKit\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/browser-kit/tree/v5.4.21" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-02-14T08:03:56+00:00" + }, + { + "name": "symfony/console", + "version": "v5.4.28", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "f4f71842f24c2023b91237c72a365306f3c58827" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/f4f71842f24c2023b91237c72a365306f3c58827", + "reference": "f4f71842f24c2023b91237c72a365306f3c58827", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.1|^6.0" + }, + "conflict": { + "psr/log": ">=3", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/log": "^1|^2", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v5.4.28" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-08-07T06:12:30+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v5.4.26", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "0ad3f7e9a1ab492c5b4214cf22a9dc55dcf8600a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/0ad3f7e9a1ab492c5b4214cf22a9dc55dcf8600a", + "reference": "0ad3f7e9a1ab492c5b4214cf22a9dc55dcf8600a", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v5.4.26" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-07-07T06:10:25+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/26954b3d62a6c5fd0ea8a2a00c0353a14978d05c", + "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c", + "shasum": "" + }, + "require": { + "php": ">=8.0.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.0.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-01-02T09:55:41+00:00" + }, + { + "name": "symfony/dom-crawler", + "version": "v5.4.25", + "source": { + "type": "git", + "url": "https://github.com/symfony/dom-crawler.git", + "reference": "d2aefa5a7acc5511422792931d14d1be96fe9fea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/d2aefa5a7acc5511422792931d14d1be96fe9fea", + "reference": "d2aefa5a7acc5511422792931d14d1be96fe9fea", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "masterminds/html5": "<2.6" + }, + "require-dev": { + "masterminds/html5": "^2.6", + "symfony/css-selector": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/css-selector": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\DomCrawler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases DOM navigation for HTML and XML documents", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/dom-crawler/tree/v5.4.25" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-06-05T08:05:41+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v5.4.26", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "5dcc00e03413f05c1e7900090927bb7247cb0aac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/5dcc00e03413f05c1e7900090927bb7247cb0aac", + "reference": "5dcc00e03413f05c1e7900090927bb7247cb0aac", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/event-dispatcher-contracts": "^2|^3", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/dependency-injection": "<4.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^4.4|^5.0|^6.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/stopwatch": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "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.26" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-07-06T06:34:20+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "7bc61cc2db649b4637d331240c5346dcc7708051" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7bc61cc2db649b4637d331240c5346dcc7708051", + "reference": "7bc61cc2db649b4637d331240c5346dcc7708051", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "psr/event-dispatcher": "^1" + }, + "suggest": { + "symfony/event-dispatcher-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.0.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-01-02T09:55:41+00:00" + }, + { + "name": "symfony/finder", + "version": "v5.4.27", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "ff4bce3c33451e7ec778070e45bd23f74214cd5d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/ff4bce3c33451e7ec778070e45bd23f74214cd5d", + "reference": "ff4bce3c33451e7ec778070e45bd23f74214cd5d", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v5.4.27" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-07-31T08:02:31+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "875e90aeea2777b6f135677f618529449334a612" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", + "reference": "875e90aeea2777b6f135677f618529449334a612", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "42292d99c55abe617799667f454222c54c60e229" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", + "reference": "42292d99c55abe617799667f454222c54c60e229", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-07-28T09:04:16+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fe2f306d1d9d346a7fee353d0d5012e401e984b5", + "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/process", + "version": "v6.0.19", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "2114fd60f26a296cc403a7939ab91478475a33d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/2114fd60f26a296cc403a7939ab91478475a33d4", + "reference": "2114fd60f26a296cc403a7939ab91478475a33d4", + "shasum": "" + }, + "require": { + "php": ">=8.0.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v6.0.19" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-01T08:36:10+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "d78d39c1599bd1188b8e26bb341da52c3c6d8a66" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d78d39c1599bd1188b8e26bb341da52c3c6d8a66", + "reference": "d78d39c1599bd1188b8e26bb341da52c3c6d8a66", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "psr/container": "^2.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.0.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-30T19:17:58+00:00" + }, + { + "name": "symfony/string", + "version": "v6.0.19", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "d9e72497367c23e08bf94176d2be45b00a9d232a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/d9e72497367c23e08bf94176d2be45b00a9d232a", + "reference": "d9e72497367c23e08bf94176d2be45b00a9d232a", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.0" + }, + "require-dev": { + "symfony/error-handler": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/translation-contracts": "^2.0|^3.0", + "symfony/var-exporter": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v6.0.19" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-01T08:36:10+00:00" + }, + { + "name": "symfony/translation", + "version": "v6.0.19", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "9c24b3fdbbe9fb2ef3a6afd8bbaadfd72dad681f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/9c24b3fdbbe9fb2ef3a6afd8bbaadfd72dad681f", + "reference": "9c24b3fdbbe9fb2ef3a6afd8bbaadfd72dad681f", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.3|^3.0" + }, + "conflict": { + "symfony/config": "<5.4", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/http-kernel": "<5.4", + "symfony/twig-bundle": "<5.4", + "symfony/yaml": "<5.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/console": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/finder": "^5.4|^6.0", + "symfony/http-client-contracts": "^1.1|^2.0|^3.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/intl": "^5.4|^6.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/service-contracts": "^1.1.2|^2|^3", + "symfony/yaml": "^5.4|^6.0" + }, + "suggest": { + "psr/log-implementation": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v6.0.19" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-01T08:36:10+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "acbfbb274e730e5a0236f619b6168d9dedb3e282" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/acbfbb274e730e5a0236f619b6168d9dedb3e282", + "reference": "acbfbb274e730e5a0236f619b6168d9dedb3e282", + "shasum": "" + }, + "require": { + "php": ">=8.0.2" + }, + "suggest": { + "symfony/translation-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.0.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-06-27T17:10:44+00:00" + }, + { + "name": "symfony/yaml", + "version": "v5.4.23", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "4cd2e3ea301aadd76a4172756296fe552fb45b0b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/4cd2e3ea301aadd76a4172756296fe552fb45b0b", + "reference": "4cd2e3ea301aadd76a4172756296fe552fb45b0b", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<5.3" + }, + "require-dev": { + "symfony/console": "^5.3|^6.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v5.4.23" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-04-23T19:33:36+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.1" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2021-07-28T10:34:58+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "b56450eed252f6801410d810c8e1727224ae0743" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743", + "reference": "b56450eed252f6801410d810c8e1727224ae0743", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.0.1" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2022-03-08T17:03:00+00:00" + }, + { + "name": "vria/nodiacritic", + "version": "0.1.2", + "source": { + "type": "git", + "url": "https://github.com/vria/nodiacritic.git", + "reference": "3efeb60fb2586fe3ce8ff0f3c122d380717b8b07" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vria/nodiacritic/zipball/3efeb60fb2586fe3ce8ff0f3c122d380717b8b07", + "reference": "3efeb60fb2586fe3ce8ff0f3c122d380717b8b07", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "4.8.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "VRia\\Utils\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0" + ], + "authors": [ + { + "name": "Riabchenko Vlad", + "email": "contact@vria.eu", + "homepage": "http://vria.eu" + } + ], + "description": "Tiny helper function that removes all diacritical signs from characters", + "homepage": "https://github.com/vria/nodiacritic", + "keywords": [ + "accent", + "diacritic", + "filter", + "string", + "text" + ], + "support": { + "email": "contact@vria.eu", + "issues": "https://github.com/vria/nodiacritic/issues", + "source": "https://github.com/vria/nodiacritic/tree/0.1.2" + }, + "time": "2016-09-17T22:03:11+00:00" + }, + { + "name": "wp-cli/mustangostang-spyc", + "version": "0.6.3", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/spyc.git", + "reference": "6aa0b4da69ce9e9a2c8402dab8d43cf32c581cc7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/spyc/zipball/6aa0b4da69ce9e9a2c8402dab8d43cf32c581cc7", + "reference": "6aa0b4da69ce9e9a2c8402dab8d43cf32c581cc7", + "shasum": "" + }, + "require": { + "php": ">=5.3.1" + }, + "require-dev": { + "phpunit/phpunit": "4.3.*@dev" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.5.x-dev" + } + }, + "autoload": { + "files": [ + "includes/functions.php" + ], + "psr-4": { + "Mustangostang\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "mustangostang", + "email": "vlad.andersen@gmail.com" + } + ], + "description": "A simple YAML loader/dumper class for PHP (WP-CLI fork)", + "homepage": "https://github.com/mustangostang/spyc/", + "support": { + "source": "https://github.com/wp-cli/spyc/tree/autoload" + }, + "time": "2017-04-25T11:26:20+00:00" + }, + { + "name": "wp-cli/php-cli-tools", + "version": "v0.11.21", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/php-cli-tools.git", + "reference": "b3457a8d60cd0b1c48cab76ad95df136d266f0b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/php-cli-tools/zipball/b3457a8d60cd0b1c48cab76ad95df136d266f0b6", + "reference": "b3457a8d60cd0b1c48cab76ad95df136d266f0b6", + "shasum": "" + }, + "require": { + "php": ">= 5.3.0" + }, + "require-dev": { + "roave/security-advisories": "dev-latest", + "wp-cli/wp-cli-tests": "^4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.11.x-dev" + } + }, + "autoload": { + "files": [ + "lib/cli/cli.php" + ], + "psr-0": { + "cli": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Bachhuber", + "email": "daniel@handbuilt.co", + "role": "Maintainer" + }, + { + "name": "James Logsdon", + "email": "jlogsdon@php.net", + "role": "Developer" + } + ], + "description": "Console utilities for PHP", + "homepage": "http://github.com/wp-cli/php-cli-tools", + "keywords": [ + "cli", + "console" + ], + "support": { + "issues": "https://github.com/wp-cli/php-cli-tools/issues", + "source": "https://github.com/wp-cli/php-cli-tools/tree/v0.11.21" + }, + "time": "2023-09-29T15:28:10+00:00" + }, + { + "name": "wp-cli/wp-cli", + "version": "v2.9.0", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/wp-cli.git", + "reference": "8a3befba2d947fbf5cc6d1941edf2dd99da4d4b7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/wp-cli/zipball/8a3befba2d947fbf5cc6d1941edf2dd99da4d4b7", + "reference": "8a3befba2d947fbf5cc6d1941edf2dd99da4d4b7", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "mustache/mustache": "^2.14.1", + "php": "^5.6 || ^7.0 || ^8.0", + "symfony/finder": ">2.7", + "wp-cli/mustangostang-spyc": "^0.6.3", + "wp-cli/php-cli-tools": "~0.11.2" + }, + "require-dev": { + "roave/security-advisories": "dev-latest", + "wp-cli/db-command": "^1.3 || ^2", + "wp-cli/entity-command": "^1.2 || ^2", + "wp-cli/extension-command": "^1.1 || ^2", + "wp-cli/package-command": "^1 || ^2", + "wp-cli/wp-cli-tests": "^4.0.1" + }, + "suggest": { + "ext-readline": "Include for a better --prompt implementation", + "ext-zip": "Needed to support extraction of ZIP archives when doing downloads or updates" + }, + "bin": [ + "bin/wp", + "bin/wp.bat" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.9.x-dev" + } + }, + "autoload": { + "psr-0": { + "WP_CLI\\": "php/" + }, + "classmap": [ + "php/class-wp-cli.php", + "php/class-wp-cli-command.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "WP-CLI framework", + "homepage": "https://wp-cli.org", + "keywords": [ + "cli", + "wordpress" + ], + "support": { + "docs": "https://make.wordpress.org/cli/handbook/", + "issues": "https://github.com/wp-cli/wp-cli/issues", + "source": "https://github.com/wp-cli/wp-cli" + }, + "time": "2023-10-25T09:06:37+00:00" + }, + { + "name": "wp-coding-standards/wpcs", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/WordPress/WordPress-Coding-Standards.git", + "reference": "b4caf9689f1a0e4a4c632679a44e638c1c67aff1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/WordPress/WordPress-Coding-Standards/zipball/b4caf9689f1a0e4a4c632679a44e638c1c67aff1", + "reference": "b4caf9689f1a0e4a4c632679a44e638c1c67aff1", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "ext-libxml": "*", + "ext-tokenizer": "*", + "ext-xmlreader": "*", + "php": ">=5.4", + "phpcsstandards/phpcsextra": "^1.1.0", + "phpcsstandards/phpcsutils": "^1.0.8", + "squizlabs/php_codesniffer": "^3.7.2" + }, + "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" + }, + "suggest": { + "ext-iconv": "For improved results", + "ext-mbstring": "For improved results" + }, + "type": "phpcodesniffer-standard", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Contributors", + "homepage": "https://github.com/WordPress/WordPress-Coding-Standards/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer rules (sniffs) to enforce WordPress coding conventions", + "keywords": [ + "phpcs", + "standards", + "static analysis", + "wordpress" + ], + "support": { + "issues": "https://github.com/WordPress/WordPress-Coding-Standards/issues", + "source": "https://github.com/WordPress/WordPress-Coding-Standards", + "wiki": "https://github.com/WordPress/WordPress-Coding-Standards/wiki" + }, + "funding": [ + { + "url": "https://opencollective.com/thewpcc/contribute/wp-php-63406", + "type": "custom" + } + ], + "time": "2023-09-14T07:06:09+00:00" + }, + { + "name": "zordius/lightncandy", + "version": "v1.2.6", + "source": { + "type": "git", + "url": "https://github.com/zordius/lightncandy.git", + "reference": "b451f73e8b5c73e62e365997ba3c993a0376b72a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zordius/lightncandy/zipball/b451f73e8b5c73e62e365997ba3c993a0376b72a", + "reference": "b451f73e8b5c73e62e365997ba3c993a0376b72a", + "shasum": "" + }, + "require": { + "php": ">=7.1.0" + }, + "require-dev": { + "phpunit/phpunit": ">=7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.5-dev" + } + }, + "autoload": { + "psr-4": { + "LightnCandy\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Zordius Chen", + "email": "zordius@gmail.com" + } + ], + "description": "An extremely fast PHP implementation of handlebars ( http://handlebarsjs.com/ ) and mustache ( http://mustache.github.io/ ).", + "homepage": "https://github.com/zordius/lightncandy", + "keywords": [ + "handlebars", + "logicless", + "mustache", + "php", + "template" + ], + "support": { + "issues": "https://github.com/zordius/lightncandy/issues", + "source": "https://github.com/zordius/lightncandy/tree/v1.2.6" + }, + "time": "2021-07-11T04:52:41+00:00" + } + ], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": { + "pluginever/framework-model": 20, + "pluginever/framework-plugin": 20, + "pluginever/framework-settings": 20 + }, + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": ">=7.0" + }, + "platform-dev": [], + "plugin-api-version": "2.3.0" +} diff --git a/examples/api-test.php b/examples/api-test.txt similarity index 99% rename from examples/api-test.php rename to examples/api-test.txt index 2dc12629..680db184 100644 --- a/examples/api-test.php +++ b/examples/api-test.txt @@ -4,7 +4,6 @@ if ( ! current_user_can( 'manage_options' ) ) { die(); } - // API variables, please override. $base_url = 'http://domain.com'; $email = 'example@domain.com'; diff --git a/languages/wc-serial-numbers.pot b/languages/wc-serial-numbers.pot index 837daf4d..0a0b85d7 100644 --- a/languages/wc-serial-numbers.pot +++ b/languages/wc-serial-numbers.pot @@ -2,9 +2,9 @@ # This file is distributed under the GPLv2+. msgid "" msgstr "" -"Project-Id-Version: Serial Numbers for WooCommerce 1.5.4\n" +"Project-Id-Version: Serial Numbers for WooCommerce 1.6.5\n" "Report-Msgid-Bugs-To: https://pluginever.com/plugins/wc-serial-numbers/\n" -"POT-Creation-Date: 2023-07-26 11:50:29+00:00\n" +"POT-Creation-Date: 2023-10-25 10:44:49+00:00\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -33,153 +33,145 @@ msgstr "" msgid "Could not update item in the database." msgstr "" -#: lib/Lib/Plugin.php:294 +#: lib/Lib/Plugin.php:309 msgid "Go Pro" msgstr "" -#: lib/Lib/Plugin.php:640 src/Admin/Settings.php:190 +#: lib/Lib/Plugin.php:655 src/Admin/Settings.php:190 msgid "Documentation" msgstr "" -#: lib/Lib/Plugin.php:647 +#: lib/Lib/Plugin.php:662 msgid "Support" msgstr "" -#: lib/Lib/Plugin.php:654 +#: lib/Lib/Plugin.php:669 msgid "Review" msgstr "" -#: lib/Lib/Plugin.php:660 +#: lib/Lib/Plugin.php:675 msgid "More Plugins" msgstr "" -#: lib/Lib/Plugin.php:677 src/Admin/Menus.php:179 src/Admin/Menus.php:180 +#: lib/Lib/Plugin.php:692 src/Admin/Menus.php:169 src/Admin/Menus.php:170 msgid "Settings" msgstr "" -#: lib/Lib/Settings.php:84 +#: lib/Lib/Settings.php:96 msgid "Settings saved." msgstr "" -#: lib/Lib/Settings.php:248 lib/Lib/Settings.php:339 lib/Lib/Settings.php:348 -#: lib/Lib/Settings.php:357 +#: lib/Lib/Settings.php:310 lib/Lib/Settings.php:398 lib/Lib/Settings.php:406 +#: lib/Lib/Settings.php:414 msgid "Recommended" msgstr "" -#: lib/Lib/Settings.php:249 lib/Lib/Settings.php:340 lib/Lib/Settings.php:349 -#: lib/Lib/Settings.php:358 +#: lib/Lib/Settings.php:311 lib/Lib/Settings.php:399 lib/Lib/Settings.php:407 +#: lib/Lib/Settings.php:415 msgid "Install Now" msgstr "" -#: lib/Lib/Settings.php:310 +#: lib/Lib/Settings.php:370 msgid "Need Help?" msgstr "" -#: lib/Lib/Settings.php:372 +#: lib/Lib/Settings.php:429 msgid "Join our Community" msgstr "" -#: lib/Lib/Settings.php:376 +#: lib/Lib/Settings.php:433 msgid "Request a Feature" msgstr "" -#: lib/Lib/Settings.php:380 +#: lib/Lib/Settings.php:437 msgid "Report a Bug" msgstr "" -#: lib/classes/wp-background-process.php:653 -msgid "Every Minute" -msgstr "" - -#: lib/classes/wp-background-process.php:655 -msgid "Every %d Minutes" -msgstr "" - -#: src/API.php:60 +#: src/API.php:82 msgid "Invalid action." msgstr "" -#: src/API.php:71 +#: src/API.php:93 msgid "Invalid product ID." msgstr "" -#: src/API.php:81 src/Models/Key.php:494 +#: src/API.php:103 src/Models/Key.php:494 msgid "Serial key is required." msgstr "" -#: src/API.php:97 +#: src/API.php:119 msgid "Serial key is invalid." msgstr "" -#: src/API.php:107 +#: src/API.php:129 msgid "Serial key is not authorized to use." msgstr "" -#: src/API.php:118 +#: src/API.php:140 msgid "Please complete your order to activate the serial key." msgstr "" -#: src/API.php:128 +#: src/API.php:150 msgid "Serial key is not valid for this product." msgstr "" -#: src/API.php:138 +#: src/API.php:160 msgid "Invalid email address." msgstr "" -#: src/API.php:148 +#: src/API.php:170 msgid "Serial key is expired." msgstr "" -#: src/API.php:155 +#: src/API.php:177 msgid "Serial key is cancelled." msgstr "" -#: src/API.php:162 +#: src/API.php:184 msgid "Invalid serial key." msgstr "" -#: src/API.php:181 +#: src/API.php:203 msgid "Serial key is valid." msgstr "" -#: src/API.php:220 src/API.php:321 +#: src/API.php:242 src/API.php:343 msgid "Instance is missing, You must provide an instance to deactivate license" msgstr "" -#: src/API.php:236 +#: src/API.php:258 msgid "Instance is already activated." msgstr "" -#: src/API.php:246 +#: src/API.php:268 msgid "Activation limit reached" msgstr "" -#: src/API.php:273 +#: src/API.php:295 msgid "Activation failed." msgstr "" -#: src/API.php:282 +#: src/API.php:304 msgid "Serial key is activated." msgstr "" -#: src/API.php:337 +#: src/API.php:359 msgid "Instance is not activated." msgstr "" -#: src/API.php:347 +#: src/API.php:369 msgid "Deactivation failed." msgstr "" -#: src/API.php:356 +#: src/API.php:378 msgid "Serial key is deactivated." msgstr "" -#: src/Admin/Actions.php:49 +#: src/Admin/Actions.php:222 msgid "Key added successfully." msgstr "" -#: src/Admin/Actions.php:51 +#: src/Admin/Actions.php:224 msgid "Key updated successfully." msgstr "" @@ -207,84 +199,84 @@ msgstr "" msgid "Copied" msgstr "" -#: src/Admin/Admin.php:104 +#: src/Admin/Admin.php:108 #. translators: 1: Plugin name 2: WordPress msgid "" "Thank you for using %1$s! Share your appreciation with a five-star review " "%2$s." msgstr "" -#: src/Admin/Admin.php:106 +#: src/Admin/Admin.php:110 msgid "Thanks :)" msgstr "" -#: src/Admin/Admin.php:124 +#: src/Admin/Admin.php:128 #. translators: 1: Plugin version msgid "Version %s" msgstr "" -#: src/Admin/Admin.php:137 src/Admin/Menus.php:56 src/Admin/Menus.php:97 -#: src/Admin/Menus.php:98 src/Admin/Menus.php:433 src/Admin/Metaboxes.php:33 -#: src/Admin/Metaboxes.php:229 src/Functions/Template.php:226 +#: src/Admin/Admin.php:141 src/Admin/Menus.php:52 src/Admin/Menus.php:87 +#: src/Admin/Menus.php:88 src/Admin/Menus.php:429 src/Admin/Metaboxes.php:36 +#: src/Admin/Metaboxes.php:248 src/Functions/Template.php:226 msgid "Serial Numbers" msgstr "" #: src/Admin/ListTables/ActivationsTable.php:39 -#: src/Admin/ListTables/KeysTable.php:321 +#: src/Admin/ListTables/KeysTable.php:355 msgid "Activation" msgstr "" -#: src/Admin/ListTables/ActivationsTable.php:40 src/Admin/Menus.php:128 -#: src/Admin/Menus.php:129 src/Admin/Views/html-list-activations.php:18 +#: src/Admin/ListTables/ActivationsTable.php:40 src/Admin/Menus.php:118 +#: src/Admin/Menus.php:119 src/Admin/views/html-list-activations.php:18 msgid "Activations" msgstr "" -#: src/Admin/ListTables/ActivationsTable.php:101 +#: src/Admin/ListTables/ActivationsTable.php:100 msgid "No activations found. Once a serial key is activated, it will appear here." msgstr "" -#: src/Admin/ListTables/ActivationsTable.php:125 -#: src/Admin/ListTables/KeysTable.php:244 -#: src/Admin/ListTables/StockTable.php:92 +#: src/Admin/ListTables/ActivationsTable.php:113 +#: src/Admin/ListTables/KeysTable.php:279 +#: src/Admin/ListTables/StockTable.php:82 msgid "Filter" msgstr "" -#: src/Admin/ListTables/ActivationsTable.php:177 -#: src/Admin/ListTables/ActivationsTable.php:252 -#: src/Admin/ListTables/KeysTable.php:301 -#: src/Admin/ListTables/KeysTable.php:392 src/Admin/Views/html-edit-key.php:132 +#: src/Admin/ListTables/ActivationsTable.php:165 +#: src/Admin/ListTables/ActivationsTable.php:240 +#: src/Admin/ListTables/KeysTable.php:335 +#: src/Admin/ListTables/KeysTable.php:427 src/Admin/views/html-edit-key.php:130 msgid "Delete" msgstr "" -#: src/Admin/ListTables/ActivationsTable.php:189 -#: src/Admin/Views/html-api-actions.php:141 src/Frontend/Shortcodes.php:141 +#: src/Admin/ListTables/ActivationsTable.php:177 +#: src/Admin/views/html-api-actions.php:141 src/Frontend/Shortcodes.php:142 msgid "Instance" msgstr "" -#: src/Admin/ListTables/ActivationsTable.php:190 -#: src/Admin/ListTables/KeysTable.php:315 -#: src/Admin/ListTables/StockTable.php:105 -#: src/Admin/Views/html-api-actions.php:118 -#: src/Admin/Views/html-api-validation.php:121 -#: src/Admin/Views/html-edit-key.php:39 src/Deprecated/Functions.php:359 -#: src/Frontend/Shortcodes.php:40 src/Frontend/Shortcodes.php:136 +#: src/Admin/ListTables/ActivationsTable.php:178 +#: src/Admin/ListTables/KeysTable.php:349 +#: src/Admin/ListTables/StockTable.php:95 src/Admin/views/html-add-key.php:33 +#: src/Admin/views/html-api-actions.php:118 +#: src/Admin/views/html-api-validation.php:121 +#: src/Admin/views/html-edit-key.php:37 src/Deprecated/Functions.php:358 +#: src/Frontend/Shortcodes.php:40 src/Frontend/Shortcodes.php:137 msgid "Product" msgstr "" -#: src/Admin/ListTables/ActivationsTable.php:191 -#: src/Admin/ListTables/KeysTable.php:314 src/Admin/Orders.php:192 -#: src/Admin/Views/html-api-actions.php:131 -#: src/Admin/Views/html-api-validation.php:134 src/Functions/Template.php:42 -#: src/functions.php:998 +#: src/Admin/ListTables/ActivationsTable.php:179 +#: src/Admin/ListTables/KeysTable.php:348 src/Admin/Orders.php:192 +#: src/Admin/views/html-api-actions.php:131 +#: src/Admin/views/html-api-validation.php:134 src/Functions/Template.php:42 +#: src/functions.php:1009 msgid "Key" msgstr "" -#: src/Admin/ListTables/ActivationsTable.php:192 -#: src/Admin/Views/html-api-actions.php:152 src/Frontend/Shortcodes.php:143 +#: src/Admin/ListTables/ActivationsTable.php:180 +#: src/Admin/views/html-api-actions.php:152 src/Frontend/Shortcodes.php:144 msgid "Platform" msgstr "" -#: src/Admin/ListTables/ActivationsTable.php:193 +#: src/Admin/ListTables/ActivationsTable.php:181 msgid "Activation Time" msgstr "" @@ -296,138 +288,142 @@ msgstr "" msgid "keys" msgstr "" -#: src/Admin/ListTables/KeysTable.php:170 +#: src/Admin/ListTables/KeysTable.php:169 msgid "No keys found." msgstr "" -#: src/Admin/ListTables/KeysTable.php:170 +#: src/Admin/ListTables/KeysTable.php:169 msgid "Add new key" msgstr "" -#: src/Admin/ListTables/KeysTable.php:174 +#: src/Admin/ListTables/KeysTable.php:173 msgid "Keys can have one of the following statuses:" msgstr "" -#: src/Admin/ListTables/KeysTable.php:178 -#: src/Admin/ListTables/KeysTable.php:223 src/functions.php:46 +#: src/Admin/ListTables/KeysTable.php:177 +#: src/Admin/ListTables/KeysTable.php:233 src/functions.php:46 msgid "Available" msgstr "" -#: src/Admin/ListTables/KeysTable.php:180 +#: src/Admin/ListTables/KeysTable.php:179 msgid "This means the key is available for purchase." msgstr "" -#: src/Admin/ListTables/KeysTable.php:183 -#: src/Admin/ListTables/KeysTable.php:224 src/functions.php:47 +#: src/Admin/ListTables/KeysTable.php:182 +#: src/Admin/ListTables/KeysTable.php:240 src/functions.php:47 msgid "Pending" msgstr "" -#: src/Admin/ListTables/KeysTable.php:185 +#: src/Admin/ListTables/KeysTable.php:184 msgid "This means the key has been sold, but the order has not been completed yet." msgstr "" -#: src/Admin/ListTables/KeysTable.php:188 -#: src/Admin/ListTables/KeysTable.php:225 -#: src/Admin/ListTables/StockTable.php:107 src/functions.php:48 +#: src/Admin/ListTables/KeysTable.php:187 +#: src/Admin/ListTables/KeysTable.php:247 +#: src/Admin/ListTables/StockTable.php:97 src/functions.php:48 msgid "Sold" msgstr "" -#: src/Admin/ListTables/KeysTable.php:190 +#: src/Admin/ListTables/KeysTable.php:189 msgid "This means the key has been sold, and the order has been completed." msgstr "" -#: src/Admin/ListTables/KeysTable.php:193 -#: src/Admin/ListTables/KeysTable.php:226 src/Functions/Template.php:72 +#: src/Admin/ListTables/KeysTable.php:192 +#: src/Admin/ListTables/KeysTable.php:254 src/Functions/Template.php:72 #: src/functions.php:49 msgid "Expired" msgstr "" -#: src/Admin/ListTables/KeysTable.php:195 +#: src/Admin/ListTables/KeysTable.php:194 msgid "This means the key has expired and is no longer valid." msgstr "" -#: src/Admin/ListTables/KeysTable.php:198 -#: src/Admin/ListTables/KeysTable.php:227 src/functions.php:50 +#: src/Admin/ListTables/KeysTable.php:197 +#: src/Admin/ListTables/KeysTable.php:261 src/functions.php:50 msgid "Cancelled" msgstr "" -#: src/Admin/ListTables/KeysTable.php:200 +#: src/Admin/ListTables/KeysTable.php:199 msgid "" "This means the key has been cancelled and is no longer available for " "purchase or use." msgstr "" -#: src/Admin/ListTables/KeysTable.php:222 +#: src/Admin/ListTables/KeysTable.php:224 msgid "All keys." msgstr "" -#: src/Admin/ListTables/KeysTable.php:222 +#: src/Admin/ListTables/KeysTable.php:226 msgid "All" msgstr "" -#: src/Admin/ListTables/KeysTable.php:223 +#: src/Admin/ListTables/KeysTable.php:231 msgid "Available for sell." msgstr "" -#: src/Admin/ListTables/KeysTable.php:224 +#: src/Admin/ListTables/KeysTable.php:238 msgid "Pending payment." msgstr "" -#: src/Admin/ListTables/KeysTable.php:225 +#: src/Admin/ListTables/KeysTable.php:245 msgid "Sold keys." msgstr "" -#: src/Admin/ListTables/KeysTable.php:226 +#: src/Admin/ListTables/KeysTable.php:252 msgid "Expired keys." msgstr "" -#: src/Admin/ListTables/KeysTable.php:227 +#: src/Admin/ListTables/KeysTable.php:259 msgid "Cancelled keys." msgstr "" -#: src/Admin/ListTables/KeysTable.php:302 +#: src/Admin/ListTables/KeysTable.php:336 msgid "Reset Activations" msgstr "" -#: src/Admin/ListTables/KeysTable.php:316 +#: src/Admin/ListTables/KeysTable.php:350 src/Admin/views/html-add-key.php:120 msgid "Order" msgstr "" -#: src/Admin/ListTables/KeysTable.php:317 +#: src/Admin/ListTables/KeysTable.php:351 msgid "Validity" msgstr "" -#: src/Admin/ListTables/KeysTable.php:324 +#: src/Admin/ListTables/KeysTable.php:358 msgid "Order Date" msgstr "" -#: src/Admin/ListTables/KeysTable.php:325 src/Admin/Menus.php:321 -#: src/Admin/Orders.php:204 src/Admin/Views/html-edit-key.php:94 -#: src/Functions/Template.php:78 src/functions.php:1023 +#: src/Admin/ListTables/KeysTable.php:359 src/Admin/Menus.php:316 +#: src/Admin/Orders.php:204 src/Admin/views/html-add-key.php:91 +#: src/Admin/views/html-edit-key.php:92 src/Functions/Template.php:78 +#: src/functions.php:1034 msgid "Status" msgstr "" -#: src/Admin/ListTables/KeysTable.php:390 +#: src/Admin/ListTables/KeysTable.php:425 +#. translators: %d: key id. msgid "ID: %d" msgstr "" -#: src/Admin/ListTables/KeysTable.php:391 -#: src/Admin/ListTables/StockTable.php:153 +#: src/Admin/ListTables/KeysTable.php:426 +#: src/Admin/ListTables/StockTable.php:143 msgid "Edit" msgstr "" -#: src/Admin/ListTables/KeysTable.php:482 +#: src/Admin/ListTables/KeysTable.php:521 +#. translators: %1$s: validity, %2$s: validity. msgid "%s Day
After purchase" msgid_plural "%s Days
After purchase" msgstr[0] "" msgstr[1] "" -#: src/Admin/ListTables/KeysTable.php:482 src/Admin/Orders.php:197 -#: src/Functions/Template.php:63 src/functions.php:1019 +#: src/Admin/ListTables/KeysTable.php:531 src/Admin/Orders.php:197 +#: src/Functions/Template.php:63 src/functions.php:1030 msgid "Lifetime" msgstr "" #: src/Admin/ListTables/ListTable.php:139 +#: src/Admin/ListTables/ListTable.php:141 msgid "Filter by order" msgstr "" @@ -451,161 +447,156 @@ msgstr "" msgid "No products selling serial keys from \"stock\" found." msgstr "" -#: src/Admin/ListTables/StockTable.php:106 +#: src/Admin/ListTables/StockTable.php:96 msgid "Source" msgstr "" -#: src/Admin/ListTables/StockTable.php:108 src/Admin/Menus.php:280 +#: src/Admin/ListTables/StockTable.php:98 src/Admin/Menus.php:277 msgid "Stock" msgstr "" -#: src/Admin/ListTables/StockTable.php:182 +#: src/Admin/ListTables/StockTable.php:172 msgid "Manual" msgstr "" -#: src/Admin/ListTables/StockTable.php:184 +#: src/Admin/ListTables/StockTable.php:174 msgid "Generator Rule" msgstr "" -#: src/Admin/ListTables/StockTable.php:186 +#: src/Admin/ListTables/StockTable.php:176 msgid "Auto Generated" msgstr "" -#: src/Admin/ListTables/StockTable.php:188 +#: src/Admin/ListTables/StockTable.php:178 msgid "Unknown" msgstr "" -#: src/Admin/Menus.php:108 src/Admin/Menus.php:109 -#: src/Admin/Views/html-list-keys.php:18 +#: src/Admin/Menus.php:98 src/Admin/Menus.php:99 +#: src/Admin/views/html-list-keys.php:18 msgid "Serial Keys" msgstr "" -#: src/Admin/Menus.php:145 src/Admin/Menus.php:146 +#: src/Admin/Menus.php:135 src/Admin/Menus.php:136 msgid "Tools" msgstr "" -#: src/Admin/Menus.php:162 src/Admin/Menus.php:163 +#: src/Admin/Menus.php:152 src/Admin/Menus.php:153 msgid "Reports" msgstr "" -#: src/Admin/Menus.php:199 src/Admin/Metaboxes.php:125 -#: src/Admin/Metaboxes.php:144 +#: src/Admin/Menus.php:189 src/Admin/Metaboxes.php:136 +#: src/Admin/Metaboxes.php:157 msgid "Upgrade to Pro" msgstr "" -#: src/Admin/Menus.php:246 src/Admin/Views/html-list-keys.php:25 -msgid "Import" +#: src/Admin/Menus.php:243 src/Admin/Menus.php:377 +msgid "Generators" msgstr "" -#: src/Admin/Menus.php:247 src/Admin/Views/html-list-keys.php:29 -msgid "Export" +#: src/Admin/Menus.php:244 +msgid "API Toolkit" msgstr "" -#: src/Admin/Menus.php:248 src/Admin/Menus.php:382 -msgid "Generators" +#: src/Admin/Menus.php:245 src/Admin/views/html-list-keys.php:25 +msgid "Import" msgstr "" -#: src/Admin/Menus.php:249 -msgid "API" +#: src/Admin/Menus.php:246 src/Admin/views/html-list-keys.php:29 +msgid "Export" msgstr "" -#: src/Admin/Menus.php:336 src/Admin/Menus.php:343 src/Admin/Menus.php:361 -#: src/Admin/Menus.php:379 +#: src/Admin/Menus.php:331 src/Admin/Menus.php:338 src/Admin/Menus.php:356 +#: src/Admin/Menus.php:374 msgid "Available in Pro Version" msgstr "" -#: src/Admin/Menus.php:337 src/Admin/Menus.php:344 src/Admin/Menus.php:362 -#: src/Admin/Menus.php:380 +#: src/Admin/Menus.php:332 src/Admin/Menus.php:339 src/Admin/Menus.php:357 +#: src/Admin/Menus.php:375 msgid "Upgrade to Pro Now" msgstr "" -#: src/Admin/Menus.php:339 src/Admin/Menus.php:346 +#: src/Admin/Menus.php:334 src/Admin/Menus.php:341 msgid "Import Serial Numbers" msgstr "" -#: src/Admin/Menus.php:364 +#: src/Admin/Menus.php:359 msgid "Export Serial Numbers" msgstr "" -#: src/Admin/Menus.php:409 +#: src/Admin/Menus.php:404 msgid "Table exists" msgstr "" -#: src/Admin/Menus.php:411 +#: src/Admin/Menus.php:406 msgid "Table does not exist" msgstr "" -#: src/Admin/Menus.php:417 +#: src/Admin/Menus.php:412 msgid "Hourly cron" msgstr "" -#: src/Admin/Menus.php:418 +#: src/Admin/Menus.php:413 msgid "Daily cron" msgstr "" -#: src/Admin/Menus.php:423 +#: src/Admin/Menus.php:419 +#. translators: %s: Next scheduled time. msgid "Next run: %s" msgstr "" -#: src/Admin/Menus.php:425 +#: src/Admin/Menus.php:421 msgid "Not scheduled" msgstr "" -#: src/Admin/Metaboxes.php:54 -msgid "Sell serial keys" +#: src/Admin/Metaboxes.php:57 +msgid "Sell keys" msgstr "" -#: src/Admin/Metaboxes.php:55 -msgid "Enable this if you are selling serial keys for this product." +#: src/Admin/Metaboxes.php:58 +msgid "Enable this if you are selling keys or licensing this product." msgstr "" -#: src/Admin/Metaboxes.php:68 +#: src/Admin/Metaboxes.php:71 msgid "Delivery quantity" msgstr "" -#: src/Admin/Metaboxes.php:69 -msgid "Number of serial key(s) will be delivered per item. Available in PRO." +#: src/Admin/Metaboxes.php:72 +msgid "Number of key(s) will be delivered per item. Available in PRO." msgstr "" -#: src/Admin/Metaboxes.php:89 -msgid "Serial key source" +#: src/Admin/Metaboxes.php:92 src/Admin/Metaboxes.php:124 +msgid "Key source" msgstr "" -#: src/Admin/Metaboxes.php:107 +#: src/Admin/Metaboxes.php:110 msgid "Software version" msgstr "" -#: src/Admin/Metaboxes.php:108 -msgid "Version number for the software. Ignore if it's not a software product." +#: src/Admin/Metaboxes.php:111 +msgid "Version number for the software. Ignore if it's not a software." msgstr "" -#: src/Admin/Metaboxes.php:109 +#: src/Admin/Metaboxes.php:112 msgid "e.g. 1.0" msgstr "" -#: src/Admin/Metaboxes.php:120 -msgid "Stock status" -msgstr "" - -#: src/Admin/Metaboxes.php:122 -msgid "serial key" -msgid_plural "serial keys" +#: src/Admin/Metaboxes.php:126 +msgid "key available." +msgid_plural "keys available." msgstr[0] "" msgstr[1] "" -#: src/Admin/Metaboxes.php:125 -msgid "" -"Want serial keys to be generated automatically and auto assign with order " -"and many more?" +#: src/Admin/Metaboxes.php:134 +msgid "Want to sell keys for variable products?" msgstr "" -#: src/Admin/Metaboxes.php:144 +#: src/Admin/Metaboxes.php:155 msgid "" "The free version of Serial Numbers for WooCommerce does not support product " "variation." msgstr "" -#: src/Admin/Metaboxes.php:214 +#: src/Admin/Metaboxes.php:230 msgid "Order missing serial numbers for this item." msgstr "" @@ -619,9 +610,8 @@ msgstr "" #: src/Admin/Notices.php:63 #. translators: %1$s: link to the plugin page, %2$s: link to the plugin page msgid "" -"New! Send Serial Keys via SMS with Twilio. Upgrade to %6$s to unlock the " -"full potential of %5$s and avail a %1$s discount by using the promo code " -"%2$s %3$s Upgrade Now %4$s." +"Upgrade to %6$s to unlock the full potential of %5$s and avail a %1$s " +"discount by using the promo code %2$s. %3$s Upgrade Now%4$s." msgstr "" #: src/Admin/Orders.php:46 src/Admin/Orders.php:125 @@ -661,7 +651,8 @@ msgstr "" msgid "Expire date" msgstr "" -#: src/Admin/Orders.php:200 src/Admin/Views/html-edit-key.php:69 +#: src/Admin/Orders.php:200 src/Admin/views/html-add-key.php:65 +#: src/Admin/views/html-edit-key.php:67 msgid "Activation limit" msgstr "" @@ -683,7 +674,7 @@ msgid "General Settings" msgstr "" #: src/Admin/Settings.php:48 -msgid "These options determine the behavior and operation of the serial keys." +msgid "These options determine the behavior and operation of the plugin." msgstr "" #: src/Admin/Settings.php:52 @@ -695,39 +686,39 @@ msgid "Automatically completes orders after successful payments." msgstr "" #: src/Admin/Settings.php:59 -msgid "Reuse serial key" +msgid "Reuse keys" msgstr "" #: src/Admin/Settings.php:61 -msgid "Recover failed, refunded serial keys for selling again." +msgid "Recover failed, refunded keys for selling again." msgstr "" #: src/Admin/Settings.php:62 msgid "" -"If you enable this option, the serial keys will be available for selling " -"again if the order is refunded or failed." +"If you enable this option, the keys will be available for selling again if " +"the order is refunded or failed." msgstr "" #: src/Admin/Settings.php:68 -msgid "Revoke serial keys" +msgid "Revoke keys" msgstr "" #: src/Admin/Settings.php:70 -msgid "Revoke serial keys when the order status changes to cancelled or refunded." +msgid "Revoke keys when the order status changes to cancelled or refunded." msgstr "" #: src/Admin/Settings.php:71 msgid "" -"If you enable this option, the serial keys will be revoked when the order " -"status changes to cancelled or refunded." +"If you enable this option, the keys will be revoked when the order status " +"changes to cancelled or refunded." msgstr "" #: src/Admin/Settings.php:76 -msgid "Hide serial key" +msgid "Hide keys" msgstr "" #: src/Admin/Settings.php:78 -msgid "Serial keys will be masked in the list table." +msgid "Keys will be masked in the list table." msgstr "" #: src/Admin/Settings.php:83 @@ -749,7 +740,7 @@ msgid "Stock Notification" msgstr "" #: src/Admin/Settings.php:97 -msgid "These options determine the operation of the serial key stock notification." +msgid "These options determine the operation of the key's stock notification." msgstr "" #: src/Admin/Settings.php:101 @@ -757,7 +748,7 @@ msgid "Stock notification email" msgstr "" #: src/Admin/Settings.php:103 -msgid "Sends notification emails when product stock is low." +msgid "Sends notification emails when key stock is low." msgstr "" #: src/Admin/Settings.php:109 @@ -766,8 +757,8 @@ msgstr "" #: src/Admin/Settings.php:111 msgid "" -"An email notification will be sent when the stock falls below the specified " -"number." +"An email notification will be sent when the key stock falls below the " +"specified number." msgstr "" #: src/Admin/Settings.php:116 @@ -779,44 +770,42 @@ msgid "The email address which will be used to send email notifications." msgstr "" #: src/Admin/Settings.php:152 -msgid "Create and assign license keys for WooCommerce variable products." +msgid "Create and assign keys for WooCommerce variable products." msgstr "" #: src/Admin/Settings.php:153 -msgid "Generate bulk license keys with your custom key generator rule." +msgid "Generate bulk keys with your custom key generator rule." msgstr "" -#: src/Admin/Settings.php:154 +#: src/Admin/Settings.php:154 src/Admin/views/html-add-key.php:172 msgid "Random & sequential key order for the generator rules." msgstr "" #: src/Admin/Settings.php:155 -msgid "Automatic license key generator to auto-create & assign keys with orders." +msgid "Automatic key generator to auto-create & assign keys with orders." msgstr "" -#: src/Admin/Settings.php:156 +#: src/Admin/Settings.php:156 src/Admin/views/html-add-key.php:174 msgid "License key management option from the order page with required actions." msgstr "" #: src/Admin/Settings.php:157 -msgid "Support for bulk import/export of license keys from/to CSV." +msgid "Support for bulk import/export of keys from/to CSV." msgstr "" #: src/Admin/Settings.php:158 -msgid "Send Serial Keys via SMS with Twilio." +msgid "Send keys via SMS with Twilio." msgstr "" #: src/Admin/Settings.php:159 -msgid "" -"Option to sell license keys even if there are no available keys in the " -"stock." +msgid "Option to sell keys even if there are no available keys in the stock." msgstr "" -#: src/Admin/Settings.php:160 +#: src/Admin/Settings.php:160 src/Admin/views/html-add-key.php:178 msgid "Custom deliverable quantity to deliver multiple keys with a single product." msgstr "" -#: src/Admin/Settings.php:161 +#: src/Admin/Settings.php:161 src/Admin/views/html-add-key.php:179 msgid "" "Manual delivery option to manually deliver license keys instead of " "automatic." @@ -824,406 +813,528 @@ msgstr "" #: src/Admin/Settings.php:162 msgid "" -"Email Template to easily and quickly customize the order confirmation & low " +"Email template to easily and quickly customize the order confirmation & low " "stock alert email." msgstr "" -#: src/Admin/Settings.php:163 +#: src/Admin/Settings.php:163 src/Admin/views/html-add-key.php:181 msgid "Many more ..." msgstr "" -#: src/Admin/Settings.php:167 +#: src/Admin/Settings.php:167 src/Admin/views/html-add-key.php:185 msgid "Want More?" msgstr "" -#: src/Admin/Settings.php:168 +#: src/Admin/Settings.php:168 src/Admin/views/html-add-key.php:186 msgid "" "This plugin offers a premium version which comes with the following " "features:" msgstr "" -#: src/Admin/Settings.php:174 +#: src/Admin/Settings.php:174 src/Admin/views/html-add-key.php:192 msgid "Upgrade to PRO" msgstr "" -#: src/Admin/Views/html-api-actions.php:21 +#: src/Admin/views/html-add-key.php:15 +msgid "Add Serial Key" +msgstr "" + +#: src/Admin/views/html-add-key.php:17 src/Admin/views/html-edit-key.php:22 +msgid "Go Back" +msgstr "" + +#: src/Admin/views/html-add-key.php:22 +msgid "" +"This section allows you to add a new key that can be sold to customers. " +"Additionally, you can choose to associate this key with either a new order " +"or an existing order." +msgstr "" + +#: src/Admin/views/html-add-key.php:38 src/Admin/views/html-add-key.php:39 +#: src/Admin/views/html-edit-key.php:40 +msgid "Select Product" +msgstr "" + +#: src/Admin/views/html-add-key.php:42 +msgid "" +"Choose the product to which this key is applicable. The key will be " +"associated with this product for sale." +msgstr "" + +#: src/Admin/views/html-add-key.php:50 src/Admin/views/html-edit-key.php:56 +msgid "Serial key" +msgstr "" + +#: src/Admin/views/html-add-key.php:57 +msgid "" +"Enter the unique serial key you want to sell. This key will be sent to the " +"customer after the order status is marked as complete. e.g. " +"4CE0460D0G-4CE0460D1G-4CE0460D2G" +msgstr "" + +#: src/Admin/views/html-add-key.php:68 +msgid "e.g. 5" +msgstr "" + +#: src/Admin/views/html-add-key.php:70 +msgid "" +"For software products, specify the maximum number of times the key can be " +"used to activate the software. If the product is not software, you can " +"leave this field blank." +msgstr "" + +#: src/Admin/views/html-add-key.php:78 +msgid "Valid for (days)" +msgstr "" + +#: src/Admin/views/html-add-key.php:82 +msgid "e.g. 365" +msgstr "" + +#: src/Admin/views/html-add-key.php:83 +msgid "" +"For software products, enter the number of days the key will be valid from " +"the purchase date. If the key should have a lifetime validity, leave this " +"field blank." +msgstr "" + +#: src/Admin/views/html-add-key.php:99 +msgid "" +"Set as available for selling: The key will be available for purchase by " +"customers." +msgstr "" + +#: src/Admin/views/html-add-key.php:105 +msgid "" +"Create a new corresponding order for this key: This option generates a new " +"order specifically for this key." +msgstr "" + +#: src/Admin/views/html-add-key.php:111 +msgid "" +"Associate this key with an existing order: If the customer has already made " +"a purchase and wants to associate this key with that order, select this " +"option." +msgstr "" + +#: src/Admin/views/html-add-key.php:125 src/Admin/views/html-add-key.php:126 +#: src/Admin/views/html-edit-key.php:106 +msgid "Select Order" +msgstr "" + +#: src/Admin/views/html-add-key.php:129 +msgid "" +"Select the order to which this key should be associated. The key will be " +"sent to the customer after the order status is marked as complete." +msgstr "" + +#: src/Admin/views/html-add-key.php:138 +msgid "Customer" +msgstr "" + +#: src/Admin/views/html-add-key.php:143 src/Admin/views/html-add-key.php:144 +msgid "Select Customer" +msgstr "" + +#: src/Admin/views/html-add-key.php:147 +msgid "" +"Select the customer to which this key should be associated. The key will be " +"sent to the customer after the order status is marked as complete." +msgstr "" + +#: src/Admin/views/html-add-key.php:158 +msgid "Add Key" +msgstr "" + +#: src/Admin/views/html-add-key.php:170 +msgid "Create and assign license keys for WooCommerce variable products." +msgstr "" + +#: src/Admin/views/html-add-key.php:171 +msgid "Generate bulk license keys with your custom key generator rule." +msgstr "" + +#: src/Admin/views/html-add-key.php:173 +msgid "Automatic license key generator to auto-create & assign keys with orders." +msgstr "" + +#: src/Admin/views/html-add-key.php:175 +msgid "Support for bulk import/export of license keys from/to CSV." +msgstr "" + +#: src/Admin/views/html-add-key.php:176 +msgid "Send Serial Keys via SMS with Twilio." +msgstr "" + +#: src/Admin/views/html-add-key.php:177 +msgid "" +"Option to sell license keys even if there are no available keys in the " +"stock." +msgstr "" + +#: src/Admin/views/html-add-key.php:180 +msgid "" +"Email Template to easily and quickly customize the order confirmation & low " +"stock alert email." +msgstr "" + +#: src/Admin/views/html-api-actions.php:21 msgid "API Actions" msgstr "" -#: src/Admin/Views/html-api-actions.php:26 +#: src/Admin/views/html-api-actions.php:26 msgid "" "You can use the API to perform actions on your website or on another " "website." msgstr "" -#: src/Admin/Views/html-api-actions.php:29 +#: src/Admin/views/html-api-actions.php:29 msgid "To perform an action, you need to send a POST request to the following URL:" msgstr "" -#: src/Admin/Views/html-api-actions.php:33 -#: src/Admin/Views/html-api-validation.php:46 +#: src/Admin/views/html-api-actions.php:33 +#: src/Admin/views/html-api-validation.php:46 msgid "The request must contain the following parameters:" msgstr "" -#: src/Admin/Views/html-api-actions.php:37 -#: src/Admin/Views/html-api-actions.php:104 -#: src/Admin/Views/html-api-validation.php:50 -#: src/Admin/Views/html-api-validation.php:105 +#: src/Admin/views/html-api-actions.php:37 +#: src/Admin/views/html-api-actions.php:104 +#: src/Admin/views/html-api-validation.php:50 +#: src/Admin/views/html-api-validation.php:105 msgid "The ID of the product for which the serial key is valid." msgstr "" -#: src/Admin/Views/html-api-actions.php:40 -#: src/Admin/Views/html-api-validation.php:53 +#: src/Admin/views/html-api-actions.php:40 +#: src/Admin/views/html-api-validation.php:53 msgid "The serial key to validate." msgstr "" -#: src/Admin/Views/html-api-actions.php:43 +#: src/Admin/views/html-api-actions.php:43 msgid "The request type. Must be set to \"activate\" or \"deactivate\"." msgstr "" -#: src/Admin/Views/html-api-actions.php:46 +#: src/Admin/views/html-api-actions.php:46 msgid "" "Instance is the base of activation and deactivation. It is a unique " "identifier for the installation. For example, you can use the domain name " "of the website." msgstr "" -#: src/Admin/Views/html-api-actions.php:49 +#: src/Admin/views/html-api-actions.php:49 msgid "" "Optional. The platform on which the serial key is used. For example, " "\"Windows\" or \"Mac\"." msgstr "" -#: src/Admin/Views/html-api-actions.php:52 -#: src/Admin/Views/html-api-validation.php:59 +#: src/Admin/views/html-api-actions.php:52 +#: src/Admin/views/html-api-validation.php:59 msgid "" "Using email is completely voluntary. The API will verify that the serial " "number is associated with the given email address." msgstr "" -#: src/Admin/Views/html-api-actions.php:57 -#: src/Admin/Views/html-api-validation.php:63 +#: src/Admin/views/html-api-actions.php:57 +#: src/Admin/views/html-api-validation.php:63 msgid "Example:" msgstr "" -#: src/Admin/Views/html-api-actions.php:75 -#: src/Admin/Views/html-api-validation.php:80 +#: src/Admin/views/html-api-actions.php:75 +#: src/Admin/views/html-api-validation.php:80 msgid "The API will return a JSON response with the following parameters:" msgstr "" -#: src/Admin/Views/html-api-actions.php:80 +#: src/Admin/views/html-api-actions.php:80 msgid "" "The response code. \"key_activated\" or \"key_deactivated\" if the request " "was successful. \"invalid_key\" or \"invalid_request\" if the request was " "not successful." msgstr "" -#: src/Admin/Views/html-api-actions.php:83 -#: src/Admin/Views/html-api-validation.php:87 +#: src/Admin/views/html-api-actions.php:83 +#: src/Admin/views/html-api-validation.php:87 msgid "" "The response message. If the serial key is valid, the message will be " "\"Serial key is valid\"." msgstr "" -#: src/Admin/Views/html-api-actions.php:86 +#: src/Admin/views/html-api-actions.php:86 msgid "Activated or deactivated when the request is successful." msgstr "" -#: src/Admin/Views/html-api-actions.php:89 -#: src/Admin/Views/html-api-validation.php:90 +#: src/Admin/views/html-api-actions.php:89 +#: src/Admin/views/html-api-validation.php:90 msgid "The activation limit for the serial key." msgstr "" -#: src/Admin/Views/html-api-actions.php:92 -#: src/Admin/Views/html-api-validation.php:93 +#: src/Admin/views/html-api-actions.php:92 +#: src/Admin/views/html-api-validation.php:93 msgid "The number of activations for the serial key." msgstr "" -#: src/Admin/Views/html-api-actions.php:95 -#: src/Admin/Views/html-api-validation.php:96 +#: src/Admin/views/html-api-actions.php:95 +#: src/Admin/views/html-api-validation.php:96 msgid "The number of activations left for the serial key." msgstr "" -#: src/Admin/Views/html-api-actions.php:98 -#: src/Admin/Views/html-api-validation.php:99 +#: src/Admin/views/html-api-actions.php:98 +#: src/Admin/views/html-api-validation.php:99 msgid "The expiration date for the serial key." msgstr "" -#: src/Admin/Views/html-api-actions.php:101 +#: src/Admin/views/html-api-actions.php:101 msgid "The expiration date for the serial key in Unix timestamp format." msgstr "" -#: src/Admin/Views/html-api-actions.php:107 -#: src/Admin/Views/html-api-validation.php:108 +#: src/Admin/views/html-api-actions.php:107 +#: src/Admin/views/html-api-validation.php:108 msgid "The name of the product for which the serial key is valid." msgstr "" -#: src/Admin/Views/html-api-actions.php:110 -#: src/Admin/Views/html-api-validation.php:111 +#: src/Admin/views/html-api-actions.php:110 +#: src/Admin/views/html-api-validation.php:111 msgid "The list of activations for the serial key." msgstr "" -#: src/Admin/Views/html-api-actions.php:113 +#: src/Admin/views/html-api-actions.php:113 msgid "You can use the form below to test the API activation/deactivation." msgstr "" -#: src/Admin/Views/html-api-actions.php:126 +#: src/Admin/views/html-api-actions.php:126 msgid "Select a product to activate/deactivate serial key for." msgstr "" -#: src/Admin/Views/html-api-actions.php:133 +#: src/Admin/views/html-api-actions.php:133 msgid "Please enter serial key to activate/deactivate" msgstr "" -#: src/Admin/Views/html-api-actions.php:135 +#: src/Admin/views/html-api-actions.php:135 msgid "Required field. Enter serial key to activate/deactivate." msgstr "" -#: src/Admin/Views/html-api-actions.php:143 +#: src/Admin/views/html-api-actions.php:143 msgid "Please enter a unique instance" msgstr "" -#: src/Admin/Views/html-api-actions.php:145 +#: src/Admin/views/html-api-actions.php:145 msgid "" "Required field. Instance is the unique identifier of the activation record. " "It is used to identify the activation when activating/deactivating serial " "key." msgstr "" -#: src/Admin/Views/html-api-actions.php:154 +#: src/Admin/views/html-api-actions.php:154 msgid "Please enter a platform. e.g. Windows" msgstr "" -#: src/Admin/Views/html-api-actions.php:156 +#: src/Admin/views/html-api-actions.php:156 msgid "" "Optional field. Platform is the extra information of the activation record. " "You can use it to identify the platform of the activation." msgstr "" -#: src/Admin/Views/html-api-actions.php:162 -#: src/Admin/Views/html-api-validation.php:144 -#: src/Admin/Views/html-edit-key.php:156 src/Deprecated/Functions.php:361 -#: src/Frontend/Shortcodes.php:43 src/Frontend/Shortcodes.php:139 +#: src/Admin/views/html-api-actions.php:162 +#: src/Admin/views/html-api-validation.php:144 +#: src/Admin/views/html-edit-key.php:154 src/Deprecated/Functions.php:360 +#: src/Frontend/Shortcodes.php:43 src/Frontend/Shortcodes.php:140 msgid "Email" msgstr "" -#: src/Admin/Views/html-api-actions.php:164 -#: src/Admin/Views/html-api-validation.php:146 +#: src/Admin/views/html-api-actions.php:164 +#: src/Admin/views/html-api-validation.php:146 msgid "Please enter a valid email address" msgstr "" -#: src/Admin/Views/html-api-actions.php:166 +#: src/Admin/views/html-api-actions.php:166 msgid "" "Optional field when duplicate key is off. If email is provided, only serial " "key that are assigned to the email will be activated/deactivated otherwise " "ignored." msgstr "" -#: src/Admin/Views/html-api-actions.php:172 src/Frontend/Shortcodes.php:145 +#: src/Admin/views/html-api-actions.php:172 src/Frontend/Shortcodes.php:146 msgid "Action" msgstr "" -#: src/Admin/Views/html-api-actions.php:175 src/Frontend/Shortcodes.php:152 +#: src/Admin/views/html-api-actions.php:175 src/Frontend/Shortcodes.php:153 msgid "Activate" msgstr "" -#: src/Admin/Views/html-api-actions.php:176 src/Frontend/Shortcodes.php:153 +#: src/Admin/views/html-api-actions.php:176 src/Frontend/Shortcodes.php:154 msgid "Deactivate" msgstr "" -#: src/Admin/Views/html-api-actions.php:179 +#: src/Admin/views/html-api-actions.php:179 msgid "Select an action to perform on the serial key." msgstr "" -#: src/Admin/Views/html-api-actions.php:185 -#: src/Admin/Views/html-api-validation.php:153 +#: src/Admin/views/html-api-actions.php:185 +#: src/Admin/views/html-api-validation.php:153 msgid "API response" msgstr "" -#: src/Admin/Views/html-api-actions.php:195 src/Frontend/Shortcodes.php:146 -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:284 +#: src/Admin/views/html-api-actions.php:195 src/Frontend/Shortcodes.php:147 msgid "Submit" msgstr "" -#: src/Admin/Views/html-api-validation.php:20 +#: src/Admin/views/html-api-validation.php:20 msgid "API Validation" msgstr "" -#: src/Admin/Views/html-api-validation.php:30 +#: src/Admin/views/html-api-validation.php:30 #. translators: %s: link to the pro version msgid "" "You are using the free version of Serial Numbers for WooCommerce. Upgrade to Pro to get more features." msgstr "" -#: src/Admin/Views/html-api-validation.php:39 +#: src/Admin/views/html-api-validation.php:39 msgid "" "You can use the API to validate serial keys on your website or on another " "website." msgstr "" -#: src/Admin/Views/html-api-validation.php:42 +#: src/Admin/views/html-api-validation.php:42 msgid "" "To validate a serial key, you need to send a POST request to the following " "URL:" msgstr "" -#: src/Admin/Views/html-api-validation.php:56 +#: src/Admin/views/html-api-validation.php:56 msgid "The request type. Must be set to \"validate\"." msgstr "" -#: src/Admin/Views/html-api-validation.php:84 +#: src/Admin/views/html-api-validation.php:84 msgid "" "The response code. If the serial key is valid, the code will be " "\"key_valid\"." msgstr "" -#: src/Admin/Views/html-api-validation.php:102 +#: src/Admin/views/html-api-validation.php:102 msgid "The status of the serial key." msgstr "" -#: src/Admin/Views/html-api-validation.php:115 +#: src/Admin/views/html-api-validation.php:115 msgid "You can test the API using the form below." msgstr "" -#: src/Admin/Views/html-api-validation.php:129 +#: src/Admin/views/html-api-validation.php:129 msgid "Select a product to validate serial key for." msgstr "" -#: src/Admin/Views/html-api-validation.php:136 +#: src/Admin/views/html-api-validation.php:136 msgid "Please enter serial key to validate" msgstr "" -#: src/Admin/Views/html-api-validation.php:138 +#: src/Admin/views/html-api-validation.php:138 msgid "Required field. Enter serial key to validate." msgstr "" -#: src/Admin/Views/html-api-validation.php:148 +#: src/Admin/views/html-api-validation.php:148 msgid "" "Optional field. If email is provided, only serial key that are assigned to " "the email will be validated otherwise ignored." msgstr "" -#: src/Admin/Views/html-api-validation.php:164 src/Frontend/Shortcodes.php:45 +#: src/Admin/views/html-api-validation.php:164 src/Frontend/Shortcodes.php:45 msgid "Validate" msgstr "" -#: src/Admin/Views/html-edit-key.php:16 +#: src/Admin/views/html-edit-key.php:16 msgid "Edit Serial Key" msgstr "" -#: src/Admin/Views/html-edit-key.php:18 +#: src/Admin/views/html-edit-key.php:18 msgid "Add Another" msgstr "" -#: src/Admin/Views/html-edit-key.php:21 -msgid "Add New Serial Key" -msgstr "" - -#: src/Admin/Views/html-edit-key.php:23 -msgid "Go Back" -msgstr "" - -#: src/Admin/Views/html-edit-key.php:33 +#: src/Admin/views/html-edit-key.php:31 msgid "Key Details" msgstr "" -#: src/Admin/Views/html-edit-key.php:42 -msgid "Select Product" -msgstr "" - -#: src/Admin/Views/html-edit-key.php:52 +#: src/Admin/views/html-edit-key.php:50 msgid "Select the product for which this key is applicable." msgstr "" -#: src/Admin/Views/html-edit-key.php:58 -msgid "Serial key" -msgstr "" - -#: src/Admin/Views/html-edit-key.php:63 +#: src/Admin/views/html-edit-key.php:61 msgid "" "Enter your serial key, also supports multiline. For example: " "4CE0460D0G-4CE0460D1G-4CE0460D2G" msgstr "" -#: src/Admin/Views/html-edit-key.php:73 +#: src/Admin/views/html-edit-key.php:71 msgid "" "Maximum number of times the key can be used to activate the software. If " "the product is not software, keep it blank." msgstr "" -#: src/Admin/Views/html-edit-key.php:79 +#: src/Admin/views/html-edit-key.php:77 msgid "Valid for" msgstr "" -#: src/Admin/Views/html-edit-key.php:84 +#: src/Admin/views/html-edit-key.php:82 msgid "Days" msgstr "" -#: src/Admin/Views/html-edit-key.php:87 +#: src/Admin/views/html-edit-key.php:85 msgid "" "Number of days the key will be valid from the purchase date. Leave it blank " "for lifetime validity." msgstr "" -#: src/Admin/Views/html-edit-key.php:101 +#: src/Admin/views/html-edit-key.php:99 msgid "Serial key status auto-updates with order status. Avoid manual changes." msgstr "" -#: src/Admin/Views/html-edit-key.php:106 +#: src/Admin/views/html-edit-key.php:104 msgid "Order ID" msgstr "" -#: src/Admin/Views/html-edit-key.php:108 -msgid "Select Order" -msgstr "" - -#: src/Admin/Views/html-edit-key.php:117 +#: src/Admin/views/html-edit-key.php:115 msgid "The order to which the serial number will be assigned." msgstr "" -#: src/Admin/Views/html-edit-key.php:128 +#: src/Admin/views/html-edit-key.php:126 msgid "Actions" msgstr "" -#: src/Admin/Views/html-edit-key.php:134 +#: src/Admin/views/html-edit-key.php:132 msgid "Save Key" msgstr "" -#: src/Admin/Views/html-edit-key.php:141 +#: src/Admin/views/html-edit-key.php:139 msgid "Customer details" msgstr "" -#: src/Admin/Views/html-edit-key.php:148 +#: src/Admin/views/html-edit-key.php:146 msgid "Name" msgstr "" -#: src/Admin/Views/html-edit-key.php:164 +#: src/Admin/views/html-edit-key.php:162 msgid "Address" msgstr "" -#: src/Admin/Views/html-edit-key.php:173 +#: src/Admin/views/html-edit-key.php:171 msgid "Phone" msgstr "" -#: src/Admin/Views/html-edit-key.php:183 +#: src/Admin/views/html-edit-key.php:181 msgid "View Order" msgstr "" -#: src/Admin/Views/html-list-activations.php:26 -#: src/Admin/Views/html-list-keys.php:43 +#: src/Admin/views/html-list-activations.php:26 +#: src/Admin/views/html-list-keys.php:43 msgid "Search key" msgstr "" -#: src/Admin/Views/html-list-keys.php:21 +#: src/Admin/views/html-list-keys.php:21 msgid "Add New" msgstr "" -#: src/Admin/Views/html-list-keys.php:33 +#: src/Admin/views/html-list-keys.php:33 msgid "Generate" msgstr "" -#: src/Admin/Views/html-list-stock.php:16 +#: src/Admin/views/html-list-stock.php:16 msgid "Search" msgstr "" @@ -1236,20 +1347,20 @@ msgstr "" msgid "Serial Numbers stock running low" msgstr "" -#: src/Deprecated/Functions.php:155 +#: src/Deprecated/Functions.php:154 msgid "Serial number not found." msgstr "" -#: src/Deprecated/Functions.php:360 +#: src/Deprecated/Functions.php:359 msgid "Serial Number" msgstr "" -#: src/Deprecated/Functions.php:362 src/Functions/Template.php:52 -#: src/functions.php:1008 +#: src/Deprecated/Functions.php:361 src/Functions/Template.php:52 +#: src/functions.php:1019 msgid "Activation Limit" msgstr "" -#: src/Deprecated/Functions.php:363 +#: src/Deprecated/Functions.php:362 msgid "Expires" msgstr "" @@ -1261,16 +1372,16 @@ msgstr "" msgid "Serial Key Validation" msgstr "" -#: src/Frontend/Shortcodes.php:41 src/Frontend/Shortcodes.php:137 +#: src/Frontend/Shortcodes.php:41 src/Frontend/Shortcodes.php:138 msgid "Serial Key" msgstr "" -#: src/Frontend/Shortcodes.php:42 src/Frontend/Shortcodes.php:138 +#: src/Frontend/Shortcodes.php:42 src/Frontend/Shortcodes.php:139 msgid "Enter your serial key" msgstr "" #: src/Frontend/Shortcodes.php:44 src/Frontend/Shortcodes.php:105 -#: src/Frontend/Shortcodes.php:140 src/Frontend/Shortcodes.php:216 +#: src/Frontend/Shortcodes.php:141 src/Frontend/Shortcodes.php:217 msgid "Enter your email" msgstr "" @@ -1278,40 +1389,40 @@ msgstr "" msgid "No products found." msgstr "" -#: src/Frontend/Shortcodes.php:90 src/Frontend/Shortcodes.php:200 +#: src/Frontend/Shortcodes.php:90 src/Frontend/Shortcodes.php:201 msgid "Select a product" msgstr "" -#: src/Frontend/Shortcodes.php:135 +#: src/Frontend/Shortcodes.php:136 msgid "Activate/Deactivate Serial Key" msgstr "" -#: src/Frontend/Shortcodes.php:142 +#: src/Frontend/Shortcodes.php:143 msgid "Enter your instance" msgstr "" -#: src/Frontend/Shortcodes.php:144 +#: src/Frontend/Shortcodes.php:145 msgid "Enter platform" msgstr "" -#: src/Frontend/Shortcodes.php:186 +#: src/Frontend/Shortcodes.php:187 msgid "Could not find any products with serial numbers enabled." msgstr "" -#: src/Functions/Template.php:47 src/functions.php:1003 +#: src/Functions/Template.php:47 src/functions.php:1014 msgid "Activation Email" msgstr "" #: src/Functions/Template.php:53 src/Functions/Template.php:58 -#: src/functions.php:1009 src/functions.php:1014 +#: src/functions.php:1020 src/functions.php:1025 msgid "None" msgstr "" -#: src/Functions/Template.php:57 src/functions.php:1013 +#: src/Functions/Template.php:57 src/functions.php:1024 msgid "Activation Count" msgstr "" -#: src/Functions/Template.php:62 src/functions.php:1018 +#: src/Functions/Template.php:62 src/functions.php:1029 msgid "Expire Date" msgstr "" @@ -1357,6 +1468,7 @@ msgid "Order id is invalid." msgstr "" #: src/Orders.php:67 +#. translators: %1$s: product title, %2$s: stock quantity. msgid "" "Sorry, there aren’t enough Serial Keys for %1$s. Please remove this item or " "lower the quantity. For now, we have %2$s Serial Keys for this product." @@ -1366,12 +1478,12 @@ msgstr "" msgid "Order automatically completed by the Serial Numbers for WooCommerce." msgstr "" -#: src/Plugin.php:69 +#: src/Plugin.php:63 #. translators: 1: plugin name 2: WooCommerce msgid "%1$s requires %2$s to be installed and active." msgstr "" -#: src/Plugin.php:71 +#: src/Plugin.php:65 msgid "WooCommerce" msgstr "" @@ -1379,253 +1491,32 @@ msgstr "" msgid "Manually added" msgstr "" -#: src/functions.php:537 +#: src/functions.php:533 #. translators: 1: product title 2: source and 3: Quantity msgid "" "There is not enough serial numbers for the product %1$s from selected " "source %2$s, needed total %3$d." msgstr "" -#: templates/email-stock-notification.php:12 +#: templates/email-stock-notification.php:14 msgid "Hi There," msgstr "" -#: templates/email-stock-notification.php:13 +#: templates/email-stock-notification.php:15 msgid "" "There are few products stock running low, please add serial numbers for " "these products" msgstr "" -#: templates/email-stock-notification.php:30 +#: templates/email-stock-notification.php:37 +#. translators: %s: plugin url. msgid "" "The email is sent by Serial Numbers for " "WooCommerce" msgstr "" -#: vendor/lucatume/wp-browser/src/data/plugins/internationalized-plugin.php:11 -msgid "This is a dummy plugin" -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/parsers.php:42 -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/parsers.php:72 -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/parsers.php:80 -msgid "There was an error when reading this WXR file" -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/parsers.php:43 -msgid "" -"Details are shown above. The importer will now try again with a different " -"parser..." -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/parsers.php:84 -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/parsers.php:89 -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/parsers.php:306 -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/parsers.php:495 -msgid "This does not appear to be a WXR file, missing/invalid WXR version number" -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:132 -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:141 -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:192 -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:196 -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:205 -msgid "Sorry, there has been an error." -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:133 -msgid "The file does not exist, please try again." -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:176 -msgid "All done." -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:176 -msgid "Have fun!" -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:177 -msgid "Remember to update the passwords and roles of imported users." -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:197 -msgid "" -"The export file could not be found at %s. It is likely that " -"this was caused by a permissions problem." -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:213 -msgid "" -"This WXR file (version %s) may not be supported by this version of the " -"importer. Please consider updating." -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:238 -msgid "" -"Failed to import author %s. Their posts will be attributed to the current " -"user." -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:264 -msgid "Assign Authors" -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:265 -msgid "" -"To make it easier for you to edit and save the imported content, you may " -"want to reassign the author of the imported item to an existing user of " -"this site. For example, you may want to import all the entries as " -"admins entries." -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:267 -msgid "" -"If a new user is created by WordPress, a new password will be randomly " -"generated and the new user’s role will be set as %s. Manually " -"changing the new user’s details will be necessary." -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:277 -msgid "Import Attachments" -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:280 -msgid "Download and import file attachments" -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:297 -msgid "Import author:" -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:308 -msgid "or create new user with login name:" -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:311 -msgid "as a new user:" -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:319 -msgid "assign posts to an existing user:" -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:321 -msgid "or assign posts to an existing user:" -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:322 -msgid "- Select -" -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:372 -msgid "" -"Failed to create new user for %s. Their posts will be attributed to the " -"current user." -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:424 -msgid "Failed to import category %s" -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:467 -msgid "Failed to import post tag %s" -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:516 -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:738 -msgid "Failed to import %s %s" -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:605 -msgid "Failed to import “%s”: Invalid post type %s" -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:642 -msgid "%s “%s” already exists." -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:704 -msgid "Failed to import %s “%s”" -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:869 -msgid "Menu item skipped due to missing menu slug" -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:876 -msgid "Menu item skipped due to invalid menu slug: %s" -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:939 -msgid "Fetching attachments is not enabled" -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:952 -msgid "Invalid file type" -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:996 -msgid "Remote server did not respond" -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:1002 -msgid "Remote server returned error response %1$d %2$s" -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:1009 -msgid "Remote file is incorrect size" -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:1014 -msgid "Zero size file downloaded" -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:1020 -msgid "Remote file is too large, limit is %s" -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:1119 -msgid "Import WordPress" -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:1126 -msgid "" -"A new version of this importer is available. Please update to version %s to " -"ensure compatibility with newer export files." -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:1141 -msgid "" -"Howdy! Upload your WordPress eXtended RSS (WXR) file and we’ll import " -"the posts, pages, comments, custom fields, categories, and tags into this " -"site." -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:1142 -msgid "Choose a WXR (.xml) file to upload, then click Upload file and import." -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/plugins/wordpress-importer/wordpress-importer.php:1216 -msgid "" -"Import posts, pages, comments, custom fields, categories, and " -"tags from a WordPress export file." -msgstr "" - -#: vendor/lucatume/wp-browser/src/data/themedir1/internationalized-theme/functions.php:7 -msgid "This is a dummy theme" -msgstr "" - -#: vendor/wp-cli/wp-cli/php/utils-wp.php:238 -msgid "Inactive Widgets" -msgstr "" - -#: vendor/wp-cli/wp-cli/php/utils-wp.php:241 -msgid "Drag widgets here to remove them from the sidebar but keep their settings." -msgstr "" - #. Plugin Name of the plugin/theme -msgid "Serial Numbers for WooCommerce" +msgid "WC Serial Numbers" msgstr "" #. Plugin URI of the plugin/theme @@ -1634,7 +1525,7 @@ msgstr "" #. Description of the plugin/theme msgid "" -"Sell and manage license keys/ serial numbers/ secrect keys easily within " +"Sell and manage license keys/ serial numbers/ secret keys easily within " "your WooCommerce store." msgstr "" diff --git a/lib/classes/wp-async-request.php b/lib/classes/wp-async-request.php deleted file mode 100644 index 9759ab09..00000000 --- a/lib/classes/wp-async-request.php +++ /dev/null @@ -1,202 +0,0 @@ -identifier = $this->prefix . '_' . $this->action; - - add_action( 'wp_ajax_' . $this->identifier, array( $this, 'maybe_handle' ) ); - add_action( 'wp_ajax_nopriv_' . $this->identifier, array( $this, 'maybe_handle' ) ); - } - - /** - * Set data used during the request. - * - * @param array $data Data. - * - * @return $this - */ - public function data( $data ) { - $this->data = $data; - - return $this; - } - - /** - * Dispatch the async request. - * - * @return array|WP_Error|false HTTP Response array, WP_Error on failure, or false if not attempted. - */ - public function dispatch() { - $url = add_query_arg( $this->get_query_args(), $this->get_query_url() ); - $args = $this->get_post_args(); - - return wp_remote_post( esc_url_raw( $url ), $args ); - } - - /** - * Get query args. - * - * @return array - */ - protected function get_query_args() { - if ( property_exists( $this, 'query_args' ) ) { - return $this->query_args; - } - - $args = array( - 'action' => $this->identifier, - 'nonce' => wp_create_nonce( $this->identifier ), - ); - - /** - * Filters the post arguments used during an async request. - * - * @param array $url - */ - return apply_filters( $this->identifier . '_query_args', $args ); - } - - /** - * Get query URL. - * - * @return string - */ - protected function get_query_url() { - if ( property_exists( $this, 'query_url' ) ) { - return $this->query_url; - } - - $url = admin_url( 'admin-ajax.php' ); - - /** - * Filters the post arguments used during an async request. - * - * @param string $url - */ - return apply_filters( $this->identifier . '_query_url', $url ); - } - - /** - * Get post args. - * - * @return array - */ - protected function get_post_args() { - if ( property_exists( $this, 'post_args' ) ) { - return $this->post_args; - } - - $args = array( - 'timeout' => 0.01, - 'blocking' => false, - 'body' => $this->data, - 'cookies' => $_COOKIE, // Passing cookies ensures request is performed as initiating user. - 'sslverify' => apply_filters( 'https_local_ssl_verify', false ), // Local requests, fine to pass false. - ); - - /** - * Filters the post arguments used during an async request. - * - * @param array $args - */ - return apply_filters( $this->identifier . '_post_args', $args ); - } - - /** - * Maybe handle a dispatched request. - * - * Check for correct nonce and pass to handler. - * - * @return void|mixed - */ - public function maybe_handle() { - // Don't lock up other requests while processing. - session_write_close(); - - check_ajax_referer( $this->identifier, 'nonce' ); - - $this->handle(); - - return $this->maybe_wp_die(); - } - - /** - * Should the process exit with wp_die? - * - * @param mixed $return What to return if filter says don't die, default is null. - * - * @return void|mixed - */ - protected function maybe_wp_die( $return = null ) { - /** - * Should wp_die be used? - * - * @return bool - */ - if ( apply_filters( $this->identifier . '_wp_die', true ) ) { - wp_die(); - } - - return $return; - } - - /** - * Handle a dispatched request. - * - * Override this method to perform any actions required - * during the async request. - */ - abstract protected function handle(); -} diff --git a/lib/classes/wp-background-process.php b/lib/classes/wp-background-process.php deleted file mode 100644 index fbc81fff..00000000 --- a/lib/classes/wp-background-process.php +++ /dev/null @@ -1,733 +0,0 @@ -cron_hook_identifier = $this->identifier . '_cron'; - $this->cron_interval_identifier = $this->identifier . '_cron_interval'; - - add_action( $this->cron_hook_identifier, array( $this, 'handle_cron_healthcheck' ) ); - add_filter( 'cron_schedules', array( $this, 'schedule_cron_healthcheck' ) ); - } - - /** - * Schedule the cron healthcheck and dispatch an async request to start processing the queue. - * - * @access public - * @return array|WP_Error|false HTTP Response array, WP_Error on failure, or false if not attempted. - */ - public function dispatch() { - if ( $this->is_processing() ) { - // Process already running. - return false; - } - - // Schedule the cron healthcheck. - $this->schedule_event(); - - // Perform remote post. - return parent::dispatch(); - } - - /** - * Push to the queue. - * - * Note, save must be called in order to persist queued items to a batch for processing. - * - * @param mixed $data Data. - * - * @return $this - */ - public function push_to_queue( $data ) { - $this->data[] = $data; - - return $this; - } - - /** - * Save the queued items for future processing. - * - * @return $this - */ - public function save() { - $key = $this->generate_key(); - - if ( ! empty( $this->data ) ) { - update_site_option( $key, $this->data ); - } - - // Clean out data so that new data isn't prepended with closed session's data. - $this->data = array(); - - return $this; - } - - /** - * Update a batch's queued items. - * - * @param string $key Key. - * @param array $data Data. - * - * @return $this - */ - public function update( $key, $data ) { - if ( ! empty( $data ) ) { - update_site_option( $key, $data ); - } - - return $this; - } - - /** - * Delete a batch of queued items. - * - * @param string $key Key. - * - * @return $this - */ - public function delete( $key ) { - delete_site_option( $key ); - - return $this; - } - - /** - * Delete entire job queue. - */ - public function delete_all() { - $batches = $this->get_batches(); - - foreach ( $batches as $batch ) { - $this->delete( $batch->key ); - } - - delete_site_option( $this->get_status_key() ); - - $this->cancelled(); - } - - /** - * Cancel job on next batch. - */ - public function cancel() { - update_site_option( $this->get_status_key(), self::STATUS_CANCELLED ); - - // Just in case the job was paused at the time. - $this->dispatch(); - } - - /** - * Has the process been cancelled? - * - * @return bool - */ - public function is_cancelled() { - $status = get_site_option( $this->get_status_key(), 0 ); - - if ( absint( $status ) === self::STATUS_CANCELLED ) { - return true; - } - - return false; - } - - /** - * Called when background process has been cancelled. - */ - protected function cancelled() { - do_action( $this->identifier . '_cancelled' ); - } - - /** - * Pause job on next batch. - */ - public function pause() { - update_site_option( $this->get_status_key(), self::STATUS_PAUSED ); - } - - /** - * Is the job paused? - * - * @return bool - */ - public function is_paused() { - $status = get_site_option( $this->get_status_key(), 0 ); - - if ( absint( $status ) === self::STATUS_PAUSED ) { - return true; - } - - return false; - } - - /** - * Called when background process has been paused. - */ - protected function paused() { - do_action( $this->identifier . '_paused' ); - } - - /** - * Resume job. - */ - public function resume() { - delete_site_option( $this->get_status_key() ); - - $this->schedule_event(); - $this->dispatch(); - $this->resumed(); - } - - /** - * Called when background process has been resumed. - */ - protected function resumed() { - do_action( $this->identifier . '_resumed' ); - } - - /** - * Is queued? - * - * @return bool - */ - public function is_queued() { - return ! $this->is_queue_empty(); - } - - /** - * Is the tool currently active, e.g. starting, working, paused or cleaning up? - * - * @return bool - */ - public function is_active() { - return $this->is_queued() || $this->is_processing() || $this->is_paused() || $this->is_cancelled(); - } - - /** - * Generate key for a batch. - * - * Generates a unique key based on microtime. Queue items are - * given a unique key so that they can be merged upon save. - * - * @param int $length Optional max length to trim key to, defaults to 64 characters. - * @param string $key Optional string to append to identifier before hash, defaults to "batch". - * - * @return string - */ - protected function generate_key( $length = 64, $key = 'batch' ) { - $unique = md5( microtime() . wp_rand() ); - $prepend = $this->identifier . '_' . $key . '_'; - - return substr( $prepend . $unique, 0, $length ); - } - - /** - * Get the status key. - * - * @return string - */ - protected function get_status_key() { - return $this->identifier . '_status'; - } - - /** - * Maybe process a batch of queued items. - * - * Checks whether data exists within the queue and that - * the process is not already running. - */ - public function maybe_handle() { - // Don't lock up other requests while processing. - session_write_close(); - - if ( $this->is_processing() ) { - // Background process already running. - return $this->maybe_wp_die(); - } - - if ( $this->is_cancelled() ) { - $this->clear_scheduled_event(); - $this->delete_all(); - - return $this->maybe_wp_die(); - } - - if ( $this->is_paused() ) { - $this->clear_scheduled_event(); - $this->paused(); - - return $this->maybe_wp_die(); - } - - if ( $this->is_queue_empty() ) { - // No data to process. - return $this->maybe_wp_die(); - } - - check_ajax_referer( $this->identifier, 'nonce' ); - - $this->handle(); - - return $this->maybe_wp_die(); - } - - /** - * Is queue empty? - * - * @return bool - */ - protected function is_queue_empty() { - return empty( $this->get_batch() ); - } - - /** - * Is process running? - * - * Check whether the current process is already running - * in a background process. - * - * @return bool - * - * @deprecated 1.1.0 Superseded. - * @see is_processing() - */ - protected function is_process_running() { - return $this->is_processing(); - } - - /** - * Is the background process currently running? - * - * @return bool - */ - public function is_processing() { - if ( get_site_transient( $this->identifier . '_process_lock' ) ) { - // Process already running. - return true; - } - - return false; - } - - /** - * Lock process. - * - * Lock the process so that multiple instances can't run simultaneously. - * Override if applicable, but the duration should be greater than that - * defined in the time_exceeded() method. - */ - protected function lock_process() { - $this->start_time = time(); // Set start time of current process. - - $lock_duration = ( property_exists( $this, 'queue_lock_time' ) ) ? $this->queue_lock_time : 60; // 1 minute - $lock_duration = apply_filters( $this->identifier . '_queue_lock_time', $lock_duration ); - - set_site_transient( $this->identifier . '_process_lock', microtime(), $lock_duration ); - } - - /** - * Unlock process. - * - * Unlock the process so that other instances can spawn. - * - * @return $this - */ - protected function unlock_process() { - delete_site_transient( $this->identifier . '_process_lock' ); - - return $this; - } - - /** - * Get batch. - * - * @return stdClass Return the first batch of queued items. - */ - protected function get_batch() { - return array_reduce( - $this->get_batches( 1 ), - function ( $carry, $batch ) { - return $batch; - }, - array() - ); - } - - /** - * Get batches. - * - * @param int $limit Number of batches to return, defaults to all. - * - * @return array of stdClass - */ - public function get_batches( $limit = 0 ) { - global $wpdb; - - if ( empty( $limit ) || ! is_int( $limit ) ) { - $limit = 0; - } - - $table = $wpdb->options; - $column = 'option_name'; - $key_column = 'option_id'; - $value_column = 'option_value'; - - if ( is_multisite() ) { - $table = $wpdb->sitemeta; - $column = 'meta_key'; - $key_column = 'meta_id'; - $value_column = 'meta_value'; - } - - $key = $wpdb->esc_like( $this->identifier . '_batch_' ) . '%'; - - $sql = ' - SELECT * - FROM ' . $table . ' - WHERE ' . $column . ' LIKE %s - ORDER BY ' . $key_column . ' ASC - '; - - $args = array( $key ); - - if ( ! empty( $limit ) ) { - $sql .= ' LIMIT %d'; - - $args[] = $limit; - } - - $items = $wpdb->get_results( $wpdb->prepare( $sql, $args ) ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared - - $batches = array(); - - if ( ! empty( $items ) ) { - $batches = array_map( - function ( $item ) use ( $column, $value_column ) { - $batch = new stdClass(); - $batch->key = $item->{$column}; - $batch->data = maybe_unserialize( $item->{$value_column} ); - - return $batch; - }, - $items - ); - } - - return $batches; - } - - /** - * Handle a dispatched request. - * - * Pass each queue item to the task handler, while remaining - * within server memory and time limit constraints. - */ - protected function handle() { - $this->lock_process(); - - /** - * Number of seconds to sleep between batches. Defaults to 0 seconds, minimum 0. - * - * @param int $seconds - */ - $throttle_seconds = max( - 0, - apply_filters( - $this->identifier . '_seconds_between_batches', - apply_filters( - $this->prefix . '_seconds_between_batches', - 0 - ) - ) - ); - - do { - $batch = $this->get_batch(); - - foreach ( $batch->data as $key => $value ) { - $task = $this->task( $value ); - - if ( false !== $task ) { - $batch->data[ $key ] = $task; - } else { - unset( $batch->data[ $key ] ); - } - - // Keep the batch up to date while processing it. - if ( ! empty( $batch->data ) ) { - $this->update( $batch->key, $batch->data ); - } - - // Let the server breathe a little. - sleep( $throttle_seconds ); - - // Batch limits reached, or pause or cancel request. - if ( $this->time_exceeded() || $this->memory_exceeded() || $this->is_paused() || $this->is_cancelled() ) { - break; - } - } - - // Delete current batch if fully processed. - if ( empty( $batch->data ) ) { - $this->delete( $batch->key ); - } - } while ( ! $this->time_exceeded() && ! $this->memory_exceeded() && ! $this->is_queue_empty() && ! $this->is_paused() && ! $this->is_cancelled() ); - - $this->unlock_process(); - - // Start next batch or complete process. - if ( ! $this->is_queue_empty() ) { - $this->dispatch(); - } else { - $this->complete(); - } - - return $this->maybe_wp_die(); - } - - /** - * Memory exceeded? - * - * Ensures the batch process never exceeds 90% - * of the maximum WordPress memory. - * - * @return bool - */ - protected function memory_exceeded() { - $memory_limit = $this->get_memory_limit() * 0.9; // 90% of max memory - $current_memory = memory_get_usage( true ); - $return = false; - - if ( $current_memory >= $memory_limit ) { - $return = true; - } - - return apply_filters( $this->identifier . '_memory_exceeded', $return ); - } - - /** - * Get memory limit in bytes. - * - * @return int - */ - protected function get_memory_limit() { - if ( function_exists( 'ini_get' ) ) { - $memory_limit = ini_get( 'memory_limit' ); - } else { - // Sensible default. - $memory_limit = '128M'; - } - - if ( ! $memory_limit || -1 === intval( $memory_limit ) ) { - // Unlimited, set to 32GB. - $memory_limit = '32000M'; - } - - return wp_convert_hr_to_bytes( $memory_limit ); - } - - /** - * Time limit exceeded? - * - * Ensures the batch never exceeds a sensible time limit. - * A timeout limit of 30s is common on shared hosting. - * - * @return bool - */ - protected function time_exceeded() { - $finish = $this->start_time + apply_filters( $this->identifier . '_default_time_limit', 20 ); // 20 seconds - $return = false; - - if ( time() >= $finish ) { - $return = true; - } - - return apply_filters( $this->identifier . '_time_exceeded', $return ); - } - - /** - * Complete processing. - * - * Override if applicable, but ensure that the below actions are - * performed, or, call parent::complete(). - */ - protected function complete() { - delete_site_option( $this->get_status_key() ); - - // Remove the cron healthcheck job from the cron schedule. - $this->clear_scheduled_event(); - - $this->completed(); - } - - /** - * Called when background process has completed. - */ - protected function completed() { - do_action( $this->identifier . '_completed' ); - } - - /** - * Schedule the cron healthcheck job. - * - * @access public - * - * @param mixed $schedules Schedules. - * - * @return mixed - */ - public function schedule_cron_healthcheck( $schedules ) { - $interval = apply_filters( $this->cron_interval_identifier, 5 ); - - if ( property_exists( $this, 'cron_interval' ) ) { - $interval = apply_filters( $this->cron_interval_identifier, $this->cron_interval ); - } - - if ( 1 === $interval ) { - $display = __( 'Every Minute', 'wc-serial-numbers' ); - } else { - $display = sprintf( __( 'Every %d Minutes', 'wc-serial-numbers' ), $interval ); - } - - // Adds an "Every NNN Minute(s)" schedule to the existing cron schedules. - $schedules[ $this->cron_interval_identifier ] = array( - 'interval' => MINUTE_IN_SECONDS * $interval, - 'display' => $display, - ); - - return $schedules; - } - - /** - * Handle cron healthcheck event. - * - * Restart the background process if not already running - * and data exists in the queue. - */ - public function handle_cron_healthcheck() { - if ( $this->is_processing() ) { - // Background process already running. - exit; - } - - if ( $this->is_queue_empty() ) { - // No data to process. - $this->clear_scheduled_event(); - exit; - } - - $this->dispatch(); - } - - /** - * Schedule the cron healthcheck event. - */ - protected function schedule_event() { - if ( ! wp_next_scheduled( $this->cron_hook_identifier ) ) { - wp_schedule_event( time(), $this->cron_interval_identifier, $this->cron_hook_identifier ); - } - } - - /** - * Clear scheduled cron healthcheck event. - */ - protected function clear_scheduled_event() { - $timestamp = wp_next_scheduled( $this->cron_hook_identifier ); - - if ( $timestamp ) { - wp_unschedule_event( $timestamp, $this->cron_hook_identifier ); - } - } - - /** - * Cancel the background process. - * - * Stop processing queue items, clear cron job and delete batch. - * - * @deprecated 1.1.0 Superseded. - * @see cancel() - */ - public function cancel_process() { - $this->cancel(); - } - - /** - * Perform task with queued item. - * - * Override this method to perform any actions required on each - * queue item. Return the modified item for further processing - * in the next pass through. Or, return false to remove the - * item from the queue. - * - * @param mixed $item Queue item to iterate over. - * - * @return mixed - */ - abstract protected function task( $item ); -} diff --git a/package-lock.json b/package-lock.json index bd033de7..0c4b0e30 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "wc-serial-numbers", - "version": "1.5.4", + "version": "1.6.5", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "wc-serial-numbers", - "version": "1.5.4", + "version": "1.6.5", "license": "GPL-3.0+", "devDependencies": { "@lodder/time-grunt": "^4.0.0", diff --git a/package.json b/package.json index b3abcdd0..37cf2957 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "wc-serial-numbers", "title": "Serial Numbers for WooCommerce", - "version": "1.5.7", + "version": "1.6.5", "description": "The best WooCommerce extension to sell license & serial keys, gift cards and other secret numbers!", "homepage": "https://pluginever.com/plugins/wc-serial-numbers/", "license": "GPL-3.0+", diff --git a/src/API.php b/src/API.php index dc082efd..391d36cd 100644 --- a/src/API.php +++ b/src/API.php @@ -21,6 +21,8 @@ class API { * @since 1.0.0 */ public function __construct() { + // add query vars. + add_filter( 'query_vars', array( __CLASS__, 'add_query_vars' ), 0 ); add_action( 'woocommerce_api_serial-numbers-api', array( __CLASS__, 'process_request' ) ); add_action( 'wc_serial_numbers_api_action_check', array( __CLASS__, 'validate_key' ) ); add_action( 'wc_serial_numbers_api_action_validate', array( __CLASS__, 'validate_key' ) ); @@ -29,16 +31,36 @@ public function __construct() { add_action( 'wc_serial_numbers_api_action_version_check', array( __CLASS__, 'check_version' ) ); } + /** + * Add query vars. + * + * @param array $vars Query vars. + * + * @since 1.0.0 + * + * @return array + */ + public static function add_query_vars( $vars ) { + $vars[] = 'product_id'; + $vars[] = 'serial_key'; + $vars[] = 'request'; + $vars[] = 'email'; + $vars[] = 'instance'; + $vars[] = 'platform'; + + return $vars; + } + /** * Process request. * * @since 1.0.0 */ public static function process_request() { - $product_id = isset( $_REQUEST['product_id'] ) ? absint( $_REQUEST['product_id'] ) : 0; - $key = isset( $_REQUEST['serial_key'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['serial_key'] ) ) : ''; - $action = isset( $_REQUEST['request'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['request'] ) ) : ''; - $email = isset( $_REQUEST['email'] ) ? sanitize_email( wp_unslash( $_REQUEST['email'] ) ) : ''; + $product_id = self::get_query_var( 'product_id', 'absint' ); + $key = self::get_query_var( 'serial_key' ); + $action = self::get_query_var( 'request' ); + $email = strtolower( self::get_query_var( 'email' ) ); WCSN()->log( 'API request', @@ -131,7 +153,7 @@ public static function process_request() { } // If email is provided, check if it is valid. - if ( ( $email || wcsn_is_duplicate_key_allowed() ) && $order->get_billing_email() !== $email ) { + if ( ( $email || wcsn_is_duplicate_key_allowed() ) && strtolower( $order->get_billing_email() ) !== $email ) { wp_send_json_error( array( 'code' => 'invalid_email', @@ -208,9 +230,9 @@ public static function validate_key( $serial_key ) { * @since 1.0.0 */ public static function activate_key( $serial_key ) { - $user_agent = ! empty( $_SERVER['HTTP_USER_AGENT'] ) ? md5( sanitize_textarea_field( $_SERVER['HTTP_USER_AGENT'] ) . time() ) : md5( time() ); - $instance = ! empty( $_REQUEST['instance'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['instance'] ) ) : $user_agent; // phpcs:ignore WordPress.Security.NonceVerification.Recommended - $platform = ! empty( $_REQUEST['platform'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['platform'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended + $user_agent = ! empty( $_SERVER['HTTP_USER_AGENT'] ) ? md5( sanitize_textarea_field( wp_unslash( $_SERVER['HTTP_USER_AGENT'] ) ) . time() ) : md5( time() ); + $instance = self::get_query_var( 'instance', 'sanitize_text_field', $user_agent ); + $platform = self::get_query_var( 'platform' ); // Check if instance key is valid. if ( empty( $instance ) ) { @@ -311,7 +333,7 @@ public static function activate_key( $serial_key ) { * @since 1.0.0 */ public static function deactivate_key( $serial_key ) { - $instance = ! empty( $_REQUEST['instance'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['instance'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended + $instance = self::get_query_var( 'instance' ); // Check if instance key is valid. if ( empty( $instance ) ) { @@ -391,4 +413,24 @@ public static function check_version( $serial_key ) { ) ); } + + /** + * Get query var. + * + * @param string $key Query var key. + * @param string $sanitize Sanitize method. + * @param mixed $fallback Fallback value. + * + * @since 1.0.0 + * @return mixed + */ + public static function get_query_var( $key, $sanitize = 'sanitize_text_field', $fallback = null ) { + global $wp; + + if ( isset( $wp->query_vars[ $key ] ) ) { + return call_user_func( $sanitize, wp_unslash( $wp->query_vars[ $key ] ) ); + } + + return $fallback; + } } diff --git a/src/Actions.php b/src/Actions.php index 8ffc9df6..b26fe1f2 100644 --- a/src/Actions.php +++ b/src/Actions.php @@ -121,7 +121,7 @@ public static function revoke_order_item_keys( $revoke ) { * @since 1.0.0 */ public static function update_activation_count( $activation ) { - $key = Key::get( $activation->serial_id ); + $key = Key::get( $activation->get_serial_id() ); if ( $key ) { $key->recount_remaining_activation(); } diff --git a/src/Admin/Actions.php b/src/Admin/Actions.php index 5b194ccb..77365bf4 100644 --- a/src/Admin/Actions.php +++ b/src/Admin/Actions.php @@ -194,7 +194,6 @@ public static function handle_add_key() { update_post_meta( $product_id, '_is_serial_number', 'yes' ); update_post_meta( $product_id, '_serial_key_source', 'custom_source' ); $status = isset( $data['status'] ) ? $data['status'] : ''; - } /** diff --git a/src/Admin/Admin.php b/src/Admin/Admin.php index 5d2ecbf1..9d10ad4c 100644 --- a/src/Admin/Admin.php +++ b/src/Admin/Admin.php @@ -31,7 +31,7 @@ public function __construct() { * @since 1.0.0 */ public function init() { - WCSN()->services['admin/settings'] = Settings::get_instance(); + WCSN()->services['admin/settings'] = Settings::instance(); WCSN()->services['admin/menus'] = new Menus(); WCSN()->services['admin/notices'] = new Notices(); WCSN()->services['admin/actions'] = new Actions(); @@ -75,6 +75,9 @@ public function enqueue_scripts( $hook ) { 'apiurl' => site_url( '?wc-api=serial-numbers-api' ), ) ); + + // add inline style for select2 --wp-admin-theme-color. + wp_add_inline_style( 'common', ':root{--wp-admin-theme-color:#0073aa;}' ); } @@ -136,7 +139,7 @@ public function update_footer( $footer_text ) { */ public static function get_screen_ids() { $screen_id = sanitize_title( __( 'Serial Numbers', 'wc-serial-numbers' ) ); - $screen_ids = [ + $screen_ids = array( 'toplevel_page_' . $screen_id, 'toplevel_page_wc-serial-numbers', $screen_id . '_page_wc-serial-numbers-activations', @@ -144,7 +147,7 @@ public static function get_screen_ids() { $screen_id . '_page_wc-serial-numbers-tools', $screen_id . '_page_wc-serial-numbers-reports', $screen_id . '_page_wc-serial-numbers-settings', - ]; + ); return apply_filters( 'wc_serial_numbers_screen_ids', $screen_ids ); } @@ -159,7 +162,7 @@ public static function get_screen_ids() { * @since 1.0.0 * @return void */ - public static function view( $view, $args = [], $path = '' ) { + public static function view( $view, $args = array(), $path = '' ) { if ( empty( $path ) ) { $path = __DIR__ . '/views/'; } diff --git a/src/Admin/ListTables/ActivationsTable.php b/src/Admin/ListTables/ActivationsTable.php index a2677a8d..b7bb8755 100644 --- a/src/Admin/ListTables/ActivationsTable.php +++ b/src/Admin/ListTables/ActivationsTable.php @@ -51,18 +51,18 @@ public function __construct() { public function prepare_items() { $per_page = $this->get_items_per_page( 'wcsn_activations_per_page' ); $columns = $this->get_columns(); - $hidden = []; + $hidden = array(); $sortable = $this->get_sortable_columns(); $this->_column_headers = array( $columns, $hidden, $sortable ); $current_page = $this->get_pagenum(); - $orderby = isset( $_GET['orderby'] ) ? sanitize_key( $_GET['orderby'] ) : 'order_date'; - $order = isset( $_GET['order'] ) ? sanitize_key( $_GET['order'] ) : 'desc'; - $search = isset( $_GET['s'] ) ? sanitize_text_field( $_GET['s'] ) : null; - $product_id = isset( $_GET['product_id'] ) ? absint( $_GET['product_id'] ) : ''; - $order_id = isset( $_GET['order_id'] ) ? absint( $_GET['order_id'] ) : ''; - $customer_id = isset( $_GET['customer_id'] ) ? absint( $_GET['customer_id'] ) : ''; - $id = isset( $_GET['id'] ) ? absint( $_GET['id'] ) : ''; - $serial_id = isset( $_GET['serial_id'] ) ? absint( $_GET['serial_id'] ) : ''; + $orderby = filter_input( INPUT_GET, 'orderby', FILTER_SANITIZE_SPECIAL_CHARS ); + $order = filter_input( INPUT_GET, 'order', FILTER_SANITIZE_SPECIAL_CHARS ); + $search = filter_input( INPUT_GET, 's', FILTER_SANITIZE_SPECIAL_CHARS ); + $product_id = filter_input( INPUT_GET, 'product_id', FILTER_SANITIZE_NUMBER_INT ); + $order_id = filter_input( INPUT_GET, 'order_id', FILTER_SANITIZE_NUMBER_INT ); + $customer_id = filter_input( INPUT_GET, 'customer_id', FILTER_SANITIZE_NUMBER_INT ); + $id = filter_input( INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT ); + $serial_id = filter_input( INPUT_GET, 'serial_id', FILTER_SANITIZE_NUMBER_INT ); if ( array_key_exists( $orderby, $this->get_sortable_columns() ) && 'order_date' !== $orderby ) { $args['orderby'] = $orderby; @@ -91,7 +91,6 @@ public function prepare_items() { 'total_pages' => $this->total_count > 0 ? ceil( $this->total_count / $per_page ) : 0, ) ); - } /** @@ -101,27 +100,16 @@ public function no_items() { esc_html_e( 'No activations found. Once a serial key is activated, it will appear here.', 'wc-serial-numbers' ); } - /** - * Retrieve the view types - * - * @since 1.0.0 - * @return array $views All the views sellable - */ - public function get_views() { - return parent::get_views(); - } - /** * Adds the order and product filters to the licenses list. * - * @param string $which + * @param string $which Which nav. */ protected function extra_tablenav( $which ) { - if ( $which === 'top' ) { + if ( 'top' === $which ) { echo '
'; $this->order_dropdown(); $this->product_dropdown(); - // $this->customer_dropdown(); submit_button( __( 'Filter', 'wc-serial-numbers' ), '', 'filter-action', false ); echo '
'; } @@ -135,9 +123,9 @@ protected function extra_tablenav( $which ) { * @since 1.4.6 */ public function process_bulk_actions( $doaction ) { - if ( $doaction ) { + if ( $doaction && check_ajax_referer( 'bulk-activations' ) ) { if ( isset( $_REQUEST['id'] ) ) { - $ids = wp_parse_id_list( $_REQUEST['id'] ); + $ids = wp_parse_id_list( wp_unslash( $_REQUEST['id'] ) ); $doaction = ( - 1 !== $_REQUEST['action'] ) ? $_REQUEST['action'] : $_REQUEST['action2']; // phpcs:ignore } elseif ( isset( $_REQUEST['ids'] ) ) { $ids = array_map( 'absint', $_REQUEST['ids'] ); @@ -201,7 +189,7 @@ public function get_columns() { * * @return array */ - function get_sortable_columns() { + public function get_sortable_columns() { $sortable_columns = array( 'instance' => array( 'instance', false ), 'serial_id' => array( 'serial_id', false ), @@ -243,13 +231,13 @@ protected function column_cb( $item ) { */ protected function column_instance( $activation ) { $delete_url = add_query_arg( - [ + array( 'id' => $activation->id, 'action' => 'delete', - ], + ), admin_url( 'admin.php?page=wc-serial-numbers-activations' ) ); - $actions['delete'] = sprintf( '%2$s', esc_url( $delete_url ), __( 'Delete', 'wc-serial-numbers' ) ); + $actions['delete'] = sprintf( '%2$s', wp_nonce_url( $delete_url, 'bulk-activations' ), __( 'Delete', 'wc-serial-numbers' ) ); return sprintf( '%1$s %2$s', esc_html( $activation->get_instance() ), $this->row_actions( $actions ) ); } @@ -299,5 +287,4 @@ protected function column_platform( $activation ) { protected function column_activation_time( $activation ) { return empty( $activation->get_activation_time() ) ? '—' : esc_html( $activation->get_activation_time() ); } - } diff --git a/src/Admin/ListTables/KeysTable.php b/src/Admin/ListTables/KeysTable.php index 401cb9fe..f316cbdb 100644 --- a/src/Admin/ListTables/KeysTable.php +++ b/src/Admin/ListTables/KeysTable.php @@ -90,18 +90,19 @@ public function __construct() { public function prepare_items() { $per_page = $this->get_items_per_page( 'wc_serial_numbers_keys_per_page' ); $columns = $this->get_columns(); - $hidden = []; + $hidden = array(); $sortable = $this->get_sortable_columns(); $this->_column_headers = array( $columns, $hidden, $sortable ); $current_page = $this->get_pagenum(); - $status = isset( $_GET['status'] ) ? $_GET['status'] : ''; - $orderby = isset( $_GET['orderby'] ) ? sanitize_key( $_GET['orderby'] ) : 'order_date'; - $order = isset( $_GET['order'] ) ? sanitize_key( $_GET['order'] ) : 'desc'; - $search = isset( $_GET['s'] ) ? sanitize_text_field( $_GET['s'] ) : null; - $product_id = isset( $_GET['product_id'] ) ? absint( $_GET['product_id'] ) : ''; - $order_id = isset( $_GET['order_id'] ) ? absint( $_GET['order_id'] ) : ''; - $customer_id = isset( $_GET['customer_id'] ) ? absint( $_GET['customer_id'] ) : ''; - $id = isset( $_GET['id'] ) ? absint( $_GET['id'] ) : ''; + $status = filter_input( INPUT_GET, 'status', FILTER_SANITIZE_SPECIAL_CHARS ); + $orderby = filter_input( INPUT_GET, 'orderby', FILTER_SANITIZE_SPECIAL_CHARS ); + $order = filter_input( INPUT_GET, 'order', FILTER_SANITIZE_SPECIAL_CHARS ); + $search = filter_input( INPUT_GET, 's', FILTER_SANITIZE_SPECIAL_CHARS ); + $product_id = filter_input( INPUT_GET, 'product_id', FILTER_SANITIZE_NUMBER_INT ); + $order_id = filter_input( INPUT_GET, 'order_id', FILTER_SANITIZE_NUMBER_INT ); + $customer_id = filter_input( INPUT_GET, 'customer_id', FILTER_SANITIZE_NUMBER_INT ); + $id = filter_input( INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT ); + if ( ! empty( $status ) && ! array_key_exists( $status, wcsn_get_key_statuses() ) ) { $status = 'available'; } @@ -124,12 +125,12 @@ public function prepare_items() { ); $this->items = Key::query( $args ); - $this->available_count = Key::count( array_merge( $args, [ 'status' => 'available' ] ) ); - $this->pending_count = Key::count( array_merge( $args, [ 'status' => 'pending' ] ) ); - $this->sold_count = Key::count( array_merge( $args, [ 'status' => 'sold' ] ) ); - $this->expired_count = Key::count( array_merge( $args, [ 'status' => 'expired' ] ) ); - $this->cancelled_count = Key::count( array_merge( $args, [ 'status' => 'cancelled' ] ) ); - $this->total_count = array_sum( [ $this->available_count, $this->sold_count, $this->pending_count, $this->expired_count, $this->cancelled_count ] ); + $this->available_count = Key::count( array_merge( $args, array( 'status' => 'available' ) ) ); + $this->pending_count = Key::count( array_merge( $args, array( 'status' => 'pending' ) ) ); + $this->sold_count = Key::count( array_merge( $args, array( 'status' => 'sold' ) ) ); + $this->expired_count = Key::count( array_merge( $args, array( 'status' => 'expired' ) ) ); + $this->cancelled_count = Key::count( array_merge( $args, array( 'status' => 'cancelled' ) ) ); + $this->total_count = array_sum( array( $this->available_count, $this->sold_count, $this->pending_count, $this->expired_count, $this->cancelled_count ) ); switch ( $status ) { case 'available': @@ -160,14 +161,13 @@ public function prepare_items() { 'total_pages' => $total_items > 0 ? ceil( $total_items / $per_page ) : 0, ) ); - } /** * No items found text. */ public function no_items() { - echo sprintf( '%s %s', esc_html__( 'No keys found.', 'wc-serial-numbers' ), '' . esc_html__( 'Add new key', 'wc-serial-numbers' ) . '' ); + printf( '%s %s', esc_html__( 'No keys found.', 'wc-serial-numbers' ), '' . esc_html__( 'Add new key', 'wc-serial-numbers' ) . '' ); // Show a documentation about key's statuses. ?>

@@ -210,7 +210,7 @@ public function no_items() { * @return array $views All the views sellable */ public function get_views() { - $current = isset( $_GET['status'] ) ? sanitize_key( $_GET['status'] ) : ''; + $current = isset( $_GET['status'] ) ? sanitize_key( wp_unslash( $_GET['status'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended $available_count = ' (' . $this->available_count . ')'; $pending_count = ' (' . $this->pending_count . ')'; $sold_count = ' (' . $this->sold_count . ')'; @@ -219,12 +219,48 @@ public function get_views() { $total_count = ' (' . $this->total_count . ')'; $url = admin_url( 'admin.php?page=wc-serial-numbers' ); $views = array( - 'all' => sprintf( '%s', remove_query_arg( 'status', $url ), __( 'All keys.', 'wc-serial-numbers' ), $current === 'all' || $current == '' ? ' class="current"' : '', __( 'All', 'wc-serial-numbers' ) . $total_count ), - 'available' => sprintf( '%s', add_query_arg( 'status', 'available', $url ), __( 'Available for sell.', 'wc-serial-numbers' ), $current === 'available' ? ' class="current"' : '', __( 'Available', 'wc-serial-numbers' ) . $available_count ), - 'pending' => sprintf( '%s', add_query_arg( 'status', 'pending', $url ), __( 'Pending payment.', 'wc-serial-numbers' ), $current === 'pending' ? ' class="current"' : '', __( 'Pending', 'wc-serial-numbers' ) . $pending_count ), - 'sold' => sprintf( '%s', add_query_arg( 'status', 'sold', $url ), __( 'Sold keys.', 'wc-serial-numbers' ), $current === 'sold' ? ' class="current"' : '', __( 'Sold', 'wc-serial-numbers' ) . $sold_count ), - 'expired' => sprintf( '%s', add_query_arg( 'status', 'expired', $url ), __( 'Expired keys.', 'wc-serial-numbers' ), $current === 'expired' ? ' class="current"' : '', __( 'Expired', 'wc-serial-numbers' ) . $expired_count ), - 'cancelled' => sprintf( '%s', add_query_arg( 'status', 'cancelled', $url ), __( 'Cancelled keys.', 'wc-serial-numbers' ), $current === 'cancelled' ? ' class="current"' : '', __( 'Cancelled', 'wc-serial-numbers' ) . $cancelled_count ), + 'all' => sprintf( + '%s', + remove_query_arg( 'status', $url ), + __( 'All keys.', 'wc-serial-numbers' ), + 'all' === $current || '' === $current ? ' class="current"' : '', + __( 'All', 'wc-serial-numbers' ) . $total_count + ), + 'available' => sprintf( + '%s', + add_query_arg( 'status', 'available', $url ), + __( 'Available for sell.', 'wc-serial-numbers' ), + 'available' === $current ? ' class="current"' : '', + __( 'Available', 'wc-serial-numbers' ) . $available_count + ), + 'pending' => sprintf( + '%s', + add_query_arg( 'status', 'pending', $url ), + __( 'Pending payment.', 'wc-serial-numbers' ), + 'pending' === $current ? ' class="current"' : '', + __( 'Pending', 'wc-serial-numbers' ) . $pending_count + ), + 'sold' => sprintf( + '%s', + add_query_arg( 'status', 'sold', $url ), + __( 'Sold keys.', 'wc-serial-numbers' ), + 'sold' === $current ? ' class="current"' : '', + __( 'Sold', 'wc-serial-numbers' ) . $sold_count + ), + 'expired' => sprintf( + '%s', + add_query_arg( 'status', 'expired', $url ), + __( 'Expired keys.', 'wc-serial-numbers' ), + 'expired' === $current ? ' class="current"' : '', + __( 'Expired', 'wc-serial-numbers' ) . $expired_count + ), + 'cancelled' => sprintf( + '%s', + add_query_arg( 'status', 'cancelled', $url ), + __( 'Cancelled keys.', 'wc-serial-numbers' ), + 'cancelled' === $current ? ' class="current"' : '', + __( 'Cancelled', 'wc-serial-numbers' ) . $cancelled_count + ), ); return $views; @@ -236,7 +272,7 @@ public function get_views() { * @param string $which The location of the extra table nav markup: 'top' or 'bottom'. */ protected function extra_tablenav( $which ) { - if ( $which === 'top' ) { + if ( 'top' === $which ) { echo '
'; $this->order_dropdown(); $this->product_dropdown(); @@ -255,9 +291,9 @@ protected function extra_tablenav( $which ) { * @since 1.4.6 */ public function process_bulk_actions( $doaction ) { - if ( $doaction ) { - if ( isset( $_REQUEST['id'] ) ) { - $ids = wp_parse_id_list( $_REQUEST['id'] ); + if ( $doaction && check_ajax_referer( 'bulk-' . $this->_args['plural'] ) ) { + if ( wp_unslash( isset( $_REQUEST['id'] ) ) ) { + $ids = wp_parse_id_list( wp_unslash( $_REQUEST['id'] ) ); $doaction = ( - 1 !== $_REQUEST['action'] ) ? $_REQUEST['action'] : $_REQUEST['action2']; // phpcs:ignore } elseif ( isset( $_REQUEST['ids'] ) ) { $ids = array_map( 'absint', $_REQUEST['ids'] ); @@ -331,7 +367,7 @@ public function get_columns() { * * @return array */ - function get_sortable_columns() { + public function get_sortable_columns() { $sortable_columns = array( 'key' => array( 'serial_key', false ), 'product' => array( 'product_id', false ), @@ -361,7 +397,7 @@ protected function get_primary_column_name() { /** * since 1.0.0 * - * @param object $item + * @param \StdClass $item Item. * * @return string|void */ @@ -372,23 +408,24 @@ protected function column_cb( $item ) { /** * Display key. * - * @param $item + * @param Key $item Item. * * @since 1.4.6 */ protected function column_key( $item ) { - $is_hidden = 'yes' === get_option( 'wc_serial_numbers_hide_serial_number', 'yes' ); - $edit_url = add_query_arg( [ 'edit' => $item->id ], admin_url( 'admin.php?page=wc-serial-numbers' ) ); - $delete_url = add_query_arg( - [ + $is_hidden = 'yes' === get_option( 'wc_serial_numbers_hide_serial_number', 'yes' ); + $edit_url = add_query_arg( array( 'edit' => $item->id ), admin_url( 'admin.php?page=wc-serial-numbers' ) ); + $delete_url = add_query_arg( + array( 'id' => $item->id, 'action' => 'delete', - ], + ), admin_url( 'admin.php?page=wc-serial-numbers' ) ); - $actions['id'] = sprintf( __( 'ID: %d', 'wc-serial-numbers' ), $item->id ); + // translators: %d: key id. + $actions['id'] = sprintf( __( 'ID: %d', 'wc-serial-numbers' ), esc_html( $item->id ) ); $actions['edit'] = sprintf( '%2$s', $edit_url, __( 'Edit', 'wc-serial-numbers' ) ); - $actions['delete'] = sprintf( '%2$s', $delete_url, __( 'Delete', 'wc-serial-numbers' ) ); + $actions['delete'] = sprintf( '%2$s', wp_nonce_url( $delete_url, 'bulk-keys' ), __( 'Delete', 'wc-serial-numbers' ) ); return sprintf( '%1$s %2$s', $item->print_key( $is_hidden ), $this->row_actions( $actions ) ); } @@ -396,7 +433,7 @@ protected function column_key( $item ) { /** * Display column product. * - * @param Key $key Key object. + * @param Key $item Item. * * @since 1.4.6 */ @@ -409,7 +446,7 @@ protected function column_product( $item ) { /** * Display column order. * - * @param Key $key Key object. + * @param Key $item Item. * * @since 1.4.6 */ @@ -425,7 +462,7 @@ protected function column_order( $item ) { /** * Display column customer. * - * @param Key $key Key object. + * @param \StdClass $item Item. * * @since 1.4.6 */ @@ -458,10 +495,10 @@ protected function column_activation( $key ) { $limit = ! empty( $key->activation_limit ) ? $key->activation_limit : '∞'; $count = (int) $key->activation_count; $link = add_query_arg( - [ + array( 'serial_id' => $key->id, 'page' => 'wc-serial-numbers-activations', - ], + ), admin_url( 'admin.php' ) ); @@ -478,7 +515,21 @@ protected function column_activation( $key ) { * @since 1.4.6 */ protected function column_valid_for( $key ) { - return ! empty( $key->get_validity() ) ? sprintf( _n( '%s Day
After purchase', '%s Days
After purchase', $key->get_validity(), 'wc-serial-numbers' ), number_format_i18n( $key->get_validity() ) ) : __( 'Lifetime', 'wc-serial-numbers' ); + if ( ! empty( $key->get_validity() ) ) { + return wp_kses_post( + sprintf( + // translators: %1$s: validity, %2$s: validity. + _n( + '%s Day
After purchase', + '%s Days
After purchase', + $key->get_validity(), + 'wc-serial-numbers' + ), + number_format_i18n( $key->get_validity() ) + ) + ); + } + return __( 'Lifetime', 'wc-serial-numbers' ); } /** @@ -489,7 +540,10 @@ protected function column_valid_for( $key ) { * @since 1.4.6 */ protected function column_order_date( $key ) { - return ! empty( $key->order_date ) && '0000-00-00 00:00:00' !== $key->order_date ? date( get_option( 'date_format' ), strtotime( $key->order_date ) ) : '—'; + if ( ! empty( $key->order_date ) && '0000-00-00 00:00:00' !== $key->order_date ) { + return wp_date( get_option( 'date_format' ), strtotime( $key->order_date ) ); + } + return '—'; } /** diff --git a/src/Admin/ListTables/ListTable.php b/src/Admin/ListTables/ListTable.php index f42e3ba7..3539c210 100644 --- a/src/Admin/ListTables/ListTable.php +++ b/src/Admin/ListTables/ListTable.php @@ -28,15 +28,15 @@ class ListTable extends \WP_List_Table { /** * Get a request var, or return the default if not set. * - * @param string $var Request var name. - * @param mixed $default Default value. + * @param string $param Request var name. + * @param mixed $fallback Default value. * * @since 1.4.6 * * @return mixed Un-sanitized request var */ - protected function get_request_var( $var = '', $default = false ) { - return isset( $_REQUEST[ $var ] ) ? sanitize_text_field( wp_unslash( $_REQUEST[ $var ] ) ) : $default; // phpcs:ignore WordPress.Security.NonceVerification + protected function get_request_var( $param = '', $fallback = false ) { + return isset( $_REQUEST[ $param ] ) ? sanitize_text_field( wp_unslash( $_REQUEST[ $param ] ) ) : $fallback; // phpcs:ignore WordPress.Security.NonceVerification } /** @@ -202,17 +202,6 @@ public function customer_dropdown() { * @since 1.4.6 */ public function process_bulk_actions( $doaction ) { - if ( ! empty( $_GET['_wp_http_referer'] ) ) { - wp_redirect( - remove_query_arg( - array( - '_wp_http_referer', - '_wpnonce', - ), - wp_unslash( $_SERVER['REQUEST_URI'] ) - ) - ); - exit; - } + $referer = wp_get_referer(); } } diff --git a/src/Admin/ListTables/StockTable.php b/src/Admin/ListTables/StockTable.php index 42f3e45b..6e08b512 100644 --- a/src/Admin/ListTables/StockTable.php +++ b/src/Admin/ListTables/StockTable.php @@ -32,14 +32,14 @@ public function __construct() { public function prepare_items() { $per_page = 20; $columns = $this->get_columns(); - $hidden = []; + $hidden = array(); $sortable = $this->get_sortable_columns(); $this->_column_headers = array( $columns, $hidden, $sortable ); $current_page = $this->get_pagenum(); - $orderby = isset( $_GET['orderby'] ) ? sanitize_key( $_GET['orderby'] ) : 'order_date'; - $order = isset( $_GET['order'] ) ? sanitize_key( $_GET['order'] ) : 'desc'; - $search = isset( $_GET['s'] ) ? sanitize_text_field( $_GET['s'] ) : null; - $product_id = isset( $_GET['product_id'] ) ? absint( $_GET['product_id'] ) : ''; + $orderby = filter_input( INPUT_GET, 'orderby', FILTER_SANITIZE_SPECIAL_CHARS ); + $order = filter_input( INPUT_GET, 'order', FILTER_SANITIZE_SPECIAL_CHARS ); + $search = filter_input( INPUT_GET, 's', FILTER_SANITIZE_SPECIAL_CHARS ); + $product_id = filter_input( INPUT_GET, 'product_id', FILTER_SANITIZE_NUMBER_INT ); $query_args = array( 'posts_per_page' => $per_page, @@ -70,23 +70,13 @@ public function no_items() { esc_html_e( 'No products selling serial keys from "stock" found.', 'wc-serial-numbers' ); } - /** - * Retrieve the view types - * - * @since 1.0.0 - * @return array $views All the views sellable - */ - public function get_views() { - return parent::get_views(); - } - /** * Adds the order and product filters to the licenses list. * * @param string $which The location of the extra table nav markup: 'top' or 'bottom'. */ protected function extra_tablenav( $which ) { - if ( $which === 'top' ) { + if ( 'top' === $which ) { echo '
'; $this->product_dropdown(); submit_button( __( 'Filter', 'wc-serial-numbers' ), '', 'filter-action', false ); @@ -116,7 +106,7 @@ public function get_columns() { * * @return array */ - function get_sortable_columns() { + public function get_sortable_columns() { $columns = array( 'product' => array( 'product_id', false ), ); @@ -169,7 +159,7 @@ public function column_default( $item, $column_name ) { case 'sold': $sold_count = wcsn_get_keys( array( - 'status__in' => [ 'sold', 'expired' ], + 'status__in' => array( 'sold', 'expired' ), 'product_id' => $item->get_id(), 'count' => true, ) diff --git a/src/Admin/Menus.php b/src/Admin/Menus.php index 2f525584..5399f067 100644 --- a/src/Admin/Menus.php +++ b/src/Admin/Menus.php @@ -19,10 +19,6 @@ class Menus { * @since 1.0.0 */ public function __construct() { - // add_action( 'current_screen', array( $this, 'setup_screen' ) ); - // add_action( 'check_ajax_referer', array( $this, 'setup_screen' ) ); - // add_filter( 'set-screen-option', array( __CLASS__, 'save_screen_options' ), 10, 3 ); - // Register the menus. add_action( 'admin_menu', array( $this, 'main_menu' ) ); add_action( 'admin_menu', array( $this, 'activations_menu' ), 40 ); @@ -48,7 +44,7 @@ public function __construct() { * @since 1.4.6 */ public function setup_screen() { - if ( isset( $_GET['edit'] ) || isset( $_GET['delete'] ) || isset( $_GET['add'] ) || isset( $_GET['generate'] ) ) { + if ( isset( $_GET['edit'] ) || isset( $_GET['delete'] ) || isset( $_GET['add'] ) || isset( $_GET['generate'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended return; } @@ -59,12 +55,6 @@ public function setup_screen() { $screen_id = isset( $screen, $screen->id ) ? $screen->id : ''; } - // switch ( $screen_id ) { - // case $plugin_screen_id . '-page-wc-serial-numbers': - // $this->list_table = new ListTables\KeysTable(); - // break; - // } - // Ensure the table handler is only loaded once. Prevents multiple loads if a plugin calls check_ajax_referer many times. remove_action( 'current_screen', array( $this, 'setup_screen' ) ); remove_action( 'check_ajax_referer', array( $this, 'setup_screen' ) ); @@ -223,11 +213,11 @@ public function output_main_page() { if ( $add ) { $key = new Key(); - include dirname( __FILE__ ) . '/views/html-edit-key.php'; + include __DIR__ . '/views/html-edit-key.php'; } elseif ( $edit ) { - include dirname( __FILE__ ) . '/views/html-edit-key.php'; + include __DIR__ . '/views/html-edit-key.php'; } else { - include dirname( __FILE__ ) . '/views/html-list-keys.php'; + include __DIR__ . '/views/html-list-keys.php'; } } @@ -250,10 +240,10 @@ public function output_activations_page() { */ public function output_tools_page() { $tabs = array( + 'generators' => __( 'Generators', 'wc-serial-numbers' ), + 'api' => __( 'API Toolkit', 'wc-serial-numbers' ), 'import' => __( 'Import', 'wc-serial-numbers' ), 'export' => __( 'Export', 'wc-serial-numbers' ), - 'generators' => __( 'Generators', 'wc-serial-numbers' ), - 'api' => __( 'API', 'wc-serial-numbers' ), ); // If software support is disabled, remove the activations tab. @@ -263,8 +253,8 @@ public function output_tools_page() { $tabs = apply_filters( 'wc_serial_numbers_tools_tabs', $tabs ); $tab_ids = array_keys( $tabs ); - $current_tab = isset( $_GET['tab'] ) ? sanitize_key( $_GET['tab'] ) : reset( $tab_ids ); - $page = isset( $_GET['page'] ) ? sanitize_key( $_GET['page'] ) : ''; + $current_tab = isset( $_GET['tab'] ) ? sanitize_key( wp_unslash( $_GET['tab'] ) ) : reset( $tab_ids ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended + $page = isset( $_GET['page'] ) ? sanitize_key( wp_unslash( $_GET['page'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended Admin::view( 'html-tools.php', @@ -285,14 +275,12 @@ public function output_tools_page() { public function output_reports_page() { $tabs = array( 'stock' => __( 'Stock', 'wc-serial-numbers' ), - // 'sales' => __( 'Sales', 'wc-serial-numbers' ), - // 'activations' => __( 'Activations', 'wc-serial-numbers' ), ); $tabs = apply_filters( 'wc_serial_numbers_reports_tabs', $tabs ); $tab_ids = array_keys( $tabs ); - $current_tab = isset( $_GET['tab'] ) ? sanitize_key( $_GET['tab'] ) : reset( $tab_ids ); - $page = isset( $_GET['page'] ) ? sanitize_key( $_GET['page'] ) : ''; + $current_tab = isset( $_GET['tab'] ) ? sanitize_key( wp_unslash( $_GET['tab'] ) ) : reset( $tab_ids ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended + $page = isset( $_GET['page'] ) ? sanitize_key( wp_unslash( $_GET['page'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended Admin::view( 'html-reports.php', @@ -311,8 +299,8 @@ public function output_reports_page() { * @return void */ public function go_pro_redirect() { - if ( isset( $_GET['page'] ) && 'go_wcsn_pro' === $_GET['page'] ) { - wp_redirect( 'https://pluginever.com/plugins/woocommerce-serial-numbers-pro/?utm_source=admin-menu&utm_medium=link&utm_campaign=upgrade&utm_id=wc-serial-numbers' ); + if ( isset( $_GET['page'] ) && 'go_wcsn_pro' === $_GET['page'] ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended + wp_redirect( 'https://pluginever.com/plugins/woocommerce-serial-numbers-pro/?utm_source=admin-menu&utm_medium=link&utm_campaign=upgrade&utm_id=wc-serial-numbers' ); // phpcs:ignore WordPress.Security.SafeRedirect.wp_redirect_wp_redirect die; } } @@ -427,7 +415,8 @@ public static function status_tab() { foreach ( $cron_jobs as $cron_job => $cron_job_name ) { $next_scheduled = wp_next_scheduled( $cron_job ); if ( $next_scheduled ) { - $statuses[ $cron_job_name ] = sprintf( __( 'Next run: %s', 'wc-serial-numbers' ), date_i18n( get_option( 'date_format' ) . ' ' . get_option( 'time_format' ), $next_scheduled ) ); + // translators: %s: Next scheduled time. + $statuses[ $cron_job_name ] = sprintf( __( 'Next run: %s', 'wc-serial-numbers' ), esc_html( date_i18n( get_option( 'date_format' ) . ' ' . get_option( 'time_format' ), $next_scheduled ) ) ); } else { $statuses[ $cron_job_name ] = __( 'Not scheduled', 'wc-serial-numbers' ); } diff --git a/src/Admin/Metaboxes.php b/src/Admin/Metaboxes.php index 38284049..a4858f4c 100644 --- a/src/Admin/Metaboxes.php +++ b/src/Admin/Metaboxes.php @@ -25,8 +25,11 @@ public function __construct() { } /** - * product - * since 1.0.0 + * Add product data tab. + * + * @param array $tabs product data tabs. + * + * @return mixed */ public static function product_data_tab( $tabs ) { $tabs['wc_serial_numbers'] = array( @@ -46,13 +49,13 @@ public static function product_write_panel() { global $post, $woocommerce; ?> @@ -132,18 +145,19 @@ public static function product_write_panel() { /** * Show promo box. * - * @param $variation_data - * @param $variation - * - * @param $loop - * * @since 1.2.0 */ - public static function variable_product_content( $loop, $variation_data, $variation ) { + public static function variable_product_content() { if ( ! WCSN()->is_premium_active() ) { - echo sprintf( '

%s %s

', __( 'The free version of Serial Numbers for WooCommerce does not support product variation.', 'wc-serial-numbers' ), 'https://www.pluginever.com/plugins/woocommerce-serial-numbers-pro/?utm_source=product_page_license_area&utm_medium=link&utm_campaign=wc-serial-numbers&utm_content=Upgrade%20to%20Pro', __( 'Upgrade to Pro', 'wc-serial-numbers' ) ); + echo wp_kses_post( + sprintf( + '

%s %s

', + __( 'The free version of Serial Numbers for WooCommerce does not support product variation.', 'wc-serial-numbers' ), + 'https://www.pluginever.com/plugins/woocommerce-serial-numbers-pro/?utm_source=product_page_license_area&utm_medium=link&utm_campaign=wc-serial-numbers&utm_content=Upgrade%20to%20Pro', + __( 'Upgrade to Pro', 'wc-serial-numbers' ) + ) + ); } - } /** @@ -151,13 +165,17 @@ public static function variable_product_content( $loop, $variation_data, $variat */ public static function product_save_data() { global $post; + if ( ! isset( $_POST['woocommerce_meta_nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['woocommerce_meta_nonce'] ) ), 'woocommerce_save_data' ) ) { + return; + } $status = isset( $_POST['_is_serial_number'] ) ? 'yes' : 'no'; - $source = isset( $_POST['_serial_key_source'] ) ? sanitize_text_field( $_POST['_serial_key_source'] ) : 'custom_source'; + $source = isset( $_POST['_serial_key_source'] ) ? sanitize_text_field( wp_unslash( $_POST['_serial_key_source'] ) ) : 'custom_source'; update_post_meta( $post->ID, '_is_serial_number', $status ); update_post_meta( $post->ID, '_serial_key_source', $source ); - // save only if software licensing enabled - if ( ! wc_serial_numbers_software_support_disabled() ) { - update_post_meta( $post->ID, '_software_version', ! empty( $_POST['_software_version'] ) ? sanitize_text_field( $_POST['_software_version'] ) : '' ); + // save only if software licensing enabled. + if ( wcsn_is_software_support_enabled() ) { + $software_version = isset( $_POST['_software_version'] ) ? sanitize_text_field( wp_unslash( $_POST['_software_version'] ) ) : ''; + update_post_meta( $post->ID, '_software_version', $software_version ); } do_action( 'wcsn_save_simple_product_meta', $post ); @@ -165,42 +183,40 @@ public static function product_save_data() { /** + * Display serial numbers in order item meta. * - * @param $o_item - * @param $product - * - * @param $o_item_id + * @param int $o_item_id order item id. + * @param \WC_Order_Item $o_item order item object. + * @param \WC_Product $product product object. * * @since 1.1.6 * - * @return bool|string + * @return void */ public function order_itemmeta( $o_item_id, $o_item, $product ) { global $post; if ( ! is_object( $post ) || ! isset( $post->ID ) ) { - return false; + return; } $order = wc_get_order( $post->ID ); - // bail for no order + // bail for no order. if ( ! $order ) { - return false; + return; } if ( 'completed' !== $order->get_status( 'edit' ) ) { - return ''; + return; } - // if this is not product then no need to process + // if this is not product then no need to process. if ( empty( $product ) ) { - return false; + return; } - $is_serial_product = 'yes' == get_post_meta( $product->get_id(), '_is_serial_number', true ); - - if ( ! $is_serial_product ) { - return false; + if ( 'yes' !== get_post_meta( $product->get_id(), '_is_serial_number', true ) ) { + return; } $items = wcsn_get_keys( @@ -211,22 +227,28 @@ public function order_itemmeta( $o_item_id, $o_item, $product ) { ); if ( empty( $items ) && $order ) { - echo sprintf( '
%s
', __( 'Order missing serial numbers for this item.', 'wc-serial-numbers' ) ); - - return true; + echo wp_kses_post( + sprintf( + '
%s
', + __( 'Order missing serial numbers for this item.', 'wc-serial-numbers' ) + ) + ); + return; } $url = admin_url( 'admin.php?page=wc-serial-numbers' ); - echo sprintf( + printf( '
%s→', - add_query_arg( - [ - 'order_id' => $post->ID, - 'product_id' => $product->get_id(), - ], - $url + esc_url( + add_query_arg( + array( + 'order_id' => $post->ID, + 'product_id' => $product->get_id(), + ), + $url + ) ), - __( 'Serial Numbers', 'wc-serial-numbers' ) + esc_html__( 'Serial Numbers', 'wc-serial-numbers' ) ); $url = admin_url( 'admin.php?page=wc-serial-numbers' ); @@ -237,15 +259,19 @@ public function order_itemmeta( $o_item_id, $o_item, $product ) { $li .= sprintf( '
  •  %s
  • ', add_query_arg( - [ + array( 'edit' => $item->id, - ], + ), $url ), - wc_serial_numbers_decrypt_key( $item->serial_key ) + wcsn_decrypt_key( $item->serial_key ) ); } - - echo sprintf( '
      %s
    ', $li ); + echo wp_kses_post( + sprintf( + '
      %s
    ', + $li + ) + ); } } diff --git a/src/Admin/Notices.php b/src/Admin/Notices.php index 7273b28b..014fc9d6 100644 --- a/src/Admin/Notices.php +++ b/src/Admin/Notices.php @@ -25,10 +25,10 @@ class Notices { * @since 1.0.0 */ public function __construct() { - add_action( 'admin_init', [ $this, 'add_notices' ] ); - add_action( 'admin_notices', [ $this, 'output_notices' ] ); - add_action( 'wp_ajax_wc_serial_numbers_dismiss_notice', [ $this, 'dismiss_notice' ] ); - add_action( 'admin_footer', [ $this, 'add_notice_script' ] ); + add_action( 'admin_init', array( $this, 'add_notices' ) ); + add_action( 'admin_notices', array( $this, 'output_notices' ) ); + add_action( 'wp_ajax_wc_serial_numbers_dismiss_notice', array( $this, 'dismiss_notice' ) ); + add_action( 'admin_footer', array( $this, 'add_notice_script' ) ); } /** @@ -39,7 +39,7 @@ public function __construct() { public function add_notices() { $is_outdated_pro = defined( 'WC_SERIAL_NUMBER_PRO_PLUGIN_VERSION' ) && version_compare( WC_SERIAL_NUMBER_PRO_PLUGIN_VERSION, '1.2.1', '<' ); if ( ! $is_outdated_pro ) { - $is_outdated_pro = function_exists( 'wc_serial_numbers_pro' ) && is_callable( [ WCSN_PRO(), 'get_version' ] ) && WCSN_PRO()->get_version() && version_compare( WCSN_PRO()->get_version(), '1.2.1', '<' ); + $is_outdated_pro = function_exists( 'wc_serial_numbers_pro' ) && is_callable( array( 'wc_serial_numbers_pro', 'get_version' ) ) && wc_serial_numbers_pro()->get_version() && version_compare( wc_serial_numbers_pro()->get_version(), '1.2.1', '<' ); } if ( $is_outdated_pro ) { $this->notices[] = array( @@ -47,7 +47,7 @@ public function add_notices() { 'message' => sprintf( /* translators: %1$s: link to the plugin page, %2$s: link to the plugin page */ __( '%s is not functional because you are using outdated version of the plugin, please update to the version 1.2.1 or higher.', 'wc-serial-numbers' ), - 'WooCommerce Serial Numbers Pro' + 'WC Serial Numbers Pro' ), ); } @@ -60,7 +60,7 @@ public function add_notices() { 'id' => 'wc_serial_numbers_upgrade_to_pro_wcsnpro10', 'message' => sprintf( /* translators: %1$s: link to the plugin page, %2$s: link to the plugin page */ - __( 'New! Send Serial Keys via SMS with Twilio. Upgrade to %6$s to unlock the full potential of %5$s and avail a %1$s discount by using the promo code %2$s %3$s Upgrade Now %4$s.', 'wc-serial-numbers' ), + __( 'Upgrade to %6$s to unlock the full potential of %5$s and avail a %1$s discount by using the promo code %2$s. %3$s Upgrade Now%4$s.', 'wc-serial-numbers' ), '10%', 'WCSNPRO10', '', diff --git a/src/Admin/Orders.php b/src/Admin/Orders.php index 0524a153..92ce2635 100644 --- a/src/Admin/Orders.php +++ b/src/Admin/Orders.php @@ -97,7 +97,7 @@ public static function add_order_serial_column( $columns ) { public static function add_order_serial_column_content( $column, $order_id ) { $order_status = wc_get_order( $order_id )->get_status(); if ( 'order_serials' === $column ) { - if ( ! wcsn_order_has_products( $order_id ) || ! in_array( $order_status, [ 'completed', 'processing' ], true ) ) { + if ( ! wcsn_order_has_products( $order_id ) || ! in_array( $order_status, array( 'completed', 'processing' ), true ) ) { echo '—'; } else { if ( wcsn_order_is_fullfilled( $order_id ) ) { @@ -107,8 +107,8 @@ public static function add_order_serial_column_content( $column, $order_id ) { $style = 'color:red'; $title = __( 'Order is not fullfilled.', 'wc-serial-numbers' ); } - $url = add_query_arg( [ 'order_id' => $order_id ], admin_url( 'admin.php?page=wc-serial-numbers' ) ); - echo sprintf( '', esc_url( $url ), esc_html( $title ), esc_attr( $style ) ); + $url = add_query_arg( array( 'order_id' => $order_id ), admin_url( 'admin.php?page=wc-serial-numbers' ) ); + printf( '', esc_url( $url ), esc_html( $title ), esc_attr( $style ) ); } } } @@ -139,7 +139,7 @@ public function add_order_bulk_action( $actions ) { * @return string */ public function handle_order_bulk_action( $redirect_to, $action, $order_ids ) { - if ( in_array( $action, [ 'wcsn_add_keys', 'wcsn_remove_keys' ], true ) ) { + if ( in_array( $action, array( 'wcsn_add_keys', 'wcsn_remove_keys' ), true ) ) { foreach ( $order_ids as $order_id ) { switch ( $action ) { case 'wcsn_add_keys': @@ -217,7 +217,7 @@ public static function display_order_item_meta( $item_id, $item, $product ) { - + $field ) : ?> diff --git a/src/Admin/Products.php b/src/Admin/Products.php index b7cbdf2b..d5e1e7b9 100644 --- a/src/Admin/Products.php +++ b/src/Admin/Products.php @@ -27,7 +27,6 @@ public function __construct() { * @since 1.0.0 */ public static function print_style() { - ob_start(); ?> __( 'General Settings', 'wc-serial-numbers' ), 'type' => 'title', - 'desc' => __( 'These options determine the behavior and operation of the serial keys.', 'wc-serial-numbers' ), + 'desc' => __( 'These options determine the behavior and operation of the plugin.', 'wc-serial-numbers' ), 'id' => 'section_serial_numbers', - ], - [ + ), + array( 'title' => __( 'Auto-complete orders', 'wc-serial-numbers' ), 'id' => 'wc_serial_numbers_autocomplete_order', 'desc' => __( 'Automatically completes orders after successful payments.', 'wc-serial-numbers' ), 'type' => 'checkbox', 'default' => 'no', - ], - [ - 'title' => __( 'Reuse serial key', 'wc-serial-numbers' ), + ), + array( + 'title' => __( 'Reuse keys', 'wc-serial-numbers' ), 'id' => 'wc_serial_numbers_reuse_serial_number', - 'desc' => __( 'Recover failed, refunded serial keys for selling again.', 'wc-serial-numbers' ), - 'desc_tip' => __( 'If you enable this option, the serial keys will be available for selling again if the order is refunded or failed.', 'wc-serial-numbers' ), + 'desc' => __( 'Recover failed, refunded keys for selling again.', 'wc-serial-numbers' ), + 'desc_tip' => __( 'If you enable this option, the keys will be available for selling again if the order is refunded or failed.', 'wc-serial-numbers' ), 'type' => 'checkbox', 'default' => 'no', - ], + ), // Revoke serial keys. - [ - 'title' => __( 'Revoke serial keys', 'wc-serial-numbers' ), + array( + 'title' => __( 'Revoke keys', 'wc-serial-numbers' ), 'id' => 'wc_serial_numbers_revoke_keys', - 'desc' => __( 'Revoke serial keys when the order status changes to cancelled or refunded.', 'wc-serial-numbers' ), - 'desc_tip' => __( 'If you enable this option, the serial keys will be revoked when the order status changes to cancelled or refunded.', 'wc-serial-numbers' ), + 'desc' => __( 'Revoke keys when the order status changes to cancelled or refunded.', 'wc-serial-numbers' ), + 'desc_tip' => __( 'If you enable this option, the keys will be revoked when the order status changes to cancelled or refunded.', 'wc-serial-numbers' ), 'type' => 'checkbox', 'default' => 'no', - ], - [ - 'title' => __( 'Hide serial key', 'wc-serial-numbers' ), + ), + array( + 'title' => __( 'Hide keys', 'wc-serial-numbers' ), 'id' => 'wc_serial_numbers_hide_serial_number', - 'desc' => __( 'Serial keys will be masked in the list table.', 'wc-serial-numbers' ), + 'desc' => __( 'Keys will be masked in the list table.', 'wc-serial-numbers' ), 'default' => 'yes', 'type' => 'checkbox', - ], - [ - 'title' => __( 'Disable software support', 'wc-serial-numbers' ), - 'id' => 'wc_serial_numbers_disable_software_support', - 'desc' => __( 'Disable Software Licensing support & API functionalities.', 'wc-serial-numbers' ), + ), + array( + 'title' => __( 'Disable software support', 'wc-serial-numbers' ), + 'id' => 'wc_serial_numbers_disable_software_support', + 'desc' => __( 'Disable Software Licensing support & API functionalities.', 'wc-serial-numbers' ), 'desc_tip' => __( 'If you enable this option, the activation menu and it’s functionality will be turned off.', 'wc-serial-numbers' ), - 'default' => 'no', - 'type' => 'checkbox', - ], - [ + 'default' => 'no', + 'type' => 'checkbox', + ), + array( 'type' => 'sectionend', 'id' => 'section_serial_numbers', - ], - [ + ), + array( 'title' => __( 'Stock Notification', 'wc-serial-numbers' ), 'type' => 'title', - 'desc' => __( 'These options determine the operation of the serial key stock notification.', 'wc-serial-numbers' ), + 'desc' => __( 'These options determine the operation of the key\'s stock notification.', 'wc-serial-numbers' ), 'id' => 'stock_section', - ], - [ + ), + array( 'title' => __( 'Stock notification email', 'wc-serial-numbers' ), 'id' => 'wc_serial_numbers_enable_stock_notification', - 'desc' => __( 'Sends notification emails when product stock is low.', 'wc-serial-numbers' ), + 'desc' => __( 'Sends notification emails when key stock is low.', 'wc-serial-numbers' ), 'type' => 'checkbox', 'sanitize_callback' => 'intval', 'default' => 'yes', - ], + ), array( 'title' => __( 'Stock threshold', 'wc-serial-numbers' ), 'id' => 'wc_serial_numbers_stock_threshold', - 'desc' => __( 'An email notification will be sent when the stock falls below the specified number.', 'wc-serial-numbers' ), + 'desc' => __( 'An email notification will be sent when the key stock falls below the specified number.', 'wc-serial-numbers' ), 'type' => 'number', 'default' => '5', ), @@ -119,10 +119,10 @@ public function get_settings( $tab ) { 'type' => 'text', 'default' => get_option( 'admin_email' ), ), - [ + array( 'type' => 'sectionend', 'id' => 'stock_section', - ], + ), ); break; } @@ -149,17 +149,17 @@ protected function output_premium_widget() { return; } $features = array( - __( 'Create and assign license keys for WooCommerce variable products.', 'wc-serial-numbers' ), - __( 'Generate bulk license keys with your custom key generator rule.', 'wc-serial-numbers' ), + __( 'Create and assign keys for WooCommerce variable products.', 'wc-serial-numbers' ), + __( 'Generate bulk keys with your custom key generator rule.', 'wc-serial-numbers' ), __( 'Random & sequential key order for the generator rules.', 'wc-serial-numbers' ), - __( 'Automatic license key generator to auto-create & assign keys with orders.', 'wc-serial-numbers' ), + __( 'Automatic key generator to auto-create & assign keys with orders.', 'wc-serial-numbers' ), __( 'License key management option from the order page with required actions.', 'wc-serial-numbers' ), - __( 'Support for bulk import/export of license keys from/to CSV.', 'wc-serial-numbers' ), - __( 'Send Serial Keys via SMS with Twilio.', 'wc-serial-numbers' ), - __( 'Option to sell license keys even if there are no available keys in the stock.', 'wc-serial-numbers' ), + __( 'Support for bulk import/export of keys from/to CSV.', 'wc-serial-numbers' ), + __( 'Send keys via SMS with Twilio.', 'wc-serial-numbers' ), + __( 'Option to sell keys even if there are no available keys in the stock.', 'wc-serial-numbers' ), __( 'Custom deliverable quantity to deliver multiple keys with a single product.', 'wc-serial-numbers' ), __( 'Manual delivery option to manually deliver license keys instead of automatic.', 'wc-serial-numbers' ), - __( 'Email Template to easily and quickly customize the order confirmation & low stock alert email.', 'wc-serial-numbers' ), + __( 'Email template to easily and quickly customize the order confirmation & low stock alert email.', 'wc-serial-numbers' ), __( 'Many more ...', 'wc-serial-numbers' ), ); ?> @@ -187,7 +187,7 @@ protected function output_premium_widget() { public function output_tabs( $tabs ) { parent::output_tabs( $tabs ); if ( WCSN()->get_docs_url() ) { - echo sprintf( '%s', WCSN()->get_docs_url(), __( 'Documentation', 'wc-serial-numbers' ) ); + printf( '%s', esc_url( WCSN()->get_docs_url() ), esc_html__( 'Documentation', 'wc-serial-numbers' ) ); } } } diff --git a/src/Admin/views/html-edit-key.php b/src/Admin/views/html-edit-key.php index d99d676f..e018c16a 100644 --- a/src/Admin/views/html-edit-key.php +++ b/src/Admin/views/html-edit-key.php @@ -39,7 +39,7 @@ $option ) : ?> - %s', esc_attr( $status ), selected( $key->get_status(), $status, false ), esc_html( $option ) ); ?> + %s', esc_attr( $status ), selected( $key->get_status(), $status, false ), esc_html( $option ) ); ?>

    @@ -105,7 +105,7 @@

    + - 1, 'fields' => 'ids', - 'meta_query' => array( + 'meta_query' => array( // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query array( 'key' => '_is_serial_number', 'value' => 'yes', @@ -245,9 +246,9 @@ public function activation_form( $atts ) {

    + - %s', esc_url( get_permalink( $line_item['product_id'] ) ), esc_html( get_the_title( $line_item['product_id'] ) ) ); ?> + %s', esc_url( get_permalink( $line_item['product_id'] ) ), esc_html( get_the_title( $line_item['product_id'] ) ) ); ?> @@ -302,7 +302,7 @@ function wcsn_display_order_keys_table( $order, $line_items ) { - %s

    ', apply_filters( 'wc_serial_numbers_pending_notice', esc_html__( 'Order is waiting for serial numbers to be assigned.', 'wc-serial-numbers' ) ) ); ?> + %s

    ', esc_html( apply_filters( 'wc_serial_numbers_pending_notice', __( 'Order is waiting for serial numbers to be assigned.', 'wc-serial-numbers' ) ) ) ); ?> diff --git a/src/Installer.php b/src/Installer.php index cb015d18..39c2cb4d 100644 --- a/src/Installer.php +++ b/src/Installer.php @@ -122,7 +122,7 @@ public static function install() { self::create_tables(); self::create_cron_jobs(); - Admin\Settings::get_instance()->save_defaults(); + Admin\Settings::instance()->save_defaults(); WCSN()->update_db_version( WCSN()->get_version(), false ); add_option( 'wc_serial_numbers_install_date', current_time( 'mysql' ) ); set_transient( 'wc_serial_numbers_activated', true, 30 ); @@ -138,7 +138,7 @@ public static function create_tables() { global $wpdb; $wpdb->hide_errors(); // todo rename table names to wcsn_keys and wcsn_activations. - $tables = [ + $tables = array( "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}serial_numbers( id bigint(20) NOT NULL AUTO_INCREMENT, serial_key longtext DEFAULT NULL, @@ -173,7 +173,7 @@ public static function create_tables() { PRIMARY KEY (id), key serial_id (serial_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;", - ]; + ); require_once ABSPATH . 'wp-admin/includes/upgrade.php'; foreach ( $tables as $table ) { @@ -238,23 +238,22 @@ protected function update_120() { } global $wpdb; - $prefix = $wpdb->prefix; - $wpdb->query( "RENAME TABLE `{$prefix}wcsn_serial_numbers` TO `{$prefix}serial_numbers`" ); - $wpdb->query( "RENAME TABLE `{$prefix}wcsn_activations` TO `{$prefix}serial_numbers_activations`" ); - - $wpdb->query( "ALTER TABLE {$prefix}serial_numbers DROP COLUMN `serial_image`;" ); - $wpdb->query( "ALTER TABLE {$prefix}serial_numbers DROP COLUMN `activation_email`;" ); - $wpdb->query( "ALTER TABLE {$prefix}serial_numbers CHANGE `created` `created_date` DATETIME NULL DEFAULT NULL;" ); - $wpdb->query( "ALTER TABLE {$prefix}serial_numbers ADD vendor_id bigint(20) NOT NULL DEFAULT 0" ); - $wpdb->query( "ALTER TABLE {$prefix}serial_numbers ADD activation_count int(9) NOT NULL DEFAULT 0" ); - $wpdb->query( "ALTER TABLE {$prefix}serial_numbers ADD KEY vendor_id(`vendor_id`)" ); - $wpdb->query( "ALTER TABLE {$prefix}serial_numbers ADD source varchar(200) NOT NULL default 'custom_source'" ); - $wpdb->query( "ALTER TABLE {$prefix}serial_numbers_activations CHANGE platform platform varchar(200) DEFAULT NULL" ); - // status update - $wpdb->query( $wpdb->prepare( "UPDATE {$prefix}serial_numbers set status=%s WHERE status=%s AND order_id=0", 'available', 'new' ) ); - $wpdb->query( $wpdb->prepare( "UPDATE {$prefix}serial_numbers set status=%s WHERE status=%s AND order_id != 0", 'sold', 'active' ) ); - $wpdb->query( $wpdb->prepare( "UPDATE {$prefix}serial_numbers set status=%s WHERE status=%s", 'cancelled', 'pending' ) ); - $wpdb->query( $wpdb->prepare( "UPDATE {$prefix}serial_numbers set status=%s WHERE status=%s", 'cancelled', 'rejected' ) ); + $wpdb->query( "RENAME TABLE `{$wpdb->prefix}wcsn_serial_numbers` TO `{$wpdb->prefix}serial_numbers`" ); + $wpdb->query( "RENAME TABLE `{$wpdb->prefix}wcsn_activations` TO `{$wpdb->prefix}serial_numbers_activations`" ); + + $wpdb->query( "ALTER TABLE {$wpdb->prefix}serial_numbers DROP COLUMN `serial_image`;" ); + $wpdb->query( "ALTER TABLE {$wpdb->prefix}serial_numbers DROP COLUMN `activation_email`;" ); + $wpdb->query( "ALTER TABLE {$wpdb->prefix}serial_numbers CHANGE `created` `created_date` DATETIME NULL DEFAULT NULL;" ); + $wpdb->query( "ALTER TABLE {$wpdb->prefix}serial_numbers ADD vendor_id bigint(20) NOT NULL DEFAULT 0" ); + $wpdb->query( "ALTER TABLE {$wpdb->prefix}serial_numbers ADD activation_count int(9) NOT NULL DEFAULT 0" ); + $wpdb->query( "ALTER TABLE {$wpdb->prefix}serial_numbers ADD KEY vendor_id(`vendor_id`)" ); + $wpdb->query( "ALTER TABLE {$wpdb->prefix}serial_numbers ADD source varchar(200) NOT NULL default 'custom_source'" ); + $wpdb->query( "ALTER TABLE {$wpdb->prefix}serial_numbers_activations CHANGE platform platform varchar(200) DEFAULT NULL" ); + // status update. + $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->prefix}serial_numbers set status=%s WHERE status=%s AND order_id=0", 'available', 'new' ) ); + $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->prefix}serial_numbers set status=%s WHERE status=%s AND order_id != 0", 'sold', 'active' ) ); + $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->prefix}serial_numbers set status=%s WHERE status=%s", 'cancelled', 'pending' ) ); + $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->prefix}serial_numbers set status=%s WHERE status=%s", 'cancelled', 'rejected' ) ); global $current_user; if ( ! empty( $current_user->ID ) && current_user_can( 'manage_options' ) ) { $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->prefix}serial_numbers set vendor_id=%d", $current_user->ID ) ); @@ -268,7 +267,7 @@ protected function update_120() { $wpdb->query( "UPDATE {$wpdb->prefix}serial_numbers set status='available', order_date='0000-00-00 00:00:00', order_id='0' WHERE status !='available' AND order_id='0' AND expire_date='0000-00-00 00:00:00'" ); - // settings update + // settings update. $heading_text = $this->update_1_2_0_get_option( 'heading_text', 'Serial Numbers', 'wsn_delivery_settings' ); $serial_col_heading = $this->update_1_2_0_get_option( 'table_column_heading', 'Serial Number', 'wsn_delivery_settings' ); $serial_key_label = $this->update_1_2_0_get_option( 'serial_key_label', 'Serial Number', 'wsn_delivery_settings' ); @@ -276,33 +275,33 @@ protected function update_120() { $show_validity = 'yes' === $this->update_1_2_0_get_option( 'show_validity', 'yes', 'wsn_delivery_settings' ); $show_activation_limit = 'yes' === $this->update_1_2_0_get_option( 'show_activation_limit', 'yes', 'wsn_delivery_settings' ); $license = get_option( 'woocommerce_serial_numbers_pro_pluginever_license' ); - $options = [ - 'wc_serial_numbers_autocomplete_order' => $this->update_1_2_0_get_option( 'wsn_auto_complete_order', 'yes', 'wsn_delivery_settings' ), - 'wc_serial_numbers_reuse_serial_number' => $this->update_1_2_0_get_option( 'wsn_re_use_serial', 'no', 'wsn_delivery_settings' ), - 'wc_serial_numbers_disable_software_support' => 'no', - 'wc_serial_numbers_manual_delivery' => 'no', - 'wc_serial_numbers_hide_serial_number' => 'yes', - 'wc_serial_numbers_revoke_status_cancelled' => in_array( 'cancelled', $this->update_1_2_0_get_option( 'wsn_revoke_serial_number', [], 'wsn_delivery_settings' ), true ) ? 'yes' : 'no', - 'wc_serial_numbers_revoke_status_refunded' => in_array( 'refunded', $this->update_1_2_0_get_option( 'wsn_revoke_serial_number', [], 'wsn_delivery_settings' ), true ) ? 'yes' : 'no', - 'wc_serial_numbers_revoke_status_failed' => in_array( 'failed', $this->update_1_2_0_get_option( 'wsn_revoke_serial_number', [], 'wsn_delivery_settings' ), true ) ? 'yes' : 'no', - 'wc_serial_numbers_enable_stock_notification' => $this->update_1_2_0_get_option( 'wsn_admin_bar_notification_send_email', 'yes', 'wsn_notification_settings' ), - 'wc_serial_numbers_stock_threshold' => $this->update_1_2_0_get_option( 'wsn_admin_bar_notification_number', '5', 'wsn_notification_settings' ), - 'wc_serial_numbers_notification_recipient' => $this->update_1_2_0_get_option( 'wsn_admin_bar_notification_email', get_option( 'admin_email' ), 'wsn_notification_settings' ), - 'wc_serial_numbers_order_table_heading' => $heading_text, + $options = array( + 'wc_serial_numbers_autocomplete_order' => $this->update_1_2_0_get_option( 'wsn_auto_complete_order', 'yes', 'wsn_delivery_settings' ), + 'wc_serial_numbers_reuse_serial_number' => $this->update_1_2_0_get_option( 'wsn_re_use_serial', 'no', 'wsn_delivery_settings' ), + 'wc_serial_numbers_disable_software_support' => 'no', + 'wc_serial_numbers_manual_delivery' => 'no', + 'wc_serial_numbers_hide_serial_number' => 'yes', + 'wc_serial_numbers_revoke_status_cancelled' => in_array( 'cancelled', $this->update_1_2_0_get_option( 'wsn_revoke_serial_number', array(), 'wsn_delivery_settings' ), true ) ? 'yes' : 'no', + 'wc_serial_numbers_revoke_status_refunded' => in_array( 'refunded', $this->update_1_2_0_get_option( 'wsn_revoke_serial_number', array(), 'wsn_delivery_settings' ), true ) ? 'yes' : 'no', + 'wc_serial_numbers_revoke_status_failed' => in_array( 'failed', $this->update_1_2_0_get_option( 'wsn_revoke_serial_number', array(), 'wsn_delivery_settings' ), true ) ? 'yes' : 'no', + 'wc_serial_numbers_enable_stock_notification' => $this->update_1_2_0_get_option( 'wsn_admin_bar_notification_send_email', 'yes', 'wsn_notification_settings' ), + 'wc_serial_numbers_stock_threshold' => $this->update_1_2_0_get_option( 'wsn_admin_bar_notification_number', '5', 'wsn_notification_settings' ), + 'wc_serial_numbers_notification_recipient' => $this->update_1_2_0_get_option( 'wsn_admin_bar_notification_email', get_option( 'admin_email' ), 'wsn_notification_settings' ), + 'wc_serial_numbers_order_table_heading' => $heading_text, 'wc_serial_numbers_order_table_col_product_label' => 'Product', - 'wc_serial_numbers_order_table_col_key_label' => $serial_key_label, - 'wc_serial_numbers_order_table_col_email_label' => $serial_email_label, - 'wc_serial_numbers_order_table_col_limit_label' => 'Activation Limit', + 'wc_serial_numbers_order_table_col_key_label' => $serial_key_label, + 'wc_serial_numbers_order_table_col_email_label' => $serial_email_label, + 'wc_serial_numbers_order_table_col_limit_label' => 'Activation Limit', 'wc_serial_numbers_order_table_col_expires_label' => 'Expire Date', - 'wc_serial_numbers_order_table_col_product' => 'yes', - 'wc_serial_numbers_order_table_col_key' => 'yes', - 'wc_serial_numbers_order_table_col_email' => 'no', - 'wc_serial_numbers_order_table_col_limit' => $show_activation_limit ? 'yes' : 'no', - 'wc_serial_numbers_order_table_col_expires' => $show_validity ? 'yes' : 'no', - 'wc_serial_numbers_install_time' => get_option( 'woocommerceserialnumbers_install_time' ), - 'woocommerce-serial-numbers-pro_license_key' => array_key_exists( 'key', $license ) ? $license['key'] : '', - 'woocommerce-serial-numbers-pro_license_status' => array_key_exists( 'license', $license ) ? $license['license'] : '', - ]; + 'wc_serial_numbers_order_table_col_product' => 'yes', + 'wc_serial_numbers_order_table_col_key' => 'yes', + 'wc_serial_numbers_order_table_col_email' => 'no', + 'wc_serial_numbers_order_table_col_limit' => $show_activation_limit ? 'yes' : 'no', + 'wc_serial_numbers_order_table_col_expires' => $show_validity ? 'yes' : 'no', + 'wc_serial_numbers_install_time' => get_option( 'woocommerceserialnumbers_install_time' ), + 'woocommerce-serial-numbers-pro_license_key' => array_key_exists( 'key', $license ) ? $license['key'] : '', + 'woocommerce-serial-numbers-pro_license_status' => array_key_exists( 'license', $license ) ? $license['license'] : '', + ); foreach ( $options as $key => $option ) { add_option( $key, $option ); } @@ -312,15 +311,15 @@ protected function update_120() { * Get option from old settings. * * @param string $option_name Option name. - * @param string $default Default value. + * @param string $default_value Default value. * @param string $section Section name. * * @return string */ - protected function update_1_2_0_get_option( $option_name, $default, $section = 'serial_numbers_settings' ) { - $settings = get_option( $section, [] ); + protected function update_1_2_0_get_option( $option_name, $default_value, $section = 'serial_numbers_settings' ) { + $settings = get_option( $section, array() ); - return ! empty( $settings[ $option_name ] ) ? $settings[ $option_name ] : $default; + return ! empty( $settings[ $option_name ] ) ? $settings[ $option_name ] : $default_value; } /** @@ -331,9 +330,8 @@ protected function update_1_2_0_get_option( $option_name, $default, $section = ' */ protected function update_121() { global $wpdb; - $prefix = $wpdb->prefix; - $wpdb->query( "ALTER TABLE {$prefix}serial_numbers CHANGE order_id order_id bigint(20) DEFAULT NULL" ); - $wpdb->query( "ALTER TABLE {$prefix}serial_numbers CHANGE vendor_id vendor_id bigint(20) DEFAULT NULL" ); + $wpdb->query( "ALTER TABLE {$wpdb->prefix}serial_numbers CHANGE order_id order_id bigint(20) DEFAULT NULL" ); + $wpdb->query( "ALTER TABLE {$wpdb->prefix}serial_numbers CHANGE vendor_id vendor_id bigint(20) DEFAULT NULL" ); } /** @@ -347,45 +345,42 @@ protected function update_146() { // Update key status default value to 'available'. // Change key status. // Drop expired column. - $statuses_map = [ + $statuses_map = array( 'refunded' => 'cancelled', 'expired' => 'expired', 'failed' => 'cancelled', 'inactive' => 'sold', - ]; - $prefix = $wpdb->prefix; + ); + foreach ( $statuses_map as $old_status => $new_status ) { - $wpdb->query( $wpdb->prepare( "UPDATE {$prefix}serial_numbers SET status = %s WHERE status = %s", $new_status, $old_status ) ); + $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->prefix}serial_numbers SET status = %s WHERE status = %s", $new_status, $old_status ) ); } - $wpdb->query( "ALTER TABLE {$prefix}serial_numbers DROP expire_date" ); + $wpdb->query( "ALTER TABLE {$wpdb->prefix}serial_numbers DROP expire_date" ); // Remove all inactive activations. - $wpdb->query( "DELETE FROM {$prefix}serial_numbers_activations WHERE active = 0" ); + $wpdb->query( "DELETE FROM {$wpdb->prefix}serial_numbers_activations WHERE active = 0" ); // Drop active column. - $wpdb->query( "ALTER TABLE {$prefix}serial_numbers_activations DROP active" ); + $wpdb->query( "ALTER TABLE {$wpdb->prefix}serial_numbers_activations DROP active" ); } /** * Update to version 1.5.6 * * @since 1.5.6 - * @return bool */ protected function update_156() { global $wpdb; - $prefix = $wpdb->prefix; // if order_item_id column not exist then add it. - if ( ! $wpdb->get_var( "SHOW COLUMNS FROM {$prefix}serial_numbers LIKE 'order_item_id'" ) ) { - $wpdb->query( "ALTER TABLE {$prefix}serial_numbers ADD order_item_id bigint(20) DEFAULT NULL AFTER order_id" ); - $wpdb->query( "ALTER TABLE {$prefix}serial_numbers ADD KEY order_item_id (order_item_id)" ); + if ( ! $wpdb->get_var( "SHOW COLUMNS FROM {$wpdb->prefix}serial_numbers LIKE 'order_item_id'" ) ) { + $wpdb->query( "ALTER TABLE {$wpdb->prefix}serial_numbers ADD order_item_id bigint(20) DEFAULT NULL AFTER order_id" ); + $wpdb->query( "ALTER TABLE {$wpdb->prefix}serial_numbers ADD KEY order_item_id (order_item_id)" ); } // if uuid column not exist then add it. - if ( ! $wpdb->get_var( "SHOW COLUMNS FROM {$prefix}serial_numbers LIKE 'uuid'" ) ) { - $wpdb->query( "ALTER TABLE {$prefix}serial_numbers ADD uuid varchar(50) DEFAULT NULL AFTER order_item_id" ); - $wpdb->query( "ALTER TABLE {$prefix}serial_numbers ADD UNIQUE KEY uuid (uuid)" ); - $wpdb->query( "UPDATE {$prefix}serial_numbers SET uuid = UUID()" ); + if ( ! $wpdb->get_var( "SHOW COLUMNS FROM {$wpdb->prefix}serial_numbers LIKE 'uuid'" ) ) { + $wpdb->query( "ALTER TABLE {$wpdb->prefix}serial_numbers ADD uuid varchar(50) DEFAULT NULL AFTER order_item_id" ); + $wpdb->query( "ALTER TABLE {$wpdb->prefix}serial_numbers ADD UNIQUE KEY uuid (uuid)" ); + $wpdb->query( "UPDATE {$wpdb->prefix}serial_numbers SET uuid = UUID()" ); } - } } diff --git a/src/Models/Activation.php b/src/Models/Activation.php index 68672de6..b4328b24 100644 --- a/src/Models/Activation.php +++ b/src/Models/Activation.php @@ -295,5 +295,4 @@ protected function prepare_where_query( $clauses, $args = array() ) { return $clauses; } - } diff --git a/src/Models/Key.php b/src/Models/Key.php index 5607c0e5..77c09881 100644 --- a/src/Models/Key.php +++ b/src/Models/Key.php @@ -534,6 +534,7 @@ public function save() { return parent::save(); } + /* |-------------------------------------------------------------------------- | Query Methods @@ -760,7 +761,7 @@ public function get_expire_date() { $expiry_date = strtotime( "+{$validity} days", strtotime( $order_date ) ); - return date( 'Y-m-d H:i:s', $expiry_date ); + return wp_date( 'Y-m-d H:i:s', $expiry_date ); } /** @@ -772,10 +773,8 @@ public function get_expire_date() { */ public function recount_remaining_activation() { $count = $this->get_activations( array( 'count' => true ) ); - if ( $count != $this->get_activation_count() ) { - $this->set_activation_count( $count ); - $this->save(); - } + $this->set_activation_count( $count ); + $this->save(); return $count; } @@ -833,6 +832,8 @@ public function get_activations( $args = array() ) { /** * Display the serial key. * + * @param bool $masked Whether to mask the key or not. + * * @since 1.5.0 * @return string */ diff --git a/src/Orders.php b/src/Orders.php index a059048a..f837320c 100644 --- a/src/Orders.php +++ b/src/Orders.php @@ -43,28 +43,28 @@ public function __construct() { * @return void */ public static function validate_checkout() { - $car_products = WC()->cart->get_cart_contents(); - foreach ( $car_products as $id => $cart_product ) { - /** @var \WC_Product $product */ + $cart_products = WC()->cart->get_cart_contents(); + foreach ( $cart_products as $id => $cart_product ) { + // @var \WC_Product $product Product object. $product = $cart_product['data']; $product_id = $product->get_id(); $quantity = $cart_product['quantity']; - $allow_backorder = apply_filters( 'wc_serial_numbers_allow_backorder', false, $product_id ); + $allow_backorder = apply_filters( 'wc_serial_numbers_allow_backorder', false, $product_id, $cart_product ); if ( wcsn_is_product_enabled( $product_id ) && ! $allow_backorder ) { $per_item_quantity = absint( apply_filters( 'wc_serial_numbers_per_product_delivery_qty', 1, $product_id ) ); $needed_quantity = $quantity * ( empty( $per_item_quantity ) ? 1 : absint( $per_item_quantity ) ); $source = apply_filters( 'wc_serial_numbers_product_serial_source', 'custom_source', $product_id, $needed_quantity ); - if ( 'custom_source' == $source ) { + if ( 'custom_source' === $source ) { $args = array( 'product_id' => $product_id, 'status' => 'available', - 'source' => $source, ); $total_found = Key::count( $args ); if ( $total_found < $needed_quantity ) { - $stock = floor( $total_found / $per_item_quantity ); - $message = sprintf( __( 'Sorry, there aren’t enough Serial Keys for %1$s. Please remove this item or lower the quantity. For now, we have %2$s Serial Keys for this product.', 'wc-serial-numbers' ), '{product_title}', '{stock_quantity}' ); + $stock = floor( $total_found / $per_item_quantity ); + // translators: %1$s: product title, %2$s: stock quantity. + $message = sprintf( esc_html__( 'Sorry, there aren’t enough Serial Keys for %1$s. Please remove this item or lower the quantity. For now, we have %2$s Serial Keys for this product.', 'wc-serial-numbers' ), '{product_title}', '{stock_quantity}' ); $notice = apply_filters( 'wc_serial_numbers_low_stock_message', $message ); $notice = str_replace( '{product_title}', $product->get_title(), $notice ); $notice = str_replace( '{stock_quantity}', $stock, $notice ); @@ -83,9 +83,9 @@ public static function validate_checkout() { /** * Automatically set the order's status to complete. * - * @param string $new_order_status - * @param int $order_id - * @param \WC_Order $order + * @param string $new_order_status The new order status. + * @param int $order_id The order ID. + * @param \WC_Order $order The order object. * * @since 1.4.6 * @return string $new_order_status diff --git a/src/Plugin.php b/src/Plugin.php index baf18093..c562220b 100644 --- a/src/Plugin.php +++ b/src/Plugin.php @@ -33,13 +33,7 @@ protected function __construct( $data ) { */ public function includes() { require_once __DIR__ . '/functions.php'; - require_once dirname( __FILE__ ) . '/Deprecated/Functions.php'; - if ( ! class_exists( '\WP_Async_Request', false ) ) { - require_once dirname( __DIR__ ) . '/lib/classes/wp-async-request.php'; - } - if ( ! class_exists( '\WP_Background_Process', false ) ) { - require_once dirname( __DIR__ ) . '/lib/classes/wp-background-process.php'; - } + require_once __DIR__ . '/Deprecated/Functions.php'; } /** diff --git a/src/Utilities/Utilities.php b/src/Utilities/Utilities.php index 7776477a..4dff1c35 100644 --- a/src/Utilities/Utilities.php +++ b/src/Utilities/Utilities.php @@ -2,7 +2,7 @@ namespace WooCommerceSerialNumbers\Utilities; -defined('ABSPATH') || exit; +defined( 'ABSPATH' ) || exit; /** * Class Utilities. diff --git a/src/functions.php b/src/functions.php index 2b29e97c..9f807365 100644 --- a/src/functions.php +++ b/src/functions.php @@ -60,7 +60,7 @@ function wcsn_get_key_statuses() { * @return bool */ function wcsn_is_reusing_keys() { - return 'yes' == get_option( 'wc_serial_numbers_reuse_serial_number', 'no' ); + return 'yes' === get_option( 'wc_serial_numbers_reuse_serial_number', 'no' ); } /** @@ -70,12 +70,12 @@ function wcsn_is_reusing_keys() { * @return array */ function wcsn_get_revoke_statuses() { - $statues = [ + $statues = array( 'cancelled', 'refunded', 'failed', 'pending', - ]; + ); return apply_filters( 'wc_serial_numbers_revoke_statuses', $statues ); } @@ -294,7 +294,7 @@ function wcsn_delete_activation( $activation_id ) { * @return bool True if enabled, false otherwise. */ function wcsn_is_product_enabled( $product_id ) { - return 'yes' == get_post_meta( $product_id, '_is_serial_number', true ); + return 'yes' === get_post_meta( $product_id, '_is_serial_number', true ); } /** @@ -425,14 +425,9 @@ function wcsn_order_get_unfulfilled_items( $order_id ) { if ( $key->get_product_id() !== $line_item['product_id'] ) { continue; } -// todo uncomment this when we will support for order item id. -// if ( $key->get_variation_id() !== $line_item['variation_id'] ) { -// continue; -// } -// if ( $key->get_order_item_id() !== $line_item['order_item_id'] ) { -// continue; -// } - $qty --; + // todo uncomment this when we will support for order item id. + + --$qty; } if ( $qty > 0 ) { $items[] = array_merge( $line_item, array( 'quantity' => $qty ) ); @@ -476,8 +471,7 @@ function wcsn_order_update_keys( $order_id ) { $do_add = apply_filters( 'wc_serial_numbers_add_order_keys', true, $order_id, $line_items, $order_status ); - - if ( in_array( $order_status, [ 'processing', 'completed' ], true ) && ! wcsn_order_is_fullfilled( $order_id ) && $do_add ) { + if ( in_array( $order_status, array( 'processing', 'completed' ), true ) && ! wcsn_order_is_fullfilled( $order_id ) && $do_add ) { /** * Action hook to pre add order keys. @@ -495,11 +489,13 @@ function wcsn_order_update_keys( $order_id ) { continue; } - $delivered_qty = Key::count( array( - 'order_id' => $order_id, - 'product_id' => $item['product_id'], - 'status__not_in' => [ 'cancelled' ], - ) ); + $delivered_qty = Key::count( + array( + 'order_id' => $order_id, + 'product_id' => $item['product_id'], + 'status__not_in' => array( 'cancelled' ), + ) + ); if ( $item['refunded_qty'] >= $item['quantity'] ) { continue; } @@ -515,7 +511,7 @@ function wcsn_order_update_keys( $order_id ) { * @param int $order_id Order ID. * @param int $needed_count Needed count. */ - do_action( 'wc_serial_numbers_pre_add_order_item_eys', $item, $order_id, $needed_count ); + do_action( 'wc_serial_numbers_pre_add_order_item_keys', $item, $order_id, $needed_count ); // Deprecated. use wc_serial_numbers_pre_order_add_keys instead. Will be removed in 1.5.0. apply_filters( 'wc_serial_numbers_pre_order_item_connect_serial_numbers', $item['product_id'], $needed_count, $item['key_source'], $order_id ); @@ -527,7 +523,7 @@ function wcsn_order_update_keys( $order_id ) { 'status' => 'available', 'limit' => $needed_count, 'orderby' => 'id', - 'order' => 'ASC' + 'order' => 'ASC', ) ); if ( count( $keys ) < $needed_count ) { @@ -547,15 +543,17 @@ function wcsn_order_update_keys( $order_id ) { // Assign keys to order. foreach ( $keys as $key ) { - $key->set_data( array( - 'order_id' => $order_id, - 'order_item_id' => $item['order_item_id'], - 'order_date' => $order->get_date_created() ? $order->get_date_created()->format( 'Y-m-d H:i:s' ) : current_time( 'mysql' ), - 'customer_id' => $customer_id, - 'status' => 'sold', - ) ); + $key->set_data( + array( + 'order_id' => $order_id, + 'order_item_id' => $item['order_item_id'], + 'order_date' => $order->get_date_created() ? $order->get_date_created()->format( 'Y-m-d H:i:s' ) : current_time( 'mysql' ), + 'customer_id' => $customer_id, + 'status' => 'sold', + ) + ); if ( ! is_wp_error( $key->save() ) ) { - $added ++; + ++$added; } } @@ -599,10 +597,14 @@ function wcsn_order_update_keys( $order_id ) { if ( $is_expired && 'expired' !== $key->get_status() ) { $key->set_status( 'expired' ); $key->save(); - } elseif ( ! $is_expired && in_array( $order_status, [ + } elseif ( ! $is_expired && in_array( + $order_status, + array( 'processing', - 'complete' - ], true ) && 'sold' !== $key->get_status() ) { + 'complete', + ), + true + ) && 'sold' !== $key->get_status() ) { $key->set_status( 'sold' ); $key->save(); } elseif ( 'on-hold' === $order_status && ! $is_expired && 'pending' !== $key->get_status() ) { @@ -627,8 +629,8 @@ function wcsn_order_update_keys( $order_id ) { /** * Order remove keys. * - * @param int $order_id Order ID. - * @param array $line_items Order line items. + * @param int $order_id Order ID. + * @param int $product_id Product ID. * * @since 1.4.6 * @@ -664,7 +666,7 @@ function wcsn_order_remove_keys( $order_id, $product_id = null ) { foreach ( $keys as $key ) { $props = array( - 'status' => $is_reusing ? 'available' : 'cancelled' + 'status' => $is_reusing ? 'available' : 'cancelled', ); if ( ! $is_reusing ) { $props['order_id'] = 0; @@ -737,7 +739,7 @@ function wcsn_order_replace_key( $order_id, $product_id = null, $key_id = null ) foreach ( $keys as $key ) { $props = array( - 'status' => $is_reusing ? 'available' : 'cancelled' + 'status' => $is_reusing ? 'available' : 'cancelled', ); if ( ! $is_reusing ) { $props['order_id'] = 0; @@ -746,7 +748,7 @@ function wcsn_order_replace_key( $order_id, $product_id = null, $key_id = null ) } $key->set_data( $props ); if ( $key->save() ) { - $replaced ++; + ++$replaced; } } @@ -785,7 +787,7 @@ function wcsn_get_product_title( $product ) { return sprintf( '(#%1$s) %2$s', $product->get_id(), - html_entity_decode( $product->get_formatted_name() ) + wp_strip_all_tags( $product->get_formatted_name() ) ); } @@ -801,13 +803,13 @@ function wcsn_get_product_title( $product ) { */ function wcsn_get_products_query_args() { $args = array( - 'post_type' => [ 'product' ], + 'post_type' => array( 'product' ), 'tax_query' => array( // @codingStandardsIgnoreLine 'relation' => 'OR', array( 'taxonomy' => 'product_type', 'field' => 'slug', - 'terms' => [ 'simple' ], + 'terms' => array( 'simple' ), 'operator' => 'IN', ), ), @@ -819,13 +821,15 @@ function wcsn_get_products_query_args() { /** * Get enabled products. * + * @param array $args Query args. + * * @since 1.4.6 * @return array|int List of products or number of products. */ function wcsn_get_products( $args = array() ) { $args = wp_parse_args( $args, wcsn_get_products_query_args() ); if ( empty( $args['meta_query'] ) ) { - $args['meta_query'] = []; + $args['meta_query'] = array(); // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query } $args['meta_query'][] = array( 'key' => '_is_serial_number', @@ -883,34 +887,41 @@ function wcsn_get_stocks_count( $stock_limit = null, $force = true ) { if ( $force || false === $counts ) { $counts = array(); - $post_ids = wcsn_get_products( array( - 'posts_per_page' => - 1, - 'fields' => 'ids', - 'meta_query' => array( // @codingStandardsIgnoreLine - 'relation' => 'AND', - array( - 'key' => '_serial_key_source', - 'value' => 'custom_source', - 'compare' => '=', - ) - ), - ) ); + $post_ids = wcsn_get_products( + array( + 'posts_per_page' => - 1, + 'fields' => 'ids', + 'meta_query' => array( // @codingStandardsIgnoreLine + 'relation' => 'AND', + array( + 'key' => '_serial_key_source', + 'value' => 'custom_source', + 'compare' => '=', + ), + ), + ) + ); foreach ( $post_ids as $post_id ) { - $counts[ $post_id ] = wcsn_get_keys( [ - 'product_id' => $post_id, - 'status' => 'available', - 'count' => true, - ] ); + $counts[ $post_id ] = wcsn_get_keys( + array( + 'product_id' => $post_id, + 'status' => 'available', + 'count' => true, + ) + ); } set_transient( $transient_key, $counts, 60 * 60 ); } if ( $stock_limit > 0 ) { // get the results where value is equal or less than max. - $counts = array_filter( $counts, function ( $value ) use ( $stock_limit ) { - return $value <= $stock_limit; - } ); + $counts = array_filter( + $counts, + function ( $value ) use ( $stock_limit ) { + return $value <= $stock_limit; + } + ); } return $counts; @@ -1029,8 +1040,8 @@ function wcsn_get_key_display_properties( $key, $context = 'order_details' ) { /** * Filter key properties. * - * @param array $props Key properties. - * @param Key $key Key object. + * @param array $props Key properties. + * @param Key $key Key object. * @param string $context Context. * * @since 1.4.9 @@ -1039,9 +1050,10 @@ function wcsn_get_key_display_properties( $key, $context = 'order_details' ) { usort( $properties, - function( $a, $b ) { + function ( $a, $b ) { $a_priority = isset( $a['priority'] ) ? $a['priority'] : 10; $b_priority = isset( $b['priority'] ) ? $b['priority'] : 10; + return $a_priority - $b_priority; } ); diff --git a/templates/email-stock-notification.php b/templates/email-stock-notification.php index 73eef989..47126236 100644 --- a/templates/email-stock-notification.php +++ b/templates/email-stock-notification.php @@ -4,7 +4,9 @@ * * @since 1.2.0 * @package WooCommerceSerialNumbers + * @var array $low_stock_products List of low stock products. */ + ?> @@ -20,11 +22,21 @@ } $product = wc_get_product( $product_id ); - echo sprintf( "
  • %s - Stock %s
  • ", get_edit_post_link( $product->get_id() ), $product->get_formatted_name(), $stock ); + printf( "
  • %s - Stock %s
  • ", esc_url( get_edit_post_link( $product->get_id() ) ), esc_html( $product->get_formatted_name() ), esc_html( $stock ) ); } ?>

    -

    Serial Numbers for WooCommerce', 'wc-serial-numbers' ), 'https://pluginever.com/plugins/woocommerce-serial-numbers-pro/?utm_source=serialnumberemail&utm_medium=email&utm_campaign=lowstocknotification' ); ?>

    +

    + Serial Numbers for WooCommerce', 'wc-serial-numbers' ), + 'https://pluginever.com/plugins/woocommerce-serial-numbers-pro/?utm_source=serialnumberemail&utm_medium=email&utm_campaign=lowstocknotification' + ) + ); + ?> +

    diff --git a/templates/emails/email-keys.php b/templates/emails/email-keys.php deleted file mode 100644 index b3d9bbc7..00000000 --- a/templates/emails/email-keys.php +++ /dev/null @@ -1 +0,0 @@ - __FILE__, 'settings_url' => admin_url( 'admin.php?page=wc-serial-numbers-settings' ),