Updated Rector to commit 7df41da055

7df41da055 make tracy thinner
This commit is contained in:
Tomas Votruba 2022-05-30 09:33:37 +00:00
parent 56d91201bf
commit 6612bb0c65
31 changed files with 19 additions and 2270 deletions

View File

@ -16,11 +16,11 @@ final class VersionResolver
/**
* @var string
*/
public const PACKAGE_VERSION = 'd61cb541f0637e13a649aa96acacc44a33852e77';
public const PACKAGE_VERSION = '7df41da0558f1d013fb705339784c7cbe0b88b96';
/**
* @var string
*/
public const RELEASE_DATE = '2022-05-30 11:17:43';
public const RELEASE_DATE = '2022-05-30 11:27:26';
/**
* @var int
*/

2
vendor/autoload.php vendored
View File

@ -9,4 +9,4 @@ if (PHP_VERSION_ID < 50600) {
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInitd21789c959428fbdf3870642f2f52eee::getLoader();
return ComposerAutoloaderInitf9010bf4c9e2ca7c0ae4e9277fc03d8d::getLoader();

View File

@ -1260,15 +1260,8 @@ return array(
'RectorPrefix20220530\\Symplify\\SymplifyKernel\\HttpKernel\\AbstractSymplifyKernel' => $vendorDir . '/symplify/symplify-kernel/src/HttpKernel/AbstractSymplifyKernel.php',
'RectorPrefix20220530\\Symplify\\SymplifyKernel\\ValueObject\\KernelBootAndApplicationRun' => $vendorDir . '/symplify/symplify-kernel/src/ValueObject/KernelBootAndApplicationRun.php',
'RectorPrefix20220530\\Symplify\\SymplifyKernel\\ValueObject\\SymplifyKernelConfig' => $vendorDir . '/symplify/symplify-kernel/src/ValueObject/SymplifyKernelConfig.php',
'RectorPrefix20220530\\Tracy\\Bar' => $vendorDir . '/tracy/tracy/src/Tracy/Bar/Bar.php',
'RectorPrefix20220530\\Tracy\\BlueScreen' => $vendorDir . '/tracy/tracy/src/Tracy/BlueScreen/BlueScreen.php',
'RectorPrefix20220530\\Tracy\\Bridges\\Nette\\Bridge' => $vendorDir . '/tracy/tracy/src/Bridges/Nette/Bridge.php',
'RectorPrefix20220530\\Tracy\\Bridges\\Nette\\MailSender' => $vendorDir . '/tracy/tracy/src/Bridges/Nette/MailSender.php',
'RectorPrefix20220530\\Tracy\\Bridges\\Nette\\TracyExtension' => $vendorDir . '/tracy/tracy/src/Bridges/Nette/TracyExtension.php',
'RectorPrefix20220530\\Tracy\\Bridges\\Psr\\PsrToTracyLoggerAdapter' => $vendorDir . '/tracy/tracy/src/Bridges/Psr/PsrToTracyLoggerAdapter.php',
'RectorPrefix20220530\\Tracy\\Bridges\\Psr\\TracyToPsrLoggerAdapter' => $vendorDir . '/tracy/tracy/src/Bridges/Psr/TracyToPsrLoggerAdapter.php',
'RectorPrefix20220530\\Tracy\\Debugger' => $vendorDir . '/tracy/tracy/src/Tracy/Debugger/Debugger.php',
'RectorPrefix20220530\\Tracy\\DefaultBarPanel' => $vendorDir . '/tracy/tracy/src/Tracy/Bar/DefaultBarPanel.php',
'RectorPrefix20220530\\Tracy\\DeferredContent' => $vendorDir . '/tracy/tracy/src/Tracy/Debugger/DeferredContent.php',
'RectorPrefix20220530\\Tracy\\DevelopmentStrategy' => $vendorDir . '/tracy/tracy/src/Tracy/Debugger/DevelopmentStrategy.php',
'RectorPrefix20220530\\Tracy\\Dumper' => $vendorDir . '/tracy/tracy/src/Tracy/Dumper/Dumper.php',
@ -1276,16 +1269,9 @@ return array(
'RectorPrefix20220530\\Tracy\\Dumper\\Exposer' => $vendorDir . '/tracy/tracy/src/Tracy/Dumper/Exposer.php',
'RectorPrefix20220530\\Tracy\\Dumper\\Renderer' => $vendorDir . '/tracy/tracy/src/Tracy/Dumper/Renderer.php',
'RectorPrefix20220530\\Tracy\\Dumper\\Value' => $vendorDir . '/tracy/tracy/src/Tracy/Dumper/Value.php',
'RectorPrefix20220530\\Tracy\\FileSession' => $vendorDir . '/tracy/tracy/src/Tracy/Session/FileSession.php',
'RectorPrefix20220530\\Tracy\\FireLogger' => $vendorDir . '/tracy/tracy/src/Tracy/Logger/FireLogger.php',
'RectorPrefix20220530\\Tracy\\Helpers' => $vendorDir . '/tracy/tracy/src/Tracy/Helpers.php',
'RectorPrefix20220530\\Tracy\\IBarPanel' => $vendorDir . '/tracy/tracy/src/Tracy/Bar/IBarPanel.php',
'RectorPrefix20220530\\Tracy\\ILogger' => $vendorDir . '/tracy/tracy/src/Tracy/Logger/ILogger.php',
'RectorPrefix20220530\\Tracy\\Logger' => $vendorDir . '/tracy/tracy/src/Tracy/Logger/Logger.php',
'RectorPrefix20220530\\Tracy\\NativeSession' => $vendorDir . '/tracy/tracy/src/Tracy/Session/NativeSession.php',
'RectorPrefix20220530\\Tracy\\OutputDebugger' => $vendorDir . '/tracy/tracy/src/Tracy/OutputDebugger/OutputDebugger.php',
'RectorPrefix20220530\\Tracy\\ProductionStrategy' => $vendorDir . '/tracy/tracy/src/Tracy/Debugger/ProductionStrategy.php',
'RectorPrefix20220530\\Tracy\\SessionStorage' => $vendorDir . '/tracy/tracy/src/Tracy/Session/SessionStorage.php',
'RectorPrefix20220530\\Webmozart\\Assert\\Assert' => $vendorDir . '/webmozart/assert/src/Assert.php',
'RectorPrefix20220530\\Webmozart\\Assert\\InvalidArgumentException' => $vendorDir . '/webmozart/assert/src/InvalidArgumentException.php',
'RectorPrefix20220530\\Webmozart\\Assert\\Mixin' => $vendorDir . '/webmozart/assert/src/Mixin.php',

View File

@ -2,7 +2,7 @@
// autoload_real.php @generated by Composer
class ComposerAutoloaderInitd21789c959428fbdf3870642f2f52eee
class ComposerAutoloaderInitf9010bf4c9e2ca7c0ae4e9277fc03d8d
{
private static $loader;
@ -22,19 +22,19 @@ class ComposerAutoloaderInitd21789c959428fbdf3870642f2f52eee
return self::$loader;
}
spl_autoload_register(array('ComposerAutoloaderInitd21789c959428fbdf3870642f2f52eee', 'loadClassLoader'), true, true);
spl_autoload_register(array('ComposerAutoloaderInitf9010bf4c9e2ca7c0ae4e9277fc03d8d', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
spl_autoload_unregister(array('ComposerAutoloaderInitd21789c959428fbdf3870642f2f52eee', 'loadClassLoader'));
spl_autoload_unregister(array('ComposerAutoloaderInitf9010bf4c9e2ca7c0ae4e9277fc03d8d', 'loadClassLoader'));
require __DIR__ . '/autoload_static.php';
call_user_func(\Composer\Autoload\ComposerStaticInitd21789c959428fbdf3870642f2f52eee::getInitializer($loader));
call_user_func(\Composer\Autoload\ComposerStaticInitf9010bf4c9e2ca7c0ae4e9277fc03d8d::getInitializer($loader));
$loader->setClassMapAuthoritative(true);
$loader->register(true);
$includeFiles = \Composer\Autoload\ComposerStaticInitd21789c959428fbdf3870642f2f52eee::$files;
$includeFiles = \Composer\Autoload\ComposerStaticInitf9010bf4c9e2ca7c0ae4e9277fc03d8d::$files;
foreach ($includeFiles as $fileIdentifier => $file) {
composerRequired21789c959428fbdf3870642f2f52eee($fileIdentifier, $file);
composerRequiref9010bf4c9e2ca7c0ae4e9277fc03d8d($fileIdentifier, $file);
}
return $loader;
@ -46,7 +46,7 @@ class ComposerAutoloaderInitd21789c959428fbdf3870642f2f52eee
* @param string $file
* @return void
*/
function composerRequired21789c959428fbdf3870642f2f52eee($fileIdentifier, $file)
function composerRequiref9010bf4c9e2ca7c0ae4e9277fc03d8d($fileIdentifier, $file)
{
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;

View File

@ -4,7 +4,7 @@
namespace Composer\Autoload;
class ComposerStaticInitd21789c959428fbdf3870642f2f52eee
class ComposerStaticInitf9010bf4c9e2ca7c0ae4e9277fc03d8d
{
public static $files = array (
'23c18046f52bef3eea034657bafda50f' => __DIR__ . '/..' . '/symfony/polyfill-php81/bootstrap.php',
@ -1575,15 +1575,8 @@ class ComposerStaticInitd21789c959428fbdf3870642f2f52eee
'RectorPrefix20220530\\Symplify\\SymplifyKernel\\HttpKernel\\AbstractSymplifyKernel' => __DIR__ . '/..' . '/symplify/symplify-kernel/src/HttpKernel/AbstractSymplifyKernel.php',
'RectorPrefix20220530\\Symplify\\SymplifyKernel\\ValueObject\\KernelBootAndApplicationRun' => __DIR__ . '/..' . '/symplify/symplify-kernel/src/ValueObject/KernelBootAndApplicationRun.php',
'RectorPrefix20220530\\Symplify\\SymplifyKernel\\ValueObject\\SymplifyKernelConfig' => __DIR__ . '/..' . '/symplify/symplify-kernel/src/ValueObject/SymplifyKernelConfig.php',
'RectorPrefix20220530\\Tracy\\Bar' => __DIR__ . '/..' . '/tracy/tracy/src/Tracy/Bar/Bar.php',
'RectorPrefix20220530\\Tracy\\BlueScreen' => __DIR__ . '/..' . '/tracy/tracy/src/Tracy/BlueScreen/BlueScreen.php',
'RectorPrefix20220530\\Tracy\\Bridges\\Nette\\Bridge' => __DIR__ . '/..' . '/tracy/tracy/src/Bridges/Nette/Bridge.php',
'RectorPrefix20220530\\Tracy\\Bridges\\Nette\\MailSender' => __DIR__ . '/..' . '/tracy/tracy/src/Bridges/Nette/MailSender.php',
'RectorPrefix20220530\\Tracy\\Bridges\\Nette\\TracyExtension' => __DIR__ . '/..' . '/tracy/tracy/src/Bridges/Nette/TracyExtension.php',
'RectorPrefix20220530\\Tracy\\Bridges\\Psr\\PsrToTracyLoggerAdapter' => __DIR__ . '/..' . '/tracy/tracy/src/Bridges/Psr/PsrToTracyLoggerAdapter.php',
'RectorPrefix20220530\\Tracy\\Bridges\\Psr\\TracyToPsrLoggerAdapter' => __DIR__ . '/..' . '/tracy/tracy/src/Bridges/Psr/TracyToPsrLoggerAdapter.php',
'RectorPrefix20220530\\Tracy\\Debugger' => __DIR__ . '/..' . '/tracy/tracy/src/Tracy/Debugger/Debugger.php',
'RectorPrefix20220530\\Tracy\\DefaultBarPanel' => __DIR__ . '/..' . '/tracy/tracy/src/Tracy/Bar/DefaultBarPanel.php',
'RectorPrefix20220530\\Tracy\\DeferredContent' => __DIR__ . '/..' . '/tracy/tracy/src/Tracy/Debugger/DeferredContent.php',
'RectorPrefix20220530\\Tracy\\DevelopmentStrategy' => __DIR__ . '/..' . '/tracy/tracy/src/Tracy/Debugger/DevelopmentStrategy.php',
'RectorPrefix20220530\\Tracy\\Dumper' => __DIR__ . '/..' . '/tracy/tracy/src/Tracy/Dumper/Dumper.php',
@ -1591,16 +1584,9 @@ class ComposerStaticInitd21789c959428fbdf3870642f2f52eee
'RectorPrefix20220530\\Tracy\\Dumper\\Exposer' => __DIR__ . '/..' . '/tracy/tracy/src/Tracy/Dumper/Exposer.php',
'RectorPrefix20220530\\Tracy\\Dumper\\Renderer' => __DIR__ . '/..' . '/tracy/tracy/src/Tracy/Dumper/Renderer.php',
'RectorPrefix20220530\\Tracy\\Dumper\\Value' => __DIR__ . '/..' . '/tracy/tracy/src/Tracy/Dumper/Value.php',
'RectorPrefix20220530\\Tracy\\FileSession' => __DIR__ . '/..' . '/tracy/tracy/src/Tracy/Session/FileSession.php',
'RectorPrefix20220530\\Tracy\\FireLogger' => __DIR__ . '/..' . '/tracy/tracy/src/Tracy/Logger/FireLogger.php',
'RectorPrefix20220530\\Tracy\\Helpers' => __DIR__ . '/..' . '/tracy/tracy/src/Tracy/Helpers.php',
'RectorPrefix20220530\\Tracy\\IBarPanel' => __DIR__ . '/..' . '/tracy/tracy/src/Tracy/Bar/IBarPanel.php',
'RectorPrefix20220530\\Tracy\\ILogger' => __DIR__ . '/..' . '/tracy/tracy/src/Tracy/Logger/ILogger.php',
'RectorPrefix20220530\\Tracy\\Logger' => __DIR__ . '/..' . '/tracy/tracy/src/Tracy/Logger/Logger.php',
'RectorPrefix20220530\\Tracy\\NativeSession' => __DIR__ . '/..' . '/tracy/tracy/src/Tracy/Session/NativeSession.php',
'RectorPrefix20220530\\Tracy\\OutputDebugger' => __DIR__ . '/..' . '/tracy/tracy/src/Tracy/OutputDebugger/OutputDebugger.php',
'RectorPrefix20220530\\Tracy\\ProductionStrategy' => __DIR__ . '/..' . '/tracy/tracy/src/Tracy/Debugger/ProductionStrategy.php',
'RectorPrefix20220530\\Tracy\\SessionStorage' => __DIR__ . '/..' . '/tracy/tracy/src/Tracy/Session/SessionStorage.php',
'RectorPrefix20220530\\Webmozart\\Assert\\Assert' => __DIR__ . '/..' . '/webmozart/assert/src/Assert.php',
'RectorPrefix20220530\\Webmozart\\Assert\\InvalidArgumentException' => __DIR__ . '/..' . '/webmozart/assert/src/InvalidArgumentException.php',
'RectorPrefix20220530\\Webmozart\\Assert\\Mixin' => __DIR__ . '/..' . '/webmozart/assert/src/Mixin.php',
@ -3776,9 +3762,9 @@ class ComposerStaticInitd21789c959428fbdf3870642f2f52eee
public static function getInitializer(ClassLoader $loader)
{
return \Closure::bind(function () use ($loader) {
$loader->prefixLengthsPsr4 = ComposerStaticInitd21789c959428fbdf3870642f2f52eee::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInitd21789c959428fbdf3870642f2f52eee::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInitd21789c959428fbdf3870642f2f52eee::$classMap;
$loader->prefixLengthsPsr4 = ComposerStaticInitf9010bf4c9e2ca7c0ae4e9277fc03d8d::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInitf9010bf4c9e2ca7c0ae4e9277fc03d8d::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInitf9010bf4c9e2ca7c0ae4e9277fc03d8d::$classMap;
}, null, ClassLoader::class);
}

View File

@ -9,8 +9,8 @@ $loader = require_once __DIR__.'/autoload.php';
if (!class_exists('AutoloadIncluder', false) && !interface_exists('AutoloadIncluder', false) && !trait_exists('AutoloadIncluder', false)) {
spl_autoload_call('RectorPrefix20220530\AutoloadIncluder');
}
if (!class_exists('ComposerAutoloaderInitd21789c959428fbdf3870642f2f52eee', false) && !interface_exists('ComposerAutoloaderInitd21789c959428fbdf3870642f2f52eee', false) && !trait_exists('ComposerAutoloaderInitd21789c959428fbdf3870642f2f52eee', false)) {
spl_autoload_call('RectorPrefix20220530\ComposerAutoloaderInitd21789c959428fbdf3870642f2f52eee');
if (!class_exists('ComposerAutoloaderInitf9010bf4c9e2ca7c0ae4e9277fc03d8d', false) && !interface_exists('ComposerAutoloaderInitf9010bf4c9e2ca7c0ae4e9277fc03d8d', false) && !trait_exists('ComposerAutoloaderInitf9010bf4c9e2ca7c0ae4e9277fc03d8d', false)) {
spl_autoload_call('RectorPrefix20220530\ComposerAutoloaderInitf9010bf4c9e2ca7c0ae4e9277fc03d8d');
}
if (!class_exists('Helmich\TypoScriptParser\Parser\AST\Statement', false) && !interface_exists('Helmich\TypoScriptParser\Parser\AST\Statement', false) && !trait_exists('Helmich\TypoScriptParser\Parser\AST\Statement', false)) {
spl_autoload_call('RectorPrefix20220530\Helmich\TypoScriptParser\Parser\AST\Statement');
@ -56,9 +56,9 @@ if (!function_exists('print_node')) {
return \RectorPrefix20220530\print_node(...func_get_args());
}
}
if (!function_exists('composerRequired21789c959428fbdf3870642f2f52eee')) {
function composerRequired21789c959428fbdf3870642f2f52eee() {
return \RectorPrefix20220530\composerRequired21789c959428fbdf3870642f2f52eee(...func_get_args());
if (!function_exists('composerRequiref9010bf4c9e2ca7c0ae4e9277fc03d8d')) {
function composerRequiref9010bf4c9e2ca7c0ae4e9277fc03d8d() {
return \RectorPrefix20220530\composerRequiref9010bf4c9e2ca7c0ae4e9277fc03d8d(...func_get_args());
}
}
if (!function_exists('scanPath')) {

View File

@ -1,98 +0,0 @@
<?php
/**
* This file is part of the Tracy (https://tracy.nette.org)
* Copyright (c) 2004 David Grudl (https://davidgrudl.com)
*/
declare (strict_types=1);
namespace RectorPrefix20220530\Tracy\Bridges\Nette;
use RectorPrefix20220530\Latte;
use RectorPrefix20220530\Nette;
use RectorPrefix20220530\Tracy;
use RectorPrefix20220530\Tracy\BlueScreen;
use RectorPrefix20220530\Tracy\Helpers;
/**
* Bridge for NEON & Latte.
*/
class Bridge
{
public static function initialize() : void
{
$blueScreen = \RectorPrefix20220530\Tracy\Debugger::getBlueScreen();
if (!\class_exists(\RectorPrefix20220530\Latte\Bridges\Tracy\BlueScreenPanel::class)) {
$blueScreen->addPanel([self::class, 'renderLatteError']);
$blueScreen->addAction([self::class, 'renderLatteUnknownMacro']);
$blueScreen->addFileGenerator(function (string $file) {
return \substr($file, -6) === '.latte' ? "{block content}\n\$END\$" : null;
});
\RectorPrefix20220530\Tracy\Debugger::addSourceMapper([self::class, 'mapLatteSourceCode']);
}
$blueScreen->addAction([self::class, 'renderMemberAccessException']);
$blueScreen->addPanel([self::class, 'renderNeonError']);
}
public static function renderLatteError(?\Throwable $e) : ?array
{
if ($e instanceof \RectorPrefix20220530\Latte\CompileException && $e->sourceName) {
return ['tab' => 'Template', 'panel' => (\preg_match('#\\n|\\?#', $e->sourceName) ? '' : '<p>' . (@\is_file($e->sourceName) ? '<b>File:</b> ' . \RectorPrefix20220530\Tracy\Helpers::editorLink($e->sourceName, $e->sourceLine) : '<b>' . \htmlspecialchars($e->sourceName . ($e->sourceLine ? ':' . $e->sourceLine : '')) . '</b>') . '</p>') . \RectorPrefix20220530\Tracy\BlueScreen::highlightFile($e->sourceCode, $e->sourceLine, 15, \false)];
}
return null;
}
public static function renderLatteUnknownMacro(?\Throwable $e) : ?array
{
if ($e instanceof \RectorPrefix20220530\Latte\CompileException && $e->sourceName && @\is_file($e->sourceName) && (\preg_match('#Unknown macro (\\{\\w+)\\}, did you mean (\\{\\w+)\\}\\?#A', $e->getMessage(), $m) || \preg_match('#Unknown attribute (n:\\w+), did you mean (n:\\w+)\\?#A', $e->getMessage(), $m))) {
return ['link' => \RectorPrefix20220530\Tracy\Helpers::editorUri($e->sourceName, $e->sourceLine, 'fix', $m[1], $m[2]), 'label' => 'fix it'];
}
return null;
}
/** @return array{file: string, line: int, label: string, active: bool} */
public static function mapLatteSourceCode(string $file, int $line) : ?array
{
if (!\strpos($file, '.latte--')) {
return null;
}
$lines = \file($file);
if (!\preg_match('#^/(?:\\*\\*|/) source: (\\S+\\.latte)#m', \implode('', \array_slice($lines, 0, 10)), $m) || !@\is_file($m[1])) {
return null;
}
$file = $m[1];
$line = $line && \preg_match('#/\\* line (\\d+) \\*/#', $lines[$line - 1], $m) ? (int) $m[1] : 0;
return ['file' => $file, 'line' => $line, 'label' => 'Latte', 'active' => \true];
}
public static function renderMemberAccessException(?\Throwable $e) : ?array
{
if (!$e instanceof \RectorPrefix20220530\Nette\MemberAccessException && !$e instanceof \LogicException) {
return null;
}
$loc = $e->getTrace()[$e instanceof \RectorPrefix20220530\Nette\MemberAccessException ? 1 : 0];
if (!isset($loc['file'])) {
return null;
}
$loc = \RectorPrefix20220530\Tracy\Debugger::mapSource($loc['file'], $loc['line']) ?? $loc;
if (\preg_match('#Cannot (?:read|write to) an undeclared property .+::\\$(\\w+), did you mean \\$(\\w+)\\?#A', $e->getMessage(), $m)) {
return ['link' => \RectorPrefix20220530\Tracy\Helpers::editorUri($loc['file'], $loc['line'], 'fix', '->' . $m[1], '->' . $m[2]), 'label' => 'fix it'];
} elseif (\preg_match('#Call to undefined (static )?method .+::(\\w+)\\(\\), did you mean (\\w+)\\(\\)?#A', $e->getMessage(), $m)) {
$operator = $m[1] ? '::' : '->';
return ['link' => \RectorPrefix20220530\Tracy\Helpers::editorUri($loc['file'], $loc['line'], 'fix', $operator . $m[2] . '(', $operator . $m[3] . '('), 'label' => 'fix it'];
}
return null;
}
public static function renderNeonError(?\Throwable $e) : ?array
{
if (!$e instanceof \RectorPrefix20220530\Nette\Neon\Exception || !\preg_match('#line (\\d+)#', $e->getMessage(), $m)) {
return null;
} elseif ($trace = \RectorPrefix20220530\Tracy\Helpers::findTrace($e->getTrace(), [\RectorPrefix20220530\Nette\Neon\Decoder::class, 'decodeFile']) ?? \RectorPrefix20220530\Tracy\Helpers::findTrace($e->getTrace(), [\RectorPrefix20220530\Nette\DI\Config\Adapters\NeonAdapter::class, 'load'])) {
$panel = '<p><b>File:</b> ' . \RectorPrefix20220530\Tracy\Helpers::editorLink($trace['args'][0], (int) $m[1]) . '</p>' . self::highlightNeon(\file_get_contents($trace['args'][0]), (int) $m[1]);
} elseif ($trace = \RectorPrefix20220530\Tracy\Helpers::findTrace($e->getTrace(), [\RectorPrefix20220530\Nette\Neon\Decoder::class, 'decode'])) {
$panel = self::highlightNeon($trace['args'][0], (int) $m[1]);
}
return isset($panel) ? ['tab' => 'NEON', 'panel' => $panel] : null;
}
private static function highlightNeon(string $code, int $line) : string
{
$code = \htmlspecialchars($code, \ENT_IGNORE, 'UTF-8');
$code = \str_replace(' ', "<span class='tracy-dump-whitespace'>·</span>", $code);
$code = \str_replace("\t", "<span class='tracy-dump-whitespace'>→ </span>", $code);
return '<pre class=code><div>' . \RectorPrefix20220530\Tracy\BlueScreen::highlightLine($code, $line) . '</div></pre>';
}
}

View File

@ -1,45 +0,0 @@
<?php
/**
* This file is part of the Tracy (https://tracy.nette.org)
* Copyright (c) 2004 David Grudl (https://davidgrudl.com)
*/
declare (strict_types=1);
namespace RectorPrefix20220530\Tracy\Bridges\Nette;
use RectorPrefix20220530\Nette;
use RectorPrefix20220530\Tracy;
/**
* Tracy logger bridge for Nette Mail.
*/
class MailSender
{
use Nette\SmartObject;
/** @var Nette\Mail\IMailer */
private $mailer;
/** @var string|null sender of email notifications */
private $fromEmail;
public function __construct(\RectorPrefix20220530\Nette\Mail\IMailer $mailer, ?string $fromEmail = null)
{
$this->mailer = $mailer;
$this->fromEmail = $fromEmail;
}
/**
* @param mixed $message
*/
public function send($message, string $email) : void
{
$host = \preg_replace('#[^\\w.-]+#', '', $_SERVER['SERVER_NAME'] ?? \php_uname('n'));
$mail = new \RectorPrefix20220530\Nette\Mail\Message();
$mail->setHeader('X-Mailer', 'Tracy');
if ($this->fromEmail || \RectorPrefix20220530\Nette\Utils\Validators::isEmail("noreply@{$host}")) {
$mail->setFrom($this->fromEmail ?: "noreply@{$host}");
}
foreach (\explode(',', $email) as $item) {
$mail->addTo(\trim($item));
}
$mail->setSubject('PHP: An error occurred on the server ' . $host);
$mail->setBody(\RectorPrefix20220530\Tracy\Logger::formatMessage($message) . "\n\nsource: " . \RectorPrefix20220530\Tracy\Helpers::getSource());
$this->mailer->send($mail);
}
}

View File

@ -1,103 +0,0 @@
<?php
/**
* This file is part of the Tracy (https://tracy.nette.org)
* Copyright (c) 2004 David Grudl (https://davidgrudl.com)
*/
declare (strict_types=1);
namespace RectorPrefix20220530\Tracy\Bridges\Nette;
use RectorPrefix20220530\Nette;
use RectorPrefix20220530\Nette\Schema\Expect;
use RectorPrefix20220530\Tracy;
/**
* Tracy extension for Nette DI.
*/
class TracyExtension extends \RectorPrefix20220530\Nette\DI\CompilerExtension
{
private const ErrorSeverityPattern = 'E_(?:ALL|PARSE|STRICT|RECOVERABLE_ERROR|(?:CORE|COMPILE)_(?:ERROR|WARNING)|(?:USER_)?(?:ERROR|WARNING|NOTICE|DEPRECATED))';
/** @var bool */
private $debugMode;
/** @var bool */
private $cliMode;
public function __construct(bool $debugMode = \false, bool $cliMode = \false)
{
$this->debugMode = $debugMode;
$this->cliMode = $cliMode;
}
public function getConfigSchema() : \RectorPrefix20220530\Nette\Schema\Schema
{
$errorSeverity = \RectorPrefix20220530\Nette\Schema\Expect::string()->pattern(self::ErrorSeverityPattern);
$errorSeverityExpr = \RectorPrefix20220530\Nette\Schema\Expect::string()->pattern('(' . self::ErrorSeverityPattern . '|[ &|~()])+');
return \RectorPrefix20220530\Nette\Schema\Expect::structure(['email' => \RectorPrefix20220530\Nette\Schema\Expect::anyOf(\RectorPrefix20220530\Nette\Schema\Expect::email(), \RectorPrefix20220530\Nette\Schema\Expect::listOf('email'))->dynamic(), 'fromEmail' => \RectorPrefix20220530\Nette\Schema\Expect::email()->dynamic(), 'emailSnooze' => \RectorPrefix20220530\Nette\Schema\Expect::string()->dynamic(), 'logSeverity' => \RectorPrefix20220530\Nette\Schema\Expect::anyOf(\RectorPrefix20220530\Nette\Schema\Expect::int(), $errorSeverityExpr, \RectorPrefix20220530\Nette\Schema\Expect::listOf($errorSeverity)), 'editor' => \RectorPrefix20220530\Nette\Schema\Expect::type('string|null')->dynamic(), 'browser' => \RectorPrefix20220530\Nette\Schema\Expect::string()->dynamic(), 'errorTemplate' => \RectorPrefix20220530\Nette\Schema\Expect::string()->dynamic(), 'strictMode' => \RectorPrefix20220530\Nette\Schema\Expect::anyOf(\RectorPrefix20220530\Nette\Schema\Expect::bool(), \RectorPrefix20220530\Nette\Schema\Expect::int(), $errorSeverityExpr, \RectorPrefix20220530\Nette\Schema\Expect::listOf($errorSeverity)), 'showBar' => \RectorPrefix20220530\Nette\Schema\Expect::bool()->dynamic(), 'maxLength' => \RectorPrefix20220530\Nette\Schema\Expect::int()->dynamic(), 'maxDepth' => \RectorPrefix20220530\Nette\Schema\Expect::int()->dynamic(), 'maxItems' => \RectorPrefix20220530\Nette\Schema\Expect::int()->dynamic(), 'keysToHide' => \RectorPrefix20220530\Nette\Schema\Expect::array(null)->dynamic(), 'dumpTheme' => \RectorPrefix20220530\Nette\Schema\Expect::string()->dynamic(), 'showLocation' => \RectorPrefix20220530\Nette\Schema\Expect::bool()->dynamic(), 'scream' => \RectorPrefix20220530\Nette\Schema\Expect::anyOf(\RectorPrefix20220530\Nette\Schema\Expect::bool(), \RectorPrefix20220530\Nette\Schema\Expect::int(), $errorSeverityExpr, \RectorPrefix20220530\Nette\Schema\Expect::listOf($errorSeverity)), 'bar' => \RectorPrefix20220530\Nette\Schema\Expect::listOf('RectorPrefix20220530\\string|Nette\\DI\\Definitions\\Statement'), 'blueScreen' => \RectorPrefix20220530\Nette\Schema\Expect::listOf('callable'), 'editorMapping' => \RectorPrefix20220530\Nette\Schema\Expect::arrayOf('string')->dynamic()->default(null), 'netteMailer' => \RectorPrefix20220530\Nette\Schema\Expect::bool(\true)]);
}
public function loadConfiguration()
{
$builder = $this->getContainerBuilder();
$builder->addDefinition($this->prefix('logger'))->setClass(\RectorPrefix20220530\Tracy\ILogger::class)->setFactory([\RectorPrefix20220530\Tracy\Debugger::class, 'getLogger']);
$builder->addDefinition($this->prefix('blueScreen'))->setFactory([\RectorPrefix20220530\Tracy\Debugger::class, 'getBlueScreen']);
$builder->addDefinition($this->prefix('bar'))->setFactory([\RectorPrefix20220530\Tracy\Debugger::class, 'getBar']);
}
public function afterCompile(\RectorPrefix20220530\Nette\PhpGenerator\ClassType $class)
{
$initialize = $this->initialization ?? new \RectorPrefix20220530\Nette\PhpGenerator\Closure();
$initialize->addBody('if (!Tracy\\Debugger::isEnabled()) { return; }');
$builder = $this->getContainerBuilder();
$options = (array) $this->config;
unset($options['bar'], $options['blueScreen'], $options['netteMailer']);
foreach (['logSeverity', 'strictMode', 'scream'] as $key) {
if (\is_string($options[$key]) || \is_array($options[$key])) {
$options[$key] = $this->parseErrorSeverity($options[$key]);
}
}
foreach ($options as $key => $value) {
if ($value !== null) {
$tbl = ['keysToHide' => 'array_push(Tracy\\Debugger::getBlueScreen()->keysToHide, ... ?)', 'fromEmail' => 'Tracy\\Debugger::getLogger()->fromEmail = ?', 'emailSnooze' => 'Tracy\\Debugger::getLogger()->emailSnooze = ?'];
$initialize->addBody($builder->formatPhp(($tbl[$key] ?? 'Tracy\\Debugger::$' . $key . ' = ?') . ';', \RectorPrefix20220530\Nette\DI\Helpers::filterArguments([$value])));
}
}
$logger = $builder->getDefinition($this->prefix('logger'));
if (!$logger instanceof \RectorPrefix20220530\Nette\DI\ServiceDefinition || $logger->getFactory()->getEntity() !== [\RectorPrefix20220530\Tracy\Debugger::class, 'getLogger']) {
$initialize->addBody($builder->formatPhp('Tracy\\Debugger::setLogger(?);', [$logger]));
}
if ($this->config->netteMailer && $builder->getByType(\RectorPrefix20220530\Nette\Mail\IMailer::class)) {
$initialize->addBody($builder->formatPhp('Tracy\\Debugger::getLogger()->mailer = ?;', [[new \RectorPrefix20220530\Nette\DI\Statement(\RectorPrefix20220530\Tracy\Bridges\Nette\MailSender::class, ['fromEmail' => $this->config->fromEmail]), 'send']]));
}
if ($this->debugMode) {
foreach ($this->config->bar as $item) {
if (\is_string($item) && \substr($item, 0, 1) === '@') {
$item = new \RectorPrefix20220530\Nette\DI\Statement(['@' . $builder::THIS_CONTAINER, 'getService'], [\substr($item, 1)]);
} elseif (\is_string($item)) {
$item = new \RectorPrefix20220530\Nette\DI\Statement($item);
}
$initialize->addBody($builder->formatPhp('$this->getService(?)->addPanel(?);', \RectorPrefix20220530\Nette\DI\Helpers::filterArguments([$this->prefix('bar'), $item])));
}
if (!$this->cliMode && \RectorPrefix20220530\Tracy\Debugger::getSessionStorage() instanceof \RectorPrefix20220530\Tracy\NativeSession && ($name = $builder->getByType(\RectorPrefix20220530\Nette\Http\Session::class))) {
$initialize->addBody('$this->getService(?)->start();', [$name]);
$initialize->addBody('Tracy\\Debugger::dispatch();');
}
}
foreach ($this->config->blueScreen as $item) {
$initialize->addBody($builder->formatPhp('$this->getService(?)->addPanel(?);', \RectorPrefix20220530\Nette\DI\Helpers::filterArguments([$this->prefix('blueScreen'), $item])));
}
if (empty($this->initialization)) {
$class->getMethod('initialize')->addBody("({$initialize})();");
}
if (($dir = \RectorPrefix20220530\Tracy\Debugger::$logDirectory) && !\is_writable($dir)) {
throw new \RectorPrefix20220530\Nette\InvalidStateException("Make directory '{$dir}' writable.");
}
}
/**
* @param string|string[] $value
*/
private function parseErrorSeverity($value) : int
{
$value = \implode('|', (array) $value);
$res = (int) @\parse_ini_string('e = ' . $value)['e'];
// @ may fail
if (!$res) {
throw new \RectorPrefix20220530\Nette\InvalidStateException("Syntax error in expression '{$value}'");
}
return $res;
}
}

View File

@ -1,39 +0,0 @@
<?php
/**
* This file is part of the Tracy (https://tracy.nette.org)
* Copyright (c) 2004 David Grudl (https://davidgrudl.com)
*/
declare (strict_types=1);
namespace RectorPrefix20220530\Tracy\Bridges\Psr;
use RectorPrefix20220530\Psr;
use RectorPrefix20220530\Tracy;
/**
* Psr\Log\LoggerInterface to Tracy\ILogger adapter.
*/
class PsrToTracyLoggerAdapter implements \RectorPrefix20220530\Tracy\ILogger
{
/** Tracy logger level to PSR-3 log level mapping */
private const LevelMap = [\RectorPrefix20220530\Tracy\ILogger::DEBUG => \RectorPrefix20220530\Psr\Log\LogLevel::DEBUG, \RectorPrefix20220530\Tracy\ILogger::INFO => \RectorPrefix20220530\Psr\Log\LogLevel::INFO, \RectorPrefix20220530\Tracy\ILogger::WARNING => \RectorPrefix20220530\Psr\Log\LogLevel::WARNING, \RectorPrefix20220530\Tracy\ILogger::ERROR => \RectorPrefix20220530\Psr\Log\LogLevel::ERROR, \RectorPrefix20220530\Tracy\ILogger::EXCEPTION => \RectorPrefix20220530\Psr\Log\LogLevel::ERROR, \RectorPrefix20220530\Tracy\ILogger::CRITICAL => \RectorPrefix20220530\Psr\Log\LogLevel::CRITICAL];
/** @var Psr\Log\LoggerInterface */
private $psrLogger;
public function __construct(\RectorPrefix20220530\Psr\Log\LoggerInterface $psrLogger)
{
$this->psrLogger = $psrLogger;
}
public function log($value, $level = self::INFO)
{
if ($value instanceof \Throwable) {
$message = \RectorPrefix20220530\Tracy\Helpers::getClass($value) . ': ' . $value->getMessage() . ($value->getCode() ? ' #' . $value->getCode() : '') . ' in ' . $value->getFile() . ':' . $value->getLine();
$context = ['exception' => $value];
} elseif (!\is_string($value)) {
$message = \trim(\RectorPrefix20220530\Tracy\Dumper::toText($value));
$context = [];
} else {
$message = $value;
$context = [];
}
$this->psrLogger->log(self::LevelMap[$level] ?? \RectorPrefix20220530\Psr\Log\LogLevel::ERROR, $message, $context);
}
}

View File

@ -1,37 +0,0 @@
<?php
/**
* This file is part of the Tracy (https://tracy.nette.org)
* Copyright (c) 2004 David Grudl (https://davidgrudl.com)
*/
declare (strict_types=1);
namespace RectorPrefix20220530\Tracy\Bridges\Psr;
use RectorPrefix20220530\Psr;
use RectorPrefix20220530\Tracy;
/**
* Tracy\ILogger to Psr\Log\LoggerInterface adapter.
*/
class TracyToPsrLoggerAdapter extends \RectorPrefix20220530\Psr\Log\AbstractLogger
{
/** PSR-3 log level to Tracy logger level mapping */
private const LevelMap = [\RectorPrefix20220530\Psr\Log\LogLevel::EMERGENCY => \RectorPrefix20220530\Tracy\ILogger::CRITICAL, \RectorPrefix20220530\Psr\Log\LogLevel::ALERT => \RectorPrefix20220530\Tracy\ILogger::CRITICAL, \RectorPrefix20220530\Psr\Log\LogLevel::CRITICAL => \RectorPrefix20220530\Tracy\ILogger::CRITICAL, \RectorPrefix20220530\Psr\Log\LogLevel::ERROR => \RectorPrefix20220530\Tracy\ILogger::ERROR, \RectorPrefix20220530\Psr\Log\LogLevel::WARNING => \RectorPrefix20220530\Tracy\ILogger::WARNING, \RectorPrefix20220530\Psr\Log\LogLevel::NOTICE => \RectorPrefix20220530\Tracy\ILogger::WARNING, \RectorPrefix20220530\Psr\Log\LogLevel::INFO => \RectorPrefix20220530\Tracy\ILogger::INFO, \RectorPrefix20220530\Psr\Log\LogLevel::DEBUG => \RectorPrefix20220530\Tracy\ILogger::DEBUG];
/** @var Tracy\ILogger */
private $tracyLogger;
public function __construct(\RectorPrefix20220530\Tracy\ILogger $tracyLogger)
{
$this->tracyLogger = $tracyLogger;
}
public function log($level, $message, array $context = []) : void
{
$level = self::LevelMap[$level] ?? \RectorPrefix20220530\Tracy\ILogger::ERROR;
if (isset($context['exception']) && $context['exception'] instanceof \Throwable) {
$this->tracyLogger->log($context['exception'], $level);
unset($context['exception']);
}
if ($context) {
$message = ['message' => $message, 'context' => $context];
}
$this->tracyLogger->log($message, $level);
}
}

View File

@ -1,127 +0,0 @@
<?php
/**
* This file is part of the Tracy (https://tracy.nette.org)
* Copyright (c) 2004 David Grudl (https://davidgrudl.com)
*/
declare (strict_types=1);
namespace RectorPrefix20220530\Tracy;
/**
* Debug Bar.
*/
class Bar
{
/** @var IBarPanel[] */
private $panels = [];
/** @var bool */
private $loaderRendered = \false;
/**
* Add custom panel.
* @return static
*/
public function addPanel(\RectorPrefix20220530\Tracy\IBarPanel $panel, ?string $id = null) : self
{
if ($id === null) {
$c = 0;
do {
$id = \get_class($panel) . ($c++ ? "-{$c}" : '');
} while (isset($this->panels[$id]));
}
$this->panels[$id] = $panel;
return $this;
}
/**
* Returns panel with given id
*/
public function getPanel(string $id) : ?\RectorPrefix20220530\Tracy\IBarPanel
{
return $this->panels[$id] ?? null;
}
/**
* Renders loading <script>
* @internal
*/
public function renderLoader(\RectorPrefix20220530\Tracy\DeferredContent $defer) : void
{
if (!$defer->isAvailable()) {
throw new \LogicException('Start session before Tracy is enabled.');
}
$this->loaderRendered = \true;
$requestId = $defer->getRequestId();
$nonce = \RectorPrefix20220530\Tracy\Helpers::getNonce();
$async = \true;
require __DIR__ . '/assets/loader.phtml';
}
/**
* Renders debug bar.
*/
public function render(\RectorPrefix20220530\Tracy\DeferredContent $defer) : void
{
$redirectQueue =& $defer->getItems('redirect');
$requestId = $defer->getRequestId();
if (\RectorPrefix20220530\Tracy\Helpers::isAjax()) {
if ($defer->isAvailable()) {
$defer->addSetup('Tracy.Debug.loadAjax', $this->renderPartial('ajax', '-ajax:' . $requestId));
}
} elseif (\RectorPrefix20220530\Tracy\Helpers::isRedirect()) {
if ($defer->isAvailable()) {
$redirectQueue[] = ['content' => $this->renderPartial('redirect', '-r' . \count($redirectQueue)), 'time' => \time()];
}
} elseif (\RectorPrefix20220530\Tracy\Helpers::isHtmlMode()) {
$content = $this->renderPartial('main');
foreach (\array_reverse($redirectQueue) as $item) {
$content['bar'] .= $item['content']['bar'];
$content['panels'] .= $item['content']['panels'];
}
$redirectQueue = null;
$content = '<div id=tracy-debug-bar>' . $content['bar'] . '</div>' . $content['panels'];
if ($this->loaderRendered) {
$defer->addSetup('Tracy.Debug.init', $content);
} else {
$nonce = \RectorPrefix20220530\Tracy\Helpers::getNonce();
$async = \false;
\RectorPrefix20220530\Tracy\Debugger::removeOutputBuffers(\false);
require __DIR__ . '/assets/loader.phtml';
}
}
}
private function renderPartial(string $type, string $suffix = '') : array
{
$panels = $this->renderPanels($suffix);
return ['bar' => \RectorPrefix20220530\Tracy\Helpers::capture(function () use($type, $panels) {
require __DIR__ . '/assets/bar.phtml';
}), 'panels' => \RectorPrefix20220530\Tracy\Helpers::capture(function () use($type, $panels) {
require __DIR__ . '/assets/panels.phtml';
})];
}
private function renderPanels(string $suffix = '') : array
{
\set_error_handler(function (int $severity, string $message, string $file, int $line) {
if (\error_reporting() & $severity) {
throw new \ErrorException($message, 0, $severity, $file, $line);
}
});
$obLevel = \ob_get_level();
$panels = [];
foreach ($this->panels as $id => $panel) {
$idHtml = \preg_replace('#[^a-z0-9]+#i', '-', $id) . $suffix;
try {
$tab = (string) $panel->getTab();
$panelHtml = $tab ? $panel->getPanel() : null;
} catch (\Throwable $e) {
while (\ob_get_level() > $obLevel) {
// restore ob-level if broken
\ob_end_clean();
}
$idHtml = "error-{$idHtml}";
$tab = "Error in {$id}";
$panelHtml = "<h1>Error: {$id}</h1><div class='tracy-inner'>" . \nl2br(\RectorPrefix20220530\Tracy\Helpers::escapeHtml($e)) . '</div>';
unset($e);
}
$panels[] = (object) ['id' => $idHtml, 'tab' => $tab, 'panel' => $panelHtml];
}
\restore_error_handler();
return $panels;
}
}

View File

@ -1,44 +0,0 @@
<?php
/**
* This file is part of the Tracy (https://tracy.nette.org)
* Copyright (c) 2004 David Grudl (https://davidgrudl.com)
*/
declare (strict_types=1);
namespace RectorPrefix20220530\Tracy;
/**
* IBarPanel implementation helper.
* @internal
*/
class DefaultBarPanel implements \RectorPrefix20220530\Tracy\IBarPanel
{
public $data;
private $id;
public function __construct(string $id)
{
$this->id = $id;
}
/**
* Renders HTML code for custom tab.
*/
public function getTab() : string
{
return \RectorPrefix20220530\Tracy\Helpers::capture(function () {
$data = $this->data;
require __DIR__ . "/panels/{$this->id}.tab.phtml";
});
}
/**
* Renders HTML code for custom panel.
*/
public function getPanel() : string
{
return \RectorPrefix20220530\Tracy\Helpers::capture(function () {
if (\is_file(__DIR__ . "/panels/{$this->id}.panel.phtml")) {
$data = $this->data;
require __DIR__ . "/panels/{$this->id}.panel.phtml";
}
});
}
}

View File

@ -1,25 +0,0 @@
<?php
/**
* This file is part of the Tracy (https://tracy.nette.org)
* Copyright (c) 2004 David Grudl (https://davidgrudl.com)
*/
declare (strict_types=1);
namespace RectorPrefix20220530\Tracy;
/**
* Custom output for Debugger.
*/
interface IBarPanel
{
/**
* Renders HTML code for custom tab.
* @return string
*/
function getTab();
/**
* Renders HTML code for custom panel.
* @return string
*/
function getPanel();
}

View File

@ -1,286 +0,0 @@
/**
* This file is part of the Tracy (https://tracy.nette.org)
*/
/* common styles */
#tracy-debug {
display: none;
direction: ltr;
}
body#tracy-debug { /* in popup window */
display: block;
}
#tracy-debug:not(body) {
position: absolute;
left: 0;
top: 0;
}
#tracy-debug a {
color: #125EAE;
text-decoration: none;
}
#tracy-debug a:hover,
#tracy-debug a:focus {
background-color: #125EAE;
color: white;
}
#tracy-debug h2,
#tracy-debug h3,
#tracy-debug p {
margin: .4em 0;
}
#tracy-debug table {
background: #FDF5CE;
width: 100%;
}
#tracy-debug tr:nth-child(2n) td {
background: rgba(0, 0, 0, 0.02);
}
#tracy-debug td,
#tracy-debug th {
border: 1px solid #E6DFBF;
padding: 2px 5px;
vertical-align: top;
text-align: left;
}
#tracy-debug th {
background: #F4F3F1;
color: #655E5E;
font-size: 90%;
font-weight: bold;
}
#tracy-debug pre,
#tracy-debug code {
font: 9pt/1.5 Consolas, monospace;
}
#tracy-debug table .tracy-right {
text-align: right;
}
#tracy-debug svg {
display: inline;
}
/* bar */
#tracy-debug-bar {
font: normal normal 13px/1.55 Tahoma, sans-serif;
color: #333;
border: 1px solid #c9c9c9;
background: #EDEAE0 url('data:image/png;base64,R0lGODlhAQAUALMAAOzq4e/t5e7s4/Dt5vDu5e3r4vDu5uvp4O/t5AAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAABABQAAAQM0EgySEAYi1LA+UcEADs=') top;
background-size: 1em;
position: fixed;
min-width: 50px;
white-space: nowrap;
z-index: 30000;
opacity: .9;
transition: opacity 0.2s;
will-change: opacity, top, left;
border-radius: 3px;
box-shadow: 1px 1px 10px rgba(0, 0, 0, .15);
}
#tracy-debug-bar:hover {
opacity: 1;
transition: opacity 0.1s;
}
#tracy-debug-bar .tracy-row {
list-style: none none;
display: flex;
}
#tracy-debug-bar .tracy-row:not(:first-child) {
background: #d5d2c6;
opacity: .8;
}
#tracy-debug-bar .tracy-row[data-tracy-group="ajax"] {
animation: tracy-row-flash .2s ease;
}
@keyframes tracy-row-flash {
0% {
background: #c9c0a0;
}
}
#tracy-debug-bar .tracy-row:not(:first-child) li:first-child {
width: 4.1em;
text-align: center;
}
#tracy-debug-bar img {
vertical-align: bottom;
position: relative;
top: -2px;
}
#tracy-debug-bar svg {
vertical-align: bottom;
width: 1.23em;
height: 1.55em;
}
#tracy-debug-bar .tracy-label {
margin-left: .2em;
}
#tracy-debug-bar li > a,
#tracy-debug-bar li > span {
color: #000;
display: block;
padding: 0 .4em;
}
#tracy-debug-bar li > a:hover {
color: black;
background: #c3c1b8;
}
#tracy-debug-bar li:first-child {
cursor: move;
}
#tracy-debug-logo svg {
width: 3.4em;
margin: 0 .2em 0 .5em;
}
/* panels */
#tracy-debug .tracy-panel {
display: none;
font: normal normal 12px/1.5 sans-serif;
background: white;
color: #333;
text-align: left;
}
body#tracy-debug .tracy-panel { /* in popup window */
display: block;
}
#tracy-debug h1 {
font: normal normal 23px/1.4 Tahoma, sans-serif;
color: #575753;
margin: -5px -5px 5px;
padding: 0 5px 0 5px;
word-wrap: break-word;
}
#tracy-debug .tracy-inner {
overflow: auto;
flex: 1;
}
#tracy-debug .tracy-panel .tracy-icons {
display: none;
}
#tracy-debug .tracy-panel-ajax h1::after,
#tracy-debug .tracy-panel-redirect h1::after {
content: 'ajax';
float: right;
font-size: 65%;
margin: 0 .3em;
}
#tracy-debug .tracy-panel-redirect h1::after {
content: 'redirect';
}
#tracy-debug .tracy-mode-peek,
#tracy-debug .tracy-mode-float {
position: fixed;
flex-direction: column;
padding: 10px;
min-width: 200px;
min-height: 80px;
border-radius: 5px;
box-shadow: 1px 1px 20px rgba(102, 102, 102, 0.36);
border: 1px solid rgba(0, 0, 0, 0.1);
}
#tracy-debug .tracy-mode-peek,
#tracy-debug .tracy-mode-float:not(.tracy-panel-resized) {
max-width: 700px;
max-height: 500px;
}
@media (max-height: 555px) {
#tracy-debug .tracy-mode-peek,
#tracy-debug .tracy-mode-float:not(.tracy-panel-resized) {
max-height: 100vh;
}
}
#tracy-debug .tracy-mode-peek h1 {
cursor: move;
}
#tracy-debug .tracy-mode-float {
display: flex;
opacity: .95;
transition: opacity 0.2s;
will-change: opacity, top, left;
overflow: auto;
resize: both;
}
#tracy-debug .tracy-focused {
display: flex;
opacity: 1;
transition: opacity 0.1s;
}
#tracy-debug .tracy-mode-float h1 {
cursor: move;
padding-right: 25px;
}
#tracy-debug .tracy-mode-float .tracy-icons {
display: block;
position: absolute;
top: 0;
right: 5px;
font-size: 18px;
}
#tracy-debug .tracy-mode-window {
padding: 10px;
}
#tracy-debug .tracy-icons a {
color: #575753;
}
#tracy-debug .tracy-icons a:hover {
color: white;
}
#tracy-debug .tracy-inner-container {
min-width: 100%;
float: left;
}
@media print {
#tracy-debug * {
display: none;
}
}

