From 46b4491e53d0a0208cb24294a2533c03bffdca88 Mon Sep 17 00:00:00 2001 From: fluent-themes Date: Sun, 10 Aug 2025 02:28:44 +0600 Subject: [PATCH 1/4] Add debug artifact packaging and workflow --- .env.example | 12 + .github/workflows/ci.yml | 17 + .github/workflows/debug-artifact.yml | 27 + .gitignore | 15 +- admin/.htaccess | 2 + admin/assets/css/admin.css | 6 + admin/assets/js/admin.js | 0 admin/index.php | 10 + admin/views/layout.php | 13 + admin/views/submissions-table.php | 22 + app/Core/Env.php | 41 + app/Core/Request.php | 10 + app/Core/Response.php | 10 + app/Installer/EnvWriter.php | 12 + app/Installer/Installer.php | 38 + app/Installer/SqlSchema.php | 21 + app/Repository/SubmissionRepository.php | 26 + app/Repository/SubmissionRepositoryMock.php | 14 + app/Services/LicenseValidator.php | 17 + app/Services/OpenAIHandler.php | 25 + app/Services/OpenAIHandlerMock.php | 17 + app/Support/Database.php | 15 + app/Support/DatabaseMock.php | 9 + app/Support/Logger.php | 18 + app/Support/Mailer.php | 26 + app/Support/MailerMock.php | 16 + artifacts/.gitkeep | 0 bootstrap.php | 20 + composer.json | 23 + composer.lock | 2348 +++++++++++++++++++ docs/DEBUG.md | 21 + phpunit.xml.dist | 8 + public/.htaccess | 4 + public/assets/css/style.css | 11 + public/assets/js/main.js | 9 + public/index.php | 96 + public/installer.php | 5 + public/thank-you.php | 16 + scripts/package_debug.php | 62 + storage/logs/.gitkeep | 0 storage/mail/.gitkeep | 0 tests/SmokeTest.php | 36 + tests/bootstrap.php | 12 + 43 files changed, 3106 insertions(+), 4 deletions(-) create mode 100644 .env.example create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/debug-artifact.yml create mode 100644 admin/.htaccess create mode 100644 admin/assets/css/admin.css create mode 100644 admin/assets/js/admin.js create mode 100644 admin/index.php create mode 100644 admin/views/layout.php create mode 100644 admin/views/submissions-table.php create mode 100644 app/Core/Env.php create mode 100644 app/Core/Request.php create mode 100644 app/Core/Response.php create mode 100644 app/Installer/EnvWriter.php create mode 100644 app/Installer/Installer.php create mode 100644 app/Installer/SqlSchema.php create mode 100644 app/Repository/SubmissionRepository.php create mode 100644 app/Repository/SubmissionRepositoryMock.php create mode 100644 app/Services/LicenseValidator.php create mode 100644 app/Services/OpenAIHandler.php create mode 100644 app/Services/OpenAIHandlerMock.php create mode 100644 app/Support/Database.php create mode 100644 app/Support/DatabaseMock.php create mode 100644 app/Support/Logger.php create mode 100644 app/Support/Mailer.php create mode 100644 app/Support/MailerMock.php create mode 100644 artifacts/.gitkeep create mode 100644 bootstrap.php create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 docs/DEBUG.md create mode 100644 phpunit.xml.dist create mode 100644 public/.htaccess create mode 100644 public/assets/css/style.css create mode 100644 public/assets/js/main.js create mode 100644 public/index.php create mode 100644 public/installer.php create mode 100644 public/thank-you.php create mode 100644 scripts/package_debug.php create mode 100644 storage/logs/.gitkeep create mode 100644 storage/mail/.gitkeep create mode 100644 tests/SmokeTest.php create mode 100644 tests/bootstrap.php diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..5919ea9 --- /dev/null +++ b/.env.example @@ -0,0 +1,12 @@ +APP_ENV=local +APP_DEBUG=true +LOG_CHANNEL=single + +OPENAI_API_KEY=MOCK_MODE +OPENAI_MODEL=gpt-4o-mini + +MAIL_TRANSPORT=file +MAIL_FROM_ADDRESS=noreply@example.test +MAIL_FROM_NAME="AI Reply Bot" + +DB_CONNECTION=none diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..541fbef --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,17 @@ +name: CI + +on: + push: + pull_request: + +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: shivammathur/setup-php@v2 + with: + php-version: '8.4' + - run: cp .env.example .env + - run: composer install --no-interaction --prefer-dist + - run: composer test diff --git a/.github/workflows/debug-artifact.yml b/.github/workflows/debug-artifact.yml new file mode 100644 index 0000000..2d0a8ac --- /dev/null +++ b/.github/workflows/debug-artifact.yml @@ -0,0 +1,27 @@ +name: debug-artifact + +on: + push: + pull_request: + +jobs: + debug: + runs-on: ubuntu-latest + env: + OPENAI_API_KEY: MOCK_MODE + MAIL_TRANSPORT: file + DB_CONNECTION: none + steps: + - uses: actions/checkout@v4 + - name: Set up PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '8.2' + - run: cp .env.example .env + - run: composer install --no-interaction --no-progress + - run: composer test || true + - run: php scripts/package_debug.php + - uses: actions/upload-artifact@v4 + with: + name: debug-${{ github.run_number }} + path: artifacts/debug-*.zip diff --git a/.gitignore b/.gitignore index debf2e9..797ff34 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,18 @@ -# Ignore vendor and environment files -/vendor/ +# Ignore environment files /.env /.DS_Store -# Ignore logs and cache -logs/ +# Ignore logs and artifacts +storage/logs/* +!storage/logs/.gitkeep +storage/mail/* +!storage/mail/.gitkeep +artifacts/* +!artifacts/.gitkeep *.log +*.eml +*.error_log +/vendor/ # Ignore test output /phpunit.xml diff --git a/admin/.htaccess b/admin/.htaccess new file mode 100644 index 0000000..c651d7b --- /dev/null +++ b/admin/.htaccess @@ -0,0 +1,2 @@ + +# Placeholder: you can add BasicAuth here later diff --git a/admin/assets/css/admin.css b/admin/assets/css/admin.css new file mode 100644 index 0000000..47d6342 --- /dev/null +++ b/admin/assets/css/admin.css @@ -0,0 +1,6 @@ + +table{width:100%;border-collapse:collapse} +th,td{padding:8px 6px;border:1px solid #ddd;font-size:14px} +th{background:#f1f5f9} +body{font-family:Arial,Helvetica,sans-serif;margin:0;padding:16px;background:#f7f8fa} +h1{font-size:22px} diff --git a/admin/assets/js/admin.js b/admin/assets/js/admin.js new file mode 100644 index 0000000..e69de29 diff --git a/admin/index.php b/admin/index.php new file mode 100644 index 0000000..ff5fec9 --- /dev/null +++ b/admin/index.php @@ -0,0 +1,10 @@ + +query('SELECT * FROM submissions ORDER BY id DESC LIMIT 100'); +$rows = $stmt->fetchAll(PDO::FETCH_ASSOC); +include __DIR__.'/views/submissions-table.php'; +?> diff --git a/admin/views/layout.php b/admin/views/layout.php new file mode 100644 index 0000000..b6020c2 --- /dev/null +++ b/admin/views/layout.php @@ -0,0 +1,13 @@ + + + + + +Admin - AI Responder + + + +

