├── LICENSE ├── composer.json ├── composer.lock ├── index.css ├── index.js ├── index.php └── lib ├── Git.php ├── hooks.php ├── routes.php ├── section.php └── util.php /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Oblik Studio 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "oblik/kirby-git", 3 | "description": "Shows you Git changes in the Kirby panel and allows you to add/commit/push them, manually or automatically.", 4 | "license": "MIT", 5 | "version": "2.0.0", 6 | "type": "kirby-plugin", 7 | "keywords": [ 8 | "kirby", 9 | "kirby-plugin" 10 | ], 11 | "authors": [ 12 | { 13 | "name": "Oblik Studio", 14 | "email": "hello@oblik.studio", 15 | "homepage": "https://oblik.studio/" 16 | }, 17 | { 18 | "name": "Hristiyan Dodov", 19 | "email": "h.dodov@gmail.com", 20 | "homepage": "https://dodov.dev/" 21 | } 22 | ], 23 | "funding": [ 24 | { 25 | "type": "github", 26 | "url": "https://github.com/sponsors/OblikStudio" 27 | } 28 | ], 29 | "support": { 30 | "issues": "https://github.com/OblikStudio/kirby-git/issues", 31 | "source": "https://github.com/OblikStudio/kirby-git" 32 | }, 33 | "scripts": { 34 | "fix": "php-cs-fixer fix" 35 | }, 36 | "require": { 37 | "getkirby/cms": "^4", 38 | "getkirby/composer-installer": "^1.2" 39 | }, 40 | "require-dev": { 41 | "friendsofphp/php-cs-fixer": "^3.2" 42 | }, 43 | "extra": { 44 | "installer-name": "git" 45 | }, 46 | "config": { 47 | "allow-plugins": { 48 | "getkirby/composer-installer": true 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "14ecb9c4089706b59ed3e7e433548a26", 8 | "packages": [ 9 | { 10 | "name": "christian-riesen/base32", 11 | "version": "1.6.0", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/ChristianRiesen/base32.git", 15 | "reference": "2e82dab3baa008e24a505649b0d583c31d31e894" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/ChristianRiesen/base32/zipball/2e82dab3baa008e24a505649b0d583c31d31e894", 20 | "reference": "2e82dab3baa008e24a505649b0d583c31d31e894", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "php": "^7.2 || ^8.0" 25 | }, 26 | "require-dev": { 27 | "friendsofphp/php-cs-fixer": "^2.17", 28 | "phpstan/phpstan": "^0.12", 29 | "phpunit/phpunit": "^8.5.13 || ^9.5" 30 | }, 31 | "type": "library", 32 | "extra": { 33 | "branch-alias": { 34 | "dev-master": "1.x-dev" 35 | } 36 | }, 37 | "autoload": { 38 | "psr-4": { 39 | "Base32\\": "src/" 40 | } 41 | }, 42 | "notification-url": "https://packagist.org/downloads/", 43 | "license": [ 44 | "MIT" 45 | ], 46 | "authors": [ 47 | { 48 | "name": "Christian Riesen", 49 | "email": "chris.riesen@gmail.com", 50 | "homepage": "http://christianriesen.com", 51 | "role": "Developer" 52 | } 53 | ], 54 | "description": "Base32 encoder/decoder according to RFC 4648", 55 | "homepage": "https://github.com/ChristianRiesen/base32", 56 | "keywords": [ 57 | "base32", 58 | "decode", 59 | "encode", 60 | "rfc4648" 61 | ], 62 | "support": { 63 | "issues": "https://github.com/ChristianRiesen/base32/issues", 64 | "source": "https://github.com/ChristianRiesen/base32/tree/1.6.0" 65 | }, 66 | "time": "2021-02-26T10:19:33+00:00" 67 | }, 68 | { 69 | "name": "claviska/simpleimage", 70 | "version": "4.0.6", 71 | "source": { 72 | "type": "git", 73 | "url": "https://github.com/claviska/SimpleImage.git", 74 | "reference": "969de5e61810ef91f6f83c475b192c4841367dfa" 75 | }, 76 | "dist": { 77 | "type": "zip", 78 | "url": "https://api.github.com/repos/claviska/SimpleImage/zipball/969de5e61810ef91f6f83c475b192c4841367dfa", 79 | "reference": "969de5e61810ef91f6f83c475b192c4841367dfa", 80 | "shasum": "" 81 | }, 82 | "require": { 83 | "ext-gd": "*", 84 | "league/color-extractor": "0.4.*", 85 | "php": ">=8.0" 86 | }, 87 | "require-dev": { 88 | "laravel/pint": "^1.5", 89 | "phpstan/phpstan": "^1.10" 90 | }, 91 | "type": "library", 92 | "autoload": { 93 | "psr-0": { 94 | "claviska": "src/" 95 | } 96 | }, 97 | "notification-url": "https://packagist.org/downloads/", 98 | "license": [ 99 | "MIT" 100 | ], 101 | "authors": [ 102 | { 103 | "name": "Cory LaViska", 104 | "homepage": "http://www.abeautifulsite.net/", 105 | "role": "Developer" 106 | } 107 | ], 108 | "description": "A PHP class that makes working with images as simple as possible.", 109 | "support": { 110 | "issues": "https://github.com/claviska/SimpleImage/issues", 111 | "source": "https://github.com/claviska/SimpleImage/tree/4.0.6" 112 | }, 113 | "funding": [ 114 | { 115 | "url": "https://github.com/claviska", 116 | "type": "github" 117 | } 118 | ], 119 | "time": "2023-07-27T16:48:12+00:00" 120 | }, 121 | { 122 | "name": "composer/semver", 123 | "version": "3.4.0", 124 | "source": { 125 | "type": "git", 126 | "url": "https://github.com/composer/semver.git", 127 | "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32" 128 | }, 129 | "dist": { 130 | "type": "zip", 131 | "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32", 132 | "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32", 133 | "shasum": "" 134 | }, 135 | "require": { 136 | "php": "^5.3.2 || ^7.0 || ^8.0" 137 | }, 138 | "require-dev": { 139 | "phpstan/phpstan": "^1.4", 140 | "symfony/phpunit-bridge": "^4.2 || ^5" 141 | }, 142 | "type": "library", 143 | "extra": { 144 | "branch-alias": { 145 | "dev-main": "3.x-dev" 146 | } 147 | }, 148 | "autoload": { 149 | "psr-4": { 150 | "Composer\\Semver\\": "src" 151 | } 152 | }, 153 | "notification-url": "https://packagist.org/downloads/", 154 | "license": [ 155 | "MIT" 156 | ], 157 | "authors": [ 158 | { 159 | "name": "Nils Adermann", 160 | "email": "naderman@naderman.de", 161 | "homepage": "http://www.naderman.de" 162 | }, 163 | { 164 | "name": "Jordi Boggiano", 165 | "email": "j.boggiano@seld.be", 166 | "homepage": "http://seld.be" 167 | }, 168 | { 169 | "name": "Rob Bast", 170 | "email": "rob.bast@gmail.com", 171 | "homepage": "http://robbast.nl" 172 | } 173 | ], 174 | "description": "Semver library that offers utilities, version constraint parsing and validation.", 175 | "keywords": [ 176 | "semantic", 177 | "semver", 178 | "validation", 179 | "versioning" 180 | ], 181 | "support": { 182 | "irc": "ircs://irc.libera.chat:6697/composer", 183 | "issues": "https://github.com/composer/semver/issues", 184 | "source": "https://github.com/composer/semver/tree/3.4.0" 185 | }, 186 | "funding": [ 187 | { 188 | "url": "https://packagist.com", 189 | "type": "custom" 190 | }, 191 | { 192 | "url": "https://github.com/composer", 193 | "type": "github" 194 | }, 195 | { 196 | "url": "https://tidelift.com/funding/github/packagist/composer/composer", 197 | "type": "tidelift" 198 | } 199 | ], 200 | "time": "2023-08-31T09:50:34+00:00" 201 | }, 202 | { 203 | "name": "filp/whoops", 204 | "version": "2.15.4", 205 | "source": { 206 | "type": "git", 207 | "url": "https://github.com/filp/whoops.git", 208 | "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546" 209 | }, 210 | "dist": { 211 | "type": "zip", 212 | "url": "https://api.github.com/repos/filp/whoops/zipball/a139776fa3f5985a50b509f2a02ff0f709d2a546", 213 | "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546", 214 | "shasum": "" 215 | }, 216 | "require": { 217 | "php": "^5.5.9 || ^7.0 || ^8.0", 218 | "psr/log": "^1.0.1 || ^2.0 || ^3.0" 219 | }, 220 | "require-dev": { 221 | "mockery/mockery": "^0.9 || ^1.0", 222 | "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3", 223 | "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0" 224 | }, 225 | "suggest": { 226 | "symfony/var-dumper": "Pretty print complex values better with var-dumper available", 227 | "whoops/soap": "Formats errors as SOAP responses" 228 | }, 229 | "type": "library", 230 | "extra": { 231 | "branch-alias": { 232 | "dev-master": "2.7-dev" 233 | } 234 | }, 235 | "autoload": { 236 | "psr-4": { 237 | "Whoops\\": "src/Whoops/" 238 | } 239 | }, 240 | "notification-url": "https://packagist.org/downloads/", 241 | "license": [ 242 | "MIT" 243 | ], 244 | "authors": [ 245 | { 246 | "name": "Filipe Dobreira", 247 | "homepage": "https://github.com/filp", 248 | "role": "Developer" 249 | } 250 | ], 251 | "description": "php error handling for cool kids", 252 | "homepage": "https://filp.github.io/whoops/", 253 | "keywords": [ 254 | "error", 255 | "exception", 256 | "handling", 257 | "library", 258 | "throwable", 259 | "whoops" 260 | ], 261 | "support": { 262 | "issues": "https://github.com/filp/whoops/issues", 263 | "source": "https://github.com/filp/whoops/tree/2.15.4" 264 | }, 265 | "funding": [ 266 | { 267 | "url": "https://github.com/denis-sokolov", 268 | "type": "github" 269 | } 270 | ], 271 | "time": "2023-11-03T12:00:00+00:00" 272 | }, 273 | { 274 | "name": "getkirby/cms", 275 | "version": "4.1.0", 276 | "source": { 277 | "type": "git", 278 | "url": "https://github.com/getkirby/kirby.git", 279 | "reference": "2965c3124e3b141072a2d46c798a327dda710060" 280 | }, 281 | "dist": { 282 | "type": "zip", 283 | "url": "https://api.github.com/repos/getkirby/kirby/zipball/2965c3124e3b141072a2d46c798a327dda710060", 284 | "reference": "2965c3124e3b141072a2d46c798a327dda710060", 285 | "shasum": "" 286 | }, 287 | "require": { 288 | "christian-riesen/base32": "1.6.0", 289 | "claviska/simpleimage": "4.0.6", 290 | "composer/semver": "3.4.0", 291 | "ext-ctype": "*", 292 | "ext-curl": "*", 293 | "ext-dom": "*", 294 | "ext-filter": "*", 295 | "ext-hash": "*", 296 | "ext-iconv": "*", 297 | "ext-json": "*", 298 | "ext-libxml": "*", 299 | "ext-mbstring": "*", 300 | "ext-openssl": "*", 301 | "ext-simplexml": "*", 302 | "filp/whoops": "2.15.4", 303 | "getkirby/composer-installer": "^1.2.1", 304 | "laminas/laminas-escaper": "2.13.0", 305 | "michelf/php-smartypants": "1.8.1", 306 | "php": "~8.1.0 || ~8.2.0 || ~8.3.0", 307 | "phpmailer/phpmailer": "6.9.1", 308 | "symfony/polyfill-intl-idn": "1.28.0", 309 | "symfony/polyfill-mbstring": "1.28.0", 310 | "symfony/yaml": "6.4.0" 311 | }, 312 | "replace": { 313 | "symfony/polyfill-php72": "*" 314 | }, 315 | "suggest": { 316 | "ext-PDO": "Support for using databases", 317 | "ext-apcu": "Support for the Apcu cache driver", 318 | "ext-exif": "Support for exif information from images", 319 | "ext-fileinfo": "Improved mime type detection for files", 320 | "ext-intl": "Improved i18n number formatting", 321 | "ext-memcached": "Support for the Memcached cache driver", 322 | "ext-sodium": "Support for the crypto class and more robust session handling", 323 | "ext-zip": "Support for ZIP archive file functions", 324 | "ext-zlib": "Sanitization and validation for svgz files" 325 | }, 326 | "type": "kirby-cms", 327 | "extra": { 328 | "unused": [ 329 | "symfony/polyfill-intl-idn" 330 | ] 331 | }, 332 | "autoload": { 333 | "files": [ 334 | "config/setup.php", 335 | "config/helpers.php" 336 | ], 337 | "psr-4": { 338 | "Kirby\\": "src/" 339 | }, 340 | "classmap": [ 341 | "dependencies/" 342 | ] 343 | }, 344 | "notification-url": "https://packagist.org/downloads/", 345 | "license": [ 346 | "proprietary" 347 | ], 348 | "authors": [ 349 | { 350 | "name": "Kirby Team", 351 | "email": "support@getkirby.com", 352 | "homepage": "https://getkirby.com" 353 | } 354 | ], 355 | "description": "The Kirby core", 356 | "homepage": "https://getkirby.com", 357 | "keywords": [ 358 | "cms", 359 | "core", 360 | "kirby" 361 | ], 362 | "support": { 363 | "email": "support@getkirby.com", 364 | "forum": "https://forum.getkirby.com", 365 | "issues": "https://github.com/getkirby/kirby/issues", 366 | "source": "https://github.com/getkirby/kirby" 367 | }, 368 | "funding": [ 369 | { 370 | "url": "https://getkirby.com/buy", 371 | "type": "custom" 372 | } 373 | ], 374 | "time": "2024-01-30T15:39:12+00:00" 375 | }, 376 | { 377 | "name": "getkirby/composer-installer", 378 | "version": "1.2.1", 379 | "source": { 380 | "type": "git", 381 | "url": "https://github.com/getkirby/composer-installer.git", 382 | "reference": "c98ece30bfba45be7ce457e1102d1b169d922f3d" 383 | }, 384 | "dist": { 385 | "type": "zip", 386 | "url": "https://api.github.com/repos/getkirby/composer-installer/zipball/c98ece30bfba45be7ce457e1102d1b169d922f3d", 387 | "reference": "c98ece30bfba45be7ce457e1102d1b169d922f3d", 388 | "shasum": "" 389 | }, 390 | "require": { 391 | "composer-plugin-api": "^1.0 || ^2.0" 392 | }, 393 | "require-dev": { 394 | "composer/composer": "^1.8 || ^2.0" 395 | }, 396 | "type": "composer-plugin", 397 | "extra": { 398 | "class": "Kirby\\ComposerInstaller\\Plugin" 399 | }, 400 | "autoload": { 401 | "psr-4": { 402 | "Kirby\\": "src/" 403 | } 404 | }, 405 | "notification-url": "https://packagist.org/downloads/", 406 | "license": [ 407 | "MIT" 408 | ], 409 | "description": "Kirby's custom Composer installer for the Kirby CMS and for Kirby plugins", 410 | "homepage": "https://getkirby.com", 411 | "support": { 412 | "issues": "https://github.com/getkirby/composer-installer/issues", 413 | "source": "https://github.com/getkirby/composer-installer/tree/1.2.1" 414 | }, 415 | "funding": [ 416 | { 417 | "url": "https://getkirby.com/buy", 418 | "type": "custom" 419 | } 420 | ], 421 | "time": "2020-12-28T12:54:39+00:00" 422 | }, 423 | { 424 | "name": "laminas/laminas-escaper", 425 | "version": "2.13.0", 426 | "source": { 427 | "type": "git", 428 | "url": "https://github.com/laminas/laminas-escaper.git", 429 | "reference": "af459883f4018d0f8a0c69c7a209daef3bf973ba" 430 | }, 431 | "dist": { 432 | "type": "zip", 433 | "url": "https://api.github.com/repos/laminas/laminas-escaper/zipball/af459883f4018d0f8a0c69c7a209daef3bf973ba", 434 | "reference": "af459883f4018d0f8a0c69c7a209daef3bf973ba", 435 | "shasum": "" 436 | }, 437 | "require": { 438 | "ext-ctype": "*", 439 | "ext-mbstring": "*", 440 | "php": "~8.1.0 || ~8.2.0 || ~8.3.0" 441 | }, 442 | "conflict": { 443 | "zendframework/zend-escaper": "*" 444 | }, 445 | "require-dev": { 446 | "infection/infection": "^0.27.0", 447 | "laminas/laminas-coding-standard": "~2.5.0", 448 | "maglnet/composer-require-checker": "^3.8.0", 449 | "phpunit/phpunit": "^9.6.7", 450 | "psalm/plugin-phpunit": "^0.18.4", 451 | "vimeo/psalm": "^5.9" 452 | }, 453 | "type": "library", 454 | "autoload": { 455 | "psr-4": { 456 | "Laminas\\Escaper\\": "src/" 457 | } 458 | }, 459 | "notification-url": "https://packagist.org/downloads/", 460 | "license": [ 461 | "BSD-3-Clause" 462 | ], 463 | "description": "Securely and safely escape HTML, HTML attributes, JavaScript, CSS, and URLs", 464 | "homepage": "https://laminas.dev", 465 | "keywords": [ 466 | "escaper", 467 | "laminas" 468 | ], 469 | "support": { 470 | "chat": "https://laminas.dev/chat", 471 | "docs": "https://docs.laminas.dev/laminas-escaper/", 472 | "forum": "https://discourse.laminas.dev", 473 | "issues": "https://github.com/laminas/laminas-escaper/issues", 474 | "rss": "https://github.com/laminas/laminas-escaper/releases.atom", 475 | "source": "https://github.com/laminas/laminas-escaper" 476 | }, 477 | "funding": [ 478 | { 479 | "url": "https://funding.communitybridge.org/projects/laminas-project", 480 | "type": "community_bridge" 481 | } 482 | ], 483 | "time": "2023-10-10T08:35:13+00:00" 484 | }, 485 | { 486 | "name": "league/color-extractor", 487 | "version": "0.4.0", 488 | "source": { 489 | "type": "git", 490 | "url": "https://github.com/thephpleague/color-extractor.git", 491 | "reference": "21fcac6249c5ef7d00eb83e128743ee6678fe505" 492 | }, 493 | "dist": { 494 | "type": "zip", 495 | "url": "https://api.github.com/repos/thephpleague/color-extractor/zipball/21fcac6249c5ef7d00eb83e128743ee6678fe505", 496 | "reference": "21fcac6249c5ef7d00eb83e128743ee6678fe505", 497 | "shasum": "" 498 | }, 499 | "require": { 500 | "ext-gd": "*", 501 | "php": "^7.3 || ^8.0" 502 | }, 503 | "replace": { 504 | "matthecat/colorextractor": "*" 505 | }, 506 | "require-dev": { 507 | "friendsofphp/php-cs-fixer": "~2", 508 | "phpunit/phpunit": "^9.5" 509 | }, 510 | "suggest": { 511 | "ext-curl": "To download images from remote URLs if allow_url_fopen is disabled for security reasons" 512 | }, 513 | "type": "library", 514 | "autoload": { 515 | "psr-4": { 516 | "League\\ColorExtractor\\": "src" 517 | } 518 | }, 519 | "notification-url": "https://packagist.org/downloads/", 520 | "license": [ 521 | "MIT" 522 | ], 523 | "authors": [ 524 | { 525 | "name": "Mathieu Lechat", 526 | "email": "math.lechat@gmail.com", 527 | "homepage": "http://matthecat.com", 528 | "role": "Developer" 529 | } 530 | ], 531 | "description": "Extract colors from an image as a human would do.", 532 | "homepage": "https://github.com/thephpleague/color-extractor", 533 | "keywords": [ 534 | "color", 535 | "extract", 536 | "human", 537 | "image", 538 | "palette" 539 | ], 540 | "support": { 541 | "issues": "https://github.com/thephpleague/color-extractor/issues", 542 | "source": "https://github.com/thephpleague/color-extractor/tree/0.4.0" 543 | }, 544 | "time": "2022-09-24T15:57:16+00:00" 545 | }, 546 | { 547 | "name": "michelf/php-smartypants", 548 | "version": "1.8.1", 549 | "source": { 550 | "type": "git", 551 | "url": "https://github.com/michelf/php-smartypants.git", 552 | "reference": "47d17c90a4dfd0ccf1f87e25c65e6c8012415aad" 553 | }, 554 | "dist": { 555 | "type": "zip", 556 | "url": "https://api.github.com/repos/michelf/php-smartypants/zipball/47d17c90a4dfd0ccf1f87e25c65e6c8012415aad", 557 | "reference": "47d17c90a4dfd0ccf1f87e25c65e6c8012415aad", 558 | "shasum": "" 559 | }, 560 | "require": { 561 | "php": ">=5.3.0" 562 | }, 563 | "type": "library", 564 | "autoload": { 565 | "psr-0": { 566 | "Michelf": "" 567 | } 568 | }, 569 | "notification-url": "https://packagist.org/downloads/", 570 | "license": [ 571 | "BSD-3-Clause" 572 | ], 573 | "authors": [ 574 | { 575 | "name": "Michel Fortin", 576 | "email": "michel.fortin@michelf.ca", 577 | "homepage": "https://michelf.ca/", 578 | "role": "Developer" 579 | }, 580 | { 581 | "name": "John Gruber", 582 | "homepage": "https://daringfireball.net/" 583 | } 584 | ], 585 | "description": "PHP SmartyPants", 586 | "homepage": "https://michelf.ca/projects/php-smartypants/", 587 | "keywords": [ 588 | "dashes", 589 | "quotes", 590 | "spaces", 591 | "typographer", 592 | "typography" 593 | ], 594 | "support": { 595 | "issues": "https://github.com/michelf/php-smartypants/issues", 596 | "source": "https://github.com/michelf/php-smartypants/tree/1.8.1" 597 | }, 598 | "time": "2016-12-13T01:01:17+00:00" 599 | }, 600 | { 601 | "name": "phpmailer/phpmailer", 602 | "version": "v6.9.1", 603 | "source": { 604 | "type": "git", 605 | "url": "https://github.com/PHPMailer/PHPMailer.git", 606 | "reference": "039de174cd9c17a8389754d3b877a2ed22743e18" 607 | }, 608 | "dist": { 609 | "type": "zip", 610 | "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/039de174cd9c17a8389754d3b877a2ed22743e18", 611 | "reference": "039de174cd9c17a8389754d3b877a2ed22743e18", 612 | "shasum": "" 613 | }, 614 | "require": { 615 | "ext-ctype": "*", 616 | "ext-filter": "*", 617 | "ext-hash": "*", 618 | "php": ">=5.5.0" 619 | }, 620 | "require-dev": { 621 | "dealerdirect/phpcodesniffer-composer-installer": "^1.0", 622 | "doctrine/annotations": "^1.2.6 || ^1.13.3", 623 | "php-parallel-lint/php-console-highlighter": "^1.0.0", 624 | "php-parallel-lint/php-parallel-lint": "^1.3.2", 625 | "phpcompatibility/php-compatibility": "^9.3.5", 626 | "roave/security-advisories": "dev-latest", 627 | "squizlabs/php_codesniffer": "^3.7.2", 628 | "yoast/phpunit-polyfills": "^1.0.4" 629 | }, 630 | "suggest": { 631 | "decomplexity/SendOauth2": "Adapter for using XOAUTH2 authentication", 632 | "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses", 633 | "ext-openssl": "Needed for secure SMTP sending and DKIM signing", 634 | "greew/oauth2-azure-provider": "Needed for Microsoft Azure XOAUTH2 authentication", 635 | "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication", 636 | "league/oauth2-google": "Needed for Google XOAUTH2 authentication", 637 | "psr/log": "For optional PSR-3 debug logging", 638 | "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)", 639 | "thenetworg/oauth2-azure": "Needed for Microsoft XOAUTH2 authentication" 640 | }, 641 | "type": "library", 642 | "autoload": { 643 | "psr-4": { 644 | "PHPMailer\\PHPMailer\\": "src/" 645 | } 646 | }, 647 | "notification-url": "https://packagist.org/downloads/", 648 | "license": [ 649 | "LGPL-2.1-only" 650 | ], 651 | "authors": [ 652 | { 653 | "name": "Marcus Bointon", 654 | "email": "phpmailer@synchromedia.co.uk" 655 | }, 656 | { 657 | "name": "Jim Jagielski", 658 | "email": "jimjag@gmail.com" 659 | }, 660 | { 661 | "name": "Andy Prevost", 662 | "email": "codeworxtech@users.sourceforge.net" 663 | }, 664 | { 665 | "name": "Brent R. Matzelle" 666 | } 667 | ], 668 | "description": "PHPMailer is a full-featured email creation and transfer class for PHP", 669 | "support": { 670 | "issues": "https://github.com/PHPMailer/PHPMailer/issues", 671 | "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.9.1" 672 | }, 673 | "funding": [ 674 | { 675 | "url": "https://github.com/Synchro", 676 | "type": "github" 677 | } 678 | ], 679 | "time": "2023-11-25T22:23:28+00:00" 680 | }, 681 | { 682 | "name": "psr/log", 683 | "version": "3.0.0", 684 | "source": { 685 | "type": "git", 686 | "url": "https://github.com/php-fig/log.git", 687 | "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" 688 | }, 689 | "dist": { 690 | "type": "zip", 691 | "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", 692 | "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", 693 | "shasum": "" 694 | }, 695 | "require": { 696 | "php": ">=8.0.0" 697 | }, 698 | "type": "library", 699 | "extra": { 700 | "branch-alias": { 701 | "dev-master": "3.x-dev" 702 | } 703 | }, 704 | "autoload": { 705 | "psr-4": { 706 | "Psr\\Log\\": "src" 707 | } 708 | }, 709 | "notification-url": "https://packagist.org/downloads/", 710 | "license": [ 711 | "MIT" 712 | ], 713 | "authors": [ 714 | { 715 | "name": "PHP-FIG", 716 | "homepage": "https://www.php-fig.org/" 717 | } 718 | ], 719 | "description": "Common interface for logging libraries", 720 | "homepage": "https://github.com/php-fig/log", 721 | "keywords": [ 722 | "log", 723 | "psr", 724 | "psr-3" 725 | ], 726 | "support": { 727 | "source": "https://github.com/php-fig/log/tree/3.0.0" 728 | }, 729 | "time": "2021-07-14T16:46:02+00:00" 730 | }, 731 | { 732 | "name": "symfony/deprecation-contracts", 733 | "version": "v3.4.0", 734 | "source": { 735 | "type": "git", 736 | "url": "https://github.com/symfony/deprecation-contracts.git", 737 | "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" 738 | }, 739 | "dist": { 740 | "type": "zip", 741 | "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", 742 | "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", 743 | "shasum": "" 744 | }, 745 | "require": { 746 | "php": ">=8.1" 747 | }, 748 | "type": "library", 749 | "extra": { 750 | "branch-alias": { 751 | "dev-main": "3.4-dev" 752 | }, 753 | "thanks": { 754 | "name": "symfony/contracts", 755 | "url": "https://github.com/symfony/contracts" 756 | } 757 | }, 758 | "autoload": { 759 | "files": [ 760 | "function.php" 761 | ] 762 | }, 763 | "notification-url": "https://packagist.org/downloads/", 764 | "license": [ 765 | "MIT" 766 | ], 767 | "authors": [ 768 | { 769 | "name": "Nicolas Grekas", 770 | "email": "p@tchwork.com" 771 | }, 772 | { 773 | "name": "Symfony Community", 774 | "homepage": "https://symfony.com/contributors" 775 | } 776 | ], 777 | "description": "A generic function and convention to trigger deprecation notices", 778 | "homepage": "https://symfony.com", 779 | "support": { 780 | "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0" 781 | }, 782 | "funding": [ 783 | { 784 | "url": "https://symfony.com/sponsor", 785 | "type": "custom" 786 | }, 787 | { 788 | "url": "https://github.com/fabpot", 789 | "type": "github" 790 | }, 791 | { 792 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 793 | "type": "tidelift" 794 | } 795 | ], 796 | "time": "2023-05-23T14:45:45+00:00" 797 | }, 798 | { 799 | "name": "symfony/polyfill-ctype", 800 | "version": "v1.28.0", 801 | "source": { 802 | "type": "git", 803 | "url": "https://github.com/symfony/polyfill-ctype.git", 804 | "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" 805 | }, 806 | "dist": { 807 | "type": "zip", 808 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", 809 | "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", 810 | "shasum": "" 811 | }, 812 | "require": { 813 | "php": ">=7.1" 814 | }, 815 | "provide": { 816 | "ext-ctype": "*" 817 | }, 818 | "suggest": { 819 | "ext-ctype": "For best performance" 820 | }, 821 | "type": "library", 822 | "extra": { 823 | "branch-alias": { 824 | "dev-main": "1.28-dev" 825 | }, 826 | "thanks": { 827 | "name": "symfony/polyfill", 828 | "url": "https://github.com/symfony/polyfill" 829 | } 830 | }, 831 | "autoload": { 832 | "files": [ 833 | "bootstrap.php" 834 | ], 835 | "psr-4": { 836 | "Symfony\\Polyfill\\Ctype\\": "" 837 | } 838 | }, 839 | "notification-url": "https://packagist.org/downloads/", 840 | "license": [ 841 | "MIT" 842 | ], 843 | "authors": [ 844 | { 845 | "name": "Gert de Pagter", 846 | "email": "BackEndTea@gmail.com" 847 | }, 848 | { 849 | "name": "Symfony Community", 850 | "homepage": "https://symfony.com/contributors" 851 | } 852 | ], 853 | "description": "Symfony polyfill for ctype functions", 854 | "homepage": "https://symfony.com", 855 | "keywords": [ 856 | "compatibility", 857 | "ctype", 858 | "polyfill", 859 | "portable" 860 | ], 861 | "support": { 862 | "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" 863 | }, 864 | "funding": [ 865 | { 866 | "url": "https://symfony.com/sponsor", 867 | "type": "custom" 868 | }, 869 | { 870 | "url": "https://github.com/fabpot", 871 | "type": "github" 872 | }, 873 | { 874 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 875 | "type": "tidelift" 876 | } 877 | ], 878 | "time": "2023-01-26T09:26:14+00:00" 879 | }, 880 | { 881 | "name": "symfony/polyfill-intl-idn", 882 | "version": "v1.28.0", 883 | "source": { 884 | "type": "git", 885 | "url": "https://github.com/symfony/polyfill-intl-idn.git", 886 | "reference": "ecaafce9f77234a6a449d29e49267ba10499116d" 887 | }, 888 | "dist": { 889 | "type": "zip", 890 | "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/ecaafce9f77234a6a449d29e49267ba10499116d", 891 | "reference": "ecaafce9f77234a6a449d29e49267ba10499116d", 892 | "shasum": "" 893 | }, 894 | "require": { 895 | "php": ">=7.1", 896 | "symfony/polyfill-intl-normalizer": "^1.10", 897 | "symfony/polyfill-php72": "^1.10" 898 | }, 899 | "suggest": { 900 | "ext-intl": "For best performance" 901 | }, 902 | "type": "library", 903 | "extra": { 904 | "branch-alias": { 905 | "dev-main": "1.28-dev" 906 | }, 907 | "thanks": { 908 | "name": "symfony/polyfill", 909 | "url": "https://github.com/symfony/polyfill" 910 | } 911 | }, 912 | "autoload": { 913 | "files": [ 914 | "bootstrap.php" 915 | ], 916 | "psr-4": { 917 | "Symfony\\Polyfill\\Intl\\Idn\\": "" 918 | } 919 | }, 920 | "notification-url": "https://packagist.org/downloads/", 921 | "license": [ 922 | "MIT" 923 | ], 924 | "authors": [ 925 | { 926 | "name": "Laurent Bassin", 927 | "email": "laurent@bassin.info" 928 | }, 929 | { 930 | "name": "Trevor Rowbotham", 931 | "email": "trevor.rowbotham@pm.me" 932 | }, 933 | { 934 | "name": "Symfony Community", 935 | "homepage": "https://symfony.com/contributors" 936 | } 937 | ], 938 | "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", 939 | "homepage": "https://symfony.com", 940 | "keywords": [ 941 | "compatibility", 942 | "idn", 943 | "intl", 944 | "polyfill", 945 | "portable", 946 | "shim" 947 | ], 948 | "support": { 949 | "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.28.0" 950 | }, 951 | "funding": [ 952 | { 953 | "url": "https://symfony.com/sponsor", 954 | "type": "custom" 955 | }, 956 | { 957 | "url": "https://github.com/fabpot", 958 | "type": "github" 959 | }, 960 | { 961 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 962 | "type": "tidelift" 963 | } 964 | ], 965 | "time": "2023-01-26T09:30:37+00:00" 966 | }, 967 | { 968 | "name": "symfony/polyfill-intl-normalizer", 969 | "version": "v1.28.0", 970 | "source": { 971 | "type": "git", 972 | "url": "https://github.com/symfony/polyfill-intl-normalizer.git", 973 | "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" 974 | }, 975 | "dist": { 976 | "type": "zip", 977 | "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", 978 | "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", 979 | "shasum": "" 980 | }, 981 | "require": { 982 | "php": ">=7.1" 983 | }, 984 | "suggest": { 985 | "ext-intl": "For best performance" 986 | }, 987 | "type": "library", 988 | "extra": { 989 | "branch-alias": { 990 | "dev-main": "1.28-dev" 991 | }, 992 | "thanks": { 993 | "name": "symfony/polyfill", 994 | "url": "https://github.com/symfony/polyfill" 995 | } 996 | }, 997 | "autoload": { 998 | "files": [ 999 | "bootstrap.php" 1000 | ], 1001 | "psr-4": { 1002 | "Symfony\\Polyfill\\Intl\\Normalizer\\": "" 1003 | }, 1004 | "classmap": [ 1005 | "Resources/stubs" 1006 | ] 1007 | }, 1008 | "notification-url": "https://packagist.org/downloads/", 1009 | "license": [ 1010 | "MIT" 1011 | ], 1012 | "authors": [ 1013 | { 1014 | "name": "Nicolas Grekas", 1015 | "email": "p@tchwork.com" 1016 | }, 1017 | { 1018 | "name": "Symfony Community", 1019 | "homepage": "https://symfony.com/contributors" 1020 | } 1021 | ], 1022 | "description": "Symfony polyfill for intl's Normalizer class and related functions", 1023 | "homepage": "https://symfony.com", 1024 | "keywords": [ 1025 | "compatibility", 1026 | "intl", 1027 | "normalizer", 1028 | "polyfill", 1029 | "portable", 1030 | "shim" 1031 | ], 1032 | "support": { 1033 | "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" 1034 | }, 1035 | "funding": [ 1036 | { 1037 | "url": "https://symfony.com/sponsor", 1038 | "type": "custom" 1039 | }, 1040 | { 1041 | "url": "https://github.com/fabpot", 1042 | "type": "github" 1043 | }, 1044 | { 1045 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1046 | "type": "tidelift" 1047 | } 1048 | ], 1049 | "time": "2023-01-26T09:26:14+00:00" 1050 | }, 1051 | { 1052 | "name": "symfony/polyfill-mbstring", 1053 | "version": "v1.28.0", 1054 | "source": { 1055 | "type": "git", 1056 | "url": "https://github.com/symfony/polyfill-mbstring.git", 1057 | "reference": "42292d99c55abe617799667f454222c54c60e229" 1058 | }, 1059 | "dist": { 1060 | "type": "zip", 1061 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", 1062 | "reference": "42292d99c55abe617799667f454222c54c60e229", 1063 | "shasum": "" 1064 | }, 1065 | "require": { 1066 | "php": ">=7.1" 1067 | }, 1068 | "provide": { 1069 | "ext-mbstring": "*" 1070 | }, 1071 | "suggest": { 1072 | "ext-mbstring": "For best performance" 1073 | }, 1074 | "type": "library", 1075 | "extra": { 1076 | "branch-alias": { 1077 | "dev-main": "1.28-dev" 1078 | }, 1079 | "thanks": { 1080 | "name": "symfony/polyfill", 1081 | "url": "https://github.com/symfony/polyfill" 1082 | } 1083 | }, 1084 | "autoload": { 1085 | "files": [ 1086 | "bootstrap.php" 1087 | ], 1088 | "psr-4": { 1089 | "Symfony\\Polyfill\\Mbstring\\": "" 1090 | } 1091 | }, 1092 | "notification-url": "https://packagist.org/downloads/", 1093 | "license": [ 1094 | "MIT" 1095 | ], 1096 | "authors": [ 1097 | { 1098 | "name": "Nicolas Grekas", 1099 | "email": "p@tchwork.com" 1100 | }, 1101 | { 1102 | "name": "Symfony Community", 1103 | "homepage": "https://symfony.com/contributors" 1104 | } 1105 | ], 1106 | "description": "Symfony polyfill for the Mbstring extension", 1107 | "homepage": "https://symfony.com", 1108 | "keywords": [ 1109 | "compatibility", 1110 | "mbstring", 1111 | "polyfill", 1112 | "portable", 1113 | "shim" 1114 | ], 1115 | "support": { 1116 | "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" 1117 | }, 1118 | "funding": [ 1119 | { 1120 | "url": "https://symfony.com/sponsor", 1121 | "type": "custom" 1122 | }, 1123 | { 1124 | "url": "https://github.com/fabpot", 1125 | "type": "github" 1126 | }, 1127 | { 1128 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1129 | "type": "tidelift" 1130 | } 1131 | ], 1132 | "time": "2023-07-28T09:04:16+00:00" 1133 | }, 1134 | { 1135 | "name": "symfony/yaml", 1136 | "version": "v6.4.0", 1137 | "source": { 1138 | "type": "git", 1139 | "url": "https://github.com/symfony/yaml.git", 1140 | "reference": "4f9237a1bb42455d609e6687d2613dde5b41a587" 1141 | }, 1142 | "dist": { 1143 | "type": "zip", 1144 | "url": "https://api.github.com/repos/symfony/yaml/zipball/4f9237a1bb42455d609e6687d2613dde5b41a587", 1145 | "reference": "4f9237a1bb42455d609e6687d2613dde5b41a587", 1146 | "shasum": "" 1147 | }, 1148 | "require": { 1149 | "php": ">=8.1", 1150 | "symfony/deprecation-contracts": "^2.5|^3", 1151 | "symfony/polyfill-ctype": "^1.8" 1152 | }, 1153 | "conflict": { 1154 | "symfony/console": "<5.4" 1155 | }, 1156 | "require-dev": { 1157 | "symfony/console": "^5.4|^6.0|^7.0" 1158 | }, 1159 | "bin": [ 1160 | "Resources/bin/yaml-lint" 1161 | ], 1162 | "type": "library", 1163 | "autoload": { 1164 | "psr-4": { 1165 | "Symfony\\Component\\Yaml\\": "" 1166 | }, 1167 | "exclude-from-classmap": [ 1168 | "/Tests/" 1169 | ] 1170 | }, 1171 | "notification-url": "https://packagist.org/downloads/", 1172 | "license": [ 1173 | "MIT" 1174 | ], 1175 | "authors": [ 1176 | { 1177 | "name": "Fabien Potencier", 1178 | "email": "fabien@symfony.com" 1179 | }, 1180 | { 1181 | "name": "Symfony Community", 1182 | "homepage": "https://symfony.com/contributors" 1183 | } 1184 | ], 1185 | "description": "Loads and dumps YAML files", 1186 | "homepage": "https://symfony.com", 1187 | "support": { 1188 | "source": "https://github.com/symfony/yaml/tree/v6.4.0" 1189 | }, 1190 | "funding": [ 1191 | { 1192 | "url": "https://symfony.com/sponsor", 1193 | "type": "custom" 1194 | }, 1195 | { 1196 | "url": "https://github.com/fabpot", 1197 | "type": "github" 1198 | }, 1199 | { 1200 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1201 | "type": "tidelift" 1202 | } 1203 | ], 1204 | "time": "2023-11-06T11:00:25+00:00" 1205 | } 1206 | ], 1207 | "packages-dev": [ 1208 | { 1209 | "name": "composer/pcre", 1210 | "version": "3.1.1", 1211 | "source": { 1212 | "type": "git", 1213 | "url": "https://github.com/composer/pcre.git", 1214 | "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9" 1215 | }, 1216 | "dist": { 1217 | "type": "zip", 1218 | "url": "https://api.github.com/repos/composer/pcre/zipball/00104306927c7a0919b4ced2aaa6782c1e61a3c9", 1219 | "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9", 1220 | "shasum": "" 1221 | }, 1222 | "require": { 1223 | "php": "^7.4 || ^8.0" 1224 | }, 1225 | "require-dev": { 1226 | "phpstan/phpstan": "^1.3", 1227 | "phpstan/phpstan-strict-rules": "^1.1", 1228 | "symfony/phpunit-bridge": "^5" 1229 | }, 1230 | "type": "library", 1231 | "extra": { 1232 | "branch-alias": { 1233 | "dev-main": "3.x-dev" 1234 | } 1235 | }, 1236 | "autoload": { 1237 | "psr-4": { 1238 | "Composer\\Pcre\\": "src" 1239 | } 1240 | }, 1241 | "notification-url": "https://packagist.org/downloads/", 1242 | "license": [ 1243 | "MIT" 1244 | ], 1245 | "authors": [ 1246 | { 1247 | "name": "Jordi Boggiano", 1248 | "email": "j.boggiano@seld.be", 1249 | "homepage": "http://seld.be" 1250 | } 1251 | ], 1252 | "description": "PCRE wrapping library that offers type-safe preg_* replacements.", 1253 | "keywords": [ 1254 | "PCRE", 1255 | "preg", 1256 | "regex", 1257 | "regular expression" 1258 | ], 1259 | "support": { 1260 | "issues": "https://github.com/composer/pcre/issues", 1261 | "source": "https://github.com/composer/pcre/tree/3.1.1" 1262 | }, 1263 | "funding": [ 1264 | { 1265 | "url": "https://packagist.com", 1266 | "type": "custom" 1267 | }, 1268 | { 1269 | "url": "https://github.com/composer", 1270 | "type": "github" 1271 | }, 1272 | { 1273 | "url": "https://tidelift.com/funding/github/packagist/composer/composer", 1274 | "type": "tidelift" 1275 | } 1276 | ], 1277 | "time": "2023-10-11T07:11:09+00:00" 1278 | }, 1279 | { 1280 | "name": "composer/xdebug-handler", 1281 | "version": "3.0.3", 1282 | "source": { 1283 | "type": "git", 1284 | "url": "https://github.com/composer/xdebug-handler.git", 1285 | "reference": "ced299686f41dce890debac69273b47ffe98a40c" 1286 | }, 1287 | "dist": { 1288 | "type": "zip", 1289 | "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", 1290 | "reference": "ced299686f41dce890debac69273b47ffe98a40c", 1291 | "shasum": "" 1292 | }, 1293 | "require": { 1294 | "composer/pcre": "^1 || ^2 || ^3", 1295 | "php": "^7.2.5 || ^8.0", 1296 | "psr/log": "^1 || ^2 || ^3" 1297 | }, 1298 | "require-dev": { 1299 | "phpstan/phpstan": "^1.0", 1300 | "phpstan/phpstan-strict-rules": "^1.1", 1301 | "symfony/phpunit-bridge": "^6.0" 1302 | }, 1303 | "type": "library", 1304 | "autoload": { 1305 | "psr-4": { 1306 | "Composer\\XdebugHandler\\": "src" 1307 | } 1308 | }, 1309 | "notification-url": "https://packagist.org/downloads/", 1310 | "license": [ 1311 | "MIT" 1312 | ], 1313 | "authors": [ 1314 | { 1315 | "name": "John Stevenson", 1316 | "email": "john-stevenson@blueyonder.co.uk" 1317 | } 1318 | ], 1319 | "description": "Restarts a process without Xdebug.", 1320 | "keywords": [ 1321 | "Xdebug", 1322 | "performance" 1323 | ], 1324 | "support": { 1325 | "irc": "irc://irc.freenode.org/composer", 1326 | "issues": "https://github.com/composer/xdebug-handler/issues", 1327 | "source": "https://github.com/composer/xdebug-handler/tree/3.0.3" 1328 | }, 1329 | "funding": [ 1330 | { 1331 | "url": "https://packagist.com", 1332 | "type": "custom" 1333 | }, 1334 | { 1335 | "url": "https://github.com/composer", 1336 | "type": "github" 1337 | }, 1338 | { 1339 | "url": "https://tidelift.com/funding/github/packagist/composer/composer", 1340 | "type": "tidelift" 1341 | } 1342 | ], 1343 | "time": "2022-02-25T21:32:43+00:00" 1344 | }, 1345 | { 1346 | "name": "friendsofphp/php-cs-fixer", 1347 | "version": "v3.49.0", 1348 | "source": { 1349 | "type": "git", 1350 | "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", 1351 | "reference": "8742f7aa6f72a399688b65e4f58992c2d4681fc2" 1352 | }, 1353 | "dist": { 1354 | "type": "zip", 1355 | "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/8742f7aa6f72a399688b65e4f58992c2d4681fc2", 1356 | "reference": "8742f7aa6f72a399688b65e4f58992c2d4681fc2", 1357 | "shasum": "" 1358 | }, 1359 | "require": { 1360 | "composer/semver": "^3.4", 1361 | "composer/xdebug-handler": "^3.0.3", 1362 | "ext-filter": "*", 1363 | "ext-json": "*", 1364 | "ext-tokenizer": "*", 1365 | "php": "^7.4 || ^8.0", 1366 | "sebastian/diff": "^4.0 || ^5.0", 1367 | "symfony/console": "^5.4 || ^6.0 || ^7.0", 1368 | "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0", 1369 | "symfony/filesystem": "^5.4 || ^6.0 || ^7.0", 1370 | "symfony/finder": "^5.4 || ^6.0 || ^7.0", 1371 | "symfony/options-resolver": "^5.4 || ^6.0 || ^7.0", 1372 | "symfony/polyfill-mbstring": "^1.28", 1373 | "symfony/polyfill-php80": "^1.28", 1374 | "symfony/polyfill-php81": "^1.28", 1375 | "symfony/process": "^5.4 || ^6.0 || ^7.0", 1376 | "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0" 1377 | }, 1378 | "require-dev": { 1379 | "facile-it/paraunit": "^1.3 || ^2.0", 1380 | "justinrainbow/json-schema": "^5.2", 1381 | "keradus/cli-executor": "^2.1", 1382 | "mikey179/vfsstream": "^1.6.11", 1383 | "php-coveralls/php-coveralls": "^2.7", 1384 | "php-cs-fixer/accessible-object": "^1.1", 1385 | "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.4", 1386 | "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.4", 1387 | "phpunit/phpunit": "^9.6 || ^10.5.5", 1388 | "symfony/yaml": "^5.4 || ^6.0 || ^7.0" 1389 | }, 1390 | "suggest": { 1391 | "ext-dom": "For handling output formats in XML", 1392 | "ext-mbstring": "For handling non-UTF8 characters." 1393 | }, 1394 | "bin": [ 1395 | "php-cs-fixer" 1396 | ], 1397 | "type": "application", 1398 | "autoload": { 1399 | "psr-4": { 1400 | "PhpCsFixer\\": "src/" 1401 | } 1402 | }, 1403 | "notification-url": "https://packagist.org/downloads/", 1404 | "license": [ 1405 | "MIT" 1406 | ], 1407 | "authors": [ 1408 | { 1409 | "name": "Fabien Potencier", 1410 | "email": "fabien@symfony.com" 1411 | }, 1412 | { 1413 | "name": "Dariusz Rumiński", 1414 | "email": "dariusz.ruminski@gmail.com" 1415 | } 1416 | ], 1417 | "description": "A tool to automatically fix PHP code style", 1418 | "keywords": [ 1419 | "Static code analysis", 1420 | "fixer", 1421 | "standards", 1422 | "static analysis" 1423 | ], 1424 | "support": { 1425 | "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", 1426 | "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.49.0" 1427 | }, 1428 | "funding": [ 1429 | { 1430 | "url": "https://github.com/keradus", 1431 | "type": "github" 1432 | } 1433 | ], 1434 | "time": "2024-02-02T00:41:40+00:00" 1435 | }, 1436 | { 1437 | "name": "psr/container", 1438 | "version": "2.0.2", 1439 | "source": { 1440 | "type": "git", 1441 | "url": "https://github.com/php-fig/container.git", 1442 | "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" 1443 | }, 1444 | "dist": { 1445 | "type": "zip", 1446 | "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", 1447 | "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", 1448 | "shasum": "" 1449 | }, 1450 | "require": { 1451 | "php": ">=7.4.0" 1452 | }, 1453 | "type": "library", 1454 | "extra": { 1455 | "branch-alias": { 1456 | "dev-master": "2.0.x-dev" 1457 | } 1458 | }, 1459 | "autoload": { 1460 | "psr-4": { 1461 | "Psr\\Container\\": "src/" 1462 | } 1463 | }, 1464 | "notification-url": "https://packagist.org/downloads/", 1465 | "license": [ 1466 | "MIT" 1467 | ], 1468 | "authors": [ 1469 | { 1470 | "name": "PHP-FIG", 1471 | "homepage": "https://www.php-fig.org/" 1472 | } 1473 | ], 1474 | "description": "Common Container Interface (PHP FIG PSR-11)", 1475 | "homepage": "https://github.com/php-fig/container", 1476 | "keywords": [ 1477 | "PSR-11", 1478 | "container", 1479 | "container-interface", 1480 | "container-interop", 1481 | "psr" 1482 | ], 1483 | "support": { 1484 | "issues": "https://github.com/php-fig/container/issues", 1485 | "source": "https://github.com/php-fig/container/tree/2.0.2" 1486 | }, 1487 | "time": "2021-11-05T16:47:00+00:00" 1488 | }, 1489 | { 1490 | "name": "psr/event-dispatcher", 1491 | "version": "1.0.0", 1492 | "source": { 1493 | "type": "git", 1494 | "url": "https://github.com/php-fig/event-dispatcher.git", 1495 | "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" 1496 | }, 1497 | "dist": { 1498 | "type": "zip", 1499 | "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", 1500 | "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", 1501 | "shasum": "" 1502 | }, 1503 | "require": { 1504 | "php": ">=7.2.0" 1505 | }, 1506 | "type": "library", 1507 | "extra": { 1508 | "branch-alias": { 1509 | "dev-master": "1.0.x-dev" 1510 | } 1511 | }, 1512 | "autoload": { 1513 | "psr-4": { 1514 | "Psr\\EventDispatcher\\": "src/" 1515 | } 1516 | }, 1517 | "notification-url": "https://packagist.org/downloads/", 1518 | "license": [ 1519 | "MIT" 1520 | ], 1521 | "authors": [ 1522 | { 1523 | "name": "PHP-FIG", 1524 | "homepage": "http://www.php-fig.org/" 1525 | } 1526 | ], 1527 | "description": "Standard interfaces for event handling.", 1528 | "keywords": [ 1529 | "events", 1530 | "psr", 1531 | "psr-14" 1532 | ], 1533 | "support": { 1534 | "issues": "https://github.com/php-fig/event-dispatcher/issues", 1535 | "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" 1536 | }, 1537 | "time": "2019-01-08T18:20:26+00:00" 1538 | }, 1539 | { 1540 | "name": "sebastian/diff", 1541 | "version": "5.1.0", 1542 | "source": { 1543 | "type": "git", 1544 | "url": "https://github.com/sebastianbergmann/diff.git", 1545 | "reference": "fbf413a49e54f6b9b17e12d900ac7f6101591b7f" 1546 | }, 1547 | "dist": { 1548 | "type": "zip", 1549 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/fbf413a49e54f6b9b17e12d900ac7f6101591b7f", 1550 | "reference": "fbf413a49e54f6b9b17e12d900ac7f6101591b7f", 1551 | "shasum": "" 1552 | }, 1553 | "require": { 1554 | "php": ">=8.1" 1555 | }, 1556 | "require-dev": { 1557 | "phpunit/phpunit": "^10.0", 1558 | "symfony/process": "^4.2 || ^5" 1559 | }, 1560 | "type": "library", 1561 | "extra": { 1562 | "branch-alias": { 1563 | "dev-main": "5.1-dev" 1564 | } 1565 | }, 1566 | "autoload": { 1567 | "classmap": [ 1568 | "src/" 1569 | ] 1570 | }, 1571 | "notification-url": "https://packagist.org/downloads/", 1572 | "license": [ 1573 | "BSD-3-Clause" 1574 | ], 1575 | "authors": [ 1576 | { 1577 | "name": "Sebastian Bergmann", 1578 | "email": "sebastian@phpunit.de" 1579 | }, 1580 | { 1581 | "name": "Kore Nordmann", 1582 | "email": "mail@kore-nordmann.de" 1583 | } 1584 | ], 1585 | "description": "Diff implementation", 1586 | "homepage": "https://github.com/sebastianbergmann/diff", 1587 | "keywords": [ 1588 | "diff", 1589 | "udiff", 1590 | "unidiff", 1591 | "unified diff" 1592 | ], 1593 | "support": { 1594 | "issues": "https://github.com/sebastianbergmann/diff/issues", 1595 | "security": "https://github.com/sebastianbergmann/diff/security/policy", 1596 | "source": "https://github.com/sebastianbergmann/diff/tree/5.1.0" 1597 | }, 1598 | "funding": [ 1599 | { 1600 | "url": "https://github.com/sebastianbergmann", 1601 | "type": "github" 1602 | } 1603 | ], 1604 | "time": "2023-12-22T10:55:06+00:00" 1605 | }, 1606 | { 1607 | "name": "symfony/console", 1608 | "version": "v6.4.3", 1609 | "source": { 1610 | "type": "git", 1611 | "url": "https://github.com/symfony/console.git", 1612 | "reference": "2aaf83b4de5b9d43b93e4aec6f2f8b676f7c567e" 1613 | }, 1614 | "dist": { 1615 | "type": "zip", 1616 | "url": "https://api.github.com/repos/symfony/console/zipball/2aaf83b4de5b9d43b93e4aec6f2f8b676f7c567e", 1617 | "reference": "2aaf83b4de5b9d43b93e4aec6f2f8b676f7c567e", 1618 | "shasum": "" 1619 | }, 1620 | "require": { 1621 | "php": ">=8.1", 1622 | "symfony/deprecation-contracts": "^2.5|^3", 1623 | "symfony/polyfill-mbstring": "~1.0", 1624 | "symfony/service-contracts": "^2.5|^3", 1625 | "symfony/string": "^5.4|^6.0|^7.0" 1626 | }, 1627 | "conflict": { 1628 | "symfony/dependency-injection": "<5.4", 1629 | "symfony/dotenv": "<5.4", 1630 | "symfony/event-dispatcher": "<5.4", 1631 | "symfony/lock": "<5.4", 1632 | "symfony/process": "<5.4" 1633 | }, 1634 | "provide": { 1635 | "psr/log-implementation": "1.0|2.0|3.0" 1636 | }, 1637 | "require-dev": { 1638 | "psr/log": "^1|^2|^3", 1639 | "symfony/config": "^5.4|^6.0|^7.0", 1640 | "symfony/dependency-injection": "^5.4|^6.0|^7.0", 1641 | "symfony/event-dispatcher": "^5.4|^6.0|^7.0", 1642 | "symfony/http-foundation": "^6.4|^7.0", 1643 | "symfony/http-kernel": "^6.4|^7.0", 1644 | "symfony/lock": "^5.4|^6.0|^7.0", 1645 | "symfony/messenger": "^5.4|^6.0|^7.0", 1646 | "symfony/process": "^5.4|^6.0|^7.0", 1647 | "symfony/stopwatch": "^5.4|^6.0|^7.0", 1648 | "symfony/var-dumper": "^5.4|^6.0|^7.0" 1649 | }, 1650 | "type": "library", 1651 | "autoload": { 1652 | "psr-4": { 1653 | "Symfony\\Component\\Console\\": "" 1654 | }, 1655 | "exclude-from-classmap": [ 1656 | "/Tests/" 1657 | ] 1658 | }, 1659 | "notification-url": "https://packagist.org/downloads/", 1660 | "license": [ 1661 | "MIT" 1662 | ], 1663 | "authors": [ 1664 | { 1665 | "name": "Fabien Potencier", 1666 | "email": "fabien@symfony.com" 1667 | }, 1668 | { 1669 | "name": "Symfony Community", 1670 | "homepage": "https://symfony.com/contributors" 1671 | } 1672 | ], 1673 | "description": "Eases the creation of beautiful and testable command line interfaces", 1674 | "homepage": "https://symfony.com", 1675 | "keywords": [ 1676 | "cli", 1677 | "command-line", 1678 | "console", 1679 | "terminal" 1680 | ], 1681 | "support": { 1682 | "source": "https://github.com/symfony/console/tree/v6.4.3" 1683 | }, 1684 | "funding": [ 1685 | { 1686 | "url": "https://symfony.com/sponsor", 1687 | "type": "custom" 1688 | }, 1689 | { 1690 | "url": "https://github.com/fabpot", 1691 | "type": "github" 1692 | }, 1693 | { 1694 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1695 | "type": "tidelift" 1696 | } 1697 | ], 1698 | "time": "2024-01-23T14:51:35+00:00" 1699 | }, 1700 | { 1701 | "name": "symfony/event-dispatcher", 1702 | "version": "v6.4.3", 1703 | "source": { 1704 | "type": "git", 1705 | "url": "https://github.com/symfony/event-dispatcher.git", 1706 | "reference": "ae9d3a6f3003a6caf56acd7466d8d52378d44fef" 1707 | }, 1708 | "dist": { 1709 | "type": "zip", 1710 | "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/ae9d3a6f3003a6caf56acd7466d8d52378d44fef", 1711 | "reference": "ae9d3a6f3003a6caf56acd7466d8d52378d44fef", 1712 | "shasum": "" 1713 | }, 1714 | "require": { 1715 | "php": ">=8.1", 1716 | "symfony/event-dispatcher-contracts": "^2.5|^3" 1717 | }, 1718 | "conflict": { 1719 | "symfony/dependency-injection": "<5.4", 1720 | "symfony/service-contracts": "<2.5" 1721 | }, 1722 | "provide": { 1723 | "psr/event-dispatcher-implementation": "1.0", 1724 | "symfony/event-dispatcher-implementation": "2.0|3.0" 1725 | }, 1726 | "require-dev": { 1727 | "psr/log": "^1|^2|^3", 1728 | "symfony/config": "^5.4|^6.0|^7.0", 1729 | "symfony/dependency-injection": "^5.4|^6.0|^7.0", 1730 | "symfony/error-handler": "^5.4|^6.0|^7.0", 1731 | "symfony/expression-language": "^5.4|^6.0|^7.0", 1732 | "symfony/http-foundation": "^5.4|^6.0|^7.0", 1733 | "symfony/service-contracts": "^2.5|^3", 1734 | "symfony/stopwatch": "^5.4|^6.0|^7.0" 1735 | }, 1736 | "type": "library", 1737 | "autoload": { 1738 | "psr-4": { 1739 | "Symfony\\Component\\EventDispatcher\\": "" 1740 | }, 1741 | "exclude-from-classmap": [ 1742 | "/Tests/" 1743 | ] 1744 | }, 1745 | "notification-url": "https://packagist.org/downloads/", 1746 | "license": [ 1747 | "MIT" 1748 | ], 1749 | "authors": [ 1750 | { 1751 | "name": "Fabien Potencier", 1752 | "email": "fabien@symfony.com" 1753 | }, 1754 | { 1755 | "name": "Symfony Community", 1756 | "homepage": "https://symfony.com/contributors" 1757 | } 1758 | ], 1759 | "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", 1760 | "homepage": "https://symfony.com", 1761 | "support": { 1762 | "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.3" 1763 | }, 1764 | "funding": [ 1765 | { 1766 | "url": "https://symfony.com/sponsor", 1767 | "type": "custom" 1768 | }, 1769 | { 1770 | "url": "https://github.com/fabpot", 1771 | "type": "github" 1772 | }, 1773 | { 1774 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1775 | "type": "tidelift" 1776 | } 1777 | ], 1778 | "time": "2024-01-23T14:51:35+00:00" 1779 | }, 1780 | { 1781 | "name": "symfony/event-dispatcher-contracts", 1782 | "version": "v3.4.0", 1783 | "source": { 1784 | "type": "git", 1785 | "url": "https://github.com/symfony/event-dispatcher-contracts.git", 1786 | "reference": "a76aed96a42d2b521153fb382d418e30d18b59df" 1787 | }, 1788 | "dist": { 1789 | "type": "zip", 1790 | "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df", 1791 | "reference": "a76aed96a42d2b521153fb382d418e30d18b59df", 1792 | "shasum": "" 1793 | }, 1794 | "require": { 1795 | "php": ">=8.1", 1796 | "psr/event-dispatcher": "^1" 1797 | }, 1798 | "type": "library", 1799 | "extra": { 1800 | "branch-alias": { 1801 | "dev-main": "3.4-dev" 1802 | }, 1803 | "thanks": { 1804 | "name": "symfony/contracts", 1805 | "url": "https://github.com/symfony/contracts" 1806 | } 1807 | }, 1808 | "autoload": { 1809 | "psr-4": { 1810 | "Symfony\\Contracts\\EventDispatcher\\": "" 1811 | } 1812 | }, 1813 | "notification-url": "https://packagist.org/downloads/", 1814 | "license": [ 1815 | "MIT" 1816 | ], 1817 | "authors": [ 1818 | { 1819 | "name": "Nicolas Grekas", 1820 | "email": "p@tchwork.com" 1821 | }, 1822 | { 1823 | "name": "Symfony Community", 1824 | "homepage": "https://symfony.com/contributors" 1825 | } 1826 | ], 1827 | "description": "Generic abstractions related to dispatching event", 1828 | "homepage": "https://symfony.com", 1829 | "keywords": [ 1830 | "abstractions", 1831 | "contracts", 1832 | "decoupling", 1833 | "interfaces", 1834 | "interoperability", 1835 | "standards" 1836 | ], 1837 | "support": { 1838 | "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.4.0" 1839 | }, 1840 | "funding": [ 1841 | { 1842 | "url": "https://symfony.com/sponsor", 1843 | "type": "custom" 1844 | }, 1845 | { 1846 | "url": "https://github.com/fabpot", 1847 | "type": "github" 1848 | }, 1849 | { 1850 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1851 | "type": "tidelift" 1852 | } 1853 | ], 1854 | "time": "2023-05-23T14:45:45+00:00" 1855 | }, 1856 | { 1857 | "name": "symfony/filesystem", 1858 | "version": "v6.4.3", 1859 | "source": { 1860 | "type": "git", 1861 | "url": "https://github.com/symfony/filesystem.git", 1862 | "reference": "7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb" 1863 | }, 1864 | "dist": { 1865 | "type": "zip", 1866 | "url": "https://api.github.com/repos/symfony/filesystem/zipball/7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb", 1867 | "reference": "7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb", 1868 | "shasum": "" 1869 | }, 1870 | "require": { 1871 | "php": ">=8.1", 1872 | "symfony/polyfill-ctype": "~1.8", 1873 | "symfony/polyfill-mbstring": "~1.8" 1874 | }, 1875 | "type": "library", 1876 | "autoload": { 1877 | "psr-4": { 1878 | "Symfony\\Component\\Filesystem\\": "" 1879 | }, 1880 | "exclude-from-classmap": [ 1881 | "/Tests/" 1882 | ] 1883 | }, 1884 | "notification-url": "https://packagist.org/downloads/", 1885 | "license": [ 1886 | "MIT" 1887 | ], 1888 | "authors": [ 1889 | { 1890 | "name": "Fabien Potencier", 1891 | "email": "fabien@symfony.com" 1892 | }, 1893 | { 1894 | "name": "Symfony Community", 1895 | "homepage": "https://symfony.com/contributors" 1896 | } 1897 | ], 1898 | "description": "Provides basic utilities for the filesystem", 1899 | "homepage": "https://symfony.com", 1900 | "support": { 1901 | "source": "https://github.com/symfony/filesystem/tree/v6.4.3" 1902 | }, 1903 | "funding": [ 1904 | { 1905 | "url": "https://symfony.com/sponsor", 1906 | "type": "custom" 1907 | }, 1908 | { 1909 | "url": "https://github.com/fabpot", 1910 | "type": "github" 1911 | }, 1912 | { 1913 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1914 | "type": "tidelift" 1915 | } 1916 | ], 1917 | "time": "2024-01-23T14:51:35+00:00" 1918 | }, 1919 | { 1920 | "name": "symfony/finder", 1921 | "version": "v6.4.0", 1922 | "source": { 1923 | "type": "git", 1924 | "url": "https://github.com/symfony/finder.git", 1925 | "reference": "11d736e97f116ac375a81f96e662911a34cd50ce" 1926 | }, 1927 | "dist": { 1928 | "type": "zip", 1929 | "url": "https://api.github.com/repos/symfony/finder/zipball/11d736e97f116ac375a81f96e662911a34cd50ce", 1930 | "reference": "11d736e97f116ac375a81f96e662911a34cd50ce", 1931 | "shasum": "" 1932 | }, 1933 | "require": { 1934 | "php": ">=8.1" 1935 | }, 1936 | "require-dev": { 1937 | "symfony/filesystem": "^6.0|^7.0" 1938 | }, 1939 | "type": "library", 1940 | "autoload": { 1941 | "psr-4": { 1942 | "Symfony\\Component\\Finder\\": "" 1943 | }, 1944 | "exclude-from-classmap": [ 1945 | "/Tests/" 1946 | ] 1947 | }, 1948 | "notification-url": "https://packagist.org/downloads/", 1949 | "license": [ 1950 | "MIT" 1951 | ], 1952 | "authors": [ 1953 | { 1954 | "name": "Fabien Potencier", 1955 | "email": "fabien@symfony.com" 1956 | }, 1957 | { 1958 | "name": "Symfony Community", 1959 | "homepage": "https://symfony.com/contributors" 1960 | } 1961 | ], 1962 | "description": "Finds files and directories via an intuitive fluent interface", 1963 | "homepage": "https://symfony.com", 1964 | "support": { 1965 | "source": "https://github.com/symfony/finder/tree/v6.4.0" 1966 | }, 1967 | "funding": [ 1968 | { 1969 | "url": "https://symfony.com/sponsor", 1970 | "type": "custom" 1971 | }, 1972 | { 1973 | "url": "https://github.com/fabpot", 1974 | "type": "github" 1975 | }, 1976 | { 1977 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1978 | "type": "tidelift" 1979 | } 1980 | ], 1981 | "time": "2023-10-31T17:30:12+00:00" 1982 | }, 1983 | { 1984 | "name": "symfony/options-resolver", 1985 | "version": "v6.4.0", 1986 | "source": { 1987 | "type": "git", 1988 | "url": "https://github.com/symfony/options-resolver.git", 1989 | "reference": "22301f0e7fdeaacc14318928612dee79be99860e" 1990 | }, 1991 | "dist": { 1992 | "type": "zip", 1993 | "url": "https://api.github.com/repos/symfony/options-resolver/zipball/22301f0e7fdeaacc14318928612dee79be99860e", 1994 | "reference": "22301f0e7fdeaacc14318928612dee79be99860e", 1995 | "shasum": "" 1996 | }, 1997 | "require": { 1998 | "php": ">=8.1", 1999 | "symfony/deprecation-contracts": "^2.5|^3" 2000 | }, 2001 | "type": "library", 2002 | "autoload": { 2003 | "psr-4": { 2004 | "Symfony\\Component\\OptionsResolver\\": "" 2005 | }, 2006 | "exclude-from-classmap": [ 2007 | "/Tests/" 2008 | ] 2009 | }, 2010 | "notification-url": "https://packagist.org/downloads/", 2011 | "license": [ 2012 | "MIT" 2013 | ], 2014 | "authors": [ 2015 | { 2016 | "name": "Fabien Potencier", 2017 | "email": "fabien@symfony.com" 2018 | }, 2019 | { 2020 | "name": "Symfony Community", 2021 | "homepage": "https://symfony.com/contributors" 2022 | } 2023 | ], 2024 | "description": "Provides an improved replacement for the array_replace PHP function", 2025 | "homepage": "https://symfony.com", 2026 | "keywords": [ 2027 | "config", 2028 | "configuration", 2029 | "options" 2030 | ], 2031 | "support": { 2032 | "source": "https://github.com/symfony/options-resolver/tree/v6.4.0" 2033 | }, 2034 | "funding": [ 2035 | { 2036 | "url": "https://symfony.com/sponsor", 2037 | "type": "custom" 2038 | }, 2039 | { 2040 | "url": "https://github.com/fabpot", 2041 | "type": "github" 2042 | }, 2043 | { 2044 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2045 | "type": "tidelift" 2046 | } 2047 | ], 2048 | "time": "2023-08-08T10:16:24+00:00" 2049 | }, 2050 | { 2051 | "name": "symfony/polyfill-intl-grapheme", 2052 | "version": "v1.28.0", 2053 | "source": { 2054 | "type": "git", 2055 | "url": "https://github.com/symfony/polyfill-intl-grapheme.git", 2056 | "reference": "875e90aeea2777b6f135677f618529449334a612" 2057 | }, 2058 | "dist": { 2059 | "type": "zip", 2060 | "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", 2061 | "reference": "875e90aeea2777b6f135677f618529449334a612", 2062 | "shasum": "" 2063 | }, 2064 | "require": { 2065 | "php": ">=7.1" 2066 | }, 2067 | "suggest": { 2068 | "ext-intl": "For best performance" 2069 | }, 2070 | "type": "library", 2071 | "extra": { 2072 | "branch-alias": { 2073 | "dev-main": "1.28-dev" 2074 | }, 2075 | "thanks": { 2076 | "name": "symfony/polyfill", 2077 | "url": "https://github.com/symfony/polyfill" 2078 | } 2079 | }, 2080 | "autoload": { 2081 | "files": [ 2082 | "bootstrap.php" 2083 | ], 2084 | "psr-4": { 2085 | "Symfony\\Polyfill\\Intl\\Grapheme\\": "" 2086 | } 2087 | }, 2088 | "notification-url": "https://packagist.org/downloads/", 2089 | "license": [ 2090 | "MIT" 2091 | ], 2092 | "authors": [ 2093 | { 2094 | "name": "Nicolas Grekas", 2095 | "email": "p@tchwork.com" 2096 | }, 2097 | { 2098 | "name": "Symfony Community", 2099 | "homepage": "https://symfony.com/contributors" 2100 | } 2101 | ], 2102 | "description": "Symfony polyfill for intl's grapheme_* functions", 2103 | "homepage": "https://symfony.com", 2104 | "keywords": [ 2105 | "compatibility", 2106 | "grapheme", 2107 | "intl", 2108 | "polyfill", 2109 | "portable", 2110 | "shim" 2111 | ], 2112 | "support": { 2113 | "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0" 2114 | }, 2115 | "funding": [ 2116 | { 2117 | "url": "https://symfony.com/sponsor", 2118 | "type": "custom" 2119 | }, 2120 | { 2121 | "url": "https://github.com/fabpot", 2122 | "type": "github" 2123 | }, 2124 | { 2125 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2126 | "type": "tidelift" 2127 | } 2128 | ], 2129 | "time": "2023-01-26T09:26:14+00:00" 2130 | }, 2131 | { 2132 | "name": "symfony/polyfill-php80", 2133 | "version": "v1.28.0", 2134 | "source": { 2135 | "type": "git", 2136 | "url": "https://github.com/symfony/polyfill-php80.git", 2137 | "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" 2138 | }, 2139 | "dist": { 2140 | "type": "zip", 2141 | "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", 2142 | "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", 2143 | "shasum": "" 2144 | }, 2145 | "require": { 2146 | "php": ">=7.1" 2147 | }, 2148 | "type": "library", 2149 | "extra": { 2150 | "branch-alias": { 2151 | "dev-main": "1.28-dev" 2152 | }, 2153 | "thanks": { 2154 | "name": "symfony/polyfill", 2155 | "url": "https://github.com/symfony/polyfill" 2156 | } 2157 | }, 2158 | "autoload": { 2159 | "files": [ 2160 | "bootstrap.php" 2161 | ], 2162 | "psr-4": { 2163 | "Symfony\\Polyfill\\Php80\\": "" 2164 | }, 2165 | "classmap": [ 2166 | "Resources/stubs" 2167 | ] 2168 | }, 2169 | "notification-url": "https://packagist.org/downloads/", 2170 | "license": [ 2171 | "MIT" 2172 | ], 2173 | "authors": [ 2174 | { 2175 | "name": "Ion Bazan", 2176 | "email": "ion.bazan@gmail.com" 2177 | }, 2178 | { 2179 | "name": "Nicolas Grekas", 2180 | "email": "p@tchwork.com" 2181 | }, 2182 | { 2183 | "name": "Symfony Community", 2184 | "homepage": "https://symfony.com/contributors" 2185 | } 2186 | ], 2187 | "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", 2188 | "homepage": "https://symfony.com", 2189 | "keywords": [ 2190 | "compatibility", 2191 | "polyfill", 2192 | "portable", 2193 | "shim" 2194 | ], 2195 | "support": { 2196 | "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" 2197 | }, 2198 | "funding": [ 2199 | { 2200 | "url": "https://symfony.com/sponsor", 2201 | "type": "custom" 2202 | }, 2203 | { 2204 | "url": "https://github.com/fabpot", 2205 | "type": "github" 2206 | }, 2207 | { 2208 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2209 | "type": "tidelift" 2210 | } 2211 | ], 2212 | "time": "2023-01-26T09:26:14+00:00" 2213 | }, 2214 | { 2215 | "name": "symfony/polyfill-php81", 2216 | "version": "v1.28.0", 2217 | "source": { 2218 | "type": "git", 2219 | "url": "https://github.com/symfony/polyfill-php81.git", 2220 | "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b" 2221 | }, 2222 | "dist": { 2223 | "type": "zip", 2224 | "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/7581cd600fa9fd681b797d00b02f068e2f13263b", 2225 | "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b", 2226 | "shasum": "" 2227 | }, 2228 | "require": { 2229 | "php": ">=7.1" 2230 | }, 2231 | "type": "library", 2232 | "extra": { 2233 | "branch-alias": { 2234 | "dev-main": "1.28-dev" 2235 | }, 2236 | "thanks": { 2237 | "name": "symfony/polyfill", 2238 | "url": "https://github.com/symfony/polyfill" 2239 | } 2240 | }, 2241 | "autoload": { 2242 | "files": [ 2243 | "bootstrap.php" 2244 | ], 2245 | "psr-4": { 2246 | "Symfony\\Polyfill\\Php81\\": "" 2247 | }, 2248 | "classmap": [ 2249 | "Resources/stubs" 2250 | ] 2251 | }, 2252 | "notification-url": "https://packagist.org/downloads/", 2253 | "license": [ 2254 | "MIT" 2255 | ], 2256 | "authors": [ 2257 | { 2258 | "name": "Nicolas Grekas", 2259 | "email": "p@tchwork.com" 2260 | }, 2261 | { 2262 | "name": "Symfony Community", 2263 | "homepage": "https://symfony.com/contributors" 2264 | } 2265 | ], 2266 | "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", 2267 | "homepage": "https://symfony.com", 2268 | "keywords": [ 2269 | "compatibility", 2270 | "polyfill", 2271 | "portable", 2272 | "shim" 2273 | ], 2274 | "support": { 2275 | "source": "https://github.com/symfony/polyfill-php81/tree/v1.28.0" 2276 | }, 2277 | "funding": [ 2278 | { 2279 | "url": "https://symfony.com/sponsor", 2280 | "type": "custom" 2281 | }, 2282 | { 2283 | "url": "https://github.com/fabpot", 2284 | "type": "github" 2285 | }, 2286 | { 2287 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2288 | "type": "tidelift" 2289 | } 2290 | ], 2291 | "time": "2023-01-26T09:26:14+00:00" 2292 | }, 2293 | { 2294 | "name": "symfony/process", 2295 | "version": "v6.4.3", 2296 | "source": { 2297 | "type": "git", 2298 | "url": "https://github.com/symfony/process.git", 2299 | "reference": "31642b0818bfcff85930344ef93193f8c607e0a3" 2300 | }, 2301 | "dist": { 2302 | "type": "zip", 2303 | "url": "https://api.github.com/repos/symfony/process/zipball/31642b0818bfcff85930344ef93193f8c607e0a3", 2304 | "reference": "31642b0818bfcff85930344ef93193f8c607e0a3", 2305 | "shasum": "" 2306 | }, 2307 | "require": { 2308 | "php": ">=8.1" 2309 | }, 2310 | "type": "library", 2311 | "autoload": { 2312 | "psr-4": { 2313 | "Symfony\\Component\\Process\\": "" 2314 | }, 2315 | "exclude-from-classmap": [ 2316 | "/Tests/" 2317 | ] 2318 | }, 2319 | "notification-url": "https://packagist.org/downloads/", 2320 | "license": [ 2321 | "MIT" 2322 | ], 2323 | "authors": [ 2324 | { 2325 | "name": "Fabien Potencier", 2326 | "email": "fabien@symfony.com" 2327 | }, 2328 | { 2329 | "name": "Symfony Community", 2330 | "homepage": "https://symfony.com/contributors" 2331 | } 2332 | ], 2333 | "description": "Executes commands in sub-processes", 2334 | "homepage": "https://symfony.com", 2335 | "support": { 2336 | "source": "https://github.com/symfony/process/tree/v6.4.3" 2337 | }, 2338 | "funding": [ 2339 | { 2340 | "url": "https://symfony.com/sponsor", 2341 | "type": "custom" 2342 | }, 2343 | { 2344 | "url": "https://github.com/fabpot", 2345 | "type": "github" 2346 | }, 2347 | { 2348 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2349 | "type": "tidelift" 2350 | } 2351 | ], 2352 | "time": "2024-01-23T14:51:35+00:00" 2353 | }, 2354 | { 2355 | "name": "symfony/service-contracts", 2356 | "version": "v3.4.1", 2357 | "source": { 2358 | "type": "git", 2359 | "url": "https://github.com/symfony/service-contracts.git", 2360 | "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0" 2361 | }, 2362 | "dist": { 2363 | "type": "zip", 2364 | "url": "https://api.github.com/repos/symfony/service-contracts/zipball/fe07cbc8d837f60caf7018068e350cc5163681a0", 2365 | "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0", 2366 | "shasum": "" 2367 | }, 2368 | "require": { 2369 | "php": ">=8.1", 2370 | "psr/container": "^1.1|^2.0" 2371 | }, 2372 | "conflict": { 2373 | "ext-psr": "<1.1|>=2" 2374 | }, 2375 | "type": "library", 2376 | "extra": { 2377 | "branch-alias": { 2378 | "dev-main": "3.4-dev" 2379 | }, 2380 | "thanks": { 2381 | "name": "symfony/contracts", 2382 | "url": "https://github.com/symfony/contracts" 2383 | } 2384 | }, 2385 | "autoload": { 2386 | "psr-4": { 2387 | "Symfony\\Contracts\\Service\\": "" 2388 | }, 2389 | "exclude-from-classmap": [ 2390 | "/Test/" 2391 | ] 2392 | }, 2393 | "notification-url": "https://packagist.org/downloads/", 2394 | "license": [ 2395 | "MIT" 2396 | ], 2397 | "authors": [ 2398 | { 2399 | "name": "Nicolas Grekas", 2400 | "email": "p@tchwork.com" 2401 | }, 2402 | { 2403 | "name": "Symfony Community", 2404 | "homepage": "https://symfony.com/contributors" 2405 | } 2406 | ], 2407 | "description": "Generic abstractions related to writing services", 2408 | "homepage": "https://symfony.com", 2409 | "keywords": [ 2410 | "abstractions", 2411 | "contracts", 2412 | "decoupling", 2413 | "interfaces", 2414 | "interoperability", 2415 | "standards" 2416 | ], 2417 | "support": { 2418 | "source": "https://github.com/symfony/service-contracts/tree/v3.4.1" 2419 | }, 2420 | "funding": [ 2421 | { 2422 | "url": "https://symfony.com/sponsor", 2423 | "type": "custom" 2424 | }, 2425 | { 2426 | "url": "https://github.com/fabpot", 2427 | "type": "github" 2428 | }, 2429 | { 2430 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2431 | "type": "tidelift" 2432 | } 2433 | ], 2434 | "time": "2023-12-26T14:02:43+00:00" 2435 | }, 2436 | { 2437 | "name": "symfony/stopwatch", 2438 | "version": "v6.4.3", 2439 | "source": { 2440 | "type": "git", 2441 | "url": "https://github.com/symfony/stopwatch.git", 2442 | "reference": "416596166641f1f728b0a64f5b9dd07cceb410c1" 2443 | }, 2444 | "dist": { 2445 | "type": "zip", 2446 | "url": "https://api.github.com/repos/symfony/stopwatch/zipball/416596166641f1f728b0a64f5b9dd07cceb410c1", 2447 | "reference": "416596166641f1f728b0a64f5b9dd07cceb410c1", 2448 | "shasum": "" 2449 | }, 2450 | "require": { 2451 | "php": ">=8.1", 2452 | "symfony/service-contracts": "^2.5|^3" 2453 | }, 2454 | "type": "library", 2455 | "autoload": { 2456 | "psr-4": { 2457 | "Symfony\\Component\\Stopwatch\\": "" 2458 | }, 2459 | "exclude-from-classmap": [ 2460 | "/Tests/" 2461 | ] 2462 | }, 2463 | "notification-url": "https://packagist.org/downloads/", 2464 | "license": [ 2465 | "MIT" 2466 | ], 2467 | "authors": [ 2468 | { 2469 | "name": "Fabien Potencier", 2470 | "email": "fabien@symfony.com" 2471 | }, 2472 | { 2473 | "name": "Symfony Community", 2474 | "homepage": "https://symfony.com/contributors" 2475 | } 2476 | ], 2477 | "description": "Provides a way to profile code", 2478 | "homepage": "https://symfony.com", 2479 | "support": { 2480 | "source": "https://github.com/symfony/stopwatch/tree/v6.4.3" 2481 | }, 2482 | "funding": [ 2483 | { 2484 | "url": "https://symfony.com/sponsor", 2485 | "type": "custom" 2486 | }, 2487 | { 2488 | "url": "https://github.com/fabpot", 2489 | "type": "github" 2490 | }, 2491 | { 2492 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2493 | "type": "tidelift" 2494 | } 2495 | ], 2496 | "time": "2024-01-23T14:35:58+00:00" 2497 | }, 2498 | { 2499 | "name": "symfony/string", 2500 | "version": "v6.4.3", 2501 | "source": { 2502 | "type": "git", 2503 | "url": "https://github.com/symfony/string.git", 2504 | "reference": "7a14736fb179876575464e4658fce0c304e8c15b" 2505 | }, 2506 | "dist": { 2507 | "type": "zip", 2508 | "url": "https://api.github.com/repos/symfony/string/zipball/7a14736fb179876575464e4658fce0c304e8c15b", 2509 | "reference": "7a14736fb179876575464e4658fce0c304e8c15b", 2510 | "shasum": "" 2511 | }, 2512 | "require": { 2513 | "php": ">=8.1", 2514 | "symfony/polyfill-ctype": "~1.8", 2515 | "symfony/polyfill-intl-grapheme": "~1.0", 2516 | "symfony/polyfill-intl-normalizer": "~1.0", 2517 | "symfony/polyfill-mbstring": "~1.0" 2518 | }, 2519 | "conflict": { 2520 | "symfony/translation-contracts": "<2.5" 2521 | }, 2522 | "require-dev": { 2523 | "symfony/error-handler": "^5.4|^6.0|^7.0", 2524 | "symfony/http-client": "^5.4|^6.0|^7.0", 2525 | "symfony/intl": "^6.2|^7.0", 2526 | "symfony/translation-contracts": "^2.5|^3.0", 2527 | "symfony/var-exporter": "^5.4|^6.0|^7.0" 2528 | }, 2529 | "type": "library", 2530 | "autoload": { 2531 | "files": [ 2532 | "Resources/functions.php" 2533 | ], 2534 | "psr-4": { 2535 | "Symfony\\Component\\String\\": "" 2536 | }, 2537 | "exclude-from-classmap": [ 2538 | "/Tests/" 2539 | ] 2540 | }, 2541 | "notification-url": "https://packagist.org/downloads/", 2542 | "license": [ 2543 | "MIT" 2544 | ], 2545 | "authors": [ 2546 | { 2547 | "name": "Nicolas Grekas", 2548 | "email": "p@tchwork.com" 2549 | }, 2550 | { 2551 | "name": "Symfony Community", 2552 | "homepage": "https://symfony.com/contributors" 2553 | } 2554 | ], 2555 | "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", 2556 | "homepage": "https://symfony.com", 2557 | "keywords": [ 2558 | "grapheme", 2559 | "i18n", 2560 | "string", 2561 | "unicode", 2562 | "utf-8", 2563 | "utf8" 2564 | ], 2565 | "support": { 2566 | "source": "https://github.com/symfony/string/tree/v6.4.3" 2567 | }, 2568 | "funding": [ 2569 | { 2570 | "url": "https://symfony.com/sponsor", 2571 | "type": "custom" 2572 | }, 2573 | { 2574 | "url": "https://github.com/fabpot", 2575 | "type": "github" 2576 | }, 2577 | { 2578 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2579 | "type": "tidelift" 2580 | } 2581 | ], 2582 | "time": "2024-01-25T09:26:29+00:00" 2583 | } 2584 | ], 2585 | "aliases": [], 2586 | "minimum-stability": "stable", 2587 | "stability-flags": [], 2588 | "prefer-stable": false, 2589 | "prefer-lowest": false, 2590 | "platform": [], 2591 | "platform-dev": [], 2592 | "plugin-api-version": "2.6.0" 2593 | } 2594 | -------------------------------------------------------------------------------- /index.css: -------------------------------------------------------------------------------- 1 | .k-item[data-v-8f04b04a] .k-item-info{font-family:var(--font-mono)} 2 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | (function(){"use strict";function l(e,t,s,n,r,u,d,A){var i=typeof e=="function"?e.options:e;t&&(i.render=t,i.staticRenderFns=s,i._compiled=!0),n&&(i.functional=!0),u&&(i._scopeId="data-v-"+u);var o;if(d?(o=function(a){a=a||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,!a&&typeof __VUE_SSR_CONTEXT__<"u"&&(a=__VUE_SSR_CONTEXT__),r&&r.call(this,a),a&&a._registeredComponents&&a._registeredComponents.add(d)},i._ssrRegister=o):r&&(o=A?function(){r.call(this,(i.functional?this.parent:this).$root.$options.shadowRoot)}:r),o)if(i.functional){i._injectStyles=o;var L=i.render;i.render=function(V,p){return o.call(p),L(V,p)}}else{var g=i.beforeCreate;i.beforeCreate=g?[].concat(g,o):[o]}return{exports:e,options:i}}const c=["site.changeTitle","page.changeTitle","page.changeStatus","model.update"];function h(){return{total:0,added:0,untracked:0,modified:0,renamed:0,deleted:0}}const m={data:()=>({headline:null,stats:h()}),computed:{finalHeadline(){let e=this.headline;return this.stats.total&&(e+=` (${this.stats.total} changes)`),e},link(){return window.panel.$url("git").toString()},positiveStatus(){let e=[];return this.stats.added&&e.push(`${this.stats.added} added`),this.stats.untracked&&e.push(`${this.stats.untracked} untracked`),e.length?e.join(", "):null},noticeStatus(){let e=[];return this.stats.modified&&e.push(`${this.stats.modified} modified`),this.stats.renamed&&e.push(`${this.stats.renamed} renamed`),e.length?e.join(", "):null},negativeStatus(){return this.stats.deleted?`${this.stats.deleted} deleted`:null},list(){let e=[];return this.positiveStatus&&e.push({text:this.positiveStatus,image:{icon:"copy",back:"var(--color-positive)",color:"var(--color-gray-800)"}}),this.noticeStatus&&e.push({text:this.noticeStatus,image:{icon:"edit",back:"var(--color-notice)",color:"var(--color-gray-800)"}}),this.negativeStatus&&e.push({text:this.negativeStatus,image:{icon:"trash",back:"var(--color-negative)",color:"var(--color-gray-800)"}}),e.map(t=>({...t,key:t.image.icon}))}},created(){this.load().then(e=>{this.headline=e.headline,this.status()}),c.forEach(e=>this.$events.$on(e,this.status))},destroyed(){c.forEach(e=>this.$events.$off(e,this.status))},methods:{status(){this.$api.get("git/status").then(e=>{this.stats=h(),e.length&&this.updateStats(e)})},updateStats(e){this.stats.total=e.length,e.forEach(t=>{switch(t.staged||t.unstaged){case"A":this.stats.added++;break;case"?":this.stats.untracked++;break;case"M":this.stats.modified++;break;case"R":this.stats.renamed++;break;case"D":this.stats.deleted++}})}}};var f=function(){var t=this,s=t._self._c;return s("section",{staticClass:"k-section area-git-changes-list"},[s("header",{staticClass:"k-section-header"},[s("k-headline",[t._v(t._s(t.finalHeadline))]),t.list.length?s("k-button-group",[s("k-button",{attrs:{icon:"share",link:t.link}},[t._v("Open")])],1):t._e()],1),t.list.length?s("k-items",{attrs:{items:t.list}}):[s("k-empty",{attrs:{icon:"check"}},[t._v("No changes")])]],2)},_=[],v=l(m,f,_,!1,null,null,null,null);const k=v.exports,$={props:{title:{type:String},data:{type:Array}},data(){return{perPage:15,pageIdx:0}},computed:{pages(){return this.data.reduce((e,t,s)=>{let n=Math.floor(s/this.perPage);return(e[n]||(e[n]=[])).push(t),e},[])},page(){return this.pages[this.pageIdx]||(this.pageIdx=0),this.pages[this.pageIdx]},entries(){return this.page?this.page.map(e=>{let t={back:"black",icon:"question",color:"var(--color-gray-800)"};switch(e.mode){case"?":case"A":t.back="var(--color-positive)",t.icon="copy";break;case"M":t.back="var(--color-notice)",t.icon="edit";break;case"R":t.back="var(--color-notice)",t.icon="refresh";break;case"D":t.back="var(--color-negative)",t.icon="trash"}return{text:e.file,image:t}}):null}},methods:{changePage(e){this.pageIdx=e.page-1}}};var b=function(){var t=this,s=t._self._c;return s("section",{staticClass:"area-git-changes-list"},[s("header",{staticClass:"k-section-header"},[s("k-headline",[t._v(t._s(t.title))]),t._t("action")],2),t.entries?s("k-items",{attrs:{items:t.entries}}):[s("k-empty",{attrs:{icon:"check"}},[t._v("No changes")])],s("k-pagination",{attrs:{align:"center",details:!0,page:t.pageIdx+1,total:t.data.length,limit:t.perPage},on:{paginate:t.changePage}})],2)},P=[],C=l($,b,P,!1,null,null,null,null);const S=C.exports,M="",D={props:{data:Object},data(){return{page:1,limit:15}},computed:{listItems(){var e;return(e=this.data)==null?void 0:e.commits.map(t=>({key:t.hash,text:t.subject,info:t.hash,image:{back:t.new?"green":"black",icon:t.new?"upload":"circle-filled",color:t.new?"gray-800":"gray-500"}}))}},created(){this.$emit("paginate",{page:this.page,limit:this.limit})}};var w=function(){var t=this,s=t._self._c;return s("section",[s("header",{staticClass:"k-section-header"},[s("k-headline",[t._v("Commits")]),t._t("action")],2),t.listItems?s("k-items",{attrs:{items:t.listItems}}):[s("k-empty",{attrs:{icon:"circle-filled"}},[t._v("No commits")])],t.data?s("k-pagination",t._g({attrs:{align:"center",details:!0,page:t.page,total:t.data.total,limit:t.limit}},t.$listeners)):t._e()],2)},x=[],y=l(D,w,x,!1,null,"8f04b04a",null,null);const R=y.exports,I={components:{ChangesList:S,CommitsList:R},data(){return{staged:[],unstaged:[],commitData:{message:null},logData:null,logPgn:null,isPulling:!1,isPushing:!1}},computed:{canPull(){return!this.isPushing&&!this.isPulling},canPush(){var e;return!this.isPushing&&!this.isPulling&&((e=this.logData)==null?void 0:e.new)}},created(){this.$api.get("git/status").then(e=>{this.updateStatus(e)}).catch(e=>{this.$store.dispatch("notification/error",e)})},methods:{updateStatus(e){this.staged=[],this.unstaged=[],e.forEach(t=>{t.unstaged&&this.unstaged.push({file:t.file,mode:t.unstaged}),t.staged&&t.staged!=="?"&&this.staged.push({file:t.file,mode:t.staged})})},add(){this.$api.post("git/add").then(()=>this.$api.get("git/status")).then(e=>{this.updateStatus(e)})},commit(){this.$api.post("git/commit",this.commitData).then(()=>(this.$refs.commitDialog.close(),this.$api.get("git/status"))).then(e=>{this.commitData.message=null,this.updateStatus(e)}).catch(e=>{this.$refs.commitDialog.error(e.message)}).then(()=>{this.listCommits()})},paginateLog(e){this.logPgn={page:e.page,limit:e.limit},this.listCommits()},listCommits(){return this.$api.get("git/log",this.logPgn).then(e=>{this.logData=e})},push(){this.isPushing=!0,this.$api.post("git/push").then(()=>this.listCommits()).catch(e=>{this.$store.dispatch("notification/error",e)}).then(()=>{this.isPushing=!1})},pull(){this.isPulling=!0,this.$api.get("git/pull").then(()=>this.listCommits()).catch(e=>{this.$store.dispatch("notification/error",e)}).then(()=>{this.isPulling=!1})}}};var E=function(){var t=this,s=t._self._c;return s("k-inside",[s("k-view",[s("k-header",[t._v("Version Control")]),s("k-grid",{attrs:{gutter:"medium"}},[s("k-column",{attrs:{width:"1/3"}},[s("changes-list",{attrs:{title:"Unstaged",data:this.unstaged}},[this.unstaged.length?s("k-button-group",{attrs:{slot:"action"},slot:"action"},[s("k-button",{attrs:{icon:"add"},on:{click:t.add}},[t._v("Add")])],1):t._e()],1)],1),s("k-column",{attrs:{width:"1/3"}},[s("changes-list",{attrs:{title:"Staged",data:this.staged}},[this.staged.length?s("k-button-group",{attrs:{slot:"action"},slot:"action"},[s("k-button",{attrs:{icon:"circle-filled"},on:{click:function(n){return t.$refs.commitDialog.open()}}},[t._v(" Commit ")])],1):t._e()],1),s("k-dialog",{ref:"commitDialog",attrs:{theme:"positive"},on:{submit:function(n){return t.$refs.commitForm.submit()}}},[s("k-form",{ref:"commitForm",attrs:{fields:{message:{type:"text",label:"Message",required:!0}}},on:{submit:t.commit},model:{value:t.commitData,callback:function(n){t.commitData=n},expression:"commitData"}})],1)],1),s("k-column",{attrs:{width:"1/3"}},[s("commits-list",{attrs:{data:t.logData},on:{paginate:t.paginateLog}},[s("k-button-group",{attrs:{slot:"action"},slot:"action"},[s("k-button",{attrs:{icon:"download",disabled:!t.canPull},on:{click:t.pull}},[t._v(" "+t._s(t.isPulling?"Pulling\u2026":"Pull")+" ")]),s("k-button",{attrs:{icon:"upload",theme:"positive",disabled:!t.canPush},on:{click:t.push}},[t._v(" "+t._s(t.isPushing?"Pushing\u2026":"Push")+" ")])],1)],1)],1)],1)],1)],1)},T=[],F=l(I,E,T,!1,null,null,null,null);const N=F.exports;panel.plugin("oblik/git",{sections:{git:k},components:{"k-git-view":N}})})(); 2 | -------------------------------------------------------------------------------- /index.php: -------------------------------------------------------------------------------- 1 | 'lib/Git.php' 11 | ], __DIR__); 12 | 13 | App::plugin('oblik/git', [ 14 | 'areas' => [ 15 | 'git' => function () { 16 | return [ 17 | 'label' => 'Git', 18 | 'icon' => 'box', 19 | 'menu' => true, 20 | 'views' => [ 21 | [ 22 | 'pattern' => 'git', 23 | 'action' => function () { 24 | return [ 25 | 'component' => 'k-git-view' 26 | ]; 27 | } 28 | ] 29 | ] 30 | ]; 31 | } 32 | ], 33 | 'options' => [ 34 | 'bin' => 'git', 35 | 'repo' => kirby()->root('index'), 36 | 'remote' => 'origin', 37 | 'merge' => 'master', 38 | 'log' => false 39 | ], 40 | 'sections' => [ 41 | 'git' => require 'lib/section.php' 42 | ], 43 | 'api' => [ 44 | 'routes' => require 'lib/routes.php' 45 | ], 46 | 'hooks' => require 'lib/hooks.php' 47 | ]); 48 | -------------------------------------------------------------------------------- /lib/Git.php: -------------------------------------------------------------------------------- 1 | config = $config; 44 | $this->bin = $this->option('bin'); 45 | $this->repo = realpath($this->option('repo')); 46 | 47 | if ($this->repo === false) { 48 | throw new Exception('Inavlid repo path'); 49 | } 50 | 51 | $this->branchCurrent = $this->branch(); 52 | 53 | if (empty($this->branchCurrent)) { 54 | throw new Exception('No checked out branch'); 55 | } 56 | 57 | $this->branchMerge = $this->option('merge'); 58 | $this->remote = $this->option('remote'); 59 | $this->logfile = $this->option('log'); 60 | } 61 | 62 | public function option(string $name) 63 | { 64 | return $this->config[$name] ?? option("oblik.git.$name", null); 65 | } 66 | 67 | public function exec(string $command) 68 | { 69 | $code = null; 70 | $output = []; 71 | $cmd = "{$this->bin} -C {$this->repo} {$command} 2>&1"; 72 | 73 | if ($this->logfile) { 74 | file_put_contents($this->logfile, $cmd . PHP_EOL, FILE_APPEND); 75 | } 76 | 77 | exec($cmd, $output, $code); 78 | 79 | if ($code !== 0) { 80 | $message = implode(PHP_EOL, $output); 81 | throw new Exception($this->deduceError($message) ?? $message); 82 | } 83 | 84 | return $output; 85 | } 86 | 87 | public function deduceError(string $message) 88 | { 89 | if ( 90 | strpos($message, 'usage: git ') !== false || 91 | strpos($message, 'not a git command') !== false 92 | ) { 93 | return 'It seems you have an outdated Git version: ' . $this->version(); 94 | } 95 | 96 | if ( 97 | strpos($message, 'Not possible to fast-forward') !== false || 98 | strpos($message, 'would be overwritten by merge') !== false 99 | ) { 100 | return 'Refusing to pull remote changes because they’re not merged with the local changes.'; 101 | } 102 | } 103 | 104 | public function version() 105 | { 106 | $version = null; 107 | 108 | try { 109 | $output = []; 110 | exec('git --version', $output); 111 | $version = implode('', $output); 112 | } catch (Exception $e) { 113 | $version = 'unknown'; 114 | } 115 | 116 | return $version; 117 | } 118 | 119 | public function branch() 120 | { 121 | return $this->exec('branch --show-current')[0] ?? null; 122 | } 123 | 124 | public function status() 125 | { 126 | $output = $this->exec('status -u --porcelain'); 127 | 128 | $data = array_map(function ($line) { 129 | $matches = null; 130 | $data = []; 131 | 132 | if (preg_match('!(.{2}) (.+)!', $line, $matches)) { 133 | $axes = str_split($matches[1]); 134 | $data['file'] = $matches[2]; 135 | 136 | if ($axes[0] !== ' ') { 137 | $data['staged'] = $axes[0]; 138 | } 139 | 140 | if ($axes[1] !== ' ') { 141 | $data['unstaged'] = $axes[1]; 142 | } 143 | } 144 | 145 | return $data; 146 | }, $output); 147 | 148 | return array_filter_recursive($data); 149 | } 150 | 151 | public function add() 152 | { 153 | return $this->exec('add . --verbose'); 154 | } 155 | 156 | public function commit($message) 157 | { 158 | $committer = kirby()->user(); 159 | $name = $committer->name()->value(); 160 | $email = $committer->email(); 161 | 162 | if (empty($name) || empty($email)) { 163 | $name = 'Kirby Git'; 164 | $email = 'hello@oblik.studio'; 165 | } 166 | 167 | $message = escapeshellarg($message); 168 | $name = escapeshellarg($name); 169 | $email = escapeshellarg($email); 170 | 171 | return $this->exec("-c user.name={$name} -c user.email={$email} commit --message={$message} --no-status"); 172 | } 173 | 174 | public function log(int $page, int $limit) 175 | { 176 | $list = $this->exec("rev-list --count {$this->branchCurrent}"); 177 | $count = (int) ($list[0] ?? 0); 178 | 179 | $new = $this->exec("log {$this->remote}/{$this->branchCurrent}..{$this->branchCurrent} --format=%h"); 180 | 181 | $format = '"%h|%an|%ae|%ad|%s"'; 182 | $skip = escapeshellarg(($page - 1) * $limit); 183 | $limit = escapeshellarg($limit); 184 | $commits = $this->exec("log {$this->branchCurrent} --pretty=format:{$format} --skip={$skip} --max-count={$limit}"); 185 | 186 | foreach ($commits as $i => $str) { 187 | $data = str_getcsv($str, '|'); 188 | $hash = $data[0]; 189 | 190 | $commits[$i] = [ 191 | 'new' => in_array($hash, $new) !== false, 192 | 'hash' => $hash, 193 | 'name' => $data[1], 194 | 'email' => $data[2], 195 | 'date' => $data[3], 196 | 'subject' => $data[4] 197 | ]; 198 | } 199 | 200 | return [ 201 | 'total' => $count, 202 | 'new' => count($new), 203 | 'commits' => $commits 204 | ]; 205 | } 206 | 207 | public function push() 208 | { 209 | return $this->exec("push {$this->remote} {$this->branchCurrent}"); 210 | } 211 | 212 | public function pull() 213 | { 214 | return $this->exec("pull {$this->remote} {$this->branchMerge} --ff-only"); 215 | } 216 | } 217 | -------------------------------------------------------------------------------- /lib/hooks.php: -------------------------------------------------------------------------------- 1 | 'git/status', 8 | 'method' => 'get', 9 | 'action' => function () { 10 | return (new Git())->status(); 11 | } 12 | ], 13 | [ 14 | 'pattern' => 'git/add', 15 | 'method' => 'post', 16 | 'action' => function () { 17 | return (new Git())->add(); 18 | } 19 | ], 20 | [ 21 | 'pattern' => 'git/commit', 22 | 'method' => 'post', 23 | 'action' => function () { 24 | $data = kirby()->request()->data(); 25 | $message = $data['message'] ?? null; 26 | 27 | return (new Git())->commit($message); 28 | } 29 | ], 30 | [ 31 | 'pattern' => 'git/log', 32 | 'method' => 'get', 33 | 'action' => function () { 34 | $data = kirby()->request()->data(); 35 | $page = (int) ($data['page'] ?? 1); 36 | $limit = (int) ($data['limit'] ?? 50); 37 | 38 | return (new Git())->log($page, $limit); 39 | } 40 | ], 41 | [ 42 | 'pattern' => 'git/push', 43 | 'method' => 'post', 44 | 'action' => function () { 45 | return (new Git())->push(); 46 | } 47 | ], 48 | [ 49 | 'pattern' => 'git/pull', 50 | 'method' => 'get', 51 | 'action' => function () { 52 | return (new Git())->pull(); 53 | } 54 | ] 55 | ]; 56 | -------------------------------------------------------------------------------- /lib/section.php: -------------------------------------------------------------------------------- 1 | [ 5 | 'headline' => function ($headline = 'Git') { 6 | return $headline; 7 | } 8 | ] 9 | ]; 10 | -------------------------------------------------------------------------------- /lib/util.php: -------------------------------------------------------------------------------- 1 | id(); 27 | } 28 | 29 | try { 30 | $git->add(); 31 | $git->commit($message); 32 | } catch (Exception $e) { 33 | } 34 | }; 35 | } 36 | --------------------------------------------------------------------------------