View File

@ -1,695 +0,0 @@
/**
* This file is part of the Tracy (https://tracy.nette.org)
*/
let panelZIndex = 20000,
maxAjaxRows = 3,
autoRefresh = true,
nonce = document.currentScript.getAttribute('nonce') || document.currentScript.nonce,
requestId = document.currentScript.dataset.id,
ajaxCounter = 1,
baseUrl = location.href.split('#')[0];
baseUrl += (baseUrl.indexOf('?') < 0 ? '?' : '&');
class Panel
{
constructor(id) {
this.id = id;
this.elem = document.getElementById(this.id);
this.elem.Tracy = this.elem.Tracy || {};
}
init() {
let elem = this.elem;
this.init = function() {};
elem.innerHTML = addNonces(elem.dataset.tracyContent);
Tracy.Dumper.init(Debug.layer);
delete elem.dataset.tracyContent;
evalScripts(elem);
draggable(elem, {
handles: elem.querySelectorAll('h1'),
start: () => {
if (!this.is(Panel.FLOAT)) {
this.toFloat();
}
this.focus();
this.peekPosition = false;
}
});
elem.addEventListener('mousedown', () => {
this.focus();
});
elem.addEventListener('mouseenter', () => {
clearTimeout(elem.Tracy.displayTimeout);
});
elem.addEventListener('mouseleave', () => {
this.blur();
});
elem.addEventListener('mousemove', (e) => {
if (e.buttons && !this.is(Panel.RESIZED) && (elem.style.width || elem.style.height)) {
elem.classList.add(Panel.RESIZED);
}
});
elem.addEventListener('tracy-toggle', () => {
this.reposition();
});
elem.querySelectorAll('.tracy-icons a').forEach((link) => {
link.addEventListener('click', (e) => {
if (link.dataset.tracyAction === 'close') {
this.toPeek();
} else if (link.dataset.tracyAction === 'window') {
this.toWindow();
}
e.preventDefault();
e.stopImmediatePropagation();
});
});
if (this.is('tracy-panel-persist')) {
Tracy.Toggle.persist(elem);
}
}
is(mode) {
return this.elem.classList.contains(mode);
}
focus() {
let elem = this.elem;
if (this.is(Panel.WINDOW)) {
elem.Tracy.window.focus();
} else if (!this.is(Panel.FOCUSED)) {
for (let id in Debug.panels) {
Debug.panels[id].elem.classList.remove(Panel.FOCUSED);
}
elem.classList.add(Panel.FOCUSED);
elem.style.zIndex = panelZIndex + Panel.zIndexCounter++;
}
}
blur() {
let elem = this.elem;
if (this.is(Panel.PEEK)) {
clearTimeout(elem.Tracy.displayTimeout);
elem.Tracy.displayTimeout = setTimeout(() => {
elem.classList.remove(Panel.FOCUSED);
}, 50);
}
}
toFloat() {
this.elem.classList.remove(Panel.WINDOW);
this.elem.classList.remove(Panel.PEEK);
this.elem.classList.add(Panel.FLOAT);
this.elem.classList.remove(Panel.RESIZED);
this.reposition();
}
toPeek() {
this.elem.classList.remove(Panel.WINDOW);
this.elem.classList.remove(Panel.FLOAT);
this.elem.classList.remove(Panel.FOCUSED);
this.elem.classList.add(Panel.PEEK);
this.elem.style.width = '';
this.elem.style.height = '';
this.elem.classList.remove(Panel.RESIZED);
}
toWindow() {
let offset = getOffset(this.elem);
offset.left += typeof window.screenLeft === 'number' ? window.screenLeft : (window.screenX + 10);
offset.top += typeof window.screenTop === 'number' ? window.screenTop : (window.screenY + 50);
let win = window.open('', this.id.replace(/-/g, '_'), 'left=' + offset.left + ',top=' + offset.top
+ ',width=' + this.elem.offsetWidth + ',height=' + this.elem.offsetHeight + ',resizable=yes,scrollbars=yes');
if (!win) {
return false;
}
let doc = win.document;
doc.write('<!DOCTYPE html><meta charset="utf-8">'
+ '<script src="' + (baseUrl.replace(/&/g, '&amp;').replace(/"/g, '&quot;')) + '_tracy_bar=js&amp;XDEBUG_SESSION_STOP=1" onload="Tracy.Dumper.init()" async></script>'
+ '<body id="tracy-debug">'
);
doc.body.innerHTML = '<div class="tracy-panel tracy-mode-window" id="' + this.elem.id + '">' + this.elem.innerHTML + '</div>';
evalScripts(doc.body);
if (this.elem.querySelector('h1')) {
doc.title = this.elem.querySelector('h1').textContent;
}
win.addEventListener('beforeunload', () => {
this.toPeek();
win.close(); // forces closing, can be invoked by F5
});
doc.addEventListener('keyup', (e) => {
if (e.keyCode === 27 && !e.shiftKey && !e.altKey && !e.ctrlKey && !e.metaKey) {
win.close();
}
});
this.elem.classList.remove(Panel.FLOAT);
this.elem.classList.remove(Panel.PEEK);
this.elem.classList.remove(Panel.FOCUSED);
this.elem.classList.remove(Panel.RESIZED);
this.elem.classList.add(Panel.WINDOW);
this.elem.Tracy.window = win;
return true;
}
reposition(deltaX, deltaY) {
let pos = getPosition(this.elem);
if (pos.width) { // is visible?
setPosition(this.elem, {left: pos.left + (deltaX || 0), top: pos.top + (deltaY || 0)});
if (this.is(Panel.RESIZED)) {
let size = getWindowSize();
this.elem.style.width = Math.min(size.width, pos.width) + 'px';
this.elem.style.height = Math.min(size.height, pos.height) + 'px';
}
}
}
savePosition() {
let key = this.id.split(':')[0]; // remove :requestId part
let pos = getPosition(this.elem);
if (this.is(Panel.WINDOW)) {
localStorage.setItem(key, JSON.stringify({window: true}));
} else if (pos.width) { // is visible?
localStorage.setItem(key, JSON.stringify({right: pos.right, bottom: pos.bottom, width: pos.width, height: pos.height, zIndex: this.elem.style.zIndex - panelZIndex, resized: this.is(Panel.RESIZED)}));
} else {
localStorage.removeItem(key);
}
}
restorePosition() {
let key = this.id.split(':')[0];
let pos = JSON.parse(localStorage.getItem(key));
if (!pos) {
this.elem.classList.add(Panel.PEEK);
} else if (pos.window) {
this.init();
this.toWindow() || this.toFloat();
} else if (this.elem.dataset.tracyContent) {
this.init();
this.toFloat();
if (pos.resized) {
this.elem.classList.add(Panel.RESIZED);
this.elem.style.width = pos.width + 'px';
this.elem.style.height = pos.height + 'px';
}
setPosition(this.elem, pos);
this.elem.style.zIndex = panelZIndex + (pos.zIndex || 1);
Panel.zIndexCounter = Math.max(Panel.zIndexCounter, (pos.zIndex || 1)) + 1;
}
}
}
Panel.PEEK = 'tracy-mode-peek';
Panel.FLOAT = 'tracy-mode-float';
Panel.WINDOW = 'tracy-mode-window';
Panel.FOCUSED = 'tracy-focused';
Panel.RESIZED = 'tracy-panel-resized';
Panel.zIndexCounter = 1;
class Bar
{
init() {
this.id = 'tracy-debug-bar';
this.elem = document.getElementById(this.id);
draggable(this.elem, {
handles: this.elem.querySelectorAll('li:first-child'),
draggedClass: 'tracy-dragged',
stop: () => {
this.savePosition();
}
});
this.elem.addEventListener('mousedown', (e) => {
e.preventDefault();
});
this.initTabs(this.elem);
this.restorePosition();
(new MutationObserver(() => {
this.restorePosition();
})).observe(this.elem, {childList: true, characterData: true, subtree: true});
}
initTabs(elem) {
elem.querySelectorAll('a').forEach((link) => {
link.addEventListener('click', (e) => {
if (link.dataset.tracyAction === 'close') {
this.close();
} else if (link.rel) {
let panel = Debug.panels[link.rel];
panel.init();
if (e.shiftKey) {
panel.toFloat();
panel.toWindow();
} else if (panel.is(Panel.FLOAT)) {
panel.toPeek();
} else {
panel.toFloat();
if (panel.peekPosition) {
panel.reposition(-Math.round(Math.random() * 100) - 20, (Math.round(Math.random() * 100) + 20) * (this.isAtTop() ? 1 : -1));
panel.peekPosition = false;
}
}
}
e.preventDefault();
e.stopImmediatePropagation();
});
link.addEventListener('mouseenter', (e) => {
if (e.buttons || !link.rel || elem.classList.contains('tracy-dragged')) {
return;
}
clearTimeout(this.displayTimeout);
this.displayTimeout = setTimeout(() => {
let panel = Debug.panels[link.rel];
panel.focus();
if (panel.is(Panel.PEEK)) {
panel.init();
let pos = getPosition(panel.elem);
setPosition(panel.elem, {
left: getOffset(link).left + getPosition(link).width + 4 - pos.width,
top: this.isAtTop()
? getOffset(this.elem).top + getPosition(this.elem).height + 4
: getOffset(this.elem).top - pos.height - 4
});
panel.peekPosition = true;
}
}, 50);
});
link.addEventListener('mouseleave', () => {
clearTimeout(this.displayTimeout);
if (link.rel && !elem.classList.contains('tracy-dragged')) {
Debug.panels[link.rel].blur();
}
});
});
this.autoHideLabels();
}
autoHideLabels() {
let width = getWindowSize().width;
this.elem.querySelectorAll('.tracy-row').forEach((row) => {
let i, labels = row.querySelectorAll('.tracy-label');
for (i = 0; i < labels.length && row.clientWidth < width; i++) {
labels.item(i).hidden = false;
}
for (i = labels.length - 1; i >= 0 && row.clientWidth >= width; i--) {
labels.item(i).hidden = true;
}
});
}
close() {
document.getElementById('tracy-debug').style.display = 'none';
}
reposition(deltaX, deltaY) {
let pos = getPosition(this.elem);
if (pos.width) { // is visible?
setPosition(this.elem, {left: pos.left + (deltaX || 0), top: pos.top + (deltaY || 0)});
this.savePosition();
}
}
savePosition() {
let pos = getPosition(this.elem);
if (pos.width) { // is visible?
localStorage.setItem(this.id, JSON.stringify(this.isAtTop() ? {right: pos.right, top: pos.top} : {right: pos.right, bottom: pos.bottom}));
}
}
restorePosition() {
let pos = JSON.parse(localStorage.getItem(this.id));
setPosition(this.elem, pos || {right: 0, bottom: 0});
this.savePosition();
}
isAtTop() {
let pos = getPosition(this.elem);
return pos.top < 100 && pos.bottom > pos.top;
}
}
class Debug
{
static init(content) {
Debug.bar = new Bar;
Debug.panels = {};
Debug.layer = document.createElement('tracy-div');
Debug.layer.setAttribute('id', 'tracy-debug');
Debug.layer.innerHTML = addNonces(content);
(document.body || document.documentElement).appendChild(Debug.layer);
evalScripts(Debug.layer);
Debug.layer.style.display = 'block';
Debug.bar.init();
Debug.layer.querySelectorAll('.tracy-panel').forEach((panel) => {
Debug.panels[panel.id] = new Panel(panel.id);
Debug.panels[panel.id].restorePosition();
});
Debug.captureWindow();
Debug.captureAjax();
Tracy.TableSort.init();
}
static loadAjax(content) {
let rows = Debug.bar.elem.querySelectorAll('.tracy-row[data-tracy-group=ajax]');
rows = Array.from(rows).reverse();
let max = maxAjaxRows;
rows.forEach((row) => {
if (--max > 0) {
return;
}
row.querySelectorAll('a[rel]').forEach((tab) => {
let panel = Debug.panels[tab.rel];
if (panel.is(Panel.PEEK)) {
delete Debug.panels[tab.rel];
panel.elem.remove();
}
});
row.remove();
});
if (rows[0]) { // update content in first-row panels
rows[0].querySelectorAll('a[rel]').forEach((tab) => {
Debug.panels[tab.rel].savePosition();
Debug.panels[tab.rel].toPeek();
});
}
Debug.layer.insertAdjacentHTML('beforeend', content.panels);
evalScripts(Debug.layer);
Debug.bar.elem.insertAdjacentHTML('beforeend', content.bar);
let ajaxBar = Debug.bar.elem.querySelector('.tracy-row:last-child');
Debug.layer.querySelectorAll('.tracy-panel').forEach((panel) => {
if (!Debug.panels[panel.id]) {
Debug.panels[panel.id] = new Panel(panel.id);
Debug.panels[panel.id].restorePosition();
}
});
Debug.bar.initTabs(ajaxBar);
}
static captureWindow() {
let size = getWindowSize();
window.addEventListener('resize', () => {
let newSize = getWindowSize();
Debug.bar.reposition(newSize.width - size.width, newSize.height - size.height);
Debug.bar.autoHideLabels();
for (let id in Debug.panels) {
Debug.panels[id].reposition(newSize.width - size.width, newSize.height - size.height);
}
size = newSize;
});
window.addEventListener('unload', () => {
for (let id in Debug.panels) {
Debug.panels[id].savePosition();
}
});
}
static captureAjax() {
if (!requestId) {
return;
}
let oldOpen = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function() {
oldOpen.apply(this, arguments);
if (autoRefresh && new URL(arguments[1], location.origin).host === location.host) {
let reqId = Tracy.getAjaxHeader();
this.setRequestHeader('X-Tracy-Ajax', reqId);
this.addEventListener('load', function() {
if (this.getAllResponseHeaders().match(/^X-Tracy-Ajax: 1/mi)) {
Debug.loadScript(baseUrl + '_tracy_bar=content-ajax.' + reqId + '&XDEBUG_SESSION_STOP=1&v=' + Math.random());
}
});
}
};
let oldFetch = window.fetch;
window.fetch = function(request, options) {
request = request instanceof Request ? request : new Request(request, options || {});
let reqId = request.headers.get('X-Tracy-Ajax');
if (autoRefresh && !reqId && new URL(request.url, location.origin).host === location.host) {
reqId = Tracy.getAjaxHeader();
request.headers.set('X-Tracy-Ajax', reqId);
}
return oldFetch(request).then((response) => {
if (response instanceof Response && response.headers.has('X-Tracy-Ajax') && response.headers.get('X-Tracy-Ajax')[0] === '1') {
Debug.loadScript(baseUrl + '_tracy_bar=content-ajax.' + reqId + '&XDEBUG_SESSION_STOP=1&v=' + Math.random());
}
return response;
});
};
}
static loadScript(url) {
if (Debug.scriptElem) {
Debug.scriptElem.remove();
}
Debug.scriptElem = document.createElement('script');
Debug.scriptElem.src = url;
Debug.scriptElem.setAttribute('nonce', nonce);
(document.body || document.documentElement).appendChild(Debug.scriptElem);
}
static setOptions(options) {
maxAjaxRows = options.maxAjaxRows || maxAjaxRows;
autoRefresh = typeof options.autoRefresh !== 'undefined' ? options.autoRefresh : autoRefresh;
panelZIndex = options.panelZIndex || panelZIndex;
}
}
function evalScripts(elem) {
elem.querySelectorAll('script').forEach((script) => {
if ((!script.hasAttribute('type') || script.type === 'text/javascript' || script.type === 'application/javascript') && !script.tracyEvaluated) {
let document = script.ownerDocument;
let dolly = document.createElement('script');
dolly.textContent = script.textContent;
dolly.setAttribute('nonce', nonce);
(document.body || document.documentElement).appendChild(dolly);
script.tracyEvaluated = true;
}
});
}
let dragging;
function draggable(elem, options) {
let dE = document.documentElement, started, deltaX, deltaY, clientX, clientY;
options = options || {};
let redraw = function () {
if (dragging) {
setPosition(elem, {left: clientX + deltaX, top: clientY + deltaY});
requestAnimationFrame(redraw);
}
};
let onMove = function(e) {
if (e.buttons === 0) {
return onEnd(e);
}
if (!started) {
if (options.draggedClass) {
elem.classList.add(options.draggedClass);
}
if (options.start) {
options.start(e, elem);
}
started = true;
}
clientX = e.touches ? e.touches[0].clientX : e.clientX;
clientY = e.touches ? e.touches[0].clientY : e.clientY;
return false;
};
let onEnd = function(e) {
if (started) {
if (options.draggedClass) {
elem.classList.remove(options.draggedClass);
}
if (options.stop) {
options.stop(e, elem);
}
}
dragging = null;
dE.removeEventListener('mousemove', onMove);
dE.removeEventListener('mouseup', onEnd);
dE.removeEventListener('touchmove', onMove);
dE.removeEventListener('touchend', onEnd);
return false;
};
let onStart = function(e) {
e.preventDefault();
e.stopPropagation();
if (dragging) { // missed mouseup out of window?
return onEnd(e);
}
let pos = getPosition(elem);
clientX = e.touches ? e.touches[0].clientX : e.clientX;
clientY = e.touches ? e.touches[0].clientY : e.clientY;
deltaX = pos.left - clientX;
deltaY = pos.top - clientY;
dragging = true;
started = false;
dE.addEventListener('mousemove', onMove);
dE.addEventListener('mouseup', onEnd);
dE.addEventListener('touchmove', onMove);
dE.addEventListener('touchend', onEnd);
requestAnimationFrame(redraw);
if (options.start) {
options.start(e, elem);
}
};
options.handles.forEach((handle) => {
handle.addEventListener('mousedown', onStart);
handle.addEventListener('touchstart', onStart);
handle.addEventListener('click', (e) => {
if (started) {
e.stopImmediatePropagation();
}
});
});
}
// returns total offset for element
function getOffset(elem) {
let res = {left: elem.offsetLeft, top: elem.offsetTop};
while (elem = elem.offsetParent) { // eslint-disable-line no-cond-assign
res.left += elem.offsetLeft; res.top += elem.offsetTop;
}
return res;
}
function getWindowSize() {
return {
width: document.documentElement.clientWidth,
height: document.compatMode === 'BackCompat' ? window.innerHeight : document.documentElement.clientHeight
};
}
// move to new position
function setPosition(elem, coords) {
let win = getWindowSize();
if (typeof coords.right !== 'undefined') {
coords.left = win.width - elem.offsetWidth - coords.right;
}
if (typeof coords.bottom !== 'undefined') {
coords.top = win.height - elem.offsetHeight - coords.bottom;
}
elem.style.left = Math.max(0, Math.min(coords.left, win.width - elem.offsetWidth)) + 'px';
elem.style.top = Math.max(0, Math.min(coords.top, win.height - elem.offsetHeight)) + 'px';
}
// returns current position
function getPosition(elem) {
let win = getWindowSize();
return {
left: elem.offsetLeft,
top: elem.offsetTop,
right: win.width - elem.offsetWidth - elem.offsetLeft,
bottom: win.height - elem.offsetHeight - elem.offsetTop,
width: elem.offsetWidth,
height: elem.offsetHeight
};
}
function addNonces(html) {
let el = document.createElement('div');
el.innerHTML = html;
el.querySelectorAll('style').forEach((style) => {
style.setAttribute('nonce', nonce);
});
return el.innerHTML;
}
let Tracy = window.Tracy = window.Tracy || {};
Tracy.DebugPanel = Panel;
Tracy.DebugBar = Bar;
Tracy.Debug = Debug;
Tracy.getAjaxHeader = () => requestId + '_' + ajaxCounter++;
Debug.setOptions({
panelZIndex: Tracy.panelZIndex,
maxAjaxRows: window.TracyMaxAjaxRows,
autoRefresh: window.TracyAutoRefresh,
});

View File

@ -1,31 +0,0 @@
<?php
declare(strict_types=1);
namespace Tracy;
/**
* @var string $type
* @var \stdClass[] $panels
*/
?>
<ul class="tracy-row" data-tracy-group="<?= Helpers::escapeHtml($type) ?>">
<?php if ($type === 'main'): ?>
<li id="tracy-debug-logo" title="Tracy Debugger <?= Debugger::VERSION, " \nhttps://tracy.nette.org" ?>">
<svg viewBox="0 -10 1561 333"><path fill="#585755" d="m176 327h-57v-269h-119v-57h291v57h-115v269zm208-191h114c50 0 47-78 0-78h-114v78zm106-135c17 0 33 2 46 7 75 30 75 144 1 175-13 6-29 8-47 8h-27l132 74v68l-211-128v122h-57v-326h163zm300 57c-5 0-9 3-11 9l-56 156h135l-55-155c-2-7-6-10-13-10zm-86 222l-17 47h-61l102-285c20-56 107-56 126 0l102 285h-61l-17-47h-174zm410 47c-98 0-148-55-148-163v-2c0-107 50-161 149-161h118v57h-133c-26 0-45 8-58 25-12 17-19 44-19 81 0 71 26 106 77 106h133v57h-119zm270-145l-121-181h68l81 130 81-130h68l-121 178v148h-56v-145z"/></svg>
</li>
<?php endif; if ($type === 'redirect'): ?>
<li><span title="Previous request before redirect">redirect</span></li>
<?php endif; if ($type === 'ajax'): ?>
<li>AJAX</li>
<?php endif ?>
<?php foreach ($panels as $panel): if ($panel->tab) { ?>
<li><?php if ($panel->panel): ?><a href="#" rel="tracy-debug-panel-<?= $panel->id ?>"><?= trim($panel->tab) ?></a><?php else: echo '<span>', trim($panel->tab), '</span>'; endif ?></li>
<?php } endforeach ?>
<?php if ($type === 'main'): ?>
<li><a href="#" data-tracy-action="close" title="close debug bar">&times;</a></li>
<?php endif ?>
</ul>

View File

@ -1,30 +0,0 @@
<?php
declare(strict_types=1);
namespace Tracy;
/**
* @var ?string $nonce
* @var bool $async
* @var string $requestId
*/
$baseUrl = $_SERVER['REQUEST_URI'] ?? '';
$baseUrl .= strpos($baseUrl, '?') === false ? '?' : '&';
$nonceAttr = $nonce ? ' nonce="' . Helpers::escapeHtml($nonce) . '"' : '';
$asyncAttr = $async ? ' async' : '';
?>
<?php if (empty($content)): ?>
<script src="<?= Helpers::escapeHtml($baseUrl) ?>_tracy_bar=<?= urlencode("content.$requestId") ?>&amp;XDEBUG_SESSION_STOP=1" data-id="<?= Helpers::escapeHtml($requestId) ?>"<?= $asyncAttr, $nonceAttr ?>></script>
<?php else: ?>
<!-- Tracy Debug Bar -->
<script src="<?= Helpers::escapeHtml($baseUrl) ?>_tracy_bar=js&amp;v=<?= urlencode(Debugger::VERSION) ?>&amp;XDEBUG_SESSION_STOP=1" data-id="<?= Helpers::escapeHtml($requestId) ?>"<?= $nonceAttr ?>></script>
<script<?= $nonceAttr ?>>
Tracy.Debug.init(<?= str_replace(['<!--', '</s'], ['<\!--', '<\/s'], json_encode($content, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_SUBSTITUTE)) ?>);
</script>
<?php endif ?>

View File

@ -1,30 +0,0 @@
<?php
declare(strict_types=1);
namespace Tracy;
use Tracy\Helpers;
/**
* @var string $type
* @var \stdClass[] $panels
*/
$icons = '
<div class="tracy-icons">
<a href="#" data-tracy-action="window" title="open in window">&curren;</a>
<a href="#" data-tracy-action="close" title="close window">&times;</a>
</div>
';
echo '<div itemscope>';
foreach ($panels as $panel) {
$content = $panel->panel ? ($panel->panel . "\n" . $icons) : '';
$class = 'tracy-panel ' . ($type === 'ajax' ? '' : 'tracy-panel-persist') . ' tracy-panel-' . $type; ?>
<div class="<?= $class ?>" id="tracy-debug-panel-<?= $panel->id ?>" data-tracy-content='<?= str_replace(['&', "'"], ['&amp;', '&#039;'], $content) ?>'></div><?php
}
echo '<meta itemprop=tracy-snapshot content=', Dumper::formatSnapshotAttribute(Dumper::$liveSnapshot), '>';
echo '</div>';

View File

@ -1,29 +0,0 @@
<?php
declare(strict_types=1);
namespace Tracy;
/** @var array[] $data */
?>
<style class="tracy-debug">
#tracy-debug .tracy-DumpPanel h2 {
font: 11pt/1.5 sans-serif;
margin: 0;
padding: 2px 8px;
background: #3484d2;
color: white;
}
</style>
<h1>Dumps</h1>
<div class="tracy-inner tracy-DumpPanel">
<?php foreach ($data as $item): ?>
<?php if ($item['title']):?>
<h2><?= Helpers::escapeHtml($item['title']) ?></h2>
<?php endif ?>
<?= $item['dump'] ?>
<?php endforeach ?>
</div>

View File

@ -1,13 +0,0 @@
<?php
declare(strict_types=1);
namespace Tracy;
/** @var array[] $data */
if (empty($data)) {
return;
}
?>
<svg viewBox="0 0 2048 2048"><path fill="#154ABD" d="m1084 540c-110-1-228-2-325 58-54 35-87 94-126 143-94 162-71 383 59 519 83 94 207 151 333 149 132 3 261-60 344-160 122-138 139-355 44-511-73-66-133-158-234-183-31-9-65-9-95-14zm-60 116c73 0 53 115-16 97-105 5-195 102-192 207-2 78-122 48-95-23 8-153 151-285 304-280l-1-1zM1021 511"/><path fill="#4B6193" d="m1021 511c-284-2-560 131-746 344-53 64-118 125-145 206-16 86 59 152 103 217 219 267 575 428 921 377 312-44 600-241 755-515 39-81-30-156-74-217-145-187-355-327-581-384-77-19-156-29-234-28zm0 128c263-4 512 132 679 330 33 52 132 110 58 168-170 237-449 409-747 399-309 0-590-193-752-447 121-192 305-346 526-407 75-25 170-38 237-43z"/>
</svg><span class="tracy-label">dumps</span>

View File

@ -1,21 +0,0 @@
<?php
declare(strict_types=1);
namespace Tracy;
/** @var int[] $data */
?>
<h1>Errors</h1>
<div class="tracy-inner">
<table class="tracy-sortable">
<tr><th>Count</th><th>Error</th></tr>
<?php foreach ($data as $item => $count): [$file, $line, $message] = explode('|', $item, 3) ?>
<tr>
<td class="tracy-right"><?= $count ? "$count\xC3\x97" : '' ?></td>
<td><pre><?= Helpers::escapeHtml($message), ' in ', Helpers::editorLink($file, (int) $line) ?></pre></td>
</tr>
<?php endforeach ?>
</table>
</div>

View File

@ -1,25 +0,0 @@
<?php
declare(strict_types=1);
namespace Tracy;
/** @var int[] $data */
if (empty($data)) {
return;
}
?>
<style class="tracy-debug">
#tracy-debug .tracy-ErrorTab {
display: block;
background: #D51616;
color: white;
font-weight: bold;
margin: -1px -.4em;
padding: 1px .4em;
}
</style>
<span class="tracy-ErrorTab">
<svg viewBox="0 0 2048 2048"><path fill="#fff" d="M1152 1503v-190q0-14-9.5-23.5t-22.5-9.5h-192q-13 0-22.5 9.5t-9.5 23.5v190q0 14 9.5 23.5t22.5 9.5h192q13 0 22.5-9.5t9.5-23.5zm-2-374l18-459q0-12-10-19-13-11-24-11h-220q-11 0-24 11-10 7-10 21l17 457q0 10 10 16.5t24 6.5h185q14 0 23.5-6.5t10.5-16.5zm-14-934l768 1408q35 63-2 126-17 29-46.5 46t-63.5 17h-1536q-34 0-63.5-17t-46.5-46q-37-63-2-126l768-1408q17-31 47-49t65-18 65 18 47 49z"/>
</svg><span class="tracy-label"><?= $sum = array_sum($data), $sum > 1 ? ' errors' : ' error' ?></span>
</span>