Admin Dashboard

+ + + diff --git a/admin/views/submissions-table.php b/admin/views/submissions-table.php new file mode 100644 index 0000000..eb9b974 --- /dev/null +++ b/admin/views/submissions-table.php @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + +
IDNameEmailCategoryProductDate
+ diff --git a/app/Core/Env.php b/app/Core/Env.php new file mode 100644 index 0000000..4199ccf --- /dev/null +++ b/app/Core/Env.php @@ -0,0 +1,41 @@ + 'local', + 'APP_DEBUG' => 'true', + 'LOG_CHANNEL' => 'single', + 'OPENAI_API_KEY' => 'MOCK_MODE', + 'OPENAI_MODEL' => 'gpt-4o-mini', + 'MAIL_TRANSPORT' => 'file', + 'MAIL_FROM_ADDRESS' => 'noreply@example.test', + 'MAIL_FROM_NAME' => 'AI Reply Bot', + 'DB_CONNECTION' => 'none', + ]; + + public static function load(string $path): void + { + if (self::$loaded) { + return; + } + if (is_file($path)) { + Dotenv::createImmutable(dirname($path))->safeLoad(); + } + foreach (self::$defaults as $key => $value) { + if (getenv($key) === false) { + $_ENV[$key] = $value; + putenv("{$key}={$value}"); + } + } + self::$loaded = true; + } + + public static function get(string $key, $default = null) + { + return $_ENV[$key] ?? getenv($key) ?? $default; + } +} diff --git a/app/Core/Request.php b/app/Core/Request.php new file mode 100644 index 0000000..7d8f791 --- /dev/null +++ b/app/Core/Request.php @@ -0,0 +1,10 @@ + diff --git a/app/Core/Response.php b/app/Core/Response.php new file mode 100644 index 0000000..06e1809 --- /dev/null +++ b/app/Core/Response.php @@ -0,0 +1,10 @@ + + diff --git a/app/Installer/EnvWriter.php b/app/Installer/EnvWriter.php new file mode 100644 index 0000000..c595dbe --- /dev/null +++ b/app/Installer/EnvWriter.php @@ -0,0 +1,12 @@ + +$v){ + $content .= $k.'='.$v.PHP_EOL; + } + file_put_contents($path, $content); + } +} +?> diff --git a/app/Installer/Installer.php b/app/Installer/Installer.php new file mode 100644 index 0000000..af1f305 --- /dev/null +++ b/app/Installer/Installer.php @@ -0,0 +1,38 @@ + + 'production', + 'DB_HOST' => $dbHost, + 'DB_NAME' => $dbName, + 'DB_USER' => $dbUser, + 'DB_PASS' => $dbPass, + ], __DIR__.'/../../.env'); + echo 'Env written. Importing DB...
'; + $pdo = new PDO("mysql:host={$dbHost}", $dbUser, $dbPass); + $pdo->exec("CREATE DATABASE IF NOT EXISTS `{$dbName}` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"); + $pdo->exec("USE `{$dbName}`;"); + $pdo->exec(SqlSchema::createTable()); + echo 'Done!'; + return; + } + echo '
+
+
+
+
+ +
'; + } +} +?> diff --git a/app/Installer/SqlSchema.php b/app/Installer/SqlSchema.php new file mode 100644 index 0000000..e2769e1 --- /dev/null +++ b/app/Installer/SqlSchema.php @@ -0,0 +1,21 @@ + + diff --git a/app/Repository/SubmissionRepository.php b/app/Repository/SubmissionRepository.php new file mode 100644 index 0000000..c6b0b93 --- /dev/null +++ b/app/Repository/SubmissionRepository.php @@ -0,0 +1,26 @@ + +pdo = $pdo; + } + public function save(array $data){ + $stmt = $this->pdo->prepare('INSERT INTO submissions + (name,email,message,tone,purchase_code,product_name,category,ai_reply,created_at) + VALUES (?,?,?,?,?,?,?,?,NOW())'); + $stmt->execute([ + $data['name'], + $data['email'], + $data['message'], + $data['tone'], + $data['purchase_code'], + $data['product_name'], + $data['category'], + $data['ai_reply'], + ]); + } +} +?> diff --git a/app/Repository/SubmissionRepositoryMock.php b/app/Repository/SubmissionRepositoryMock.php new file mode 100644 index 0000000..494b894 --- /dev/null +++ b/app/Repository/SubmissionRepositoryMock.php @@ -0,0 +1,14 @@ + diff --git a/app/Services/OpenAIHandler.php b/app/Services/OpenAIHandler.php new file mode 100644 index 0000000..5bd50ea --- /dev/null +++ b/app/Services/OpenAIHandler.php @@ -0,0 +1,25 @@ +\n" . + "Category: "; + } + + public static function query(string $prompt): array + { + $apiKey = Env::get('OPENAI_API_KEY'); + // Real call would go here. For now, return dummy. + return [ + 'reply' => 'Thank you for reaching out. We will get back shortly.', + 'category' => 'Support', + ]; + } +} diff --git a/app/Services/OpenAIHandlerMock.php b/app/Services/OpenAIHandlerMock.php new file mode 100644 index 0000000..0659190 --- /dev/null +++ b/app/Services/OpenAIHandlerMock.php @@ -0,0 +1,17 @@ + "This is a mock AI reply.\n\nPrompt snippet: " . substr($prompt, 0, 80), + 'category' => 'Mock', + ]; + } +} diff --git a/app/Support/Database.php b/app/Support/Database.php new file mode 100644 index 0000000..738ca2f --- /dev/null +++ b/app/Support/Database.php @@ -0,0 +1,15 @@ + + PDO::ERRMODE_EXCEPTION, + ]); + return $pdo; + } +} +?> diff --git a/app/Support/DatabaseMock.php b/app/Support/DatabaseMock.php new file mode 100644 index 0000000..d1093cb --- /dev/null +++ b/app/Support/DatabaseMock.php @@ -0,0 +1,9 @@ +pushHandler(new StreamHandler($logPath)); + return $logger; + } +} diff --git a/app/Support/Mailer.php b/app/Support/Mailer.php new file mode 100644 index 0000000..190245e --- /dev/null +++ b/app/Support/Mailer.php @@ -0,0 +1,26 @@ +mailer = new PHPMailer(true); + $this->mailer->From = Env::get('MAIL_FROM_ADDRESS'); + $this->mailer->FromName = Env::get('MAIL_FROM_NAME'); + } + + public function send(string $to, string $subject, string $html, string $text = ''): bool + { + $m = $this->mailer; + $m->addAddress($to); + $m->Subject = $subject; + $m->Body = $html; + $m->AltBody = $text ?: strip_tags($html); + return $m->send(); + } +} diff --git a/app/Support/MailerMock.php b/app/Support/MailerMock.php new file mode 100644 index 0000000..2d7ef46 --- /dev/null +++ b/app/Support/MailerMock.php @@ -0,0 +1,16 @@ + $logger, + 'db' => $db, +]; diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..844e3e3 --- /dev/null +++ b/composer.json @@ -0,0 +1,23 @@ +{ + "name": "fluentthemes/ai-contact-form-auto-responder", + "description": "AI Contact Form Auto\u2011Responder", + "type": "project", + "autoload": { + "psr-4": { + "App\\": "app/" + } + }, + "require": { + "php": ">=8.0", + "vlucas/phpdotenv": "^5.6", + "monolog/monolog": "^2.9", + "phpmailer/phpmailer": "^6.9" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "scripts": { + "test": "phpunit", + "test:pack": "composer test || true && php scripts/package_debug.php" + } +} \ No newline at end of file diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..f8910db --- /dev/null +++ b/composer.lock @@ -0,0 +1,2348 @@ +{ + "_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": "045208226f532a697d21b0bcd54b6ca2", + "packages": [ + { + "name": "graham-campbell/result-type", + "version": "v1.1.3", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/3ba905c11371512af9d9bdd27d99b782216b6945", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:45:45+00:00" + }, + { + "name": "monolog/monolog", + "version": "2.10.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "5cf826f2991858b54d5c3809bee745560a1042a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/5cf826f2991858b54d5c3809bee745560a1042a7", + "reference": "5cf826f2991858b54d5c3809bee745560a1042a7", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2@dev", + "guzzlehttp/guzzle": "^7.4", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "phpspec/prophecy": "^1.15", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8.5.38 || ^9.6.19", + "predis/predis": "^1.1 || ^2.0", + "rollbar/rollbar": "^1.3 || ^2 || ^3", + "ruflin/elastica": "^7", + "swiftmailer/swiftmailer": "^5.3|^6.0", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/2.10.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2024-11-12T12:43:37+00:00" + }, + { + "name": "phpmailer/phpmailer", + "version": "v6.10.0", + "source": { + "type": "git", + "url": "https://github.com/PHPMailer/PHPMailer.git", + "reference": "bf74d75a1fde6beaa34a0ddae2ec5fce0f72a144" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/bf74d75a1fde6beaa34a0ddae2ec5fce0f72a144", + "reference": "bf74d75a1fde6beaa34a0ddae2ec5fce0f72a144", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", + "php": ">=5.5.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "doctrine/annotations": "^1.2.6 || ^1.13.3", + "php-parallel-lint/php-console-highlighter": "^1.0.0", + "php-parallel-lint/php-parallel-lint": "^1.3.2", + "phpcompatibility/php-compatibility": "^9.3.5", + "roave/security-advisories": "dev-latest", + "squizlabs/php_codesniffer": "^3.7.2", + "yoast/phpunit-polyfills": "^1.0.4" + }, + "suggest": { + "decomplexity/SendOauth2": "Adapter for using XOAUTH2 authentication", + "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses", + "ext-openssl": "Needed for secure SMTP sending and DKIM signing", + "greew/oauth2-azure-provider": "Needed for Microsoft Azure XOAUTH2 authentication", + "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication", + "league/oauth2-google": "Needed for Google XOAUTH2 authentication", + "psr/log": "For optional PSR-3 debug logging", + "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)", + "thenetworg/oauth2-azure": "Needed for Microsoft XOAUTH2 authentication" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPMailer\\PHPMailer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-only" + ], + "authors": [ + { + "name": "Marcus Bointon", + "email": "phpmailer@synchromedia.co.uk" + }, + { + "name": "Jim Jagielski", + "email": "jimjag@gmail.com" + }, + { + "name": "Andy Prevost", + "email": "codeworxtech@users.sourceforge.net" + }, + { + "name": "Brent R. Matzelle" + } + ], + "description": "PHPMailer is a full-featured email creation and transfer class for PHP", + "support": { + "issues": "https://github.com/PHPMailer/PHPMailer/issues", + "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.10.0" + }, + "funding": [ + { + "url": "https://github.com/Synchro", + "type": "github" + } + ], + "time": "2025-04-24T15:19:31+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.9.3", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/e3fac8b24f56113f7cb96af14958c0dd16330f54", + "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.9.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:41:07+00:00" + }, + { + "name": "psr/log", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://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/3.0.2" + }, + "time": "2024-09-11T13:17:53+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.32.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.32.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": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.32.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.32.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": "2024-12-23T08:48:59+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.32.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.32.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": "2025-01-02T08:10:11+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.6.2", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "24ac4c74f91ee2c193fa1aaa5c249cb0822809af" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/24ac4c74f91ee2c193fa1aaa5c249cb0822809af", + "reference": "24ac4c74f91ee2c193fa1aaa5c249cb0822809af", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.1.3", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3", + "symfony/polyfill-ctype": "^1.24", + "symfony/polyfill-mbstring": "^1.24", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-filter": "*", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "5.6-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2025-04-30T23:37:27+00:00" + } + ], + "packages-dev": [ + { + "name": "myclabs/deep-copy", + "version": "1.13.4", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2025-08-01T08:46:24+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.6.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "221b0d0fdf1369c71047ad1d18bb5880017bbc56" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/221b0d0fdf1369c71047ad1d18bb5880017bbc56", + "reference": "221b0d0fdf1369c71047ad1d18bb5880017bbc56", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-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/v5.6.0" + }, + "time": "2025-07-27T20:03:57+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "10.1.16", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "7e308268858ed6baedc8704a304727d20bc07c77" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e308268858ed6baedc8704a304727d20bc07c77", + "reference": "7e308268858ed6baedc8704a304727d20bc07c77", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.19.1 || ^5.1.0", + "php": ">=8.1", + "phpunit/php-file-iterator": "^4.1.0", + "phpunit/php-text-template": "^3.0.1", + "sebastian/code-unit-reverse-lookup": "^3.0.0", + "sebastian/complexity": "^3.2.0", + "sebastian/environment": "^6.1.0", + "sebastian/lines-of-code": "^2.0.2", + "sebastian/version": "^4.0.1", + "theseer/tokenizer": "^1.2.3" + }, + "require-dev": { + "phpunit/phpunit": "^10.1" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "10.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.16" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-08-22T04:31:57+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "4.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.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", + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-31T06:24:48+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^10.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.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": "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/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:56:09+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "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": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-31T14:07:24+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.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/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:57:52+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "10.5.49", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "e2571b0e6e372de90f0b147b0cb9379bb105c124" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e2571b0e6e372de90f0b147b0cb9379bb105c124", + "reference": "e2571b0e6e372de90f0b147b0cb9379bb105c124", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.13.4", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=8.1", + "phpunit/php-code-coverage": "^10.1.16", + "phpunit/php-file-iterator": "^4.1.0", + "phpunit/php-invoker": "^4.0.0", + "phpunit/php-text-template": "^3.0.1", + "phpunit/php-timer": "^6.0.0", + "sebastian/cli-parser": "^2.0.1", + "sebastian/code-unit": "^2.0.0", + "sebastian/comparator": "^5.0.3", + "sebastian/diff": "^5.1.1", + "sebastian/environment": "^6.1.0", + "sebastian/exporter": "^5.1.2", + "sebastian/global-state": "^6.0.2", + "sebastian/object-enumerator": "^5.0.0", + "sebastian/recursion-context": "^5.0.0", + "sebastian/type": "^4.0.0", + "sebastian/version": "^4.0.1" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "10.5-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.49" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2025-08-09T07:08:00+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "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 parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:12:49+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "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": "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/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:58:43+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "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": "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/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:59:15+00:00" + }, + { + "name": "sebastian/comparator", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e", + "reference": "a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/diff": "^5.0", + "sebastian/exporter": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.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", + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-10-18T14:56:07+00:00" + }, + { + "name": "sebastian/complexity", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "68ff824baeae169ec9f2137158ee529584553799" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", + "reference": "68ff824baeae169ec9f2137158ee529584553799", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-21T08:37:17+00:00" + }, + { + "name": "sebastian/diff", + "version": "5.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0", + "symfony/process": "^6.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-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", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:15:17+00:00" + }, + { + "name": "sebastian/environment", + "version": "6.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.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": "https://github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-23T08:47:14+00:00" + }, + { + "name": "sebastian/exporter", + "version": "5.1.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "955288482d97c19a372d3f31006ab3f37da47adf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/955288482d97c19a372d3f31006ab3f37da47adf", + "reference": "955288482d97c19a372d3f31006ab3f37da47adf", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:17:12+00:00" + }, + { + "name": "sebastian/global-state", + "version": "6.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.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": "https://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:19:19+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "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 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", + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-21T08:38:20+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "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": "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/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:08:32+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "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": "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/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:06:18+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "05909fb5bc7df4c52992396d0116aed689f93712" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712", + "reference": "05909fb5bc7df4c52992396d0116aed689f93712", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:05:40+00:00" + }, + { + "name": "sebastian/type", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.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 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/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:10:45+00:00" + }, + { + "name": "sebastian/version", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.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/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-07T11:34:05+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:36:25+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": {}, + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=8.0" + }, + "platform-dev": {}, + "plugin-api-version": "2.6.0" +} diff --git a/docs/DEBUG.md b/docs/DEBUG.md new file mode 100644 index 0000000..d9ff9b3 --- /dev/null +++ b/docs/DEBUG.md @@ -0,0 +1,21 @@ +# Debugging Setup + +1. `cp .env.example .env` +2. `composer install` +3. `composer test` + +Logs are written to `storage/logs/app.log`. +Mock emails are saved to `storage/mail/` as `.eml` files. + +## Production + +Edit `.env` to provide real credentials: +- Set a real `OPENAI_API_KEY` to enable OpenAI. +- Use `MAIL_TRANSPORT=smtp` and fill SMTP_* values to send real mail. +- Define `DB_CONNECTION` and DB_* values to use a real database. +Mocks disable automatically when these are set. + +## Debug artifacts + +- **Local:** `composer run test:pack` → ZIP created in `artifacts/`. +- **GitHub Actions:** download artifact `debug-` from the workflow run. diff --git a/phpunit.xml.dist b/phpunit.xml.dist new file mode 100644 index 0000000..956c0f2 --- /dev/null +++ b/phpunit.xml.dist @@ -0,0 +1,8 @@ + + + + + tests + + + diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 0000000..9a10376 --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,4 @@ + +# Deny access to app/ etc if someone maps root to / +RewriteEngine On +RewriteRule ^(app|logs|vendor|tests|config|database)/ - [F,L] diff --git a/public/assets/css/style.css b/public/assets/css/style.css new file mode 100644 index 0000000..37f0bda --- /dev/null +++ b/public/assets/css/style.css @@ -0,0 +1,11 @@ + +body{font-family:Arial,Helvetica,sans-serif;margin:0;padding:0;background:#f7f8fa;color:#333} +form{max-width:480px;margin:40px auto;background:#fff;border:1px solid #ddd;border-radius:6px;padding:24px;box-shadow:0 2px 4px rgba(0,0,0,0.06)} +h1{text-align:center;font-size:24px;margin-bottom:16px} +label{display:block;margin-top:12px;font-weight:bold} +input,textarea,select{width:100%;padding:8px;border:1px solid #ccc;border-radius:4px;margin-top:4px;font-size:14px} +button{margin-top:16px;padding:10px 18px;border:none;border-radius:4px;background:#38a169;color:#fff;font-size:15px;cursor:pointer} +button:hover{background:#2f855a} +.alert{padding:12px;border-radius:4px;margin-bottom:12px} +.alert-error{background:#fed7d7;color:#c53030;border:1px solid #feb2b2} +.alert-success{background:#c6f6d5;color:#22543d;border:1px solid #9ae6b4} diff --git a/public/assets/js/main.js b/public/assets/js/main.js new file mode 100644 index 0000000..ed25d53 --- /dev/null +++ b/public/assets/js/main.js @@ -0,0 +1,9 @@ + +document.addEventListener('DOMContentLoaded',()=>{ + const form=document.querySelector('form'); + if(!form)return; + form.addEventListener('submit',e=>{ + const btn=form.querySelector('button'); + btn.disabled=true;btn.textContent='Sending...'; + }); +}); diff --git a/public/index.php b/public/index.php new file mode 100644 index 0000000..adf59e7 --- /dev/null +++ b/public/index.php @@ -0,0 +1,96 @@ +save([ + 'name' => $name, + 'email' => $email, + 'message' => $msg, + 'tone' => $tone, + 'purchase_code' => $purchase, + 'product_name' => $productName ?? '', + 'category' => $ai['category'], + 'ai_reply' => $ai['reply'] + ]); + + $useMailerMock = Env::get('MAIL_TRANSPORT') === 'file'; + // PRODUCTION NOTE: + // To send real mail: set MAIL_TRANSPORT=smtp and SMTP_* variables in .env + $mailer = $useMailerMock ? new MailerMock() : new Mailer(); + $mailer->send($email, 'Your Reply from AI', $ai['reply']); + header('Location: thank-you.php'); + exit; + } +} +?> + + + + +Contact Support + + + + +
+

