mirror of
https://github.com/rectorphp/rector.git
synced 2024-06-28 13:43:31 +00:00
parent
56d91201bf
commit
6612bb0c65
|
@ -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
2
vendor/autoload.php
vendored
|
@ -9,4 +9,4 @@ if (PHP_VERSION_ID < 50600) {
|
|||
|
||||
require_once __DIR__ . '/composer/autoload_real.php';
|
||||
|
||||
return ComposerAutoloaderInitd21789c959428fbdf3870642f2f52eee::getLoader();
|
||||
return ComposerAutoloaderInitf9010bf4c9e2ca7c0ae4e9277fc03d8d::getLoader();
|
||||
|
|
14
vendor/composer/autoload_classmap.php
vendored
14
vendor/composer/autoload_classmap.php
vendored
|
@ -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',
|
||||
|
|
14
vendor/composer/autoload_real.php
vendored
14
vendor/composer/autoload_real.php
vendored
|
@ -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;
|
||||
|
|
22
vendor/composer/autoload_static.php
vendored
22
vendor/composer/autoload_static.php
vendored
|
@ -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);
|
||||
}
|
||||
|
|
10
vendor/scoper-autoload.php
vendored
10
vendor/scoper-autoload.php
vendored
|
@ -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')) {
|
||||
|
|
98
vendor/tracy/tracy/src/Bridges/Nette/Bridge.php
vendored
98
vendor/tracy/tracy/src/Bridges/Nette/Bridge.php
vendored
|
@ -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>';
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
127
vendor/tracy/tracy/src/Tracy/Bar/Bar.php
vendored
127
vendor/tracy/tracy/src/Tracy/Bar/Bar.php
vendored
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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";
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
25
vendor/tracy/tracy/src/Tracy/Bar/IBarPanel.php
vendored
25
vendor/tracy/tracy/src/Tracy/Bar/IBarPanel.php
vendored
|
@ -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();
|
||||
}
|
286
vendor/tracy/tracy/src/Tracy/Bar/assets/bar.css
vendored
286
vendor/tracy/tracy/src/Tracy/Bar/assets/bar.css
vendored
|
@ -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;
|
||||
}
|
||||
}
|
695
vendor/tracy/tracy/src/Tracy/Bar/assets/bar.js
vendored
695
vendor/tracy/tracy/src/Tracy/Bar/assets/bar.js
vendored
|
@ -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, '&').replace(/"/g, '"')) + '_tracy_bar=js&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,
|
||||
});
|
|
@ -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">×</a></li>
|
||||
<?php endif ?>
|
||||
</ul>
|
|
@ -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") ?>&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&v=<?= urlencode(Debugger::VERSION) ?>&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 ?>
|
|
@ -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">¤</a>
|
||||
<a href="#" data-tracy-action="close" title="close window">×</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(['&', "'"], ['&', '''], $content) ?>'></div><?php
|
||||
}
|
||||
|
||||
echo '<meta itemprop=tracy-snapshot content=', Dumper::formatSnapshotAttribute(Dumper::$liveSnapshot), '>';
|
||||
echo '</div>';
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
135
vendor/tracy/tracy/src/Tracy/Logger/FireLogger.php
vendored
135
vendor/tracy/tracy/src/Tracy/Logger/FireLogger.php
vendored
|
@ -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';
|
||||
}
|
||||
}
|
||||
}
|
17
vendor/tracy/tracy/src/Tracy/Logger/ILogger.php
vendored
17
vendor/tracy/tracy/src/Tracy/Logger/ILogger.php
vendored
|
@ -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);
|
||||
}
|
136
vendor/tracy/tracy/src/Tracy/Logger/Logger.php
vendored
136
vendor/tracy/tracy/src/Tracy/Logger/Logger.php
vendored
|
@ -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']);
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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'];
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user