View File

@ -1,124 +0,0 @@
<?php
declare(strict_types=1);
namespace Tracy;
/** @var DefaultBarPanel $this */
if (isset($this->cpuUsage) && $this->time) {
foreach (getrusage() as $key => $val) {
$this->cpuUsage[$key] -= $val;
}
$userUsage = -round(($this->cpuUsage['ru_utime.tv_sec'] * 1e6 + $this->cpuUsage['ru_utime.tv_usec']) / $this->time / 10000);
$systemUsage = -round(($this->cpuUsage['ru_stime.tv_sec'] * 1e6 + $this->cpuUsage['ru_stime.tv_usec']) / $this->time / 10000);
}
$countClasses = function (array $list): int {
return count(array_filter($list, function (string $name): bool {
return (new \ReflectionClass($name))->isUserDefined();
}));
};
$ipFormatter = static function (?string $ip): ?string {
if ($ip === '127.0.0.1' || $ip === '::1') {
$ip .= ' (localhost)';
}
return $ip;
};
$opcache = function_exists('opcache_get_status') ? @opcache_get_status() : null; // @ can be restricted
$cachedFiles = isset($opcache['scripts']) ? array_intersect(array_keys($opcache['scripts']), get_included_files()) : [];
$jit = $opcache['jit'] ?? null;
$info = [
'Execution time' => number_format($this->time * 1000, 1, '.', "\u{202f}") . "\u{202f}ms",
'CPU usage user + system' => isset($userUsage) ? (int) $userUsage . "\u{202f}% + " . (int) $systemUsage . "\u{202f}%" : null,
'Peak of allocated memory' => number_format(memory_get_peak_usage() / 1000000, 2, '.', "\u{202f}") . "\u{202f}MB",
'Included files' => count(get_included_files()),
'Classes + interfaces + traits' => $countClasses(get_declared_classes()) . ' + '
. $countClasses(get_declared_interfaces()) . ' + ' . $countClasses(get_declared_traits()),
'OPcache' => $opcache ? round(count($cachedFiles) * 100 / count(get_included_files())) . "\u{202f}% cached" : '',
'JIT' => empty($jit['buffer_size']) ? '' : round(($jit['buffer_size'] - $jit['buffer_free']) / $jit['buffer_size'] * 100) . "\u{202f}% used",
'Your IP' => $ipFormatter($_SERVER['REMOTE_ADDR'] ?? null),
'Server IP' => $ipFormatter($_SERVER['SERVER_ADDR'] ?? null),
'HTTP method / response code' => isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] . ' / ' . http_response_code() : null,
'PHP' => PHP_VERSION,
'Xdebug' => extension_loaded('xdebug') ? phpversion('xdebug') : null,
'Tracy' => Debugger::VERSION,
'Server' => $_SERVER['SERVER_SOFTWARE'] ?? null,
];
$info = array_map('strval', array_filter($info + (array) $this->data));
$packages = $devPackages = [];
if (class_exists('Composer\Autoload\ClassLoader', false)) {
$baseDir = (function () {
@include dirname((new \ReflectionClass('Composer\Autoload\ClassLoader'))->getFileName()) . '/autoload_psr4.php'; // @ may not exist
return $baseDir;
})();
$composer = @json_decode((string) file_get_contents($baseDir . '/composer.lock')); // @ may not exist or be valid
[$packages, $devPackages] = [(array) @$composer->packages, (array) @$composer->{'packages-dev'}]; // @ keys may not exist
foreach ([&$packages, &$devPackages] as &$items) {
array_walk($items, function ($package) {
$package->hash = $package->source->reference ?? $package->dist->reference ?? null;
}, $items);
usort($items, function ($a, $b): int { return $a->name <=> $b->name; });
}
}
?>
<style class="tracy-debug">
#tracy-debug .tracy-InfoPanel td {
white-space: nowrap;
}
#tracy-debug .tracy-InfoPanel td:nth-child(2) {
font-weight: bold;
width: 30%;
}
#tracy-debug .tracy-InfoPanel td[colspan='2'] b {
float: right;
margin-left: 2em;
}
</style>
<h1>System info</h1>
<div class="tracy-inner tracy-InfoPanel">
<div class="tracy-inner-container">
<table class="tracy-sortable">
<?php foreach ($info as $key => $val): ?>
<tr>
<?php if (strlen($val) > 25): ?>
<td colspan=2><?= Helpers::escapeHtml($key) ?> <b><?= Helpers::escapeHtml($val) ?></b></td>
<?php else: ?>
<td><?= Helpers::escapeHtml($key) ?></td><td><?= Helpers::escapeHtml($val) ?></td>
<?php endif ?>
</tr>
<?php endforeach ?>
</table>
<?php if ($packages || $devPackages): ?>
<h2><a class="tracy-toggle tracy-collapsed" data-tracy-ref="^div .tracy-InfoPanel-packages">Composer Packages (<?= count($packages), $devPackages ? ' + ' . count($devPackages) . ' dev' : '' ?>)</a></h2>
<div class="tracy-InfoPanel-packages tracy-collapsed">
<?php if ($packages): ?>
<table class="tracy-sortable">
<?php foreach ($packages as $package): ?>
<tr><td><?= Helpers::escapeHtml($package->name) ?></td><td><?= Helpers::escapeHtml($package->version . (strpos($package->version, 'dev') !== false && $package->hash ? ' #' . substr($package->hash, 0, 4) : '')) ?></td></tr>
<?php endforeach ?>
</table>
<?php endif ?>
<?php if ($devPackages): ?>
<h2>Dev Packages</h2>
<table class="tracy-sortable">
<?php foreach ($devPackages as $package): ?>
<tr><td><?= Helpers::escapeHtml($package->name) ?></td><td><?= Helpers::escapeHtml($package->version . (strpos($package->version, 'dev') !== false && $package->hash ? ' #' . substr($package->hash, 0, 4) : '')) ?></td></tr>
<?php endforeach ?>
</table>
<?php endif ?>
</div>
<?php endif ?>
</div>
</div>

