Fix bin/publish: copy docs.dist from project root

Fix bin/publish: use correct .env path for rspade_system
Fix bin/publish script: prevent grep exit code 1 from terminating script

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
root
2025-10-21 02:08:33 +00:00
commit f6fac6c4bc
79758 changed files with 10547827 additions and 0 deletions

View File

@@ -0,0 +1,28 @@
<?php
namespace Spatie\FlareClient\Context;
class BaseContextProviderDetector implements ContextProviderDetector
{
public function detectCurrentContext(): ContextProvider
{
if ($this->runningInConsole()) {
return new ConsoleContextProvider($_SERVER['argv'] ?? []);
}
return new RequestContextProvider();
}
protected function runningInConsole(): bool
{
if (isset($_ENV['APP_RUNNING_IN_CONSOLE'])) {
return $_ENV['APP_RUNNING_IN_CONSOLE'] === 'true';
}
if (isset($_ENV['FLARE_FAKE_WEB_REQUEST'])) {
return false;
}
return in_array(php_sapi_name(), ['cli', 'phpdb']);
}
}

View File

@@ -0,0 +1,29 @@
<?php
namespace Spatie\FlareClient\Context;
class ConsoleContextProvider implements ContextProvider
{
/**
* @var array<string, mixed>
*/
protected array $arguments = [];
/**
* @param array<string, mixed> $arguments
*/
public function __construct(array $arguments = [])
{
$this->arguments = $arguments;
}
/**
* @return array<int|string, mixed>
*/
public function toArray(): array
{
return [
'arguments' => $this->arguments,
];
}
}

View File

@@ -0,0 +1,11 @@
<?php
namespace Spatie\FlareClient\Context;
interface ContextProvider
{
/**
* @return array<int, string|mixed>
*/
public function toArray(): array;
}

View File

@@ -0,0 +1,8 @@
<?php
namespace Spatie\FlareClient\Context;
interface ContextProviderDetector
{
public function detectCurrentContext(): ContextProvider;
}

View File

@@ -0,0 +1,174 @@
<?php
namespace Spatie\FlareClient\Context;
use RuntimeException;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\HttpFoundation\InputBag;
use Symfony\Component\HttpFoundation\ParameterBag;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Mime\Exception\InvalidArgumentException;
use Throwable;
class RequestContextProvider implements ContextProvider
{
protected ?Request $request;
public function __construct(?Request $request = null)
{
$this->request = $request ?? Request::createFromGlobals();
}
/**
* @return array<string, mixed>
*/
public function getRequest(): array
{
return [
'url' => $this->request->getUri(),
'ip' => $this->request->getClientIp(),
'method' => $this->request->getMethod(),
'useragent' => $this->request->headers->get('User-Agent'),
];
}
/**
* @return array<int, mixed>
*/
protected function getFiles(): array
{
if (is_null($this->request->files)) {
return [];
}
return $this->mapFiles($this->request->files->all());
}
/**
* @param array<int, mixed> $files
*
* @return array<string, string>
*/
protected function mapFiles(array $files): array
{
return array_map(function ($file) {
if (is_array($file)) {
return $this->mapFiles($file);
}
if (! $file instanceof UploadedFile) {
return;
}
try {
$fileSize = $file->getSize();
} catch (RuntimeException $e) {
$fileSize = 0;
}
try {
$mimeType = $file->getMimeType();
} catch (InvalidArgumentException $e) {
$mimeType = 'undefined';
}
return [
'pathname' => $file->getPathname(),
'size' => $fileSize,
'mimeType' => $mimeType,
];
}, $files);
}
/**
* @return array<string, mixed>
*/
public function getSession(): array
{
try {
$session = $this->request->getSession();
} catch (Throwable $exception) {
$session = [];
}
return $session ? $this->getValidSessionData($session) : [];
}
protected function getValidSessionData($session): array
{
if (! method_exists($session, 'all')) {
return [];
}
try {
json_encode($session->all());
} catch (Throwable $e) {
return [];
}
return $session->all();
}
/**
* @return array<int|string, mixed
*/
public function getCookies(): array
{
return $this->request->cookies->all();
}
/**
* @return array<string, mixed>
*/
public function getHeaders(): array
{
/** @var array<string, list<string|null>> $headers */
$headers = $this->request->headers->all();
return array_filter(
array_map(
fn (array $header) => $header[0],
$headers
)
);
}
/**
* @return array<string, mixed>
*/
public function getRequestData(): array
{
return [
'queryString' => $this->request->query->all(),
'body' => $this->getInputBag()->all() + $this->request->query->all(),
'files' => $this->getFiles(),
];
}
protected function getInputBag(): InputBag|ParameterBag
{
$contentType = $this->request->headers->get('CONTENT_TYPE', 'text/html');
$isJson = str_contains($contentType, '/json') || str_contains($contentType, '+json');
if ($isJson) {
return new InputBag((array) json_decode($this->request->getContent(), true));
}
return in_array($this->request->getMethod(), ['GET', 'HEAD'])
? $this->request->query
: $this->request->request;
}
/** @return array<string, mixed> */
public function toArray(): array
{
return [
'request' => $this->getRequest(),
'request_data' => $this->getRequestData(),
'headers' => $this->getHeaders(),
'cookies' => $this->getCookies(),
'session' => $this->getSession(),
];
}
}