diff --git a/composer.json b/composer.json index be67aa494507e..c19b8d17de4d1 100644 --- a/composer.json +++ b/composer.json @@ -107,7 +107,7 @@ "phpseclib/bcmath_compat": "^2.0.3", "jfcherng/php-diff": "^6.16.2", "php-tuf/php-tuf": "^1.0.3", - "php-debugbar/php-debugbar": "^2.2.6", + "php-debugbar/php-debugbar": "^3.8.1", "altcha-org/altcha": "^1.3.2" }, "require-dev": { diff --git a/composer.lock b/composer.lock index dd84fe97fc990..0d24b937615bc 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "e31b602fc66bf014073619c06d6a22d2", + "content-hash": "356ad6ce646492dcb911c62f85bdedaf", "packages": [ { "name": "algo26-matthias/idna-convert", @@ -2690,47 +2690,63 @@ }, { "name": "php-debugbar/php-debugbar", - "version": "v2.2.6", + "version": "v3.8.1", "source": { "type": "git", "url": "https://github.com/php-debugbar/php-debugbar.git", - "reference": "abb9fa3c5c8dbe7efe03ddba56782917481de3e8" + "reference": "d04a382b80e320c7abdbe9fc66e83b34e80edef4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-debugbar/php-debugbar/zipball/abb9fa3c5c8dbe7efe03ddba56782917481de3e8", - "reference": "abb9fa3c5c8dbe7efe03ddba56782917481de3e8", + "url": "https://api.github.com/repos/php-debugbar/php-debugbar/zipball/d04a382b80e320c7abdbe9fc66e83b34e80edef4", + "reference": "d04a382b80e320c7abdbe9fc66e83b34e80edef4", "shasum": "" }, "require": { - "php": "^8.1", + "php": "^8.2", "psr/log": "^1|^2|^3", - "symfony/var-dumper": "^5.4|^6.4|^7.3|^8.0" + "symfony/var-dumper": "^5.4|^6|^7|^8" }, "replace": { "maximebf/debugbar": "self.version" }, "require-dev": { - "dbrekelmans/bdi": "^1", + "dbrekelmans/bdi": "^1.4", + "friendsofphp/php-cs-fixer": "^3.92", + "monolog/monolog": "^3.9", + "php-debugbar/doctrine-bridge": "^3@dev", + "php-debugbar/monolog-bridge": "^1@dev", + "php-debugbar/symfony-bridge": "^1@dev", + "php-debugbar/twig-bridge": "^2@dev", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", "phpunit/phpunit": "^10", - "symfony/browser-kit": "^6.0|7.0", + "predis/predis": "^3.3", + "shipmonk/phpstan-rules": "^4.3", + "symfony/browser-kit": "^6.4|7.0", + "symfony/dom-crawler": "^6.4|^7", + "symfony/event-dispatcher": "^5.4|^6.4|^7.3|^8.0", + "symfony/http-foundation": "^5.4|^6.4|^7.3|^8.0", + "symfony/mailer": "^5.4|^6.4|^7.3|^8.0", "symfony/panther": "^1|^2.1", "twig/twig": "^3.11.2" }, "suggest": { - "kriswallsmith/assetic": "The best way to manage assets", - "monolog/monolog": "Log using Monolog", - "predis/predis": "Redis storage" + "php-debugbar/doctrine-bridge": "To integrate Doctrine with php-debugbar.", + "php-debugbar/monolog-bridge": "To integrate Monolog with php-debugbar.", + "php-debugbar/symfony-bridge": "To integrate Symfony with php-debugbar.", + "php-debugbar/twig-bridge": "To integrate Twig with php-debugbar." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.2-dev" + "dev-master": "3.8-dev" } }, "autoload": { "psr-4": { - "DebugBar\\": "src/DebugBar/" + "DebugBar\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2754,13 +2770,25 @@ "debug", "debug bar", "debugbar", - "dev" + "dev", + "profiler", + "toolbar" ], "support": { "issues": "https://github.com/php-debugbar/php-debugbar/issues", - "source": "https://github.com/php-debugbar/php-debugbar/tree/v2.2.6" + "source": "https://github.com/php-debugbar/php-debugbar/tree/v3.8.1" }, - "time": "2025-12-22T13:21:32+00:00" + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2026-10-25T20:20:41+00:00" }, { "name": "php-tuf/php-tuf", @@ -3877,16 +3905,16 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v3.7.0", + "version": "v3.7.1", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "50f59d1f3ca46d41ac911f97a78626b6756af35b" + "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/50f59d1f3ca46d41ac911f97a78626b6756af35b", - "reference": "50f59d1f3ca46d41ac911f97a78626b6756af35b", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/f3202fa1b5097b0af062dc978b32ecf63404e31d", + "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d", "shasum": "" }, "require": { @@ -3924,7 +3952,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.7.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.7.1" }, "funding": [ { @@ -3944,7 +3972,7 @@ "type": "tidelift" } ], - "time": "2026-04-13T15:52:40+00:00" + "time": "2026-06-05T06:23:12+00:00" }, { "name": "symfony/error-handler", @@ -5299,16 +5327,16 @@ }, { "name": "symfony/var-dumper", - "version": "v7.4.8", + "version": "v7.4.22", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "9510c3966f749a1d1ff0059e1eabef6cc621e7fd" + "reference": "6e6ff33ea8cf5df27f00a5561ebd5ee9bd7f1618" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/9510c3966f749a1d1ff0059e1eabef6cc621e7fd", - "reference": "9510c3966f749a1d1ff0059e1eabef6cc621e7fd", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/6e6ff33ea8cf5df27f00a5561ebd5ee9bd7f1618", + "reference": "6e6ff33ea8cf5df27f00a5561ebd5ee9bd7f1618", "shasum": "" }, "require": { @@ -5324,7 +5352,7 @@ "symfony/http-kernel": "^6.4|^7.0|^8.0", "symfony/process": "^6.4|^7.0|^8.0", "symfony/uid": "^6.4|^7.0|^8.0", - "twig/twig": "^3.12" + "twig/twig": "^3.12|^4.0" }, "bin": [ "Resources/bin/var-dump-server" @@ -5362,7 +5390,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.4.8" + "source": "https://github.com/symfony/var-dumper/tree/v7.4.22" }, "funding": [ { @@ -5382,7 +5410,7 @@ "type": "tidelift" } ], - "time": "2026-03-30T13:44:50+00:00" + "time": "2026-10-25T21:04:04+00:00" }, { "name": "symfony/web-link", @@ -9647,9 +9675,9 @@ "ext-gd": "*", "ext-dom": "*" }, - "platform-dev": [], + "platform-dev": {}, "platform-overrides": { "php": "8.3.0" }, - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.9.0" } diff --git a/media_source/plg_system_debug/builder.mjs b/media_source/plg_system_debug/builder.mjs index 3019e8448a0be..892332feb0f13 100644 --- a/media_source/plg_system_debug/builder.mjs +++ b/media_source/plg_system_debug/builder.mjs @@ -39,7 +39,7 @@ export default class PlgDebugModuleBuilder extends DefaultModuleBuilder { await super.copy(); // Copy DebugBar assets to vendor folder - const pathSrc = 'libraries/vendor/php-debugbar/php-debugbar/src/DebugBar/Resources'; + const pathSrc = 'libraries/vendor/php-debugbar/php-debugbar/resources'; const pathMedia = path.dirname(this.targetPath); const pathVendor = path.join(pathMedia, this.vendorLocation); @@ -47,13 +47,7 @@ export default class PlgDebugModuleBuilder extends DefaultModuleBuilder { throw new Error('DebugBar/Resources not found. Make sure you have run "composer install" first.'); } - return fsp.cp(pathSrc, pathVendor, { recursive: true, preserveTimestamps: true }).then(() => { - // Remove unused - return Promise.all([ - fsp.rm(path.join(pathVendor, 'vendor/font-awesome'), { recursive: true }), - fsp.rm(path.join(pathVendor, 'vendor/jquery'), { recursive: true }), - ]); - }); + return fsp.cp(pathSrc, pathVendor, { recursive: true, preserveTimestamps: true }); } /** diff --git a/media_source/plg_system_debug/css/debug.css b/media_source/plg_system_debug/css/debug.css index 64143764401a9..758cd7ef1e19e 100644 --- a/media_source/plg_system_debug/css/debug.css +++ b/media_source/plg_system_debug/css/debug.css @@ -3,15 +3,22 @@ * @license GNU General Public License version 2 or later; see LICENSE.txt */ -/* Debug Bar Joomla Logo */ a.phpdebugbar-restore-btn:after { - background: #efefef url("data:image/svg+xml;utf8,") no-repeat 5px 4px / 20px 20px !important; + mask: url("../../system/images/joomla-favicon.svg") center / 20px 20px no-repeat !important; + background: var(--debugbar-icons) !important; } + a.phpdebugbar-tab.phpdebugbar-tab-settings i:before { - font-family: "Font Awesome 6 Free"; - font-size: 12px; - font-weight: 900; - content: "\f1de"; + display: inline-block; + width: 1em; + height: 1em; + content: ""; + background-color: currentColor; + mask: var(--debugbar-icon-adjustments-horizontal) center / contain no-repeat; +} + +div.phpdebugbar[data-theme="dark"] .phpdebugbar-settings label { + color: var(--debugbar-text); } .phpdebugbar-widgets-timeline .phpdebugbar-widgets-measure:hover { diff --git a/media_source/plg_system_debug/widgets/info/widget.es5.js b/media_source/plg_system_debug/widgets/info/widget.es5.js index a242fb63225ba..4d5628db9ee17 100644 --- a/media_source/plg_system_debug/widgets/info/widget.es5.js +++ b/media_source/plg_system_debug/widgets/info/widget.es5.js @@ -1,7 +1,6 @@ -(function ($) { - +(function () { var csscls = PhpDebugBar.utils.makecsscls('phpdebugbar-widgets-') - var InfoWidget = PhpDebugBar.Widgets.InfoWidget = PhpDebugBar.Widget.extend({ + PhpDebugBar.Widgets.InfoWidget = PhpDebugBar.Widget.extend({ tagName: 'table', @@ -9,46 +8,49 @@ render: function () { this.bindAttr('data', function (data) { - this.$el.empty() - var tr - - tr = $('') - .append($('').text('Joomla! Version')) - .append($('').text(data.joomlaVersion)) - this.$el.append(tr) - - tr = $('') - .append($('').text('PHP Version')) - .append($('').text(data.phpVersion)) - this.$el.append(tr) - - tr = $('') - .append($('').text('Identity')) - .append($('').text(data.identity.type)) - this.$el.append(tr) - - tr = $('') - .append($('').text('Response')) - .append($('').text(data.response.status_code)) - this.$el.append(tr) - - tr = $('') - .append($('').text('Template')) - .append($('').text(data.template.template)) - this.$el.append(tr) - - tr = $('') - .append($('').text('Database')) - .append($('').html( - '
' - + '
Server
' + data.database.dbserver + '
' - + '
Version
' + data.database.dbversion + '
' - + '
Collation
' + data.database.dbcollation + '
' - + '
Conn Collation
' + data.database.dbconnectioncollation + '
' - + '
' - )) - this.$el.append(tr) + this.el.replaceChildren() + + var addRow = function (label, value) { + var row = document.createElement('tr') + var heading = document.createElement('td') + var content = document.createElement('td') + + heading.textContent = label + content.textContent = value == null ? '' : value + row.append(heading, content) + this.el.append(row) + }.bind(this) + + addRow('Joomla! Version', data.joomlaVersion) + addRow('PHP Version', data.phpVersion) + addRow('Identity', data.identity.type) + addRow('Response', data.response.status_code) + addRow('Template', data.template.template) + + var row = document.createElement('tr') + var label = document.createElement('td') + var details = document.createElement('td') + var list = document.createElement('dl') + + label.textContent = 'Database' + ;[ + ['Server', data.database.dbserver], + ['Version', data.database.dbversion], + ['Collation', data.database.dbcollation], + ['Conn Collation', data.database.dbconnectioncollation] + ].forEach(function (item) { + var term = document.createElement('dt') + var description = document.createElement('dd') + + term.textContent = item[0] + description.textContent = item[1] == null ? '' : item[1] + list.append(term, description) + }) + + details.append(list) + row.append(label, details) + this.el.append(row) }) } }) -})(PhpDebugBar.$) +})() diff --git a/media_source/plg_system_debug/widgets/languageErrors/widget.es5.js b/media_source/plg_system_debug/widgets/languageErrors/widget.es5.js index 1082241f68045..4f1c02c55432c 100644 --- a/media_source/plg_system_debug/widgets/languageErrors/widget.es5.js +++ b/media_source/plg_system_debug/widgets/languageErrors/widget.es5.js @@ -1,7 +1,6 @@ -(function ($) { - +(function () { var csscls = PhpDebugBar.utils.makecsscls('phpdebugbar-widgets-') - var languageErrorsWidget = PhpDebugBar.Widgets.languageErrorsWidget = PhpDebugBar.Widget.extend({ + PhpDebugBar.Widgets.languageErrorsWidget = PhpDebugBar.Widget.extend({ tagName: 'ul', @@ -9,27 +8,27 @@ render: function () { this.bindAttr('data', function (data) { - this.$el.empty() + this.el.replaceChildren() + + ;(data.files || []).forEach(function (file) { + var relativePath = file[0].replace(data.jroot, '') + var item = document.createElement('li') + var text = relativePath + ':' + file[1] - for (var file of data.files) { - var relPath = file[0].replace(data.jroot, '') - var li = $('
  • ') if (data.xdebugLink) { - var link = $('') - .text(relPath + ':' + file[1]) - .attr( - 'href', - data.xdebugLink - .replace('%f', file[0]) - .replace('%l', file[1]) - ) - li.append(link) + var link = document.createElement('a') + link.textContent = text + link.href = data.xdebugLink + .replace('%f', file[0]) + .replace('%l', file[1]) + item.append(link) } else { - li.text(relPath + ':' + file[1]) + item.textContent = text } - this.$el.append(li) - } + + this.el.append(item) + }, this) }) } }) -})(PhpDebugBar.$) +})() diff --git a/media_source/plg_system_debug/widgets/languageFiles/widget.es5.js b/media_source/plg_system_debug/widgets/languageFiles/widget.es5.js index 43496f58f90e4..c9518e10493b7 100644 --- a/media_source/plg_system_debug/widgets/languageFiles/widget.es5.js +++ b/media_source/plg_system_debug/widgets/languageFiles/widget.es5.js @@ -1,49 +1,56 @@ -(function ($) { - +(function () { var csscls = PhpDebugBar.utils.makecsscls('phpdebugbar-widgets-') - var languageFilesWidget = PhpDebugBar.Widgets.languageFilesWidget = PhpDebugBar.Widget.extend({ + PhpDebugBar.Widgets.languageFilesWidget = PhpDebugBar.Widget.extend({ tagName: 'table', className: csscls('languageFiles'), render: function () { this.bindAttr('data', function (data) { - this.$el.empty() - var head = $('') - .append($('').text('Extension')) - .append($('').text('File')) - this.$el.append(head) - for (var extension in data.loaded) { - var ul = $('