View File

@ -1,15 +0,0 @@
<?php
declare(strict_types=1);
namespace Tracy;
/** @var DefaultBarPanel $this */
$this->time = microtime(true) - Debugger::$time;
?>
<span title="Execution time">
<svg viewBox="0 0 2048 2048"><path fill="#86bbf0" d="m640 1153.6v639.3h-256v-639.3z"/><path fill="#6ba9e6" d="m1024 254.68v1538.2h-256v-1538.2z"/><path fill="#4f96dc" d="m1408 897.57v894.3h-256v-894.3z"/><path fill="#3987d4" d="m1792 513.08v1279.8h-256v-1279.8z"/>
</svg><span class="tracy-label"><?= number_format($this->time * 1000, 1, '.', "\u{202f}") ?> ms</span>
</span>

View File

@ -1,135 +0,0 @@
<?php
/**
* This file is part of the Tracy (https://tracy.nette.org)
* Copyright (c) 2004 David Grudl (https://davidgrudl.com)
*/
declare (strict_types=1);
namespace RectorPrefix20220530\Tracy;
/**
* FireLogger console logger.
*
* @see http://firelogger.binaryage.com
* @see https://chrome.google.com/webstore/detail/firelogger-for-chrome/hmagilfopmdjkeomnjpchokglfdfjfeh
*/
class FireLogger implements \RectorPrefix20220530\Tracy\ILogger
{
/** @var int */
public $maxDepth = 3;
/** @var int */
public $maxLength = 150;
/** @var array */
private $payload = ['logs' => []];
/**
* Sends message to FireLogger console.
* @param mixed $message
*/
public function log($message, $level = self::DEBUG) : bool
{
if (!isset($_SERVER['HTTP_X_FIRELOGGER']) || \headers_sent()) {
return \false;
}
$item = ['name' => 'PHP', 'level' => $level, 'order' => \count($this->payload['logs']), 'time' => \str_pad(\number_format((\microtime(\true) - \RectorPrefix20220530\Tracy\Debugger::$time) * 1000, 1, '.', ' '), 8, '0', \STR_PAD_LEFT) . ' ms', 'template' => '', 'message' => '', 'style' => 'background:#767ab6'];
$args = \func_get_args();
if (isset($args[0]) && \is_string($args[0])) {
$item['template'] = \array_shift($args);
}
if (isset($args[0]) && $args[0] instanceof \Throwable) {
$e = \array_shift($args);
$trace = $e->getTrace();
if (isset($trace[0]['class']) && $trace[0]['class'] === \RectorPrefix20220530\Tracy\Debugger::class && ($trace[0]['function'] === 'shutdownHandler' || $trace[0]['function'] === 'errorHandler')) {
unset($trace[0]);
}
$file = \str_replace(\dirname($e->getFile(), 3), "", $e->getFile());
$item['template'] = ($e instanceof \ErrorException ? '' : \RectorPrefix20220530\Tracy\Helpers::getClass($e) . ': ') . $e->getMessage() . ($e->getCode() ? ' #' . $e->getCode() : '') . ' in ' . $file . ':' . $e->getLine();
$item['pathname'] = $e->getFile();
$item['lineno'] = $e->getLine();
} else {
$trace = \debug_backtrace();
if (isset($trace[1]['class']) && $trace[1]['class'] === \RectorPrefix20220530\Tracy\Debugger::class && $trace[1]['function'] === 'fireLog') {
unset($trace[0]);
}
foreach ($trace as $frame) {
if (isset($frame['file']) && \is_file($frame['file'])) {
$item['pathname'] = $frame['file'];
$item['lineno'] = $frame['line'];
break;
}
}
}
$item['exc_info'] = ['', '', []];
$item['exc_frames'] = [];
foreach ($trace as $frame) {
$frame += ['file' => null, 'line' => null, 'class' => null, 'type' => null, 'function' => null, 'object' => null, 'args' => null];
$item['exc_info'][2][] = [$frame['file'], $frame['line'], "{$frame['class']}{$frame['type']}{$frame['function']}", $frame['object']];
$item['exc_frames'][] = $frame['args'];
}
if (isset($args[0]) && \in_array($args[0], [self::DEBUG, self::INFO, self::WARNING, self::ERROR, self::CRITICAL], \true)) {
$item['level'] = \array_shift($args);
}
$item['args'] = $args;
$this->payload['logs'][] = $this->jsonDump($item, -1);
foreach (\str_split(\base64_encode(\json_encode($this->payload, \JSON_INVALID_UTF8_SUBSTITUTE)), 4990) as $k => $v) {
\header("FireLogger-de11e-{$k}: {$v}");
}
return \true;
}
/**
* Dump implementation for JSON.
* @param mixed $var
* @return array|int|float|bool|string|null
*/
private function jsonDump(&$var, int $level = 0)
{
if (\is_bool($var) || $var === null || \is_int($var) || \is_float($var)) {
return $var;
} elseif (\is_string($var)) {
$var = \RectorPrefix20220530\Tracy\Helpers::encodeString($var, $this->maxLength);
return \htmlspecialchars_decode(\strip_tags($var));
} elseif (\is_array($var)) {
static $marker;
if ($marker === null) {
$marker = \uniqid("\0", \true);
}
if (isset($var[$marker])) {
return "…RECURSION…";
} elseif ($level < $this->maxDepth || !$this->maxDepth) {
$var[$marker] = \true;
$res = [];
foreach ($var as $k => &$v) {
if ($k !== $marker) {
$res[$this->jsonDump($k)] = $this->jsonDump($v, $level + 1);
}
}
unset($var[$marker]);
return $res;
} else {
return "";
}
} elseif (\is_object($var)) {
$arr = (array) $var;
static $list = [];
if (\in_array($var, $list, \true)) {
return "…RECURSION…";
} elseif ($level < $this->maxDepth || !$this->maxDepth) {
$list[] = $var;
$res = ["\0" => '(object) ' . \RectorPrefix20220530\Tracy\Helpers::getClass($var)];
foreach ($arr as $k => &$v) {
if (isset($k[0]) && $k[0] === "\0") {
$k = \substr($k, \strrpos($k, "\0") + 1);
}
$res[$this->jsonDump($k)] = $this->jsonDump($v, $level + 1);
}
\array_pop($list);
return $res;
} else {
return "";
}
} elseif (\is_resource($var)) {
return 'resource ' . \get_resource_type($var);
} else {
return 'unknown type';
}
}
}

