diff --git a/composer.json b/composer.json
index 131dec8..8350b7f 100644
--- a/composer.json
+++ b/composer.json
@@ -28,10 +28,13 @@
"prinx/array-utils": "^0.0",
"prinx/os-utils": "^0.0",
"psy/psysh": "^0.10",
- "illuminate/database": "^8.11"
+ "illuminate/database": "^8.11",
+ "symfony/finder": "^5.2",
+ "peppeocchi/php-cron-scheduler": "^4.0"
},
"require-dev": {
- "phpunit/phpunit": "^9.2"
+ "phpunit/phpunit": "^9.2",
+ "nunomaduro/collision": "^5.4"
},
"config": {
"optimize-autoloader": true
@@ -44,4 +47,4 @@
"Rejoice\\": "src/"
}
}
-}
\ No newline at end of file
+}
diff --git a/composer.lock b/composer.lock
new file mode 100644
index 0000000..701d3d5
--- /dev/null
+++ b/composer.lock
@@ -0,0 +1,4568 @@
+{
+ "_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": "916779caa8c3abde82178cf219e384de",
+ "packages": [
+ {
+ "name": "doctrine/inflector",
+ "version": "2.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/inflector.git",
+ "reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/inflector/zipball/9cf661f4eb38f7c881cac67c75ea9b00bf97b210",
+ "reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^7.0",
+ "phpstan/phpstan": "^0.11",
+ "phpstan/phpstan-phpunit": "^0.11",
+ "phpstan/phpstan-strict-rules": "^0.11",
+ "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "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.x"
+ },
+ "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": "2020-05-29T15:13:26+00:00"
+ },
+ {
+ "name": "dragonmantank/cron-expression",
+ "version": "v3.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/dragonmantank/cron-expression.git",
+ "reference": "7a8c6e56ab3ffcc538d05e8155bb42269abf1a0c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/7a8c6e56ab3ffcc538d05e8155bb42269abf1a0c",
+ "reference": "7a8c6e56ab3ffcc538d05e8155bb42269abf1a0c",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2|^8.0",
+ "webmozart/assert": "^1.7.0"
+ },
+ "replace": {
+ "mtdowling/cron-expression": "^1.0"
+ },
+ "require-dev": {
+ "phpstan/extension-installer": "^1.0",
+ "phpstan/phpstan": "^0.12",
+ "phpstan/phpstan-webmozart-assert": "^0.12.7",
+ "phpunit/phpunit": "^7.0|^8.0|^9.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Cron\\": "src/Cron/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Chris Tankersley",
+ "email": "chris@ctankersley.com",
+ "homepage": "https://github.com/dragonmantank"
+ }
+ ],
+ "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due",
+ "keywords": [
+ "cron",
+ "schedule"
+ ],
+ "support": {
+ "issues": "https://github.com/dragonmantank/cron-expression/issues",
+ "source": "https://github.com/dragonmantank/cron-expression/tree/v3.1.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/dragonmantank",
+ "type": "github"
+ }
+ ],
+ "time": "2020-11-24T19:55:57+00:00"
+ },
+ {
+ "name": "illuminate/collections",
+ "version": "v8.37.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/illuminate/collections.git",
+ "reference": "591e31015a8b0731708c54411cb52d50a00b2bc3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/illuminate/collections/zipball/591e31015a8b0731708c54411cb52d50a00b2bc3",
+ "reference": "591e31015a8b0731708c54411cb52d50a00b2bc3",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/contracts": "^8.0",
+ "illuminate/macroable": "^8.0",
+ "php": "^7.3|^8.0"
+ },
+ "suggest": {
+ "symfony/var-dumper": "Required to use the dump method (^5.1.4)."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "8.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Illuminate\\Support\\": ""
+ },
+ "files": [
+ "helpers.php"
+ ]
+ },
+ "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": "2021-04-01T13:26:52+00:00"
+ },
+ {
+ "name": "illuminate/container",
+ "version": "v8.37.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/illuminate/container.git",
+ "reference": "0e38ee1632d470e56aece0079e6e22d13e6bea8e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/illuminate/container/zipball/0e38ee1632d470e56aece0079e6e22d13e6bea8e",
+ "reference": "0e38ee1632d470e56aece0079e6e22d13e6bea8e",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/contracts": "^8.0",
+ "php": "^7.3|^8.0",
+ "psr/container": "^1.0"
+ },
+ "provide": {
+ "psr/container-implementation": "1.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "8.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Illuminate\\Container\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "The Illuminate Container package.",
+ "homepage": "https://laravel.com",
+ "support": {
+ "issues": "https://github.com/laravel/framework/issues",
+ "source": "https://github.com/laravel/framework"
+ },
+ "time": "2021-03-16T19:42:20+00:00"
+ },
+ {
+ "name": "illuminate/contracts",
+ "version": "v8.37.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/illuminate/contracts.git",
+ "reference": "5764f703ea8f74ced163125d810951cd5ef2b7e1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/illuminate/contracts/zipball/5764f703ea8f74ced163125d810951cd5ef2b7e1",
+ "reference": "5764f703ea8f74ced163125d810951cd5ef2b7e1",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.3|^8.0",
+ "psr/container": "^1.0",
+ "psr/simple-cache": "^1.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "8.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": "2021-04-01T13:09:31+00:00"
+ },
+ {
+ "name": "illuminate/database",
+ "version": "v8.37.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/illuminate/database.git",
+ "reference": "a9d9c78c705bc64e92a61c33453ebbcad6dd5f29"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/illuminate/database/zipball/a9d9c78c705bc64e92a61c33453ebbcad6dd5f29",
+ "reference": "a9d9c78c705bc64e92a61c33453ebbcad6dd5f29",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "illuminate/collections": "^8.0",
+ "illuminate/container": "^8.0",
+ "illuminate/contracts": "^8.0",
+ "illuminate/macroable": "^8.0",
+ "illuminate/support": "^8.0",
+ "php": "^7.3|^8.0",
+ "symfony/console": "^5.1.4"
+ },
+ "suggest": {
+ "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.6|^3.0).",
+ "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).",
+ "illuminate/console": "Required to use the database commands (^8.0).",
+ "illuminate/events": "Required to use the observers with Eloquent (^8.0).",
+ "illuminate/filesystem": "Required to use the migrations (^8.0).",
+ "illuminate/pagination": "Required to paginate the result set (^8.0).",
+ "symfony/finder": "Required to use Eloquent model factories (^5.1.4)."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "8.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Illuminate\\Database\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "The Illuminate Database package.",
+ "homepage": "https://laravel.com",
+ "keywords": [
+ "database",
+ "laravel",
+ "orm",
+ "sql"
+ ],
+ "support": {
+ "issues": "https://github.com/laravel/framework/issues",
+ "source": "https://github.com/laravel/framework"
+ },
+ "time": "2021-04-13T13:40:36+00:00"
+ },
+ {
+ "name": "illuminate/macroable",
+ "version": "v8.37.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/illuminate/macroable.git",
+ "reference": "300aa13c086f25116b5f3cde3ca54ff5c822fb05"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/illuminate/macroable/zipball/300aa13c086f25116b5f3cde3ca54ff5c822fb05",
+ "reference": "300aa13c086f25116b5f3cde3ca54ff5c822fb05",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.3|^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "8.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": "2020-10-27T15:20:30+00:00"
+ },
+ {
+ "name": "illuminate/support",
+ "version": "v8.37.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/illuminate/support.git",
+ "reference": "074a9b7adefcdd7108e19faa96bc9dacfe922062"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/illuminate/support/zipball/074a9b7adefcdd7108e19faa96bc9dacfe922062",
+ "reference": "074a9b7adefcdd7108e19faa96bc9dacfe922062",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/inflector": "^1.4|^2.0",
+ "ext-json": "*",
+ "ext-mbstring": "*",
+ "illuminate/collections": "^8.0",
+ "illuminate/contracts": "^8.0",
+ "illuminate/macroable": "^8.0",
+ "nesbot/carbon": "^2.31",
+ "php": "^7.3|^8.0",
+ "voku/portable-ascii": "^1.4.8"
+ },
+ "conflict": {
+ "tightenco/collect": "<5.5.33"
+ },
+ "suggest": {
+ "illuminate/filesystem": "Required to use the composer class (^8.0).",
+ "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^1.3).",
+ "ramsey/uuid": "Required to use Str::uuid() (^4.0).",
+ "symfony/process": "Required to use the composer class (^5.1.4).",
+ "symfony/var-dumper": "Required to use the dd function (^5.1.4).",
+ "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.2)."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "8.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Illuminate\\Support\\": ""
+ },
+ "files": [
+ "helpers.php"
+ ]
+ },
+ "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": "2021-04-11T23:26:41+00:00"
+ },
+ {
+ "name": "nesbot/carbon",
+ "version": "2.46.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/briannesbitt/Carbon.git",
+ "reference": "2fd2c4a77d58a4e95234c8a61c5df1f157a91bf4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/2fd2c4a77d58a4e95234c8a61c5df1f157a91bf4",
+ "reference": "2fd2c4a77d58a4e95234c8a61c5df1f157a91bf4",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "php": "^7.1.8 || ^8.0",
+ "symfony/polyfill-mbstring": "^1.0",
+ "symfony/translation": "^3.4 || ^4.0 || ^5.0"
+ },
+ "require-dev": {
+ "doctrine/orm": "^2.7",
+ "friendsofphp/php-cs-fixer": "^2.14 || ^3.0",
+ "kylekatarnls/multi-tester": "^2.0",
+ "phpmd/phpmd": "^2.9",
+ "phpstan/extension-installer": "^1.0",
+ "phpstan/phpstan": "^0.12.54",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.14",
+ "squizlabs/php_codesniffer": "^3.4"
+ },
+ "bin": [
+ "bin/carbon"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev",
+ "dev-3.x": "3.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": "http://nesbot.com"
+ },
+ {
+ "name": "kylekatarnls",
+ "homepage": "http://github.com/kylekatarnls"
+ }
+ ],
+ "description": "An API extension for DateTime that supports 281 different languages.",
+ "homepage": "http://carbon.nesbot.com",
+ "keywords": [
+ "date",
+ "datetime",
+ "time"
+ ],
+ "support": {
+ "issues": "https://github.com/briannesbitt/Carbon/issues",
+ "source": "https://github.com/briannesbitt/Carbon"
+ },
+ "funding": [
+ {
+ "url": "https://opencollective.com/Carbon",
+ "type": "open_collective"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-02-24T17:30:44+00:00"
+ },
+ {
+ "name": "nikic/php-parser",
+ "version": "v4.10.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/c6d052fc58cb876152f89f532b95a8d7907e7f0e",
+ "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e",
+ "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.10.4"
+ },
+ "time": "2020-12-20T10:01:03+00:00"
+ },
+ {
+ "name": "peppeocchi/php-cron-scheduler",
+ "version": "v4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/peppeocchi/php-cron-scheduler.git",
+ "reference": "0acfa032e60f0ea22a27b96a6b15a673a31d3448"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/peppeocchi/php-cron-scheduler/zipball/0acfa032e60f0ea22a27b96a6b15a673a31d3448",
+ "reference": "0acfa032e60f0ea22a27b96a6b15a673a31d3448",
+ "shasum": ""
+ },
+ "require": {
+ "dragonmantank/cron-expression": "^3.0",
+ "php": "^7.3 || ^8.0"
+ },
+ "require-dev": {
+ "php-coveralls/php-coveralls": "^2.4",
+ "phpunit/phpunit": "~9.5",
+ "swiftmailer/swiftmailer": "~5.4 || ^6.0"
+ },
+ "suggest": {
+ "swiftmailer/swiftmailer": "Required to send the output of a job to email address/es (~5.4 || ^6.0)."
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "GO\\": "src/GO/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Giuseppe Occhipinti",
+ "email": "peppeocchi@gmail.com"
+ },
+ {
+ "name": "Carsten Windler",
+ "email": "carsten@carstenwindler.de",
+ "homepage": "http://carstenwindler.de",
+ "role": "Contributor"
+ }
+ ],
+ "description": "PHP Cron Job Scheduler",
+ "keywords": [
+ "cron job",
+ "scheduler"
+ ],
+ "support": {
+ "issues": "https://github.com/peppeocchi/php-cron-scheduler/issues",
+ "source": "https://github.com/peppeocchi/php-cron-scheduler/tree/v4.0"
+ },
+ "time": "2021-04-22T21:32:03+00:00"
+ },
+ {
+ "name": "prinx/array-utils",
+ "version": "v0.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/prinx/php-array-utils.git",
+ "reference": "b3834cfa24f40c6e283b8dfda81515a513a0ed2a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/prinx/php-array-utils/zipball/b3834cfa24f40c6e283b8dfda81515a513a0ed2a",
+ "reference": "b3834cfa24f40c6e283b8dfda81515a513a0ed2a",
+ "shasum": ""
+ },
+ "require-dev": {
+ "phpunit/phpunit": "9.2.5"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Prinx\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Prince Dorcis",
+ "email": "princedorcis@gmail.com"
+ }
+ ],
+ "description": "PHP arrays utility class",
+ "support": {
+ "issues": "https://github.com/prinx/php-array-utils/issues",
+ "source": "https://github.com/prinx/php-array-utils/tree/v0.0.2"
+ },
+ "time": "2020-10-22T13:25:47+00:00"
+ },
+ {
+ "name": "prinx/dir-dot-config",
+ "version": "v0.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/prinx/php-dir-dot-config.git",
+ "reference": "d63540f7df8c7e9e67e39add8cea296c90bbc183"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/prinx/php-dir-dot-config/zipball/d63540f7df8c7e9e67e39add8cea296c90bbc183",
+ "reference": "d63540f7df8c7e9e67e39add8cea296c90bbc183",
+ "shasum": ""
+ },
+ "require": {
+ "prinx/array-utils": "^0.0.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "9.2.5"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Prinx\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Prince Dorcis",
+ "email": "princedorcis@gmail.com"
+ }
+ ],
+ "description": "Retrieve configuration from files in configuration directory.",
+ "support": {
+ "issues": "https://github.com/prinx/php-dir-dot-config/issues",
+ "source": "https://github.com/prinx/php-dir-dot-config/tree/v0.0.3"
+ },
+ "time": "2020-10-22T15:30:21+00:00"
+ },
+ {
+ "name": "prinx/dotenv",
+ "version": "v0.4.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/prinx/dotenv.git",
+ "reference": "3a36a10035ba319ebc08bdbdbc0dbddce9d556d1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/prinx/dotenv/zipball/3a36a10035ba319ebc08bdbdbc0dbddce9d556d1",
+ "reference": "3a36a10035ba319ebc08bdbdbc0dbddce9d556d1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6.0"
+ },
+ "require-dev": {
+ "nunomaduro/collision": "^5.1",
+ "phpunit/phpunit": "^9.4"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/env.php",
+ "src/env_namespaced.php"
+ ],
+ "psr-4": {
+ "Prinx\\Dotenv\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Prince Damien Dorcis-Akpaglo",
+ "email": "princedorcis@gmail.com",
+ "homepage": "https://github.com/prinx",
+ "role": "Maintainer"
+ }
+ ],
+ "description": "Make easy access to the environment variables in your application",
+ "homepage": "https://github.com/prinx/dotenv",
+ "keywords": [
+ "dotenv",
+ "env",
+ "phpdotenv"
+ ],
+ "support": {
+ "issues": "https://github.com/prinx/dotenv/issues",
+ "source": "https://github.com/prinx/dotenv/tree/v0.4.3"
+ },
+ "time": "2020-12-01T11:32:50+00:00"
+ },
+ {
+ "name": "prinx/notify",
+ "version": "v0.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/prinx/notify.git",
+ "reference": "a582a2420b08bc922bb2895c795b880d37ba23d7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/prinx/notify/zipball/a582a2420b08bc922bb2895c795b880d37ba23d7",
+ "reference": "a582a2420b08bc922bb2895c795b880d37ba23d7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6.0"
+ },
+ "require-dev": {
+ "nunomaduro/collision": "^5.1",
+ "phpunit/phpunit": "^9.2.5"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Prinx\\Notify\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Prince Dorcis",
+ "email": "princedorcis@gmail.com",
+ "homepage": "https://prinx.github.io",
+ "role": "Maintainer"
+ }
+ ],
+ "description": "Simple log package",
+ "homepage": "https://github.com/prinx/notify",
+ "support": {
+ "issues": "https://github.com/prinx/notify/issues",
+ "source": "https://github.com/prinx/notify/tree/v0.0.4"
+ },
+ "time": "2020-11-15T11:01:05+00:00"
+ },
+ {
+ "name": "prinx/os-utils",
+ "version": "v0.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/prinx/php-os-utils.git",
+ "reference": "ac1c0ce90d8fced53e7a398a1a67ff50730e0ca0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/prinx/php-os-utils/zipball/ac1c0ce90d8fced53e7a398a1a67ff50730e0ca0",
+ "reference": "ac1c0ce90d8fced53e7a398a1a67ff50730e0ca0",
+ "shasum": ""
+ },
+ "require": {
+ "prinx/string-utils": "^0.0.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "9.2.5"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Prinx\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Prince Dorcis",
+ "email": "princedorcis@gmail.com"
+ }
+ ],
+ "description": "Operating system utilities class",
+ "support": {
+ "issues": "https://github.com/prinx/php-os-utils/issues",
+ "source": "https://github.com/prinx/php-os-utils/tree/v0.0.4"
+ },
+ "time": "2020-10-22T15:21:43+00:00"
+ },
+ {
+ "name": "prinx/phputils",
+ "version": "v0.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/prinx/phputils.git",
+ "reference": "84c3ce1483f6c1db6ad3f4532555b452c4f2064a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/prinx/phputils/zipball/84c3ce1483f6c1db6ad3f4532555b452c4f2064a",
+ "reference": "84c3ce1483f6c1db6ad3f4532555b452c4f2064a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.1.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Prinx\\Utils\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Prince Damien Dorcis-Akpaglo",
+ "email": "princedorcis@gmail.com",
+ "homepage": "https://github.com/Prinx",
+ "role": "Developer"
+ }
+ ],
+ "description": "PHP Utilities classes",
+ "homepage": "https://github.com/Prinx/phputils",
+ "keywords": [
+ "php",
+ "utils"
+ ],
+ "support": {
+ "issues": "https://github.com/prinx/phputils/issues",
+ "source": "https://github.com/prinx/phputils/tree/v0.0.3"
+ },
+ "time": "2020-10-22T14:42:29+00:00"
+ },
+ {
+ "name": "prinx/string-utils",
+ "version": "v0.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/prinx/php-string-utils.git",
+ "reference": "475b6a11b709aa0284e2e4f7af7e3a354a725537"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/prinx/php-string-utils/zipball/475b6a11b709aa0284e2e4f7af7e3a354a725537",
+ "reference": "475b6a11b709aa0284e2e4f7af7e3a354a725537",
+ "shasum": ""
+ },
+ "require-dev": {
+ "phpunit/phpunit": "9.2.5"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Prinx\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Prince Dorcis",
+ "email": "princedorcis@gmail.com"
+ }
+ ],
+ "description": "PHP string utility methods",
+ "support": {
+ "issues": "https://github.com/prinx/php-string-utils/issues",
+ "source": "https://github.com/prinx/php-string-utils/tree/v0.0.2"
+ },
+ "time": "2020-10-22T11:43:25+00:00"
+ },
+ {
+ "name": "psr/container",
+ "version": "1.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf",
+ "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.0"
+ },
+ "type": "library",
+ "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/1.1.1"
+ },
+ "time": "2021-03-05T17:36:06+00:00"
+ },
+ {
+ "name": "psr/simple-cache",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/simple-cache.git",
+ "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
+ "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\SimpleCache\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://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/master"
+ },
+ "time": "2017-10-23T01:57:42+00:00"
+ },
+ {
+ "name": "psy/psysh",
+ "version": "v0.10.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/bobthecow/psysh.git",
+ "reference": "e4573f47750dd6c92dca5aee543fa77513cbd8d3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/bobthecow/psysh/zipball/e4573f47750dd6c92dca5aee543fa77513cbd8d3",
+ "reference": "e4573f47750dd6c92dca5aee543fa77513cbd8d3",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "ext-tokenizer": "*",
+ "nikic/php-parser": "~4.0|~3.0|~2.0|~1.3",
+ "php": "^8.0 || ^7.0 || ^5.5.9",
+ "symfony/console": "~5.0|~4.0|~3.0|^2.4.2|~2.3.10",
+ "symfony/var-dumper": "~5.0|~4.0|~3.0|~2.7"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.2",
+ "hoa/console": "3.17.*"
+ },
+ "suggest": {
+ "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)",
+ "ext-pdo-sqlite": "The doc command requires SQLite to work.",
+ "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.",
+ "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history.",
+ "hoa/console": "A pure PHP readline implementation. You'll want this if your PHP install doesn't already support readline or libedit."
+ },
+ "bin": [
+ "bin/psysh"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "0.10.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/functions.php"
+ ],
+ "psr-4": {
+ "Psy\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Justin Hileman",
+ "email": "justin@justinhileman.info",
+ "homepage": "http://justinhileman.com"
+ }
+ ],
+ "description": "An interactive shell for modern PHP.",
+ "homepage": "http://psysh.org",
+ "keywords": [
+ "REPL",
+ "console",
+ "interactive",
+ "shell"
+ ],
+ "support": {
+ "issues": "https://github.com/bobthecow/psysh/issues",
+ "source": "https://github.com/bobthecow/psysh/tree/v0.10.8"
+ },
+ "time": "2021-04-10T16:23:39+00:00"
+ },
+ {
+ "name": "symfony/console",
+ "version": "v5.2.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/console.git",
+ "reference": "35f039df40a3b335ebf310f244cb242b3a83ac8d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/console/zipball/35f039df40a3b335ebf310f244cb242b3a83ac8d",
+ "reference": "35f039df40a3b335ebf310f244cb242b3a83ac8d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php73": "^1.8",
+ "symfony/polyfill-php80": "^1.15",
+ "symfony/service-contracts": "^1.1|^2",
+ "symfony/string": "^5.1"
+ },
+ "conflict": {
+ "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"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/config": "^4.4|^5.0",
+ "symfony/dependency-injection": "^4.4|^5.0",
+ "symfony/event-dispatcher": "^4.4|^5.0",
+ "symfony/lock": "^4.4|^5.0",
+ "symfony/process": "^4.4|^5.0",
+ "symfony/var-dumper": "^4.4|^5.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.2.6"
+ },
+ "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": "2021-03-28T09:42:18+00:00"
+ },
+ {
+ "name": "symfony/finder",
+ "version": "v5.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/finder.git",
+ "reference": "0d639a0943822626290d169965804f79400e6a04"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/0d639a0943822626290d169965804f79400e6a04",
+ "reference": "0d639a0943822626290d169965804f79400e6a04",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5"
+ },
+ "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.2.4"
+ },
+ "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": "2021-02-15T18:55:04+00:00"
+ },
+ {
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.22.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "c6c942b1ac76c82448322025e084cadc56048b4e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/c6c942b1ac76c82448322025e084cadc56048b4e",
+ "reference": "c6c942b1ac76c82448322025e084cadc56048b4e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-ctype": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.22-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Ctype\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "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.22.1"
+ },
+ "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": "2021-01-07T16:49:33+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-grapheme",
+ "version": "v1.22.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
+ "reference": "5601e09b69f26c1828b13b6bb87cb07cddba3170"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/5601e09b69f26c1828b13b6bb87cb07cddba3170",
+ "reference": "5601e09b69f26c1828b13b6bb87cb07cddba3170",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.22-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
+ },
+ "files": [
+ "bootstrap.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": "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.22.1"
+ },
+ "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": "2021-01-22T09:19:47+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-normalizer",
+ "version": "v1.22.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
+ "reference": "43a0283138253ed1d48d352ab6d0bdb3f809f248"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/43a0283138253ed1d48d352ab6d0bdb3f809f248",
+ "reference": "43a0283138253ed1d48d352ab6d0bdb3f809f248",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.22-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ],
+ "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.22.1"
+ },
+ "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": "2021-01-22T09:19:47+00:00"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.22.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "5232de97ee3b75b0360528dae24e73db49566ab1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/5232de97ee3b75b0360528dae24e73db49566ab1",
+ "reference": "5232de97ee3b75b0360528dae24e73db49566ab1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.22-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ },
+ "files": [
+ "bootstrap.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": "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.22.1"
+ },
+ "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": "2021-01-22T09:19:47+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php73",
+ "version": "v1.22.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php73.git",
+ "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/a678b42e92f86eca04b7fa4c0f6f19d097fb69e2",
+ "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.22-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Php73\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ],
+ "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.22.1"
+ },
+ "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": "2021-01-07T16:49:33+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php80",
+ "version": "v1.22.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php80.git",
+ "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dc3063ba22c2a1fd2f45ed856374d79114998f91",
+ "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.22-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Php80\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ],
+ "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.22.1"
+ },
+ "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": "2021-01-07T16:49:33+00:00"
+ },
+ {
+ "name": "symfony/service-contracts",
+ "version": "v2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/service-contracts.git",
+ "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d15da7ba4957ffb8f1747218be9e1a121fd298a1",
+ "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "psr/container": "^1.0"
+ },
+ "suggest": {
+ "symfony/service-implementation": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.2-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/master"
+ },
+ "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": "2020-09-07T11:33:47+00:00"
+ },
+ {
+ "name": "symfony/string",
+ "version": "v5.2.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/string.git",
+ "reference": "ad0bd91bce2054103f5eaa18ebeba8d3bc2a0572"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/string/zipball/ad0bd91bce2054103f5eaa18ebeba8d3bc2a0572",
+ "reference": "ad0bd91bce2054103f5eaa18ebeba8d3bc2a0572",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-intl-grapheme": "~1.0",
+ "symfony/polyfill-intl-normalizer": "~1.0",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php80": "~1.15"
+ },
+ "require-dev": {
+ "symfony/error-handler": "^4.4|^5.0",
+ "symfony/http-client": "^4.4|^5.0",
+ "symfony/translation-contracts": "^1.1|^2",
+ "symfony/var-exporter": "^4.4|^5.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\String\\": ""
+ },
+ "files": [
+ "Resources/functions.php"
+ ],
+ "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/v5.2.6"
+ },
+ "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": "2021-03-17T17:12:15+00:00"
+ },
+ {
+ "name": "symfony/translation",
+ "version": "v5.2.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/translation.git",
+ "reference": "2cc7f45d96db9adfcf89adf4401d9dfed509f4e1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/translation/zipball/2cc7f45d96db9adfcf89adf4401d9dfed509f4e1",
+ "reference": "2cc7f45d96db9adfcf89adf4401d9dfed509f4e1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php80": "^1.15",
+ "symfony/translation-contracts": "^2.3"
+ },
+ "conflict": {
+ "symfony/config": "<4.4",
+ "symfony/dependency-injection": "<5.0",
+ "symfony/http-kernel": "<5.0",
+ "symfony/twig-bundle": "<5.0",
+ "symfony/yaml": "<4.4"
+ },
+ "provide": {
+ "symfony/translation-implementation": "2.3"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/config": "^4.4|^5.0",
+ "symfony/console": "^4.4|^5.0",
+ "symfony/dependency-injection": "^5.0",
+ "symfony/finder": "^4.4|^5.0",
+ "symfony/http-kernel": "^5.0",
+ "symfony/intl": "^4.4|^5.0",
+ "symfony/service-contracts": "^1.1.2|^2",
+ "symfony/yaml": "^4.4|^5.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/v5.2.6"
+ },
+ "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": "2021-03-23T19:33:48+00:00"
+ },
+ {
+ "name": "symfony/translation-contracts",
+ "version": "v2.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/translation-contracts.git",
+ "reference": "e2eaa60b558f26a4b0354e1bbb25636efaaad105"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/e2eaa60b558f26a4b0354e1bbb25636efaaad105",
+ "reference": "e2eaa60b558f26a4b0354e1bbb25636efaaad105",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5"
+ },
+ "suggest": {
+ "symfony/translation-implementation": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.3-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/v2.3.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": "2020-09-28T13:05:58+00:00"
+ },
+ {
+ "name": "symfony/var-dumper",
+ "version": "v5.2.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/var-dumper.git",
+ "reference": "89412a68ea2e675b4e44f260a5666729f77f668e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/89412a68ea2e675b4e44f260a5666729f77f668e",
+ "reference": "89412a68ea2e675b4e44f260a5666729f77f668e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php80": "^1.15"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<5.4.3",
+ "symfony/console": "<4.4"
+ },
+ "require-dev": {
+ "ext-iconv": "*",
+ "symfony/console": "^4.4|^5.0",
+ "symfony/process": "^4.4|^5.0",
+ "twig/twig": "^2.13|^3.0.4"
+ },
+ "suggest": {
+ "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).",
+ "ext-intl": "To show region name in time zone dump",
+ "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script"
+ },
+ "bin": [
+ "Resources/bin/var-dump-server"
+ ],
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/functions/dump.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\VarDumper\\": ""
+ },
+ "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 mechanisms for walking through any arbitrary PHP variable",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "debug",
+ "dump"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/var-dumper/tree/v5.2.6"
+ },
+ "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": "2021-03-28T09:42:18+00:00"
+ },
+ {
+ "name": "voku/portable-ascii",
+ "version": "1.5.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/voku/portable-ascii.git",
+ "reference": "80953678b19901e5165c56752d087fc11526017c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/voku/portable-ascii/zipball/80953678b19901e5165c56752d087fc11526017c",
+ "reference": "80953678b19901e5165c56752d087fc11526017c",
+ "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/1.5.6"
+ },
+ "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": "2020-11-12T00:07:28+00:00"
+ },
+ {
+ "name": "webmozart/assert",
+ "version": "1.10.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozarts/assert.git",
+ "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25",
+ "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0",
+ "symfony/polyfill-ctype": "^1.8"
+ },
+ "conflict": {
+ "phpstan/phpstan": "<0.12.20",
+ "vimeo/psalm": "<4.6.1 || 4.6.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^8.5.13"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.10-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Webmozart\\Assert\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Assertions to validate method input/output with nice error messages.",
+ "keywords": [
+ "assert",
+ "check",
+ "validate"
+ ],
+ "support": {
+ "issues": "https://github.com/webmozarts/assert/issues",
+ "source": "https://github.com/webmozarts/assert/tree/1.10.0"
+ },
+ "time": "2021-03-09T10:59:23+00:00"
+ }
+ ],
+ "packages-dev": [
+ {
+ "name": "doctrine/instantiator",
+ "version": "1.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b",
+ "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^8.0",
+ "ext-pdo": "*",
+ "ext-phar": "*",
+ "phpbench/phpbench": "^0.13 || 1.0.0-alpha2",
+ "phpstan/phpstan": "^0.12",
+ "phpstan/phpstan-phpunit": "^0.12",
+ "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0"
+ },
+ "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.4.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": "2020-11-10T18:47:58+00:00"
+ },
+ {
+ "name": "facade/ignition-contracts",
+ "version": "1.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/facade/ignition-contracts.git",
+ "reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/facade/ignition-contracts/zipball/3c921a1cdba35b68a7f0ccffc6dffc1995b18267",
+ "reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.3|^8.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^v2.15.8",
+ "phpunit/phpunit": "^9.3.11",
+ "vimeo/psalm": "^3.17.1"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Facade\\IgnitionContracts\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Freek Van der Herten",
+ "email": "freek@spatie.be",
+ "homepage": "https://flareapp.io",
+ "role": "Developer"
+ }
+ ],
+ "description": "Solution contracts for Ignition",
+ "homepage": "https://github.com/facade/ignition-contracts",
+ "keywords": [
+ "contracts",
+ "flare",
+ "ignition"
+ ],
+ "support": {
+ "issues": "https://github.com/facade/ignition-contracts/issues",
+ "source": "https://github.com/facade/ignition-contracts/tree/1.0.2"
+ },
+ "time": "2020-10-16T08:27:54+00:00"
+ },
+ {
+ "name": "filp/whoops",
+ "version": "2.12.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/filp/whoops.git",
+ "reference": "d501fd2658d55491a2295ff600ae5978eaad7403"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/filp/whoops/zipball/d501fd2658d55491a2295ff600ae5978eaad7403",
+ "reference": "d501fd2658d55491a2295ff600ae5978eaad7403",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5.9 || ^7.0 || ^8.0",
+ "psr/log": "^1.0.1"
+ },
+ "require-dev": {
+ "mockery/mockery": "^0.9 || ^1.0",
+ "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3",
+ "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0"
+ },
+ "suggest": {
+ "symfony/var-dumper": "Pretty print complex values better with var-dumper available",
+ "whoops/soap": "Formats errors as SOAP responses"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.7-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Whoops\\": "src/Whoops/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Filipe Dobreira",
+ "homepage": "https://github.com/filp",
+ "role": "Developer"
+ }
+ ],
+ "description": "php error handling for cool kids",
+ "homepage": "https://filp.github.io/whoops/",
+ "keywords": [
+ "error",
+ "exception",
+ "handling",
+ "library",
+ "throwable",
+ "whoops"
+ ],
+ "support": {
+ "issues": "https://github.com/filp/whoops/issues",
+ "source": "https://github.com/filp/whoops/tree/2.12.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/denis-sokolov",
+ "type": "github"
+ }
+ ],
+ "time": "2021-03-30T12:00:00+00:00"
+ },
+ {
+ "name": "myclabs/deep-copy",
+ "version": "1.10.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/myclabs/DeepCopy.git",
+ "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220",
+ "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "replace": {
+ "myclabs/deep-copy": "self.version"
+ },
+ "require-dev": {
+ "doctrine/collections": "^1.0",
+ "doctrine/common": "^2.6",
+ "phpunit/phpunit": "^7.1"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "DeepCopy\\": "src/DeepCopy/"
+ },
+ "files": [
+ "src/DeepCopy/deep_copy.php"
+ ]
+ },
+ "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.10.2"
+ },
+ "funding": [
+ {
+ "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-11-13T09:40:50+00:00"
+ },
+ {
+ "name": "nunomaduro/collision",
+ "version": "v5.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nunomaduro/collision.git",
+ "reference": "41b7e9999133d5082700d31a1d0977161df8322a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nunomaduro/collision/zipball/41b7e9999133d5082700d31a1d0977161df8322a",
+ "reference": "41b7e9999133d5082700d31a1d0977161df8322a",
+ "shasum": ""
+ },
+ "require": {
+ "facade/ignition-contracts": "^1.0",
+ "filp/whoops": "^2.7.2",
+ "php": "^7.3 || ^8.0",
+ "symfony/console": "^5.0"
+ },
+ "require-dev": {
+ "brianium/paratest": "^6.1",
+ "fideloper/proxy": "^4.4.1",
+ "friendsofphp/php-cs-fixer": "^2.17.3",
+ "fruitcake/laravel-cors": "^2.0.3",
+ "laravel/framework": "^9.0",
+ "nunomaduro/larastan": "^0.6.2",
+ "nunomaduro/mock-final-classes": "^1.0",
+ "orchestra/testbench": "^7.0",
+ "phpstan/phpstan": "^0.12.64",
+ "phpunit/phpunit": "^9.5.0"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "NunoMaduro\\Collision\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nuno Maduro",
+ "email": "enunomaduro@gmail.com"
+ }
+ ],
+ "description": "Cli error handling for console/command-line PHP applications.",
+ "keywords": [
+ "artisan",
+ "cli",
+ "command-line",
+ "console",
+ "error",
+ "handling",
+ "laravel",
+ "laravel-zero",
+ "php",
+ "symfony"
+ ],
+ "support": {
+ "issues": "https://github.com/nunomaduro/collision/issues",
+ "source": "https://github.com/nunomaduro/collision"
+ },
+ "funding": [
+ {
+ "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/nunomaduro",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/nunomaduro",
+ "type": "patreon"
+ }
+ ],
+ "time": "2021-04-09T13:38:32+00:00"
+ },
+ {
+ "name": "phar-io/manifest",
+ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/manifest.git",
+ "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/manifest/zipball/85265efd3af7ba3ca4b2a2c34dbfc5788dd29133",
+ "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133",
+ "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/master"
+ },
+ "time": "2020-06-27T14:33:11+00:00"
+ },
+ {
+ "name": "phar-io/version",
+ "version": "3.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/version.git",
+ "reference": "bae7c545bef187884426f042434e561ab1ddb182"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/version/zipball/bae7c545bef187884426f042434e561ab1ddb182",
+ "reference": "bae7c545bef187884426f042434e561ab1ddb182",
+ "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.1.0"
+ },
+ "time": "2021-02-23T14:00:09+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-common",
+ "version": "2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
+ "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
+ "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-2.x": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
+ }
+ ],
+ "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
+ "homepage": "http://www.phpdoc.org",
+ "keywords": [
+ "FQSEN",
+ "phpDocumentor",
+ "phpdoc",
+ "reflection",
+ "static analysis"
+ ],
+ "support": {
+ "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues",
+ "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x"
+ },
+ "time": "2020-06-27T09:03:43+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-docblock",
+ "version": "5.2.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+ "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556",
+ "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556",
+ "shasum": ""
+ },
+ "require": {
+ "ext-filter": "*",
+ "php": "^7.2 || ^8.0",
+ "phpdocumentor/reflection-common": "^2.2",
+ "phpdocumentor/type-resolver": "^1.3",
+ "webmozart/assert": "^1.9.1"
+ },
+ "require-dev": {
+ "mockery/mockery": "~1.3.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ },
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "account@ijaap.nl"
+ }
+ ],
+ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
+ "support": {
+ "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
+ "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/master"
+ },
+ "time": "2020-09-03T19:13:55+00:00"
+ },
+ {
+ "name": "phpdocumentor/type-resolver",
+ "version": "1.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
+ "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0",
+ "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0",
+ "phpdocumentor/reflection-common": "^2.0"
+ },
+ "require-dev": {
+ "ext-tokenizer": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-1.x": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
+ "support": {
+ "issues": "https://github.com/phpDocumentor/TypeResolver/issues",
+ "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.4.0"
+ },
+ "time": "2020-09-17T18:55:26+00:00"
+ },
+ {
+ "name": "phpspec/prophecy",
+ "version": "1.13.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpspec/prophecy.git",
+ "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/be1996ed8adc35c3fd795488a653f4b518be70ea",
+ "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.2",
+ "php": "^7.2 || ~8.0, <8.1",
+ "phpdocumentor/reflection-docblock": "^5.2",
+ "sebastian/comparator": "^3.0 || ^4.0",
+ "sebastian/recursion-context": "^3.0 || ^4.0"
+ },
+ "require-dev": {
+ "phpspec/phpspec": "^6.0",
+ "phpunit/phpunit": "^8.0 || ^9.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.11.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Prophecy\\": "src/Prophecy"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ },
+ {
+ "name": "Marcello Duarte",
+ "email": "marcello.duarte@gmail.com"
+ }
+ ],
+ "description": "Highly opinionated mocking framework for PHP 5.3+",
+ "homepage": "https://github.com/phpspec/prophecy",
+ "keywords": [
+ "Double",
+ "Dummy",
+ "fake",
+ "mock",
+ "spy",
+ "stub"
+ ],
+ "support": {
+ "issues": "https://github.com/phpspec/prophecy/issues",
+ "source": "https://github.com/phpspec/prophecy/tree/1.13.0"
+ },
+ "time": "2021-03-17T13:42:18+00:00"
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "9.2.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "f6293e1b30a2354e8428e004689671b83871edde"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f6293e1b30a2354e8428e004689671b83871edde",
+ "reference": "f6293e1b30a2354e8428e004689671b83871edde",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "ext-xmlwriter": "*",
+ "nikic/php-parser": "^4.10.2",
+ "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": "*",
+ "ext-xdebug": "*"
+ },
+ "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",
+ "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.6"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2021-03-28T07:26:59+00:00"
+ },
+ {
+ "name": "phpunit/php-file-iterator",
+ "version": "3.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/aa4be8575f26070b100fccb67faabb28f21f66f8",
+ "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8",
+ "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.5"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T05:57:25+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.5.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "c73c6737305e779771147af66c96ca6a7ed8a741"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c73c6737305e779771147af66c96ca6a7ed8a741",
+ "reference": "c73c6737305e779771147af66c96ca6a7ed8a741",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.3.1",
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-xml": "*",
+ "ext-xmlwriter": "*",
+ "myclabs/deep-copy": "^1.10.1",
+ "phar-io/manifest": "^2.0.1",
+ "phar-io/version": "^3.0.2",
+ "php": ">=7.3",
+ "phpspec/prophecy": "^1.12.1",
+ "phpunit/php-code-coverage": "^9.2.3",
+ "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.5",
+ "sebastian/diff": "^4.0.3",
+ "sebastian/environment": "^5.1.3",
+ "sebastian/exporter": "^4.0.3",
+ "sebastian/global-state": "^5.0.1",
+ "sebastian/object-enumerator": "^4.0.3",
+ "sebastian/resource-operations": "^3.0.3",
+ "sebastian/type": "^2.3",
+ "sebastian/version": "^3.0.2"
+ },
+ "require-dev": {
+ "ext-pdo": "*",
+ "phpspec/prophecy-phpunit": "^2.0.1"
+ },
+ "suggest": {
+ "ext-soap": "*",
+ "ext-xdebug": "*"
+ },
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "9.5-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ],
+ "files": [
+ "src/Framework/Assert/Functions.php"
+ ]
+ },
+ "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",
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.4"
+ },
+ "funding": [
+ {
+ "url": "https://phpunit.de/donate.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2021-03-23T07:16:29+00:00"
+ },
+ {
+ "name": "psr/log",
+ "version": "1.1.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc",
+ "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Log\\": "Psr/Log/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for logging libraries",
+ "homepage": "https://github.com/php-fig/log",
+ "keywords": [
+ "log",
+ "psr",
+ "psr-3"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/log/tree/1.1.3"
+ },
+ "time": "2020-03-23T09:12:05+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.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "55f4261989e546dc112258c7a75935a81a7ce382"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382",
+ "reference": "55f4261989e546dc112258c7a75935a81a7ce382",
+ "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.6"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T15:49:45+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.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d",
+ "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d",
+ "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.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:10:38+00:00"
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "5.1.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "388b6ced16caa751030f6a69e588299fa09200ac"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac",
+ "reference": "388b6ced16caa751030f6a69e588299fa09200ac",
+ "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.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T05:52:38+00:00"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "4.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/d89cc98761b8cb5a1a235a6b703ae50d34080e65",
+ "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65",
+ "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": "http://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.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T05:24:23+00:00"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "5.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "a90ccbddffa067b51f574dea6eb25d5680839455"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/a90ccbddffa067b51f574dea6eb25d5680839455",
+ "reference": "a90ccbddffa067b51f574dea6eb25d5680839455",
+ "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.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T15:55:19+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.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172",
+ "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172",
+ "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": "http://www.github.com/sebastianbergmann/recursion-context",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
+ "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:17:30+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": "2.3.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/type.git",
+ "reference": "81cd61ab7bbf2de744aba0ea61fae32f721df3d2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/81cd61ab7bbf2de744aba0ea61fae32f721df3d2",
+ "reference": "81cd61ab7bbf2de744aba0ea61fae32f721df3d2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.3-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/2.3.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:18:59+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": "theseer/tokenizer",
+ "version": "1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/theseer/tokenizer.git",
+ "reference": "75a63c33a8577608444246075ea0af0d052e452a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a",
+ "reference": "75a63c33a8577608444246075ea0af0d052e452a",
+ "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/master"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/theseer",
+ "type": "github"
+ }
+ ],
+ "time": "2020-07-12T23:59:07+00:00"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": [],
+ "prefer-stable": true,
+ "prefer-lowest": false,
+ "platform": {
+ "php": ">=7.3"
+ },
+ "platform-dev": [],
+ "plugin-api-version": "2.0.0"
+}
diff --git a/config/app.php b/config/app.php
index d2f41cf..e9aa4c9 100644
--- a/config/app.php
+++ b/config/app.php
@@ -3,14 +3,13 @@
use function Prinx\Dotenv\env;
return [
-
/*
* Unique identifier for this application.
*/
'id' => env('APP_ID', 'rejoice_ussd'),
/*
- * The environment of the application
+ * The environment of the application.
*/
'environment' => env('APP_ENV', 'prod'),
@@ -26,22 +25,32 @@
/*
* If true, and an SMS endpoint and sender name have been configured, every
- * last response will be sent as SMS to the user
+ * last response will be sent as SMS to the user.
*/
'always_send_sms_at_end' => false,
/*
- * For test purpose. You can enable/disable overall sending of SMS
+ * You can enable/disable overall sending of SMS.
*/
'send_sms_enabled' => env('SEND_SMS_ENABLED', true),
/*
- * For test purpose. You can enable/disable overall sending of SMS
+ * SMS Service.
+ */
+ 'sms_service' => \Rejoice\Sms\SmsService::class,
+
+ /*
+ * Jobs class.
+ */
+ 'jobs_class' => \App\Jobs\Job::class,
+
+ /*
+ * You can enable/disable overall logging.
*/
'log_enabled' => env('LOG_ENABLED', true),
/*
- * You can disabled connection to the application database by turning this to false
+ * You can disabled connection to the application database by turning this to false.
*/
'connect_app_db' => true,
@@ -64,12 +73,12 @@
/*
* This option works with the `always_start_new_session` option. If true
* and always_start_new_session has been set to false, the user will have a
- * prompt to continue their last session or restart a new session. If
- * false, the last session will be automatically loaded whenever the user
+ * prompt to continue their previous session or restart a new session. If
+ * false, the previous session will be automatically loaded whenever the user
* comes back.
* This does not have any effect if always_start_new_session is set to true.
*/
- 'ask_user_before_reload_last_session' => true,
+ 'ask_user_before_reload_previous_session' => true,
/*
* USSD sessions times out very quickly depending on the network and the
@@ -78,10 +87,16 @@
* time has passed, and a response is sent requesting for an input from the
* user, that response is displayed. That behavior is used to allow the
* application not to time out. So that the user can see the last response,
- * no matter how long the USSD menu is.
+ * no matter how long the USSD menu lasts.
*/
'allow_timeout' => true,
+ /*
+ * If true, you can directly call a sub menu, without passing through
+ * the normal flow (from the welcome menu till the particular sub menu)
+ */
+ 'allow_direct_sub_menu_call' => false,
+
/*
* Cancel the session whenever there is an error in the user's response
*/
@@ -96,12 +111,6 @@
*/
'end_on_unhandled_action' => false,
- /*
- * If true, you can directly call a sub menu, without passing through
- * the normal flow (from the welcome menu till the particular sub menu)
- */
- 'allow_direct_sub_menu_call' => false,
-
/*
* Delimits variables in stubs files
*/
diff --git a/config/database.php b/config/database.php
index 85331cb..9a8db2d 100644
--- a/config/database.php
+++ b/config/database.php
@@ -3,13 +3,58 @@
use function Prinx\Dotenv\env;
return [
+ 'default' => env('APP_DB_CONNECTION', 'mysql'),
- 'default' => [
- 'user' => env('APP_DEFAULT_DB_USER', ''),
- 'password' => env('APP_DEFAULT_DB_PASS', ''),
- 'host' => env('APP_DEFAULT_DB_HOST', ''),
- 'port' => env('APP_DEFAULT_DB_PORT', ''),
- 'dbname' => env('APP_DEFAULT_DB_NAME', ''),
- ],
+ 'connections' => [
+ 'mysql' => [
+ 'driver' => 'mysql',
+ 'host' => env('APP_DB_HOST', '127.0.0.1'),
+ 'port' => env('APP_DB_PORT', '3306'),
+ 'database' => env('APP_DB_NAME', ''),
+ 'username' => env('APP_DB_USER', ''),
+ 'password' => env('APP_DB_PASS', ''),
+ 'unix_socket' => env('APP_DB_SOCKET', ''),
+ 'charset' => 'utf8',
+ 'collation' => 'utf8_unicode_ci',
+ 'prefix' => '',
+ 'strict' => false,
+ 'engine' => null,
+ ],
+
+ 'sqlite' => [
+ 'driver' => 'sqlite',
+ 'url' => env('APP_DB_URL'),
+ 'database' => env('APP_DB_NAME', ''),
+ 'prefix' => '',
+ 'foreign_key_constraints' => env('APP_DB_FOREIGN_KEYS', true),
+ ],
+ 'pgsql' => [
+ 'driver' => 'pgsql',
+ 'url' => env('APP_DB_URL'),
+ 'host' => env('APP_DB_HOST', '127.0.0.1'),
+ 'port' => env('APP_DB_PORT', '5432'),
+ 'database' => env('APP_DB_NAME', 'forge'),
+ 'username' => env('APP_DB_USER', 'forge'),
+ 'password' => env('APP_DB_PASS', ''),
+ 'charset' => 'utf8',
+ 'prefix' => '',
+ 'prefix_indexes' => true,
+ 'schema' => 'public',
+ 'sslmode' => 'prefer',
+ ],
+
+ 'sqlsrv' => [
+ 'driver' => 'sqlsrv',
+ 'url' => env('APP_DB_URL'),
+ 'host' => env('APP_DB_HOST', 'localhost'),
+ 'port' => env('APP_DB_PORT', '1433'),
+ 'database' => env('APP_DB_NAME', 'forge'),
+ 'username' => env('APP_DB_USER', 'forge'),
+ 'password' => env('APP_DB_PASS', ''),
+ 'charset' => 'utf8',
+ 'prefix' => '',
+ 'prefix_indexes' => true,
+ ],
+ ],
];
diff --git a/config/menu.php b/config/menu.php
index 1bb026f..873fc1a 100644
--- a/config/menu.php
+++ b/config/menu.php
@@ -1,12 +1,11 @@
'Do you want to continue from where you left?',
- 'message_ask_user_before_reload_last_session' => 'Do you want to continue from where you left?',
+ 'previous_session_trigger' => '1',
- 'last_session_trigger' => '1',
-
- 'last_session_display' => 'Continue last session',
+ 'previous_session_display' => 'Continue',
'restart_session_trigger' => '2',
@@ -123,5 +122,4 @@
* Space between the message and a cancel message
*/
'seperator_menu_string_and_cancel_message' => "\n\n",
-
];
diff --git a/config/session.php b/config/session.php
index 4e051f8..227d0da 100644
--- a/config/session.php
+++ b/config/session.php
@@ -3,10 +3,20 @@
use function Prinx\Dotenv\env;
return [
-
'driver' => env('SESSION_DRIVER', 'file'), // file|database
- 'lifetime' => 60 * 5, // expires after 5h (in min)
+ /*
+ * The session is invalidated after the lifetime has passed and
+ * the user will be obliged to restart from the welcome menu.
+ * Default 18000 (5h, in seconds)
+ */
+ 'lifetime' => 18000,
+
+ /*
+ * Timeout of the final response
+ * Default 180 (3 minutes)
+ */
+ 'timeout' => 180,
'database' => [
'user' => env('SESSION_DB_USER', ''),
@@ -15,5 +25,4 @@
'port' => env('SESSION_DB_PORT', ''),
'dbname' => env('SESSION_DB_NAME', ''),
],
-
];
diff --git a/constants.php b/constants.php
index 62042c3..548f273 100644
--- a/constants.php
+++ b/constants.php
@@ -28,11 +28,11 @@
define('APP_REQUEST_ASK_USER_RESPONSE', $config->get('app.request_ask_user_response'));
define('APP_REQUEST_USER_SENT_RESPONSE', $config->get('app.request_user_sent_response'));
define(
- 'APP_REQUEST_ASK_USER_BEFORE_RELOAD_LAST_SESSION',
+ 'APP_REQUEST_ASK_USER_BEFORE_RELOAD_PREVIOUS_SESSION',
'__CUSTOM_REQUEST_TYPE1'
);
define(
- 'APP_REQUEST_RELOAD_LAST_SESSION_DIRECTLY',
+ 'APP_REQUEST_RELOAD_PREVIOUS_SESSION_DIRECTLY',
'__CUSTOM_REQUEST_TYPE2'
);
@@ -55,7 +55,7 @@
define('APP_END', '__end');
define('APP_SPLITTED_MENU_NEXT', '__split_next');
define('APP_SPLITTED_MENU_BACK', '__split_back');
-define('APP_CONTINUE_LAST_SESSION', '__continue_last_session');
+define('APP_CONTINUE_PREVIOUS_SESSION', '__continue_previous_session');
define('APP_PAGINATE_FORWARD', '__paginate_forward');
define('APP_PAGINATE_BACK', '__paginate_back');
@@ -67,7 +67,7 @@
* APP_BACK: throw the previous menu
* APP_SAME: re-throw the current menu
* APP_END: throw a goodbye menu
- * APP_CONTINUE_LAST_SESSION: throw the menu on which the user was before
+ * APP_CONTINUE_PREVIOUS_SESSION: throw the menu on which the user was before
* request timed out or was cancelled
*/
define('RESERVED_MENU_IDs', [
@@ -75,7 +75,7 @@
APP_END,
APP_BACK,
APP_SAME,
- APP_CONTINUE_LAST_SESSION,
+ APP_CONTINUE_PREVIOUS_SESSION,
APP_SPLITTED_MENU_NEXT,
APP_SPLITTED_MENU_BACK,
APP_PAGINATE_FORWARD,
@@ -99,8 +99,8 @@
define('ALLOWED_REQUEST_CHANNELS', ['USSD', 'WHATSAPP', 'CONSOLE']);
define(
- 'ASK_USER_BEFORE_RELOAD_LAST_SESSION',
- 'ask_user_before_reload_last_session'
+ 'ASK_USER_BEFORE_RELOAD_PREVIOUS_SESSION',
+ 'ask_user_before_reload_previous_session'
);
define('DEVELOPER_SAVED_DATA', 'session_data_accessible_by_app');
diff --git a/src/Console/Commands/ClearCacheCommand.php b/src/Console/Commands/ClearCacheCommand.php
new file mode 100644
index 0000000..341ad6f
--- /dev/null
+++ b/src/Console/Commands/ClearCacheCommand.php
@@ -0,0 +1,43 @@
+setName('cache:clear')
+ ->setDescription('Clear the cache files.');
+ }
+
+ public function fire()
+ {
+ $finder = new Finder();
+
+ $finder->files()->ignoreDotFiles(false)->in(storage_path('cache'));
+
+ try {
+ foreach ($finder as $file) {
+ if (in_array($file->getFileName(), $this->defaultCacheFiles)) {
+ file_put_contents($file->getPathname(), '');
+ } else {
+ unlink($file->getPathname());
+ }
+ }
+ } catch (\Throwable $th) {
+ $this->error('Error!');
+ $this->write($th->getMessage().' in '.$th->getFile().' at line '.$th->getLine());
+
+ return Smile::FAILURE;
+ }
+
+ $this->info('Cache cleared successfully!');
+
+ return Smile::SUCCESS;
+ }
+}
diff --git a/src/Console/Commands/ClearLogCommand.php b/src/Console/Commands/ClearLogCommand.php
new file mode 100644
index 0000000..013f67d
--- /dev/null
+++ b/src/Console/Commands/ClearLogCommand.php
@@ -0,0 +1,116 @@
+setName('log:clear')
+ ->setDescription('Clear log files.')
+ ->addOption(
+ 'all',
+ 'a',
+ Option::OPTIONAL,
+ 'Remove both log files created by rejoice and custom log files.',
+ true
+ )
+ ->addOption(
+ 'file',
+ 'f',
+ Option::OPTIONAL,
+ 'Remove only files.',
+ false
+ )
+ ->addOption(
+ 'dir',
+ 'd',
+ Option::OPTIONAL,
+ 'Remove only directories.',
+ false
+ );
+ }
+
+ public function fire()
+ {
+ $finder = (new Finder())->ignoreDotFiles(false)->sortByType();
+
+ if (!$this->getOption('all')) {
+ $finder->name($this->defaultLogs());
+ }
+
+ if ($this->getOption('file')) {
+ $finder->files();
+ } elseif ($this->getOption('dir')) {
+ $finder->directories();
+ }
+
+ $path = storage_path('logs');
+
+ $finder->in($path);
+
+ $files = array_reverse(iterator_to_array($finder));
+
+ try {
+ $this->deleteIn($path, $files);
+
+ foreach ($this->defaultLogDirs as $dirname) {
+ $dir = storage_path('logs/'.$dirname);
+
+ if (!is_dir($dir)) {
+ mkdir($dir);
+ }
+ }
+
+ foreach ($this->defaultLogFiles as $filename) {
+ $file = storage_path('logs/'.$filename);
+
+ if (!file_exists($file)) {
+ file_put_contents($file, '');
+ }
+ }
+ } catch (\Throwable $th) {
+ $this->error('Error!');
+ $this->write($th->getMessage().' in '.$th->getFile().' at line '.$th->getLine());
+
+ return Smile::FAILURE;
+ }
+
+ $this->info('Logs cleared successfully!');
+
+ return Smile::SUCCESS;
+ }
+
+ public function defaultLogs()
+ {
+ return array_merge($this->defaultLogFiles, $this->defaultLogDirs);
+ }
+
+ public function deleteIn($path, $files = null)
+ {
+ $files = $files ?: array_reverse(iterator_to_array((new Finder())
+ ->ignoreDotFiles(false)
+ ->sortByType()
+ ->in($path)));
+
+ foreach ($files as $file) {
+ if ($file->isFile() && file_exists($file->getPathname())) {
+ unlink($file->getPathname());
+ continue;
+ }
+
+ $this->deleteIn($file->getPathname());
+
+ if (file_exists($file->getPathname())) {
+ rmdir($file->getPathname());
+ }
+ }
+ }
+}
diff --git a/src/Console/Commands/ClearSessionCommand.php b/src/Console/Commands/ClearSessionCommand.php
new file mode 100644
index 0000000..87bd7ec
--- /dev/null
+++ b/src/Console/Commands/ClearSessionCommand.php
@@ -0,0 +1,35 @@
+setName('session:clear')
+ ->setDescription('Clear the sessions.');
+ }
+
+ public function fire()
+ {
+ try {
+ $finder = (new Finder())->files()->in(storage_path('sessions'));
+
+ foreach ($finder as $file) {
+ unlink($file->getPathname());
+ }
+ } catch (\Throwable $th) {
+ $this->error('Error!');
+ $this->write($th->getMessage().' in '.$th->getFile().' at line '.$th->getLine());
+
+ return Smile::FAILURE;
+ }
+
+ $this->info('Session cleared successfully!');
+
+ return Smile::SUCCESS;
+ }
+}
diff --git a/src/Console/Commands/RunTestCommand.php b/src/Console/Commands/RunTestCommand.php
new file mode 100644
index 0000000..9e85cf3
--- /dev/null
+++ b/src/Console/Commands/RunTestCommand.php
@@ -0,0 +1,46 @@
+setName('test')
+ ->setDescription('Run all the tests for the application.');
+ }
+
+ public function fire()
+ {
+ passthru(PHP_BINARY.' '.Path::toProject('vendor/bin/phpunit'));
+
+ // $process = (new Process([
+ // PHP_BINARY,
+ // Path::toProject('vendor/phpunit/phpunit/phpunit'),
+ // '--printer',
+ // 'NunoMaduro\Collision\Adapters\Phpunit\Printer',
+ // '-c',
+ // Path::toProject('phpunit.xml')
+ // ]))->setTimeout(null);
+
+ // try {
+ // return $process->run(function ($type, $line) {
+ // $this->write($line);
+ // });
+ // } catch (ProcessSignaledException $e) {
+ // if (extension_loaded('pcntl') && $e->getSignal() !== SIGINT) {
+ // throw $e;
+ // }
+ // }
+
+ return Smile::SUCCESS;
+ }
+}
diff --git a/src/Console/Commands/ScheduleRunCommand.php b/src/Console/Commands/ScheduleRunCommand.php
new file mode 100644
index 0000000..50f4dda
--- /dev/null
+++ b/src/Console/Commands/ScheduleRunCommand.php
@@ -0,0 +1,28 @@
+setName('schedule:run')
+ ->setDescription('Run the scheduler');
+ }
+
+ public function fire()
+ {
+ $scheduler = new Scheduler();
+ $scheduler->setSchedulerCommand($this);
+
+ $jobs = new $this->config('app.jobs_class');
+ $jobs->schedule($scheduler);
+
+ $scheduler->run();
+
+ return Smile::SUCCESS;
+ }
+}
diff --git a/src/Console/Commands/SimulatorConsoleCommand.php b/src/Console/Commands/SimulatorConsoleCommand.php
index 46f52e6..43de238 100644
--- a/src/Console/Commands/SimulatorConsoleCommand.php
+++ b/src/Console/Commands/SimulatorConsoleCommand.php
@@ -103,7 +103,7 @@ public function init()
public function simulate()
{
- $simulator = new Simulator;
+ $simulator = new Simulator();
$simulator->setEndpoint($this->endpoint);
$this->dial();
@@ -111,6 +111,7 @@ public function simulate()
while (!$this->isLastMenu($this->payload)) {
$simulator->setPayload($this->payload);
$response = $simulator->callUssd();
+
$responseData = json_decode($response->get('data'), true);
if ($response->isSuccess() && is_array($responseData)) {
diff --git a/src/Console/commands.php b/src/Console/commands.php
index 6e71545..45acaad 100644
--- a/src/Console/commands.php
+++ b/src/Console/commands.php
@@ -10,6 +10,11 @@
NewModelCommand::class,
NewMenuCommand::class,
DevtoolCommand::class,
+ ClearCacheCommand::class,
+ ClearLogCommand::class,
+ ClearSessionCommand::class,
+ RunTestCommand::class,
+ ScheduleRunCommand::class,
ServeCommand::class,
- //
+ // ...
];
diff --git a/src/Foundation/Config.php b/src/Foundation/Config.php
index 424e1c4..6442d3d 100644
--- a/src/Foundation/Config.php
+++ b/src/Foundation/Config.php
@@ -31,8 +31,6 @@ class Config
* If array provided as configDirs, the config from those paths will be merge
*
* @param string|string[] $configDirs The config folder path or an array of paths
- * @param string $separator
- * @param string $fileSuffix
*/
public function __construct($configDirs, string $separator = '.', string $fileSuffix = '.php')
{
@@ -69,8 +67,9 @@ public function loadConfig()
* Get a configuration variable from the config.
*
* @param string $key
- * @param mixed $default The default to return if the configuration is not found
- * @param bool $silent If true, will shutdown the exception throwing if configuration variable not found and no default was passed.
+ * @param mixed $default The default to return if the configuration value is not found
+ * @param bool $silent If silent is false, will throw an exception if configuration variable
+ * is not found and no default was passed.
*
* @throws \RuntimeException
*
@@ -81,7 +80,7 @@ public function get($key = null, $default = null, $silent = false)
$argCount = \func_num_args();
if (0 === $argCount) {
- return $this->config;
+ return $this;
}
$value = Arr::multiKeyGet($key, $this->config);
diff --git a/src/Foundation/Kernel.php b/src/Foundation/Kernel.php
index 16cf908..9ec2163 100644
--- a/src/Foundation/Kernel.php
+++ b/src/Foundation/Kernel.php
@@ -21,7 +21,7 @@
use Rejoice\Database\Connections;
use Rejoice\Database\DB;
use Rejoice\Menu\Menus;
-use Rejoice\Utils\SmsService;
+use Rejoice\Sms\SmsServiceInterface;
/**
* Main Library. Handle the request and return a response.
@@ -103,7 +103,7 @@ class Kernel
* Custom request type.
*
* The custom request type help define a request type for handling restart
- * from last session and other requests.
+ * from previous session and other requests.
*
* @var string
*/
@@ -229,7 +229,7 @@ class Kernel
*
* @var bool
*/
- protected $hasResumeFromLastSession = false;
+ protected $hasResumedFromPreviousSession = false;
protected $menuNamespaceDelimiter = '::';
@@ -247,7 +247,7 @@ public function __construct($appName = '', $forcedInput = [])
ob_start();
$this->appName = $appName;
$this->forcedInput = $forcedInput;
- $this->path = new Path;
+ $this->path = new Path();
$this->logger = new Log(
$this->path('app_default_log_file'),
$this->path('app_default_cache_file')
@@ -342,7 +342,7 @@ public function loadMenus()
protected function handleUserRequest()
{
- if ($this->isFirstRequest() && $this->session->isPrevious()) {
+ if ($this->isFirstRequest() && $this->session->hasPrevious()) {
$this->prepareToLaunchFromPreviousSession();
} elseif ($this->attemptsToCallSubMenuDirectly() && $this->doesNotAllowDirectSubMenuCall()) {
$this->forceRestart();
@@ -367,12 +367,12 @@ protected function handleUserRequest()
break;
- case APP_REQUEST_ASK_USER_BEFORE_RELOAD_LAST_SESSION:
- $this->runAskUserBeforeReloadLastSessionState();
+ case APP_REQUEST_ASK_USER_BEFORE_RELOAD_PREVIOUS_SESSION:
+ $this->runAskUserBeforeReloadPreviousSessionState();
break;
- case APP_REQUEST_RELOAD_LAST_SESSION_DIRECTLY:
- $this->runLastSessionState();
+ case APP_REQUEST_RELOAD_PREVIOUS_SESSION_DIRECTLY:
+ $this->runPreviousSessionState();
break;
case APP_REQUEST_CANCELLED:
@@ -408,12 +408,12 @@ public function doesNotAllowDirectSubMenuCall()
public function prepareToLaunchFromPreviousSession()
{
if (
- $this->config('app.ask_user_before_reload_last_session') &&
+ $this->config('app.ask_user_before_reload_previous_session') &&
$this->session->metadata('current_menu_name', false) !== WELCOME_MENU_NAME
) {
- $this->setCustomUssdRequestType(APP_REQUEST_ASK_USER_BEFORE_RELOAD_LAST_SESSION);
+ $this->setCustomUssdRequestType(APP_REQUEST_ASK_USER_BEFORE_RELOAD_PREVIOUS_SESSION);
} else {
- $this->setCustomUssdRequestType(APP_REQUEST_RELOAD_LAST_SESSION_DIRECTLY);
+ $this->setCustomUssdRequestType(APP_REQUEST_RELOAD_PREVIOUS_SESSION_DIRECTLY);
}
}
@@ -422,10 +422,10 @@ public function hasComeBackAfterNoTimeoutFinalResponse()
return $this->session->mustNotTimeout() && $this->session->isNew();
}
- protected function runLastSessionState()
+ protected function runPreviousSessionState()
{
- $this->hasResumeFromLastSession = true;
- $this->sessionSave('has_resume_from_last_session', true);
+ $this->hasResumedFromPreviousSession = true;
+ $this->sessionSave('has_resume_from_previous_session', true);
$this->saveCurrentMenuName($this->historyBagPop());
$this->runState($this->currentMenuName());
}
@@ -440,9 +440,9 @@ protected function saveCurrentMenuName($name)
$this->session->setMetadata('current_menu_name', $name);
}
- protected function runAskUserBeforeReloadLastSessionState()
+ protected function runAskUserBeforeReloadPreviousSessionState()
{
- $this->runState(ASK_USER_BEFORE_RELOAD_LAST_SESSION);
+ $this->runState(ASK_USER_BEFORE_RELOAD_PREVIOUS_SESSION);
}
protected function processResponse()
@@ -562,7 +562,6 @@ public function isMovingToMenu($nextMenu)
* developer has to specify the validation rules or validate himself in the
* `validate` method of the menu entity)
*
- * @param string $currentMenu
* @param string $userError
* @param bool $responseExistsInMenuActions The response has already been specified by the developer
* @param string $nextMenu
@@ -625,8 +624,8 @@ protected function runAppropriateState($nextMenu)
$this->runSameState();
break;
- case APP_CONTINUE_LAST_SESSION:
- $this->runLastSessionState();
+ case APP_CONTINUE_PREVIOUS_SESSION:
+ $this->runPreviousSessionState();
break;
case APP_PAGINATE_FORWARD:
@@ -658,8 +657,7 @@ protected function switchToRemoteUssd($nextMenu)
$this->session->setMetadata('ussd_has_switched', true);
$this->session->save();
$this->setUssdRequestType(APP_REQUEST_INIT);
-
- return $this->processFromRemoteUssd($nextMenu);
+ $this->processFromRemoteUssd($nextMenu);
}
/**
@@ -946,7 +944,7 @@ protected function runState($nextMenuName)
$this->session->mustNotTimeout() &&
$cancelMessage = $this->config('menu.cancel_message')
) {
- $sep = $this->app->config('menu.seperator_menu_string_and_cancel_message');
+ $sep = $this->config('menu.seperator_menu_string_and_cancel_message');
$message .= $sep.$cancelMessage;
}
@@ -1141,12 +1139,12 @@ protected function runNextState(
if (APP_SPLITTED_MENU_NEXT !== $nextMenuName && APP_SPLITTED_MENU_BACK !== $nextMenuName) {
if (
$this->currentMenuName() &&
- $this->currentMenuName() !== WELCOME_MENU_NAME && ASK_USER_BEFORE_RELOAD_LAST_SESSION !== $nextMenuName &&
+ $this->currentMenuName() !== WELCOME_MENU_NAME && ASK_USER_BEFORE_RELOAD_PREVIOUS_SESSION !== $nextMenuName &&
!empty($this->historyBag()) && $this->previousMenuName() === $nextMenuName) {
$this->historyBagPop();
} elseif (
$this->currentMenuName() && $this->currentMenuName() !== $nextMenuName &&
- $this->currentMenuName() !== ASK_USER_BEFORE_RELOAD_LAST_SESSION
+ $this->currentMenuName() !== ASK_USER_BEFORE_RELOAD_PREVIOUS_SESSION
) {
$this->historyBagPush($this->currentMenuName());
}
@@ -1215,7 +1213,10 @@ public function fail($error)
$this->response->addErrorInSimulator($error);
$this->response->softEnd($this->config('menu.application_failed_message'));
- $log = "Error:\n".$error."\n\nUser session:\n".json_encode($sessionData, JSON_PRETTY_PRINT);
+ $error = strip_tags($this->br2nl($error));
+ $sessionData = $this->isProdEnv() ? json_encode($sessionData) : json_encode($sessionData, JSON_PRETTY_PRINT);
+
+ $log = "Error:\n".$error."\n\nUser session:\n".$sessionData;
$this->logger->emergency($log);
@@ -1228,6 +1229,23 @@ public function fail($error)
exit;
}
+ /**
+ * Convert BR tags to newlines and carriage returns.
+ *
+ * @param string The string to convert
+ * @param string The string to use as line separator
+ *
+ * @return string The converted string
+ *
+ * @see https://www.php.net/manual/en/function.nl2br.php#115182
+ */
+ public function br2nl($string, $separator = PHP_EOL)
+ {
+ $separator = in_array($separator, ["\n", "\r", "\r\n", "\n\r", chr(30), chr(155), PHP_EOL]) ? $separator : PHP_EOL;
+
+ return preg_replace('/\
/i', $separator, $string);
+ }
+
protected function runPreviousState()
{
$this->hasComeBack = true;
@@ -1502,6 +1520,20 @@ public function sessionRemove($key)
return $this->session->remove($key);
}
+ /**
+ * Returns the session value of `$key` if `$key` is in the session, else returns `$default` and
+ * save `$default` to the session.
+ *
+ * @param string $key
+ * @param mixed $default
+ *
+ * @return mixed
+ */
+ public function sessionRemember($key, $default)
+ {
+ return $this->session->remember($key, $default);
+ }
+
/**
* Allows the developer to retrieve a value from the session.
* This is identical to `sessionGet`
@@ -1739,7 +1771,6 @@ public function setError(string $error = '')
/**
* Retrieve the request input.
*
- *
* @param string $name
*
* @return mixed
@@ -1809,21 +1840,23 @@ public function userSavedResponse()
* The sender name and endpoint can be configure in the env file or
* directly in the config/app.php file
*
- *
- * @param string $message
- * @param string $msisdn
- * @param string $senderName
- * @param string $endpoint
+ * @param string[]|string $message
*
* @return void
*/
- public function sendSms($message, $msisdn = '', $senderName = '', $endpoint = '')
+ public function sendSms($message, string $msisdn = '', string $senderName = '', string $endpoint = '')
{
if (!$this->config('app.send_sms_enabled')) {
return;
}
- $smsService = new SmsService($this);
+ $smsServiceClass = $this->config('app.sms_service');
+
+ if (!($smsServiceClass instanceof SmsServiceInterface)) {
+ throw new \Exception('Sms Service class must implements "'.SmsServiceInterface::class.'" interface.');
+ }
+
+ $smsService = new $smsServiceClass($this);
return $smsService->send($message, $msisdn, $senderName, $endpoint);
}
@@ -1831,8 +1864,6 @@ public function sendSms($message, $msisdn = '', $senderName = '', $endpoint = ''
/**
* Return a path to a file or a folder.
*
- *
- *
* @param string $key
*
* @throws \RuntimeException
@@ -1855,13 +1886,13 @@ public function logger()
return $this->logger;
}
- public function hasResumeFromLastSessionOnThisMenu()
+ public function hasResumedFromPreviousSessionOnThisMenu()
{
- return $this->hasResumeFromLastSession;
+ return $this->hasResumedFromPreviousSession;
}
- public function hasResumeFromLastSession()
+ public function hasResumedFromPreviousSession()
{
- return $this->session('has_resume_from_last_session', null);
+ return $this->session('has_resume_from_previous_session', null);
}
}
diff --git a/src/Foundation/UserResponseValidator.php b/src/Foundation/UserResponseValidator.php
index 1b382c5..8e3b5f3 100644
--- a/src/Foundation/UserResponseValidator.php
+++ b/src/Foundation/UserResponseValidator.php
@@ -64,7 +64,7 @@ class UserResponseValidator
*/
public static function validate($response, $validationRules)
{
- $validation = new \stdClass;
+ $validation = new \stdClass();
$validation->validated = true;
$rules = $validationRules;
@@ -163,7 +163,7 @@ public static function extractRuleAndError($key, $value)
*/
public static function isString($str)
{
- $v = new \stdClass;
+ $v = new \stdClass();
$v->validated = true;
if (!is_string($str)) {
@@ -178,7 +178,7 @@ public static function isString($str)
public static function isMin($num, $min)
{
- $v = new \stdClass;
+ $v = new \stdClass();
$v->validated = true;
if (!(floatval($num) >= floatval($min))) {
@@ -193,7 +193,7 @@ public static function isMin($num, $min)
public static function isMax($num, $max)
{
- $v = new \stdClass;
+ $v = new \stdClass();
$v->validated = true;
if (!(floatval($num) <= floatval($max))) {
@@ -208,7 +208,7 @@ public static function isMax($num, $max)
public static function isMinLength($str, $minLen)
{
- $v = new \stdClass;
+ $v = new \stdClass();
$v->validated = true;
if (!Str::isMinLength($str, intval($minLen))) {
@@ -223,7 +223,7 @@ public static function isMinLength($str, $minLen)
public static function isMaxLength($str, $maxLen)
{
- $v = new \stdClass;
+ $v = new \stdClass();
$v->validated = true;
if (!Str::isMaxLength($str, intval($maxLen))) {
@@ -256,7 +256,7 @@ public static function isMaxLen($str, $num)
public static function isAlpha($str)
{
- $v = new \stdClass;
+ $v = new \stdClass();
$v->validated = true;
if (!Str::isAlphabetic($str)) {
@@ -278,7 +278,7 @@ public static function isAlphabetic($str)
public static function isAlphaNum($str)
{
- $v = new \stdClass;
+ $v = new \stdClass();
$v->validated = true;
if (!Str::isAlphanumeric($str)) {
@@ -300,7 +300,7 @@ public static function isAlphaNumeric($str)
public static function isNumeric($str)
{
- $v = new \stdClass;
+ $v = new \stdClass();
$v->validated = true;
if (!Str::isNumeric($str)) {
@@ -315,7 +315,7 @@ public static function isNumeric($str)
public static function isInteger($str)
{
- $v = new \stdClass;
+ $v = new \stdClass();
$v->validated = true;
if (!Str::isNumeric($str)) {
@@ -337,7 +337,7 @@ public static function isInt($str)
public static function isFloat($str)
{
- $v = new \stdClass;
+ $v = new \stdClass();
$v->validated = true;
if (!Str::isFloatNumeric($str)) {
@@ -359,7 +359,7 @@ public static function isAmount($str)
public static function isTel($str)
{
- $v = new \stdClass;
+ $v = new \stdClass();
$v->validated = true;
if (!Str::isTelNumber($str)) {
@@ -374,7 +374,7 @@ public static function isTel($str)
public static function isRegex($str, $pattern)
{
- $v = new \stdClass;
+ $v = new \stdClass();
$v->validated = true;
$matched = preg_match($pattern, $str);
@@ -384,7 +384,7 @@ public static function isRegex($str, $pattern)
self::$customErrors['regex'] ??
'The response does not match the pattern.';
} elseif ($matched === false) {
- throw new \Exception('Error in the validation regex: '.$pattern);
+ throw new \Exception('Regex validation error: '.preg_last_error_msg().". \nRegex: ".$pattern);
}
return $v;
@@ -392,7 +392,7 @@ public static function isRegex($str, $pattern)
public static function isDate($date, $format = 'j/n/Y')
{
- $v = new \stdClass;
+ $v = new \stdClass();
$v->validated = true;
if (!Date::isDate($date, $format)) {
diff --git a/src/Jobs/Scheduler.php b/src/Jobs/Scheduler.php
new file mode 100644
index 0000000..9d50b1d
--- /dev/null
+++ b/src/Jobs/Scheduler.php
@@ -0,0 +1,131 @@
+schedulerCommand = $command;
+ }
+
+ /**
+ * Console Output.
+ *
+ * @return \Symfony\Component\Console\Output\OutputInterface
+ */
+ public function getSmileOutput()
+ {
+ return $this->schedulerCommand->getOutput();
+ }
+
+ /**
+ * Smile console application.
+ *
+ * @return \Symfony\Component\Console\Application
+ */
+ public function getSmile()
+ {
+ return $this->schedulerCommand->getApplication();
+ }
+
+ /**
+ * Rejoice mock for console.
+ *
+ * @return \Rejoice\Foundation\Kernel
+ */
+ public function getRejoice()
+ {
+ return $this->schedulerCommand->getRejoice();
+ }
+
+ /**
+ * Rejoice default logger.
+ *
+ * @return \Prinx\Notify\Log
+ */
+ public function logger()
+ {
+ return $this->getRejoice()->logger();
+ }
+
+ /**
+ * Schedule a Smile Command.
+ *
+ * @param array|string|null $arguments
+ *
+ * @return Job
+ */
+ public function command(string $command, $arguments = null)
+ {
+ return $this->call(function (string $commandName, $arguments) {
+ try {
+ $command = $this->getSmile()->find($commandName);
+
+ $input = $this->resolveInput($arguments);
+ $output = new BufferedOutput();
+
+ $command->run($input, $output);
+
+ return $output->fetch();
+ } catch (CommandNotFoundException $e) {
+ $this->logger()->error($e->getMessage());
+
+ return $e->getMessage();
+ } catch (\Throwable $th) {
+ $message = sprintf(
+ 'Error when executing scheduled command "%s": %s',
+ $commandName,
+ $th->getMessage()
+ );
+
+ $this->logger()->error($message);
+
+ return $message;
+ }
+ }, [
+ $command,
+ $arguments,
+ ]);
+ }
+
+ /**
+ * Resolve input.
+ *
+ * @param array|string $arguments
+ *
+ * @return InputInterface|StreamableInputInterface
+ */
+ public function resolveInput($arguments)
+ {
+ if (is_string($arguments)) {
+ return new StringInput($arguments);
+ }
+
+ if (is_array($arguments)) {
+ return new ArrayInput($arguments);
+ }
+
+ return new ArgvInput();
+ }
+}
diff --git a/src/Menu/BaseMenu.php b/src/Menu/BaseMenu.php
index 858cb69..3f36be7 100644
--- a/src/Menu/BaseMenu.php
+++ b/src/Menu/BaseMenu.php
@@ -256,16 +256,6 @@ public function setApp(Kernel $app)
return $this;
}
- /**
- * Get the raw response of the user for this menu.
- *
- * @return Response
- */
- public function response()
- {
- return $this->app->response();
- }
-
/**
* Get the raw response of the user for this menu.
*
@@ -278,6 +268,7 @@ public function userResponse()
/**
* Get the raw response of the user for this menu.
+ * Alias for `userResponse`.
*
* @return string
*/
@@ -338,9 +329,6 @@ public function mustNotTimeout()
/**
* Return the user previous responses.
*
- * @param string $menuName The name of the menu response to retrieve
- * @param string $default The default to pass when no response has been found for the menu provided
- *
* @return UserResponse|mixed
*/
public function previousResponses(...$args)
@@ -402,24 +390,36 @@ public function db($name = '')
return $this->app->db($name);
}
- public function hasResumeFromLastSessionOnThisMenu()
+ /**
+ * If the user has just resumed from the previous session (if the current menu is where the
+ * user left on the previous session).
+ *
+ * @return bool
+ */
+ public function hasResumedFromPreviousSessionOnThisMenu()
{
- return $this->app->hasResumeFromLastSession();
+ return $this->app->hasResumedFromPreviousSessionOnThisMenu();
}
- public function hasResumeFromLastSession()
+ /**
+ * Alias for `hasResumedFromLasSessionOnThisMenu`.
+ *
+ * @return bool
+ */
+ public function hasJustResumedFromPreviousSession()
{
- return $this->app->hasResumeFromLastSession();
+ return $this->hasResumedFromPreviousSessionOnThisMenu();
}
- // public function __call($method, $args)
- // {
- // if (method_exists($this->app, $method)) {
- // return call_user_func([$this->app, $method], ...$args);
- // }
-
- // throw new \BadMethodCallException('Undefined method `'.$method.'` in class '.get_class($this));
- // }
+ /**
+ * If the current menu flow started with the user choosing "Start from previous session".
+ *
+ * @return bool
+ */
+ public function hasResumedFromPreviousSession()
+ {
+ return $this->app->hasResumedFromPreviousSession();
+ }
// ArrayAccess Interface
public function offsetExists($offset)
diff --git a/src/Menu/Menus.php b/src/Menu/Menus.php
index 4131657..6e72e14 100644
--- a/src/Menu/Menus.php
+++ b/src/Menu/Menus.php
@@ -93,29 +93,29 @@ public function hydrateMenus($app)
$this->insertMenuActions($modifications, $app->currentMenuName());
}
- if ($app->config('app.ask_user_before_reload_last_session')) {
+ if ($app->config('app.ask_user_before_reload_previous_session')) {
$this->menus = array_merge(
$this->menus,
- $this->menuAskUserBeforeReloadLastSession()
+ $this->menuAskUserBeforeReloadPreviousSession()
);
}
}
- public function menuAskUserBeforeReloadLastSession()
+ public function menuAskUserBeforeReloadPreviousSession()
{
- $message = $this->app->config('menu.message_ask_user_before_reload_last_session');
- $lastSessionTrigger = $this->app->config('menu.last_session_trigger');
- $lastSessionDisplay = $this->app->config('menu.last_session_display');
+ $message = $this->app->config('menu.message_ask_user_before_reload_previous_session');
+ $previousSessionTrigger = $this->app->config('menu.previous_session_trigger');
+ $previousSessionDisplay = $this->app->config('menu.previous_session_display');
$restartSessionTrigger = $this->app->config('menu.restart_session_trigger');
$restartSessionDisplay = $this->app->config('menu.restart_session_display');
return [
- ASK_USER_BEFORE_RELOAD_LAST_SESSION => [
+ ASK_USER_BEFORE_RELOAD_PREVIOUS_SESSION => [
'message' => $message,
'actions' => [
- $lastSessionTrigger => [
- ITEM_MSG => $lastSessionDisplay,
- ITEM_ACTION => APP_CONTINUE_LAST_SESSION,
+ $previousSessionTrigger => [
+ ITEM_MSG => $previousSessionDisplay,
+ ITEM_ACTION => APP_CONTINUE_PREVIOUS_SESSION,
],
$restartSessionTrigger => [
ITEM_MSG => $restartSessionDisplay,
diff --git a/src/Menu/Paginator.php b/src/Menu/Paginator.php
index 7332639..edf13d6 100644
--- a/src/Menu/Paginator.php
+++ b/src/Menu/Paginator.php
@@ -56,7 +56,7 @@ public function before()
public function handlePagination()
{
- if ($this->hasResumeFromLastSessionOnThisMenu() || !empty($this->error())) {
+ if ($this->hasResumedFromPreviousSessionOnThisMenu() || !empty($this->error())) {
$this->moveFetchCursorBackOnce();
}
diff --git a/src/Menu/Traits/Action.php b/src/Menu/Traits/Action.php
index 999ce5c..8ac791a 100644
--- a/src/Menu/Traits/Action.php
+++ b/src/Menu/Traits/Action.php
@@ -10,7 +10,6 @@ trait Action
/**
* Merge an action array with an actionBag.
*
- *
* @param array $actionBag
* @param array $mergeWith
*
@@ -28,12 +27,9 @@ public function mergeAction($actionBag, $mergeWith)
* (in config/menu.php file).
* Same for the display.
*
- * @param string $trigger
- * @param string $display
- *
* @return array The modified action bag
*/
- public function insertMainMenuAction($trigger = '', $display = '')
+ public function insertMainMenuAction(string $trigger = '', string $display = '')
{
return $this->insertMenuActions($this->mainMenuAction($trigger, $display));
}
@@ -45,12 +41,9 @@ public function insertMainMenuAction($trigger = '', $display = '')
* (in config/menu.php file).
* Same for the display.
*
- * @param string $trigger
- * @param string $display
- *
* @return array
*/
- public function mainMenuAction($trigger = '', $display = '')
+ public function mainMenuAction(string $trigger = '', string $display = '')
{
$trigger = $trigger ?: $this->app->config('menu.welcome_action_trigger');
$display = $display ?: $this->app->config('menu.welcome_action_display');
@@ -63,6 +56,18 @@ public function mainMenuAction($trigger = '', $display = '')
];
}
+ /**
+ * Return a `go to main menu` action bag.
+ *
+ * Alias for `mainMenuAction`
+ *
+ * @return array
+ */
+ public function main(string $trigger = '', string $display = '')
+ {
+ return $this->mainMenuAction($trigger, $display);
+ }
+
/**
* Insert a `go to previous menu` action into the actions.
*
@@ -109,7 +114,7 @@ public function backAction($trigger = '', $display = '')
/**
* Return an action bag containing a `go to previous menu` option, as an array.
*
- * Alias for the `backAction` method.
+ * Alias for the `backAction`.
*
* @param string $trigger
* @param string $display
@@ -248,6 +253,23 @@ public function endAction($trigger = '', $display = '')
];
}
+ /**
+ * Return a `end USSD` action.
+ *
+ * If no trigger is passed, it will use the configured trigger
+ * (in config/menu.php file).
+ * Same for the display.
+ *
+ * @param string $trigger
+ * @param string $display
+ *
+ * @return array
+ */
+ public function end($trigger = '', $display = '')
+ {
+ return $this->endAction($trigger, $display);
+ }
+
/**
* Return an action bag after adding the back action to it.
*
@@ -255,9 +277,9 @@ public function endAction($trigger = '', $display = '')
*
* @return array
*/
- public function withBack($actionBag = [])
+ public function withBack($actionBag = [], $backTrigger = '', $display = '')
{
- return $this->mergeAction($actionBag, $this->backAction());
+ return $this->mergeAction($actionBag, $this->backAction($backTrigger, $display));
}
/**
diff --git a/src/Menu/Traits/Response.php b/src/Menu/Traits/Response.php
index 95f6741..b474c77 100644
--- a/src/Menu/Traits/Response.php
+++ b/src/Menu/Traits/Response.php
@@ -7,6 +7,16 @@
*/
trait Response
{
+ /**
+ * Instance of the response to send back to the user.
+ *
+ * @return Response
+ */
+ public function response()
+ {
+ return $this->app->response();
+ }
+
/**
* Convert message to string if it is not.
*
@@ -90,7 +100,7 @@ public function hardEnd($message)
* Sends the final response screen to the user and automatically exits the
* script.
*
- * @param string|array $message
+ * @param string[]|string $message
*
* @return void
*/
@@ -99,6 +109,32 @@ public function respondAndExit($message)
$this->hardEnd($message);
}
+ /**
+ * Sends final response and the same response as SMS.
+ *
+ * @param string[]|string $message
+ *
+ * @return void
+ */
+ public function respondWithSms($message)
+ {
+ $this->respondAndContinue($message);
+ $this->sendSms();
+ }
+
+ /**
+ * Sends final response and the same response as SMS and exit.
+ *
+ * @param string[]|string $message
+ *
+ * @return void
+ */
+ public function respondWithSmsAndExit($message)
+ {
+ $this->respondAndContinue($message);
+ $this->sendSmsAndExit($message);
+ }
+
/**
* Sends the final response screen to the user and automatically exits the
* script.
diff --git a/src/Menu/Traits/Session.php b/src/Menu/Traits/Session.php
index a41a791..d0e5f81 100644
--- a/src/Menu/Traits/Session.php
+++ b/src/Menu/Traits/Session.php
@@ -8,7 +8,9 @@
trait Session
{
/**
- * Allows developer to save a value in the session.
+ * Allows developer to save a value in the session. This does not persist the value to storage
+ * automatically. The value is persisted only at the end of the request (when the framework
+ * sends a response back to the user.).
*
* @param string $name
* @param mixed $value
@@ -21,7 +23,7 @@ public function sessionSave($name, $value)
}
/**
- * Allow developer to retrieve a previously saved value from the session.
+ * Allows developer to retrieve a previously saved value from the session.
*
* Returns the value associated to $name, if found. If the key $name is not
* in the session, it returns the $default passed. If no $default was
@@ -40,7 +42,7 @@ public function sessionGet($name, $default = null)
}
/**
- * Allow developer to check if the session contains an index.
+ * Allows developer to check if the session contains an index.
*
* @param string $name
*
@@ -52,7 +54,7 @@ public function sessionHas($name)
}
/**
- * Allow the developer to remove a key from the session.
+ * Allows the developer to remove a key from the session.
*
* @param string $name
*
@@ -64,15 +66,28 @@ public function sessionRemove($name)
}
/**
- * Allow the developer to retrieve a value from the session.
- * This is identical to `sessionGet`.
+ * Returns the session value of `$key` if `$key` is in the session, else returns `$default` and
+ * save `$default` to the session.
+ *
+ * @param string $key
+ * @param mixed $default
+ *
+ * @return mixed
+ */
+ public function sessionRemember($key, $default)
+ {
+ return $this->session()->remember($key, $default);
+ }
+
+ /**
+ * Get the session instance. Can also be used as `sessionGet` by passing $key with/out $default.
*
* @param string $key
* @param mixed $default
*
* @throws \RuntimeException If $key not found and no $default passed.
*
- * @return mixed
+ * @return \Rejoice\Session\SessionInterface|mixed
*/
public function session($key = null, $default = null)
{
diff --git a/src/Session/DatabaseSession.php b/src/Session/DatabaseSession.php
index 53fe824..4b9e317 100644
--- a/src/Session/DatabaseSession.php
+++ b/src/Session/DatabaseSession.php
@@ -21,7 +21,7 @@
*
* @author Prince Dorcis
*/
-class DatabaseSession extends Session implements SessionInterface
+class DatabaseSession extends Session
{
protected $db;
protected $tableName;
diff --git a/src/Session/FileSession.php b/src/Session/FileSession.php
index bd12ed2..632d2a3 100644
--- a/src/Session/FileSession.php
+++ b/src/Session/FileSession.php
@@ -20,7 +20,7 @@
*
* @author Prince Dorcis
*/
-class FileSession extends Session implements SessionInterface
+class FileSession extends Session
{
protected $file = null;
diff --git a/src/Session/Session.php b/src/Session/Session.php
index 3c829f8..3fd85f6 100644
--- a/src/Session/Session.php
+++ b/src/Session/Session.php
@@ -21,7 +21,7 @@
*
* @author Prince Dorcis
*/
-class Session
+abstract class Session implements SessionInterface
{
protected $driver;
protected $app;
@@ -40,26 +40,6 @@ public function __construct(Kernel $app)
$this->driver = $this->config['driver'];
}
- /**
- * Check if the just retrieved session is a previous session.
- *
- * @return bool
- */
- public function isPrevious()
- {
- return !$this->isNew();
- }
-
- /**
- * Check if the session loaded is a new session.
- *
- * @return bool
- */
- public function isNew()
- {
- return $this->isNew;
- }
-
/**
* Starts the session.
*
@@ -75,25 +55,16 @@ protected function start()
} elseif ($this->app->isFirstRequest() && $this->hasExpired()) {
$this->renew();
}
-
- // switch ($this->app->ussdRequestType()) {
- // case APP_REQUEST_INIT:
- // if ($this->hasExpired()) {
- // $this->renew();
- // }
-
- // break;
-
- // case APP_REQUEST_USER_SENT_RESPONSE:
- // break;
- // }
}
- public function renew()
+ /**
+ * Check if the session loaded is a new session.
+ *
+ * @return bool
+ */
+ public function isNew()
{
- $this->deletePreviousData();
- $this->isNew = true;
- $this->initialise();
+ return $this->isNew;
}
public function initialise()
@@ -112,28 +83,20 @@ public function hasExpired()
return $this->hasPassed('lifetime');
}
- public function hasTimedOut()
- {
- return $this->hasPassed('timeout');
- }
-
public function hasPassed($type)
{
$allowed = $this->app->config("session.{$type}");
$lastConnection = $this->data['__last_connection'] ?? 0;
$now = microtime(true);
- return $this->secondsToMinutes($now - $lastConnection) >= $allowed;
+ return ($now - $lastConnection) >= $allowed;
}
- public function secondsToMinutes($sec)
- {
- return $sec / 60;
- }
-
- public function mustNotTimeout()
+ public function renew()
{
- return $this->app->config('app.allow_timeout') === false;
+ $this->deletePreviousData();
+ $this->isNew = true;
+ $this->initialise();
}
protected function deletePreviousData()
@@ -142,41 +105,37 @@ protected function deletePreviousData()
}
/**
- * Delete session data from the storage.
- *
- * This methodm leaves untouched the current live session data
+ * Check if the just retrieved session is a previous session.
*
- * @return void
+ * @return bool
*/
- public function delete()
+ public function hasPrevious()
{
+ return !$this->isNew();
}
- /**
- * Attempts to retrieve a previous session data from the storage.
- *
- * @return void
- */
- public function retrievePreviousData()
+ public function hasTimedOut()
{
+ return $this->hasPassed('timeout');
}
- /**
- * Save the session data to the current configured storage.
- *
- * @return void
- */
- public function save()
+ public function mustNotTimeout()
{
+ return $this->app->config('app.allow_timeout') === false;
}
/**
- * Reset completely the session data, both in live and in the storage.
+ * Reset the session.
+ *
+ * This does not affect the session in its storage. Only the live session
+ * currently in use. To delete the session completely, in live and in the
+ * storage, use `hardReset`
*
* @return void
*/
- public function hardReset()
+ public function reset()
{
+ $this->initialise();
}
/**
@@ -223,8 +182,7 @@ public function get($key = null, $default = null)
/**
* Set a value into the part of the session accessible by the developer.
*
- * @param string $key
- * @param mixed $value
+ * @param mixed $value
*
* @return void
*/
@@ -234,6 +192,10 @@ public function set(string $key, $value)
$this->setMetadata(DEVELOPER_SAVED_DATA, []);
}
+ if (is_callable($value)) {
+ $value = call_user_func($value);
+ }
+
$this->data[DEVELOPER_SAVED_DATA] = Arr::multiKeySet(
$key,
$value,
@@ -243,6 +205,24 @@ public function set(string $key, $value)
return $this;
}
+ /**
+ * Returns the session value of `$key` if `$key` is in the session, else returns `$default` and
+ * save `$default` to the session.
+ *
+ * @param string $key
+ * @param mixed $default
+ *
+ * @return mixed
+ */
+ public function remember($key, $default)
+ {
+ if (!$this->has($key)) {
+ $this->set($key, $default);
+ }
+
+ return $this->get($key);
+ }
+
/**
* Remove a key from the part of the session accessible by the developer.
*
@@ -254,12 +234,6 @@ public function set(string $key, $value)
*/
public function remove($key)
{
- // if (isset($this->data[DEVELOPER_SAVED_DATA][$key])) {
- // unset($this->data[DEVELOPER_SAVED_DATA][$key]);
-
- // return true;
- // }
-
$explodedKey = explode('.', $key);
if (isset($this->data[DEVELOPER_SAVED_DATA][$explodedKey[0]])) {
@@ -280,8 +254,6 @@ public function remove($key)
*
* If no key is passed, checks if the session is not empty
*
- * @param string $key
- *
* @return bool
*/
public function has(string $key = '')
@@ -298,8 +270,6 @@ public function has(string $key = '')
*
* If no key is passed, checks if the session is not empty
*
- * @param string $key
- *
* @return bool
*/
public function hasMetadata(string $key = '')
@@ -314,8 +284,7 @@ public function hasMetadata(string $key = '')
/**
* Set a framework-level variable in the session.
*
- * @param string $key
- * @param mixed $value
+ * @param mixed $value
*
* @return void
*/
@@ -331,8 +300,6 @@ public function setMetadata(string $key, $value)
*
* Returns true if the variable exists and has been removed, false otherwise
*
- * @param string $key
- *
* @return void
*/
public function removeMetadata(string $key)
@@ -343,8 +310,7 @@ public function removeMetadata(string $key)
/**
* Retrieve a framework-level variable from the session.
*
- * @param string $key
- * @param mixed $default
+ * @param mixed $default
*
* @throws \RuntimeException If value not found and no default value has been provided
*
@@ -368,18 +334,4 @@ public function metadata(string $key = '', $default = null)
return $value;
}
-
- /**
- * Reset the session.
- *
- * This does not affect the session in its storage. Only the live session
- * currently in use. To delete the session completely, in live and in the
- * storage, use `hardReset`
- *
- * @return void
- */
- public function reset()
- {
- $this->initialise();
- }
}
diff --git a/src/Session/SessionInterface.php b/src/Session/SessionInterface.php
index 07eca62..2e0d880 100644
--- a/src/Session/SessionInterface.php
+++ b/src/Session/SessionInterface.php
@@ -18,19 +18,84 @@
*/
interface SessionInterface
{
- public function isPrevious();
+ public function hasPrevious();
+ /**
+ * Delete session data only from the storage.
+ *
+ * Does not delete the current live session data.
+ *
+ * @return void
+ */
public function delete();
public function reset();
+ /**
+ * Reset completely the session data, both in live and in the storage.
+ *
+ * @return void
+ */
public function hardReset();
+ /**
+ * Attempts to retrieve a previous session data from the storage.
+ *
+ * @return void
+ */
public function retrievePreviousData();
public function retrieveData();
public function previousSessionNotExists();
+ /**
+ * Save the session data to the current configured storage.
+ *
+ * @return void
+ */
public function save();
+
+ /**
+ * Retrieve a value from the part of the session accessible by the developer.
+ *
+ * @param string $key
+ * @param mixed $default
+ *
+ * @throws \RuntimeException If value not found and no default value has been provided
+ *
+ * @return mixed
+ */
+ public function get($key = null, $default = null);
+
+ /**
+ * Set a value into the part of the session accessible by the developer.
+ *
+ * @param mixed $value
+ *
+ * @return void
+ */
+ public function set(string $key, $value);
+
+ /**
+ * Remove a key from the part of the session accessible by the developer.
+ *
+ * Returns true if the key exists and has been removed. False otherwise
+ *
+ * @param string $key
+ *
+ * @return bool
+ */
+ public function remove($key);
+
+ /**
+ * Returns the session value of `$key` if `$key` is in the session, else returns `$default` and
+ * save `$default` to the session.
+ *
+ * @param string $key
+ * @param mixed $default
+ *
+ * @return mixed
+ */
+ public function remember($key, $default);
}
diff --git a/src/Utils/SmsService.php b/src/Sms/SmsService.php
similarity index 85%
rename from src/Utils/SmsService.php
rename to src/Sms/SmsService.php
index 088d461..b6e0349 100644
--- a/src/Utils/SmsService.php
+++ b/src/Sms/SmsService.php
@@ -9,7 +9,7 @@
* file that was distributed with this source code.
*/
-namespace Rejoice\Utils;
+namespace Rejoice\Sms;
use Rejoice\Foundation\Kernel;
@@ -18,7 +18,7 @@
*
* @author Prince Dorcis
*/
-class SmsService
+class SmsService implements SmsServiceInterface
{
protected $app;
@@ -34,8 +34,22 @@ public function __construct(Kernel $app)
$this->app = $app;
}
+ /**
+ * Send SMS.
+ *
+ * @param string[]|string $message
+ * @param string $msisdn
+ * @param string $senderName
+ * @param string $endpoint
+ *
+ * @return void
+ */
public function send($message, $msisdn = '', $senderName = '', $endpoint = '')
{
+ if (is_array($message)) {
+ $message = implode("\n", $message);
+ }
+
if (!($message = trim($message))) {
return;
}
diff --git a/src/Sms/SmsServiceInterface.php b/src/Sms/SmsServiceInterface.php
new file mode 100644
index 0000000..329122a
--- /dev/null
+++ b/src/Sms/SmsServiceInterface.php
@@ -0,0 +1,15 @@
+