Contact Support

+ +
+ + + + + + + +
+ + diff --git a/public/installer.php b/public/installer.php new file mode 100644 index 0000000..4fb63ab --- /dev/null +++ b/public/installer.php @@ -0,0 +1,5 @@ + + diff --git a/public/thank-you.php b/public/thank-you.php new file mode 100644 index 0000000..c7c3d1f --- /dev/null +++ b/public/thank-you.php @@ -0,0 +1,16 @@ + + + + + +Thank You + + + +
+

Thank you!

+

Your message has been received. We'll get back to you soon.

+ Back to form +
+ + diff --git a/scripts/package_debug.php b/scripts/package_debug.php new file mode 100644 index 0000000..7881588 --- /dev/null +++ b/scripts/package_debug.php @@ -0,0 +1,62 @@ +safeLoad(); +} +$artifactsDir = $base . '/artifacts'; +if (!is_dir($artifactsDir)) { + mkdir($artifactsDir, 0777, true); +} + +$timestamp = date('Ymd-His'); +$zipPath = $artifactsDir . "/debug-$timestamp.zip"; + +$zip = new ZipArchive(); +if ($zip->open($zipPath, ZipArchive::CREATE) !== true) { + fwrite(STDERR, "Unable to create zip file\n"); + exit(1); +} + +$included = []; +$targets = ['storage/logs', 'storage/mail']; +foreach ($targets as $target) { + $dir = $base . '/' . $target; + if (!is_dir($dir)) { + continue; + } + $iter = new RecursiveIteratorIterator( + new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS) + ); + foreach ($iter as $file) { + /** @var SplFileInfo $file */ + if ($file->isFile()) { + $relPath = $target . '/' . substr($file->getPathname(), strlen($dir) + 1); + $content = file_get_contents($file->getPathname()); + $content = preg_replace('/sk-[A-Za-z0-9]{16,}/', 'sk-***REDACTED***', $content); + $content = preg_replace('/Authorization:\s*Bearer\s+[^\s]+/i', 'Authorization: Bearer ***REDACTED***', $content); + $content = preg_replace('/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}/', '[redacted@email]', $content); + $zip->addFromString($relPath, $content); + $included[] = $relPath; + } + } +} + +$envInfo = [ + 'OPENAI_API_KEY' => $_ENV['OPENAI_API_KEY'] ?? '', + 'MAIL_TRANSPORT' => $_ENV['MAIL_TRANSPORT'] ?? '', + 'DB_CONNECTION' => $_ENV['DB_CONNECTION'] ?? '', +]; +$readme = "Timestamp: " . date('c') . "\n"; +$readme .= "Environment:\n"; +foreach ($envInfo as $k => $v) { + $readme .= " - $k: $v\n"; +} +$readme .= "Included paths:\n"; +foreach ($included as $p) { + $readme .= " - $p\n"; +} +$zip->addFromString('README.txt', $readme); +$zip->close(); + +echo $zipPath . PHP_EOL; diff --git a/storage/logs/.gitkeep b/storage/logs/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/storage/mail/.gitkeep b/storage/mail/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/SmokeTest.php b/tests/SmokeTest.php new file mode 100644 index 0000000..0c26aba --- /dev/null +++ b/tests/SmokeTest.php @@ -0,0 +1,36 @@ +assertNotEmpty($ai['reply']); + + $repo = Env::get('DB_CONNECTION') === 'none' + ? new SubmissionRepositoryMock(null) + : new SubmissionRepository($GLOBALS['container']['db']); + $repo->save(['dummy' => true]); + + $mailerClass = Env::get('MAIL_TRANSPORT') === 'file' ? MailerMock::class : Mailer::class; + $mailer = new $mailerClass(); + $mailer->send('test@example.com', 'Subj', 'Body'); + $mails = glob(__DIR__ . '/../storage/mail/*.eml'); + $this->assertNotEmpty($mails); + + $logger = Logger::create(); + $logger->info('test'); + $this->assertFileExists(__DIR__ . '/../storage/logs/app.log'); + } +} diff --git a/tests/bootstrap.php b/tests/bootstrap.php new file mode 100644 index 0000000..df04b89 --- /dev/null +++ b/tests/bootstrap.php @@ -0,0 +1,12 @@ +load(); +putenv('OPENAI_API_KEY=MOCK_MODE'); +putenv('MAIL_TRANSPORT=file'); +putenv('DB_CONNECTION=none'); +$_ENV['OPENAI_API_KEY'] = 'MOCK_MODE'; +$_ENV['MAIL_TRANSPORT'] = 'file'; +$_ENV['DB_CONNECTION'] = 'none'; + +require __DIR__ . '/../bootstrap.php'; From c1e274a632f4b6eccee4d6e811eb329d62714d64 Mon Sep 17 00:00:00 2001 From: fluent-themes Date: Sun, 10 Aug 2025 02:30:05 +0600 Subject: [PATCH 2/4] Delete ai-responder-admin.zip --- ai-responder-admin.zip | Bin 1916 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 ai-responder-admin.zip diff --git a/ai-responder-admin.zip b/ai-responder-admin.zip deleted file mode 100644 index e0fa8fa5ae9a94930d0b094102edbffe58d2b5a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1916 zcmWIWW@Zs#00GGi_GmBzO0Waz#Ny)Al4AV;oQl|hipnxm%Mofgzy`Tq3TQV5${7MN zClKpplq4o6rxq7K4hrKq;pyXd_QZKlPu)#HE6(VLdib3Q_VDoxEb!7f=ToMmdotjJ zhpt!X2~QnQ-A7CeFxw#}w|TD@egrg8nGs@gW?o8ag73GK7Z0{P;OGr=SoF1#W9^!fQ+N1Eo}_244LST@Lh(td%)JBE`m23|F4^W? zeIRAY(cE8sr?94HLi*jCX9JG^{b9sa9Gx(0dS%pM;~dYe%+=-5D?FwN->7MPqi{Nt zD|MrGRz;-V$IDNQUS*|UfAi&W{=-|rm%ewOUlX-^Zn>N`zJ~=V^M#QaUYq`w!>~=D#n(dkP zY_^KSVwW0$wt1U3-MP|Rs1b8fYUzQhgZq>GoaVFlhzWR>|H(LBl7HNP-sbIJ-2|6O zDqXwuBA}v*>)f`om|YtizumGdzI?*?x$hRSDfBC z{yxO*zDe#t>5|IGdif2a|Myo-aOW((wE4&5@T-UF;b8^w8qhZkOdtXXgn$_8HDC}x ze3n(rjF!xv+UG7_3RL+3hy{QclE`xsEAvZBK&egF-mXVe3Hh!yFC4s7oLN~}arGMecy_UtN(#sF#(2zG~7$YrAfJ&#l@NVdBwUViAg!BAm2?5w9RiZ-~swhazew?8_|4i zMTd1muWq$+RV&o@P;@-F;?aF`PWfF+gYq|iekA_a&p&# z%MzQMCMfQCGmZ| zmA3f&#q0843$&aHPOn#E6ZVe%xJm1d$jMz<=l=cDew|wOS@piB-82#2DyhIP3tE}X zpEhRi`SK?0&-A{;9qK=lr2luSKh6^PA03(V=B>gMnHP!I&K}H=klIfhkw>saa zxq7dE>btE~R}PB(1eGWVjaLyG!Q~68_s~lin9e1Qe-ZjX1sJ@% zLD-BvBO^?>0Zi4H*&1CxdbURB=VFFM3L=xE>qgH(2;Fz#y0PY`0B=@s65wLsVh98} JRFoB@6#%!jXBq$i From af2f2665fec017840854228d8e03df4b5c28ccff Mon Sep 17 00:00:00 2001 From: fluent-themes Date: Sun, 10 Aug 2025 02:30:21 +0600 Subject: [PATCH 3/4] Delete ai-responder-backend.zip --- ai-responder-backend.zip | Bin 9460 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 ai-responder-backend.zip diff --git a/ai-responder-backend.zip b/ai-responder-backend.zip deleted file mode 100644 index f6bcd3d9f3e5741f2567e9f7752a18f695dc8d27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9460 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%0AJ0A$pA#!kF81 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 From 92630b9c2359522121dc421eae19fc0abca3cf3f Mon Sep 17 00:00:00 2001 From: fluent-themes Date: Sun, 10 Aug 2025 02:30:36 +0600 Subject: [PATCH 4/4] Delete ai-responder-public.zip --- ai-responder-public.zip | Bin 2939 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 ai-responder-public.zip diff --git a/ai-responder-public.zip b/ai-responder-public.zip deleted file mode 100644 index d90b6cac94eafc8cd86ffd7c881b0b6c56a1879d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2939 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