View File

@ -1,17 +0,0 @@
<?php
/**
* This file is part of the Tracy (https://tracy.nette.org)
* Copyright (c) 2004 David Grudl (https://davidgrudl.com)
*/
declare (strict_types=1);
namespace RectorPrefix20220530\Tracy;
/**
* Logger.
*/
interface ILogger
{
public const DEBUG = 'debug', INFO = 'info', WARNING = 'warning', ERROR = 'error', EXCEPTION = 'exception', CRITICAL = 'critical';
function log($value, $level = self::INFO);
}

View File

@ -1,136 +0,0 @@
<?php
/**
* This file is part of the Tracy (https://tracy.nette.org)
* Copyright (c) 2004 David Grudl (https://davidgrudl.com)
*/
declare (strict_types=1);
namespace RectorPrefix20220530\Tracy;
/**
* Logger.
*/
class Logger implements \RectorPrefix20220530\Tracy\ILogger
{
/** @var string|null name of the directory where errors should be logged */
public $directory;
/** @var string|array|null email or emails to which send error notifications */
public $email;
/** @var string|null sender of email notifications */
public $fromEmail;
/** @var mixed interval for sending email is 2 days */
public $emailSnooze = '2 days';
/** @var callable handler for sending emails */
public $mailer;
/** @var BlueScreen|null */
private $blueScreen;
/**
* @param string|array|null $email
*/
public function __construct(?string $directory, $email = null, ?\RectorPrefix20220530\Tracy\BlueScreen $blueScreen = null)
{
$this->directory = $directory;
$this->email = $email;
$this->blueScreen = $blueScreen;
$this->mailer = [$this, 'defaultMailer'];
}
/**
* Logs message or exception to file and sends email notification.
* @param mixed $message
* @param string $level one of constant ILogger::INFO, WARNING, ERROR (sends email), EXCEPTION (sends email), CRITICAL (sends email)
* @return string|null logged error filename
*/
public function log($message, $level = self::INFO)
{
if (!$this->directory) {
throw new \LogicException('Logging directory is not specified.');
} elseif (!\is_dir($this->directory)) {
throw new \RuntimeException("Logging directory '{$this->directory}' is not found or is not directory.");
}
$exceptionFile = $message instanceof \Throwable ? $this->getExceptionFile($message, $level) : null;
$line = static::formatLogLine($message, $exceptionFile);
$file = $this->directory . '/' . \strtolower($level ?: self::INFO) . '.log';
if (!@\file_put_contents($file, $line . \PHP_EOL, \FILE_APPEND | \LOCK_EX)) {
// @ is escalated to exception
throw new \RuntimeException("Unable to write to log file '{$file}'. Is directory writable?");
}
if ($exceptionFile) {
$this->logException($message, $exceptionFile);
}
if (\in_array($level, [self::ERROR, self::EXCEPTION, self::CRITICAL], \true)) {
$this->sendEmail($message);
}
return $exceptionFile;
}
/**
* @param mixed $message
*/
public static function formatMessage($message) : string
{
if ($message instanceof \Throwable) {
foreach (\RectorPrefix20220530\Tracy\Helpers::getExceptionChain($message) as $exception) {
$tmp[] = ($exception instanceof \ErrorException ? \RectorPrefix20220530\Tracy\Helpers::errorTypeToString($exception->getSeverity()) . ': ' . $exception->getMessage() : \RectorPrefix20220530\Tracy\Helpers::getClass($exception) . ': ' . $exception->getMessage() . ($exception->getCode() ? ' #' . $exception->getCode() : '')) . ' in ' . $exception->getFile() . ':' . $exception->getLine();
}
$message = \implode("\ncaused by ", $tmp);
} elseif (!\is_string($message)) {
$message = \RectorPrefix20220530\Tracy\Dumper::toText($message);
}
return \trim($message);
}
/**
* @param mixed $message
*/
public static function formatLogLine($message, ?string $exceptionFile = null) : string
{
return \implode(' ', [\date('[Y-m-d H-i-s]'), \preg_replace('#\\s*\\r?\\n\\s*#', ' ', static::formatMessage($message)), ' @ ' . \RectorPrefix20220530\Tracy\Helpers::getSource(), $exceptionFile ? ' @@ ' . \basename($exceptionFile) : null]);
}
public function getExceptionFile(\Throwable $exception, string $level = self::EXCEPTION) : string
{
foreach (\RectorPrefix20220530\Tracy\Helpers::getExceptionChain($exception) as $exception) {
$data[] = [\get_class($exception), $exception->getMessage(), $exception->getCode(), $exception->getFile(), $exception->getLine(), \array_map(function (array $item) : array {
unset($item['args']);
return $item;
}, $exception->getTrace())];
}
$hash = \substr(\md5(\serialize($data)), 0, 10);
$dir = \strtr($this->directory . '/', '\\/', \DIRECTORY_SEPARATOR . \DIRECTORY_SEPARATOR);
foreach (new \DirectoryIterator($this->directory) as $file) {
if (\strpos($file->getBasename(), $hash)) {
return $dir . $file;
}
}
return $dir . $level . '--' . \date('Y-m-d--H-i') . "--{$hash}.html";
}
/**
* Logs exception to the file if file doesn't exist.
* @return string logged error filename
*/
protected function logException(\Throwable $exception, ?string $file = null) : string
{
$file = $file ?: $this->getExceptionFile($exception);
$bs = $this->blueScreen ?: new \RectorPrefix20220530\Tracy\BlueScreen();
$bs->renderToFile($exception, $file);
return $file;
}
/**
* @param mixed $message
*/
protected function sendEmail($message) : void
{
$snooze = \is_numeric($this->emailSnooze) ? $this->emailSnooze : \strtotime($this->emailSnooze) - \time();
if ($this->email && $this->mailer && @\filemtime($this->directory . '/email-sent') + $snooze < \time() && @\file_put_contents($this->directory . '/email-sent', 'sent')) {
($this->mailer)($message, \implode(', ', (array) $this->email));
}
}
/**
* Default mailer.
* @param mixed $message
* @internal
*/
public function defaultMailer($message, string $email) : void
{
$host = \preg_replace('#[^\\w.-]+#', '', $_SERVER['SERVER_NAME'] ?? \php_uname('n'));
$parts = \str_replace(["\r\n", "\n"], ["\n", \PHP_EOL], ['headers' => \implode("\n", ['From: ' . ($this->fromEmail ?: "noreply@{$host}"), 'X-Mailer: Tracy', 'Content-Type: text/plain; charset=UTF-8', 'Content-Transfer-Encoding: 8bit']) . "\n", 'subject' => "PHP: An error occurred on the server {$host}", 'body' => static::formatMessage($message) . "\n\nsource: " . \RectorPrefix20220530\Tracy\Helpers::getSource()]);
\mail($email, $parts['subject'], $parts['body'], $parts['headers']);
}
}

View File

@ -1,83 +0,0 @@
<?php
/**
* This file is part of the Tracy (https://tracy.nette.org)
* Copyright (c) 2004 David Grudl (https://davidgrudl.com)
*/
declare (strict_types=1);
namespace RectorPrefix20220530\Tracy;
class FileSession implements \RectorPrefix20220530\Tracy\SessionStorage
{
private const FilePrefix = 'tracy-';
private const CookieLifetime = 31557600;
/** @var string */
public $cookieName = 'tracy-session';
/** @var float probability that the clean() routine is started */
public $gcProbability = 0.001;
/** @var string */
private $dir;
/** @var resource */
private $file;
/** @var array */
private $data = [];
public function __construct(string $dir)
{
$this->dir = $dir;
}
public function isAvailable() : bool
{
if (!$this->file) {
$this->open();
}
return \true;
}
private function open() : void
{
$id = $_COOKIE[$this->cookieName] ?? null;
if (!\is_string($id) || !\preg_match('#^\\w{10}\\z#i', $id) || !($file = @\fopen($path = $this->dir . '/' . self::FilePrefix . $id, 'r+'))) {
$id = \RectorPrefix20220530\Tracy\Helpers::createId();
\setcookie($this->cookieName, $id, \time() + self::CookieLifetime, '/', '', \false, \true);
$file = @\fopen($path = $this->dir . '/' . self::FilePrefix . $id, 'c+');
// intentionally @
if ($file === \false) {
throw new \RuntimeException("Unable to create file '{$path}'. " . \error_get_last()['message']);
}
}
if (!@\flock($file, \LOCK_EX)) {
// intentionally @
throw new \RuntimeException("Unable to acquire exclusive lock on '{$path}'. ", \error_get_last()['message']);
}
$this->file = $file;
$this->data = @\unserialize(\stream_get_contents($this->file)) ?: [];
// @ - file may be empty
if (\mt_rand() / \mt_getrandmax() < $this->gcProbability) {
$this->clean();
}
}
public function &getData() : array
{
return $this->data;
}
public function clean() : void
{
$old = \strtotime('-1 week');
foreach (\glob($this->dir . '/' . self::FilePrefix . '*') as $file) {
if (\filemtime($file) < $old) {
\unlink($file);
}
}
}
public function __destruct()
{
if (!$this->file) {
return;
}
\ftruncate($this->file, 0);
\fseek($this->file, 0);
\fwrite($this->file, \serialize($this->data));
\flock($this->file, \LOCK_UN);
\fclose($this->file);
$this->file = null;
}
}

View File

@ -1,21 +0,0 @@
<?php
/**
* This file is part of the Tracy (https://tracy.nette.org)
* Copyright (c) 2004 David Grudl (https://davidgrudl.com)
*/
declare (strict_types=1);
namespace RectorPrefix20220530\Tracy;
class NativeSession implements \RectorPrefix20220530\Tracy\SessionStorage
{
public function isAvailable() : bool
{
return \session_status() === \PHP_SESSION_ACTIVE;
}
public function &getData() : array
{
\settype($_SESSION['_tracy'], 'array');
return $_SESSION['_tracy'];
}
}

View File

@ -1,14 +0,0 @@
<?php
/**
* This file is part of the Tracy (https://tracy.nette.org)
* Copyright (c) 2004 David Grudl (https://davidgrudl.com)
*/
declare (strict_types=1);
namespace RectorPrefix20220530\Tracy;
interface SessionStorage
{
function isAvailable() : bool;
function &getData() : array;
}