From e8ed2ba7b7ce678a51520068ee458a4a22d14d19 Mon Sep 17 00:00:00 2001 From: Sebastian Meyer Date: Mon, 22 Jan 2024 11:52:39 +0100 Subject: [PATCH 01/72] Update task-for-the-development-fund.md for 2024 --- .github/ISSUE_TEMPLATE/task-for-the-development-fund.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/task-for-the-development-fund.md b/.github/ISSUE_TEMPLATE/task-for-the-development-fund.md index 01d219d11..f67eef870 100644 --- a/.github/ISSUE_TEMPLATE/task-for-the-development-fund.md +++ b/.github/ISSUE_TEMPLATE/task-for-the-development-fund.md @@ -2,7 +2,7 @@ name: Task for the development fund about: A working package which may be sponsored by the Kitodo e.V. development fund. title: "[FUND] " -labels: ⭐ development fund 2023 +labels: ⭐ development fund 2024 assignees: '' --- From a1c989537c23070a55f217f6ffe6da86d066d4fd Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Fri, 26 Jan 2024 18:20:09 +0100 Subject: [PATCH 02/72] [BUGFIX] Fix parameter type for `$collections` in `CollectionController` (#1108) Co-authored-by: Sebastian Meyer --- Classes/Common/Solr/SolrSearch.php | 7 ++++--- Classes/Controller/CollectionController.php | 8 ++++---- Classes/Controller/ListViewController.php | 5 ++--- Classes/Domain/Repository/DocumentRepository.php | 4 +++- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/Classes/Common/Solr/SolrSearch.php b/Classes/Common/Solr/SolrSearch.php index 178bcb35b..17af84579 100644 --- a/Classes/Common/Solr/SolrSearch.php +++ b/Classes/Common/Solr/SolrSearch.php @@ -6,7 +6,6 @@ use Kitodo\Dlf\Common\Helper; use Kitodo\Dlf\Common\Indexer; use Kitodo\Dlf\Common\Solr\SearchResult\ResultDocument; -use Kitodo\Dlf\Domain\Model\Collection; use Kitodo\Dlf\Domain\Repository\DocumentRepository; use Solarium\QueryType\Select\Result\Document; use TYPO3\CMS\Core\Cache\CacheManager; @@ -38,8 +37,9 @@ class SolrSearch implements \Countable, \Iterator, \ArrayAccess, QueryResultInte /** * @access private - * @var QueryResult|Collection|null + * @var array|null */ + // TODO: confusing naming, here is passed array of collections and it is used as array in prepare() private $collection; /** @@ -84,7 +84,7 @@ class SolrSearch implements \Countable, \Iterator, \ArrayAccess, QueryResultInte * @access public * * @param DocumentRepository $documentRepository - * @param QueryResult|Collection|null $collection + * @param array|null $collection * @param array $settings * @param array $searchParams * @param QueryResult $listedMetadata @@ -433,6 +433,7 @@ public function prepare() } // if collections are given, we prepare the collection query string + // TODO: this->collection should not be actually called collections? if ($this->collection) { $collectionsQueryString = ''; $virtualCollectionsQueryString = ''; diff --git a/Classes/Controller/CollectionController.php b/Classes/Controller/CollectionController.php index a7b678e66..19c3c990e 100644 --- a/Classes/Controller/CollectionController.php +++ b/Classes/Controller/CollectionController.php @@ -157,7 +157,7 @@ public function showAction(Collection $collection): void // get all documents of given collection $solrResults = null; if (is_array($searchParams) && !empty($searchParams)) { - $solrResults = $this->documentRepository->findSolrByCollection($collection, $this->settings, $searchParams, $listedMetadata); + $solrResults = $this->documentRepository->findSolrByCollection([$collection], $this->settings, $searchParams, $listedMetadata); $itemsPerPage = $this->settings['list']['paginate']['itemsPerPage']; if (empty($itemsPerPage)) { @@ -206,12 +206,12 @@ public function showSortedAction(): void * * @access private * - * @param array $collections to be processed + * @param QueryResultInterface|array|object $collections to be processed * @param Solr $solr for query * * @return array */ - private function processCollections(array $collections, Solr $solr): array + private function processCollections($collections, Solr $solr): array { $processedCollections = []; @@ -253,7 +253,7 @@ private function processCollections(array $collections, Solr $solr): array // Generate random but unique array key taking amount of documents into account. do { - $key = (count($collection['priority']) * 1000) + random_int(0, 1000); + $key = ($collection->getPriority() * 1000) + random_int(0, 1000); } while (!empty($processedCollections[$key])); $processedCollections[$key]['collection'] = $collection; diff --git a/Classes/Controller/ListViewController.php b/Classes/Controller/ListViewController.php index e6a660f0a..527496ea5 100644 --- a/Classes/Controller/ListViewController.php +++ b/Classes/Controller/ListViewController.php @@ -80,7 +80,7 @@ public function mainAction(): void $this->searchParams = $this->getParametersSafely('searchParameter'); // extract collection(s) from collection parameter - $collection = null; + $collection = []; if ($this->searchParams['collection']) { foreach(explode(',', $this->searchParams['collection']) as $collectionEntry) { $collection[] = $this->collectionRepository->findByUid((int) $collectionEntry); @@ -102,8 +102,7 @@ public function mainAction(): void $solrResults = null; $numResults = 0; if (is_array($this->searchParams) && !empty($this->searchParams)) { - // @phpstan-ignore-next-line - $solrResults = $this->documentRepository->findSolrByCollection($collection ? : null, $this->settings, $this->searchParams, $listedMetadata); + $solrResults = $this->documentRepository->findSolrByCollection($collection, $this->settings, $this->searchParams, $listedMetadata); $numResults = $solrResults->getNumFound(); $itemsPerPage = $this->settings['list']['paginate']['itemsPerPage']; diff --git a/Classes/Domain/Repository/DocumentRepository.php b/Classes/Domain/Repository/DocumentRepository.php index 6544b57dc..a525317c9 100644 --- a/Classes/Domain/Repository/DocumentRepository.php +++ b/Classes/Domain/Repository/DocumentRepository.php @@ -572,13 +572,15 @@ public function findChildrenOfEach(array $uids) * * @access public * - * @param QueryResult|Collection|null $collection + * @param array|null $collection * @param array $settings * @param array $searchParams * @param QueryResult $listedMetadata * * @return SolrSearch */ + // TODO: function name says ByCollection, but inside the SolrSearch->prepare() is expected + // TODO: that collection is an array of collections public function findSolrByCollection($collection, $settings, $searchParams, $listedMetadata = null) { // set settings global inside this repository From f1aee5bbd2c51e93e8cba7b0b3607919697e05b0 Mon Sep 17 00:00:00 2001 From: Bernd Fallert Date: Fri, 26 Jan 2024 18:24:11 +0100 Subject: [PATCH 03/72] [BUGFIX] Fix scrolling of text in #tx-dlf-fulltextselection to the text under the cursor (#1116) Co-authored-by: Bernd Fallert Co-authored-by: Sebastian Meyer --- .../JavaScript/PageView/FulltextControl.js | 75 +++++++++++++++---- .../Public/JavaScript/PageView/Utility.js | 2 +- 2 files changed, 63 insertions(+), 14 deletions(-) diff --git a/Resources/Public/JavaScript/PageView/FulltextControl.js b/Resources/Public/JavaScript/PageView/FulltextControl.js index 5d1b13a0e..39366658a 100644 --- a/Resources/Public/JavaScript/PageView/FulltextControl.js +++ b/Resources/Public/JavaScript/PageView/FulltextControl.js @@ -62,7 +62,6 @@ dlfFulltextSegments.prototype.populate = function (features) { dlfFulltextSegments.prototype.coordinateToFeature = function (coordinate) { for (var i = 0; i < this.segments_.length; i++) { var segment = this.segments_[i]; - if (ol.extent.containsCoordinate(segment.extent, coordinate)) { return segment.feature; } @@ -86,7 +85,7 @@ var dlfViewerFullTextControl = function(map) { * @type {Object} * @private */ - this.dic = $('#tx-dlf-tools-fulltext').length > 0 && $('#tx-dlf-tools-fulltext').attr('data-dic') ? + this.dic = $('#tx-dlf-tools-fulltext').length > 0 && $('#tx-dlf-tools-fulltext').data('dic') ? dlfUtils.parseDataDic($('#tx-dlf-tools-fulltext')) : { 'fulltext':'Fulltext', @@ -94,7 +93,7 @@ var dlfViewerFullTextControl = function(map) { 'fulltext-on':'Activate Fulltext', 'fulltext-off':'Deactivate Fulltext', 'activate-full-text-initially':'0', - 'full-text-scroll-element':'html, body'}; + 'full-text-scroll-element':'#tx-dlf-fulltextselection'}; /** * @private @@ -112,7 +111,13 @@ var dlfViewerFullTextControl = function(map) { * @type {string} * @private */ - this.fullTextScrollElement = this.dic['full-text-scroll-element']; + let regex = /[^A-Za-z0-9\.\-\#\s_]/g; + let fullTextScrollElementUnChecked = this.dic['full-text-scroll-element']; + if (regex.fullTextScrollElementUnChecked) { + this.fullTextScrollElement = ""; + } else { + this.fullTextScrollElement = fullTextScrollElementUnChecked; + } /** * @type {Object} @@ -158,6 +163,13 @@ var dlfViewerFullTextControl = function(map) { */ this.lastRenderedFeatures_ = undefined; + /** + * @type {Array} + * @private + */ + this.positions = {}; + + /** * @type {dlfFulltextSegments} * @private @@ -230,7 +242,7 @@ var dlfViewerFullTextControl = function(map) { this) }; - $('#tx-dlf-fulltextselection').text(this.dic['fulltext-loading']); + $('html').find(this.fullTextScrollElement).text(this.dic['fulltext-loading']); this.changeActiveBehaviour(); }; @@ -329,6 +341,34 @@ dlfViewerFullTextControl.prototype.addActiveBehaviourForSwitchOff = function() { } }; +/** + * Recalculate position of text lines if full text container was resized + */ +dlfViewerFullTextControl.prototype.onResize = function() { + if (this.element != undefined && this.element.css('width') != this.lastHeight) { + this.lastHeight = this.element.css('width'); + this.calculatePositions(); + } +}; + +/** + * Calculate positions of text lines for scrolling + */ +dlfViewerFullTextControl.prototype.calculatePositions = function() { + this.positions.length = 0; + + let texts = $('html').find(this.fullTextScrollElement).children('span.textline'); + // check if fulltext exists for this page + if (texts.length > 0) { + let offset = $('#' + texts[0].id).position().top; + + for(let text of texts) { + let pos = $('#' + text.id).position().top; + this.positions[text.id] = pos - offset; + } + } +}; + /** * Handle layers for click * @param {ol.Feature|undefined} feature @@ -416,7 +456,8 @@ dlfViewerFullTextControl.prototype.addHighlightEffect = function(textlineFeature if (targetElem.length > 0 && !targetElem.hasClass('highlight')) { targetElem.addClass('highlight'); - setTimeout(this.scrollToText, 1000, targetElem, this.fullTextScrollElement); + this.onResize(); + setTimeout(this.scrollToText, 1000, targetElem, this.fullTextScrollElement, this.positions); hoverSourceTextline_.addFeature(textlineFeature); } } @@ -427,10 +468,10 @@ dlfViewerFullTextControl.prototype.addHighlightEffect = function(textlineFeature * @param {any} element * @param {string} fullTextScrollElement */ -dlfViewerFullTextControl.prototype.scrollToText = function(element, fullTextScrollElement) { +dlfViewerFullTextControl.prototype.scrollToText = function(element, fullTextScrollElement, positions) { if (element.hasClass('highlight')) { $(fullTextScrollElement).animate({ - scrollTop: element.offset().top + scrollTop: positions[element[0].id] }, 500); } }; @@ -498,8 +539,9 @@ dlfViewerFullTextControl.prototype.disableFulltextSelect = function() { .attr('title', this.dic['fulltext-on']); } - $('#tx-dlf-fulltextselection').removeClass(className); - $('#tx-dlf-fulltextselection').hide(); + $('html').find(this.fullTextScrollElement).removeClass(className); + $('html').find(this.fullTextScrollElement).hide(); + $('body').removeClass(className); }; @@ -530,8 +572,8 @@ dlfViewerFullTextControl.prototype.enableFulltextSelect = function() { .attr('title', this.dic['fulltext-off']); } - $('#tx-dlf-fulltextselection').addClass(className); - $('#tx-dlf-fulltextselection').show(); + $('html').find(this.fullTextScrollElement).addClass(className); + $('html').find(this.fullTextScrollElement).show(); $('body').addClass(className); }; @@ -564,7 +606,13 @@ dlfViewerFullTextControl.prototype.showFulltext = function(features) { return; } - var target = document.getElementById('tx-dlf-fulltextselection'); + // in getElementById no '#' is necessary / allowed at the beginning + // of the string. Therefor remove '#' if present + let fullTextScrollElementId = this.fullTextScrollElement; + if (fullTextScrollElementId.substr(0,1) === '#') { + fullTextScrollElementId = fullTextScrollElementId.substr(1); + } + var target = document.getElementById(fullTextScrollElementId); if (target !== null) { target.innerHTML = ""; for (var feature of features) { @@ -576,6 +624,7 @@ dlfViewerFullTextControl.prototype.showFulltext = function(features) { target.append(document.createElement('br'), document.createElement('br')); } + this.calculatePositions(); this.lastRenderedFeatures_ = features; } }; diff --git a/Resources/Public/JavaScript/PageView/Utility.js b/Resources/Public/JavaScript/PageView/Utility.js index bd30ff3cc..b919e1c83 100644 --- a/Resources/Public/JavaScript/PageView/Utility.js +++ b/Resources/Public/JavaScript/PageView/Utility.js @@ -556,7 +556,7 @@ dlfUtils.isFulltextDescriptor = function (obj) { * @return {Object} */ dlfUtils.parseDataDic = function (element) { - var dataDicString = $(element).attr('data-dic') || '', + var dataDicString = $('html').find(element).data('dic') || '', dataDicRecords = dataDicString.split(';'), dataDic = {}; From ab70daa94f8a28643357bc8ad72b587233535a80 Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Fri, 26 Jan 2024 18:30:00 +0100 Subject: [PATCH 04/72] [MAINTENANCE] Improvements in MetsDocument class (#1118) Co-authored-by: Sebastian Meyer --- Classes/Common/MetsDocument.php | 296 +++++++++++++++++++------------- 1 file changed, 175 insertions(+), 121 deletions(-) diff --git a/Classes/Common/MetsDocument.php b/Classes/Common/MetsDocument.php index 440bd68db..9cde10cfa 100644 --- a/Classes/Common/MetsDocument.php +++ b/Classes/Common/MetsDocument.php @@ -195,7 +195,7 @@ public function getDownloadLocation(string $id): string IiifHelper::setMaxThumbnailHeight($conf['iiifThumbnailHeight']); IiifHelper::setMaxThumbnailWidth($conf['iiifThumbnailWidth']); $service = IiifHelper::loadIiifResource($file['location']); - if ($service !== null && $service instanceof AbstractImageService) { + if ($service instanceof AbstractImageService) { return $service->getImageUrl(); } } elseif ($file['mimeType'] === 'application/vnd.netfpx') { @@ -310,8 +310,7 @@ protected function getLogicalStructureInfo(\SimpleXMLElement $structure, bool $r foreach ($structure->attributes() as $attribute => $value) { $attributes[$attribute] = (string) $value; } - // Load plugin configuration. - $extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get(self::$extKey); + // Extract identity information. $details = []; $details['id'] = $attributes['ID']; @@ -358,29 +357,17 @@ protected function getLogicalStructureInfo(\SimpleXMLElement $structure, bool $r && array_key_exists($details['id'], $this->smLinks['l2p']) ) { // Link logical structure to the first corresponding physical page/track. - $details['points'] = max(intval(array_search($this->smLinks['l2p'][$details['id']][0], $this->physicalStructure, true)), 1); - $fileGrpsThumb = GeneralUtility::trimExplode(',', $extConf['fileGrpThumbs']); - while ($fileGrpThumb = array_shift($fileGrpsThumb)) { - if (!empty($this->physicalStructureInfo[$this->smLinks['l2p'][$details['id']][0]]['files'][$fileGrpThumb])) { - $details['thumbnailId'] = $this->physicalStructureInfo[$this->smLinks['l2p'][$details['id']][0]]['files'][$fileGrpThumb]; - break; - } - } + $details['points'] = max((int) array_search($this->smLinks['l2p'][$details['id']][0], $this->physicalStructure, true), 1); + $details['thumbnailId'] = $this->getThumbnail(); // Get page/track number of the first page/track related to this structure element. $details['pagination'] = $this->physicalStructureInfo[$this->smLinks['l2p'][$details['id']][0]]['orderlabel']; } elseif ($details['id'] == $this->magicGetToplevelId()) { // Point to self if this is the toplevel structure. $details['points'] = 1; - $fileGrpsThumb = GeneralUtility::trimExplode(',', $extConf['fileGrpThumbs']); - while ($fileGrpThumb = array_shift($fileGrpsThumb)) { - if ( - !empty($this->physicalStructure) - && !empty($this->physicalStructureInfo[$this->physicalStructure[1]]['files'][$fileGrpThumb]) - ) { - $details['thumbnailId'] = $this->physicalStructureInfo[$this->physicalStructure[1]]['files'][$fileGrpThumb]; - break; - } - } + $details['thumbnailId'] = $this->getThumbnail(); + } + if ($details['thumbnailId'] === null) { + unset($details['thumbnailId']); } // Get the files this structure element is pointing at. $details['files'] = []; @@ -408,13 +395,45 @@ protected function getLogicalStructureInfo(\SimpleXMLElement $structure, bool $r return $details; } + /** + * Get thumbnail for logical structure info. + * + * @access private + * + * @param string $id empty if top level document, else passed the id of parent document + * + * @return ?string thumbnail or null if not found + */ + private function getThumbnail(string $id = '') + { + // Load plugin configuration. + $extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get(self::$extKey); + $fileGrpsThumb = GeneralUtility::trimExplode(',', $extConf['fileGrpThumbs']); + + $thumbnail = null; + + while ($fileGrpThumb = array_shift($fileGrpsThumb)) { + if (empty($id)) { + $thumbnail = $this->physicalStructureInfo[$this->physicalStructure[1]]['files'][$fileGrpThumb] ?? null; + } else { + $parentId = $this->smLinks['l2p'][$id][0] ?? null; + $thumbnail = $this->physicalStructureInfo[$parentId]['files'][$fileGrpThumb] ?? null; + } + + if (!empty($thumbnail)) { + break; + } + } + return $thumbnail; + } + /** * @see AbstractDocument::getMetadata() */ public function getMetadata(string $id, int $cPid = 0): array { // Make sure $cPid is a non-negative integer. - $cPid = max(intval($cPid), 0); + $cPid = max((int) $cPid, 0); // If $cPid is not given, try to get it elsewhere. if ( !$cPid @@ -464,98 +483,18 @@ public function getMetadata(string $id, int $cPid = 0): array continue; } - // Is this metadata format supported? - if (!empty($this->formats[$this->mdSec[$dmdId]['type']])) { - if (!empty($this->formats[$this->mdSec[$dmdId]['type']]['class'])) { - $class = $this->formats[$this->mdSec[$dmdId]['type']]['class']; - // Get the metadata from class. - if ( - class_exists($class) - && ($obj = GeneralUtility::makeInstance($class)) instanceof MetadataInterface - ) { - $obj->extractMetadata($this->mdSec[$dmdId]['xml'], $metadata, GeneralUtility::makeInstance(ExtensionConfiguration::class)->get(self::$extKey)['useExternalApisForMetadata']); - } else { - $this->logger->warning('Invalid class/method "' . $class . '->extractMetadata()" for metadata format "' . $this->mdSec[$dmdId]['type'] . '"'); - } - } - } else { - $this->logger->notice('Unsupported metadata format "' . $this->mdSec[$dmdId]['type'] . '" in ' . $mdSectionType . ' with @ID "' . $dmdId . '"'); - // Continue searching for supported metadata with next @DMDID. + // Continue searching for supported metadata with next @DMDID if the current one is not supported + if (!$this->extractMetadataIfTypeSupported($dmdId, $mdSectionType, $metadata)) { continue; } - // Get the additional metadata from database. - $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class) - ->getQueryBuilderForTable('tx_dlf_metadata'); - // Get hidden records, too. - $queryBuilder - ->getRestrictions() - ->removeByType(HiddenRestriction::class); - // Get all metadata with configured xpath and applicable format first. - $resultWithFormat = $queryBuilder - ->select( - 'tx_dlf_metadata.index_name AS index_name', - 'tx_dlf_metadataformat_joins.xpath AS xpath', - 'tx_dlf_metadataformat_joins.xpath_sorting AS xpath_sorting', - 'tx_dlf_metadata.is_sortable AS is_sortable', - 'tx_dlf_metadata.default_value AS default_value', - 'tx_dlf_metadata.format AS format' - ) - ->from('tx_dlf_metadata') - ->innerJoin( - 'tx_dlf_metadata', - 'tx_dlf_metadataformat', - 'tx_dlf_metadataformat_joins', - $queryBuilder->expr()->eq( - 'tx_dlf_metadataformat_joins.parent_id', - 'tx_dlf_metadata.uid' - ) - ) - ->innerJoin( - 'tx_dlf_metadataformat_joins', - 'tx_dlf_formats', - 'tx_dlf_formats_joins', - $queryBuilder->expr()->eq( - 'tx_dlf_formats_joins.uid', - 'tx_dlf_metadataformat_joins.encoded' - ) - ) - ->where( - $queryBuilder->expr()->eq('tx_dlf_metadata.pid', intval($cPid)), - $queryBuilder->expr()->eq('tx_dlf_metadata.l18n_parent', 0), - $queryBuilder->expr()->eq('tx_dlf_metadataformat_joins.pid', intval($cPid)), - $queryBuilder->expr()->eq('tx_dlf_formats_joins.type', $queryBuilder->createNamedParameter($this->mdSec[$dmdId]['type'])) - ) - ->execute(); - // Get all metadata without a format, but with a default value next. - $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class) - ->getQueryBuilderForTable('tx_dlf_metadata'); - // Get hidden records, too. - $queryBuilder - ->getRestrictions() - ->removeByType(HiddenRestriction::class); - $resultWithoutFormat = $queryBuilder - ->select( - 'tx_dlf_metadata.index_name AS index_name', - 'tx_dlf_metadata.is_sortable AS is_sortable', - 'tx_dlf_metadata.default_value AS default_value', - 'tx_dlf_metadata.format AS format' - ) - ->from('tx_dlf_metadata') - ->where( - $queryBuilder->expr()->eq('tx_dlf_metadata.pid', intval($cPid)), - $queryBuilder->expr()->eq('tx_dlf_metadata.l18n_parent', 0), - $queryBuilder->expr()->eq('tx_dlf_metadata.format', 0), - $queryBuilder->expr()->neq('tx_dlf_metadata.default_value', $queryBuilder->createNamedParameter('')) - ) - ->execute(); - // Merge both result sets. - $allResults = array_merge($resultWithFormat->fetchAllAssociative(), $resultWithoutFormat->fetchAllAssociative()); + + $additionalMetadata = $this->getAdditionalMetadataFromDatabase((int) $cPid, $dmdId); // We need a \DOMDocument here, because SimpleXML doesn't support XPath functions properly. $domNode = dom_import_simplexml($this->mdSec[$dmdId]['xml']); $domXPath = new \DOMXPath($domNode->ownerDocument); $this->registerNamespaces($domXPath); // OK, now make the XPath queries. - foreach ($allResults as $resArray) { + foreach ($additionalMetadata as $resArray) { // Set metadata field's value(s). if ( $resArray['format'] > 0 @@ -631,6 +570,120 @@ class_exists($class) } } + /** + * Extract metadata if metadata type is supported. + * + * @access private + * + * @param string $dmdId descriptive metadata id + * @param string $mdSectionType metadata section type + * @param array &$metadata + * + * @return bool true if extraction successful, false otherwise + */ + private function extractMetadataIfTypeSupported(string $dmdId, string $mdSectionType, array &$metadata) + { + // Is this metadata format supported? + if (!empty($this->formats[$this->mdSec[$dmdId]['type']])) { + if (!empty($this->formats[$this->mdSec[$dmdId]['type']]['class'])) { + $class = $this->formats[$this->mdSec[$dmdId]['type']]['class']; + // Get the metadata from class. + if (class_exists($class)) { + $obj = GeneralUtility::makeInstance($class); + if ($obj instanceof MetadataInterface) { + $obj->extractMetadata($this->mdSec[$dmdId]['xml'], $metadata, GeneralUtility::makeInstance(ExtensionConfiguration::class)->get(self::$extKey)['useExternalApisForMetadata']); + return true; + } + } else { + $this->logger->warning('Invalid class/method "' . $class . '->extractMetadata()" for metadata format "' . $this->mdSec[$dmdId]['type'] . '"'); + } + } + } else { + $this->logger->notice('Unsupported metadata format "' . $this->mdSec[$dmdId]['type'] . '" in ' . $mdSectionType . ' with @ID "' . $dmdId . '"'); + } + return false; + } + + /** + * Get additional data from database. + * + * @access private + * + * @param int $cPid page id + * @param string $dmdId descriptive metadata id + * + * @return array additional metadata data queried from database + */ + private function getAdditionalMetadataFromDatabase(int $cPid, string $dmdId) + { + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class) + ->getQueryBuilderForTable('tx_dlf_metadata'); + // Get hidden records, too. + $queryBuilder + ->getRestrictions() + ->removeByType(HiddenRestriction::class); + // Get all metadata with configured xpath and applicable format first. + $resultWithFormat = $queryBuilder + ->select( + 'tx_dlf_metadata.index_name AS index_name', + 'tx_dlf_metadataformat_joins.xpath AS xpath', + 'tx_dlf_metadataformat_joins.xpath_sorting AS xpath_sorting', + 'tx_dlf_metadata.is_sortable AS is_sortable', + 'tx_dlf_metadata.default_value AS default_value', + 'tx_dlf_metadata.format AS format' + ) + ->from('tx_dlf_metadata') + ->innerJoin( + 'tx_dlf_metadata', + 'tx_dlf_metadataformat', + 'tx_dlf_metadataformat_joins', + $queryBuilder->expr()->eq( + 'tx_dlf_metadataformat_joins.parent_id', + 'tx_dlf_metadata.uid' + ) + ) + ->innerJoin( + 'tx_dlf_metadataformat_joins', + 'tx_dlf_formats', + 'tx_dlf_formats_joins', + $queryBuilder->expr()->eq( + 'tx_dlf_formats_joins.uid', + 'tx_dlf_metadataformat_joins.encoded' + ) + ) + ->where( + $queryBuilder->expr()->eq('tx_dlf_metadata.pid', $cPid), + $queryBuilder->expr()->eq('tx_dlf_metadata.l18n_parent', 0), + $queryBuilder->expr()->eq('tx_dlf_metadataformat_joins.pid', $cPid), + $queryBuilder->expr()->eq('tx_dlf_formats_joins.type', $queryBuilder->createNamedParameter($this->mdSec[$dmdId]['type'])) + ) + ->execute(); + // Get all metadata without a format, but with a default value next. + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class) + ->getQueryBuilderForTable('tx_dlf_metadata'); + // Get hidden records, too. + $queryBuilder + ->getRestrictions() + ->removeByType(HiddenRestriction::class); + $resultWithoutFormat = $queryBuilder + ->select( + 'tx_dlf_metadata.index_name AS index_name', + 'tx_dlf_metadata.is_sortable AS is_sortable', + 'tx_dlf_metadata.default_value AS default_value', + 'tx_dlf_metadata.format AS format' + ) + ->from('tx_dlf_metadata') + ->where( + $queryBuilder->expr()->eq('tx_dlf_metadata.pid', $cPid), + $queryBuilder->expr()->eq('tx_dlf_metadata.l18n_parent', 0), + $queryBuilder->expr()->eq('tx_dlf_metadata.format', 0), + $queryBuilder->expr()->neq('tx_dlf_metadata.default_value', $queryBuilder->createNamedParameter('')) + ) + ->execute(); + // Merge both result sets. + return array_merge($resultWithFormat->fetchAllAssociative(), $resultWithoutFormat->fetchAllAssociative()); + } + /** * Get IDs of (descriptive and administrative) metadata sections * referenced by node of given $id. The $id may refer to either @@ -657,7 +710,7 @@ protected function getMetadataIds(string $id): array if ($mdSec) { $dmdIds = (string) $mdSec->attributes()->DMDID; $admIds = (string) $mdSec->attributes()->ADMID; - } else if (isset($fileInfo)) { + } elseif (isset($fileInfo)) { $dmdIds = $fileInfo['dmdId']; $admIds = $fileInfo['admId']; } else { @@ -731,7 +784,7 @@ protected function init(string $location, array $settings): void } else { if (!empty($location)) { $this->logger->error('No METS part found in document with location "' . $location . '".'); - } else if (!empty($this->recordId)) { + } elseif (!empty($this->recordId)) { $this->logger->error('No METS part found in document with recordId "' . $this->recordId . '".'); } else { $this->logger->error('No METS part found in current document.'); @@ -991,20 +1044,20 @@ protected function magicGetPhysicalStructure(): array $fileUse = $this->magicGetFileGrps(); // Get the physical sequence's metadata. $physNode = $this->mets->xpath('./mets:structMap[@TYPE="PHYSICAL"]/mets:div[@TYPE="physSequence"]'); - $physSeq[0] = (string) $physNode[0]['ID']; - $this->physicalStructureInfo[$physSeq[0]]['id'] = (string) $physNode[0]['ID']; - $this->physicalStructureInfo[$physSeq[0]]['dmdId'] = (isset($physNode[0]['DMDID']) ? (string) $physNode[0]['DMDID'] : ''); - $this->physicalStructureInfo[$physSeq[0]]['admId'] = (isset($physNode[0]['ADMID']) ? (string) $physNode[0]['ADMID'] : ''); - $this->physicalStructureInfo[$physSeq[0]]['order'] = (isset($physNode[0]['ORDER']) ? (string) $physNode[0]['ORDER'] : ''); - $this->physicalStructureInfo[$physSeq[0]]['label'] = (isset($physNode[0]['LABEL']) ? (string) $physNode[0]['LABEL'] : ''); - $this->physicalStructureInfo[$physSeq[0]]['orderlabel'] = (isset($physNode[0]['ORDERLABEL']) ? (string) $physNode[0]['ORDERLABEL'] : ''); - $this->physicalStructureInfo[$physSeq[0]]['type'] = (string) $physNode[0]['TYPE']; - $this->physicalStructureInfo[$physSeq[0]]['contentIds'] = (isset($physNode[0]['CONTENTIDS']) ? (string) $physNode[0]['CONTENTIDS'] : ''); + $id = (string) $physNode[0]['ID']; + $this->physicalStructureInfo[$id]['id'] = (string) $physNode[0]['ID']; + $this->physicalStructureInfo[$id]['dmdId'] = (isset($physNode[0]['DMDID']) ? (string) $physNode[0]['DMDID'] : ''); + $this->physicalStructureInfo[$id]['admId'] = (isset($physNode[0]['ADMID']) ? (string) $physNode[0]['ADMID'] : ''); + $this->physicalStructureInfo[$id]['order'] = (isset($physNode[0]['ORDER']) ? (string) $physNode[0]['ORDER'] : ''); + $this->physicalStructureInfo[$id]['label'] = (isset($physNode[0]['LABEL']) ? (string) $physNode[0]['LABEL'] : ''); + $this->physicalStructureInfo[$id]['orderlabel'] = (isset($physNode[0]['ORDERLABEL']) ? (string) $physNode[0]['ORDERLABEL'] : ''); + $this->physicalStructureInfo[$id]['type'] = (string) $physNode[0]['TYPE']; + $this->physicalStructureInfo[$id]['contentIds'] = (isset($physNode[0]['CONTENTIDS']) ? (string) $physNode[0]['CONTENTIDS'] : ''); // Get the file representations from fileSec node. foreach ($physNode[0]->children('http://www.loc.gov/METS/')->fptr as $fptr) { // Check if file has valid @USE attribute. if (!empty($fileUse[(string) $fptr->attributes()->FILEID])) { - $this->physicalStructureInfo[$physSeq[0]]['files'][$fileUse[(string) $fptr->attributes()->FILEID]] = (string) $fptr->attributes()->FILEID; + $this->physicalStructureInfo[$id]['files'][$fileUse[(string) $fptr->attributes()->FILEID]] = (string) $fptr->attributes()->FILEID; } } // Build the physical elements' array from the physical structMap node. @@ -1031,7 +1084,8 @@ protected function magicGetPhysicalStructure(): array // Set total number of pages/tracks. $this->numPages = count($elements); // Merge and re-index the array to get numeric indexes. - $this->physicalStructure = array_merge($physSeq, $elements); + array_unshift($elements, $id); + $this->physicalStructure = $elements; } $this->physicalStructureLoaded = true; } @@ -1090,7 +1144,7 @@ protected function magicGetThumbnail(bool $forceReload = false): string ->select('tx_dlf_structures.thumbnail AS thumbnail') ->from('tx_dlf_structures') ->where( - $queryBuilder->expr()->eq('tx_dlf_structures.pid', intval($cPid)), + $queryBuilder->expr()->eq('tx_dlf_structures.pid', (int) $cPid), $queryBuilder->expr()->eq('tx_dlf_structures.index_name', $queryBuilder->expr()->literal($metadata['type'][0])), Helper::whereExpression('tx_dlf_structures') ) From 40a58cb3f3e24c3e896be8f243d60accaa602608 Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Fri, 26 Jan 2024 18:41:34 +0100 Subject: [PATCH 05/72] [BUGFIX] Add property for SOLR Core Repository in `SolrSearchQueryTest` class (#1124) Co-authored-by: Sebastian Meyer --- Tests/Functional/Common/SolrSearchQueryTest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/Tests/Functional/Common/SolrSearchQueryTest.php b/Tests/Functional/Common/SolrSearchQueryTest.php index fe145bb32..d9fb3b920 100644 --- a/Tests/Functional/Common/SolrSearchQueryTest.php +++ b/Tests/Functional/Common/SolrSearchQueryTest.php @@ -21,6 +21,7 @@ class SolrSearchQueryTest extends FunctionalTestCase { + private $solrCoreRepository; private static array $databaseFixtures = [ __DIR__ . '/../../Fixtures/Common/documents_1.csv', From 93797275e7282162046ab942f074cb6d63e46021 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20Sch=C3=B6lzel?= <142507449+fschoelzel@users.noreply.github.com> Date: Fri, 26 Jan 2024 19:03:59 +0100 Subject: [PATCH 06/72] [BUGFIX] reassign requestData to viewData after assigning default values (#1143) Co-authored-by: Sebastian Meyer --- Classes/Controller/NavigationController.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Classes/Controller/NavigationController.php b/Classes/Controller/NavigationController.php index 9371e69ab..7f9341b43 100644 --- a/Classes/Controller/NavigationController.php +++ b/Classes/Controller/NavigationController.php @@ -73,6 +73,8 @@ public function mainAction(): void } else { $this->requestData['page'] = 0; $this->requestData['double'] = 0; + // reassign requestData to viewData after assigning default values + $this->viewData['requestData'] = $this->requestData; } // Steps for X pages backward / forward. Double page view uses double steps. From 473a8312df2d79c9ab8371e16d831f783c26f82a Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Fri, 26 Jan 2024 19:07:23 +0100 Subject: [PATCH 07/72] [BUGFIX] Display paginated results only if there are some results (#1148) Co-authored-by: Sebastian Meyer --- Resources/Private/Templates/ListView/Main.html | 6 ++++-- Resources/Private/Templates/Search/Main.html | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Resources/Private/Templates/ListView/Main.html b/Resources/Private/Templates/ListView/Main.html index 2c7407da7..e3bdfb9df 100644 --- a/Resources/Private/Templates/ListView/Main.html +++ b/Resources/Private/Templates/ListView/Main.html @@ -26,9 +26,11 @@

- - + + + + diff --git a/Resources/Private/Templates/Search/Main.html b/Resources/Private/Templates/Search/Main.html index 44a06eb67..fb017d7d8 100644 --- a/Resources/Private/Templates/Search/Main.html +++ b/Resources/Private/Templates/Search/Main.html @@ -118,8 +118,10 @@ - - + + + + From 8fed85a094c3af03f508bd099b68094fb7224dcf Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Fri, 26 Jan 2024 19:15:34 +0100 Subject: [PATCH 08/72] [MAINTENANCE] Translate language code in own function (#1126) Co-authored-by: Sebastian Meyer --- Classes/Common/Solr/SolrSearch.php | 32 +++++++++++++++++++----------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/Classes/Common/Solr/SolrSearch.php b/Classes/Common/Solr/SolrSearch.php index 17af84579..677f7bcb0 100644 --- a/Classes/Common/Solr/SolrSearch.php +++ b/Classes/Common/Solr/SolrSearch.php @@ -545,12 +545,7 @@ public function submit($start, $rows, $processResults = true) $documents[$doc['uid']] = $allDocuments[$doc['uid']]; } if ($documents[$doc['uid']]) { - // translate language code if applicable - if ($doc['metadata']['language']) { - foreach ($doc['metadata']['language'] as $indexName => $language) { - $doc['metadata']['language'][$indexName] = Helper::getLanguageName($language); - } - } + $this->translateLanguageCode($doc); if ($doc['toplevel'] === false) { // this maybe a chapter, article, ..., year if ($doc['type'] === 'year') { @@ -661,12 +656,7 @@ protected function fetchToplevelMetadataFromSolr(array $queryParams): array $result = $this->searchSolr($params, true); foreach ($result['documents'] as $doc) { - // translate language code if applicable - if($doc['metadata']['language']) { - foreach($doc['metadata']['language'] as $indexName => $language) { - $doc['metadata']['language'][$indexName] = Helper::getLanguageName($doc['metadata']['language'][$indexName]); - } - } + $this->translateLanguageCode($doc); $metadataArray[$doc['uid']] = $doc['metadata']; } @@ -813,4 +803,22 @@ private function getDocument(Document $record, array $highlighting, array $field return $document; } + + /** + * Translate language code if applicable. + * + * @access private + * + * @param &$doc document array + * + * @return void + */ + private function translateLanguageCode(&$doc): void + { + if ($doc['metadata']['language']) { + foreach($doc['metadata']['language'] as $indexName => $language) { + $doc['metadata']['language'][$indexName] = Helper::getLanguageName($language); + } + } + } } From 2c0454753c814e40e4d5b63c080c642625a4fa6f Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Fri, 26 Jan 2024 19:18:50 +0100 Subject: [PATCH 09/72] [MAINTENANCE] Return values without assign to variables (#1128) Co-authored-by: Sebastian Meyer --- Classes/Common/Helper.php | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/Classes/Common/Helper.php b/Classes/Common/Helper.php index 1f32b452a..8b66ebdbe 100644 --- a/Classes/Common/Helper.php +++ b/Classes/Common/Helper.php @@ -205,8 +205,7 @@ public static function decrypt(string $encrypted) $data = substr($binary, openssl_cipher_iv_length(self::$cipherAlgorithm)); $key = openssl_digest($GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'], self::$hashAlgorithm, true); // Decrypt data. - $decrypted = openssl_decrypt($data, self::$cipherAlgorithm, $key, OPENSSL_RAW_DATA, $iv); - return $decrypted; + return openssl_decrypt($data, self::$cipherAlgorithm, $key, OPENSSL_RAW_DATA, $iv); } /** @@ -294,8 +293,7 @@ public static function digest(string $string) return false; } // Hash string. - $hashed = openssl_digest($string, self::$hashAlgorithm); - return $hashed; + return openssl_digest($string, self::$hashAlgorithm); } /** @@ -371,8 +369,7 @@ public static function getCleanString(string $string): string // Remove multiple dashes or whitespaces. $string = preg_replace('/[\s-]+/', ' ', $string); // Convert whitespaces and underscore to dash. - $string = preg_replace('/[\s_]/', '-', $string); - return $string; + return preg_replace('/[\s_]/', '-', $string); } /** @@ -530,9 +527,7 @@ public static function getDocumentStructures(int $pid = -1): array $allStructures = $kitodoStructures->fetchAllAssociative(); // make lookup-table indexName -> uid - $allStructures = array_column($allStructures, 'indexName', 'uid'); - - return $allStructures; + return array_column($allStructures, 'indexName', 'uid'); } /** @@ -685,9 +680,8 @@ public static function renderFlashMessages(string $queue = 'kitodo.default.flash $flashMessageService = GeneralUtility::makeInstance(FlashMessageService::class); $flashMessageQueue = $flashMessageService->getMessageQueueByIdentifier($queue); $flashMessages = $flashMessageQueue->getAllMessagesAndFlush(); - $content = GeneralUtility::makeInstance(KitodoFlashMessageRenderer::class) + return GeneralUtility::makeInstance(KitodoFlashMessageRenderer::class) ->render($flashMessages); - return $content; } /** @@ -925,9 +919,7 @@ public static function getUrl(string $url) self::log('Could not fetch data from URL "' . $url . '". Error: ' . $e->getMessage() . '.', LOG_SEVERITY_WARNING); return false; } - $content = $response->getBody()->getContents(); - - return $content; + return $response->getBody()->getContents(); } /** From aa5bb1c3bd8ed71cfec2b876b6f9ea1789fd7664 Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Fri, 26 Jan 2024 19:21:18 +0100 Subject: [PATCH 10/72] [MAINTENANCE] Improvements in IiiFManifest class (#1129) Co-authored-by: Sebastian Meyer --- Classes/Common/IiifManifest.php | 101 ++++++++++++++++++-------------- 1 file changed, 56 insertions(+), 45 deletions(-) diff --git a/Classes/Common/IiifManifest.php b/Classes/Common/IiifManifest.php index a95e9fbb1..aa0f409cb 100644 --- a/Classes/Common/IiifManifest.php +++ b/Classes/Common/IiifManifest.php @@ -141,8 +141,8 @@ protected function establishRecordId(int $pid): void ->from('tx_dlf_metadataformat') ->from('tx_dlf_formats') ->where( - $queryBuilder->expr()->eq('tx_dlf_metadata.pid', intval($pid)), - $queryBuilder->expr()->eq('tx_dlf_metadataformat.pid', intval($pid)), + $queryBuilder->expr()->eq('tx_dlf_metadata.pid', (int) $pid), + $queryBuilder->expr()->eq('tx_dlf_metadataformat.pid', (int) $pid), $queryBuilder->expr()->orX( $queryBuilder->expr()->andX( $queryBuilder->expr()->eq('tx_dlf_metadata.uid', 'tx_dlf_metadataformat.parent_id'), @@ -267,13 +267,12 @@ protected function magicGetPhysicalStructure(): array } $extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get(self::$extKey); $iiifId = $this->iiif->getId(); - $physSeq[0] = $iiifId; - $this->physicalStructureInfo[$physSeq[0]]['id'] = $iiifId; - $this->physicalStructureInfo[$physSeq[0]]['dmdId'] = $iiifId; - $this->physicalStructureInfo[$physSeq[0]]['label'] = $this->iiif->getLabelForDisplay(); - $this->physicalStructureInfo[$physSeq[0]]['orderlabel'] = $this->iiif->getLabelForDisplay(); - $this->physicalStructureInfo[$physSeq[0]]['type'] = 'physSequence'; - $this->physicalStructureInfo[$physSeq[0]]['contentIds'] = null; + $this->physicalStructureInfo[$iiifId]['id'] = $iiifId; + $this->physicalStructureInfo[$iiifId]['dmdId'] = $iiifId; + $this->physicalStructureInfo[$iiifId]['label'] = $this->iiif->getLabelForDisplay(); + $this->physicalStructureInfo[$iiifId]['orderlabel'] = $this->iiif->getLabelForDisplay(); + $this->physicalStructureInfo[$iiifId]['type'] = 'physSequence'; + $this->physicalStructureInfo[$iiifId]['contentIds'] = null; $fileUseDownload = $this->getUseGroups('fileGrpDownload'); $fileUseFulltext = $this->getUseGroups('fileGrpFulltext'); $fileUseThumbs = $this->getUseGroups('fileGrpThumbs'); @@ -281,7 +280,7 @@ protected function magicGetPhysicalStructure(): array if (!empty($fileUseDownload)) { $docPdfRendering = $this->iiif->getRenderingUrlsForFormat('application/pdf'); if (!empty($docPdfRendering)) { - $this->physicalStructureInfo[$physSeq[0]]['files'][$fileUseDownload[0]] = $docPdfRendering[0]; + $this->physicalStructureInfo[$iiifId]['files'][$fileUseDownload[0]] = $docPdfRendering[0]; } } if (!empty($fileUseFulltext)) { @@ -291,7 +290,7 @@ protected function magicGetPhysicalStructure(): array } if (!empty($iiifAlto)) { $this->mimeTypes[$iiifAlto[0]] = 'application/alto+xml'; - $this->physicalStructureInfo[$physSeq[0]]['files'][$fileUseFulltext[0]] = $iiifAlto[0]; + $this->physicalStructureInfo[$iiifId]['files'][$fileUseFulltext[0]] = $iiifAlto[0]; $this->hasFulltext = true; $this->hasFulltextSet = true; } @@ -305,9 +304,9 @@ protected function magicGetPhysicalStructure(): array // put thumbnails in thumbnail filegroup if ( !empty($thumbnailUrl) - && empty($this->physicalStructureInfo[$physSeq[0]]['files'][$fileUseThumbs[0]]) + && empty($this->physicalStructureInfo[$iiifId]['files'][$fileUseThumbs[0]]) ) { - $this->physicalStructureInfo[$physSeq[0]]['files'][$fileUseThumbs[0]] = $thumbnailUrl; + $this->physicalStructureInfo[$iiifId]['files'][$fileUseThumbs[0]] = $thumbnailUrl; } // populate structural metadata info $elements[$canvasOrder] = $canvas->getId(); @@ -361,7 +360,8 @@ protected function magicGetPhysicalStructure(): array } $this->numPages = $canvasOrder; // Merge and re-index the array to get nice numeric indexes. - $this->physicalStructure = array_merge($physSeq, $elements); + array_unshift($elements, $iiifId); + $this->physicalStructure = $elements; } $this->physicalStructureLoaded = true; } @@ -412,7 +412,7 @@ public function getFileLocation(string $id): string // @phpstan-ignore-next-line return (!empty($resource->getImageAnnotations()) && $resource->getImageAnnotations()->getSingleService() != null) ? $resource->getImageAnnotations()[0]->getSingleService()->getId() : $id; } elseif ($resource instanceof ContentResourceInterface) { - return $resource->getSingleService() != null && $resource->getSingleService() instanceof Service ? $resource->getSingleService()->getId() : $id; + return $resource->getSingleService() instanceof Service ? $resource->getSingleService()->getId() : $id; } elseif ($resource instanceof AbstractImageService) { return $resource->getId(); } elseif ($resource instanceof AnnotationContainerInterface) { @@ -512,13 +512,9 @@ protected function getLogicalStructureInfo(IiifResourceInterface $resource, bool $this->magicGetSmLinks(); // Load physical structure. $this->magicGetPhysicalStructure(); - $canvases = []; - if ($resource instanceof ManifestInterface) { - $startCanvas = $resource->getStartCanvasOrFirstCanvas(); - $canvases = $resource->getDefaultCanvases(); - } elseif ($resource instanceof RangeInterface) { + + if ($resource instanceof ManifestInterface || $resource instanceof RangeInterface) { $startCanvas = $resource->getStartCanvasOrFirstCanvas(); - $canvases = $resource->getAllCanvases(); } if (isset($startCanvas)) { $details['pagination'] = $startCanvas->getLabel(); @@ -540,7 +536,7 @@ protected function getLogicalStructureInfo(IiifResourceInterface $resource, bool if ($resource instanceof ManifestInterface && $resource->getRootRanges() != null) { $rangesToAdd = []; $rootRanges = []; - if (sizeof($this->iiif->getRootRanges()) == 1 && $this->iiif->getRootRanges()[0]->isTopRange()) { + if (count($this->iiif->getRootRanges()) == 1 && $this->iiif->getRootRanges()[0]->isTopRange()) { $rangesToAdd = $this->iiif->getRootRanges()[0]->getMemberRangesAndRanges(); } else { $rangesToAdd = $this->iiif->getRootRanges(); @@ -589,7 +585,7 @@ public function getManifestMetadata(string $id, bool $withDescription = true, bo $iiifResource = $this->iiif->getContainedResourceById($id); $result = []; if ($iiifResource != null) { - if ($iiifResource->getLabel() != null && $iiifResource->getLabel() != "") { + if (!empty($iiifResource->getLabel())) { $result['label'] = $iiifResource->getLabel(); } if (!empty($iiifResource->getMetadata())) { @@ -650,8 +646,8 @@ public function getMetadata(string $id, int $cPid = 0): array ->from('tx_dlf_metadataformat') ->from('tx_dlf_formats') ->where( - $queryBuilder->expr()->eq('tx_dlf_metadata.pid', intval($cPid)), - $queryBuilder->expr()->eq('tx_dlf_metadataformat.pid', intval($cPid)), + $queryBuilder->expr()->eq('tx_dlf_metadata.pid', (int) $cPid), + $queryBuilder->expr()->eq('tx_dlf_metadataformat.pid', (int) $cPid), $queryBuilder->expr()->orX( $queryBuilder->expr()->andX( $queryBuilder->expr()->eq('tx_dlf_metadata.uid', 'tx_dlf_metadataformat.parent_id'), @@ -804,19 +800,7 @@ public function getFullText(string $id): string // Get annotation containers $annotationContainerIds = $this->physicalStructureInfo[$id]['annotationContainers']; if (!empty($annotationContainerIds)) { - $annotationTexts = []; - foreach ($annotationContainerIds as $annotationListId) { - $annotationContainer = $this->iiif->getContainedResourceById($annotationListId); - /* @var $annotationContainer \Ubl\Iiif\Presentation\Common\Model\Resources\AnnotationContainerInterface */ - foreach ($annotationContainer->getTextAnnotations(Motivation::PAINTING) as $annotation) { - if ( - $annotation->getTargetResourceId() == $iiifResource->getId() && - $annotation->getBody() != null && $annotation->getBody()->getChars() != null - ) { - $annotationTexts[] = $annotation->getBody()->getChars(); - } - } - } + $annotationTexts = $this->getAnnotationTexts($annotationContainerIds, $iiifResource->getId()); $rawText .= implode(' ', $annotationTexts); } } @@ -861,11 +845,9 @@ protected function loadLocation(string $location): bool IiifHelper::setMaxThumbnailHeight($conf['iiifThumbnailHeight']); IiifHelper::setMaxThumbnailWidth($conf['iiifThumbnailWidth']); $resource = IiifHelper::loadIiifResource($fileResource); - if ($resource != null) { - if ($resource instanceof ManifestInterface) { - $this->iiif = $resource; - return true; - } + if ($resource instanceof ManifestInterface) { + $this->iiif = $resource; + return true; } } $this->logger->error('Could not load IIIF manifest from "' . $location . '"'); @@ -919,7 +901,8 @@ protected function ensureHasFulltextIsSet(): void $extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get(self::$extKey); if ($extConf['indexAnnotations'] == 1 && !empty($canvas->getPossibleTextAnnotationContainers(Motivation::PAINTING))) { foreach ($canvas->getPossibleTextAnnotationContainers(Motivation::PAINTING) as $annotationContainer) { - if (($textAnnotations = $annotationContainer->getTextAnnotations(Motivation::PAINTING)) != null) { + $textAnnotations = $annotationContainer->getTextAnnotations(Motivation::PAINTING); + if ($textAnnotations != null) { foreach ($textAnnotations as $annotation) { if ( $annotation->getBody() != null && @@ -960,6 +943,34 @@ protected function magicGetToplevelId(): string return $this->toplevelId; } + /** + * Get annotation texts. + * + * @access private + * + * @param array $annotationContainerIds + * @param string $iiifId + * + * @return array + */ + private function getAnnotationTexts($annotationContainerIds, $iiifId): array + { + $annotationTexts = []; + foreach ($annotationContainerIds as $annotationListId) { + $annotationContainer = $this->iiif->getContainedResourceById($annotationListId); + /* @var $annotationContainer \Ubl\Iiif\Presentation\Common\Model\Resources\AnnotationContainerInterface */ + foreach ($annotationContainer->getTextAnnotations(Motivation::PAINTING) as $annotation) { + if ( + $annotation->getTargetResourceId() == $iiifId && + $annotation->getBody() != null && $annotation->getBody()->getChars() != null + ) { + $annotationTexts[] = $annotation->getBody()->getChars(); + } + } + } + return $annotationTexts; + } + /** * This magic method is executed after the object is deserialized * @see __sleep() @@ -975,7 +986,7 @@ public function __wakeup(): void IiifHelper::setMaxThumbnailHeight($conf['iiifThumbnailHeight']); IiifHelper::setMaxThumbnailWidth($conf['iiifThumbnailWidth']); $resource = IiifHelper::loadIiifResource($this->asJson); - if ($resource != null && $resource instanceof ManifestInterface) { + if ($resource instanceof ManifestInterface) { $this->asJson = ''; $this->iiif = $resource; $this->init(''); From 9621f726bc3c033337cdf6d8d9d7d308bb0f2a8f Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Fri, 26 Jan 2024 19:31:28 +0100 Subject: [PATCH 11/72] [MAINTENANCE] Improvements in Indexer class (#1131) Co-authored-by: Sebastian Meyer --- Classes/Common/Indexer.php | 296 +++++++++++++++++++++++-------------- 1 file changed, 188 insertions(+), 108 deletions(-) diff --git a/Classes/Common/Indexer.php b/Classes/Common/Indexer.php index cf737f33e..59a652db7 100644 --- a/Classes/Common/Indexer.php +++ b/Classes/Common/Indexer.php @@ -101,7 +101,8 @@ public static function add(Document $document, DocumentRepository $documentRepos $success = true; Helper::getLanguageService()->includeLLFile('EXT:dlf/Resources/Private/Language/locallang_be.xlf'); // Handle multi-volume documents. - if ($parentId = $document->getPartof()) { + $parentId = $document->getPartof(); + if ($parentId) { // get parent document $parent = $documentRepository->findByUid($parentId); if ($parent) { @@ -149,45 +150,26 @@ public static function add(Document $document, DocumentRepository $documentRepos if (!(Environment::isCli())) { if ($success) { - Helper::addMessage( + self::addMessage( sprintf(Helper::getLanguageService()->getLL('flash.documentIndexed'), $document->getTitle(), $document->getUid()), - Helper::getLanguageService()->getLL('flash.done'), - FlashMessage::OK, - true, - 'core.template.flashMessages' + 'flash.done', + FlashMessage::OK ); } else { - Helper::addMessage( - sprintf(Helper::getLanguageService()->getLL('flash.documentNotIndexed'), $document->getTitle(), $document->getUid()), - Helper::getLanguageService()->getLL('flash.error'), - FlashMessage::ERROR, - true, - 'core.template.flashMessages' - ); + self::addErrorMessage(sprintf(Helper::getLanguageService()->getLL('flash.documentNotIndexed'), $document->getTitle(), $document->getUid())); } } return $success; } catch (\Exception $e) { - if (!(Environment::isCli())) { - Helper::addMessage( - Helper::getLanguageService()->getLL('flash.solrException') . ' ' . htmlspecialchars($e->getMessage()), - Helper::getLanguageService()->getLL('flash.error'), - FlashMessage::ERROR, - true, - 'core.template.flashMessages' - ); - } - Helper::log('Apache Solr threw exception: "' . $e->getMessage() . '"', LOG_SEVERITY_ERROR); + self::handleException($e->getMessage()); return false; } } else { if (!(Environment::isCli())) { - Helper::addMessage( + self::addMessage( Helper::getLanguageService()->getLL('flash.solrNoConnection'), - Helper::getLanguageService()->getLL('flash.warning'), - FlashMessage::WARNING, - true, - 'core.template.flashMessages' + 'flash.warning', + FlashMessage::WARNING ); } Helper::log('Could not connect to Apache Solr server', LOG_SEVERITY_ERROR); @@ -210,7 +192,7 @@ public static function add(Document $document, DocumentRepository $documentRepos public static function getIndexFieldName(string $indexName, int $pid = 0): string { // Sanitize input. - $pid = max(intval($pid), 0); + $pid = max((int) $pid, 0); if (!$pid) { Helper::log('Invalid PID ' . $pid . ' for metadata configuration', LOG_SEVERITY_ERROR); return ''; @@ -257,7 +239,7 @@ protected static function loadIndexConf(int $pid): void ) ->from('tx_dlf_metadata') ->where( - $queryBuilder->expr()->eq('tx_dlf_metadata.pid', intval($pid)), + $queryBuilder->expr()->eq('tx_dlf_metadata.pid', (int) $pid), Helper::whereExpression('tx_dlf_metadata') ) ->execute(); @@ -339,20 +321,7 @@ protected static function processLogical(Document $document, array $logicalUnit) $solrDoc->setField('volume', $metadata['volume'][0], self::$fields['fieldboost']['volume']); // verify date formatting if(strtotime($metadata['date'][0])) { - // do not alter dates YYYY or YYYY-MM or YYYY-MM-DD - if ( - preg_match("/^[\d]{4}$/", $metadata['date'][0]) - || preg_match("/^[\d]{4}-[\d]{2}$/", $metadata['date'][0]) - || preg_match("/^[\d]{4}-[\d]{2}-[\d]{2}$/", $metadata['date'][0]) - ) { - $solrDoc->setField('date', $metadata['date'][0]); - // change date YYYYMMDD to YYYY-MM-DD - } elseif (preg_match("/^[\d]{8}$/", $metadata['date'][0])){ - $solrDoc->setField('date', date("Y-m-d", strtotime($metadata['date'][0]))); - // convert any datetime to proper ISO extended datetime format and timezone for SOLR - } elseif (preg_match("/^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$/", $metadata['date'][0])) { - $solrDoc->setField('date', date('Y-m-d\TH:i:s\Z', strtotime($metadata['date'][0]))); - } + $solrDoc->setField('date', self::getFormattedDate($metadata['date'][0])); } $solrDoc->setField('record_id', $metadata['record_id'][0]); $solrDoc->setField('purl', $metadata['purl'][0]); @@ -365,26 +334,7 @@ protected static function processLogical(Document $document, array $logicalUnit) if (is_object($coordinates)) { $solrDoc->setField('geom', json_encode($coordinates->features[0])); } - $autocomplete = []; - foreach ($metadata as $index_name => $data) { - if ( - !empty($data) - && substr($index_name, -8) !== '_sorting' - ) { - $solrDoc->setField(self::getIndexFieldName($index_name, $document->getPid()), $data, self::$fields['fieldboost'][$index_name]); - if (in_array($index_name, self::$fields['sortables'])) { - // Add sortable fields to index. - $solrDoc->setField($index_name . '_sorting', $metadata[$index_name . '_sorting'][0]); - } - if (in_array($index_name, self::$fields['facets'])) { - // Add facets to index. - $solrDoc->setField($index_name . '_faceting', $data); - } - if (in_array($index_name, self::$fields['autocomplete'])) { - $autocomplete = array_merge($autocomplete, $data); - } - } - } + $autocomplete = self::processMetadata($document, $metadata, $solrDoc); // Add autocomplete values to index. if (!empty($autocomplete)) { $solrDoc->setField('autocomplete', $autocomplete); @@ -401,16 +351,7 @@ protected static function processLogical(Document $document, array $logicalUnit) $updateQuery->addDocument($solrDoc); self::$solr->service->update($updateQuery); } catch (\Exception $e) { - if (!(Environment::isCli())) { - Helper::addMessage( - Helper::getLanguageService()->getLL('flash.solrException') . '
' . htmlspecialchars($e->getMessage()), - Helper::getLanguageService()->getLL('flash.error'), - FlashMessage::ERROR, - true, - 'core.template.flashMessages' - ); - } - Helper::log('Apache Solr threw exception: "' . $e->getMessage() . '"', LOG_SEVERITY_ERROR); + self::handleException($e->getMessage()); return false; } } @@ -466,30 +407,7 @@ protected static function processPhysical(Document $document, int $page, array $ $solrDoc->setField('fulltext', $fullText); if (is_array($doc->metadataArray[$doc->toplevelId])) { - // Add faceting information to physical sub-elements if applicable. - foreach ($doc->metadataArray[$doc->toplevelId] as $index_name => $data) { - if ( - !empty($data) - && substr($index_name, -8) !== '_sorting' - ) { - - if (in_array($index_name, self::$fields['facets'])) { - // Remove appended "valueURI" from authors' names for indexing. - if ($index_name == 'author') { - $data = self::removeAppendsFromAuthor($data); - } - // Add facets to index. - $solrDoc->setField($index_name . '_faceting', $data); - } - } - // Add sorting information to physical sub-elements if applicable. - if ( - !empty($data) - && substr($index_name, -8) == '_sorting' - ) { - $solrDoc->setField($index_name , $doc->metadataArray[$doc->toplevelId][$index_name]); - } - } + self::addFaceting($doc, $solrDoc); } // Add collection information to physical sub-elements if applicable. if ( @@ -502,16 +420,7 @@ protected static function processPhysical(Document $document, int $page, array $ $updateQuery->addDocument($solrDoc); self::$solr->service->update($updateQuery); } catch (\Exception $e) { - if (!(Environment::isCli())) { - Helper::addMessage( - Helper::getLanguageService()->getLL('flash.solrException') . '
' . htmlspecialchars($e->getMessage()), - Helper::getLanguageService()->getLL('flash.error'), - FlashMessage::ERROR, - true, - 'core.template.flashMessages' - ); - } - Helper::log('Apache Solr threw exception: "' . $e->getMessage() . '"', LOG_SEVERITY_ERROR); + self::handleException($e->getMessage()); return false; } } @@ -546,6 +455,83 @@ protected static function solrConnect(int $core, int $pid = 0): bool return false; } + /** + * Process metadata: add facets, sortable fields and create autocomplete array. + * + * @static + * + * @access private + * + * @param Document $document + * @param array $metadata + * @param DocumentInterface &$solrDoc + * + * @return array empty array or autocomplete values + */ + private static function processMetadata($document, $metadata, &$solrDoc): array + { + $autocomplete = []; + foreach ($metadata as $indexName => $data) { + if ( + !empty($data) + && substr($indexName, -8) !== '_sorting' + ) { + $solrDoc->setField(self::getIndexFieldName($indexName, $document->getPid()), $data, self::$fields['fieldboost'][$indexName]); + if (in_array($indexName, self::$fields['sortables'])) { + // Add sortable fields to index. + $solrDoc->setField($indexName . '_sorting', $metadata[$indexName . '_sorting'][0]); + } + if (in_array($indexName, self::$fields['facets'])) { + // Add facets to index. + $solrDoc->setField($indexName . '_faceting', $data); + } + if (in_array($indexName, self::$fields['autocomplete'])) { + $autocomplete = array_merge($autocomplete, $data); + } + } + } + return $autocomplete; + } + + /** + * Add faceting information to physical sub-elements if applicable. + * + * @static + * + * @access private + * + * @param AbstractDocument $doc + * @param DocumentInterface &$solrDoc + * + * @return void + */ + private static function addFaceting($doc, &$solrDoc): void + { + foreach ($doc->metadataArray[$doc->toplevelId] as $indexName => $data) { + if ( + !empty($data) + && substr($indexName, -8) !== '_sorting' + ) { + + if (in_array($indexName, self::$fields['facets'])) { + // Remove appended "valueURI" from authors' names for indexing. + if ($indexName == 'author') { + $data = self::removeAppendsFromAuthor($data); + } + // Add facets to index. + $solrDoc->setField($indexName . '_faceting', $data); + } + } + // Add sorting information to physical sub-elements if applicable. + if ( + !empty($data) + && substr($indexName, -8) == '_sorting' + ) { + $solrDoc->setField($indexName, $doc->metadataArray[$doc->toplevelId][$indexName]); + } + } + } + /** * Get SOLR document with set standard fields (identical for logical and physical unit) * @@ -576,6 +562,37 @@ private static function getSolrDocument(Query $updateQuery, Document $document, return $solrDoc; } + /** + * Get formatted date without alteration. + * Possible formats: YYYY or YYYY-MM or YYYY-MM-DD. + * + * @static + * + * @access private + * + * @param string $date + * + * @return string formatted date YYYY or YYYY-MM or YYYY-MM-DD or empty string + */ + private static function getFormattedDate($date): string + { + if ( + preg_match("/^[\d]{4}$/", $date) + || preg_match("/^[\d]{4}-[\d]{2}$/", $date) + || preg_match("/^[\d]{4}-[\d]{2}-[\d]{2}$/", $date) + ) { + return $date; + // change date YYYYMMDD to YYYY-MM-DD + } elseif (preg_match("/^[\d]{8}$/", $date)) { + return date("Y-m-d", strtotime($date)); + // convert any datetime to proper ISO extended datetime format and timezone for SOLR + } elseif (preg_match("/^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$/", $date)) { + return date('Y-m-d\TH:i:s\Z', strtotime($date)); + } + // date doesn't match any standard + return ''; + } + /** * Remove appended "valueURI" from authors' names for indexing. * @@ -598,6 +615,69 @@ private static function removeAppendsFromAuthor($authors) return $authors; } + /** + * Handle exception. + * + * @static + * + * @access private + * + * @param string $errorMessage + * + * @return void + */ + private static function handleException(string $errorMessage): void + { + if (!(Environment::isCli())) { + self::addErrorMessage(Helper::getLanguageService()->getLL('flash.solrException') . '
' . htmlspecialchars($errorMessage)); + } + Helper::log('Apache Solr threw exception: "' . $errorMessage . '"', LOG_SEVERITY_ERROR); + } + + /** + * Add error message only with message content. + * + * @static + * + * @access private + * + * @param string $message + * + * @return void + */ + private static function addErrorMessage(string $message): void + { + self::addMessage( + $message, + 'flash.error', + FlashMessage::ERROR + ); + } + + /** + * Add message only with changeable parameters. + * + * @static + * + * @access private + * + * @param string $message + * @param string $type + * @param int $status + * + * @return void + */ + private static function addMessage(string $message, string $type, int $status): void + { + Helper::addMessage( + $message, + Helper::getLanguageService()->getLL($type), + $status, + true, + 'core.template.flashMessages' + ); + } + /** * Prevent instantiation by hiding the constructor * From 44049f0644d1b12853cf1ac5a6541e3621bfd2a0 Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Fri, 26 Jan 2024 19:34:14 +0100 Subject: [PATCH 12/72] [MAINTENANCE] Improvements in Solr class (#1132) Co-authored-by: Sebastian Meyer --- Classes/Common/Solr/Solr.php | 49 +++++++++++++++++------------------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/Classes/Common/Solr/Solr.php b/Classes/Common/Solr/Solr.php index c3bb6e0d6..52c1ba081 100644 --- a/Classes/Common/Solr/Solr.php +++ b/Classes/Common/Solr/Solr.php @@ -34,12 +34,12 @@ * * @property array $config this holds the Solr configuration * @property-read string|null $core this holds the core name for the current instance - * @property-write int $cPid this holds the PID for the configuration + * @property-write int $configPid this holds the PID for the configuration * @property int $limit this holds the max results * @property-read int $numberOfHits this holds the number of hits for last search * @property-write array $params this holds the additional query parameters * @property-read bool $ready flag if the Solr service is instantiated successfully - * @property-read \Solarium\Client $service this holds the Solr service object + * @property-read Client $service this holds the Solr service object */ class Solr implements LoggerAwareInterface { @@ -61,7 +61,7 @@ class Solr implements LoggerAwareInterface * @access protected * @var int This holds the PID for the configuration */ - protected int $cPid = 0; + protected int $configPid = 0; /** * @access public @@ -206,7 +206,7 @@ public static function escapeQueryKeepField(string $query, int $pid): string ->from('tx_dlf_metadata') ->where( $queryBuilder->expr()->eq('tx_dlf_metadata.index_indexed', 1), - $queryBuilder->expr()->eq('tx_dlf_metadata.pid', intval($pid)), + $queryBuilder->expr()->eq('tx_dlf_metadata.pid', (int) $pid), $queryBuilder->expr()->orX( $queryBuilder->expr()->in('tx_dlf_metadata.sys_language_uid', [-1, 0]), $queryBuilder->expr()->eq('tx_dlf_metadata.l18n_parent', 0) @@ -327,7 +327,7 @@ public static function getInstance($core = null): Solr */ public static function getNextCoreNumber(int $number = 0): int { - $number = max(intval($number), 0); + $number = max($number, 0); // Check if core already exists. $solr = self::getInstance('dlfCore' . $number); if (!$solr->ready) { @@ -364,14 +364,10 @@ protected function loadSolrConnectionInfo(): void if (!empty($config['path'])) { $config['path'] .= '/'; } - // Add "/solr" API endpoint when using Solarium <5.x - // Todo: Remove when dropping support for Solarium 4.x - if (!\Solarium\Client::checkMinimal('5.0.0')) { - $config['path'] .= 'solr/'; - } + // Set connection timeout lower than PHP's max_execution_time. - $max_execution_time = intval(ini_get('max_execution_time')) ? : 30; - $config['timeout'] = MathUtility::forceIntegerInRange($conf['solrTimeout'], 1, $max_execution_time, 10); + $maxExecutionTime = (int) ini_get('max_execution_time') ? : 30; + $config['timeout'] = MathUtility::forceIntegerInRange($conf['solrTimeout'], 1, $maxExecutionTime, 10); $this->config = $config; } } @@ -394,7 +390,8 @@ public function searchRaw(array $parameters = []): array $cacheIdentifier = Helper::digest($this->core . print_r(array_merge($this->params, $parameters), true)); $cache = GeneralUtility::makeInstance(CacheManager::class)->getCache('tx_dlf_solr'); $resultSet = []; - if (($entry = $cache->get($cacheIdentifier)) === false) { + $entry = $cache->get($cacheIdentifier); + if ($entry === false) { $selectQuery = $this->service->createSelect(array_merge($this->params, $parameters)); $result = $this->service->select($selectQuery); foreach ($result as $doc) { @@ -416,7 +413,7 @@ public function searchRaw(array $parameters = []): array * * @return string|null The core name of the current query endpoint or null if core admin endpoint */ - protected function _getCore(): ?string + protected function magicGetCore(): ?string { return $this->core; } @@ -428,7 +425,7 @@ protected function _getCore(): ?string * * @return int The max number of results */ - protected function _getLimit(): int + protected function magicGetLimit(): int { return $this->limit; } @@ -440,7 +437,7 @@ protected function _getLimit(): int * * @return int Total number of hits for last search */ - protected function _getNumberOfHits(): int + protected function magicGetNumberOfHits(): int { return $this->numberOfHits; } @@ -452,7 +449,7 @@ protected function _getNumberOfHits(): int * * @return bool Is the search instantiated successfully? */ - protected function _getReady(): bool + protected function magicGetReady(): bool { return $this->ready; } @@ -464,13 +461,13 @@ protected function _getReady(): bool * * @return Client Apache Solr service object */ - protected function _getService(): Client + protected function magicGetService(): Client { return $this->service; } /** - * This sets $this->cPid via __set() + * This sets $this->configPid via __set() * * @access protected * @@ -478,9 +475,9 @@ protected function _getService(): Client * * @return void */ - protected function _setCPid(int $value): void + protected function magicSetConfigPid(int $value): void { - $this->cPid = max(intval($value), 0); + $this->configPid = max($value, 0); } /** @@ -492,9 +489,9 @@ protected function _setCPid(int $value): void * * @return void */ - protected function _setLimit(int $value): void + protected function magicSetLimit(int $value): void { - $this->limit = max(intval($value), 0); + $this->limit = max($value, 0); } /** @@ -506,7 +503,7 @@ protected function _setLimit(int $value): void * * @return void */ - protected function _setParams(array $value): void + protected function magicSetParams(array $value): void { $this->params = $value; } @@ -522,7 +519,7 @@ protected function _setParams(array $value): void */ public function __get(string $var) { - $method = '_get' . ucfirst($var); + $method = 'magicGet' . ucfirst($var); if ( !property_exists($this, $var) || !method_exists($this, $method) @@ -560,7 +557,7 @@ public function __isset(string $var): bool */ public function __set(string $var, $value): void { - $method = '_set' . ucfirst($var); + $method = 'magicSet' . ucfirst($var); if ( !property_exists($this, $var) || !method_exists($this, $method) From 5d8251e1befb5580d2adbec3c409dadaadc35e55 Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Fri, 26 Jan 2024 19:36:36 +0100 Subject: [PATCH 13/72] [MAINTENANCE] Improvements in AbstractController class (#1133) Co-authored-by: Sebastian Meyer --- Classes/Controller/AbstractController.php | 119 ++++++++++++++-------- 1 file changed, 78 insertions(+), 41 deletions(-) diff --git a/Classes/Controller/AbstractController.php b/Classes/Controller/AbstractController.php index a545ed05d..36f62e338 100644 --- a/Classes/Controller/AbstractController.php +++ b/Classes/Controller/AbstractController.php @@ -100,7 +100,7 @@ protected function initialize(): void $this->viewData = [ 'pageUid' => $GLOBALS['TSFE']->id, - 'uniqueId'=> uniqid(), + 'uniqueId' => uniqid(), 'requestData' => $this->requestData ]; } @@ -127,38 +127,9 @@ protected function loadDocument(int $documentId = 0): void $doc = null; if (MathUtility::canBeInterpretedAsInteger($documentId)) { - // find document from repository by uid - $this->document = $this->documentRepository->findOneByIdAndSettings($documentId); - if ($this->document) { - $doc = AbstractDocument::getInstance($this->document->getLocation(), $this->settings, true); - } else { - $this->logger->error('Invalid UID "' . $documentId . '" or PID "' . $this->settings['storagePid'] . '" for document loading'); - } - } else if (GeneralUtility::isValidUrl($documentId)) { - - $doc = AbstractDocument::getInstance($documentId, $this->settings, true); - - if ($doc !== null) { - if ($doc->recordId) { - // find document from repository by recordId - $docFromRepository = $this->documentRepository->findOneByRecordId($doc->recordId); - if ($docFromRepository !== null) { - $this->document = $docFromRepository; - } else { - // create new dummy Document object - $this->document = GeneralUtility::makeInstance(Document::class); - } - } - - // Make sure configuration PID is set when applicable - if ($doc->cPid == 0) { - $doc->cPid = max(intval($this->settings['storagePid']), 0); - } - - $this->document->setLocation($documentId); - } else { - $this->logger->error('Invalid location given "' . $documentId . '" for document loading'); - } + $doc = $this->getDocumentByUid($documentId); + } elseif (GeneralUtility::isValidUrl($documentId)) { + $doc = $this->getDocumentByUrl($documentId); } if ($this->document !== null && $doc !== null) { @@ -191,15 +162,18 @@ protected function loadDocument(int $documentId = 0): void * * @return void */ - protected function configureProxyUrl(string &$url): void { + protected function configureProxyUrl(string &$url): void + { $this->uriBuilder->reset() ->setTargetPageUid($GLOBALS['TSFE']->id) ->setCreateAbsoluteUri(!empty($this->settings['forceAbsoluteUrl'])) - ->setArguments([ - 'eID' => 'tx_dlf_pageview_proxy', - 'url' => $url, - 'uHash' => GeneralUtility::hmac($url, 'PageViewProxy') - ]) + ->setArguments( + [ + 'eID' => 'tx_dlf_pageview_proxy', + 'url' => $url, + 'uHash' => GeneralUtility::hmac($url, 'PageViewProxy') + ] + ) ->build(); } @@ -295,7 +269,8 @@ protected function sanitizeRequestData(): void * * @return void */ - protected function setPage(): void { + protected function setPage(): void + { if (!empty($this->requestData['logicalPage'])) { $this->requestData['page'] = $this->document->getCurrentDocument()->getPhysicalPage($this->requestData['logicalPage']); // The logical page parameter should not appear again @@ -312,7 +287,8 @@ protected function setPage(): void { * * @return void */ - protected function setDefaultPage(): void { + protected function setDefaultPage(): void + { // Set default values if not set. // $this->requestData['page'] may be integer or string (physical structure @ID) if ( @@ -424,4 +400,65 @@ protected function buildSimplePagination(PaginationInterface $pagination, Pagina 'pagesG' => $pages ]; } + + /** + * Get document from repository by uid. + * + * @access private + * + * @param int $documentId The document's UID + * + * @return AbstractDocument + */ + private function getDocumentByUid(int $documentId) + { + $doc = null; + $this->document = $this->documentRepository->findOneByIdAndSettings($documentId); + + if ($this->document) { + $doc = AbstractDocument::getInstance($this->document->getLocation(), $this->settings, true); + } else { + $this->logger->error('Invalid UID "' . $documentId . '" or PID "' . $this->settings['storagePid'] . '" for document loading'); + } + + return $doc; + } + + /** + * Get document by URL. + * + * @access private + * + * @param string $documentId The document's URL + * + * @return AbstractDocument + */ + private function getDocumentByUrl(string $documentId) + { + $doc = AbstractDocument::getInstance($documentId, $this->settings, true); + + if ($doc !== null) { + if ($doc->recordId) { + // find document from repository by recordId + $docFromRepository = $this->documentRepository->findOneByRecordId($doc->recordId); + if ($docFromRepository !== null) { + $this->document = $docFromRepository; + } else { + // create new dummy Document object + $this->document = GeneralUtility::makeInstance(Document::class); + } + } + + // Make sure configuration PID is set when applicable + if ($doc->cPid == 0) { + $doc->cPid = max((int) $this->settings['storagePid'], 0); + } + + $this->document->setLocation($documentId); + } else { + $this->logger->error('Invalid location given "' . $documentId . '" for document loading'); + } + + return $doc; + } } From 72d34a47d9f2b6fd26f9dac6df659f76bd8b484e Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Fri, 26 Jan 2024 19:42:39 +0100 Subject: [PATCH 14/72] [MAINTENANCE] Improvements in MetadataController class (#1135) Co-authored-by: Sebastian Meyer --- Classes/Controller/MetadataController.php | 132 +++++++++++++----- .../Private/Partials/Metadata/Entries.html | 8 +- .../ViewHelpers/StdWrapViewHelperTest.php | 4 +- 3 files changed, 103 insertions(+), 41 deletions(-) diff --git a/Classes/Controller/MetadataController.php b/Classes/Controller/MetadataController.php index 70666414e..c75548c0b 100644 --- a/Classes/Controller/MetadataController.php +++ b/Classes/Controller/MetadataController.php @@ -14,7 +14,6 @@ use Kitodo\Dlf\Common\AbstractDocument; use Kitodo\Dlf\Common\Helper; use Kitodo\Dlf\Common\IiifManifest; -use Kitodo\Dlf\Common\MetsDocument; use Kitodo\Dlf\Domain\Repository\CollectionRepository; use Kitodo\Dlf\Domain\Repository\MetadataRepository; use Kitodo\Dlf\Domain\Repository\StructureRepository; @@ -160,9 +159,11 @@ protected function printMetadata(array $metadata): void $this->view->assign('iiifData', $this->buildIiifData($metadata)); } else { // findBySettings also sorts entries by the `sorting` field - $metadataResult = $this->metadataRepository->findBySettings([ - 'is_listed' => !$this->settings['showFull'], - ]); + $metadataResult = $this->metadataRepository->findBySettings( + [ + 'is_listed' => !$this->settings['showFull'], + ] + ); foreach ($metadata as $i => $section) { @@ -172,8 +173,7 @@ protected function printMetadata(array $metadata): void $this->parseMetadata($i, $name, $value, $metadata); if (is_array($metadata[$i][$name])) { - $metadata[$i][$name] = array_values(array_filter($metadata[$i][$name], function($metadataValue) - { + $metadata[$i][$name] = array_values(array_filter($metadata[$i][$name], function ($metadataValue) { return !empty($metadataValue); })); } @@ -185,7 +185,7 @@ protected function printMetadata(array $metadata): void $this->view->assign('documentMetadataSections', $metadata); $this->view->assign('configMetadata', $metadataResult); $this->view->assign('separator', $this->settings['separator']); - $this->view->assign('metaCObjData', $this->buildMetaCObjData($metadata)); + $this->view->assign('metaConfigObjectData', $this->buildMetaConfigObjectData($metadata)); } } @@ -267,21 +267,21 @@ private function buildIiifDataGroup(string $label, string $value): array * * @return array The raw metadata array ready for output */ - private function buildMetaCObjData(array $metadata): array + private function buildMetaConfigObjectData(array $metadata): array { - $metaCObjData = []; + $metaConfigObjectData = []; foreach ($metadata as $i => $section) { - $metaCObjData[$i] = []; + $metaConfigObjectData[$i] = []; foreach ($section as $name => $value) { - $metaCObjData[$i][$name] = is_array($value) + $metaConfigObjectData[$i][$name] = is_array($value) ? implode($this->settings['separator'], $value) : $value; } } - return $metaCObjData; + return $metaConfigObjectData; } /** @@ -302,7 +302,7 @@ private function buildUrlFromMetadata(array $metadata): array $details = $this->currentDocument->getLogicalStructure($section['_id']); $buildUrl[$i]['title'] = [ 'id' => $this->document->getUid(), - 'page' => (!empty($details['points']) ? intval($details['points']) : 1), + 'page' => (!empty($details['points']) ? (int) $details['points'] : 1), 'targetPid' => (!empty($this->settings['targetPid']) ? $this->settings['targetPid'] : 0), ]; } @@ -356,34 +356,16 @@ private function parseMetadata(int $i, string $name, $value, array &$metadata) : { if ($name == 'title') { // Get title of parent document if needed. - if (empty(implode('', $value)) && $this->settings['getTitle'] && $this->document->getPartof()) { - $superiorTitle = AbstractDocument::getTitle($this->document->getPartof(), true); - if (!empty($superiorTitle)) { - $metadata[$i][$name] = ['[' . $superiorTitle . ']']; - } - } + $this->parseParentTitle($i, $value, $metadata); } elseif ($name == 'owner' && empty($value)) { // no owner is found by metadata records --> take the one associated to the document - $library = $this->document->getOwner(); - if ($library) { - $metadata[$i][$name][0] = $library->getLabel(); - } + $this->parseOwner($i, $metadata); } elseif ($name == 'type' && !empty($value)) { // Translate document type. - $structure = $this->structureRepository->findOneByIndexName($metadata[$i][$name][0]); - if ($structure) { - $metadata[$i][$name][0] = $structure->getLabel(); - } + $this->parseType($i, $metadata); } elseif ($name == 'collection' && !empty($value)) { // Check if collections isn't hidden. - $j = 0; - foreach ($value as $entry) { - $collection = $this->collectionRepository->findOneByIndexName($entry); - if ($collection) { - $metadata[$i][$name][$j] = $collection->getLabel() ? : ''; - $j++; - } - } + $this->parseCollections($i, $value, $metadata); } elseif ($name == 'language' && !empty($value)) { // Translate ISO 639 language code. foreach ($metadata[$i][$name] as &$langValue) { @@ -392,6 +374,86 @@ private function parseMetadata(int $i, string $name, $value, array &$metadata) : } } + /** + * Parse title of parent document if needed. + * + * @access private + * + * @param int $i The index of metadata array + * @param mixed $value The value of section in metadata array + * @param array $metadata The metadata array passed as reference + * + * @return void + */ + private function parseParentTitle(int $i, $value, array &$metadata) : void + { + if (empty(implode('', $value)) && $this->settings['getTitle'] && $this->document->getPartof()) { + $superiorTitle = AbstractDocument::getTitle($this->document->getPartof(), true); + if (!empty($superiorTitle)) { + $metadata[$i]['title'] = ['[' . $superiorTitle . ']']; + } + } + } + + /** + * Parse owner if no owner is found by metadata records. Take the one associated to the document. + * + * @access private + * + * @param int $i The index of metadata array + * @param array $metadata The metadata array passed as reference + * + * @return void + */ + private function parseOwner(int $i, array &$metadata) : void + { + $library = $this->document->getOwner(); + if ($library) { + $metadata[$i]['owner'][0] = $library->getLabel(); + } + } + + /** + * Parse type - translate document type. + * + * @access private + * + * @param int $i The index of metadata array + * @param array $metadata The metadata array passed as reference + * + * @return void + */ + private function parseType(int $i, array &$metadata) : void + { + $structure = $this->structureRepository->findOneByIndexName($metadata[$i]['type'][0]); + if ($structure) { + $metadata[$i]['type'][0] = $structure->getLabel(); + } + } + + /** + * Parse collections - check if collections isn't hidden. + * + * @access private + * + * @param int $i The index of metadata array + * @param mixed $value The value of section in metadata array + * @param array $metadata The metadata array passed as reference + * + * @return void + */ + private function parseCollections(int $i, $value, array &$metadata) : void + { + $j = 0; + foreach ($value as $entry) { + $collection = $this->collectionRepository->findOneByIndexName($entry); + if ($collection) { + $metadata[$i]['collection'][$j] = $collection->getLabel() ? : ''; + $j++; + } + } + } + /** * Get metadata for given id array. * diff --git a/Resources/Private/Partials/Metadata/Entries.html b/Resources/Private/Partials/Metadata/Entries.html index cdfe703d2..0eff906e1 100644 --- a/Resources/Private/Partials/Metadata/Entries.html +++ b/Resources/Private/Partials/Metadata/Entries.html @@ -14,7 +14,7 @@ data-namespace-typo3-fluid="true"> {configObject.wrap -> kitodo:metadataWrapVariable(name: 'metadataWrap')} - + @@ -27,15 +27,15 @@ - {value} + {value} - - {configObject.label} + + {configObject.label} {wrappedValues -> f:format.raw()} diff --git a/Tests/Functional/ViewHelpers/StdWrapViewHelperTest.php b/Tests/Functional/ViewHelpers/StdWrapViewHelperTest.php index af9cdf16a..ed24b6bab 100644 --- a/Tests/Functional/ViewHelpers/StdWrapViewHelperTest.php +++ b/Tests/Functional/ViewHelpers/StdWrapViewHelperTest.php @@ -47,8 +47,8 @@ public function renderWithStdWrap(): void $view->setTemplateSource( ' - - Label + + Label

Title

Text

' From 31a2ae59928bd1a06848eb17d3c4b201c1057b4a Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Fri, 26 Jan 2024 19:48:29 +0100 Subject: [PATCH 15/72] [MAINTENANCE] Improvements in CalendarController class (#1137) Co-authored-by: Sebastian Meyer --- Classes/Controller/CalendarController.php | 156 +++++++++++++--------- 1 file changed, 96 insertions(+), 60 deletions(-) diff --git a/Classes/Controller/CalendarController.php b/Classes/Controller/CalendarController.php index ddc853c4e..4b52a68a6 100644 --- a/Classes/Controller/CalendarController.php +++ b/Classes/Controller/CalendarController.php @@ -67,7 +67,7 @@ public function mainAction(): void // Load current document. $this->loadDocument(); - if ($this->document === null) { + if ($this->isDocMissing()) { // Quit without doing anything if required variables are not set. return; } @@ -171,7 +171,7 @@ public function yearsAction(): void if (empty($yearLabel)) { // if neither order nor orderlabel is set, use the id... - $yearLabel = (string)$id; + $yearLabel = (string) $id; } $years[] = [ @@ -284,74 +284,110 @@ protected function getCalendarYear(array &$calendarData, array $calendarIssuesBy foreach ($calendarIssuesByMonth[$currentMonth] as $id => $day) { if ($id == date('j', $currentDayTime)) { $dayLinks = $id; - foreach ($day as $issue) { - $dayLinkLabel = empty($issue['title']) ? strftime('%x', $currentDayTime) : $issue['title']; - - $dayLinksText[] = [ - 'documentId' => $issue['uid'], - 'text' => $dayLinkLabel - ]; - - // Save issue for list view. - $this->allIssues[$currentDayTime][] = [ - 'documentId' => $issue['uid'], - 'text' => $dayLinkLabel - ]; - } + $dayLinksText = array_merge($dayLinksText, $this->getDayLinksText($day, $currentDayTime)); } } $dayLinkDiv = $dayLinksText; } - switch (strftime('%w', strtotime('+ ' . $k . ' Day', $firstDayOfWeek))) { - case '0': - $calendarData[$key]['week'][$j]['DAYSUN']['dayValue'] = strftime('%d', $currentDayTime); - if ((int) $dayLinks === (int) date('j', $currentDayTime)) { - $calendarData[$key]['week'][$j]['DAYSUN']['issues'] = $dayLinkDiv; - } - break; - case '1': - $calendarData[$key]['week'][$j]['DAYMON']['dayValue'] = strftime('%d', $currentDayTime); - if ((int) $dayLinks === (int) date('j', $currentDayTime)) { - $calendarData[$key]['week'][$j]['DAYMON']['issues'] = $dayLinkDiv; - } - break; - case '2': - $calendarData[$key]['week'][$j]['DAYTUE']['dayValue'] = strftime('%d', $currentDayTime); - if ((int) $dayLinks === (int) date('j', $currentDayTime)) { - $calendarData[$key]['week'][$j]['DAYTUE']['issues'] = $dayLinkDiv; - } - break; - case '3': - $calendarData[$key]['week'][$j]['DAYWED']['dayValue'] = strftime('%d', $currentDayTime); - if ((int) $dayLinks === (int) date('j', $currentDayTime)) { - $calendarData[$key]['week'][$j]['DAYWED']['issues'] = $dayLinkDiv; - } - break; - case '4': - $calendarData[$key]['week'][$j]['DAYTHU']['dayValue'] = strftime('%d', $currentDayTime); - if ((int) $dayLinks === (int) date('j', $currentDayTime)) { - $calendarData[$key]['week'][$j]['DAYTHU']['issues'] = $dayLinkDiv; - } - break; - case '5': - $calendarData[$key]['week'][$j]['DAYFRI']['dayValue'] = strftime('%d', $currentDayTime); - if ((int) $dayLinks === (int) date('j', $currentDayTime)) { - $calendarData[$key]['week'][$j]['DAYFRI']['issues'] = $dayLinkDiv; - } - break; - case '6': - $calendarData[$key]['week'][$j]['DAYSAT']['dayValue'] = strftime('%d', $currentDayTime); - if ((int) $dayLinks === (int) date('j', $currentDayTime)) { - $calendarData[$key]['week'][$j]['DAYSAT']['issues'] = $dayLinkDiv; - } - break; - } + $this->fillCalendar($calendarData[$key]['week'][$j], $currentDayTime, $dayLinks, $dayLinkDiv, $firstDayOfWeek, $k); } } } } } + /** + * Get text links for given day. + * + * @access private + * + * @param array $day all issues for given day + * @param int $currentDayTime + * + * @return array all issues for given day as text links + */ + private function getDayLinksText(array $day, int $currentDayTime): array + { + $dayLinksText = []; + foreach ($day as $issue) { + $dayLinkLabel = empty($issue['title']) ? strftime('%x', $currentDayTime) : $issue['title']; + + $dayLinksText[] = [ + 'documentId' => $issue['uid'], + 'text' => $dayLinkLabel + ]; + + // Save issue for list view. + $this->allIssues[$currentDayTime][] = [ + 'documentId' => $issue['uid'], + 'text' => $dayLinkLabel + ]; + } + return $dayLinksText; + } + + /** + * Fill calendar. + * + * @access private + * + * @param array &$calendarData calendar passed by reference + * @param int $currentDayTime + * @param string $dayLinks + * @param array $dayLinkDiv + * @param int $firstDayOfWeek + * @param int $k + * + * @return void + */ + private function fillCalendar(array &$calendarData, int $currentDayTime, string $dayLinks, array $dayLinkDiv, int $firstDayOfWeek, int $k): void + { + switch (strftime('%w', strtotime('+ ' . $k . ' Day', $firstDayOfWeek))) { + case '0': + $this->fillDay($calendarData, $currentDayTime, 'DAYSUN', $dayLinks, $dayLinkDiv); + break; + case '1': + $this->fillDay($calendarData, $currentDayTime, 'DAYMON', $dayLinks, $dayLinkDiv); + break; + case '2': + $this->fillDay($calendarData, $currentDayTime, 'DAYTUE', $dayLinks, $dayLinkDiv); + break; + case '3': + $this->fillDay($calendarData, $currentDayTime, 'DAYWED', $dayLinks, $dayLinkDiv); + break; + case '4': + $this->fillDay($calendarData, $currentDayTime, 'DAYTHU', $dayLinks, $dayLinkDiv); + break; + case '5': + $this->fillDay($calendarData, $currentDayTime, 'DAYFRI', $dayLinks, $dayLinkDiv); + break; + case '6': + $this->fillDay($calendarData, $currentDayTime, 'DAYSAT', $dayLinks, $dayLinkDiv); + break; + } + } + + /** + * Fill day. + * + * @access private + * + * @param array &$calendarData calendar passed by reference + * @param int $currentDayTime + * @param string $day + * @param string $dayLinks + * @param array $dayLinkDiv + * + * @return void + */ + private function fillDay(array &$calendarData, int $currentDayTime, string $day, string $dayLinks, array $dayLinkDiv): void + { + $calendarData[$day]['dayValue'] = strftime('%d', $currentDayTime); + if ((int) $dayLinks === (int) date('j', $currentDayTime)) { + $calendarData[$day]['issues'] = $dayLinkDiv; + } + } + /** * Build calendar for year (default) or season. * From ce7623b6565d0c48c277780b2861899da0c29c7a Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Fri, 26 Jan 2024 19:51:08 +0100 Subject: [PATCH 16/72] [MAINTENANCE] Improvements in OaiPmhController class (#1136) Co-authored-by: Sebastian Meyer --- Classes/Controller/OaiPmhController.php | 228 ++++++++++++++++-------- 1 file changed, 153 insertions(+), 75 deletions(-) diff --git a/Classes/Controller/OaiPmhController.php b/Classes/Controller/OaiPmhController.php index 6901a2423..81c7430ef 100644 --- a/Classes/Controller/OaiPmhController.php +++ b/Classes/Controller/OaiPmhController.php @@ -173,25 +173,25 @@ protected function getUrlParams() * Get unqualified Dublin Core data. * @see http://www.openarchives.org/OAI/openarchivesprotocol.html#dublincore * - * @access protected + * @access private * * @param array $record The full record array * * @return array The mapped metadata array */ - protected function getDcData(array $record) + private function getDublinCoreData(array $record) { $metadata = []; $metadata[] = ['dc:identifier' => $record['record_id']]; - $this->addDcData($metadata, 'dc:identifier', $record['purl']); - $this->addDcData($metadata, 'dc:identifier', $record['prod_id']); - $this->addDcData($metadata, 'dc:identifier', $record['urn']); - $this->addDcData($metadata, 'dc:title', $record['title']); - $this->addDcData($metadata, 'dc:creator', $record['author']); - $this->addDcData($metadata, 'dc:date', $record['year']); - $this->addDcData($metadata, 'dc:coverage', $record['place']); + $this->addDublinCoreData($metadata, 'dc:identifier', $record['purl']); + $this->addDublinCoreData($metadata, 'dc:identifier', $record['prod_id']); + $this->addDublinCoreData($metadata, 'dc:identifier', $record['urn']); + $this->addDublinCoreData($metadata, 'dc:title', $record['title']); + $this->addDublinCoreData($metadata, 'dc:creator', $record['author']); + $this->addDublinCoreData($metadata, 'dc:date', $record['year']); + $this->addDublinCoreData($metadata, 'dc:coverage', $record['place']); $record[] = ['dc:format' => $record['application/mets+xml']]; $record[] = ['dc:type' => $record['Text']]; @@ -202,25 +202,28 @@ protected function getDcData(array $record) $metadata[] = ['dc:relation' => $document->getRecordId()]; } } - $this->addDcData($metadata, 'dc:rights', $record['license']); - $this->addDcData($metadata, 'dc:rights', $record['terms']); - $this->addDcData($metadata, 'dc:rights', $record['restrictions']); - $this->addDcData($metadata, 'dc:rights', $record['out_of_print']); - $this->addDcData($metadata, 'dc:rights', $record['rights_info']); + $this->addDublinCoreData($metadata, 'dc:rights', $record['license']); + $this->addDublinCoreData($metadata, 'dc:rights', $record['terms']); + $this->addDublinCoreData($metadata, 'dc:rights', $record['restrictions']); + $this->addDublinCoreData($metadata, 'dc:rights', $record['out_of_print']); + $this->addDublinCoreData($metadata, 'dc:rights', $record['rights_info']); return $metadata; } /** + * Add Dublin Core data. + * * @access private * - * @param array $metadata The mapped metadata array + * @param array $metadata The mapped metadata array passed as reference * @param string $key The key to which record value should be assigned * @param string $value The key from record array * * @return void */ - private function addDcData(&$metadata, $key, $value) { + private function addDublinCoreData(&$metadata, $key, $value) + { if (!empty($value)) { $metadata[] = [$key => $value]; } @@ -363,7 +366,7 @@ protected function verbGetRecord() // Add metadata switch ($this->parameters['metadataPrefix']) { case 'oai_dc': - $document['metadata'] = $this->getDcData($document); + $document['metadata'] = $this->getDublinCoreData($document); break; case 'epicur': $document['metadata'] = $document; @@ -461,7 +464,7 @@ protected function verbListIdentifiers() return; } try { - $documentSet = $this->fetchDocumentUIDs(); + $documentSet = $this->fetchDocumentSet(); } catch (\Exception $exception) { $this->error = 'idDoesNotExist'; return; @@ -551,13 +554,13 @@ protected function verbListRecords() return; } try { - $documentSet = $this->fetchDocumentUIDs(); + $documentSet = $this->fetchDocumentSet(); } catch (\Exception $exception) { $this->error = 'idDoesNotExist'; return; } $resultSet = []; - if (is_array($documentSet)) { + if (count($documentSet) > 0) { $resultSet['elements'] = $documentSet; $resultSet['metadata'] = [ 'cursor' => 0, @@ -592,65 +595,119 @@ protected function verbListSets() * * @access protected * - * @return array|null Array of matching records + * @return array matching records or empty array if there were some errors */ - protected function fetchDocumentUIDs() + protected function fetchDocumentSet(): array { - $solr_query = ''; + $documentSet = []; + $solrQuery = ''; // Check "set" for valid value. if (!empty($this->parameters['set'])) { // For SOLR we need the index_name of the collection, // For DB Query we need the UID of the collection $result = $this->collectionRepository->getIndexNameForSolr($this->settings, $this->parameters['set']); - - if ($resArray = $result->fetchAssociative()) { + $resArray = $result->fetchAssociative(); + if ($resArray) { if ($resArray['index_query'] != "") { - $solr_query .= '(' . $resArray['index_query'] . ')'; + $solrQuery .= '(' . $resArray['index_query'] . ')'; } else { - $solr_query .= 'collection:' . '"' . $resArray['index_name'] . '"'; + $solrQuery .= 'collection:' . '"' . $resArray['index_name'] . '"'; } } else { $this->error = 'noSetHierarchy'; - return null; + return $documentSet; } } else { // If no set is specified we have to query for all collections - $solr_query .= 'collection:* NOT collection:""'; + $solrQuery .= 'collection:* NOT collection:""'; } // Check for required fields. foreach ($this->formats[$this->parameters['metadataPrefix']]['requiredFields'] as $required) { - $solr_query .= ' NOT ' . $required . ':""'; + $solrQuery .= ' NOT ' . $required . ':""'; } // toplevel="true" is always required - $solr_query .= ' AND toplevel:true'; + $solrQuery .= ' AND toplevel:true'; + + $from = $this->getFrom(); + $until = $this->getUntil($from); + + $this->checkGranularity(); + + if ($this->error === 'badArgument') { + return $documentSet; + } + + $solrQuery .= ' AND timestamp:[' . $from . ' TO ' . $until . ']'; + + $solr = Solr::getInstance($this->settings['solrcore']); + if (!$solr->ready) { + $this->logger->error('Apache Solr not available'); + return $documentSet; + } + if ((int) $this->settings['solr_limit'] > 0) { + $solr->limit = (int) $this->settings['solr_limit']; + } + // We only care about the UID in the results and want them sorted + $parameters = [ + "fields" => "uid", + "sort" => [ + "uid" => "asc" + ] + ]; + $parameters['query'] = $solrQuery; + $result = $solr->searchRaw($parameters); + if (empty($result)) { + $this->error = 'noRecordsMatch'; + return $documentSet; + } + foreach ($result as $doc) { + $documentSet[] = $doc->uid; + } + return $documentSet; + } + + /** + * Get 'from' query parameter. + * + * @access private + * + * @return string + */ + private function getFrom(): string + { $from = "*"; // Check "from" for valid value. if (!empty($this->parameters['from'])) { // Is valid format? - if ( - is_array($date_array = strptime($this->parameters['from'], '%Y-%m-%dT%H:%M:%SZ')) - || is_array($date_array = strptime($this->parameters['from'], '%Y-%m-%d')) - ) { - $timestamp = gmmktime($date_array['tm_hour'], $date_array['tm_min'], $date_array['tm_sec'], - $date_array['tm_mon'] + 1, $date_array['tm_mday'], $date_array['tm_year'] + 1900); - $from = date("Y-m-d", $timestamp) . 'T' . date("H:i:s", $timestamp) . '.000Z'; + $date = $this->getDate('from'); + if (is_array($date)) { + $from = $this->getDateFromTimestamp($date, '.000Z'); } else { $this->error = 'badArgument'; - return; } } + return $from; + } + + /** + * Get 'until' query parameter. + * + * @access private + * + * @param string $from start date + * + * @return string + */ + private function getUntil(string $from): string + { $until = "*"; // Check "until" for valid value. if (!empty($this->parameters['until'])) { // Is valid format? - if ( - is_array($date_array = strptime($this->parameters['until'], '%Y-%m-%dT%H:%M:%SZ')) - || is_array($date_array = strptime($this->parameters['until'], '%Y-%m-%d')) - ) { - $timestamp = gmmktime($date_array['tm_hour'], $date_array['tm_min'], $date_array['tm_sec'], - $date_array['tm_mon'] + 1, $date_array['tm_mday'], $date_array['tm_year'] + 1900); - $until = date("Y-m-d", $timestamp) . 'T' . date("H:i:s", $timestamp) . '.999Z'; + $date = $this->getDate('until'); + if (is_array($date)) { + $until = $this->getDateFromTimestamp($date, '.999Z'); if ($from != "*" && $from > $until) { $this->error = 'badArgument'; } @@ -658,7 +715,55 @@ protected function fetchDocumentUIDs() $this->error = 'badArgument'; } } - // Check "from" and "until" for same granularity. + return $until; + } + + /** + * Get date from parameter string. + * + * @access private + * + * @param string $dateType + * + * @return array|false + */ + private function getDate(string $dateType) + { + return strptime($this->parameters[$dateType], '%Y-%m-%dT%H:%M:%SZ') ?: strptime($this->parameters[$dateType], '%Y-%m-%d'); + } + + /** + * Get date from timestamp. + * + * @access private + * + * @param array $date + * @param string $end + * + * @return string + */ + private function getDateFromTimestamp(array $date, string $end): string + { + $timestamp = gmmktime( + $date['tm_hour'], + $date['tm_min'], + $date['tm_sec'], + $date['tm_mon'] + 1, + $date['tm_mday'], + $date['tm_year'] + 1900 + ); + return date("Y-m-d", $timestamp) . 'T' . date("H:i:s", $timestamp) . $end; + } + + /** + * Check "from" and "until" for same granularity. + * + * @access private + * + * @return void + */ + private function checkGranularity(): void + { if ( !empty($this->parameters['from']) && !empty($this->parameters['until']) @@ -667,33 +772,6 @@ protected function fetchDocumentUIDs() $this->error = 'badArgument'; } } - $solr_query .= ' AND timestamp:[' . $from . ' TO ' . $until . ']'; - $documentSet = []; - $solr = Solr::getInstance($this->settings['solrcore']); - if (!$solr->ready) { - $this->logger->error('Apache Solr not available'); - return $documentSet; - } - if (intval($this->settings['solr_limit']) > 0) { - $solr->limit = intval($this->settings['solr_limit']); - } - // We only care about the UID in the results and want them sorted - $parameters = [ - "fields" => "uid", - "sort" => [ - "uid" => "asc" - ] - ]; - $parameters['query'] = $solr_query; - $result = $solr->searchRaw($parameters); - if (empty($result)) { - $this->error = 'noRecordsMatch'; - return; - } - foreach ($result as $doc) { - $documentSet[] = $doc->uid; - } - return $documentSet; } /** @@ -730,7 +808,7 @@ protected function generateOutputForDocumentList(array $documentListSet) } switch ($metadataPrefix) { case 'oai_dc': - $resArray['metadata'] = $this->getDcData($resArray); + $resArray['metadata'] = $this->getDublinCoreData($resArray); break; case 'epicur': $resArray['metadata'] = $resArray; From 8c9732bfa61f5091a9d4880926bbbe800b494985 Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Fri, 26 Jan 2024 19:56:34 +0100 Subject: [PATCH 17/72] [MAINTENANCE] Improvements in AbstractDocument class (#1138) Co-authored-by: Sebastian Meyer --- Classes/Common/AbstractDocument.php | 69 +++++++++++++++++++---------- 1 file changed, 45 insertions(+), 24 deletions(-) diff --git a/Classes/Common/AbstractDocument.php b/Classes/Common/AbstractDocument.php index 2e6b443b6..5911ff277 100644 --- a/Classes/Common/AbstractDocument.php +++ b/Classes/Common/AbstractDocument.php @@ -309,7 +309,7 @@ abstract public function getDownloadLocation(string $id): string; * @abstract * * @param string $id The "@ID" attribute of the file node (METS) or the "@id" property of the IIIF resource - * + * * @return array|null The set of file information */ abstract public function getFileInfo($id): ?array; @@ -581,7 +581,7 @@ public static function &getInstance(string $location, array $settings = [], bool } // Sanitize input. - $pid = max(intval($settings['storagePid']), 0); + $pid = max((int) $settings['storagePid'], 0); if ($documentFormat == 'METS') { $instance = new MetsDocument($pid, $location, $xml, $settings); } elseif ($documentFormat == 'IIIF') { @@ -590,7 +590,7 @@ public static function &getInstance(string $location, array $settings = [], bool $instance = new IiifManifest($pid, $location, $iiif); } - if (!is_null($instance)) { + if ($instance !== null) { self::setDocumentCache($location, $instance); } @@ -686,19 +686,7 @@ protected function getFullTextFromXml(string $id): string if (!empty($fileContent) && !empty($this->formats[$textFormat])) { $textMiniOcr = ''; if (!empty($this->formats[$textFormat]['class'])) { - $class = $this->formats[$textFormat]['class']; - // Get the raw text from class. - if ( - class_exists($class) - && ($obj = GeneralUtility::makeInstance($class)) instanceof FulltextInterface - ) { - // Load XML from file. - $ocrTextXml = Helper::getXmlFileAsString($fileContent); - $textMiniOcr = $obj->getTextAsMiniOcr($ocrTextXml); - $this->rawTextArray[$id] = $textMiniOcr; - } else { - $this->logger->warning('Invalid class/method "' . $class . '->getRawText()" for text format "' . $textFormat . '"'); - } + $textMiniOcr = $this->getRawTextFromClass($id, $fileContent, $textFormat); } $fullText = $textMiniOcr; } else { @@ -707,6 +695,38 @@ class_exists($class) return $fullText; } + /** + * Get raw text from class for given format. + * + * @access private + * + * @param $id + * @param $fileContent + * @param $textFormat + * + * @return string + */ + private function getRawTextFromClass($id, $fileContent, $textFormat): string + { + $textMiniOcr = ''; + $class = $this->formats[$textFormat]['class']; + // Get the raw text from class. + if (class_exists($class)) { + $obj = GeneralUtility::makeInstance($class); + if ($obj instanceof FulltextInterface) { + // Load XML from file. + $ocrTextXml = Helper::getXmlFileAsString($fileContent); + $textMiniOcr = $obj->getTextAsMiniOcr($ocrTextXml); + $this->rawTextArray[$id] = $textMiniOcr; + } else { + $this->logger->warning('Invalid class/method "' . $class . '->getRawText()" for text format "' . $textFormat . '"'); + } + } else { + $this->logger->warning('Class "' . $class . ' does not exists for "' . $textFormat . ' text format"'); + } + return $textMiniOcr; + } + /** * Get format of the OCR full text * @@ -744,7 +764,7 @@ public static function getTitle(int $uid, bool $recursive = false): string { $title = ''; // Sanitize input. - $uid = max(intval($uid), 0); + $uid = max($uid, 0); if ($uid) { $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class) ->getQueryBuilderForTable('tx_dlf_documents'); @@ -762,7 +782,8 @@ public static function getTitle(int $uid, bool $recursive = false): string ->setMaxResults(1) ->execute(); - if ($resArray = $result->fetchAssociative()) { + $resArray = $result->fetchAssociative(); + if ($resArray) { // Get title information. $title = $resArray['title']; $partof = $resArray['partof']; @@ -770,7 +791,7 @@ public static function getTitle(int $uid, bool $recursive = false): string if ( $recursive && empty($title) - && intval($partof) + && (int) $partof && $partof != $uid ) { $title = self::getTitle($partof, true); @@ -950,7 +971,8 @@ public function registerNamespaces(&$obj): void * * @return array */ - protected function initializeMetadata(string $format): array { + protected function initializeMetadata(string $format): array + { return [ 'title' => [], 'title_sorting' => [], @@ -1161,7 +1183,7 @@ protected function magicGetTableOfContents(): array */ protected function _setCPid(int $value): void { - $this->cPid = max(intval($value), 0); + $this->cPid = max($value, 0); } /** @@ -1258,7 +1280,7 @@ public function __set(string $var, $value): void */ private static function getDocumentCache(string $location) { - $cacheIdentifier = md5($location); + $cacheIdentifier = hash('md5', $location); $cache = GeneralUtility::makeInstance(CacheManager::class)->getCache('tx_dlf_doc'); $cacheHit = $cache->get($cacheIdentifier); @@ -1279,11 +1301,10 @@ private static function getDocumentCache(string $location) */ private static function setDocumentCache(string $location, AbstractDocument $currentDocument): void { - $cacheIdentifier = md5($location); + $cacheIdentifier = hash('md5', $location); $cache = GeneralUtility::makeInstance(CacheManager::class)->getCache('tx_dlf_doc'); // Save value in cache $cache->set($cacheIdentifier, $currentDocument); } - } From d0afeca9ad3edd6c746d3959983b3185aa1eac92 Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Fri, 26 Jan 2024 20:00:47 +0100 Subject: [PATCH 18/72] [MAINTENANCE] Improvements in Mods class (#1139) Co-authored-by: Sebastian Meyer --- Classes/Format/Mods.php | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/Classes/Format/Mods.php b/Classes/Format/Mods.php index cc63962e9..eeb4f0b18 100644 --- a/Classes/Format/Mods.php +++ b/Classes/Format/Mods.php @@ -21,7 +21,7 @@ * * @package TYPO3 * @subpackage dlf - * + * * @access public */ class Mods implements MetadataInterface @@ -323,9 +323,10 @@ private function getPlaces(): void private function getYears(): void { // Get "year_sorting". - if (($years_sorting = $this->xml->xpath('./mods:originInfo[not(./mods:edition="[Electronic ed.]")]/mods:dateOther[@type="order" and @encoding="w3cdtf"]'))) { - foreach ($years_sorting as $year_sorting) { - $this->metadata['year_sorting'][0] = intval($year_sorting); + $yearsSorting = $this->xml->xpath('./mods:originInfo[not(./mods:edition="[Electronic ed.]")]/mods:dateOther[@type="order" and @encoding="w3cdtf"]'); + if ($yearsSorting) { + foreach ($yearsSorting as $yearSorting) { + $this->metadata['year_sorting'][0] = (int) $yearSorting; } } // Get "year" and "year_sorting" if not specified separately. @@ -339,14 +340,14 @@ private function getYears(): void foreach ($years as $year) { $this->metadata['year'][] = (string) $year; if (!$this->metadata['year_sorting'][0]) { - $year_sorting = str_ireplace('x', '5', preg_replace('/[^\d.x]/i', '', (string) $year)); + $yearSorting = str_ireplace('x', '5', preg_replace('/[^\d.x]/i', '', (string) $year)); if ( - strpos($year_sorting, '.') - || strlen($year_sorting) < 3 + strpos($yearSorting, '.') + || strlen($yearSorting) < 3 ) { - $year_sorting = ((intval(trim($year_sorting, '.')) - 1) * 100) + 50; + $yearSorting = (((int) trim($yearSorting, '.') - 1) * 100) + 50; } - $this->metadata['year_sorting'][0] = intval($year_sorting); + $this->metadata['year_sorting'][0] = (int) $yearSorting; } } } From 0933be493425aed36765c9e7207ddefbb80548ac Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Fri, 26 Jan 2024 20:05:10 +0100 Subject: [PATCH 19/72] [BUGFIX] Add fallback to location if there is no record id in METS file (#1141) Co-authored-by: Sebastian Meyer --- .github/phpstan.neon | 1 + Classes/Command/IndexCommand.php | 46 +++++++++++++++++++++++--------- 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/.github/phpstan.neon b/.github/phpstan.neon index fa63a3481..750315ed9 100644 --- a/.github/phpstan.neon +++ b/.github/phpstan.neon @@ -5,6 +5,7 @@ parameters: - '#Call to an undefined method Kitodo\\Dlf\\Domain\\Repository\\[a-zA-Z]+Repository::findByIsSortable\(\)\.#' - '#Call to an undefined method Kitodo\\Dlf\\Domain\\Repository\\[a-zA-Z]+Repository::findOneByFeUserId\(\)\.#' - '#Call to an undefined method Kitodo\\Dlf\\Domain\\Repository\\[a-zA-Z]+Repository::findOneByIndexName\(\)\.#' + - '#Call to an undefined method Kitodo\\Dlf\\Domain\\Repository\\[a-zA-Z]+Repository::findOneByLocation\(\)\.#' - '#Call to an undefined method Kitodo\\Dlf\\Domain\\Repository\\[a-zA-Z]+Repository::findOneByPid\(\)\.#' - '#Call to an undefined method Kitodo\\Dlf\\Domain\\Repository\\[a-zA-Z]+Repository::findOneByRecordId\(\)\.#' - '#Call to an undefined method Kitodo\\Dlf\\Domain\\Repository\\[a-zA-Z]+Repository::findOneByRoot\(\)\.#' diff --git a/Classes/Command/IndexCommand.php b/Classes/Command/IndexCommand.php index f719f92ad..f54e56a44 100644 --- a/Classes/Command/IndexCommand.php +++ b/Classes/Command/IndexCommand.php @@ -168,19 +168,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int } else if (GeneralUtility::isValidUrl($input->getOption('doc'))) { $doc = AbstractDocument::getInstance($input->getOption('doc'), ['storagePid' => $this->storagePid], true); - if ($doc->recordId) { - $document = $this->documentRepository->findOneByRecordId($doc->recordId); - } - - if ($document === null) { - // create new Document object - $document = GeneralUtility::makeInstance(Document::class); - } - - // now there must exist a document object - if ($document) { - $document->setLocation($input->getOption('doc')); - } + $document = $this->getDocumentFromUrl($doc, $input->getOption('doc')); } if ($doc === null) { @@ -208,4 +196,36 @@ protected function execute(InputInterface $input, OutputInterface $output): int return 0; } + /** + * Get document from given URL. Find it in database, if not found create the new one. + * + * @access private + * + * @param AbstractDocument $doc + * @param string $url + * + * @return Document + */ + private function getDocumentFromUrl($doc, string $url): Document + { + $document = null; + + if ($doc->recordId) { + $document = $this->documentRepository->findOneByRecordId($doc->recordId); + } else { + $document = $this->documentRepository->findOneByLocation($url); + } + + if ($document === null) { + // create new Document object + $document = GeneralUtility::makeInstance(Document::class); + } + + // now there must exist a document object + if ($document) { + $document->setLocation($url); + } + + return $document; + } } From 620718db8d3bdee82665c93b95de8ab20e9970b5 Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Fri, 26 Jan 2024 20:08:21 +0100 Subject: [PATCH 20/72] [MAINTENANCE] Remove usage of getDocumentType with 3D View plugin (#1144) Co-authored-by: Sebastian Meyer --- Resources/Private/Templates/View3D/Main.html | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/Resources/Private/Templates/View3D/Main.html b/Resources/Private/Templates/View3D/Main.html index 34312f654..5fa402fc1 100644 --- a/Resources/Private/Templates/View3D/Main.html +++ b/Resources/Private/Templates/View3D/Main.html @@ -13,11 +13,13 @@ xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true"> -

- - - - - - + +

+ + + + + + +
From f9dae4ab82f382b4b63ee8b41e096e29543e67dc Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Fri, 26 Jan 2024 20:11:54 +0100 Subject: [PATCH 21/72] [MAINTENANCE] Remove deprecated commands configuration (#1145) Co-authored-by: Sebastian Meyer --- Configuration/Commands.php | 33 --------------------------------- 1 file changed, 33 deletions(-) delete mode 100644 Configuration/Commands.php diff --git a/Configuration/Commands.php b/Configuration/Commands.php deleted file mode 100644 index d46d08180..000000000 --- a/Configuration/Commands.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * This file is part of the Kitodo and TYPO3 projects. - * - * @license GNU General Public License version 3 or later. - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - */ - -/** - * Commands to be executed by TYPO3, where the key of the array - * is the name of the command (to be called as the first argument after "typo3"). - * Required parameter is the "class" of the command which needs to be a subclass - * of \Symfony\Component\Console\Command\Command. - * - * This file is deprecated in TYPO3 v10 and will be removed in TYPO3 v11. - * See Deprecation: #89139 - Console Commands configuration format Commands.php - * https://docs.typo3.org/c/typo3/cms-core/master/en-us/Changelog/10.3/Deprecation-89139-ConsoleCommandsConfigurationFormatCommandsPhp.html - */ -return [ - 'kitodo:harvest' => [ - 'class' => Kitodo\Dlf\Command\HarvestCommand::class - ], - 'kitodo:index' => [ - 'class' => Kitodo\Dlf\Command\IndexCommand::class - ], - 'kitodo:reindex' => [ - 'class' => Kitodo\Dlf\Command\ReindexCommand::class - ] -]; From 93a4b45ecb28bf0edf7af3b207bcb5dbcfedce84 Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Fri, 26 Jan 2024 20:34:50 +0100 Subject: [PATCH 22/72] [MAINTENANCE] Replace exits and returns in commands' execute functions (#1146) Co-authored-by: Sebastian Meyer --- Classes/Command/HarvestCommand.php | 16 ++++++++-------- Classes/Command/IndexCommand.php | 14 +++++++------- Classes/Command/ReindexCommand.php | 14 +++++++------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/Classes/Command/HarvestCommand.php b/Classes/Command/HarvestCommand.php index e62fa04df..b3e565538 100644 --- a/Classes/Command/HarvestCommand.php +++ b/Classes/Command/HarvestCommand.php @@ -112,7 +112,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int if ($this->storagePid == 0) { $io->error('ERROR: No valid PID (' . $this->storagePid . ') given.'); - exit(1); + return BaseCommand::FAILURE; } if ( @@ -133,15 +133,15 @@ protected function execute(InputInterface $input, OutputInterface $output): int } if (empty($output_solrCores)) { $io->error('ERROR: No valid Solr core ("' . $input->getOption('solr') . '") given. No valid cores found on PID ' . $this->storagePid . ".\n"); - exit(1); + return BaseCommand::FAILURE; } else { $io->error('ERROR: No valid Solr core ("' . $input->getOption('solr') . '") given. ' . "Valid cores are (:):\n" . implode("\n", $output_solrCores) . "\n"); - exit(1); + return BaseCommand::FAILURE; } } } else { $io->error('ERROR: Required parameter --solr|-s is missing or array.'); - exit(1); + return BaseCommand::FAILURE; } if (MathUtility::canBeInterpretedAsInteger($input->getOption('lib'))) { @@ -152,11 +152,11 @@ protected function execute(InputInterface $input, OutputInterface $output): int $baseUrl = $this->owner->getOaiBase(); } else { $io->error('ERROR: Required parameter --lib|-l is not a valid UID.'); - exit(1); + return BaseCommand::FAILURE; } if (!GeneralUtility::isValidUrl($baseUrl)) { $io->error('ERROR: No valid OAI Base URL set for library with given UID ("' . $input->getOption('lib') . '").'); - exit(1); + return BaseCommand::FAILURE; } else { try { $oai = Endpoint::build($baseUrl); @@ -198,7 +198,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int } if (empty($set)) { $io->error('ERROR: OAI interface does not provide a set with given setSpec ("' . $input->getOption('set') . '").'); - exit(1); + return BaseCommand::FAILURE; } } @@ -261,7 +261,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $io->success('All done!'); - return 0; + return BaseCommand::SUCCESS; } /** diff --git a/Classes/Command/IndexCommand.php b/Classes/Command/IndexCommand.php index f54e56a44..c8dbd4ce6 100644 --- a/Classes/Command/IndexCommand.php +++ b/Classes/Command/IndexCommand.php @@ -99,7 +99,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int if ($this->storagePid == 0) { $io->error('ERROR: No valid PID (' . $this->storagePid . ') given.'); - exit(1); + return BaseCommand::FAILURE; } if ( @@ -117,15 +117,15 @@ protected function execute(InputInterface $input, OutputInterface $output): int } if (empty($output_solrCores)) { $io->error('ERROR: No valid Solr core ("' . $input->getOption('solr') . '") given. No valid cores found on PID ' . $this->storagePid . ".\n"); - exit(1); + return BaseCommand::FAILURE; } else { $io->error('ERROR: No valid Solr core ("' . $input->getOption('solr') . '") given. ' . "Valid cores are (:):\n" . implode("\n", $output_solrCores) . "\n"); - exit(1); + return BaseCommand::FAILURE; } } } else { $io->error('ERROR: Required parameter --solr|-s is missing or array.'); - exit(1); + return BaseCommand::FAILURE; } if ( @@ -137,7 +137,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int ) ) { $io->error('ERROR: Required parameter --doc|-d is not a valid document UID or URL.'); - exit(1); + return BaseCommand::FAILURE; } if (!empty($input->getOption('owner'))) { @@ -173,7 +173,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int if ($doc === null) { $io->error('ERROR: Document "' . $input->getOption('doc') . '" could not be loaded.'); - exit(1); + return BaseCommand::FAILURE; } $document->setSolrcore($solrCoreUid); @@ -193,7 +193,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $io->success('All done!'); - return 0; + return BaseCommand::SUCCESS; } /** diff --git a/Classes/Command/ReindexCommand.php b/Classes/Command/ReindexCommand.php index 19df87ff1..5ebdc9213 100644 --- a/Classes/Command/ReindexCommand.php +++ b/Classes/Command/ReindexCommand.php @@ -103,7 +103,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int if ($this->storagePid == 0) { $io->error('ERROR: No valid PID (' . $this->storagePid . ') given.'); - exit(1); + return BaseCommand::FAILURE; } if ( @@ -121,15 +121,15 @@ protected function execute(InputInterface $input, OutputInterface $output): int } if (empty($output_solrCores)) { $io->error('ERROR: No valid Solr core ("' . $input->getOption('solr') . '") given. No valid cores found on PID ' . $this->storagePid . ".\n"); - exit(1); + return BaseCommand::FAILURE; } else { $io->error('ERROR: No valid Solr core ("' . $input->getOption('solr') . '") given. ' . "Valid cores are (:):\n" . implode("\n", $output_solrCores) . "\n"); - exit(1); + return BaseCommand::FAILURE; } } } else { $io->error('ERROR: Required parameter --solr|-s is missing or array.'); - exit(1); + return BaseCommand::FAILURE; } if (!empty($input->getOption('owner'))) { @@ -152,13 +152,13 @@ protected function execute(InputInterface $input, OutputInterface $output): int // "coll" may be a single integer or a comma-separated list of integers. if (empty(array_filter(GeneralUtility::intExplode(',', $input->getOption('coll'), true)))) { $io->error('ERROR: Parameter --coll|-c is not a valid comma-separated list of collection UIDs.'); - exit(1); + return BaseCommand::FAILURE; } // Get all documents of given collections. $documents = $this->documentRepository->findAllByCollectionsLimited(GeneralUtility::intExplode(',', $input->getOption('coll'), true), 0); } else { $io->error('ERROR: One of parameters --all|-a or --coll|-c must be given.'); - exit(1); + return BaseCommand::FAILURE; } foreach ($documents as $id => $document) { @@ -187,6 +187,6 @@ protected function execute(InputInterface $input, OutputInterface $output): int $io->success('All done!'); - return 0; + return BaseCommand::SUCCESS; } } From 1336b0ade58d9f73f713c713e6b94ebf174a6ccc Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Mon, 29 Jan 2024 15:47:27 +0100 Subject: [PATCH 23/72] [BUGFIX] Fix and improve SolrSearch class (#1123) Co-authored-by: Sebastian Meyer --- Classes/Common/Solr/SolrSearch.php | 121 ++++++++++-------- Classes/Controller/CollectionController.php | 2 +- Classes/Controller/ListViewController.php | 6 +- Classes/Controller/SearchController.php | 5 +- .../Domain/Repository/DocumentRepository.php | 59 ++++++++- Tests/Functional/Common/SolrIndexingTest.php | 12 +- .../Functional/Common/SolrSearchQueryTest.php | 2 +- 7 files changed, 139 insertions(+), 68 deletions(-) diff --git a/Classes/Common/Solr/SolrSearch.php b/Classes/Common/Solr/SolrSearch.php index 677f7bcb0..4b40e91f3 100644 --- a/Classes/Common/Solr/SolrSearch.php +++ b/Classes/Common/Solr/SolrSearch.php @@ -37,10 +37,9 @@ class SolrSearch implements \Countable, \Iterator, \ArrayAccess, QueryResultInte /** * @access private - * @var array|null + * @var array|QueryResultInterface */ - // TODO: confusing naming, here is passed array of collections and it is used as array in prepare() - private $collection; + private $collections; /** * @access private @@ -84,17 +83,17 @@ class SolrSearch implements \Countable, \Iterator, \ArrayAccess, QueryResultInte * @access public * * @param DocumentRepository $documentRepository - * @param array|null $collection + * @param array|QueryResultInterface $collections can contain 0, 1 or many Collection objects * @param array $settings * @param array $searchParams * @param QueryResult $listedMetadata * * @return void */ - public function __construct(DocumentRepository $documentRepository, $collection, array $settings, array $searchParams, QueryResult $listedMetadata = null) + public function __construct(DocumentRepository $documentRepository, $collections, array $settings, array $searchParams, QueryResult $listedMetadata = null) { $this->documentRepository = $documentRepository; - $this->collection = $collection; + $this->collections = $collections; $this->settings = $settings; $this->searchParams = $searchParams; $this->listedMetadata = $listedMetadata; @@ -433,55 +432,14 @@ public function prepare() } // if collections are given, we prepare the collection query string - // TODO: this->collection should not be actually called collections? - if ($this->collection) { - $collectionsQueryString = ''; - $virtualCollectionsQueryString = ''; - foreach ($this->collection as $collectionEntry) { - // check for virtual collections query string - if ($collectionEntry->getIndexSearch()) { - $virtualCollectionsQueryString .= empty($virtualCollectionsQueryString) ? '(' . $collectionEntry->getIndexSearch() . ')' : ' OR ('. $collectionEntry->getIndexSearch() . ')' ; - } else { - $collectionsQueryString .= empty($collectionsQueryString) ? '"' . $collectionEntry->getIndexName() . '"' : ' OR "' . $collectionEntry->getIndexName() . '"'; - } - } - - // distinguish between simple collection browsing and actual searching within the collection(s) - if (!empty($collectionsQueryString)) { - if (empty($query)) { - $collectionsQueryString = '(collection_faceting:(' . $collectionsQueryString . ') AND toplevel:true AND partof:0)'; - } else { - $collectionsQueryString = '(collection_faceting:(' . $collectionsQueryString . '))'; - } - } - - // virtual collections might query documents that are neither toplevel:true nor partof:0 and need to be searched separatly - if (!empty($virtualCollectionsQueryString)) { - $virtualCollectionsQueryString = '(' . $virtualCollectionsQueryString . ')'; - } - - // combine both querystrings into a single filterquery via OR if both are given, otherwise pass either of those - $params['filterquery'][]['query'] = implode(' OR ', array_filter([$collectionsQueryString, $virtualCollectionsQueryString])); + if (!empty($this->collections)) { + $params['filterquery'][]['query'] = $this->getCollectionFilterQuery($query); } // Set some query parameters. $params['query'] = !empty($query) ? $query : '*'; - // order the results as given or by title as default - if (!empty($this->searchParams['orderBy'])) { - $querySort = [ - $this->searchParams['orderBy'] => $this->searchParams['order'], - ]; - } else { - $querySort = [ - 'score' => 'desc', - 'year_sorting' => 'asc', - 'title_sorting' => 'asc', - 'volume' => 'asc' - ]; - } - - $params['sort'] = $querySort; + $params['sort'] = $this->getSort(); $params['listMetadataRecords'] = []; // Restrict the fields to the required ones. @@ -768,6 +726,69 @@ protected function searchSolr($parameters = [], $enableCache = true) return $resultSet; } + /** + * Get collection filter query for search. + * + * @access private + * + * @param string $query + * + * @return string + */ + private function getCollectionFilterQuery(string $query) : string + { + $collectionsQueryString = ''; + $virtualCollectionsQueryString = ''; + foreach ($this->collections as $collection) { + // check for virtual collections query string + if ($collection->getIndexSearch()) { + $virtualCollectionsQueryString .= empty($virtualCollectionsQueryString) ? '(' . $collection->getIndexSearch() . ')' : ' OR (' . $collection->getIndexSearch() . ')'; + } else { + $collectionsQueryString .= empty($collectionsQueryString) ? '"' . $collection->getIndexName() . '"' : ' OR "' . $collection->getIndexName() . '"'; + } + } + + // distinguish between simple collection browsing and actual searching within the collection(s) + if (!empty($collectionsQueryString)) { + if (empty($query)) { + $collectionsQueryString = '(collection_faceting:(' . $collectionsQueryString . ') AND toplevel:true AND partof:0)'; + } else { + $collectionsQueryString = '(collection_faceting:(' . $collectionsQueryString . '))'; + } + } + + // virtual collections might query documents that are neither toplevel:true nor partof:0 and need to be searched separately + if (!empty($virtualCollectionsQueryString)) { + $virtualCollectionsQueryString = '(' . $virtualCollectionsQueryString . ')'; + } + + // combine both query strings into a single filterquery via OR if both are given, otherwise pass either of those + return implode(' OR ', array_filter([$collectionsQueryString, $virtualCollectionsQueryString])); + } + + /** + * Get sort order of the results as given or by title as default. + * + * @access private + * + * @return array + */ + private function getSort() : array + { + if (!empty($this->searchParams['orderBy'])) { + return [ + $this->searchParams['orderBy'] => $this->searchParams['order'], + ]; + } + + return [ + 'score' => 'desc', + 'year_sorting' => 'asc', + 'title_sorting' => 'asc', + 'volume' => 'asc' + ]; + } + /** * Gets a document * diff --git a/Classes/Controller/CollectionController.php b/Classes/Controller/CollectionController.php index 19c3c990e..c7ecb958b 100644 --- a/Classes/Controller/CollectionController.php +++ b/Classes/Controller/CollectionController.php @@ -157,7 +157,7 @@ public function showAction(Collection $collection): void // get all documents of given collection $solrResults = null; if (is_array($searchParams) && !empty($searchParams)) { - $solrResults = $this->documentRepository->findSolrByCollection([$collection], $this->settings, $searchParams, $listedMetadata); + $solrResults = $this->documentRepository->findSolrByCollection($collection, $this->settings, $searchParams, $listedMetadata); $itemsPerPage = $this->settings['list']['paginate']['itemsPerPage']; if (empty($itemsPerPage)) { diff --git a/Classes/Controller/ListViewController.php b/Classes/Controller/ListViewController.php index 527496ea5..75944bff9 100644 --- a/Classes/Controller/ListViewController.php +++ b/Classes/Controller/ListViewController.php @@ -80,10 +80,10 @@ public function mainAction(): void $this->searchParams = $this->getParametersSafely('searchParameter'); // extract collection(s) from collection parameter - $collection = []; + $collections = []; if ($this->searchParams['collection']) { foreach(explode(',', $this->searchParams['collection']) as $collectionEntry) { - $collection[] = $this->collectionRepository->findByUid((int) $collectionEntry); + $collections[] = $this->collectionRepository->findByUid((int) $collectionEntry); } } @@ -102,7 +102,7 @@ public function mainAction(): void $solrResults = null; $numResults = 0; if (is_array($this->searchParams) && !empty($this->searchParams)) { - $solrResults = $this->documentRepository->findSolrByCollection($collection, $this->settings, $this->searchParams, $listedMetadata); + $solrResults = $this->documentRepository->findSolrByCollections($collections, $this->settings, $this->searchParams, $listedMetadata); $numResults = $solrResults->getNumFound(); $itemsPerPage = $this->settings['list']['paginate']['itemsPerPage']; diff --git a/Classes/Controller/SearchController.php b/Classes/Controller/SearchController.php index e99eb06da..f2e8788d6 100644 --- a/Classes/Controller/SearchController.php +++ b/Classes/Controller/SearchController.php @@ -154,7 +154,8 @@ public function mainAction(): void ); } - // If no search has been executed, no variables habe to be prepared. An empty form will be shown. + // If no search has been executed, no variables have to be prepared. + // An empty form will be shown. if (is_array($this->searchParams) && !empty($this->searchParams)) { // get all sortable metadata records $sortableMetadata = $this->metadataRepository->findByIsSortable(true); @@ -166,7 +167,7 @@ public function mainAction(): void $numResults = 0; // Do not execute the Solr search if used together with ListView plugin. if (!$listViewSearch) { - $solrResults = $this->documentRepository->findSolrByCollection(null, $this->settings, $this->searchParams, $listedMetadata); + $solrResults = $this->documentRepository->findSolrWithoutCollection($this->settings, $this->searchParams, $listedMetadata); $numResults = $solrResults->getNumFound(); $itemsPerPage = $this->settings['list']['paginate']['itemsPerPage']; diff --git a/Classes/Domain/Repository/DocumentRepository.php b/Classes/Domain/Repository/DocumentRepository.php index a525317c9..08639f860 100644 --- a/Classes/Domain/Repository/DocumentRepository.php +++ b/Classes/Domain/Repository/DocumentRepository.php @@ -26,6 +26,7 @@ use TYPO3\CMS\Extbase\Persistence\Generic\QueryResult; use TYPO3\CMS\Extbase\Persistence\Repository; use TYPO3\CMS\Extbase\Persistence\QueryInterface; +use TYPO3\CMS\Extbase\Persistence\QueryResultInterface; /** * Document repository. @@ -572,22 +573,70 @@ public function findChildrenOfEach(array $uids) * * @access public * - * @param array|null $collection + * @param Collection $collection * @param array $settings * @param array $searchParams * @param QueryResult $listedMetadata * * @return SolrSearch */ - // TODO: function name says ByCollection, but inside the SolrSearch->prepare() is expected - // TODO: that collection is an array of collections - public function findSolrByCollection($collection, $settings, $searchParams, $listedMetadata = null) + public function findSolrByCollection(Collection $collection, $settings, $searchParams, $listedMetadata = null) + { + return $this->findSolr([$collection], $settings, $searchParams, $listedMetadata); + } + + /** + * Find all documents with given collections from Solr + * + * @access public + * + * @param array|QueryResultInterface $collections + * @param array $settings + * @param array $searchParams + * @param QueryResult $listedMetadata + * + * @return SolrSearch + */ + public function findSolrByCollections($collections, $settings, $searchParams, $listedMetadata = null): SolrSearch + { + return $this->findSolr($collections, $settings, $searchParams, $listedMetadata); + } + + /** + * Find all documents without given collection from Solr + * + * @access public + * + * @param array $settings + * @param array $searchParams + * @param QueryResult $listedMetadata + * + * @return SolrSearch + */ + public function findSolrWithoutCollection($settings, $searchParams, $listedMetadata = null): SolrSearch + { + return $this->findSolr([], $settings, $searchParams, $listedMetadata); + } + + /** + * Find all documents with from Solr + * + * @access private + * + * @param array|QueryResultInterface $collections + * @param array $settings + * @param array $searchParams + * @param QueryResult $listedMetadata + * + * @return SolrSearch + */ + private function findSolr($collections, $settings, $searchParams, $listedMetadata = null): SolrSearch { // set settings global inside this repository // (may be necessary when SolrSearch calls back) $this->settings = $settings; - $search = new SolrSearch($this, $collection, $settings, $searchParams, $listedMetadata); + $search = new SolrSearch($this, $collections, $settings, $searchParams, $listedMetadata); $search->prepare(); return $search; } diff --git a/Tests/Functional/Common/SolrIndexingTest.php b/Tests/Functional/Common/SolrIndexingTest.php index 25937f933..ff30ad66d 100644 --- a/Tests/Functional/Common/SolrIndexingTest.php +++ b/Tests/Functional/Common/SolrIndexingTest.php @@ -78,7 +78,7 @@ public function canIndexAndSearchDocument() 'storagePid' => $document->getPid(), ]; - $solrSearch = $this->documentRepository->findSolrByCollection(null, $solrSettings, ['query' => '*']); + $solrSearch = $this->documentRepository->findSolrWithoutCollection($solrSettings, ['query' => '*']); $solrSearch->getQuery()->execute(); self::assertEquals(1, count($solrSearch)); self::assertEquals(15, $solrSearch->getNumFound()); @@ -134,9 +134,9 @@ public function canSearchInCollections() ]; // No query: Only list toplevel result(s) in collection(s) - $musikSearch = $this->documentRepository->findSolrByCollection($musik, $settings, []); - $dresdnerHefteSearch = $this->documentRepository->findSolrByCollection($dresdnerHefte, $settings, []); - $multiCollectionSearch = $this->documentRepository->findSolrByCollection($collections, $settings, []); + $musikSearch = $this->documentRepository->findSolrByCollections($musik, $settings, []); + $dresdnerHefteSearch = $this->documentRepository->findSolrByCollections($dresdnerHefte, $settings, []); + $multiCollectionSearch = $this->documentRepository->findSolrByCollections($collections, $settings, []); self::assertGreaterThanOrEqual(1, $musikSearch->getNumFound()); self::assertGreaterThanOrEqual(1, $dresdnerHefteSearch->getNumFound()); self::assertEquals('533223312LOG_0000', $dresdnerHefteSearch->getSolrResults()['documents'][0]['id']); @@ -147,8 +147,8 @@ public function canSearchInCollections() ); // With query: List all results - $metadataSearch = $this->documentRepository->findSolrByCollection($dresdnerHefte, $settings, ['query' => 'Dresden']); - $fulltextSearch = $this->documentRepository->findSolrByCollection($dresdnerHefte, $settings, ['query' => 'Dresden', 'fulltext' => '1']); + $metadataSearch = $this->documentRepository->findSolrByCollection($collections[1], $settings, ['query' => 'Dresden']); + $fulltextSearch = $this->documentRepository->findSolrByCollection($collections[1], $settings, ['query' => 'Dresden', 'fulltext' => '1']); self::assertGreaterThan($metadataSearch->getNumFound(), $fulltextSearch->getNumFound()); } diff --git a/Tests/Functional/Common/SolrSearchQueryTest.php b/Tests/Functional/Common/SolrSearchQueryTest.php index d9fb3b920..13fb23964 100644 --- a/Tests/Functional/Common/SolrSearchQueryTest.php +++ b/Tests/Functional/Common/SolrSearchQueryTest.php @@ -50,7 +50,7 @@ public function canExecute() $settings = ['solrcore' => 4, 'storagePid' => 0]; $params = ['query' => '10 Keyboard pieces']; - $search = new SolrSearch($documentRepository, null, $settings, $params); + $search = new SolrSearch($documentRepository, [], $settings, $params); $search->prepare(); $solrSearchQuery = $search->getQuery(); $result = $solrSearchQuery->execute(); From 815b50fa0c2527629bcaf0a02f92b268f035004b Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Mon, 29 Jan 2024 16:06:28 +0100 Subject: [PATCH 24/72] [MAINTENANCE] Improvements in BaseCommand class (#1130) Co-authored-by: Sebastian Meyer --- Classes/Command/BaseCommand.php | 112 +++++++++++++++++++------------- 1 file changed, 68 insertions(+), 44 deletions(-) diff --git a/Classes/Command/BaseCommand.php b/Classes/Command/BaseCommand.php index 95c4abd25..25f2b5e47 100644 --- a/Classes/Command/BaseCommand.php +++ b/Classes/Command/BaseCommand.php @@ -89,12 +89,13 @@ class BaseCommand extends Command */ protected ConfigurationManager $configurationManager; - public function __construct(CollectionRepository $collectionRepository, - DocumentRepository $documentRepository, - LibraryRepository $libraryRepository, - StructureRepository $structureRepository, - ConfigurationManager $configurationManager) - { + public function __construct( + CollectionRepository $collectionRepository, + DocumentRepository $documentRepository, + LibraryRepository $libraryRepository, + StructureRepository $structureRepository, + ConfigurationManager $configurationManager + ) { parent::__construct(); $this->collectionRepository = $collectionRepository; @@ -226,24 +227,7 @@ protected function saveToDatabase(Document $document): bool $document->setStructure($structure); if (is_array($metadata['collection'])) { - foreach ($metadata['collection'] as $collection) { - $documentCollection = $this->collectionRepository->findOneByIndexName($collection); - if (!$documentCollection) { - // create new Collection object - $documentCollection = GeneralUtility::makeInstance(Collection::class); - $documentCollection->setIndexName($collection); - $documentCollection->setLabel($collection); - $documentCollection->setOaiName((!empty($this->extConf['publishNewCollections']) ? Helper::getCleanString($collection) : '')); - $documentCollection->setIndexSearch(''); - $documentCollection->setDescription(''); - // add to CollectionRepository - $this->collectionRepository->add($documentCollection); - // persist collection to prevent duplicates - $persistenceManager->persistAll(); - } - // add to document - $document->addCollection($documentCollection); - } + $this->addCollections($document, $metadata['collection'], $persistenceManager); } // set identifiers @@ -264,25 +248,8 @@ protected function saveToDatabase(Document $document): bool $document->setRightsInfo($metadata['rights_info'][0] ? : ''); $document->setStatus(0); - if ($this->owner) { - // library / owner is set by parameter --> take it. - $document->setOwner($this->owner); - } else { - // owner is not set set but found by metadata --> take it or take default library - $owner = $metadata['owner'][0] ? : 'default'; - $this->owner = $this->libraryRepository->findOneByIndexName($owner); - if ($this->owner) { - $document->setOwner($this->owner); - } else { - // create library - $this->owner = GeneralUtility::makeInstance(Library::class); - - $this->owner->setLabel($owner); - $this->owner->setIndexName($owner); - $this->libraryRepository->add($this->owner); - $document->setOwner($this->owner); - } - } + $this->setOwner($metadata['owner'][0]); + $document->setOwner($this->owner); // set volume data $document->setVolume($metadata['volume'][0] ? : ''); @@ -311,7 +278,7 @@ protected function saveToDatabase(Document $document): bool * Currently only applies to METS documents. * * @access protected - * + * * @param Document $document for which parent UID should be taken * * @return int The parent document's id. @@ -350,4 +317,61 @@ protected function getParentDocumentUidForSaving(Document $document): int return 0; } + /** + * Add collections. + * + * @access private + * + * @param Document &$document + * @param array $collections + * @param PersistenceManager $persistenceManager + * + * @return void + */ + private function addCollections(Document &$document, array $collections, PersistenceManager $persistenceManager): void + { + foreach ($collections as $collection) { + $documentCollection = $this->collectionRepository->findOneByIndexName($collection); + if (!$documentCollection) { + // create new Collection object + $documentCollection = GeneralUtility::makeInstance(Collection::class); + $documentCollection->setIndexName($collection); + $documentCollection->setLabel($collection); + $documentCollection->setOaiName((!empty($this->extConf['publishNewCollections']) ? Helper::getCleanString($collection) : '')); + $documentCollection->setIndexSearch(''); + $documentCollection->setDescription(''); + // add to CollectionRepository + $this->collectionRepository->add($documentCollection); + // persist collection to prevent duplicates + $persistenceManager->persistAll(); + } + // add to document + $document->addCollection($documentCollection); + } + } + + /** + * If owner is not set set but found by metadata, take it or take default library, if nothing found in database then create new owner. + * + * @access private + * + * @param ?string $owner + * + * @return void + */ + private function setOwner($owner): void + { + if (empty($this->owner)) { + // owner is not set set but found by metadata --> take it or take default library + $owner = $owner ? : 'default'; + $this->owner = $this->libraryRepository->findOneByIndexName($owner); + if (empty($this->owner)) { + // create library + $this->owner = GeneralUtility::makeInstance(Library::class); + $this->owner->setLabel($owner); + $this->owner->setIndexName($owner); + $this->libraryRepository->add($this->owner); + } + } + } } From 11d245218a3a627e9bd9bd03e6881cd88483540c Mon Sep 17 00:00:00 2001 From: Sebastian Meyer Date: Mon, 29 Jan 2024 16:55:47 +0100 Subject: [PATCH 25/72] Update requirements for 5.x --- README.md | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 785289d6a..c6fb80543 100644 --- a/README.md +++ b/README.md @@ -14,16 +14,16 @@ Kitodo was formerly known as Goobi. Older releases can be found on [Launchpad](h Kitodo.Presentation requires [TYPO3](https://get.typo3.org) with [PHP](https://secure.php.net). It uses [MySQL](https://www.mysql.com) or [MariaDB](https://mariadb.com) as database and [Apache Solr](https://lucene.apache.org/solr) via [Solarium](http://www.solarium-project.org/) as search engine backend. -Currently **TYPO3 9.5 LTS** and **TYPO3 10.4 LTS** is supported with the following system requirements: +Currently **TYPO3 10.4 ELTS** and **TYPO3 11.5 LTS** is supported with the following system requirements: -| Component | Constraints for 9 LTS | Constraints for 10 LTS | -| ----------- | --------------------- | ---------------------- | -| TYPO3 | 9.5.x | 10.4.x | -| PHP | 7.3.x - 7.4.x | 7.3.x - 7.4.x | -| MySQL | 5.7.x | 5.7.x | -| MariaDB | 10.2.x - 10.3.x | 10.3.x - 10.5.x | -| Apache Solr | 8.x - 9.x | 8.x - 9.x | -| OCR Highlighting Plugin | 0.8.x | 0.8.x | +| Component | Constraints for 10 LTS | Constraints for 11 LTS | +| ----------------------- | ---------------------- | ---------------------- | +| TYPO3 | 10.4.42 | 11.5.33+ | +| PHP | 7.4.33 | 7.4.33 - 8.3.x | +| MySQL | 5.7.x - 8.0.x | 5.7.9 - 8.0.x | +| MariaDB | 10.2.7 - 10.11.x | 10.2.7 - 10.11.x | +| Apache Solr | 8.x | 8.x | +| OCR Highlighting Plugin | 0.8.x-solr78 | 0.8.x-solr78 | Application level dependencies are handled by [Composer](https://getcomposer.org) (see [composer.json](./composer.json)). @@ -33,7 +33,7 @@ Application level dependencies are handled by [Composer](https://getcomposer.org ## Information | Communication | Support -For general information and news, please visit our [website](https://www.kitodo.org) and follow us on [Twitter](https://twitter.com/kitodo_org). +For general information and news, please visit our [website](https://www.kitodo.org). As a system that has to meet the diverse requirements of a wide variety of institutions and the materials they want to digitise, Kitodo is a rather complex software solution, the installation and configuration of which can be challenging, especially for users with limited IT @@ -58,14 +58,6 @@ association cannot provide further assistance in selecting service providers. ## Getting started -### Kitodo.Presentation - * [Extension Documentation](https://docs.typo3.org/p/kitodo/presentation/master/en-us/) * [DDEV Development Environment](https://github.com/kitodo/ddev-kitodo-presentation) -* [Demo server](https://presentation-demo.kitodo.org/) - -### Kitodo.Production - -* [Installation Guides](https://github.com/kitodo/kitodo-production/wiki/Installationsanleitung) -* [User documentation](https://github.com/kitodo/kitodo-production/wiki/) -* [Developer documentation](https://kitodo-production.readthedocs.io/en/latest/) +* [Demo Server](https://presentation-demo.kitodo.org/) From a41d7596b5615f96462aa18058c10a75a3842717 Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Tue, 30 Jan 2024 15:30:26 +0100 Subject: [PATCH 26/72] [MAINTENANCE] Add missing license headers in test classes (#1152) --- Tests/Functional/Api/OaiPmhTest.php | 10 ++++++++++ Tests/Functional/Api/PageViewProxyDisabledTest.php | 10 ++++++++++ Tests/Functional/Api/PageViewProxyTest.php | 10 ++++++++++ Tests/Functional/Common/HelperTest.php | 10 ++++++++++ Tests/Functional/Common/IiifUrlReaderTest.php | 1 + Tests/Functional/Common/MetsDocumentTest.php | 1 + Tests/Functional/Common/SolrIndexingTest.php | 10 ++++++++++ Tests/Functional/FunctionalTestCase.php | 10 ++++++++++ .../Functional/Repository/CollectionRepositoryTest.php | 1 + Tests/Functional/Repository/DocumentRepositoryTest.php | 10 ++++++++++ Tests/Functional/Repository/MailRepositoryTest.php | 1 + .../Functional/Repository/MetatdataRepositoryTest.php | 1 + Tests/Functional/Repository/TokenRepositoryTest.php | 1 + .../Functional/ViewHelpers/JsFooterViewHelperTest.php | 1 + .../ViewHelpers/MetadataWrapVariableViewHelperTest.php | 1 + Tests/Functional/ViewHelpers/StdWrapViewHelperTest.php | 1 + Tests/Unit/Common/HelperTest.php | 10 ++++++++++ Tests/routeFunctionalInstance.php | 10 ++++++++++ 18 files changed, 99 insertions(+) diff --git a/Tests/Functional/Api/OaiPmhTest.php b/Tests/Functional/Api/OaiPmhTest.php index 01ac83acd..4e8e2294d 100644 --- a/Tests/Functional/Api/OaiPmhTest.php +++ b/Tests/Functional/Api/OaiPmhTest.php @@ -1,5 +1,15 @@ + * + * This file is part of the Kitodo and TYPO3 projects. + * + * @license GNU General Public License version 3 or later. + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + */ + namespace Kitodo\Dlf\Tests\Functional\Api; use DateTime; diff --git a/Tests/Functional/Api/PageViewProxyDisabledTest.php b/Tests/Functional/Api/PageViewProxyDisabledTest.php index f71a924bb..d31e7411c 100644 --- a/Tests/Functional/Api/PageViewProxyDisabledTest.php +++ b/Tests/Functional/Api/PageViewProxyDisabledTest.php @@ -1,5 +1,15 @@ + * + * This file is part of the Kitodo and TYPO3 projects. + * + * @license GNU General Public License version 3 or later. + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + */ + namespace Kitodo\Dlf\Tests\Functional\Api; use Kitodo\Dlf\Tests\Functional\FunctionalTestCase; diff --git a/Tests/Functional/Api/PageViewProxyTest.php b/Tests/Functional/Api/PageViewProxyTest.php index c5a71a92c..dec221bdd 100644 --- a/Tests/Functional/Api/PageViewProxyTest.php +++ b/Tests/Functional/Api/PageViewProxyTest.php @@ -1,5 +1,15 @@ + * + * This file is part of the Kitodo and TYPO3 projects. + * + * @license GNU General Public License version 3 or later. + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + */ + namespace Kitodo\Dlf\Tests\Functional\Api; use GuzzleHttp\Client as HttpClient; diff --git a/Tests/Functional/Common/HelperTest.php b/Tests/Functional/Common/HelperTest.php index ebd8528e0..66b4e1fa6 100644 --- a/Tests/Functional/Common/HelperTest.php +++ b/Tests/Functional/Common/HelperTest.php @@ -1,5 +1,15 @@ + * + * This file is part of the Kitodo and TYPO3 projects. + * + * @license GNU General Public License version 3 or later. + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + */ + namespace Kitodo\Dlf\Tests\Functional\Common; use Kitodo\Dlf\Common\Helper; diff --git a/Tests/Functional/Common/IiifUrlReaderTest.php b/Tests/Functional/Common/IiifUrlReaderTest.php index fff94cf72..3c9708f19 100644 --- a/Tests/Functional/Common/IiifUrlReaderTest.php +++ b/Tests/Functional/Common/IiifUrlReaderTest.php @@ -1,4 +1,5 @@ * diff --git a/Tests/Functional/Common/MetsDocumentTest.php b/Tests/Functional/Common/MetsDocumentTest.php index dd8eb95f7..7e931331a 100644 --- a/Tests/Functional/Common/MetsDocumentTest.php +++ b/Tests/Functional/Common/MetsDocumentTest.php @@ -1,4 +1,5 @@ * diff --git a/Tests/Functional/Common/SolrIndexingTest.php b/Tests/Functional/Common/SolrIndexingTest.php index ff30ad66d..221fe6347 100644 --- a/Tests/Functional/Common/SolrIndexingTest.php +++ b/Tests/Functional/Common/SolrIndexingTest.php @@ -1,5 +1,15 @@ + * + * This file is part of the Kitodo and TYPO3 projects. + * + * @license GNU General Public License version 3 or later. + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + */ + namespace Kitodo\Dlf\Tests\Functional\Common; use Kitodo\Dlf\Common\AbstractDocument; diff --git a/Tests/Functional/FunctionalTestCase.php b/Tests/Functional/FunctionalTestCase.php index 21004e979..1f455b8bd 100644 --- a/Tests/Functional/FunctionalTestCase.php +++ b/Tests/Functional/FunctionalTestCase.php @@ -1,5 +1,15 @@ + * + * This file is part of the Kitodo and TYPO3 projects. + * + * @license GNU General Public License version 3 or later. + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + */ + namespace Kitodo\Dlf\Tests\Functional; use GuzzleHttp\Client as HttpClient; diff --git a/Tests/Functional/Repository/CollectionRepositoryTest.php b/Tests/Functional/Repository/CollectionRepositoryTest.php index 263dec6c6..3cb178e38 100644 --- a/Tests/Functional/Repository/CollectionRepositoryTest.php +++ b/Tests/Functional/Repository/CollectionRepositoryTest.php @@ -1,4 +1,5 @@ * diff --git a/Tests/Functional/Repository/DocumentRepositoryTest.php b/Tests/Functional/Repository/DocumentRepositoryTest.php index 3bc4a2686..5dc1e4c75 100644 --- a/Tests/Functional/Repository/DocumentRepositoryTest.php +++ b/Tests/Functional/Repository/DocumentRepositoryTest.php @@ -1,5 +1,15 @@ + * + * This file is part of the Kitodo and TYPO3 projects. + * + * @license GNU General Public License version 3 or later. + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + */ + namespace Kitodo\Dlf\Tests\Functional\Repository; use Kitodo\Dlf\Common\AbstractDocument; diff --git a/Tests/Functional/Repository/MailRepositoryTest.php b/Tests/Functional/Repository/MailRepositoryTest.php index c9c91341d..ba7706cf4 100644 --- a/Tests/Functional/Repository/MailRepositoryTest.php +++ b/Tests/Functional/Repository/MailRepositoryTest.php @@ -1,4 +1,5 @@ * diff --git a/Tests/Functional/Repository/MetatdataRepositoryTest.php b/Tests/Functional/Repository/MetatdataRepositoryTest.php index cb09cfdac..5882b1c87 100644 --- a/Tests/Functional/Repository/MetatdataRepositoryTest.php +++ b/Tests/Functional/Repository/MetatdataRepositoryTest.php @@ -1,4 +1,5 @@ * diff --git a/Tests/Functional/Repository/TokenRepositoryTest.php b/Tests/Functional/Repository/TokenRepositoryTest.php index e8e78bb5e..0fdd4916f 100644 --- a/Tests/Functional/Repository/TokenRepositoryTest.php +++ b/Tests/Functional/Repository/TokenRepositoryTest.php @@ -1,4 +1,5 @@ * diff --git a/Tests/Functional/ViewHelpers/JsFooterViewHelperTest.php b/Tests/Functional/ViewHelpers/JsFooterViewHelperTest.php index 560dcac5e..ff30ed36e 100644 --- a/Tests/Functional/ViewHelpers/JsFooterViewHelperTest.php +++ b/Tests/Functional/ViewHelpers/JsFooterViewHelperTest.php @@ -1,4 +1,5 @@ * diff --git a/Tests/Functional/ViewHelpers/MetadataWrapVariableViewHelperTest.php b/Tests/Functional/ViewHelpers/MetadataWrapVariableViewHelperTest.php index 26c45a011..1da79dd72 100644 --- a/Tests/Functional/ViewHelpers/MetadataWrapVariableViewHelperTest.php +++ b/Tests/Functional/ViewHelpers/MetadataWrapVariableViewHelperTest.php @@ -1,4 +1,5 @@ * diff --git a/Tests/Functional/ViewHelpers/StdWrapViewHelperTest.php b/Tests/Functional/ViewHelpers/StdWrapViewHelperTest.php index ed24b6bab..fed9be33d 100644 --- a/Tests/Functional/ViewHelpers/StdWrapViewHelperTest.php +++ b/Tests/Functional/ViewHelpers/StdWrapViewHelperTest.php @@ -1,4 +1,5 @@ * diff --git a/Tests/Unit/Common/HelperTest.php b/Tests/Unit/Common/HelperTest.php index 2b6fcdc60..acd3f4f68 100644 --- a/Tests/Unit/Common/HelperTest.php +++ b/Tests/Unit/Common/HelperTest.php @@ -1,5 +1,15 @@ + * + * This file is part of the Kitodo and TYPO3 projects. + * + * @license GNU General Public License version 3 or later. + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + */ + namespace Kitodo\Dlf\Tests\Unit\Common; use Kitodo\Dlf\Common\Helper; diff --git a/Tests/routeFunctionalInstance.php b/Tests/routeFunctionalInstance.php index 214ab33d7..d94190216 100644 --- a/Tests/routeFunctionalInstance.php +++ b/Tests/routeFunctionalInstance.php @@ -1,5 +1,15 @@ + * + * This file is part of the Kitodo and TYPO3 projects. + * + * @license GNU General Public License version 3 or later. + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + */ + // This router script dynamically sets TYPO3_PATH_ROOT to a TYPO3 test instance, // then yields control back to PHP server to let it serve the requested file. // From d2464d07f26ef158ae581424e43f410b51448510 Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Tue, 30 Jan 2024 15:44:47 +0100 Subject: [PATCH 27/72] [MAINTENANCE] Fix license header in `PageGridPaginator` class (#1153) Co-authored-by: Sebastian Meyer --- Classes/Pagination/PageGridPaginator.php | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/Classes/Pagination/PageGridPaginator.php b/Classes/Pagination/PageGridPaginator.php index 40cf7552d..00a68892a 100644 --- a/Classes/Pagination/PageGridPaginator.php +++ b/Classes/Pagination/PageGridPaginator.php @@ -2,17 +2,14 @@ declare(strict_types=1); -/* - * This file is part of the TYPO3 CMS project. +/** + * (c) Kitodo. Key to digital objects e.V. * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. + * This file is part of the Kitodo and TYPO3 projects. * + * @license GNU General Public License version 3 or later. * For the full copyright and license information, please read the * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! */ namespace Kitodo\Dlf\Pagination; From 42c4c25a724af1ba660b5fc7e1840440f2033d37 Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Tue, 30 Jan 2024 15:52:54 +0100 Subject: [PATCH 28/72] [MAINTENANCE] Remove unused imports from test classes (#1154) Co-authored-by: Sebastian Meyer --- Tests/Functional/Api/PageViewProxyTest.php | 1 - Tests/Functional/ViewHelpers/JsFooterViewHelperTest.php | 1 - .../ViewHelpers/MetadataWrapVariableViewHelperTest.php | 2 -- Tests/Functional/ViewHelpers/StdWrapViewHelperTest.php | 2 -- 4 files changed, 6 deletions(-) diff --git a/Tests/Functional/Api/PageViewProxyTest.php b/Tests/Functional/Api/PageViewProxyTest.php index dec221bdd..fe6f3ed4c 100644 --- a/Tests/Functional/Api/PageViewProxyTest.php +++ b/Tests/Functional/Api/PageViewProxyTest.php @@ -12,7 +12,6 @@ namespace Kitodo\Dlf\Tests\Functional\Api; -use GuzzleHttp\Client as HttpClient; use Kitodo\Dlf\Tests\Functional\FunctionalTestCase; use TYPO3\CMS\Core\Utility\GeneralUtility; diff --git a/Tests/Functional/ViewHelpers/JsFooterViewHelperTest.php b/Tests/Functional/ViewHelpers/JsFooterViewHelperTest.php index ff30ed36e..e6989c54e 100644 --- a/Tests/Functional/ViewHelpers/JsFooterViewHelperTest.php +++ b/Tests/Functional/ViewHelpers/JsFooterViewHelperTest.php @@ -13,7 +13,6 @@ namespace Kitodo\Dlf\Tests\Unit\ViewHelpers; use Kitodo\Dlf\Tests\Functional\FunctionalTestCase; -use Kitodo\Dlf\ViewHelpers\JsFooterViewHelper; use TYPO3\CMS\Core\Page\PageRenderer; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Fluid\View\StandaloneView; diff --git a/Tests/Functional/ViewHelpers/MetadataWrapVariableViewHelperTest.php b/Tests/Functional/ViewHelpers/MetadataWrapVariableViewHelperTest.php index 1da79dd72..335aac5d4 100644 --- a/Tests/Functional/ViewHelpers/MetadataWrapVariableViewHelperTest.php +++ b/Tests/Functional/ViewHelpers/MetadataWrapVariableViewHelperTest.php @@ -13,9 +13,7 @@ namespace Kitodo\Dlf\Tests\Unit\ViewHelpers; use Kitodo\Dlf\Tests\Functional\FunctionalTestCase; -use Kitodo\Dlf\ViewHelpers\MetadataWrapVariableViewHelper; use TYPO3\CMS\Fluid\View\StandaloneView; -use TYPO3\CMS\Fluid\Core\Rendering\RenderingContextFactory; /** * @covers MetadataWrapVariableViewHelper diff --git a/Tests/Functional/ViewHelpers/StdWrapViewHelperTest.php b/Tests/Functional/ViewHelpers/StdWrapViewHelperTest.php index fed9be33d..498cf7996 100644 --- a/Tests/Functional/ViewHelpers/StdWrapViewHelperTest.php +++ b/Tests/Functional/ViewHelpers/StdWrapViewHelperTest.php @@ -13,9 +13,7 @@ namespace Kitodo\Dlf\Tests\Unit\ViewHelpers; use Kitodo\Dlf\Tests\Functional\FunctionalTestCase; -use Kitodo\Dlf\ViewHelpers\StdWrapViewHelper; use TYPO3\CMS\Fluid\View\StandaloneView; -use TYPO3\CMS\Fluid\Core\Rendering\RenderingContextFactory; /** * @covers StdWrapViewHelper From 75162549e6c1b2149a4574f14b28104aa5172ee0 Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Tue, 30 Jan 2024 15:57:19 +0100 Subject: [PATCH 29/72] [BUGFIX] Change `$solrCoreRepository` to function's variable (#1155) Co-authored-by: Sebastian Meyer --- Tests/Functional/Common/SolrTest.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Tests/Functional/Common/SolrTest.php b/Tests/Functional/Common/SolrTest.php index 4a597bcf9..07a69197f 100644 --- a/Tests/Functional/Common/SolrTest.php +++ b/Tests/Functional/Common/SolrTest.php @@ -96,7 +96,7 @@ protected function setUpData($databaseFixtures): void protected function setUpSolr($uid, $storagePid, $solrFixtures) { - $this->solrCoreRepository = $this->initializeRepository(SolrCoreRepository::class, $storagePid); + $solrCoreRepository = $this->initializeRepository(SolrCoreRepository::class, $storagePid); // Setup Solr only once for all tests in this suite static $solr = null; @@ -109,9 +109,9 @@ protected function setUpSolr($uid, $storagePid, $solrFixtures) } } - $coreModel = $this->solrCoreRepository->findByUid($uid); + $coreModel = $solrCoreRepository->findByUid($uid); $coreModel->setIndexName($solr->core); - $this->solrCoreRepository->update($coreModel); + $solrCoreRepository->update($coreModel); $this->persistenceManager->persistAll(); return $solr; } From a6d05db6afac53ff4d126e93cc95c13d6abc7fb1 Mon Sep 17 00:00:00 2001 From: Chris Date: Tue, 30 Jan 2024 17:25:42 +0100 Subject: [PATCH 30/72] [BUGFIX] Assign correct html id to `fullTextScrollElement` (#1156) Signed-off-by: Christos Sidiropoulos Co-authored-by: Bernd Fallert --- Configuration/TypoScript/Toolbox/setup.typoscript | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Configuration/TypoScript/Toolbox/setup.typoscript b/Configuration/TypoScript/Toolbox/setup.typoscript index e3ad80a42..1502bd58e 100644 --- a/Configuration/TypoScript/Toolbox/setup.typoscript +++ b/Configuration/TypoScript/Toolbox/setup.typoscript @@ -2,7 +2,7 @@ plugin.tx_dlf_fulltexttool { settings { tools = fulltexttool activateFullTextInitially = 0 - fullTextScrollElement = html, body + fullTextScrollElement = #tx-dlf-fulltextselection searchHlParameters = tx_dlf[highlight_word] } } From cdfd780ca496781e1c28afbc2abc976575c6ca90 Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Wed, 31 Jan 2024 10:58:12 +0100 Subject: [PATCH 31/72] [BUGFIX] Add condition one more time inside the section tag (#1157) --- Resources/Private/Templates/View3D/Main.html | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Resources/Private/Templates/View3D/Main.html b/Resources/Private/Templates/View3D/Main.html index 5fa402fc1..91a6d104f 100644 --- a/Resources/Private/Templates/View3D/Main.html +++ b/Resources/Private/Templates/View3D/Main.html @@ -17,9 +17,11 @@

- - - + + + + + From 25c052a9d4538486298e683a76ad21055120e837 Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Sun, 4 Feb 2024 13:49:01 +0100 Subject: [PATCH 32/72] [MAINTENANCE] Minor improvements in Helper class (#1160) --- Classes/Common/Helper.php | 56 ++++++++++++++++++++++++++------------- 1 file changed, 38 insertions(+), 18 deletions(-) diff --git a/Classes/Common/Helper.php b/Classes/Common/Helper.php index 8b66ebdbe..be0ec00eb 100644 --- a/Classes/Common/Helper.php +++ b/Classes/Common/Helper.php @@ -14,6 +14,7 @@ use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Database\ConnectionPool; +use TYPO3\CMS\Core\Http\Uri; use TYPO3\CMS\Core\Http\RequestFactory; use TYPO3\CMS\Core\Log\LogManager; use TYPO3\CMS\Core\Context\Context; @@ -57,7 +58,7 @@ class Helper * @access protected * @static * @var string This holds the hash algorithm - * + * * @see openssl_get_md_methods() for options */ protected static string $hashAlgorithm = 'sha256'; @@ -88,7 +89,8 @@ public static function addMessage(string $message, string $title, int $severity, { $flashMessageService = GeneralUtility::makeInstance(FlashMessageService::class); $flashMessageQueue = $flashMessageService->getMessageQueueByIdentifier($queue); - $flashMessage = GeneralUtility::makeInstance(FlashMessage::class, + $flashMessage = GeneralUtility::makeInstance( + FlashMessage::class, $message, $title, $severity, @@ -113,11 +115,7 @@ public static function addMessage(string $message, string $title, int $severity, public static function checkIdentifier(string $id, string $type): bool { $digits = substr($id, 0, 8); - $checksum = 0; - for ($i = 0, $j = strlen($digits); $i < $j; $i++) { - $checksum += (9 - $i) * intval(substr($digits, $i, 1)); - } - $checksum = (11 - ($checksum % 11)) % 11; + $checksum = self::getChecksum($digits); switch (strtoupper($type)) { case 'PPN': case 'IDN': @@ -168,6 +166,26 @@ public static function checkIdentifier(string $id, string $type): bool return true; } + /** + * Get checksum for given digits. + * + * @access private + * + * @static + * + * @param string $digits + * + * @return int + */ + private static function getChecksum(string $digits): int + { + $checksum = 0; + for ($i = 0, $j = strlen($digits); $i < $j; $i++) { + $checksum += (9 - $i) * (int) substr($digits, $i, 1); + } + return (11 - ($checksum % 11)) % 11; + } + /** * Decrypt encrypted value with given control hash * @@ -410,7 +428,7 @@ public static function getHookObjects(string $scriptRelPath): array public static function getIndexNameFromUid(int $uid, string $table, int $pid = -1): string { // Sanitize input. - $uid = max(intval($uid), 0); + $uid = max($uid, 0); if ( !$uid // NOTE: Only use tables that don't have too many entries! @@ -510,7 +528,7 @@ public static function getDocumentStructures(int $pid = -1): array $where = ''; // Should we check for a specific PID, too? if ($pid !== -1) { - $pid = max(intval($pid), 0); + $pid = max($pid, 0); $where = $queryBuilder->expr()->eq('tx_dlf_structures.pid', $pid); } @@ -596,7 +614,7 @@ public static function getURN(string $base, string $id): string } $checksum = 0; for ($i = 0, $j = strlen($digits); $i < $j; $i++) { - $checksum += ($i + 1) * intval(substr($digits, $i, 1)); + $checksum += ($i + 1) * (int) substr($digits, $i, 1); } $checksum = substr((string) floor($checksum / (int) substr($digits, -1, 1)), -1, 1); return $base . $id . $checksum; @@ -635,11 +653,13 @@ public static function isValidHttpUrl(string $url): bool return false; } - $parsed = parse_url($url); - $scheme = $parsed['scheme'] ?? ''; - $schemeNormalized = strtolower($scheme); - - return $schemeNormalized === 'http' || $schemeNormalized === 'https'; + try { + $uri = new Uri($url); + return !empty($uri->getScheme()); + } catch (\InvalidArgumentException $e) { + self::log($e->getMessage(), LOG_SEVERITY_ERROR); + return false; + } } /** @@ -702,7 +722,7 @@ public static function translate(string $indexName, string $table, string $pid): // Load labels into static variable for future use. static $labels = []; // Sanitize input. - $pid = max(intval($pid), 0); + $pid = max((int) $pid, 0); if (!$pid) { self::log('Invalid PID ' . $pid . ' for translation', LOG_SEVERITY_WARNING); return $indexName; @@ -749,7 +769,7 @@ public static function translate(string $indexName, string $table, string $pid): ->where( $queryBuilder->expr()->eq($table . '.pid', $pid), $queryBuilder->expr()->eq($table . '.uid', $row['l18n_parent']), - $queryBuilder->expr()->eq($table . '.sys_language_uid', intval($languageContentId)), + $queryBuilder->expr()->eq($table . '.sys_language_uid', (int) $languageContentId), self::whereExpression($table, true) ) ->setMaxResults(1) @@ -772,7 +792,7 @@ public static function translate(string $indexName, string $table, string $pid): $additionalWhere = $queryBuilder->expr()->andX( $queryBuilder->expr()->orX( $queryBuilder->expr()->in($table . '.sys_language_uid', [-1, 0]), - $queryBuilder->expr()->eq($table . '.sys_language_uid', intval($languageContentId)) + $queryBuilder->expr()->eq($table . '.sys_language_uid', (int) $languageContentId) ), $queryBuilder->expr()->eq($table . '.l18n_parent', 0) ); From 2d0280b7efe89fa401e9681cf838c3edf2ddb64d Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Sun, 4 Feb 2024 13:51:22 +0100 Subject: [PATCH 33/72] [MAINTENANCE] Minor improvements in IiifManifest class (#1161) Co-authored-by: Sebastian Meyer --- Classes/Common/IiifManifest.php | 112 ++++++++++++++++++-------------- 1 file changed, 65 insertions(+), 47 deletions(-) diff --git a/Classes/Common/IiifManifest.php b/Classes/Common/IiifManifest.php index aa0f409cb..27e1ff6ed 100644 --- a/Classes/Common/IiifManifest.php +++ b/Classes/Common/IiifManifest.php @@ -273,30 +273,16 @@ protected function magicGetPhysicalStructure(): array $this->physicalStructureInfo[$iiifId]['orderlabel'] = $this->iiif->getLabelForDisplay(); $this->physicalStructureInfo[$iiifId]['type'] = 'physSequence'; $this->physicalStructureInfo[$iiifId]['contentIds'] = null; - $fileUseDownload = $this->getUseGroups('fileGrpDownload'); - $fileUseFulltext = $this->getUseGroups('fileGrpFulltext'); + + $this->setFileUseDownload($iiifId, $this->iiif); + $this->setFileUseFulltext($iiifId, $this->iiif); + $fileUseThumbs = $this->getUseGroups('fileGrpThumbs'); $fileUses = $this->getUseGroups('fileGrpImages'); - if (!empty($fileUseDownload)) { - $docPdfRendering = $this->iiif->getRenderingUrlsForFormat('application/pdf'); - if (!empty($docPdfRendering)) { - $this->physicalStructureInfo[$iiifId]['files'][$fileUseDownload[0]] = $docPdfRendering[0]; - } - } - if (!empty($fileUseFulltext)) { - $iiifAlto = $this->iiif->getSeeAlsoUrlsForFormat('application/alto+xml'); - if (empty($iiifAlto)) { - $iiifAlto = $this->iiif->getSeeAlsoUrlsForProfile('http://www.loc.gov/standards/alto/', true); - } - if (!empty($iiifAlto)) { - $this->mimeTypes[$iiifAlto[0]] = 'application/alto+xml'; - $this->physicalStructureInfo[$iiifId]['files'][$fileUseFulltext[0]] = $iiifAlto[0]; - $this->hasFulltext = true; - $this->hasFulltextSet = true; - } - } + if (!empty($this->iiif->getDefaultCanvases())) { // canvases have not order property, but the context defines canveses as @list with a specific order, so we can provide an alternative + $elements = []; $canvasOrder = 0; foreach ($this->iiif->getDefaultCanvases() as $canvas) { $canvasOrder++; @@ -328,18 +314,9 @@ protected function magicGetPhysicalStructure(): array } } } - if (!empty($fileUseFulltext)) { - $alto = $canvas->getSeeAlsoUrlsForFormat('application/alto+xml'); - if (empty($alto)) { - $alto = $canvas->getSeeAlsoUrlsForProfile('http://www.loc.gov/standards/alto/', true); - } - if (!empty($alto)) { - $this->mimeTypes[$alto[0]] = 'application/alto+xml'; - $this->physicalStructureInfo[$elements[$canvasOrder]]['files'][$fileUseFulltext[0]] = $alto[0]; - $this->hasFulltext = true; - $this->hasFulltextSet = true; - } - } + + $this->setFileUseFulltext($elements[$canvasOrder], $canvas); + if (!empty($fileUses)) { $image = $canvas->getImageAnnotations()[0]; foreach ($fileUses as $fileUse) { @@ -351,12 +328,8 @@ protected function magicGetPhysicalStructure(): array if (!empty($thumbnailUrl)) { $this->physicalStructureInfo[$elements[$canvasOrder]]['files'][$fileUseThumbs] = $thumbnailUrl; } - if (!empty($fileUseDownload)) { - $pdfRenderingUrls = $canvas->getRenderingUrlsForFormat('application/pdf'); - if (!empty($pdfRenderingUrls)) { - $this->physicalStructureInfo[$elements[$canvasOrder]]['files'][$fileUseDownload[0]] = $pdfRenderingUrls[0]; - } - } + + $this->setFileUseDownload($elements[$canvasOrder], $canvas); } $this->numPages = $canvasOrder; // Merge and re-index the array to get nice numeric indexes. @@ -661,7 +634,8 @@ public function getMetadata(string $id, int $cPid = 0): array $iiifResource = $this->iiif->getContainedResourceById($id); while ($resArray = $result->fetchAssociative()) { // Set metadata field's value(s). - if ($resArray['format'] > 0 && !empty($resArray['xpath']) && ($values = $iiifResource->jsonPath($resArray['xpath'])) != null) { + if ($resArray['format'] > 0 && !empty($resArray['xpath'])) { + $values = $iiifResource->jsonPath($resArray['xpath']); if (is_string($values)) { $metadata[$resArray['index_name']] = [trim((string) $values)]; } elseif ($values instanceof JSONPath && is_array($values->data()) && count($values->data()) > 1) { @@ -677,16 +651,10 @@ public function getMetadata(string $id, int $cPid = 0): array } // Set sorting value if applicable. if (!empty($metadata[$resArray['index_name']]) && $resArray['is_sortable']) { - if ( - $resArray['format'] > 0 && !empty($resArray['xpath_sorting']) - && ($values = $iiifResource->jsonPath($resArray['xpath_sorting']) != null) - ) { - // TODO: Call to function is_string() with true will always evaluate to false. - // @phpstan-ignore-next-line + if ($resArray['format'] > 0 && !empty($resArray['xpath_sorting'])) { + $values = $iiifResource->jsonPath($resArray['xpath_sorting']); if (is_string($values)) { $metadata[$resArray['index_name'] . '_sorting'][0] = [trim((string) $values)]; - // TODO: Instanceof between true and Flow\JSONPath\JSONPath will always evaluate to false. - // @phpstan-ignore-next-line } elseif ($values instanceof JSONPath && is_array($values->data()) && count($values->data()) > 1) { $metadata[$resArray['index_name']] = []; foreach ($values->data() as $value) { @@ -971,6 +939,56 @@ private function getAnnotationTexts($annotationContainerIds, $iiifId): array return $annotationTexts; } + /** + * Set files used for download (PDF). + * + * @access private + * + * @param string $iiifId + * @param IiifResourceInterface $iiif + * + * @return void + */ + private function setFileUseDownload(string $iiifId, $iiif): void + { + $fileUseDownload = $this->getUseGroups('fileGrpDownload'); + + if (!empty($fileUseDownload)) { + $docPdfRendering = $iiif->getRenderingUrlsForFormat('application/pdf'); + if (!empty($docPdfRendering)) { + $this->physicalStructureInfo[$iiifId]['files'][$fileUseDownload[0]] = $docPdfRendering[0]; + } + } + } + + /** + * Set files used for full text (ALTO). + * + * @access private + * + * @param string $iiifId + * @param IiifResourceInterface $iiif + * + * @return void + */ + private function setFileUseFulltext(string $iiifId, $iiif): void + { + $fileUseFulltext = $this->getUseGroups('fileGrpFulltext'); + + if (!empty($fileUseFulltext)) { + $alto = $iiif->getSeeAlsoUrlsForFormat('application/alto+xml'); + if (empty($alto)) { + $alto = $iiif->getSeeAlsoUrlsForProfile('http://www.loc.gov/standards/alto/', true); + } + if (!empty($alto)) { + $this->mimeTypes[$alto[0]] = 'application/alto+xml'; + $this->physicalStructureInfo[$iiifId]['files'][$fileUseFulltext[0]] = $alto[0]; + $this->hasFulltext = true; + $this->hasFulltextSet = true; + } + } + } + /** * This magic method is executed after the object is deserialized * @see __sleep() From ea0f56c0fe67daaede32f23e161ac23213772b61 Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Sun, 4 Feb 2024 13:53:22 +0100 Subject: [PATCH 34/72] [MAINTENANCE] Minor improvements in MetsDocument class (#1162) Co-authored-by: Sebastian Meyer --- Classes/Common/MetsDocument.php | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/Classes/Common/MetsDocument.php b/Classes/Common/MetsDocument.php index 9cde10cfa..e6e42737d 100644 --- a/Classes/Common/MetsDocument.php +++ b/Classes/Common/MetsDocument.php @@ -528,8 +528,8 @@ public function getMetadata(string $id, int $cPid = 0): array if ( $resArray['format'] > 0 && !empty($resArray['xpath_sorting']) - && ($values = $domXPath->evaluate($resArray['xpath_sorting'], $domNode)) ) { + $values = $domXPath->evaluate($resArray['xpath_sorting'], $domNode); if ( $values instanceof \DOMNodeList && $values->length > 0 @@ -734,9 +734,12 @@ protected function getMetadataIds(string $id): array } } - return array_filter($allMdIds, function ($element) { - return !empty($element); - }); + return array_filter( + $allMdIds, + function ($element) { + return !empty($element); + } + ); } /** @@ -922,16 +925,17 @@ protected function processMdSec(\SimpleXMLElement $element): ?array } $this->registerNamespaces($element); - if ($type = $element->xpath('./mets:mdWrap[not(@MDTYPE="OTHER")]/@MDTYPE')) { - if (!empty($this->formats[(string) $type[0]])) { - $type = (string) $type[0]; - $xml = $element->xpath('./mets:mdWrap[@MDTYPE="' . $type . '"]/mets:xmlData/' . strtolower($type) . ':' . $this->formats[$type]['rootElement']); - } - } elseif ($type = $element->xpath('./mets:mdWrap[@MDTYPE="OTHER"]/@OTHERMDTYPE')) { - if (!empty($this->formats[(string) $type[0]])) { - $type = (string) $type[0]; - $xml = $element->xpath('./mets:mdWrap[@MDTYPE="OTHER"][@OTHERMDTYPE="' . $type . '"]/mets:xmlData/' . strtolower($type) . ':' . $this->formats[$type]['rootElement']); - } + + $type = ''; + $mdType = $element->xpath('./mets:mdWrap[not(@MDTYPE="OTHER")]/@MDTYPE'); + $otherMdType = $element->xpath('./mets:mdWrap[@MDTYPE="OTHER"]/@OTHERMDTYPE'); + + if (!empty($mdType) && !empty($this->formats[(string) $mdType[0]])) { + $type = (string) $mdType[0]; + $xml = $element->xpath('./mets:mdWrap[@MDTYPE="' . $type . '"]/mets:xmlData/' . strtolower($type) . ':' . $this->formats[$type]['rootElement']); + } elseif (!empty($otherMdType) && !empty($this->formats[(string) $otherMdType[0]])) { + $type = (string) $otherMdType[0]; + $xml = $element->xpath('./mets:mdWrap[@MDTYPE="OTHER"][@OTHERMDTYPE="' . $type . '"]/mets:xmlData/' . strtolower($type) . ':' . $this->formats[$type]['rootElement']); } if (empty($xml)) { @@ -1061,6 +1065,7 @@ protected function magicGetPhysicalStructure(): array } } // Build the physical elements' array from the physical structMap node. + $elements = []; foreach ($elementNodes as $elementNode) { $elements[(int) $elementNode['ORDER']] = (string) $elementNode['ID']; $this->physicalStructureInfo[$elements[(int) $elementNode['ORDER']]]['id'] = (string) $elementNode['ID']; From 3689a158502457c078e834d47e22f2d8817f4ab4 Mon Sep 17 00:00:00 2001 From: Stefan Weil Date: Sun, 4 Feb 2024 13:59:32 +0100 Subject: [PATCH 35/72] [MAINTENANCE] Fix some typos (most of them found by codespell) (#1163) Signed-off-by: Stefan Weil Co-authored-by: Sebastian Meyer --- Documentation/Plugins/Index.rst | 2 +- .../Public/JavaScript/PageView/PageView.js | 2 +- .../JavaScript/jPlayer/jquery.jplayer.js | 26 +++++++++---------- Tests/Functional/Common/MetsDocumentTest.php | 2 +- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Documentation/Plugins/Index.rst b/Documentation/Plugins/Index.rst index 87fcb468a..cf65955b2 100644 --- a/Documentation/Plugins/Index.rst +++ b/Documentation/Plugins/Index.rst @@ -33,7 +33,7 @@ marker templates for plugins are not supported anymore. Now, all HTML markup is done in Fluid. To use different templates, you have to overload the templates by the common TYPO3 way. -The following TypoScript defines addition paths inside a "example" extenion:: +The following TypoScript defines additional paths inside an "example" extension:: plugin.tx_dlf { view { diff --git a/Resources/Public/JavaScript/PageView/PageView.js b/Resources/Public/JavaScript/PageView/PageView.js index 7c968ef2e..8f0cbeb17 100644 --- a/Resources/Public/JavaScript/PageView/PageView.js +++ b/Resources/Public/JavaScript/PageView/PageView.js @@ -447,7 +447,7 @@ dlfViewer.prototype.displayHighlightWord = function(highlightWords = null) { this.highlightWords = highlightWords; } - // exctract highlighWords from URL + // extract highlighWords from URL if (this.highlightWords === null) { this.highlightWords = dlfUtils.getUrlParam('tx_dlf[highlight_word]'); } diff --git a/Resources/Public/JavaScript/jPlayer/jquery.jplayer.js b/Resources/Public/JavaScript/jPlayer/jquery.jplayer.js index 842f31b63..644b75957 100644 --- a/Resources/Public/JavaScript/jPlayer/jquery.jplayer.js +++ b/Resources/Public/JavaScript/jPlayer/jquery.jplayer.js @@ -699,7 +699,7 @@ playbackRate: 1, // Warning - Now both an option and a status property ended: 0 -/* Persistant status properties created dynamically at _init(): +/* Persistent status properties created dynamically at _init(): width height cssClass @@ -865,7 +865,7 @@ this.options.volume = this._limitValue(this.options.volume, 0, 1); // Limit volume value's bounds. - // Create the formats array, with prority based on the order of the supplied formats string + // Create the formats array, with priority based on the order of the supplied formats string $.each(this.options.supplied.toLowerCase().split(","), function(index1, value1) { var format = value1.replace(/^\s+|\s+$/g, ""); //trim if(self.format[format]) { // Check format is valid. @@ -882,7 +882,7 @@ } }); - // Create the solutions array, with prority based on the order of the solution string + // Create the solutions array, with priority based on the order of the solution string $.each(this.options.solution.toLowerCase().split(","), function(index1, value1) { var solution = value1.replace(/^\s+|\s+$/g, ""); //trim if(self.solution[solution]) { // Check solution is valid. @@ -1212,7 +1212,7 @@ // MJP: The background change remains. Would need to store the original to restore it correctly. // MJP: The jPlayer element's size change remains. - // Clear the media to reset the GUI and stop any downloads. Streams on some browsers had persited. (Chrome) + // Clear the media to reset the GUI and stop any downloads. Streams on some browsers had persisted. (Chrome) this.clearMedia(); // Remove the size/sizeFull cssClass from the cssSelectorAncestor this._removeUiClass(); @@ -1573,7 +1573,7 @@ var ct = 0, cpa = 0, sp = 0, cpr = 0; // Fixes the duration bug in iOS, where the durationchange event occurs when media.duration is not always correct. - // Fixes the initial duration bug in BB OS7, where the media.duration is infinity and displays as NaN:NaN due to Date() using inifity. + // Fixes the initial duration bug in BB OS7, where the media.duration is infinity and displays as NaN:NaN due to Date() using infinity. if(isFinite(media.duration)) { this.status.duration = media.duration; } @@ -2645,18 +2645,18 @@ if(!this.options.fullWindow && this.options[key].cssClass !== value.cssClass) { this._removeUiClass(); } - this.options[key] = $.extend({}, this.options[key], value); // store a merged copy of it, incase not all properties changed. + this.options[key] = $.extend({}, this.options[key], value); // store a merged copy of it, in case not all properties changed. this._refreshSize(); break; case "sizeFull" : if(this.options.fullWindow && this.options[key].cssClass !== value.cssClass) { this._removeUiClass(); } - this.options[key] = $.extend({}, this.options[key], value); // store a merged copy of it, incase not all properties changed. + this.options[key] = $.extend({}, this.options[key], value); // store a merged copy of it, in case not all properties changed. this._refreshSize(); break; case "autohide" : - this.options[key] = $.extend({}, this.options[key], value); // store a merged copy of it, incase not all properties changed. + this.options[key] = $.extend({}, this.options[key], value); // store a merged copy of it, in case not all properties changed. this._updateAutohide(); break; case "loop" : @@ -2670,20 +2670,20 @@ this.options[key] = value; break; case "nativeVideoControls" : - this.options[key] = $.extend({}, this.options[key], value); // store a merged copy of it, incase not all properties changed. + this.options[key] = $.extend({}, this.options[key], value); // store a merged copy of it, in case not all properties changed. this.status.nativeVideoControls = this._uaBlocklist(this.options.nativeVideoControls); this._restrictNativeVideoControls(); this._updateNativeVideoControls(); break; case "noFullWindow" : - this.options[key] = $.extend({}, this.options[key], value); // store a merged copy of it, incase not all properties changed. + this.options[key] = $.extend({}, this.options[key], value); // store a merged copy of it, in case not all properties changed. this.status.nativeVideoControls = this._uaBlocklist(this.options.nativeVideoControls); // Need to check again as noFullWindow can depend on this flag and the restrict() can override it. this.status.noFullWindow = this._uaBlocklist(this.options.noFullWindow); this._restrictNativeVideoControls(); this._updateButtons(); break; case "noVolume" : - this.options[key] = $.extend({}, this.options[key], value); // store a merged copy of it, incase not all properties changed. + this.options[key] = $.extend({}, this.options[key], value); // store a merged copy of it, in case not all properties changed. this.status.noVolume = this._uaBlocklist(this.options.noVolume); this._updateVolume(); this._updateMute(); @@ -2699,7 +2699,7 @@ } break; case "timeFormat" : - this.options[key] = $.extend({}, this.options[key], value); // store a merged copy of it, incase not all properties changed. + this.options[key] = $.extend({}, this.options[key], value); // store a merged copy of it, in case not all properties changed. break; case "keyEnabled" : this.options[key] = value; @@ -2708,7 +2708,7 @@ } break; case "keyBindings" : - this.options[key] = $.extend(true, {}, this.options[key], value); // store a merged DEEP copy of it, incase not all properties changed. + this.options[key] = $.extend(true, {}, this.options[key], value); // store a merged DEEP copy of it, in case not all properties changed. break; case "audioFullScreen" : this.options[key] = value; diff --git a/Tests/Functional/Common/MetsDocumentTest.php b/Tests/Functional/Common/MetsDocumentTest.php index 7e931331a..49b3b8fa7 100644 --- a/Tests/Functional/Common/MetsDocumentTest.php +++ b/Tests/Functional/Common/MetsDocumentTest.php @@ -152,7 +152,7 @@ public function canGetDownloadLocation() /* * The method `getDownloadLocation` should return a string, but returns null in some cases. - * Therefor, a TypeError must be expected here. + * Therefore, a TypeError must be expected here. */ $this->expectException('TypeError'); $doc->getDownloadLocation('ID_DOES_NOT_EXIST'); From 0566944b22b673fa9c3b5ae3f5d52a84bea7ebee Mon Sep 17 00:00:00 2001 From: Stefan Weil Date: Sun, 4 Feb 2024 14:01:58 +0100 Subject: [PATCH 36/72] [MAINTENANCE] Document function magicGetMetadataArray as a "magic" function (#1164) Signed-off-by: Stefan Weil Co-authored-by: Sebastian Meyer --- Classes/Common/AbstractDocument.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Classes/Common/AbstractDocument.php b/Classes/Common/AbstractDocument.php index 5911ff277..83a315091 100644 --- a/Classes/Common/AbstractDocument.php +++ b/Classes/Common/AbstractDocument.php @@ -1030,7 +1030,8 @@ protected function magicGetHasFulltext(): bool } /** - * This builds an array of the document's metadata + * This magic method is called each time an invisible property is referenced from the object + * It builds an array of the document's metadata * * @access protected * From 8d1ee4e2b278d2f0e39d2a8f586383be9eca04a3 Mon Sep 17 00:00:00 2001 From: Stefan Weil Date: Sun, 4 Feb 2024 14:04:39 +0100 Subject: [PATCH 37/72] [MAINTENANCE] Replace calls of function sizeof by calls of function count (#1166) Signed-off-by: Stefan Weil Co-authored-by: Sebastian Meyer --- Classes/Controller/BasketController.php | 2 +- Classes/Controller/ToolboxController.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Classes/Controller/BasketController.php b/Classes/Controller/BasketController.php index e1ba0f8dc..e3e3ced84 100644 --- a/Classes/Controller/BasketController.php +++ b/Classes/Controller/BasketController.php @@ -438,7 +438,7 @@ protected function addToBasket(array $piVars, Basket $basket): ?Basket // set endpage for toc and subentry based on logid if (($piVars['addToBasket'] == 'subentry') or ($piVars['addToBasket'] == 'toc')) { $smLinks = $this->document->getCurrentDocument()->smLinks; - $pageCounter = sizeof($smLinks['l2p'][$piVars['logId']]); + $pageCounter = count($smLinks['l2p'][$piVars['logId']]); $documentItem['endpage'] = ($documentItem['startpage'] + $pageCounter) - 1; } // add whole document diff --git a/Classes/Controller/ToolboxController.php b/Classes/Controller/ToolboxController.php index 7455cbc15..46de9856b 100644 --- a/Classes/Controller/ToolboxController.php +++ b/Classes/Controller/ToolboxController.php @@ -139,7 +139,7 @@ private function renderAnnotationTool(): void $annotationContainers = $this->currentDocument->physicalStructureInfo[$this->currentDocument->physicalStructure[$this->requestData['page']]]['annotationContainers']; if ( $annotationContainers != null - && sizeof($annotationContainers) > 0 + && count($annotationContainers) > 0 ) { $this->view->assign('annotationTool', true); } else { From b17ecd7203c9cbc69976a5d7ca3ec89fb5a74629 Mon Sep 17 00:00:00 2001 From: Sebastian Meyer Date: Thu, 8 Feb 2024 13:39:20 +0100 Subject: [PATCH 38/72] Add Codecov to testing workflow --- .github/workflows/tests.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index f0209a311..d5a4e5953 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -24,3 +24,8 @@ jobs: - name: Run functional tests run: Build/Test/runTests.sh -s functional + + - name: Upload coverage reports + uses: codecov/codecov-action@v3 + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} From 11895713afa9d8c0ae15fc08e848ae933d98d84d Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Wed, 14 Feb 2024 09:38:44 +0100 Subject: [PATCH 39/72] [BUGFIX] Add missing translations for metadata (#1170) --- .../Language/de.locallang_metadata.xlf | 236 ++++++++++-------- .../Private/Language/locallang_metadata.xlf | 179 +++++++------ 2 files changed, 232 insertions(+), 183 deletions(-) diff --git a/Resources/Private/Language/de.locallang_metadata.xlf b/Resources/Private/Language/de.locallang_metadata.xlf index f08c9c4fa..84af58740 100644 --- a/Resources/Private/Language/de.locallang_metadata.xlf +++ b/Resources/Private/Language/de.locallang_metadata.xlf @@ -1,106 +1,134 @@ - -
- LFEditor -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
\ No newline at end of file + +
+ LFEditor +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ diff --git a/Resources/Private/Language/locallang_metadata.xlf b/Resources/Private/Language/locallang_metadata.xlf index a0fd4c732..70034a09d 100644 --- a/Resources/Private/Language/locallang_metadata.xlf +++ b/Resources/Private/Language/locallang_metadata.xlf @@ -1,82 +1,103 @@ - -
- LFEditor -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ +
+ LFEditor +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
From 9521a335165ab717842a1e12f88e3684e3cc7322 Mon Sep 17 00:00:00 2001 From: Stefan Weil Date: Wed, 14 Feb 2024 09:55:40 +0100 Subject: [PATCH 40/72] [MAINTENANCE] Suppress Codacy warnings for private methods... (#1171) Signed-off-by: Stefan Weil Co-authored-by: Sebastian Meyer --- Classes/Controller/ToolboxController.php | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/Classes/Controller/ToolboxController.php b/Classes/Controller/ToolboxController.php index 46de9856b..353c5522b 100644 --- a/Classes/Controller/ToolboxController.php +++ b/Classes/Controller/ToolboxController.php @@ -121,7 +121,8 @@ private function renderToolByName(string $tool): void } /** - * Renders the annotation tool + * Renders the annotation tool (used in template) + * @SuppressWarnings(PHPMD.UnusedPrivateMethod) * * @access private * @@ -148,7 +149,8 @@ private function renderAnnotationTool(): void } /** - * Renders the fulltext download tool + * Renders the fulltext download tool (used in template) + * @SuppressWarnings(PHPMD.UnusedPrivateMethod) * * @access private * @@ -171,7 +173,8 @@ private function renderFulltextDownloadTool(): void } /** - * Renders the fulltext tool + * Renders the fulltext tool (used in template) + * @SuppressWarnings(PHPMD.UnusedPrivateMethod) * * @access private * @@ -198,7 +201,8 @@ private function renderFulltextTool(): void } /** - * Renders the image download tool + * Renders the image download tool (used in template) + * @SuppressWarnings(PHPMD.UnusedPrivateMethod) * * @access private * @@ -265,7 +269,8 @@ private function getImage(int $page): array } /** - * Renders the image manipulation tool + * Renders the image manipulation tool (used in template) + * @SuppressWarnings(PHPMD.UnusedPrivateMethod) * * @access private * @@ -281,7 +286,8 @@ private function renderImageManipulationTool(): void } /** - * Renders the PDF download tool + * Renders the PDF download tool (used in template) + * @SuppressWarnings(PHPMD.UnusedPrivateMethod) * * @access private * @@ -384,7 +390,8 @@ private function getWorkLink(): string } /** - * Renders the searchInDocument tool + * Renders the searchInDocument tool (used in template) + * @SuppressWarnings(PHPMD.UnusedPrivateMethod) * * @access private * From 6127276cfa191b7e10dc7593d76133cf61f6ff0b Mon Sep 17 00:00:00 2001 From: Stefan Weil Date: Wed, 14 Feb 2024 09:58:15 +0100 Subject: [PATCH 41/72] [MAINTENANCE] Update GitHub actions (#1173) Signed-off-by: Stefan Weil Co-authored-by: Sebastian Meyer --- .github/workflows/codeql.yml | 8 ++++---- .github/workflows/phpstan.yml | 2 +- .github/workflows/tests.yml | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 933e97ac4..c17f1b765 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -22,18 +22,18 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v3 with: languages: ${{ matrix.language }} config-file: ./.github/codeql.yml - name: Autobuild - uses: github/codeql-action/autobuild@v2 + uses: github/codeql-action/autobuild@v3 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v3 with: category: "/language:${{ matrix.language }}" diff --git a/.github/workflows/phpstan.yml b/.github/workflows/phpstan.yml index 8d8861501..35c5266de 100644 --- a/.github/workflows/phpstan.yml +++ b/.github/workflows/phpstan.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install dependencies uses: php-actions/composer@v6 diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index d5a4e5953..49233f11d 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -14,7 +14,7 @@ jobs: typo3: [ 10.4, 11.5 ] steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install dependencies run: Build/Test/runTests.sh -s composerInstall -t ${{ matrix.typo3 }} @@ -26,6 +26,6 @@ jobs: run: Build/Test/runTests.sh -s functional - name: Upload coverage reports - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v4 env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} From e9c184653fdcac1ea54cd8141533fa9193398417 Mon Sep 17 00:00:00 2001 From: Sebastian Meyer Date: Wed, 14 Feb 2024 22:14:01 +0100 Subject: [PATCH 42/72] [SECURITY] Update dependencies to fix security issues (#1174) --- README.md | 4 +- composer.json | 16 +- composer.lock | 834 ++--- composer.lock-t3v10 | 8165 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 8608 insertions(+), 411 deletions(-) create mode 100644 composer.lock-t3v10 diff --git a/README.md b/README.md index c6fb80543..ef6536b27 100644 --- a/README.md +++ b/README.md @@ -18,8 +18,8 @@ Currently **TYPO3 10.4 ELTS** and **TYPO3 11.5 LTS** is supported with the follo | Component | Constraints for 10 LTS | Constraints for 11 LTS | | ----------------------- | ---------------------- | ---------------------- | -| TYPO3 | 10.4.42 | 11.5.33+ | -| PHP | 7.4.33 | 7.4.33 - 8.3.x | +| TYPO3 | 10.4.43+ | 11.5.35+ | +| PHP | 7.4.33 | 7.4.33 | | MySQL | 5.7.x - 8.0.x | 5.7.9 - 8.0.x | | MariaDB | 10.2.7 - 10.11.x | 10.2.7 - 10.11.x | | Apache Solr | 8.x | 8.x | diff --git a/composer.json b/composer.json index 3bf0e1bc5..def78b13f 100644 --- a/composer.json +++ b/composer.json @@ -32,20 +32,20 @@ "ext-libxml": "*", "ext-openssl": "*", "ext-simplexml": "*", - "typo3/cms-core": "^10.4.37|^11.5.33", - "typo3/cms-extbase": "^10.4.37|^11.5.33", - "typo3/cms-tstemplate": "^10.4.37|^11.5.33", + "typo3/cms-core": "^10.4.37|^11.5.35", + "typo3/cms-extbase": "^10.4.37|^11.5.35", + "typo3/cms-tstemplate": "^10.4.37|^11.5.35", "caseyamcl/phpoaipmh": "^3.3.1", "ubl/php-iiif-prezi-reader": "0.3.0", "solarium/solarium": "^5.2.0" }, "require-dev": { - "phpstan/phpstan": "^1.10.41", + "phpstan/phpstan": "^1.10.58", "spatie/phpunit-watcher": "^1.23.6", - "typo3/cms-backend": "^10.4.37|^11.5.33", - "typo3/cms-fluid": "^10.4.37|^11.5.33", - "typo3/cms-fluid-styled-content": "^10.4.37|^11.5.33", - "typo3/cms-frontend": "^10.4.37|^11.5.33", + "typo3/cms-backend": "^10.4.37|^11.5.35", + "typo3/cms-fluid": "^10.4.37|^11.5.35", + "typo3/cms-fluid-styled-content": "^10.4.37|^11.5.35", + "typo3/cms-frontend": "^10.4.37|^11.5.35", "typo3/testing-framework": "^6.16.9" }, "replace": { diff --git a/composer.lock b/composer.lock index 778703766..c79a18a53 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": "2426f16cf72750dd7f8c03649dad6292", + "content-hash": "bb30465fb94afd5de16d054918739002", "packages": [ { "name": "bacon/bacon-qr-code", @@ -513,16 +513,16 @@ }, { "name": "doctrine/deprecations", - "version": "v1.1.1", + "version": "1.1.3", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3" + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", - "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", "shasum": "" }, "require": { @@ -554,9 +554,9 @@ "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/v1.1.1" + "source": "https://github.com/doctrine/deprecations/tree/1.1.3" }, - "time": "2023-06-03T09:27:29+00:00" + "time": "2024-01-30T19:34:25+00:00" }, { "name": "doctrine/event-manager", @@ -956,16 +956,16 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.8.0", + "version": "7.8.1", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9" + "reference": "41042bc7ab002487b876a0683fc8dce04ddce104" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/1110f66a6530a40fe7aea0378fe608ee2b2248f9", - "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104", + "reference": "41042bc7ab002487b876a0683fc8dce04ddce104", "shasum": "" }, "require": { @@ -980,11 +980,11 @@ "psr/http-client-implementation": "1.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.1", + "bamarni/composer-bin-plugin": "^1.8.2", "ext-curl": "*", "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", "php-http/message-factory": "^1.1", - "phpunit/phpunit": "^8.5.29 || ^9.5.23", + "phpunit/phpunit": "^8.5.36 || ^9.6.15", "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { @@ -1062,7 +1062,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.8.0" + "source": "https://github.com/guzzle/guzzle/tree/7.8.1" }, "funding": [ { @@ -1078,28 +1078,28 @@ "type": "tidelift" } ], - "time": "2023-08-27T10:20:53+00:00" + "time": "2023-12-03T20:35:24+00:00" }, { "name": "guzzlehttp/promises", - "version": "2.0.1", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "111166291a0f8130081195ac4556a5587d7f1b5d" + "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/111166291a0f8130081195ac4556a5587d7f1b5d", - "reference": "111166291a0f8130081195ac4556a5587d7f1b5d", + "url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223", + "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.1", - "phpunit/phpunit": "^8.5.29 || ^9.5.23" + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.36 || ^9.6.15" }, "type": "library", "extra": { @@ -1145,7 +1145,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.1" + "source": "https://github.com/guzzle/promises/tree/2.0.2" }, "funding": [ { @@ -1161,20 +1161,20 @@ "type": "tidelift" } ], - "time": "2023-08-03T15:11:55+00:00" + "time": "2023-12-03T20:19:20+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.6.1", + "version": "2.6.2", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727" + "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/be45764272e8873c72dbe3d2edcfdfcc3bc9f727", - "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221", + "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221", "shasum": "" }, "require": { @@ -1188,9 +1188,9 @@ "psr/http-message-implementation": "1.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.1", + "bamarni/composer-bin-plugin": "^1.8.2", "http-interop/http-factory-tests": "^0.9", - "phpunit/phpunit": "^8.5.29 || ^9.5.23" + "phpunit/phpunit": "^8.5.36 || ^9.6.15" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" @@ -1261,7 +1261,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.6.1" + "source": "https://github.com/guzzle/psr7/tree/2.6.2" }, "funding": [ { @@ -1277,20 +1277,20 @@ "type": "tidelift" } ], - "time": "2023-08-27T10:13:57+00:00" + "time": "2023-12-03T20:05:35+00:00" }, { "name": "lolli42/finediff", - "version": "1.0.2", + "version": "1.0.3", "source": { "type": "git", "url": "https://github.com/lolli42/FineDiff.git", - "reference": "f72cd968b663fc09bc73ef0ab5a3288583d0d59d" + "reference": "8d535de757062fed8412833f5eede7064595ca5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lolli42/FineDiff/zipball/f72cd968b663fc09bc73ef0ab5a3288583d0d59d", - "reference": "f72cd968b663fc09bc73ef0ab5a3288583d0d59d", + "url": "https://api.github.com/repos/lolli42/FineDiff/zipball/8d535de757062fed8412833f5eede7064595ca5b", + "reference": "8d535de757062fed8412833f5eede7064595ca5b", "shasum": "" }, "require": { @@ -1302,8 +1302,8 @@ }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.4", - "phpstan/phpstan": "^1.6", - "phpunit/phpunit": "^8 || ^9" + "phpstan/phpstan": "^1.9.14", + "phpunit/phpunit": "^8.5.33 || ^9.6.11 || ^10.3.2" }, "type": "library", "autoload": { @@ -1340,9 +1340,9 @@ ], "support": { "issues": "https://github.com/lolli42/FineDiff/issues", - "source": "https://github.com/lolli42/FineDiff/tree/1.0.2" + "source": "https://github.com/lolli42/FineDiff/tree/1.0.3" }, - "time": "2022-05-23T07:44:28+00:00" + "time": "2024-02-06T13:56:20+00:00" }, { "name": "masterminds/html5", @@ -1413,16 +1413,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.17.1", + "version": "v4.18.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d" + "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", - "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999", + "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999", "shasum": "" }, "require": { @@ -1463,9 +1463,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.18.0" }, - "time": "2023-08-13T19:53:39+00:00" + "time": "2023-12-10T21:03:43+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -1579,16 +1579,16 @@ }, { "name": "phpdocumentor/type-resolver", - "version": "1.7.3", + "version": "1.8.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419" + "reference": "fad452781b3d774e3337b0c0b245dd8e5a4455fc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419", - "reference": "3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/fad452781b3d774e3337b0c0b245dd8e5a4455fc", + "reference": "fad452781b3d774e3337b0c0b245dd8e5a4455fc", "shasum": "" }, "require": { @@ -1631,22 +1631,22 @@ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "support": { "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.7.3" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.8.0" }, - "time": "2023-08-12T11:01:26+00:00" + "time": "2024-01-11T11:49:22+00:00" }, { "name": "phpstan/phpdoc-parser", - "version": "1.24.1", + "version": "1.25.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "9f854d275c2dbf84915a5c0ec9a2d17d2cd86b01" + "reference": "bd84b629c8de41aa2ae82c067c955e06f1b00240" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/9f854d275c2dbf84915a5c0ec9a2d17d2cd86b01", - "reference": "9f854d275c2dbf84915a5c0ec9a2d17d2cd86b01", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/bd84b629c8de41aa2ae82c067c955e06f1b00240", + "reference": "bd84b629c8de41aa2ae82c067c955e06f1b00240", "shasum": "" }, "require": { @@ -1678,9 +1678,9 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.24.1" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.25.0" }, - "time": "2023-09-18T12:18:02+00:00" + "time": "2024-01-04T17:06:16+00:00" }, { "name": "psr/cache", @@ -2262,16 +2262,16 @@ }, { "name": "symfony/cache", - "version": "v5.4.28", + "version": "v5.4.35", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "62b7ae3bccc5b474a30fadc7ef6bbc362007d3f9" + "reference": "db1adb004e2da984085d0178964eb6f319d3cba1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/62b7ae3bccc5b474a30fadc7ef6bbc362007d3f9", - "reference": "62b7ae3bccc5b474a30fadc7ef6bbc362007d3f9", + "url": "https://api.github.com/repos/symfony/cache/zipball/db1adb004e2da984085d0178964eb6f319d3cba1", + "reference": "db1adb004e2da984085d0178964eb6f319d3cba1", "shasum": "" }, "require": { @@ -2299,7 +2299,7 @@ "require-dev": { "cache/integration-tests": "dev-master", "doctrine/cache": "^1.6|^2.0", - "doctrine/dbal": "^2.13.1|^3.0", + "doctrine/dbal": "^2.13.1|^3|^4", "predis/predis": "^1.1", "psr/simple-cache": "^1.0|^2.0", "symfony/config": "^4.4|^5.0|^6.0", @@ -2339,7 +2339,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v5.4.28" + "source": "https://github.com/symfony/cache/tree/v5.4.35" }, "funding": [ { @@ -2355,7 +2355,7 @@ "type": "tidelift" } ], - "time": "2023-08-05T08:32:42+00:00" + "time": "2024-01-23T13:51:25+00:00" }, { "name": "symfony/cache-contracts", @@ -2438,16 +2438,16 @@ }, { "name": "symfony/config", - "version": "v5.4.26", + "version": "v5.4.35", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "8109892f27beed9252bd1f1c1880aeb4ad842650" + "reference": "6b763438a22a4f20885e994ad6702f6a3f25430e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/8109892f27beed9252bd1f1c1880aeb4ad842650", - "reference": "8109892f27beed9252bd1f1c1880aeb4ad842650", + "url": "https://api.github.com/repos/symfony/config/zipball/6b763438a22a4f20885e994ad6702f6a3f25430e", + "reference": "6b763438a22a4f20885e994ad6702f6a3f25430e", "shasum": "" }, "require": { @@ -2497,7 +2497,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v5.4.26" + "source": "https://github.com/symfony/config/tree/v5.4.35" }, "funding": [ { @@ -2513,20 +2513,20 @@ "type": "tidelift" } ], - "time": "2023-07-19T20:21:11+00:00" + "time": "2024-01-23T13:51:25+00:00" }, { "name": "symfony/console", - "version": "v5.4.28", + "version": "v5.4.35", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "f4f71842f24c2023b91237c72a365306f3c58827" + "reference": "dbdf6adcb88d5f83790e1efb57ef4074309d3931" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/f4f71842f24c2023b91237c72a365306f3c58827", - "reference": "f4f71842f24c2023b91237c72a365306f3c58827", + "url": "https://api.github.com/repos/symfony/console/zipball/dbdf6adcb88d5f83790e1efb57ef4074309d3931", + "reference": "dbdf6adcb88d5f83790e1efb57ef4074309d3931", "shasum": "" }, "require": { @@ -2596,7 +2596,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.28" + "source": "https://github.com/symfony/console/tree/v5.4.35" }, "funding": [ { @@ -2612,20 +2612,20 @@ "type": "tidelift" } ], - "time": "2023-08-07T06:12:30+00:00" + "time": "2024-01-23T14:28:09+00:00" }, { "name": "symfony/dependency-injection", - "version": "v5.4.28", + "version": "v5.4.35", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "addc22fed594f9ce04e73ef6a9d3e2416f77192d" + "reference": "45474d527212ca67cdb93f6c5e6da68f4bc67118" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/addc22fed594f9ce04e73ef6a9d3e2416f77192d", - "reference": "addc22fed594f9ce04e73ef6a9d3e2416f77192d", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/45474d527212ca67cdb93f6c5e6da68f4bc67118", + "reference": "45474d527212ca67cdb93f6c5e6da68f4bc67118", "shasum": "" }, "require": { @@ -2685,7 +2685,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v5.4.28" + "source": "https://github.com/symfony/dependency-injection/tree/v5.4.35" }, "funding": [ { @@ -2701,7 +2701,7 @@ "type": "tidelift" } ], - "time": "2023-08-14T10:47:38+00:00" + "time": "2024-01-29T20:37:36+00:00" }, { "name": "symfony/deprecation-contracts", @@ -2772,16 +2772,16 @@ }, { "name": "symfony/event-dispatcher", - "version": "v5.4.26", + "version": "v5.4.35", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "5dcc00e03413f05c1e7900090927bb7247cb0aac" + "reference": "7a69a85c7ea5bdd1e875806a99c51a87d3a74b38" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/5dcc00e03413f05c1e7900090927bb7247cb0aac", - "reference": "5dcc00e03413f05c1e7900090927bb7247cb0aac", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/7a69a85c7ea5bdd1e875806a99c51a87d3a74b38", + "reference": "7a69a85c7ea5bdd1e875806a99c51a87d3a74b38", "shasum": "" }, "require": { @@ -2837,7 +2837,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.26" + "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.35" }, "funding": [ { @@ -2853,7 +2853,7 @@ "type": "tidelift" } ], - "time": "2023-07-06T06:34:20+00:00" + "time": "2024-01-23T13:51:25+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -2936,16 +2936,16 @@ }, { "name": "symfony/expression-language", - "version": "v5.4.21", + "version": "v5.4.35", "source": { "type": "git", "url": "https://github.com/symfony/expression-language.git", - "reference": "501589522b844b8eecf012c133f0404f0eef77ac" + "reference": "d59441c10a5a73cd9d4d778b8253595a16f6716d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/expression-language/zipball/501589522b844b8eecf012c133f0404f0eef77ac", - "reference": "501589522b844b8eecf012c133f0404f0eef77ac", + "url": "https://api.github.com/repos/symfony/expression-language/zipball/d59441c10a5a73cd9d4d778b8253595a16f6716d", + "reference": "d59441c10a5a73cd9d4d778b8253595a16f6716d", "shasum": "" }, "require": { @@ -2979,7 +2979,7 @@ "description": "Provides an engine that can compile and evaluate expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/expression-language/tree/v5.4.21" + "source": "https://github.com/symfony/expression-language/tree/v5.4.35" }, "funding": [ { @@ -2995,20 +2995,20 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:03:56+00:00" + "time": "2024-01-23T13:51:25+00:00" }, { "name": "symfony/filesystem", - "version": "v5.4.25", + "version": "v5.4.35", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "0ce3a62c9579a53358d3a7eb6b3dfb79789a6364" + "reference": "5a553607d4ffbfa9c0ab62facadea296c9db7086" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/0ce3a62c9579a53358d3a7eb6b3dfb79789a6364", - "reference": "0ce3a62c9579a53358d3a7eb6b3dfb79789a6364", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/5a553607d4ffbfa9c0ab62facadea296c9db7086", + "reference": "5a553607d4ffbfa9c0ab62facadea296c9db7086", "shasum": "" }, "require": { @@ -3043,7 +3043,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.4.25" + "source": "https://github.com/symfony/filesystem/tree/v5.4.35" }, "funding": [ { @@ -3059,20 +3059,20 @@ "type": "tidelift" } ], - "time": "2023-05-31T13:04:02+00:00" + "time": "2024-01-23T13:51:25+00:00" }, { "name": "symfony/finder", - "version": "v5.4.27", + "version": "v5.4.35", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "ff4bce3c33451e7ec778070e45bd23f74214cd5d" + "reference": "abe6d6f77d9465fed3cd2d029b29d03b56b56435" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/ff4bce3c33451e7ec778070e45bd23f74214cd5d", - "reference": "ff4bce3c33451e7ec778070e45bd23f74214cd5d", + "url": "https://api.github.com/repos/symfony/finder/zipball/abe6d6f77d9465fed3cd2d029b29d03b56b56435", + "reference": "abe6d6f77d9465fed3cd2d029b29d03b56b56435", "shasum": "" }, "require": { @@ -3106,7 +3106,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.27" + "source": "https://github.com/symfony/finder/tree/v5.4.35" }, "funding": [ { @@ -3122,20 +3122,20 @@ "type": "tidelift" } ], - "time": "2023-07-31T08:02:31+00:00" + "time": "2024-01-23T13:51:25+00:00" }, { "name": "symfony/http-foundation", - "version": "v5.4.28", + "version": "v5.4.35", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "365992c83a836dfe635f1e903ccca43ee03d3dd2" + "reference": "f2ab692a22aef1cd54beb893aa0068bdfb093928" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/365992c83a836dfe635f1e903ccca43ee03d3dd2", - "reference": "365992c83a836dfe635f1e903ccca43ee03d3dd2", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f2ab692a22aef1cd54beb893aa0068bdfb093928", + "reference": "f2ab692a22aef1cd54beb893aa0068bdfb093928", "shasum": "" }, "require": { @@ -3182,7 +3182,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.4.28" + "source": "https://github.com/symfony/http-foundation/tree/v5.4.35" }, "funding": [ { @@ -3198,20 +3198,20 @@ "type": "tidelift" } ], - "time": "2023-08-21T07:23:18+00:00" + "time": "2024-01-23T13:51:25+00:00" }, { "name": "symfony/lock", - "version": "v5.4.25", + "version": "v5.4.35", "source": { "type": "git", "url": "https://github.com/symfony/lock.git", - "reference": "ed4055b2e03c8893ce2d0042c8f0e0707be8e179" + "reference": "b8b0d5b283af0e117e7ef6141b5b7e5efb20b247" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/lock/zipball/ed4055b2e03c8893ce2d0042c8f0e0707be8e179", - "reference": "ed4055b2e03c8893ce2d0042c8f0e0707be8e179", + "url": "https://api.github.com/repos/symfony/lock/zipball/b8b0d5b283af0e117e7ef6141b5b7e5efb20b247", + "reference": "b8b0d5b283af0e117e7ef6141b5b7e5efb20b247", "shasum": "" }, "require": { @@ -3224,7 +3224,7 @@ "doctrine/dbal": "<2.13" }, "require-dev": { - "doctrine/dbal": "^2.13|^3.0", + "doctrine/dbal": "^2.13|^3|^4", "predis/predis": "~1.0" }, "type": "library", @@ -3261,7 +3261,7 @@ "semaphore" ], "support": { - "source": "https://github.com/symfony/lock/tree/v5.4.25" + "source": "https://github.com/symfony/lock/tree/v5.4.35" }, "funding": [ { @@ -3277,20 +3277,20 @@ "type": "tidelift" } ], - "time": "2023-06-22T08:06:06+00:00" + "time": "2024-01-23T13:51:25+00:00" }, { "name": "symfony/mailer", - "version": "v5.4.22", + "version": "v5.4.35", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "6330cd465dfd8b7a07515757a1c37069075f7b0b" + "reference": "664724b0fb4646dee30859d0ed9131a2d7633320" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/6330cd465dfd8b7a07515757a1c37069075f7b0b", - "reference": "6330cd465dfd8b7a07515757a1c37069075f7b0b", + "url": "https://api.github.com/repos/symfony/mailer/zipball/664724b0fb4646dee30859d0ed9131a2d7633320", + "reference": "664724b0fb4646dee30859d0ed9131a2d7633320", "shasum": "" }, "require": { @@ -3337,7 +3337,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v5.4.22" + "source": "https://github.com/symfony/mailer/tree/v5.4.35" }, "funding": [ { @@ -3353,20 +3353,20 @@ "type": "tidelift" } ], - "time": "2023-03-10T10:15:32+00:00" + "time": "2024-01-29T07:33:37+00:00" }, { "name": "symfony/mime", - "version": "v5.4.26", + "version": "v5.4.35", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "2ea06dfeee20000a319d8407cea1d47533d5a9d2" + "reference": "ee94d9b538f93abbbc1ee4ccff374593117b04a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/2ea06dfeee20000a319d8407cea1d47533d5a9d2", - "reference": "2ea06dfeee20000a319d8407cea1d47533d5a9d2", + "url": "https://api.github.com/repos/symfony/mime/zipball/ee94d9b538f93abbbc1ee4ccff374593117b04a9", + "reference": "ee94d9b538f93abbbc1ee4ccff374593117b04a9", "shasum": "" }, "require": { @@ -3381,7 +3381,7 @@ "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", "symfony/mailer": "<4.4", - "symfony/serializer": "<5.4.26|>=6,<6.2.13|>=6.3,<6.3.2" + "symfony/serializer": "<5.4.35|>=6,<6.3.12|>=6.4,<6.4.3" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3.1|^4", @@ -3389,7 +3389,7 @@ "symfony/dependency-injection": "^4.4|^5.0|^6.0", "symfony/property-access": "^4.4|^5.1|^6.0", "symfony/property-info": "^4.4|^5.1|^6.0", - "symfony/serializer": "^5.4.26|~6.2.13|^6.3.2" + "symfony/serializer": "^5.4.35|~6.3.12|^6.4.3" }, "type": "library", "autoload": { @@ -3421,7 +3421,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v5.4.26" + "source": "https://github.com/symfony/mime/tree/v5.4.35" }, "funding": [ { @@ -3437,7 +3437,7 @@ "type": "tidelift" } ], - "time": "2023-07-27T06:29:31+00:00" + "time": "2024-01-30T08:00:51+00:00" }, { "name": "symfony/options-resolver", @@ -3510,16 +3510,16 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", - "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", "shasum": "" }, "require": { @@ -3533,9 +3533,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -3572,7 +3569,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0" }, "funding": [ { @@ -3588,20 +3585,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "875e90aeea2777b6f135677f618529449334a612" + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", - "reference": "875e90aeea2777b6f135677f618529449334a612", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", "shasum": "" }, "require": { @@ -3612,9 +3609,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -3653,7 +3647,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.0" }, "funding": [ { @@ -3669,20 +3663,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-intl-icu", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-icu.git", - "reference": "e46b4da57951a16053cd751f63f4a24292788157" + "reference": "07094a28851a49107f3ab4f9120ca2975a64b6e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/e46b4da57951a16053cd751f63f4a24292788157", - "reference": "e46b4da57951a16053cd751f63f4a24292788157", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/07094a28851a49107f3ab4f9120ca2975a64b6e1", + "reference": "07094a28851a49107f3ab4f9120ca2975a64b6e1", "shasum": "" }, "require": { @@ -3693,9 +3687,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -3740,7 +3731,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.29.0" }, "funding": [ { @@ -3756,20 +3747,20 @@ "type": "tidelift" } ], - "time": "2023-03-21T17:27:24+00:00" + "time": "2024-01-29T20:12:16+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "ecaafce9f77234a6a449d29e49267ba10499116d" + "reference": "a287ed7475f85bf6f61890146edbc932c0fff919" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/ecaafce9f77234a6a449d29e49267ba10499116d", - "reference": "ecaafce9f77234a6a449d29e49267ba10499116d", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a287ed7475f85bf6f61890146edbc932c0fff919", + "reference": "a287ed7475f85bf6f61890146edbc932c0fff919", "shasum": "" }, "require": { @@ -3782,9 +3773,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -3827,7 +3815,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.29.0" }, "funding": [ { @@ -3843,20 +3831,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:30:37+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", - "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", "shasum": "" }, "require": { @@ -3867,9 +3855,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -3911,7 +3896,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0" }, "funding": [ { @@ -3927,20 +3912,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "42292d99c55abe617799667f454222c54c60e229" + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", - "reference": "42292d99c55abe617799667f454222c54c60e229", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", "shasum": "" }, "require": { @@ -3954,9 +3939,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -3994,7 +3976,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" }, "funding": [ { @@ -4010,20 +3992,20 @@ "type": "tidelift" } ], - "time": "2023-07-28T09:04:16+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179" + "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/70f4aebd92afca2f865444d30a4d2151c13c3179", - "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/861391a8da9a04cbad2d232ddd9e4893220d6e25", + "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25", "shasum": "" }, "require": { @@ -4031,9 +4013,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -4070,7 +4049,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.29.0" }, "funding": [ { @@ -4086,20 +4065,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5" + "reference": "21bd091060673a1177ae842c0ef8fe30893114d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fe2f306d1d9d346a7fee353d0d5012e401e984b5", - "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/21bd091060673a1177ae842c0ef8fe30893114d2", + "reference": "21bd091060673a1177ae842c0ef8fe30893114d2", "shasum": "" }, "require": { @@ -4107,9 +4086,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -4149,7 +4125,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.29.0" }, "funding": [ { @@ -4165,20 +4141,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", - "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", "shasum": "" }, "require": { @@ -4186,9 +4162,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -4232,7 +4205,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0" }, "funding": [ { @@ -4248,20 +4221,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-php81", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b" + "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/7581cd600fa9fd681b797d00b02f068e2f13263b", - "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/c565ad1e63f30e7477fc40738343c62b40bc672d", + "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d", "shasum": "" }, "require": { @@ -4269,9 +4242,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -4311,7 +4281,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.29.0" }, "funding": [ { @@ -4327,20 +4297,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/property-access", - "version": "v5.4.26", + "version": "v5.4.35", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "0249e46f69e92049a488f39fcf531cb42c50caaa" + "reference": "f1341758d8046cfff0ac748a0cad238f917191d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/0249e46f69e92049a488f39fcf531cb42c50caaa", - "reference": "0249e46f69e92049a488f39fcf531cb42c50caaa", + "url": "https://api.github.com/repos/symfony/property-access/zipball/f1341758d8046cfff0ac748a0cad238f917191d4", + "reference": "f1341758d8046cfff0ac748a0cad238f917191d4", "shasum": "" }, "require": { @@ -4392,7 +4362,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v5.4.26" + "source": "https://github.com/symfony/property-access/tree/v5.4.35" }, "funding": [ { @@ -4408,20 +4378,20 @@ "type": "tidelift" } ], - "time": "2023-07-13T15:20:41+00:00" + "time": "2024-01-23T13:51:25+00:00" }, { "name": "symfony/property-info", - "version": "v5.4.24", + "version": "v5.4.35", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "d43b85b00699b4484964c297575b5c6f9dc5f6e1" + "reference": "d30d48f366ad2bfbf521256be85eb1c182c29198" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/d43b85b00699b4484964c297575b5c6f9dc5f6e1", - "reference": "d43b85b00699b4484964c297575b5c6f9dc5f6e1", + "url": "https://api.github.com/repos/symfony/property-info/zipball/d30d48f366ad2bfbf521256be85eb1c182c29198", + "reference": "d30d48f366ad2bfbf521256be85eb1c182c29198", "shasum": "" }, "require": { @@ -4483,7 +4453,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v5.4.24" + "source": "https://github.com/symfony/property-info/tree/v5.4.35" }, "funding": [ { @@ -4499,20 +4469,20 @@ "type": "tidelift" } ], - "time": "2023-05-15T20:11:03+00:00" + "time": "2024-01-23T15:43:50+00:00" }, { "name": "symfony/rate-limiter", - "version": "v5.4.26", + "version": "v5.4.35", "source": { "type": "git", "url": "https://github.com/symfony/rate-limiter.git", - "reference": "189c8aa18be55c734d56d8ea8b0d1862e9a0e493" + "reference": "9bd24ef2e0948fff4d6741798ba4c7468b75bc8d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/189c8aa18be55c734d56d8ea8b0d1862e9a0e493", - "reference": "189c8aa18be55c734d56d8ea8b0d1862e9a0e493", + "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/9bd24ef2e0948fff4d6741798ba4c7468b75bc8d", + "reference": "9bd24ef2e0948fff4d6741798ba4c7468b75bc8d", "shasum": "" }, "require": { @@ -4553,7 +4523,7 @@ "rate-limiter" ], "support": { - "source": "https://github.com/symfony/rate-limiter/tree/v5.4.26" + "source": "https://github.com/symfony/rate-limiter/tree/v5.4.35" }, "funding": [ { @@ -4569,20 +4539,20 @@ "type": "tidelift" } ], - "time": "2023-07-10T11:10:11+00:00" + "time": "2024-01-23T13:51:25+00:00" }, { "name": "symfony/routing", - "version": "v5.4.26", + "version": "v5.4.35", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "853fc7df96befc468692de0a48831b38f04d2cb2" + "reference": "86c5a06a61ddaf17efa1403542e3d7146af96203" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/853fc7df96befc468692de0a48831b38f04d2cb2", - "reference": "853fc7df96befc468692de0a48831b38f04d2cb2", + "url": "https://api.github.com/repos/symfony/routing/zipball/86c5a06a61ddaf17efa1403542e3d7146af96203", + "reference": "86c5a06a61ddaf17efa1403542e3d7146af96203", "shasum": "" }, "require": { @@ -4643,7 +4613,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v5.4.26" + "source": "https://github.com/symfony/routing/tree/v5.4.35" }, "funding": [ { @@ -4659,7 +4629,7 @@ "type": "tidelift" } ], - "time": "2023-07-24T13:28:37+00:00" + "time": "2024-01-30T13:10:15+00:00" }, { "name": "symfony/service-contracts", @@ -4746,16 +4716,16 @@ }, { "name": "symfony/string", - "version": "v5.4.26", + "version": "v5.4.35", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "1181fe9270e373537475e826873b5867b863883c" + "reference": "c209c4d0559acce1c9a2067612cfb5d35756edc2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/1181fe9270e373537475e826873b5867b863883c", - "reference": "1181fe9270e373537475e826873b5867b863883c", + "url": "https://api.github.com/repos/symfony/string/zipball/c209c4d0559acce1c9a2067612cfb5d35756edc2", + "reference": "c209c4d0559acce1c9a2067612cfb5d35756edc2", "shasum": "" }, "require": { @@ -4812,7 +4782,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.4.26" + "source": "https://github.com/symfony/string/tree/v5.4.35" }, "funding": [ { @@ -4828,20 +4798,20 @@ "type": "tidelift" } ], - "time": "2023-06-28T12:46:07+00:00" + "time": "2024-01-23T13:51:25+00:00" }, { "name": "symfony/var-exporter", - "version": "v5.4.26", + "version": "v5.4.35", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "11401fe94f960249b3c63a488c63ba73091c1e4a" + "reference": "abb0a151b62d6b07e816487e20040464af96cae7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/11401fe94f960249b3c63a488c63ba73091c1e4a", - "reference": "11401fe94f960249b3c63a488c63ba73091c1e4a", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/abb0a151b62d6b07e816487e20040464af96cae7", + "reference": "abb0a151b62d6b07e816487e20040464af96cae7", "shasum": "" }, "require": { @@ -4885,7 +4855,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v5.4.26" + "source": "https://github.com/symfony/var-exporter/tree/v5.4.35" }, "funding": [ { @@ -4901,20 +4871,20 @@ "type": "tidelift" } ], - "time": "2023-07-20T07:21:16+00:00" + "time": "2024-01-23T13:51:25+00:00" }, { "name": "symfony/yaml", - "version": "v5.4.23", + "version": "v5.4.35", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "4cd2e3ea301aadd76a4172756296fe552fb45b0b" + "reference": "e78db7f5c70a21f0417a31f414c4a95fe76c07e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/4cd2e3ea301aadd76a4172756296fe552fb45b0b", - "reference": "4cd2e3ea301aadd76a4172756296fe552fb45b0b", + "url": "https://api.github.com/repos/symfony/yaml/zipball/e78db7f5c70a21f0417a31f414c4a95fe76c07e4", + "reference": "e78db7f5c70a21f0417a31f414c4a95fe76c07e4", "shasum": "" }, "require": { @@ -4960,7 +4930,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.4.23" + "source": "https://github.com/symfony/yaml/tree/v5.4.35" }, "funding": [ { @@ -4976,7 +4946,7 @@ "type": "tidelift" } ], - "time": "2023-04-23T19:33:36+00:00" + "time": "2024-01-23T13:51:25+00:00" }, { "name": "typo3/class-alias-loader", @@ -5150,16 +5120,16 @@ }, { "name": "typo3/cms-core", - "version": "v11.5.31", + "version": "v11.5.35", "source": { "type": "git", "url": "https://github.com/TYPO3-CMS/core.git", - "reference": "1a14cc907bbd3c96401cb041166dc368f2ebdfb4" + "reference": "184de98b0d4444f0ccf6bb3e43c98eb99ccb1d5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TYPO3-CMS/core/zipball/1a14cc907bbd3c96401cb041166dc368f2ebdfb4", - "reference": "1a14cc907bbd3c96401cb041166dc368f2ebdfb4", + "url": "https://api.github.com/repos/TYPO3-CMS/core/zipball/184de98b0d4444f0ccf6bb3e43c98eb99ccb1d5c", + "reference": "184de98b0d4444f0ccf6bb3e43c98eb99ccb1d5c", "shasum": "" }, "require": { @@ -5217,7 +5187,7 @@ "typo3/class-alias-loader": "^1.1.4", "typo3/cms-cli": "^3.1", "typo3/cms-composer-installers": "^2.0 || ^3.0 || ^4.0", - "typo3/html-sanitizer": "^2.1.3", + "typo3/html-sanitizer": "^2.1.4", "typo3/phar-stream-wrapper": "^3.1.7", "typo3/symfony-psr-event-dispatcher-adapter": "^1.0 || ^2.0", "typo3fluid/fluid": "^2.7.2" @@ -5231,9 +5201,9 @@ "psr/http-message-implementation": "1.0" }, "replace": { - "typo3/cms-lang": "*", - "typo3/cms-saltedpasswords": "*", - "typo3/cms-sv": "*" + "typo3/cms-lang": "self.version", + "typo3/cms-saltedpasswords": "self.version", + "typo3/cms-sv": "self.version" }, "suggest": { "ext-fileinfo": "Used for proper file type detection in the file abstraction layer", @@ -5289,20 +5259,20 @@ "issues": "https://forge.typo3.org", "source": "https://github.com/typo3/typo3" }, - "time": "2023-09-12T06:50:21+00:00" + "time": "2024-02-13T09:50:23+00:00" }, { "name": "typo3/cms-extbase", - "version": "v11.5.31", + "version": "v11.5.35", "source": { "type": "git", "url": "https://github.com/TYPO3-CMS/extbase.git", - "reference": "e88222da652c300b0a91ed5054c3d67043b334a5" + "reference": "1b4920697d28998f0c4e6eef7947ae2467b50ff4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TYPO3-CMS/extbase/zipball/e88222da652c300b0a91ed5054c3d67043b334a5", - "reference": "e88222da652c300b0a91ed5054c3d67043b334a5", + "url": "https://api.github.com/repos/TYPO3-CMS/extbase/zipball/1b4920697d28998f0c4e6eef7947ae2467b50ff4", + "reference": "1b4920697d28998f0c4e6eef7947ae2467b50ff4", "shasum": "" }, "require": { @@ -5311,7 +5281,7 @@ "symfony/dependency-injection": "^5.4", "symfony/property-access": "^5.4", "symfony/property-info": "^5.4", - "typo3/cms-core": "11.5.31" + "typo3/cms-core": "11.5.35" }, "conflict": { "typo3/cms": "*" @@ -5358,24 +5328,24 @@ "issues": "https://forge.typo3.org", "source": "https://github.com/typo3/typo3" }, - "time": "2023-09-12T06:50:21+00:00" + "time": "2024-02-13T09:50:23+00:00" }, { "name": "typo3/cms-tstemplate", - "version": "v11.5.31", + "version": "v11.5.35", "source": { "type": "git", "url": "https://github.com/TYPO3-CMS/tstemplate.git", - "reference": "3ddcded5bca6f1b2d89fae2515c4f83aa6127fc6" + "reference": "dd4737679dfb88f3af5a1e5167a899212a877672" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TYPO3-CMS/tstemplate/zipball/3ddcded5bca6f1b2d89fae2515c4f83aa6127fc6", - "reference": "3ddcded5bca6f1b2d89fae2515c4f83aa6127fc6", + "url": "https://api.github.com/repos/TYPO3-CMS/tstemplate/zipball/dd4737679dfb88f3af5a1e5167a899212a877672", + "reference": "dd4737679dfb88f3af5a1e5167a899212a877672", "shasum": "" }, "require": { - "typo3/cms-core": "11.5.31" + "typo3/cms-core": "11.5.35" }, "conflict": { "typo3/cms": "*" @@ -5416,20 +5386,20 @@ "issues": "https://forge.typo3.org", "source": "https://github.com/typo3/typo3" }, - "time": "2023-09-12T06:50:21+00:00" + "time": "2024-02-13T09:50:23+00:00" }, { "name": "typo3/html-sanitizer", - "version": "v2.1.3", + "version": "v2.1.4", "source": { "type": "git", "url": "https://github.com/TYPO3/html-sanitizer.git", - "reference": "a35f220b2336e3f040f91d3de23d19964833643f" + "reference": "b8f90717251d968c49dc77f8c1e5912e2fbe0dff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TYPO3/html-sanitizer/zipball/a35f220b2336e3f040f91d3de23d19964833643f", - "reference": "a35f220b2336e3f040f91d3de23d19964833643f", + "url": "https://api.github.com/repos/TYPO3/html-sanitizer/zipball/b8f90717251d968c49dc77f8c1e5912e2fbe0dff", + "reference": "b8f90717251d968c49dc77f8c1e5912e2fbe0dff", "shasum": "" }, "require": { @@ -5465,9 +5435,9 @@ "description": "HTML sanitizer aiming to provide XSS-safe markup based on explicitly allowed tags, attributes and values.", "support": { "issues": "https://github.com/TYPO3/html-sanitizer/issues", - "source": "https://github.com/TYPO3/html-sanitizer/tree/v2.1.3" + "source": "https://github.com/TYPO3/html-sanitizer/tree/v2.1.4" }, - "time": "2023-07-25T08:47:32+00:00" + "time": "2023-11-14T07:41:08+00:00" }, { "name": "typo3/phar-stream-wrapper", @@ -5804,25 +5774,25 @@ }, { "name": "clue/term-react", - "version": "v1.3.0", + "version": "v1.4.0", "source": { "type": "git", "url": "https://github.com/clue/reactphp-term.git", - "reference": "eb6eb063eda04a714ef89f066586a2c49588f7ca" + "reference": "00f297dc597eaee2ebf98af8f27cca5d21d60fa3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/clue/reactphp-term/zipball/eb6eb063eda04a714ef89f066586a2c49588f7ca", - "reference": "eb6eb063eda04a714ef89f066586a2c49588f7ca", + "url": "https://api.github.com/repos/clue/reactphp-term/zipball/00f297dc597eaee2ebf98af8f27cca5d21d60fa3", + "reference": "00f297dc597eaee2ebf98af8f27cca5d21d60fa3", "shasum": "" }, "require": { "php": ">=5.3", - "react/stream": "^1.0 || ^0.7" + "react/stream": "^1.2" }, "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8", - "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3" + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/event-loop": "^1.2" }, "type": "library", "autoload": { @@ -5861,7 +5831,7 @@ ], "support": { "issues": "https://github.com/clue/reactphp-term/issues", - "source": "https://github.com/clue/reactphp-term/tree/v1.3.0" + "source": "https://github.com/clue/reactphp-term/tree/v1.4.0" }, "funding": [ { @@ -5873,20 +5843,20 @@ "type": "github" } ], - "time": "2020-11-06T11:50:12+00:00" + "time": "2024-01-30T10:22:09+00:00" }, { "name": "clue/utf8-react", - "version": "v1.2.0", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/clue/reactphp-utf8.git", - "reference": "8bc3f8c874cdf642c8f10f9ae93aadb8cd63da96" + "reference": "d5cd04d39cb5457aa5df830b7c4b301d2694217e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/clue/reactphp-utf8/zipball/8bc3f8c874cdf642c8f10f9ae93aadb8cd63da96", - "reference": "8bc3f8c874cdf642c8f10f9ae93aadb8cd63da96", + "url": "https://api.github.com/repos/clue/reactphp-utf8/zipball/d5cd04d39cb5457aa5df830b7c4b301d2694217e", + "reference": "d5cd04d39cb5457aa5df830b7c4b301d2694217e", "shasum": "" }, "require": { @@ -5894,7 +5864,7 @@ "react/stream": "^1.0 || ^0.7 || ^0.6 || ^0.5 || ^0.4 || ^0.3" }, "require-dev": { - "phpunit/phpunit": "^9.3 ||^5.7 || ^4.8", + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", "react/stream": "^1.0 || ^0.7" }, "type": "library", @@ -5924,7 +5894,7 @@ ], "support": { "issues": "https://github.com/clue/reactphp-utf8/issues", - "source": "https://github.com/clue/reactphp-utf8/tree/v1.2.0" + "source": "https://github.com/clue/reactphp-utf8/tree/v1.3.0" }, "funding": [ { @@ -5936,7 +5906,7 @@ "type": "github" } ], - "time": "2020-11-06T11:48:09+00:00" + "time": "2023-12-06T14:52:17+00:00" }, { "name": "evenement/evenement", @@ -6268,25 +6238,87 @@ }, "time": "2022-02-21T01:04:05+00:00" }, + { + "name": "phpstan/phpstan", + "version": "1.10.58", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "a23518379ec4defd9e47cbf81019526861623ec2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/a23518379ec4defd9e47cbf81019526861623ec2", + "reference": "a23518379ec4defd9e47cbf81019526861623ec2", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0" + }, + "conflict": { + "phpstan/phpstan-shim": "*" + }, + "bin": [ + "phpstan", + "phpstan.phar" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan - PHP Static Analysis Tool", + "keywords": [ + "dev", + "static analysis" + ], + "support": { + "docs": "https://phpstan.org/user-guide/getting-started", + "forum": "https://github.com/phpstan/phpstan/discussions", + "issues": "https://github.com/phpstan/phpstan/issues", + "security": "https://github.com/phpstan/phpstan/security/policy", + "source": "https://github.com/phpstan/phpstan-src" + }, + "funding": [ + { + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://github.com/phpstan", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", + "type": "tidelift" + } + ], + "time": "2024-02-12T20:02:57+00:00" + }, { "name": "phpunit/php-code-coverage", - "version": "9.2.29", + "version": "9.2.30", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76" + "reference": "ca2bd87d2f9215904682a9cb9bb37dda98e76089" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/6a3a87ac2bbe33b25042753df8195ba4aa534c76", - "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ca2bd87d2f9215904682a9cb9bb37dda98e76089", + "reference": "ca2bd87d2f9215904682a9cb9bb37dda98e76089", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.15", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=7.3", "phpunit/php-file-iterator": "^3.0.3", "phpunit/php-text-template": "^2.0.2", @@ -6336,7 +6368,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.29" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.30" }, "funding": [ { @@ -6344,7 +6376,7 @@ "type": "github" } ], - "time": "2023-09-19T04:57:46+00:00" + "time": "2023-12-22T06:47:57+00:00" }, { "name": "phpunit/php-file-iterator", @@ -6589,16 +6621,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.13", + "version": "9.6.16", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "f3d767f7f9e191eab4189abe41ab37797e30b1be" + "reference": "3767b2c56ce02d01e3491046f33466a1ae60a37f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f3d767f7f9e191eab4189abe41ab37797e30b1be", - "reference": "f3d767f7f9e191eab4189abe41ab37797e30b1be", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3767b2c56ce02d01e3491046f33466a1ae60a37f", + "reference": "3767b2c56ce02d01e3491046f33466a1ae60a37f", "shasum": "" }, "require": { @@ -6672,7 +6704,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.13" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.16" }, "funding": [ { @@ -6688,20 +6720,20 @@ "type": "tidelift" } ], - "time": "2023-09-19T05:39:22+00:00" + "time": "2024-01-19T07:03:14+00:00" }, { "name": "react/event-loop", - "version": "v1.4.0", + "version": "v1.5.0", "source": { "type": "git", "url": "https://github.com/reactphp/event-loop.git", - "reference": "6e7e587714fff7a83dcc7025aee42ab3b265ae05" + "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/event-loop/zipball/6e7e587714fff7a83dcc7025aee42ab3b265ae05", - "reference": "6e7e587714fff7a83dcc7025aee42ab3b265ae05", + "url": "https://api.github.com/repos/reactphp/event-loop/zipball/bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", + "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", "shasum": "" }, "require": { @@ -6752,7 +6784,7 @@ ], "support": { "issues": "https://github.com/reactphp/event-loop/issues", - "source": "https://github.com/reactphp/event-loop/tree/v1.4.0" + "source": "https://github.com/reactphp/event-loop/tree/v1.5.0" }, "funding": [ { @@ -6760,7 +6792,7 @@ "type": "open_collective" } ], - "time": "2023-05-05T10:11:24+00:00" + "time": "2023-11-13T13:48:05+00:00" }, { "name": "react/stream", @@ -7083,20 +7115,20 @@ }, { "name": "sebastian/complexity", - "version": "2.0.2", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a", "shasum": "" }, "require": { - "nikic/php-parser": "^4.7", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=7.3" }, "require-dev": { @@ -7128,7 +7160,7 @@ "homepage": "https://github.com/sebastianbergmann/complexity", "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", - "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3" }, "funding": [ { @@ -7136,7 +7168,7 @@ "type": "github" } ], - "time": "2020-10-26T15:52:27+00:00" + "time": "2023-12-22T06:19:30+00:00" }, { "name": "sebastian/diff", @@ -7410,20 +7442,20 @@ }, { "name": "sebastian/lines-of-code", - "version": "1.0.3", + "version": "1.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5", "shasum": "" }, "require": { - "nikic/php-parser": "^4.6", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=7.3" }, "require-dev": { @@ -7455,7 +7487,7 @@ "homepage": "https://github.com/sebastianbergmann/lines-of-code", "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4" }, "funding": [ { @@ -7463,7 +7495,7 @@ "type": "github" } ], - "time": "2020-11-28T06:42:11+00:00" + "time": "2023-12-22T06:20:34+00:00" }, { "name": "sebastian/object-enumerator", @@ -7870,16 +7902,16 @@ }, { "name": "symfony/process", - "version": "v5.4.28", + "version": "v5.4.35", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "45261e1fccad1b5447a8d7a8e67aa7b4a9798b7b" + "reference": "cbc28e34015ad50166fc2f9c8962d28d0fe861eb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/45261e1fccad1b5447a8d7a8e67aa7b4a9798b7b", - "reference": "45261e1fccad1b5447a8d7a8e67aa7b4a9798b7b", + "url": "https://api.github.com/repos/symfony/process/zipball/cbc28e34015ad50166fc2f9c8962d28d0fe861eb", + "reference": "cbc28e34015ad50166fc2f9c8962d28d0fe861eb", "shasum": "" }, "require": { @@ -7912,7 +7944,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.28" + "source": "https://github.com/symfony/process/tree/v5.4.35" }, "funding": [ { @@ -7928,20 +7960,20 @@ "type": "tidelift" } ], - "time": "2023-08-07T10:36:04+00:00" + "time": "2024-01-23T13:51:25+00:00" }, { "name": "theseer/tokenizer", - "version": "1.2.1", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96", + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96", "shasum": "" }, "require": { @@ -7970,7 +8002,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.1" + "source": "https://github.com/theseer/tokenizer/tree/1.2.2" }, "funding": [ { @@ -7978,37 +8010,37 @@ "type": "github" } ], - "time": "2021-07-28T10:34:58+00:00" + "time": "2023-11-20T00:12:19+00:00" }, { "name": "typo3/cms-backend", - "version": "v11.5.31", + "version": "v11.5.35", "source": { "type": "git", "url": "https://github.com/TYPO3-CMS/backend.git", - "reference": "e45ef6579d1f4e4459c2a79d222a455f06addec7" + "reference": "9a9d297541e2011f50eab9c8da3413d6cbb61e55" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TYPO3-CMS/backend/zipball/e45ef6579d1f4e4459c2a79d222a455f06addec7", - "reference": "e45ef6579d1f4e4459c2a79d222a455f06addec7", + "url": "https://api.github.com/repos/TYPO3-CMS/backend/zipball/9a9d297541e2011f50eab9c8da3413d6cbb61e55", + "reference": "9a9d297541e2011f50eab9c8da3413d6cbb61e55", "shasum": "" }, "require": { "psr/event-dispatcher": "^1.0", - "typo3/cms-core": "11.5.31", - "typo3/cms-recordlist": "11.5.31" + "typo3/cms-core": "11.5.35", + "typo3/cms-recordlist": "11.5.35" }, "conflict": { "typo3/cms": "*" }, "replace": { - "typo3/cms-about": "*", - "typo3/cms-context-help": "*", - "typo3/cms-cshmanual": "*", - "typo3/cms-func-wizards": "*", - "typo3/cms-wizard-crpages": "*", - "typo3/cms-wizard-sortpages": "*" + "typo3/cms-about": "self.version", + "typo3/cms-context-help": "self.version", + "typo3/cms-cshmanual": "self.version", + "typo3/cms-func-wizards": "self.version", + "typo3/cms-wizard-crpages": "self.version", + "typo3/cms-wizard-sortpages": "self.version" }, "suggest": { "typo3/cms-install": "To generate url to install tool in environment toolbar" @@ -8052,26 +8084,26 @@ "issues": "https://forge.typo3.org", "source": "https://github.com/typo3/typo3" }, - "time": "2023-09-12T06:50:21+00:00" + "time": "2024-02-13T09:50:23+00:00" }, { "name": "typo3/cms-fluid", - "version": "v11.5.31", + "version": "v11.5.35", "source": { "type": "git", "url": "https://github.com/TYPO3-CMS/fluid.git", - "reference": "83e976d4bb5459a906bc0f9beace0dffcf3a4132" + "reference": "9c5473ea503fe23edef2dbf004d42acfb34d5718" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TYPO3-CMS/fluid/zipball/83e976d4bb5459a906bc0f9beace0dffcf3a4132", - "reference": "83e976d4bb5459a906bc0f9beace0dffcf3a4132", + "url": "https://api.github.com/repos/TYPO3-CMS/fluid/zipball/9c5473ea503fe23edef2dbf004d42acfb34d5718", + "reference": "9c5473ea503fe23edef2dbf004d42acfb34d5718", "shasum": "" }, "require": { "symfony/dependency-injection": "^5.4", - "typo3/cms-core": "11.5.31", - "typo3/cms-extbase": "11.5.31", + "typo3/cms-core": "11.5.35", + "typo3/cms-extbase": "11.5.35", "typo3fluid/fluid": "^2.7.2" }, "conflict": { @@ -8116,26 +8148,26 @@ "issues": "https://forge.typo3.org", "source": "https://github.com/typo3/typo3" }, - "time": "2023-09-12T06:50:21+00:00" + "time": "2024-02-13T09:50:23+00:00" }, { "name": "typo3/cms-fluid-styled-content", - "version": "v11.5.31", + "version": "v11.5.35", "source": { "type": "git", "url": "https://github.com/TYPO3-CMS/fluid_styled_content.git", - "reference": "01291ea08512db09cbd6070f42040901fbdbb796" + "reference": "cfafebe662c2b53cbef29d34a7b249f6646d22f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TYPO3-CMS/fluid_styled_content/zipball/01291ea08512db09cbd6070f42040901fbdbb796", - "reference": "01291ea08512db09cbd6070f42040901fbdbb796", + "url": "https://api.github.com/repos/TYPO3-CMS/fluid_styled_content/zipball/cfafebe662c2b53cbef29d34a7b249f6646d22f3", + "reference": "cfafebe662c2b53cbef29d34a7b249f6646d22f3", "shasum": "" }, "require": { - "typo3/cms-core": "11.5.31", - "typo3/cms-fluid": "11.5.31", - "typo3/cms-frontend": "11.5.31" + "typo3/cms-core": "11.5.35", + "typo3/cms-fluid": "11.5.35", + "typo3/cms-frontend": "11.5.35" }, "conflict": { "typo3/cms": "*" @@ -8176,26 +8208,26 @@ "issues": "https://forge.typo3.org", "source": "https://github.com/typo3/typo3" }, - "time": "2023-09-12T06:50:21+00:00" + "time": "2024-02-13T09:50:23+00:00" }, { "name": "typo3/cms-frontend", - "version": "v11.5.31", + "version": "v11.5.35", "source": { "type": "git", "url": "https://github.com/TYPO3-CMS/frontend.git", - "reference": "6b3824f3ea2395920167909855fa2a2e0fed705d" + "reference": "3cbf314767b180789c1e79e1f7921aa2e937a492" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TYPO3-CMS/frontend/zipball/6b3824f3ea2395920167909855fa2a2e0fed705d", - "reference": "6b3824f3ea2395920167909855fa2a2e0fed705d", + "url": "https://api.github.com/repos/TYPO3-CMS/frontend/zipball/3cbf314767b180789c1e79e1f7921aa2e937a492", + "reference": "3cbf314767b180789c1e79e1f7921aa2e937a492", "shasum": "" }, "require": { "ext-libxml": "*", "symfony/polyfill-mbstring": "^1.23.1", - "typo3/cms-core": "11.5.31" + "typo3/cms-core": "11.5.35" }, "conflict": { "typo3/cms": "*" @@ -8242,20 +8274,20 @@ "issues": "https://forge.typo3.org", "source": "https://github.com/typo3/typo3" }, - "time": "2023-09-12T06:50:21+00:00" + "time": "2024-02-13T09:50:23+00:00" }, { "name": "typo3/cms-install", - "version": "v11.5.31", + "version": "v11.5.35", "source": { "type": "git", "url": "https://github.com/TYPO3-CMS/install.git", - "reference": "7738fd30fb8b7aa539c763ebd2e39642d92093d4" + "reference": "d03866734a06cf8430a73e028b5b6d4f9eb8a239" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TYPO3-CMS/install/zipball/7738fd30fb8b7aa539c763ebd2e39642d92093d4", - "reference": "7738fd30fb8b7aa539c763ebd2e39642d92093d4", + "url": "https://api.github.com/repos/TYPO3-CMS/install/zipball/d03866734a06cf8430a73e028b5b6d4f9eb8a239", + "reference": "d03866734a06cf8430a73e028b5b6d4f9eb8a239", "shasum": "" }, "require": { @@ -8264,9 +8296,9 @@ "nikic/php-parser": "^4.13.2", "symfony/finder": "^5.4", "symfony/http-foundation": "^5.4", - "typo3/cms-core": "11.5.31", - "typo3/cms-extbase": "11.5.31", - "typo3/cms-fluid": "11.5.31" + "typo3/cms-core": "11.5.35", + "typo3/cms-extbase": "11.5.35", + "typo3/cms-fluid": "11.5.35" }, "conflict": { "typo3/cms": "*" @@ -8310,24 +8342,24 @@ "issues": "https://forge.typo3.org", "source": "https://github.com/typo3/typo3" }, - "time": "2023-09-12T06:50:21+00:00" + "time": "2024-02-13T09:50:23+00:00" }, { "name": "typo3/cms-recordlist", - "version": "v11.5.31", + "version": "v11.5.35", "source": { "type": "git", "url": "https://github.com/TYPO3-CMS/recordlist.git", - "reference": "04c26e11c5128991bac2d4b5f1b704935e6fb89f" + "reference": "7c6d935ac9a6b1051156354747a28cdb86a6ef1a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TYPO3-CMS/recordlist/zipball/04c26e11c5128991bac2d4b5f1b704935e6fb89f", - "reference": "04c26e11c5128991bac2d4b5f1b704935e6fb89f", + "url": "https://api.github.com/repos/TYPO3-CMS/recordlist/zipball/7c6d935ac9a6b1051156354747a28cdb86a6ef1a", + "reference": "7c6d935ac9a6b1051156354747a28cdb86a6ef1a", "shasum": "" }, "require": { - "typo3/cms-core": "11.5.31" + "typo3/cms-core": "11.5.35" }, "conflict": { "typo3/cms": "*" @@ -8370,7 +8402,7 @@ "issues": "https://forge.typo3.org", "source": "https://github.com/typo3/typo3" }, - "time": "2023-09-12T06:50:21+00:00" + "time": "2024-02-13T09:50:23+00:00" }, { "name": "typo3/testing-framework", diff --git a/composer.lock-t3v10 b/composer.lock-t3v10 new file mode 100644 index 000000000..cf873f4aa --- /dev/null +++ b/composer.lock-t3v10 @@ -0,0 +1,8165 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "ee4a20957590a7014921de9fb0633c8e", + "packages": [ + { + "name": "caseyamcl/phpoaipmh", + "version": "v3.3.1", + "source": { + "type": "git", + "url": "https://github.com/caseyamcl/phpoaipmh.git", + "reference": "17aaacafa62654b8360cfcef7db42fc6c0dc4f47" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/caseyamcl/phpoaipmh/zipball/17aaacafa62654b8360cfcef7db42fc6c0dc4f47", + "reference": "17aaacafa62654b8360cfcef7db42fc6c0dc4f47", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "php": ">=5.5.0" + }, + "require-dev": { + "guzzlehttp/guzzle": "^6.0|^7.0", + "jaschilz/php-coverage-badger": "^2.0", + "mockery/mockery": "^0.9", + "phpunit/phpunit": "^8.5", + "squizlabs/php_codesniffer": "^3.5", + "symfony/config": "^3.4|^4.3|^5.0", + "symfony/console": "^3.4|^4.3|^5.0", + "symfony/dependency-injection": "^3.4.26|^4.3|^5.0", + "symfony/yaml": "^3.4|^4.3|^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Phpoaipmh\\": [ + "src/", + "tests" + ], + "Phpoaipmh\\Example\\": "example/src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Casey McLaughlin", + "email": "caseyamcl@gmail.com", + "homepage": "http://caseymclaughlin.com", + "role": "Developer" + } + ], + "description": "A PHP OAI-PMH 2.0 Harvester library", + "homepage": "https://github.com/caseyamcl/phpoaipmh", + "keywords": [ + "Harvester", + "OAI", + "OAI-PMH" + ], + "support": { + "issues": "https://github.com/caseyamcl/phpoaipmh/issues", + "source": "https://github.com/caseyamcl/phpoaipmh/tree/v3.3.1" + }, + "time": "2023-01-27T17:40:27+00:00" + }, + { + "name": "doctrine/annotations", + "version": "1.14.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", + "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^1 || ^2", + "ext-tokenizer": "*", + "php": "^7.1 || ^8.0", + "psr/cache": "^1 || ^2 || ^3" + }, + "require-dev": { + "doctrine/cache": "^1.11 || ^2.0", + "doctrine/coding-standard": "^9 || ^10", + "phpstan/phpstan": "~1.4.10 || ^1.8.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "symfony/cache": "^4.4 || ^5.4 || ^6", + "vimeo/psalm": "^4.10" + }, + "suggest": { + "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Docblock Annotations Parser", + "homepage": "https://www.doctrine-project.org/projects/annotations.html", + "keywords": [ + "annotations", + "docblock", + "parser" + ], + "support": { + "issues": "https://github.com/doctrine/annotations/issues", + "source": "https://github.com/doctrine/annotations/tree/1.14.3" + }, + "time": "2023-02-01T09:20:38+00:00" + }, + { + "name": "doctrine/cache", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/cache.git", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb", + "shasum": "" + }, + "require": { + "php": "~7.1 || ^8.0" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/coding-standard": "^9", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psr/cache": "^1.0 || ^2.0 || ^3.0", + "symfony/cache": "^4.4 || ^5.4 || ^6", + "symfony/var-exporter": "^4.4 || ^5.4 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", + "homepage": "https://www.doctrine-project.org/projects/cache.html", + "keywords": [ + "abstraction", + "apcu", + "cache", + "caching", + "couchdb", + "memcached", + "php", + "redis", + "xcache" + ], + "support": { + "issues": "https://github.com/doctrine/cache/issues", + "source": "https://github.com/doctrine/cache/tree/2.2.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", + "type": "tidelift" + } + ], + "time": "2022-05-20T20:07:39+00:00" + }, + { + "name": "doctrine/dbal", + "version": "2.13.9", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal.git", + "reference": "c480849ca3ad6706a39c970cdfe6888fa8a058b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/c480849ca3ad6706a39c970cdfe6888fa8a058b8", + "reference": "c480849ca3ad6706a39c970cdfe6888fa8a058b8", + "shasum": "" + }, + "require": { + "doctrine/cache": "^1.0|^2.0", + "doctrine/deprecations": "^0.5.3|^1", + "doctrine/event-manager": "^1.0", + "ext-pdo": "*", + "php": "^7.1 || ^8" + }, + "require-dev": { + "doctrine/coding-standard": "9.0.0", + "jetbrains/phpstorm-stubs": "2021.1", + "phpstan/phpstan": "1.4.6", + "phpunit/phpunit": "^7.5.20|^8.5|9.5.16", + "psalm/plugin-phpunit": "0.16.1", + "squizlabs/php_codesniffer": "3.6.2", + "symfony/cache": "^4.4", + "symfony/console": "^2.0.5|^3.0|^4.0|^5.0", + "vimeo/psalm": "4.22.0" + }, + "suggest": { + "symfony/console": "For helpful console commands such as SQL execution and import of files." + }, + "bin": [ + "bin/doctrine-dbal" + ], + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\DBAL\\": "lib/Doctrine/DBAL" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", + "homepage": "https://www.doctrine-project.org/projects/dbal.html", + "keywords": [ + "abstraction", + "database", + "db2", + "dbal", + "mariadb", + "mssql", + "mysql", + "oci8", + "oracle", + "pdo", + "pgsql", + "postgresql", + "queryobject", + "sasql", + "sql", + "sqlanywhere", + "sqlite", + "sqlserver", + "sqlsrv" + ], + "support": { + "issues": "https://github.com/doctrine/dbal/issues", + "source": "https://github.com/doctrine/dbal/tree/2.13.9" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal", + "type": "tidelift" + } + ], + "time": "2022-05-02T20:28:55+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.3" + }, + "time": "2024-01-30T19:34:25+00:00" + }, + { + "name": "doctrine/event-manager", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/event-manager.git", + "reference": "95aa4cb529f1e96576f3fda9f5705ada4056a520" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/95aa4cb529f1e96576f3fda9f5705ada4056a520", + "reference": "95aa4cb529f1e96576f3fda9f5705ada4056a520", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^0.5.3 || ^1", + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/common": "<2.9" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^10", + "phpstan/phpstan": "~1.4.10 || ^1.8.8", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.24" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", + "homepage": "https://www.doctrine-project.org/projects/event-manager.html", + "keywords": [ + "event", + "event dispatcher", + "event manager", + "event system", + "events" + ], + "support": { + "issues": "https://github.com/doctrine/event-manager/issues", + "source": "https://github.com/doctrine/event-manager/tree/1.2.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager", + "type": "tidelift" + } + ], + "time": "2022-10-12T20:51:15+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "1.5.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b", + "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^11", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^0.16 || ^1", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-phpunit": "^1", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.30 || ^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/1.5.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2022-12-30T00:15:36+00:00" + }, + { + "name": "doctrine/lexer", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/c268e882d4dbdd85e36e4ad69e02dc284f89d229", + "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9.0", + "phpstan/phpstan": "^1.3", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/1.2.3" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2022-02-28T11:07:21+00:00" + }, + { + "name": "egulias/email-validator", + "version": "2.1.25", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/0dbf5d78455d4d6a41d186da50adc1122ec066f4", + "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^1.0.1", + "php": ">=5.5", + "symfony/polyfill-intl-idn": "^1.10" + }, + "require-dev": { + "dominicsayers/isemail": "^3.0.7", + "phpunit/phpunit": "^4.8.36|^7.5.15", + "satooshi/php-coveralls": "^1.0.1" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/2.1.25" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2020-12-29T14:50:06+00:00" + }, + { + "name": "enshrined/svg-sanitize", + "version": "0.15.4", + "source": { + "type": "git", + "url": "https://github.com/darylldoyle/svg-sanitizer.git", + "reference": "e50b83a2f1f296ca61394fe88fbfe3e896a84cf4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/darylldoyle/svg-sanitizer/zipball/e50b83a2f1f296ca61394fe88fbfe3e896a84cf4", + "reference": "e50b83a2f1f296ca61394fe88fbfe3e896a84cf4", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^7.0 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.5 || ^8.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "enshrined\\svgSanitize\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Daryll Doyle", + "email": "daryll@enshrined.co.uk" + } + ], + "description": "An SVG sanitizer for PHP", + "support": { + "issues": "https://github.com/darylldoyle/svg-sanitizer/issues", + "source": "https://github.com/darylldoyle/svg-sanitizer/tree/0.15.4" + }, + "time": "2022-02-21T09:13:59+00:00" + }, + { + "name": "flow/jsonpath", + "version": "0.5.0", + "source": { + "type": "git", + "url": "https://github.com/FlowCommunications/JSONPath.git", + "reference": "b9738858c75d008c1211612b973e9510f8b7f8ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FlowCommunications/JSONPath/zipball/b9738858c75d008c1211612b973e9510f8b7f8ea", + "reference": "b9738858c75d008c1211612b973e9510f8b7f8ea", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "peekmo/jsonpath": "dev-master", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "Flow\\JSONPath": "src/", + "Flow\\JSONPath\\Test": "tests/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Stephen Frank", + "email": "stephen@flowsa.com" + } + ], + "description": "JSONPath implementation for parsing, searching and flattening arrays", + "support": { + "issues": "https://github.com/FlowCommunications/JSONPath/issues", + "source": "https://github.com/FlowCommunications/JSONPath/tree/0.5.0" + }, + "abandoned": "softcreatr/jsonpath", + "time": "2019-07-15T17:23:22+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "6.5.8", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "a52f0440530b54fa079ce76e8c5d196a42cad981" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/a52f0440530b54fa079ce76e8c5d196a42cad981", + "reference": "a52f0440530b54fa079ce76e8c5d196a42cad981", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.0", + "guzzlehttp/psr7": "^1.9", + "php": ">=5.5", + "symfony/polyfill-intl-idn": "^1.17" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", + "psr/log": "^1.1" + }, + "suggest": { + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.5-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/6.5.8" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2022-06-20T22:16:07+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "1.5.3", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/67ab6e18aaa14d753cc148911d273f6e6cb6721e", + "reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "symfony/phpunit-bridge": "^4.4 || ^5.1" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/1.5.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2023-05-21T12:31:43+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "1.9.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "e4490cabc77465aaee90b20cfc9a770f8c04be6b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/e4490cabc77465aaee90b20cfc9a770f8c04be6b", + "reference": "e4490cabc77465aaee90b20cfc9a770f8c04be6b", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "psr/http-message": "~1.0", + "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "ext-zlib": "*", + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/1.9.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2023-04-17T16:00:37+00:00" + }, + { + "name": "lolli42/finediff", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/lolli42/FineDiff.git", + "reference": "8d535de757062fed8412833f5eede7064595ca5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/lolli42/FineDiff/zipball/8d535de757062fed8412833f5eede7064595ca5b", + "reference": "8d535de757062fed8412833f5eede7064595ca5b", + "shasum": "" + }, + "require": { + "php": ">=7.2.0", + "symfony/polyfill-mbstring": "^1.23" + }, + "replace": { + "cogpowered/finediff": "*" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.4", + "phpstan/phpstan": "^1.9.14", + "phpunit/phpunit": "^8.5.33 || ^9.6.11 || ^10.3.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "cogpowered\\FineDiff\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Raymond Hill" + }, + { + "name": "Rob Crowe", + "email": "rob@cogpowered.com" + }, + { + "name": "Christian Kuhn", + "email": "lolli@schwarzbu.ch", + "role": "maintainer" + } + ], + "description": "PHP implementation of a Fine granularity Diff engine", + "homepage": "https://github.com/lolli42/FineDiff", + "keywords": [ + "diff", + "finediff", + "opcode", + "string", + "text" + ], + "support": { + "issues": "https://github.com/lolli42/FineDiff/issues", + "source": "https://github.com/lolli42/FineDiff/tree/1.0.3" + }, + "time": "2024-02-06T13:56:20+00:00" + }, + { + "name": "masterminds/html5", + "version": "2.8.1", + "source": { + "type": "git", + "url": "https://github.com/Masterminds/html5-php.git", + "reference": "f47dcf3c70c584de14f21143c55d9939631bc6cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f47dcf3c70c584de14f21143c55d9939631bc6cf", + "reference": "f47dcf3c70c584de14f21143c55d9939631bc6cf", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Masterminds\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matt Butcher", + "email": "technosophos@gmail.com" + }, + { + "name": "Matt Farina", + "email": "matt@mattfarina.com" + }, + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" + } + ], + "description": "An HTML5 parser and serializer.", + "homepage": "http://masterminds.github.io/html5-php", + "keywords": [ + "HTML5", + "dom", + "html", + "parser", + "querypath", + "serializer", + "xml" + ], + "support": { + "issues": "https://github.com/Masterminds/html5-php/issues", + "source": "https://github.com/Masterminds/html5-php/tree/2.8.1" + }, + "time": "2023-05-10T11:58:31+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.18.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999", + "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.0" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.18.0" + }, + "time": "2023-12-10T21:03:43+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.3.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.3", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.2", + "psalm/phar": "^4.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "account@ijaap.nl" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" + }, + "time": "2021-10-19T17:43:47+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.8.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "fad452781b3d774e3337b0c0b245dd8e5a4455fc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/fad452781b3d774e3337b0c0b245dd8e5a4455fc", + "reference": "fad452781b3d774e3337b0c0b245dd8e5a4455fc", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.0", + "php": "^7.4 || ^8.0", + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^1.13" + }, + "require-dev": { + "ext-tokenizer": "*", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.13.9", + "vimeo/psalm": "^4.25" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.8.0" + }, + "time": "2024-01-11T11:49:22+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "1.25.0", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "bd84b629c8de41aa2ae82c067c955e06f1b00240" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/bd84b629c8de41aa2ae82c067c955e06f1b00240", + "reference": "bd84b629c8de41aa2ae82c067c955e06f1b00240", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^4.15", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.5", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.5", + "symfony/process": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "support": { + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.25.0" + }, + "time": "2024-01-04T17:06:16+00:00" + }, + { + "name": "psr/cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/master" + }, + "time": "2016-08-06T20:24:11+00:00" + }, + { + "name": "psr/container", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.2" + }, + "time": "2021-11-05T16:50:12+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "e616d01114759c4c489f93b099585439f795fe35" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", + "reference": "e616d01114759c4c489f93b099585439f795fe35", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory/tree/1.0.2" + }, + "time": "2023-04-10T20:10:41+00:00" + }, + { + "name": "psr/http-message", + "version": "1.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba", + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/1.1" + }, + "time": "2023-04-04T09:50:52+00:00" + }, + { + "name": "psr/http-server-handler", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-server-handler.git", + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/84c4fb66179be4caaf8e97bd239203245302e7d4", + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4", + "shasum": "" + }, + "require": { + "php": ">=7.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP server-side request handler", + "keywords": [ + "handler", + "http", + "http-interop", + "psr", + "psr-15", + "psr-7", + "request", + "response", + "server" + ], + "support": { + "source": "https://github.com/php-fig/http-server-handler/tree/1.0.2" + }, + "time": "2023-04-10T20:06:20+00:00" + }, + { + "name": "psr/http-server-middleware", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-server-middleware.git", + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/c1481f747daaa6a0782775cd6a8c26a1bf4a3829", + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829", + "shasum": "" + }, + "require": { + "php": ">=7.0", + "psr/http-message": "^1.0 || ^2.0", + "psr/http-server-handler": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP server-side middleware", + "keywords": [ + "http", + "http-interop", + "middleware", + "psr", + "psr-15", + "psr-7", + "request", + "response" + ], + "support": { + "issues": "https://github.com/php-fig/http-server-middleware/issues", + "source": "https://github.com/php-fig/http-server-middleware/tree/1.0.2" + }, + "time": "2023-04-11T06:14:47+00:00" + }, + { + "name": "psr/log", + "version": "1.1.4", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.4" + }, + "time": "2021-05-03T11:20:27+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "solarium/solarium", + "version": "5.2.0", + "source": { + "type": "git", + "url": "https://github.com/solariumphp/solarium.git", + "reference": "9208b615cb2ed6f306be6e696431b6b71e4d42db" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/solariumphp/solarium/zipball/9208b615cb2ed6f306be6e696431b6b71e4d42db", + "reference": "9208b615cb2ed6f306be6e696431b6b71e4d42db", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.1.3", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "symfony/event-dispatcher": "^4.3 || ^5.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.16", + "guzzlehttp/guzzle": "^3.8 || ^6.2", + "nyholm/psr7": "^1.2", + "php-coveralls/php-coveralls": "^2.1", + "php-http/guzzle6-adapter": "^2.0", + "phpunit/phpunit": "^8.0", + "squizlabs/php_codesniffer": "^3.4", + "symfony/phpunit-bridge": "^5.0", + "zendframework/zend-http": "^2.8" + }, + "suggest": { + "minimalcode/search": "Query builder compatible with Solarium, allows simplified solr-query handling" + }, + "type": "library", + "autoload": { + "psr-4": { + "Solarium\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "See GitHub contributors", + "homepage": "https://github.com/basdenooijer/solarium/contributors" + } + ], + "description": "PHP Solr client", + "homepage": "http://www.solarium-project.org", + "keywords": [ + "php", + "search", + "solr" + ], + "support": { + "issues": "https://github.com/solariumphp/solarium/issues", + "source": "https://github.com/solariumphp/solarium/tree/5.x" + }, + "time": "2020-04-03T22:16:30+00:00" + }, + { + "name": "symfony/cache", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache.git", + "reference": "db1adb004e2da984085d0178964eb6f319d3cba1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache/zipball/db1adb004e2da984085d0178964eb6f319d3cba1", + "reference": "db1adb004e2da984085d0178964eb6f319d3cba1", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/cache": "^1.0|^2.0", + "psr/log": "^1.1|^2|^3", + "symfony/cache-contracts": "^1.1.7|^2", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/var-exporter": "^4.4|^5.0|^6.0" + }, + "conflict": { + "doctrine/dbal": "<2.13.1", + "symfony/dependency-injection": "<4.4", + "symfony/http-kernel": "<4.4", + "symfony/var-dumper": "<4.4" + }, + "provide": { + "psr/cache-implementation": "1.0|2.0", + "psr/simple-cache-implementation": "1.0|2.0", + "symfony/cache-implementation": "1.0|2.0" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/cache": "^1.6|^2.0", + "doctrine/dbal": "^2.13.1|^3|^4", + "predis/predis": "^1.1", + "psr/simple-cache": "^1.0|^2.0", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/filesystem": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/messenger": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Cache\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides extended PSR-6, PSR-16 (and tags) implementations", + "homepage": "https://symfony.com", + "keywords": [ + "caching", + "psr6" + ], + "support": { + "source": "https://github.com/symfony/cache/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T13:51:25+00:00" + }, + { + "name": "symfony/cache-contracts", + "version": "v2.5.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache-contracts.git", + "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/64be4a7acb83b6f2bf6de9a02cee6dad41277ebc", + "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/cache": "^1.0|^2.0|^3.0" + }, + "suggest": { + "symfony/cache-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Cache\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to caching", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/cache-contracts/tree/v2.5.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-01-02T09:53:40+00:00" + }, + { + "name": "symfony/config", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "6b763438a22a4f20885e994ad6702f6a3f25430e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/6b763438a22a4f20885e994ad6702f6a3f25430e", + "reference": "6b763438a22a4f20885e994ad6702f6a3f25430e", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/filesystem": "^4.4|^5.0|^6.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php80": "^1.16", + "symfony/polyfill-php81": "^1.22" + }, + "conflict": { + "symfony/finder": "<4.4" + }, + "require-dev": { + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", + "symfony/messenger": "^4.4|^5.0|^6.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/yaml": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/yaml": "To use the yaml reference dumper" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Config\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/config/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T13:51:25+00:00" + }, + { + "name": "symfony/console", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "dbdf6adcb88d5f83790e1efb57ef4074309d3931" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/dbdf6adcb88d5f83790e1efb57ef4074309d3931", + "reference": "dbdf6adcb88d5f83790e1efb57ef4074309d3931", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.1|^6.0" + }, + "conflict": { + "psr/log": ">=3", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/log": "^1|^2", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T14:28:09+00:00" + }, + { + "name": "symfony/dependency-injection", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "45474d527212ca67cdb93f6c5e6da68f4bc67118" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/45474d527212ca67cdb93f6c5e6da68f4bc67118", + "reference": "45474d527212ca67cdb93f6c5e6da68f4bc67118", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1.1", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16", + "symfony/polyfill-php81": "^1.22", + "symfony/service-contracts": "^1.1.6|^2" + }, + "conflict": { + "ext-psr": "<1.1|>=2", + "symfony/config": "<5.3", + "symfony/finder": "<4.4", + "symfony/proxy-manager-bridge": "<4.4", + "symfony/yaml": "<4.4.26" + }, + "provide": { + "psr/container-implementation": "1.0", + "symfony/service-implementation": "1.0|2.0" + }, + "require-dev": { + "symfony/config": "^5.3|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/yaml": "^4.4.26|^5.0|^6.0" + }, + "suggest": { + "symfony/config": "", + "symfony/expression-language": "For using expressions in service container configuration", + "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", + "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", + "symfony/yaml": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\DependencyInjection\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows you to standardize and centralize the way objects are constructed in your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/dependency-injection/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:37:36+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v2.5.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-01-02T09:53:40+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "7a69a85c7ea5bdd1e875806a99c51a87d3a74b38" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/7a69a85c7ea5bdd1e875806a99c51a87d3a74b38", + "reference": "7a69a85c7ea5bdd1e875806a99c51a87d3a74b38", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/event-dispatcher-contracts": "^2|^3", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/dependency-injection": "<4.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^4.4|^5.0|^6.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/stopwatch": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T13:51:25+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v2.5.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/f98b54df6ad059855739db6fcbc2d36995283fe1", + "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/event-dispatcher": "^1" + }, + "suggest": { + "symfony/event-dispatcher-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-01-02T09:53:40+00:00" + }, + { + "name": "symfony/expression-language", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/expression-language.git", + "reference": "d59441c10a5a73cd9d4d778b8253595a16f6716d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/expression-language/zipball/d59441c10a5a73cd9d4d778b8253595a16f6716d", + "reference": "d59441c10a5a73cd9d4d778b8253595a16f6716d", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/cache": "^4.4|^5.0|^6.0", + "symfony/service-contracts": "^1.1|^2|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ExpressionLanguage\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an engine that can compile and evaluate expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/expression-language/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T13:51:25+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "5a553607d4ffbfa9c0ab62facadea296c9db7086" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/5a553607d4ffbfa9c0ab62facadea296c9db7086", + "reference": "5a553607d4ffbfa9c0ab62facadea296c9db7086", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T13:51:25+00:00" + }, + { + "name": "symfony/finder", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "abe6d6f77d9465fed3cd2d029b29d03b56b56435" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/abe6d6f77d9465fed3cd2d029b29d03b56b56435", + "reference": "abe6d6f77d9465fed3cd2d029b29d03b56b56435", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T13:51:25+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "f2ab692a22aef1cd54beb893aa0068bdfb093928" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f2ab692a22aef1cd54beb893aa0068bdfb093928", + "reference": "f2ab692a22aef1cd54beb893aa0068bdfb093928", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "predis/predis": "~1.0", + "symfony/cache": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", + "symfony/mime": "^4.4|^5.0|^6.0", + "symfony/rate-limiter": "^5.2|^6.0" + }, + "suggest": { + "symfony/mime": "To use the file extension guesser" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T13:51:25+00:00" + }, + { + "name": "symfony/mailer", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "664724b0fb4646dee30859d0ed9131a2d7633320" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/664724b0fb4646dee30859d0ed9131a2d7633320", + "reference": "664724b0fb4646dee30859d0ed9131a2d7633320", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10|^3|^4", + "php": ">=7.2.5", + "psr/event-dispatcher": "^1", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/mime": "^5.2.6|^6.0", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2|^3" + }, + "conflict": { + "symfony/http-kernel": "<4.4" + }, + "require-dev": { + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/messenger": "^4.4|^5.0|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps sending emails", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailer/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T07:33:37+00:00" + }, + { + "name": "symfony/mime", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "ee94d9b538f93abbbc1ee4ccff374593117b04a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/ee94d9b538f93abbbc1ee4ccff374593117b04a9", + "reference": "ee94d9b538f93abbbc1ee4ccff374593117b04a9", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<4.4", + "symfony/serializer": "<5.4.35|>=6,<6.3.12|>=6.4,<6.4.3" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1|^4", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/property-access": "^4.4|^5.1|^6.0", + "symfony/property-info": "^4.4|^5.1|^6.0", + "symfony/serializer": "^5.4.35|~6.3.12|^6.4.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-30T08:00:51+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-intl-icu", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-icu.git", + "reference": "07094a28851a49107f3ab4f9120ca2975a64b6e1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/07094a28851a49107f3ab4f9120ca2975a64b6e1", + "reference": "07094a28851a49107f3ab4f9120ca2975a64b6e1", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance and support of other locales than \"en\"" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Icu\\": "" + }, + "classmap": [ + "Resources/stubs" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's ICU-related data and classes", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "icu", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:12:16+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "a287ed7475f85bf6f61890146edbc932c0fff919" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a287ed7475f85bf6f61890146edbc932c0fff919", + "reference": "a287ed7475f85bf6f61890146edbc932c0fff919", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/861391a8da9a04cbad2d232ddd9e4893220d6e25", + "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "21bd091060673a1177ae842c0ef8fe30893114d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/21bd091060673a1177ae842c0ef8fe30893114d2", + "reference": "21bd091060673a1177ae842c0ef8fe30893114d2", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-php81", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/c565ad1e63f30e7477fc40738343c62b40bc672d", + "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/property-access", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-access.git", + "reference": "f1341758d8046cfff0ac748a0cad238f917191d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-access/zipball/f1341758d8046cfff0ac748a0cad238f917191d4", + "reference": "f1341758d8046cfff0ac748a0cad238f917191d4", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16", + "symfony/property-info": "^5.2|^6.0" + }, + "require-dev": { + "symfony/cache": "^4.4|^5.0|^6.0" + }, + "suggest": { + "psr/cache-implementation": "To cache access methods." + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyAccess\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides functions to read and write from/to an object or array using a simple string notation", + "homepage": "https://symfony.com", + "keywords": [ + "access", + "array", + "extraction", + "index", + "injection", + "object", + "property", + "property-path", + "reflection" + ], + "support": { + "source": "https://github.com/symfony/property-access/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T13:51:25+00:00" + }, + { + "name": "symfony/property-info", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-info.git", + "reference": "d30d48f366ad2bfbf521256be85eb1c182c29198" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-info/zipball/d30d48f366ad2bfbf521256be85eb1c182c29198", + "reference": "d30d48f366ad2bfbf521256be85eb1c182c29198", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16", + "symfony/string": "^5.1|^6.0" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/dependency-injection": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "^1.10.4|^2", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "phpstan/phpdoc-parser": "^1.0", + "symfony/cache": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/serializer": "^4.4|^5.0|^6.0" + }, + "suggest": { + "phpdocumentor/reflection-docblock": "To use the PHPDoc", + "psr/cache-implementation": "To cache results", + "symfony/doctrine-bridge": "To use Doctrine metadata", + "symfony/serializer": "To use Serializer metadata" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyInfo\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kévin Dunglas", + "email": "dunglas@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Extracts information about PHP class' properties using metadata of popular sources", + "homepage": "https://symfony.com", + "keywords": [ + "doctrine", + "phpdoc", + "property", + "symfony", + "type", + "validator" + ], + "support": { + "source": "https://github.com/symfony/property-info/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T15:43:50+00:00" + }, + { + "name": "symfony/routing", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "86c5a06a61ddaf17efa1403542e3d7146af96203" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/86c5a06a61ddaf17efa1403542e3d7146af96203", + "reference": "86c5a06a61ddaf17efa1403542e3d7146af96203", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "doctrine/annotations": "<1.12", + "symfony/config": "<5.3", + "symfony/dependency-injection": "<4.4", + "symfony/yaml": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "^1.12|^2", + "psr/log": "^1|^2|^3", + "symfony/config": "^5.3|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^4.4|^5.0|^6.0", + "symfony/yaml": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/config": "For using the all-in-one router or any loader", + "symfony/expression-language": "For using expression matching", + "symfony/http-foundation": "For using a Symfony Request object", + "symfony/yaml": "For using the YAML loader" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-30T13:10:15+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v2.5.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1", + "symfony/deprecation-contracts": "^2.1|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-30T19:17:29+00:00" + }, + { + "name": "symfony/string", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "c209c4d0559acce1c9a2067612cfb5d35756edc2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/c209c4d0559acce1c9a2067612cfb5d35756edc2", + "reference": "c209c4d0559acce1c9a2067612cfb5d35756edc2", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "conflict": { + "symfony/translation-contracts": ">=3.0" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T13:51:25+00:00" + }, + { + "name": "symfony/var-exporter", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-exporter.git", + "reference": "abb0a151b62d6b07e816487e20040464af96cae7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/abb0a151b62d6b07e816487e20040464af96cae7", + "reference": "abb0a151b62d6b07e816487e20040464af96cae7", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "symfony/var-dumper": "^4.4.9|^5.0.9|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\VarExporter\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows exporting any serializable PHP data structure to plain PHP code", + "homepage": "https://symfony.com", + "keywords": [ + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "serialize" + ], + "support": { + "source": "https://github.com/symfony/var-exporter/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T13:51:25+00:00" + }, + { + "name": "symfony/yaml", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "e78db7f5c70a21f0417a31f414c4a95fe76c07e4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/e78db7f5c70a21f0417a31f414c4a95fe76c07e4", + "reference": "e78db7f5c70a21f0417a31f414c4a95fe76c07e4", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<5.3" + }, + "require-dev": { + "symfony/console": "^5.3|^6.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T13:51:25+00:00" + }, + { + "name": "typo3/class-alias-loader", + "version": "v1.1.4", + "source": { + "type": "git", + "url": "https://github.com/TYPO3/class-alias-loader.git", + "reference": "f6fc1f5fb04c42195e8e663b43aced4919ef318f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3/class-alias-loader/zipball/f6fc1f5fb04c42195e8e663b43aced4919ef318f", + "reference": "f6fc1f5fb04c42195e8e663b43aced4919ef318f", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "php": ">=5.3.7" + }, + "replace": { + "helhum/class-alias-loader": "*" + }, + "require-dev": { + "composer/composer": "^1.1@dev || ^2.0@dev", + "mikey179/vfsstream": "~1.4.0@dev", + "phpunit/phpunit": ">4.8 <9" + }, + "type": "composer-plugin", + "extra": { + "class": "TYPO3\\ClassAliasLoader\\Plugin", + "branch-alias": { + "dev-main": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\ClassAliasLoader\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Helmut Hummel", + "email": "info@helhum.io" + } + ], + "description": "Amends the composer class loader to support class aliases to provide backwards compatibility for packages", + "homepage": "http://github.com/TYPO3/class-alias-loader", + "keywords": [ + "alias", + "autoloader", + "classloader", + "composer" + ], + "support": { + "issues": "https://github.com/TYPO3/class-alias-loader/issues", + "source": "https://github.com/TYPO3/class-alias-loader/tree/v1.1.4" + }, + "time": "2022-08-07T14:48:42+00:00" + }, + { + "name": "typo3/cms-cli", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/TYPO3/cms-cli.git", + "reference": "215a0bf5c446b4e0b20f4562bbaf3d6215a5ee82" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3/cms-cli/zipball/215a0bf5c446b4e0b20f4562bbaf3d6215a5ee82", + "reference": "215a0bf5c446b4e0b20f4562bbaf3d6215a5ee82", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "bin": [ + "typo3" + ], + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "description": "TYPO3 command line binary", + "homepage": "https://typo3.org", + "support": { + "issues": "https://github.com/TYPO3/cms-cli/issues", + "source": "https://github.com/TYPO3/cms-cli/tree/master" + }, + "time": "2018-03-08T20:16:43+00:00" + }, + { + "name": "typo3/cms-composer-installers", + "version": "v3.1.3", + "source": { + "type": "git", + "url": "https://github.com/TYPO3/CmsComposerInstallers.git", + "reference": "613d82075650ba846d287e20941e8a0e04ad0444" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3/CmsComposerInstallers/zipball/613d82075650ba846d287e20941e8a0e04ad0444", + "reference": "613d82075650ba846d287e20941e8a0e04ad0444", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0.0 || ^2.0.0", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "composer/installers": "<2.0.0" + }, + "replace": { + "lw/typo3cms-installers": "*", + "netresearch/composer-installers": "*" + }, + "require-dev": { + "composer/composer": "1.2.*@dev || 2.0.*@dev", + "friendsofphp/php-cs-fixer": "^2.18", + "overtrue/phplint": "^2.0", + "phpunit/phpunit": "^8.5" + }, + "type": "composer-plugin", + "extra": { + "class": "TYPO3\\CMS\\Composer\\Installer\\Plugin", + "branch-alias": { + "dev-main": "3.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Composer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 CMS Core Team", + "homepage": "https://forge.typo3.org/projects/typo3cms-core", + "role": "Developer" + }, + { + "name": "The TYPO3 Community", + "homepage": "https://typo3.org/community/", + "role": "Contributor" + } + ], + "description": "TYPO3 CMS Installers", + "homepage": "https://github.com/TYPO3/CmsComposerInstallers", + "keywords": [ + "cms", + "core", + "extension", + "installer", + "typo3" + ], + "support": { + "general": "https://typo3.org/support/", + "issues": "https://github.com/TYPO3/CmsComposerInstallers/issues", + "source": "https://github.com/TYPO3/CmsComposerInstallers/tree/v3.1.3" + }, + "time": "2022-08-05T19:06:26+00:00" + }, + { + "name": "typo3/cms-core", + "version": "v10.4.37", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/core.git", + "reference": "34e4a9807eb365e202773c82dff82038da8966d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/core/zipball/34e4a9807eb365e202773c82dff82038da8966d3", + "reference": "34e4a9807eb365e202773c82dff82038da8966d3", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.7", + "doctrine/dbal": "~2.10.0 || ~2.11.2 || ~2.13.1", + "doctrine/instantiator": "^1.1", + "doctrine/lexer": "^1.0", + "egulias/email-validator": "^2.1", + "enshrined/svg-sanitize": "^0.15.4", + "ext-json": "*", + "ext-libxml": "*", + "ext-pcre": "*", + "ext-pdo": "*", + "ext-session": "*", + "ext-xml": "*", + "guzzlehttp/guzzle": "^6.5.8", + "guzzlehttp/psr7": "^1.8.5", + "lolli42/finediff": "^1.0.1", + "masterminds/html5": "^2.7.6", + "nikic/php-parser": "^4.10.4", + "php": "^7.2", + "psr/container": "^1.0", + "psr/event-dispatcher": "^1.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "psr/log": "^1.0", + "symfony/config": "^4.4 || ^5.0", + "symfony/console": "^4.4 || ^5.0", + "symfony/dependency-injection": "^4.4 || ^5.0", + "symfony/event-dispatcher-contracts": "^1.1 || ^2.0", + "symfony/expression-language": "^4.4 || ^5.0", + "symfony/filesystem": "^4.4 || ^5.0", + "symfony/finder": "^4.4 || ^5.0", + "symfony/http-foundation": "^4.4 || ^5.0", + "symfony/mailer": "^4.4 || ^5.0", + "symfony/mime": "^4.4.16 || ^5.1.8", + "symfony/polyfill-intl-icu": "^1.6", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-intl-normalizer": "^1.22", + "symfony/polyfill-mbstring": "^1.16", + "symfony/polyfill-php73": "^1.16", + "symfony/polyfill-php80": "^1.16", + "symfony/polyfill-php81": "^1.23", + "symfony/routing": "^4.4 || ^5.0", + "symfony/yaml": "^4.4 || ^5.0", + "typo3/class-alias-loader": "^1.0", + "typo3/cms-cli": "^2.0", + "typo3/cms-composer-installers": "^2.0 || ^3.0", + "typo3/html-sanitizer": "^2.1.1", + "typo3/phar-stream-wrapper": "^3.1.7", + "typo3/symfony-psr-event-dispatcher-adapter": "^1.0 || ^2.0", + "typo3fluid/fluid": "^2.6.10" + }, + "conflict": { + "guzzlehttp/guzzle": "6.5.0", + "hoa/core": "*", + "typo3/cms": "*" + }, + "provide": { + "psr/http-client-implementation": "1.0", + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "replace": { + "typo3/cms-lang": "*", + "typo3/cms-saltedpasswords": "*", + "typo3/cms-sv": "*" + }, + "require-dev": { + "codeception/codeception": "^4.0", + "codeception/module-asserts": "^1.1", + "codeception/module-filesystem": "^1.0", + "codeception/module-webdriver": "^1.0.1", + "friendsofphp/php-cs-fixer": "^2.19 || ^3.0", + "mikey179/vfsstream": "^1.6.11", + "phpspec/prophecy": "^1.14.0", + "phpstan/phpstan": "^0.12.64", + "typo3/cms-styleguide": "~10.0.4", + "typo3/testing-framework": "^6.16.7" + }, + "suggest": { + "ext-fileinfo": "Used for proper file type detection in the file abstraction layer", + "ext-gd": "GDlib/Freetype is required for building images with text (GIFBUILDER) and can also be used to scale images", + "ext-intl": "TYPO3 with unicode-based filesystems", + "ext-mysqli": "", + "ext-openssl": "OpenSSL is required for sending SMTP mails over an encrypted channel endpoint, and for extensions such as \"rsaauth\"", + "ext-zip": "", + "ext-zlib": "TYPO3 uses zlib for amongst others output compression and un/packing t3x extension files" + }, + "type": "typo3-cms-framework", + "extra": { + "branch-alias": { + "dev-master": "10.4.x-dev" + }, + "typo3/cms": { + "Package": { + "serviceProvider": "TYPO3\\CMS\\Core\\ServiceProvider", + "protected": true, + "partOfFactoryDefault": true, + "partOfMinimalUsableSystem": true + }, + "extension-key": "core" + }, + "typo3/class-alias-loader": { + "class-alias-maps": [ + "Migrations/Code/ClassAliasMap.php" + ] + } + }, + "autoload": { + "files": [ + "Resources/PHP/GlobalDebugFunctions.php" + ], + "psr-4": { + "TYPO3\\CMS\\Core\\": "Classes/" + }, + "classmap": [ + "Resources/PHP/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "The core library of TYPO3.", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2023-04-11T13:10:15+00:00" + }, + { + "name": "typo3/cms-extbase", + "version": "v10.4.37", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/extbase.git", + "reference": "9b9c88efe129b9ca04e63876a1e123d892072404" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/extbase/zipball/9b9c88efe129b9ca04e63876a1e123d892072404", + "reference": "9b9c88efe129b9ca04e63876a1e123d892072404", + "shasum": "" + }, + "require": { + "phpdocumentor/reflection-docblock": "^5.2", + "phpdocumentor/type-resolver": "^1.3", + "symfony/dependency-injection": "^4.4 || ^5.0", + "symfony/property-access": "^4.4 || ^5.0", + "symfony/property-info": "^4.4 || ^5.0", + "typo3/cms-core": "10.4.37" + }, + "conflict": { + "typo3/cms": "*" + }, + "suggest": { + "typo3/cms-scheduler": "Additional scheduler tasks" + }, + "type": "typo3-cms-framework", + "extra": { + "branch-alias": { + "dev-master": "10.4.x-dev" + }, + "typo3/cms": { + "Package": { + "serviceProvider": "TYPO3\\CMS\\Extbase\\ServiceProvider", + "protected": true, + "partOfFactoryDefault": true, + "partOfMinimalUsableSystem": true + }, + "extension-key": "extbase" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Extbase\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "A framework to build extensions for TYPO3 CMS.", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2023-04-11T13:10:15+00:00" + }, + { + "name": "typo3/cms-tstemplate", + "version": "v10.4.37", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/tstemplate.git", + "reference": "cf923ac575c85529bc82131ea66feaa187853ae9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/tstemplate/zipball/cf923ac575c85529bc82131ea66feaa187853ae9", + "reference": "cf923ac575c85529bc82131ea66feaa187853ae9", + "shasum": "" + }, + "require": { + "typo3/cms-core": "10.4.37" + }, + "conflict": { + "typo3/cms": "*" + }, + "type": "typo3-cms-framework", + "extra": { + "branch-alias": { + "dev-master": "10.4.x-dev" + }, + "typo3/cms": { + "Package": { + "partOfFactoryDefault": true + }, + "extension-key": "tstemplate" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Tstemplate\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "Framework for management of TypoScript template records for the CMS frontend.", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2023-04-11T13:10:15+00:00" + }, + { + "name": "typo3/html-sanitizer", + "version": "v2.1.4", + "source": { + "type": "git", + "url": "https://github.com/TYPO3/html-sanitizer.git", + "reference": "b8f90717251d968c49dc77f8c1e5912e2fbe0dff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3/html-sanitizer/zipball/b8f90717251d968c49dc77f8c1e5912e2fbe0dff", + "reference": "b8f90717251d968c49dc77f8c1e5912e2fbe0dff", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "masterminds/html5": "^2.7.6", + "php": "^7.2 || ^8.0", + "psr/log": "^1.0 || ^2.0 || ^3.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\HtmlSanitizer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Oliver Hader", + "email": "oliver@typo3.org" + } + ], + "description": "HTML sanitizer aiming to provide XSS-safe markup based on explicitly allowed tags, attributes and values.", + "support": { + "issues": "https://github.com/TYPO3/html-sanitizer/issues", + "source": "https://github.com/TYPO3/html-sanitizer/tree/v2.1.4" + }, + "time": "2023-11-14T07:41:08+00:00" + }, + { + "name": "typo3/phar-stream-wrapper", + "version": "v3.1.7", + "source": { + "type": "git", + "url": "https://github.com/TYPO3/phar-stream-wrapper.git", + "reference": "5cc2f04a4e2f5c7e9cc02a3bdf80fae0f3e11a8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3/phar-stream-wrapper/zipball/5cc2f04a4e2f5c7e9cc02a3bdf80fae0f3e11a8c", + "reference": "5cc2f04a4e2f5c7e9cc02a3bdf80fae0f3e11a8c", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.0 || ^8.0" + }, + "require-dev": { + "ext-xdebug": "*", + "phpspec/prophecy": "^1.10", + "symfony/phpunit-bridge": "^5.1" + }, + "suggest": { + "ext-fileinfo": "For PHP builtin file type guessing, otherwise uses internal processing" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "v3.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\PharStreamWrapper\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Interceptors for PHP's native phar:// stream handling", + "homepage": "https://typo3.org/", + "keywords": [ + "phar", + "php", + "security", + "stream-wrapper" + ], + "support": { + "issues": "https://github.com/TYPO3/phar-stream-wrapper/issues", + "source": "https://github.com/TYPO3/phar-stream-wrapper/tree/v3.1.7" + }, + "time": "2021-09-20T19:19:13+00:00" + }, + { + "name": "typo3/symfony-psr-event-dispatcher-adapter", + "version": "v2.1.0", + "source": { + "type": "git", + "url": "https://github.com/TYPO3/symfony-psr-event-dispatcher-adapter.git", + "reference": "c93fd7cc9f215cfbbc6ce89089eadabedf65a21f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3/symfony-psr-event-dispatcher-adapter/zipball/c93fd7cc9f215cfbbc6ce89089eadabedf65a21f", + "reference": "c93fd7cc9f215cfbbc6ce89089eadabedf65a21f", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/event-dispatcher-contracts": "^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "TYPO3\\SymfonyPsrEventDispatcherAdapter\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Adapter to provide compatibility with the Symfony's event dispatcher interface in all versions with the PSR-14 specification.", + "homepage": "https://typo3.org/", + "keywords": [ + "adapter", + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/TYPO3/symfony-psr-event-dispatcher-adapter/issues", + "source": "https://github.com/TYPO3/symfony-psr-event-dispatcher-adapter/tree/v2.1.0" + }, + "time": "2021-03-02T09:36:49+00:00" + }, + { + "name": "typo3fluid/fluid", + "version": "2.7.4", + "source": { + "type": "git", + "url": "https://github.com/TYPO3/Fluid.git", + "reference": "24f4494083c8d304680e4c9c38667dff33720dd4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3/Fluid/zipball/24f4494083c8d304680e4c9c38667dff33720dd4", + "reference": "24f4494083c8d304680e4c9c38667dff33720dd4", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "ext-json": "*", + "ext-mbstring": "*", + "friendsofphp/php-cs-fixer": "^3.4", + "phpstan/phpstan": "^1.7", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^8.5.33 || ^9.5.28 || ^10.0.16" + }, + "suggest": { + "ext-json": "PHP JSON is needed when using JSONVariableProvider: A relatively rare use case" + }, + "bin": [ + "bin/fluid" + ], + "type": "library", + "autoload": { + "psr-4": { + "TYPO3Fluid\\Fluid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "description": "The TYPO3 Fluid template rendering engine", + "homepage": "https://github.com/TYPO3/Fluid", + "support": { + "docs": "https://docs.typo3.org/other/typo3fluid/fluid/main/en-us/", + "issues": "https://github.com/TYPO3/Fluid/issues", + "source": "https://github.com/TYPO3/Fluid" + }, + "time": "2023-03-23T12:04:09+00:00" + }, + { + "name": "ubl/php-iiif-prezi-reader", + "version": "0.3.0", + "source": { + "type": "git", + "url": "https://github.com/ubleipzig/php-iiif-prezi-reader.git", + "reference": "401d246af3fc2857d1a925339fea256ac32824f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ubleipzig/php-iiif-prezi-reader/zipball/401d246af3fc2857d1a925339fea256ac32824f6", + "reference": "401d246af3fc2857d1a925339fea256ac32824f6", + "shasum": "" + }, + "require": { + "flow/jsonpath": ">=0.4.0", + "php": ">=5.6" + }, + "require-dev": { + "phpunit/phpunit": "~7.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Ubl\\Iiif\\": "src/Iiif/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Lutz Helm", + "email": "helm@ub.uni-leipzig.de", + "role": "Developer" + } + ], + "description": "Read IIIF Presentation API resources into PHP objects that offer some convenient data extraction methods", + "keywords": [ + "iiif", + "iiif-presentation" + ], + "support": { + "issues": "https://github.com/ubleipzig/php-iiif-prezi-reader/issues", + "source": "https://github.com/ubleipzig/php-iiif-prezi-reader/tree/0.3.0" + }, + "time": "2019-09-13T13:54:17+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" + } + ], + "packages-dev": [ + { + "name": "clue/stdio-react", + "version": "v2.6.0", + "source": { + "type": "git", + "url": "https://github.com/clue/reactphp-stdio.git", + "reference": "dfa6c378aabdff718202d4e2453f752c38ea3399" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/reactphp-stdio/zipball/dfa6c378aabdff718202d4e2453f752c38ea3399", + "reference": "dfa6c378aabdff718202d4e2453f752c38ea3399", + "shasum": "" + }, + "require": { + "clue/term-react": "^1.0 || ^0.1.1", + "clue/utf8-react": "^1.0 || ^0.1", + "php": ">=5.3", + "react/event-loop": "^1.2", + "react/stream": "^1.2" + }, + "require-dev": { + "clue/arguments": "^2.0", + "clue/commander": "^1.2", + "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35" + }, + "suggest": { + "ext-mbstring": "Using ext-mbstring should provide slightly better performance for handling I/O" + }, + "type": "library", + "autoload": { + "psr-4": { + "Clue\\React\\Stdio\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + } + ], + "description": "Async, event-driven console input & output (STDIN, STDOUT) for truly interactive CLI applications, built on top of ReactPHP", + "homepage": "https://github.com/clue/reactphp-stdio", + "keywords": [ + "async", + "autocomplete", + "autocompletion", + "cli", + "history", + "interactive", + "reactphp", + "readline", + "stdin", + "stdio", + "stdout" + ], + "support": { + "issues": "https://github.com/clue/reactphp-stdio/issues", + "source": "https://github.com/clue/reactphp-stdio/tree/v2.6.0" + }, + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2022-03-18T15:09:30+00:00" + }, + { + "name": "clue/term-react", + "version": "v1.4.0", + "source": { + "type": "git", + "url": "https://github.com/clue/reactphp-term.git", + "reference": "00f297dc597eaee2ebf98af8f27cca5d21d60fa3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/reactphp-term/zipball/00f297dc597eaee2ebf98af8f27cca5d21d60fa3", + "reference": "00f297dc597eaee2ebf98af8f27cca5d21d60fa3", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "react/stream": "^1.2" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/event-loop": "^1.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Clue\\React\\Term\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + } + ], + "description": "Streaming terminal emulator, built on top of ReactPHP.", + "homepage": "https://github.com/clue/reactphp-term", + "keywords": [ + "C0", + "CSI", + "ansi", + "apc", + "ascii", + "c1", + "control codes", + "dps", + "osc", + "pm", + "reactphp", + "streaming", + "terminal", + "vt100", + "xterm" + ], + "support": { + "issues": "https://github.com/clue/reactphp-term/issues", + "source": "https://github.com/clue/reactphp-term/tree/v1.4.0" + }, + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2024-01-30T10:22:09+00:00" + }, + { + "name": "clue/utf8-react", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/clue/reactphp-utf8.git", + "reference": "d5cd04d39cb5457aa5df830b7c4b301d2694217e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/reactphp-utf8/zipball/d5cd04d39cb5457aa5df830b7c4b301d2694217e", + "reference": "d5cd04d39cb5457aa5df830b7c4b301d2694217e", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "react/stream": "^1.0 || ^0.7 || ^0.6 || ^0.5 || ^0.4 || ^0.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/stream": "^1.0 || ^0.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "Clue\\React\\Utf8\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + } + ], + "description": "Streaming UTF-8 parser, built on top of ReactPHP.", + "homepage": "https://github.com/clue/reactphp-utf8", + "keywords": [ + "reactphp", + "streaming", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "issues": "https://github.com/clue/reactphp-utf8/issues", + "source": "https://github.com/clue/reactphp-utf8/tree/v1.3.0" + }, + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2023-12-06T14:52:17+00:00" + }, + { + "name": "evenement/evenement", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/igorw/evenement.git", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc", + "shasum": "" + }, + "require": { + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^9 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Evenement\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + } + ], + "description": "Événement is a very simple event dispatching library for PHP", + "keywords": [ + "event-dispatcher", + "event-emitter" + ], + "support": { + "issues": "https://github.com/igorw/evenement/issues", + "source": "https://github.com/igorw/evenement/tree/v3.0.2" + }, + "time": "2023-08-08T05:53:35+00:00" + }, + { + "name": "jolicode/jolinotif", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/jolicode/JoliNotif.git", + "reference": "a15bfc0d5aef432f150385924ede4e099643edb7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jolicode/JoliNotif/zipball/a15bfc0d5aef432f150385924ede4e099643edb7", + "reference": "a15bfc0d5aef432f150385924ede4e099643edb7", + "shasum": "" + }, + "require": { + "php": ">=7.4", + "symfony/process": "^4.0|^5.0|^6.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "symfony/finder": "^5.0", + "symfony/phpunit-bridge": "^5.0" + }, + "bin": [ + "jolinotif" + ], + "type": "library", + "autoload": { + "psr-4": { + "Joli\\JoliNotif\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Loïck Piera", + "email": "pyrech@gmail.com" + } + ], + "description": "Send desktop notifications on Windows, Linux, MacOS.", + "keywords": [ + "MAC", + "growl", + "linux", + "notification", + "windows" + ], + "support": { + "issues": "https://github.com/jolicode/JoliNotif/issues", + "source": "https://github.com/jolicode/JoliNotif/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/jolicode/jolinotif", + "type": "tidelift" + } + ], + "time": "2021-12-01T16:20:42+00:00" + }, + { + "name": "mikey179/vfsstream", + "version": "v1.6.11", + "source": { + "type": "git", + "url": "https://github.com/bovigo/vfsStream.git", + "reference": "17d16a85e6c26ce1f3e2fa9ceeacdc2855db1e9f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bovigo/vfsStream/zipball/17d16a85e6c26ce1f3e2fa9ceeacdc2855db1e9f", + "reference": "17d16a85e6c26ce1f3e2fa9ceeacdc2855db1e9f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.5|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6.x-dev" + } + }, + "autoload": { + "psr-0": { + "org\\bovigo\\vfs\\": "src/main/php" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Frank Kleine", + "homepage": "http://frankkleine.de/", + "role": "Developer" + } + ], + "description": "Virtual file system to mock the real file system in unit tests.", + "homepage": "http://vfs.bovigo.org/", + "support": { + "issues": "https://github.com/bovigo/vfsStream/issues", + "source": "https://github.com/bovigo/vfsStream/tree/master", + "wiki": "https://github.com/bovigo/vfsStream/wiki" + }, + "time": "2022-02-23T02:02:42+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.11.1", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3,<3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2023-03-08T13:26:56+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.3" + }, + "time": "2021-07-20T11:28:43+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpstan/phpstan", + "version": "1.10.58", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "a23518379ec4defd9e47cbf81019526861623ec2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/a23518379ec4defd9e47cbf81019526861623ec2", + "reference": "a23518379ec4defd9e47cbf81019526861623ec2", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0" + }, + "conflict": { + "phpstan/phpstan-shim": "*" + }, + "bin": [ + "phpstan", + "phpstan.phar" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan - PHP Static Analysis Tool", + "keywords": [ + "dev", + "static analysis" + ], + "support": { + "docs": "https://phpstan.org/user-guide/getting-started", + "forum": "https://github.com/phpstan/phpstan/discussions", + "issues": "https://github.com/phpstan/phpstan/issues", + "security": "https://github.com/phpstan/phpstan/security/policy", + "source": "https://github.com/phpstan/phpstan-src" + }, + "funding": [ + { + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://github.com/phpstan", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", + "type": "tidelift" + } + ], + "time": "2024-02-12T20:02:57+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "9.2.30", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "ca2bd87d2f9215904682a9cb9bb37dda98e76089" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ca2bd87d2f9215904682a9cb9bb37dda98e76089", + "reference": "ca2bd87d2f9215904682a9cb9bb37dda98e76089", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=7.3", + "phpunit/php-file-iterator": "^3.0.3", + "phpunit/php-text-template": "^2.0.2", + "sebastian/code-unit-reverse-lookup": "^2.0.2", + "sebastian/complexity": "^2.0", + "sebastian/environment": "^5.1.2", + "sebastian/lines-of-code": "^1.0.3", + "sebastian/version": "^3.0.1", + "theseer/tokenizer": "^1.2.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.30" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-22T06:47:57+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "3.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-12-02T12:48:52+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:58:55+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T05:33:50+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:16:10+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "9.6.16", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "3767b2c56ce02d01e3491046f33466a1ae60a37f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3767b2c56ce02d01e3491046f33466a1ae60a37f", + "reference": "3767b2c56ce02d01e3491046f33466a1ae60a37f", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.3.1 || ^2", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.10.1", + "phar-io/manifest": "^2.0.3", + "phar-io/version": "^3.0.2", + "php": ">=7.3", + "phpunit/php-code-coverage": "^9.2.28", + "phpunit/php-file-iterator": "^3.0.5", + "phpunit/php-invoker": "^3.1.1", + "phpunit/php-text-template": "^2.0.3", + "phpunit/php-timer": "^5.0.2", + "sebastian/cli-parser": "^1.0.1", + "sebastian/code-unit": "^1.0.6", + "sebastian/comparator": "^4.0.8", + "sebastian/diff": "^4.0.3", + "sebastian/environment": "^5.1.3", + "sebastian/exporter": "^4.0.5", + "sebastian/global-state": "^5.0.1", + "sebastian/object-enumerator": "^4.0.3", + "sebastian/resource-operations": "^3.0.3", + "sebastian/type": "^3.2", + "sebastian/version": "^3.0.2" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.6-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.16" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2024-01-19T07:03:14+00:00" + }, + { + "name": "react/event-loop", + "version": "v1.5.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/event-loop.git", + "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/event-loop/zipball/bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", + "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "suggest": { + "ext-pcntl": "For signal handling support when using the StreamSelectLoop" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\EventLoop\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.", + "keywords": [ + "asynchronous", + "event-loop" + ], + "support": { + "issues": "https://github.com/reactphp/event-loop/issues", + "source": "https://github.com/reactphp/event-loop/tree/v1.5.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2023-11-13T13:48:05+00:00" + }, + { + "name": "react/stream", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/stream.git", + "reference": "6fbc9672905c7d5a885f2da2fc696f65840f4a66" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/stream/zipball/6fbc9672905c7d5a885f2da2fc696f65840f4a66", + "reference": "6fbc9672905c7d5a885f2da2fc696f65840f4a66", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.8", + "react/event-loop": "^1.2" + }, + "require-dev": { + "clue/stream-filter": "~1.2", + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Stream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", + "keywords": [ + "event-driven", + "io", + "non-blocking", + "pipe", + "reactphp", + "readable", + "stream", + "writable" + ], + "support": { + "issues": "https://github.com/reactphp/stream/issues", + "source": "https://github.com/reactphp/stream/tree/v1.3.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2023-06-16T10:52:11+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:08:49+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "1.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:08:54+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:30:19+00:00" + }, + { + "name": "sebastian/comparator", + "version": "4.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/diff": "^4.0", + "sebastian/exporter": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-09-14T12:41:17+00:00" + }, + { + "name": "sebastian/complexity", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-22T06:19:30+00:00" + }, + { + "name": "sebastian/diff", + "version": "4.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-05-07T05:35:17+00:00" + }, + { + "name": "sebastian/environment", + "version": "5.1.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:03:51+00:00" + }, + { + "name": "sebastian/exporter", + "version": "4.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-09-14T06:03:37+00:00" + }, + { + "name": "sebastian/global-state", + "version": "5.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "bde739e7565280bda77be70044ac1047bc007e34" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bde739e7565280bda77be70044ac1047bc007e34", + "reference": "bde739e7565280bda77be70044ac1047bc007e34", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-02T09:26:13+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "1.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-22T06:20:34+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:12:34+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:14:26+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "4.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:07:39+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "support": { + "issues": "https://github.com/sebastianbergmann/resource-operations/issues", + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:45:17+00:00" + }, + { + "name": "sebastian/type", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:13:03+00:00" + }, + { + "name": "sebastian/version", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c6c1022351a901512170118436c764e473f6de8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", + "reference": "c6c1022351a901512170118436c764e473f6de8c", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:39:44+00:00" + }, + { + "name": "spatie/phpunit-watcher", + "version": "1.23.6", + "source": { + "type": "git", + "url": "https://github.com/spatie/phpunit-watcher.git", + "reference": "c192fff763810c8378511bcf0069df4b91478866" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/phpunit-watcher/zipball/c192fff763810c8378511bcf0069df4b91478866", + "reference": "c192fff763810c8378511bcf0069df4b91478866", + "shasum": "" + }, + "require": { + "clue/stdio-react": "^2.4", + "jolicode/jolinotif": "^2.2", + "php": "^7.2 | ^8.0 | ^8.1", + "symfony/console": "^5 | ^6", + "symfony/finder": "^5.4 | ^6", + "symfony/process": "^5.4 | ^6", + "symfony/yaml": "^5.2 | ^6", + "yosymfony/resource-watcher": "^2.0 | ^3.0" + }, + "conflict": { + "symfony/console": "<5.2", + "yosymfony/resource-watcher": "<2.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.6 | ^9.0" + }, + "bin": [ + "phpunit-watcher" + ], + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\PhpUnitWatcher\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Automatically rerun PHPUnit tests when source code changes", + "homepage": "https://github.com/spatie/phpunit-watcher", + "keywords": [ + "phpunit-watcher", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/phpunit-watcher/issues", + "source": "https://github.com/spatie/phpunit-watcher/tree/1.23.6" + }, + "time": "2022-01-31T11:57:13+00:00" + }, + { + "name": "symfony/process", + "version": "v5.4.35", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "cbc28e34015ad50166fc2f9c8962d28d0fe861eb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/cbc28e34015ad50166fc2f9c8962d28d0fe861eb", + "reference": "cbc28e34015ad50166fc2f9c8962d28d0fe861eb", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v5.4.35" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T13:51:25+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.2", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96", + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.2" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2023-11-20T00:12:19+00:00" + }, + { + "name": "typo3/cms-backend", + "version": "v10.4.37", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/backend.git", + "reference": "55b4bf5bab5734ff88400d1c7b3b97e005dd12fd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/backend/zipball/55b4bf5bab5734ff88400d1c7b3b97e005dd12fd", + "reference": "55b4bf5bab5734ff88400d1c7b3b97e005dd12fd", + "shasum": "" + }, + "require": { + "psr/event-dispatcher": "^1.0", + "typo3/cms-core": "10.4.37", + "typo3/cms-recordlist": "10.4.37" + }, + "conflict": { + "typo3/cms": "*" + }, + "replace": { + "typo3/cms-context-help": "*", + "typo3/cms-cshmanual": "*", + "typo3/cms-func-wizards": "*", + "typo3/cms-wizard-crpages": "*", + "typo3/cms-wizard-sortpages": "*" + }, + "suggest": { + "typo3/cms-install": "To generate url to install tool in environment toolbar" + }, + "type": "typo3-cms-framework", + "extra": { + "branch-alias": { + "dev-master": "10.4.x-dev" + }, + "typo3/cms": { + "Package": { + "serviceProvider": "TYPO3\\CMS\\Backend\\ServiceProvider", + "protected": true, + "partOfFactoryDefault": true, + "partOfMinimalUsableSystem": true + }, + "extension-key": "backend" + }, + "typo3/class-alias-loader": { + "class-alias-maps": [ + "Migrations/Code/ClassAliasMap.php" + ] + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Backend\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "Classes for the TYPO3 backend.", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2023-04-11T13:10:15+00:00" + }, + { + "name": "typo3/cms-fluid", + "version": "v10.4.37", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/fluid.git", + "reference": "ec89e645ff50a202236dc3f66b9d07c2aa6d5b03" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/fluid/zipball/ec89e645ff50a202236dc3f66b9d07c2aa6d5b03", + "reference": "ec89e645ff50a202236dc3f66b9d07c2aa6d5b03", + "shasum": "" + }, + "require": { + "symfony/dependency-injection": "^4.4 || ^5.0", + "typo3/cms-core": "10.4.37", + "typo3/cms-extbase": "10.4.37", + "typo3fluid/fluid": "^2.6.10" + }, + "conflict": { + "typo3/cms": "*" + }, + "type": "typo3-cms-framework", + "extra": { + "branch-alias": { + "dev-master": "10.4.x-dev" + }, + "typo3/cms": { + "Package": { + "protected": true, + "partOfFactoryDefault": true, + "partOfMinimalUsableSystem": true + }, + "extension-key": "fluid" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Fluid\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "Fluid is a next-generation templating engine which makes the life of extension authors a lot easier!", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org/other/typo3/view-helper-reference/10.4/en-us/", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2023-04-11T13:10:15+00:00" + }, + { + "name": "typo3/cms-fluid-styled-content", + "version": "v10.4.37", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/fluid_styled_content.git", + "reference": "ebcad8581a7f81bc69bf4aebb2ef99a590f84909" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/fluid_styled_content/zipball/ebcad8581a7f81bc69bf4aebb2ef99a590f84909", + "reference": "ebcad8581a7f81bc69bf4aebb2ef99a590f84909", + "shasum": "" + }, + "require": { + "typo3/cms-core": "10.4.37", + "typo3/cms-fluid": "10.4.37", + "typo3/cms-frontend": "10.4.37" + }, + "conflict": { + "typo3/cms": "*" + }, + "type": "typo3-cms-framework", + "extra": { + "branch-alias": { + "dev-master": "10.4.x-dev" + }, + "typo3/cms": { + "Package": { + "partOfFactoryDefault": true + }, + "extension-key": "fluid_styled_content" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\FluidStyledContent\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "A set of common content elements based on Fluid for Frontend output.", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org/c/typo3/cms-fluid-styled-content/10.4/en-us", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2023-04-11T13:10:15+00:00" + }, + { + "name": "typo3/cms-frontend", + "version": "v10.4.37", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/frontend.git", + "reference": "d97ae4ed2f9f2062374536a00ff6f7bc1cba85ad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/frontend/zipball/d97ae4ed2f9f2062374536a00ff6f7bc1cba85ad", + "reference": "d97ae4ed2f9f2062374536a00ff6f7bc1cba85ad", + "shasum": "" + }, + "require": { + "ext-libxml": "*", + "symfony/polyfill-mbstring": "^1.16", + "typo3/cms-core": "10.4.37" + }, + "conflict": { + "typo3/cms": "*" + }, + "suggest": { + "typo3/cms-adminpanel": "Provides additional information and functionality for backend users in the frontend." + }, + "type": "typo3-cms-framework", + "extra": { + "branch-alias": { + "dev-master": "10.4.x-dev" + }, + "typo3/cms": { + "Package": { + "serviceProvider": "TYPO3\\CMS\\Frontend\\ServiceProvider", + "protected": true, + "partOfFactoryDefault": true, + "partOfMinimalUsableSystem": true + }, + "extension-key": "frontend" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Frontend\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "Classes for the frontend of TYPO3.", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2023-04-11T13:10:15+00:00" + }, + { + "name": "typo3/cms-install", + "version": "v10.4.37", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/install.git", + "reference": "3e82477beb50e2595665ed572f52a1e9e130ded6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/install/zipball/3e82477beb50e2595665ed572f52a1e9e130ded6", + "reference": "3e82477beb50e2595665ed572f52a1e9e130ded6", + "shasum": "" + }, + "require": { + "doctrine/dbal": "~2.10.0 || ~2.11.2 || ~2.13.1", + "nikic/php-parser": "^4.10.4", + "symfony/finder": "^4.4 || ^5.0", + "typo3/cms-core": "10.4.37", + "typo3/cms-extbase": "10.4.37", + "typo3/cms-fluid": "10.4.37" + }, + "conflict": { + "typo3/cms": "*" + }, + "type": "typo3-cms-framework", + "extra": { + "branch-alias": { + "dev-master": "10.4.x-dev" + }, + "typo3/cms": { + "Package": { + "serviceProvider": "TYPO3\\CMS\\Install\\ServiceProvider", + "protected": true, + "partOfFactoryDefault": true, + "partOfMinimalUsableSystem": true + }, + "extension-key": "install" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Install\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "The Install Tool mounted as the module Tools>Install in TYPO3.", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2023-04-11T13:10:15+00:00" + }, + { + "name": "typo3/cms-recordlist", + "version": "v10.4.37", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/recordlist.git", + "reference": "47cffea95b30726f130eb2d2bb6a7836f6fe5145" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/recordlist/zipball/47cffea95b30726f130eb2d2bb6a7836f6fe5145", + "reference": "47cffea95b30726f130eb2d2bb6a7836f6fe5145", + "shasum": "" + }, + "require": { + "typo3/cms-core": "10.4.37" + }, + "conflict": { + "typo3/cms": "*" + }, + "type": "typo3-cms-framework", + "extra": { + "branch-alias": { + "dev-master": "10.4.x-dev" + }, + "typo3/cms": { + "Package": { + "protected": true, + "partOfFactoryDefault": true, + "partOfMinimalUsableSystem": true + }, + "extension-key": "recordlist" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Recordlist\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "List of database-records", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2023-04-11T13:10:15+00:00" + }, + { + "name": "typo3/testing-framework", + "version": "6.16.9", + "source": { + "type": "git", + "url": "https://github.com/TYPO3/testing-framework.git", + "reference": "62005ddb550f8b1c69c955c8683a8a632a44f482" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3/testing-framework/zipball/62005ddb550f8b1c69c955c8683a8a632a44f482", + "reference": "62005ddb550f8b1c69c955c8683a8a632a44f482", + "shasum": "" + }, + "require": { + "ext-pdo": "*", + "guzzlehttp/psr7": "^1.7 || ^2.0", + "mikey179/vfsstream": "~1.6.11", + "php": ">= 7.2", + "phpunit/phpunit": "^8.4 || ^9.0", + "psr/container": "^1.0", + "typo3/cms-backend": "10.*.*@dev || 11.*.*@dev", + "typo3/cms-core": "10.*.*@dev || 11.*.*@dev", + "typo3/cms-extbase": "10.*.*@dev || 11.*.*@dev", + "typo3/cms-fluid": "10.*.*@dev || 11.*.*@dev", + "typo3/cms-frontend": "10.*.*@dev || 11.*.*@dev", + "typo3/cms-install": "10.*.*@dev || 11.*.*@dev", + "typo3/cms-recordlist": "10.*.*@dev || 11.*.*@dev", + "typo3fluid/fluid": "^2.5" + }, + "conflict": { + "doctrine/dbal": "2.13.0 || 2.13.1" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.4.0", + "phpstan/phpstan": "^1.8.0", + "phpstan/phpstan-phpunit": "^1.1.1", + "typo3/cms-workspaces": "10.*.*@dev || 11.*.*@dev" + }, + "type": "library", + "autoload": { + "psr-4": { + "TYPO3\\PrivateContainer\\": "Resources/Core/Functional/Extensions/private_container/Classes/", + "TYPO3\\TestingFramework\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 CMS Core Team", + "homepage": "https://forge.typo3.org/projects/typo3cms-core", + "role": "Developer" + }, + { + "name": "The TYPO3 Community", + "homepage": "https://typo3.org/community/", + "role": "Contributor" + } + ], + "description": "The TYPO3 testing framework provides base classes for unit, functional and acceptance testing.", + "homepage": "https://typo3.org/", + "keywords": [ + "testing", + "tests", + "typo3" + ], + "support": { + "general": "https://typo3.org/support/", + "issues": "https://github.com/TYPO3/testing-framework/issues", + "source": "https://github.com/TYPO3/testing-framework/tree/6.16.9" + }, + "time": "2023-08-02T16:11:00+00:00" + }, + { + "name": "yosymfony/resource-watcher", + "version": "v3.0.0", + "source": { + "type": "git", + "url": "https://github.com/yosymfony/resource-watcher.git", + "reference": "2f197cee0231c06db865d4ad2d8d7cd3faead2f8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yosymfony/resource-watcher/zipball/2f197cee0231c06db865d4ad2d8d7cd3faead2f8", + "reference": "2f197cee0231c06db865d4ad2d8d7cd3faead2f8", + "shasum": "" + }, + "require": { + "php": ">=5.6", + "symfony/finder": "^2.7|^3.0|^4.0|^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7", + "symfony/filesystem": "^2.7|^3.0|^4.0|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Yosymfony\\ResourceWatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Victor Puertas", + "email": "vpgugr@gmail.com" + } + ], + "description": "A simple resource watcher using Symfony Finder", + "homepage": "http://yosymfony.com", + "keywords": [ + "finder", + "resources", + "symfony", + "watcher" + ], + "support": { + "issues": "https://github.com/yosymfony/resource-watcher/issues", + "source": "https://github.com/yosymfony/resource-watcher/tree/master" + }, + "time": "2020-06-10T14:58:36+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": "^7.4", + "ext-curl": "*", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-openssl": "*", + "ext-simplexml": "*" + }, + "platform-dev": [], + "plugin-api-version": "2.6.0" +} From 0573700fea206ffad3da84979f635f4d009e66c8 Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Tue, 27 Feb 2024 14:37:07 +0100 Subject: [PATCH 43/72] [BUGFIX] Fix problems with translation of database records (#1169) --- Configuration/TCA/tx_dlf_basket.php | 1 + Configuration/TCA/tx_dlf_collections.php | 1 + Configuration/TCA/tx_dlf_libraries.php | 1 + Configuration/TCA/tx_dlf_metadata.php | 1 + Configuration/TCA/tx_dlf_structures.php | 1 + ext_tables.sql | 5 +++++ 6 files changed, 10 insertions(+) diff --git a/Configuration/TCA/tx_dlf_basket.php b/Configuration/TCA/tx_dlf_basket.php index 7d693d13b..c7b7d985c 100644 --- a/Configuration/TCA/tx_dlf_basket.php +++ b/Configuration/TCA/tx_dlf_basket.php @@ -17,6 +17,7 @@ 'tstamp' => 'tstamp', 'fe_user_id' => 'fe_user_id', 'languageField' => 'sys_language_uid', + 'transOrigPointerField' => 'l18n_parent', 'transOrigDiffSourceField' => 'l18n_diffsource', 'default_sortby' => 'ORDER BY label', 'delete' => 'deleted', diff --git a/Configuration/TCA/tx_dlf_collections.php b/Configuration/TCA/tx_dlf_collections.php index 6ae430f11..de7f1e54c 100644 --- a/Configuration/TCA/tx_dlf_collections.php +++ b/Configuration/TCA/tx_dlf_collections.php @@ -20,6 +20,7 @@ 'fe_cruser_id' => 'fe_cruser_id', 'fe_admin_lock' => 'fe_admin_lock', 'languageField' => 'sys_language_uid', + 'transOrigPointerField' => 'l18n_parent', 'transOrigDiffSourceField' => 'l18n_diffsource', 'default_sortby' => 'ORDER BY label', 'delete' => 'deleted', diff --git a/Configuration/TCA/tx_dlf_libraries.php b/Configuration/TCA/tx_dlf_libraries.php index 87aebc781..8a961dfed 100644 --- a/Configuration/TCA/tx_dlf_libraries.php +++ b/Configuration/TCA/tx_dlf_libraries.php @@ -18,6 +18,7 @@ 'crdate' => 'crdate', 'cruser_id' => 'cruser_id', 'languageField' => 'sys_language_uid', + 'transOrigPointerField' => 'l18n_parent', 'transOrigDiffSourceField' => 'l18n_diffsource', 'default_sortby' => 'ORDER BY label', 'delete' => 'deleted', diff --git a/Configuration/TCA/tx_dlf_metadata.php b/Configuration/TCA/tx_dlf_metadata.php index 4db0cc5c1..c7284f291 100644 --- a/Configuration/TCA/tx_dlf_metadata.php +++ b/Configuration/TCA/tx_dlf_metadata.php @@ -18,6 +18,7 @@ 'crdate' => 'crdate', 'cruser_id' => 'cruser_id', 'languageField' => 'sys_language_uid', + 'transOrigPointerField' => 'l18n_parent', 'transOrigDiffSourceField' => 'l18n_diffsource', 'sortby' => 'sorting', 'delete' => 'deleted', diff --git a/Configuration/TCA/tx_dlf_structures.php b/Configuration/TCA/tx_dlf_structures.php index 92707eb00..e8a586253 100644 --- a/Configuration/TCA/tx_dlf_structures.php +++ b/Configuration/TCA/tx_dlf_structures.php @@ -18,6 +18,7 @@ 'crdate' => 'crdate', 'cruser_id' => 'cruser_id', 'languageField' => 'sys_language_uid', + 'transOrigPointerField' => 'l18n_parent', 'transOrigDiffSourceField' => 'l18n_diffsource', 'default_sortby' => 'ORDER BY label', 'delete' => 'deleted', diff --git a/ext_tables.sql b/ext_tables.sql index 0b49ed31e..9d6613480 100644 --- a/ext_tables.sql +++ b/ext_tables.sql @@ -62,6 +62,7 @@ CREATE TABLE tx_dlf_structures ( sys_language_uid int(11) DEFAULT '0' NOT NULL, l18n_parent int(11) DEFAULT '0' NOT NULL, l18n_diffsource mediumblob NOT NULL, + l10n_state text COLLATE utf8_unicode_ci DEFAULT NULL, hidden smallint(6) DEFAULT '0' NOT NULL, toplevel smallint(6) DEFAULT '0' NOT NULL, label varchar(255) DEFAULT '' NOT NULL, @@ -89,6 +90,7 @@ CREATE TABLE tx_dlf_metadata ( sys_language_uid int(11) DEFAULT '0' NOT NULL, l18n_parent int(11) DEFAULT '0' NOT NULL, l18n_diffsource mediumblob NOT NULL, + l10n_state text COLLATE utf8_unicode_ci DEFAULT NULL, hidden smallint(6) DEFAULT '0' NOT NULL, sorting int(11) DEFAULT '0' NOT NULL, label varchar(255) DEFAULT '' NOT NULL, @@ -191,6 +193,7 @@ CREATE TABLE tx_dlf_collections ( sys_language_uid int(11) DEFAULT '0' NOT NULL, l18n_parent int(11) DEFAULT '0' NOT NULL, l18n_diffsource mediumblob NOT NULL, + l10n_state text COLLATE utf8_unicode_ci DEFAULT NULL, hidden smallint(6) DEFAULT '0' NOT NULL, fe_group varchar(100) DEFAULT '' NOT NULL, label varchar(255) DEFAULT '' NOT NULL, @@ -225,6 +228,7 @@ CREATE TABLE tx_dlf_libraries ( sys_language_uid int(11) DEFAULT '0' NOT NULL, l18n_parent int(11) DEFAULT '0' NOT NULL, l18n_diffsource mediumblob NOT NULL, + l10n_state text COLLATE utf8_unicode_ci DEFAULT NULL, label varchar(255) DEFAULT '' NOT NULL, index_name varchar(255) DEFAULT '' NOT NULL, website varchar(255) DEFAULT '' NOT NULL, @@ -287,6 +291,7 @@ CREATE TABLE tx_dlf_basket ( sys_language_uid int(11) DEFAULT '0' NOT NULL, l18n_parent int(11) DEFAULT '0' NOT NULL, l18n_diffsource mediumblob NOT NULL, + l10n_state text COLLATE utf8_unicode_ci DEFAULT NULL, label varchar(255) DEFAULT '' NOT NULL, session_id varchar(32) DEFAULT '' NOT NULL, doc_ids varchar(255) DEFAULT '' NOT NULL, From ddc85369dbfc439e3688a7117b2a907c9608f3e5 Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Tue, 27 Feb 2024 14:44:38 +0100 Subject: [PATCH 44/72] [BUGFIX] Add missing fields to to metadata format table (#1179) Co-authored-by: Sebastian Meyer --- Configuration/TCA/tx_dlf_metadataformat.php | 9 ++++++++- Tests/Fixtures/Common/metadata.csv | 8 ++++---- Tests/Fixtures/MetsDocument/metadata_mets.csv | 12 ++++++------ Tests/Fixtures/Repository/metadata.csv | 8 ++++---- ext_tables.sql | 2 ++ 5 files changed, 24 insertions(+), 15 deletions(-) diff --git a/Configuration/TCA/tx_dlf_metadataformat.php b/Configuration/TCA/tx_dlf_metadataformat.php index 4baa5c8e0..fc63a9718 100644 --- a/Configuration/TCA/tx_dlf_metadataformat.php +++ b/Configuration/TCA/tx_dlf_metadataformat.php @@ -17,7 +17,9 @@ 'tstamp' => 'tstamp', 'crdate' => 'crdate', 'cruser_id' => 'cruser_id', - 'languageField' => 'sys_language_uid', // There are no translations of metadataformat records. But to avoid error messages of the datahandler on translating metadata records, we have to add these fields here. + 'languageField' => 'sys_language_uid', + 'transOrigPointerField' => 'l18n_parent', + 'transOrigDiffSourceField' => 'l18n_diffsource', 'delete' => 'deleted', 'iconfile' => 'EXT:dlf/Resources/Public/Icons/txdlfmetadata.png', 'rootLevel' => 0, @@ -57,6 +59,11 @@ 'default' => 0, ], ], + 'l18n_diffsource' => [ + 'config' => [ + 'type' => 'passthrough', + ], + ], 'parent_id' => [ 'config' => [ 'type' => 'passthrough', diff --git a/Tests/Fixtures/Common/metadata.csv b/Tests/Fixtures/Common/metadata.csv index 02c3e2237..418ad82cc 100644 --- a/Tests/Fixtures/Common/metadata.csv +++ b/Tests/Fixtures/Common/metadata.csv @@ -2,10 +2,10 @@ ,"uid","pid","tstamp","crdate","cruser_id","deleted","sys_language_uid","l18n_parent","l18n_diffsource","hidden","sorting","label","index_name","format","default_value","wrap","index_tokenized","index_stored","index_indexed","index_boost","is_sortable","is_facet","is_listed","index_autocomplete","status" ,5001,20000,1638557803,1631532810,1,0,0,0,,0,32,"Titel","title",1,,,0,1,1,1,1,0,1,1,0 ,5002,20000,1638557803,1631532810,1,0,0,0,,0,32,"Sammlungen","collection",1,,,1,0,1,1,0,1,0,1,0 -"tx_dlf_metadataformat",,,,,,,,,,, -,"uid","pid","tstamp","crdate","cruser_id","deleted","parent_id","encoded","xpath","xpath_sorting","mandatory" -,5101,20000,1638557803,1631532810,1,0,5001,5202,"concat(./mods:titleInfo/mods:nonSort,"" "",./mods:titleInfo/mods:title)","./mods:titleInfo/mods:title",0 -,5102,20000,1638557803,1631532810,1,0,5002,5202,"./mods:relatedItem[@type=""series""]/mods:titleInfo/mods:title[@lang=""ger""]",,0 +"tx_dlf_metadataformat",,,,,,,,,,,,,, +,"uid","pid","tstamp","crdate","cruser_id","deleted","sys_language_uid","l18n_parent","l18n_diffsource","parent_id","encoded","xpath","xpath_sorting","mandatory" +,5101,20000,1638557803,1631532810,1,0,0,0,,5001,5202,"concat(./mods:titleInfo/mods:nonSort,"" "",./mods:titleInfo/mods:title)","./mods:titleInfo/mods:title",0 +,5102,20000,1638557803,1631532810,1,0,0,0,,5002,5202,"./mods:relatedItem[@type=""series""]/mods:titleInfo/mods:title[@lang=""ger""]",,0 "tx_dlf_formats",,,,,,,,,, ,"uid","pid","tstamp","crdate","cruser_id","deleted","type","root","namespace","class" ,5201,0,1638557803,1631532810,1,0,"ALTO","alto","http://www.loc.gov/standards/alto/ns-v2#","Kitodo\Dlf\Format\Alto" diff --git a/Tests/Fixtures/MetsDocument/metadata_mets.csv b/Tests/Fixtures/MetsDocument/metadata_mets.csv index 49bc25d2f..3eb25995e 100644 --- a/Tests/Fixtures/MetsDocument/metadata_mets.csv +++ b/Tests/Fixtures/MetsDocument/metadata_mets.csv @@ -4,12 +4,12 @@ ,321913049,20000,,,1,0,0,0,,0,,"Owner","dvrights_owner",1,,,0,1,1,1,1,0,1,1,0 ,249506784,20000,,,1,0,0,0,,0,,"Reference","dvlinks_reference",1,,,0,1,1,1,1,0,1,1,0 ,793462399,20000,,,1,0,0,0,,0,,"Test Value","test_value",1,,,0,1,1,1,1,0,1,1,0 -"tx_dlf_metadataformat",,,,,,,,,,, -,"uid","pid","tstamp","crdate","cruser_id","deleted","parent_id","encoded","xpath","xpath_sorting","mandatory" -,525104468,20000,,,1,0,613174853,689522348,"./videomd:videoInfo/videomd:frame/videomd:frameRate",,0 -,403181441,20000,,,1,0,321913049,142585035,"./dv:owner",,0 -,257842913,20000,,,1,0,249506784,933594800,"./dv:reference",,0 -,569124173,20000,,,1,0,793462399,5202,"./dv:test",,0 +"tx_dlf_metadataformat",,,,,,,,,,,,,, +,"uid","pid","tstamp","crdate","cruser_id","deleted","sys_language_uid","l18n_parent","l18n_diffsource","parent_id","encoded","xpath","xpath_sorting","mandatory" +,525104468,20000,,,1,0,0,0,,613174853,689522348,"./videomd:videoInfo/videomd:frame/videomd:frameRate",,0 +,403181441,20000,,,1,0,0,0,,321913049,142585035,"./dv:owner",,0 +,257842913,20000,,,1,0,0,0,,249506784,933594800,"./dv:reference",,0 +,569124173,20000,,,1,0,0,0,,793462399,5202,"./dv:test",,0 "tx_dlf_formats",,,,,,,,,, ,"uid","pid","tstamp","crdate","cruser_id","deleted","type","root","namespace","class" ,689522348,0,,,1,0,"VIDEOMD","VIDEOMD","http://www.loc.gov/videoMD/","Kitodo\Dlf\Format\Mods" diff --git a/Tests/Fixtures/Repository/metadata.csv b/Tests/Fixtures/Repository/metadata.csv index 4abadbe15..0fc37c97d 100644 --- a/Tests/Fixtures/Repository/metadata.csv +++ b/Tests/Fixtures/Repository/metadata.csv @@ -6,10 +6,10 @@ ,5004,20000,1638557803,1631532810,1,0,0,0,,0,29,"Ort","ort",1,,,0,1,1,1,1,0,0,1,0 ,5005,20000,1638557803,1631532810,1,0,0,0,,0,30,"Autor","autor",1,,,0,1,1,1,1,0,1,1,0 ,5006,20000,1638557803,1631532810,1,0,0,0,,0,30,"Institution","institution",1,,,0,1,1,1,0,0,1,1,0 -"tx_dlf_metadataformat",,,,,,,,,,, -,"uid","pid","tstamp","crdate","cruser_id","deleted","parent_id","encoded","xpath","xpath_sorting","mandatory" -,5101,20000,1638557803,1631532810,1,0,5001,5202,"concat(./mods:titleInfo/mods:nonSort,"" "",./mods:titleInfo/mods:title)","./mods:titleInfo/mods:title",0 -,5102,20000,1638557803,1631532810,1,0,5002,5202,""./mods:relatedItem[@type="series"]/mods:titleInfo/mods:title[@lang="ger"]",,0 +"tx_dlf_metadataformat",,,,,,,,,,,,,, +,"uid","pid","tstamp","crdate","cruser_id","deleted","sys_language_uid","l18n_parent","l18n_diffsource","parent_id","encoded","xpath","xpath_sorting","mandatory" +,5101,20000,1638557803,1631532810,1,0,0,0,,5001,5202,"concat(./mods:titleInfo/mods:nonSort,"" "",./mods:titleInfo/mods:title)","./mods:titleInfo/mods:title",0 +,5102,20000,1638557803,1631532810,1,0,0,0,,5002,5202,""./mods:relatedItem[@type="series"]/mods:titleInfo/mods:title[@lang="ger"]",,0 "tx_dlf_formats",,,,,,,,,, ,"uid","pid","tstamp","crdate","cruser_id","deleted","type","root","namespace","class" ,5201,0,1638557803,1631532810,1,0,"ALTO","alto","http://www.loc.gov/standards/alto/ns-v2#","Kitodo\Dlf\Format\Alto" diff --git a/ext_tables.sql b/ext_tables.sql index 9d6613480..7d7da2a01 100644 --- a/ext_tables.sql +++ b/ext_tables.sql @@ -130,6 +130,8 @@ CREATE TABLE tx_dlf_metadataformat ( deleted smallint(6) DEFAULT '0' NOT NULL, sys_language_uid int(11) DEFAULT '0' NOT NULL, l18n_parent int(11) DEFAULT '0' NOT NULL, + l18n_diffsource mediumblob NOT NULL, + l10n_state text COLLATE utf8_unicode_ci DEFAULT NULL, parent_id int(11) DEFAULT '0' NOT NULL, encoded int(11) DEFAULT '0' NOT NULL, xpath varchar(1024) DEFAULT '' NOT NULL, From 117266edf52006b844183665c3741eab1934b86a Mon Sep 17 00:00:00 2001 From: Bernd Fallert Date: Tue, 27 Feb 2024 15:26:16 +0100 Subject: [PATCH 45/72] [BUGFIX] Show only specific range of pages in pagination, add "..." (#1103) Co-authored-by: BFallert Co-authored-by: Sebastian Meyer --- Classes/Controller/AbstractController.php | 45 ++++++++++++++++--- .../Private/Partials/Lists/Pagination.html | 26 ++++++----- 2 files changed, 54 insertions(+), 17 deletions(-) diff --git a/Classes/Controller/AbstractController.php b/Classes/Controller/AbstractController.php index 36f62e338..e7db9f0ee 100644 --- a/Classes/Controller/AbstractController.php +++ b/Classes/Controller/AbstractController.php @@ -329,7 +329,25 @@ protected function buildSimplePagination(PaginationInterface $pagination, Pagina $currentPageNumber = $paginator->getCurrentPageNumber(); $pages = []; - + $pagesSect = []; + $aRange = []; + $nRange = 5; // ToDo: should be made configurable + + // lower limit of the range + $nBottom = $currentPageNumber - $nRange; + // upper limit of the range + $nTop = $currentPageNumber + $nRange; + // page range + for ($i = $nBottom; $i <= $nTop; $i++) { + if ($i > 0 and $i <= $lastPage) { + array_push($aRange, $i); + }; + }; + + // check whether the first screen page is > 1, if yes then points must be added + if ($aRange[0] > 1) { + array_push($pagesSect, ['label' => '...','startRecordNumber' => '...']); + }; $lastStartRecordNumberGrid = 0; // due to validity outside the loop foreach (range($firstPage, $lastPage) as $i) { // detect which pagination is active: ListView or GridView @@ -340,6 +358,12 @@ protected function buildSimplePagination(PaginationInterface $pagination, Pagina 'label' => $i, 'startRecordNumber' => $i ]; + + // Check if screen page is in range + // + if (in_array($i, $aRange)) { + array_push($pagesSect, ['label' => $i, 'startRecordNumber' => $i]); + }; } else { // GridView // to calculate the values for generation the links for the pagination pages /** @var \Kitodo\Dlf\Pagination\PageGridPaginator $paginator */ @@ -362,14 +386,22 @@ protected function buildSimplePagination(PaginationInterface $pagination, Pagina 'label' => $i, 'startRecordNumber' => $startRecordNumber ]; - } - } + + // Check if screen page is in range + if (in_array($i, $aRange)) { + array_push($pagesSect, ['label' => $i,'startRecordNumber' => $startRecordNumber]); + }; + }; + }; + + // check whether the last element from $aRange <= last screen page, if yes then points must be added + if ($aRange[array_key_last($aRange)] < $lastPage) { + array_push($pagesSect, ['label' => '...', 'startRecordNumber' => '...']); + }; $nextPageNumber = $pages[$currentPageNumber + 1]['startRecordNumber']; $previousPageNumber = $pages[$currentPageNumber - 1]['startRecordNumber']; - // 'startRecordNumber' is not required in GridView, only the variant for each loop is required - // 'endRecordNumber' is not required in both views // 'startRecordNumber' is not required in GridView, only the variant for each loop is required // 'endRecordNumber' is not required in both views // @@ -397,7 +429,8 @@ protected function buildSimplePagination(PaginationInterface $pagination, Pagina 'endRecordNumber' => $pagination->getEndRecordNumber(), 'currentPageNumber' => $currentPageNumber, 'pages' => range($firstPage, $lastPage), - 'pagesG' => $pages + 'pagesG' => $pages, + 'pagesR' => $pagesSect ]; } diff --git a/Resources/Private/Partials/Lists/Pagination.html b/Resources/Private/Partials/Lists/Pagination.html index bf328a3b6..191c7e860 100644 --- a/Resources/Private/Partials/Lists/Pagination.html +++ b/Resources/Private/Partials/Lists/Pagination.html @@ -18,11 +18,8 @@ - -
  • -
    - add pages between first and last page - + add pages between first and last page, with dots if there are more than 5 pages (before or after) the respective page + If page 1 is not to be output twice, please remove the comment @@ -37,15 +34,22 @@ -
  • - {page.label} -
  • + + add the dots + +
  • + ... +
  • +
    + +
  • + {page.label} +
  • +
    +
    - -
  • -
  • From e02c5d18848f50714eba0e9498f74eea1513d664 Mon Sep 17 00:00:00 2001 From: Chris Date: Thu, 7 Mar 2024 16:11:06 +0100 Subject: [PATCH 50/72] [BUGFIX] Fix search word highlighting (#1185) Signed-off-by: Christos Sidiropoulos Co-authored-by: Bernd Fallert --- Resources/Public/JavaScript/PageView/Utility.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Public/JavaScript/PageView/Utility.js b/Resources/Public/JavaScript/PageView/Utility.js index b919e1c83..6e0197c53 100644 --- a/Resources/Public/JavaScript/PageView/Utility.js +++ b/Resources/Public/JavaScript/PageView/Utility.js @@ -655,8 +655,8 @@ dlfUtils.scaleToImageSize = function (features, imageObj, width, height, optOffs dlfUtils.searchFeatureCollectionForCoordinates = function (featureCollection, coordinates) { var features = []; featureCollection.forEach(function (ft) { - if (ft.get('fulltext') !== undefined) { - if (ft.getId() === coordinates) { + if (ft.values_.fulltext !== undefined) { + if (ft.values_.fulltext.includes(coordinates)) { features.push(ft); } } From d6af72e6e3a6476b57bbe83ac928905f7d6d00b2 Mon Sep 17 00:00:00 2001 From: Sebastian Meyer Date: Fri, 15 Mar 2024 17:35:09 +0100 Subject: [PATCH 51/72] Remove unused file --- Resources/Public/JavaScript/3DViewer/importmap.js | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 Resources/Public/JavaScript/3DViewer/importmap.js diff --git a/Resources/Public/JavaScript/3DViewer/importmap.js b/Resources/Public/JavaScript/3DViewer/importmap.js deleted file mode 100644 index d93a3fecf..000000000 --- a/Resources/Public/JavaScript/3DViewer/importmap.js +++ /dev/null @@ -1,3 +0,0 @@ -"imports": { - "three": "./build/three.module.js" -} From fc8817b88e63be017b38155013a914e9d4b127cb Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Fri, 3 May 2024 16:00:23 +0200 Subject: [PATCH 52/72] [BUGFIX] Check if `$this->documentRepository` is set (#1190) --- Classes/Hooks/DataHandler.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Classes/Hooks/DataHandler.php b/Classes/Hooks/DataHandler.php index ad646b322..fcce799ec 100644 --- a/Classes/Hooks/DataHandler.php +++ b/Classes/Hooks/DataHandler.php @@ -39,9 +39,9 @@ class DataHandler implements LoggerAwareInterface /** * @access protected - * @var DocumentRepository|null + * @var DocumentRepository */ - protected ?DocumentRepository $documentRepository; + protected DocumentRepository $documentRepository; /** * Gets document repository @@ -52,7 +52,7 @@ class DataHandler implements LoggerAwareInterface */ protected function getDocumentRepository(): DocumentRepository { - if ($this->documentRepository === null) { + if (!isset($this->documentRepository)) { $objectManager = GeneralUtility::makeInstance(ObjectManager::class); $this->documentRepository = $objectManager->get(DocumentRepository::class); } From 83566b5286fd485324a4710e74c3937d8b93b670 Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Fri, 3 May 2024 16:03:21 +0200 Subject: [PATCH 53/72] [BUGFIX] Fix `NULL` exception for empty `title_sorting` (#1192) Co-authored-by: Sebastian Meyer --- Classes/Command/BaseCommand.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/Command/BaseCommand.php b/Classes/Command/BaseCommand.php index 25f2b5e47..d0ea3600b 100644 --- a/Classes/Command/BaseCommand.php +++ b/Classes/Command/BaseCommand.php @@ -209,7 +209,7 @@ protected function saveToDatabase(Document $document): bool // set title data $document->setTitle($metadata['title'][0] ? : ''); - $document->setTitleSorting($metadata['title_sorting'][0]); + $document->setTitleSorting($metadata['title_sorting'][0] ? : ''); $document->setPlace(implode('; ', $metadata['place'])); $document->setYear(implode('; ', $metadata['year'])); From c2346772a0a85652598c7027bc7371635fe3bfe1 Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Fri, 3 May 2024 16:08:37 +0200 Subject: [PATCH 54/72] [BUGFIX] Fix saving to database for documents with many authors (#1193) Co-authored-by: Sebastian Meyer --- Classes/Command/BaseCommand.php | 36 ++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/Classes/Command/BaseCommand.php b/Classes/Command/BaseCommand.php index d0ea3600b..7752a79aa 100644 --- a/Classes/Command/BaseCommand.php +++ b/Classes/Command/BaseCommand.php @@ -218,7 +218,7 @@ protected function saveToDatabase(Document $document): bool $splitName = explode(chr(31), $author); $metadata['author'][$i] = $splitName[0]; } - $document->setAuthor(implode('; ', $metadata['author'])); + $document->setAuthor($this->getAuthors($metadata['author'])); $document->setThumbnail($doc->thumbnail ? : ''); $document->setMetsLabel($metadata['mets_label'][0] ? : ''); $document->setMetsOrderlabel($metadata['mets_orderlabel'][0] ? : ''); @@ -350,6 +350,40 @@ private function addCollections(Document &$document, array $collections, Persist } } + /** + * Get authors considering that database field can't accept + * more than 255 characters. + * + * @access private + * + * @param array $metadataAuthor + * + * @return string + */ + private function getAuthors(array $metadataAuthor): string + { + $authors = ''; + $delimiter = '; '; + $ellipsis = 'et al.'; + + $count = count($metadataAuthor); + + for ($i = 0; $i < $count; $i++) { + // Build the next part to add + $nextPart = ($i === 0 ? '' : $delimiter) . $metadataAuthor[$i]; + // Check if adding this part and ellipsis in future would exceed the character limit + if (strlen($authors . $nextPart . $delimiter . $ellipsis) > 255) { + // Add ellipsis and stop adding more authors + $authors .= $delimiter . $ellipsis; + break; + } + // Add the part to the main string + $authors .= $nextPart; + } + + return $authors; + } + /** * If owner is not set set but found by metadata, take it or take default library, if nothing found in database then create new owner. * From cfb46e8654121563344cbe864088233755252929 Mon Sep 17 00:00:00 2001 From: Michael Kubina Date: Tue, 21 May 2024 08:59:31 +0200 Subject: [PATCH 55/72] [FEATURE] Add support for ALTO v3 and v4 (#1117) Co-authored-by: Michael Kubina Co-authored-by: Bernd Fallert Co-authored-by: Stefan Weil Co-authored-by: Christos Sidiropoulos Co-authored-by: Sebastian Meyer --- Classes/Format/Alto.php | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/Classes/Format/Alto.php b/Classes/Format/Alto.php index e07dc8c6b..c358f1693 100644 --- a/Classes/Format/Alto.php +++ b/Classes/Format/Alto.php @@ -15,7 +15,7 @@ /** * Fulltext ALTO format class for the 'dlf' extension * - * ** This currently supports only ALTO 2.x ** + * ** This currently supports ALTO 2.x / 3.x / 4.x ** * * @package TYPO3 * @subpackage dlf @@ -36,7 +36,10 @@ class Alto implements \Kitodo\Dlf\Common\FulltextInterface public function getRawText(\SimpleXMLElement $xml): string { $rawText = ''; - $xml->registerXPathNamespace('alto', 'http://www.loc.gov/standards/alto/ns-v2#'); + + // register ALTO namespace depending on document + $this->registerAltoNamespace($xml); + // Get all (presumed) words of the text. $strings = $xml->xpath('./alto:Layout/alto:Page/alto:PrintSpace//alto:TextBlock/alto:TextLine/alto:String'); $words = []; @@ -68,7 +71,8 @@ public function getRawText(\SimpleXMLElement $xml): string */ public function getTextAsMiniOcr(\SimpleXMLElement $xml): string { - $xml->registerXPathNamespace('alto', 'http://www.loc.gov/standards/alto/ns-v2#'); + // register ALTO namespace depending on document + $this->registerAltoNamespace($xml); // get all text blocks $blocks = $xml->xpath('./alto:Layout/alto:Page/alto:PrintSpace//alto:TextBlock'); @@ -135,4 +139,24 @@ private function getCoordinates(\SimpleXMLElement $attributes): string { return (string) $attributes['HPOS'] . ' ' . (string) $attributes['VPOS'] . ' ' . (string) $attributes['WIDTH'] . ' ' . (string) $attributes['HEIGHT']; } + + /** + * This registers the necessary ALTO namespace for the current ALTO-XML + * + * @access private + * + * @param \SimpleXMLElement &$xml: The XML to register the namespace for + */ + private function registerAltoNamespace(\SimpleXMLElement &$xml) + { + $namespace = $xml->getDocNamespaces(); + + if (in_array('http://www.loc.gov/standards/alto/ns-v2#', $namespace, true)) { + $xml->registerXPathNamespace('alto', 'http://www.loc.gov/standards/alto/ns-v2#'); + } elseif (in_array('http://www.loc.gov/standards/alto/ns-v3#', $namespace, true)) { + $xml->registerXPathNamespace('alto', 'http://www.loc.gov/standards/alto/ns-v3#'); + } elseif (in_array('http://www.loc.gov/standards/alto/ns-v4#', $namespace, true)) { + $xml->registerXPathNamespace('alto', 'http://www.loc.gov/standards/alto/ns-v4#'); + } + } } From 3801b6f6dd9d82d6b67de2770940cac11d981568 Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Tue, 21 May 2024 09:04:25 +0200 Subject: [PATCH 56/72] [MAINTENANCE] Refactor metadata extraction (#1195) Co-authored-by: Sebastian Meyer --- Classes/Common/MetsDocument.php | 390 ++++++++++++++++++++++---------- 1 file changed, 268 insertions(+), 122 deletions(-) diff --git a/Classes/Common/MetsDocument.php b/Classes/Common/MetsDocument.php index e6e42737d..c8b0f5f6d 100644 --- a/Classes/Common/MetsDocument.php +++ b/Classes/Common/MetsDocument.php @@ -305,49 +305,44 @@ public function getLogicalStructure(string $id, bool $recursive = false): array */ protected function getLogicalStructureInfo(\SimpleXMLElement $structure, bool $recursive = false): array { - $attributes = []; - // Get attributes. - foreach ($structure->attributes() as $attribute => $value) { - $attributes[$attribute] = (string) $value; - } + $attributes = $structure->attributes(); // Extract identity information. - $details = []; - $details['id'] = $attributes['ID']; - $details['dmdId'] = (isset($attributes['DMDID']) ? $attributes['DMDID'] : ''); - $details['admId'] = (isset($attributes['ADMID']) ? $attributes['ADMID'] : ''); - $details['order'] = (isset($attributes['ORDER']) ? $attributes['ORDER'] : ''); - $details['label'] = (isset($attributes['LABEL']) ? $attributes['LABEL'] : ''); - $details['orderlabel'] = (isset($attributes['ORDERLABEL']) ? $attributes['ORDERLABEL'] : ''); - $details['contentIds'] = (isset($attributes['CONTENTIDS']) ? $attributes['CONTENTIDS'] : ''); - $details['volume'] = ''; + $details = [ + 'id' => (string) $attributes['ID'], + 'dmdId' => isset($attributes['DMDID']) ? (string) $attributes['DMDID'] : '', + 'admId' => isset($attributes['ADMID']) ? (string) $attributes['ADMID'] : '', + 'order' => isset($attributes['ORDER']) ? (string) $attributes['ORDER'] : '', + 'label' => isset($attributes['LABEL']) ? (string) $attributes['LABEL'] : '', + 'orderlabel' => isset($attributes['ORDERLABEL']) ? (string) $attributes['ORDERLABEL'] : '', + 'contentIds' => isset($attributes['CONTENTIDS']) ? (string) $attributes['CONTENTIDS'] : '', + 'volume' => '', + 'year' => '', + 'pagination' => '', + 'type' => isset($attributes['TYPE']) ? (string) $attributes['TYPE'] : '', + 'description' => '', + 'thumbnailId' => null, + 'files' => [], + ]; + // Set volume and year information only if no label is set and this is the toplevel structure element. - if ( - empty($details['label']) - && empty($details['orderlabel']) - ) { + if (empty($details['label']) && empty($details['orderlabel'])) { $metadata = $this->getMetadata($details['id']); - if (!empty($metadata['volume'][0])) { - $details['volume'] = $metadata['volume'][0]; - } - if (!empty($metadata['year'][0])) { - $details['year'] = $metadata['year'][0]; - } + $details['volume'] = $metadata['volume'][0] ?? ''; + $details['year'] = $metadata['year'][0] ?? ''; } - $details['pagination'] = ''; - $details['type'] = $attributes['TYPE']; + // add description for 3D objects if ($details['type'] == 'object') { $metadata = $this->getMetadata($details['id']); $details['description'] = $metadata['description'][0] ?? ''; } - $details['thumbnailId'] = ''; + // Load smLinks. $this->magicGetSmLinks(); // Load physical structure. $this->magicGetPhysicalStructure(); // Get the physical page or external file this structure element is pointing at. - $details['points'] = ''; // Is there a mptr node? if (count($structure->children('http://www.loc.gov/METS/')->mptr)) { // Yes. Get the file reference. @@ -370,7 +365,6 @@ protected function getLogicalStructureInfo(\SimpleXMLElement $structure, bool $r unset($details['thumbnailId']); } // Get the files this structure element is pointing at. - $details['files'] = []; $fileUse = $this->magicGetFileGrps(); // Get the file representations from fileSec node. foreach ($structure->children('http://www.loc.gov/METS/')->fptr as $fptr) { @@ -432,29 +426,78 @@ private function getThumbnail(string $id = '') */ public function getMetadata(string $id, int $cPid = 0): array { - // Make sure $cPid is a non-negative integer. - $cPid = max((int) $cPid, 0); - // If $cPid is not given, try to get it elsewhere. - if ( - !$cPid - && ($this->cPid || $this->pid) - ) { - // Retain current PID. - $cPid = ($this->cPid ? $this->cPid : $this->pid); - } elseif (!$cPid) { - $this->logger->warning('Invalid PID ' . $cPid . ' for metadata definitions'); + $cPid = $this->ensureValidPid($cPid); + + if ($cPid == 0) { + $this->logger->warning('Invalid PID for metadata definitions'); return []; } - // Get metadata from parsed metadata array if available. - if ( - !empty($this->metadataArray[$id]) - && $this->metadataArray[0] == $cPid - ) { - return $this->metadataArray[$id]; + + $metadata = $this->getMetadataFromArray($id, $cPid); + + if (empty($metadata)) { + return []; + } + + $metadata = $this->processMetadataSections($id, $cPid, $metadata); + + if (!empty($metadata)) { + $metadata = $this->setDefaultTitleAndDate($metadata); } - $metadata = $this->initializeMetadata('METS'); + return $metadata; + } + + /** + * Ensure that pId is valid. + * + * @access private + * + * @param integer $cPid + * + * @return integer + */ + private function ensureValidPid(int $cPid): int + { + $cPid = max($cPid, 0); + if ($cPid == 0 && ($this->cPid || $this->pid)) { + // Retain current PID. + $cPid = $this->cPid ?: $this->pid; + } + return $cPid; + } + + /** + * Get metadata from array. + * + * @access private + * + * @param string $id + * @param integer $cPid + * + * @return array + */ + private function getMetadataFromArray(string $id, int $cPid): array + { + if (!empty($this->metadataArray[$id]) && $this->metadataArray[0] == $cPid) { + return $this->metadataArray[$id]; + } + return $this->initializeMetadata('METS'); + } + /** + * Process metadata sections. + * + * @access private + * + * @param string $id + * @param integer $cPid + * @param array $metadata + * + * @return array + */ + private function processMetadataSections(string $id, int $cPid, array $metadata): array + { $mdIds = $this->getMetadataIds($id); if (empty($mdIds)) { // There is no metadata section for this structure node. @@ -465,109 +508,212 @@ public function getMetadata(string $id, int $cPid = 0): array // Load available metadata formats and metadata sections. $this->loadFormats(); $this->magicGetMdSec(); - // Get the structure's type. - if (!empty($this->logicalUnits[$id])) { - $metadata['type'] = [$this->logicalUnits[$id]['type']]; - } else { - $struct = $this->mets->xpath('./mets:structMap[@TYPE="LOGICAL"]//mets:div[@ID="' . $id . '"]/@TYPE'); - if (!empty($struct)) { - $metadata['type'] = [(string) $struct[0]]; - } - } + + $metadata['type'] = $this->getLogicalUnitType($id); + foreach ($mdIds as $dmdId) { $mdSectionType = $this->mdSec[$dmdId]['section']; - // To preserve behavior of previous Kitodo versions, extract metadata only from first supported dmdSec - // However, we want to extract, for example, all techMD sections (VIDEOMD, AUDIOMD) if ($mdSectionType === 'dmdSec' && isset($hasMetadataSection['dmdSec'])) { continue; } - // Continue searching for supported metadata with next @DMDID if the current one is not supported - if (!$this->extractMetadataIfTypeSupported($dmdId, $mdSectionType, $metadata)) { + if (!$this->extractAndProcessMetadata($dmdId, $mdSectionType, $metadata, $cPid, $hasMetadataSection)) { continue; } - $additionalMetadata = $this->getAdditionalMetadataFromDatabase((int) $cPid, $dmdId); - // We need a \DOMDocument here, because SimpleXML doesn't support XPath functions properly. - $domNode = dom_import_simplexml($this->mdSec[$dmdId]['xml']); - $domXPath = new \DOMXPath($domNode->ownerDocument); - $this->registerNamespaces($domXPath); - // OK, now make the XPath queries. - foreach ($additionalMetadata as $resArray) { - // Set metadata field's value(s). - if ( - $resArray['format'] > 0 - && !empty($resArray['xpath']) - && ($values = $domXPath->evaluate($resArray['xpath'], $domNode)) - ) { - if ( - $values instanceof \DOMNodeList - && $values->length > 0 - ) { - $metadata[$resArray['index_name']] = []; - foreach ($values as $value) { - $metadata[$resArray['index_name']][] = trim((string) $value->nodeValue); - } - } elseif (!($values instanceof \DOMNodeList)) { - $metadata[$resArray['index_name']] = [trim((string) $values)]; - } - } - // Set default value if applicable. - if ( - empty($metadata[$resArray['index_name']][0]) - && strlen($resArray['default_value']) > 0 - ) { - $metadata[$resArray['index_name']] = [$resArray['default_value']]; - } - // Set sorting value if applicable. - if ( - !empty($metadata[$resArray['index_name']]) - && $resArray['is_sortable'] - ) { - if ( - $resArray['format'] > 0 - && !empty($resArray['xpath_sorting']) - ) { - $values = $domXPath->evaluate($resArray['xpath_sorting'], $domNode); - if ( - $values instanceof \DOMNodeList - && $values->length > 0 - ) { - $metadata[$resArray['index_name'] . '_sorting'][0] = trim((string) $values->item(0)->nodeValue); - } elseif (!($values instanceof \DOMNodeList)) { - $metadata[$resArray['index_name'] . '_sorting'][0] = trim((string) $values); - } - } - if (empty($metadata[$resArray['index_name'] . '_sorting'][0])) { - $metadata[$resArray['index_name'] . '_sorting'][0] = $metadata[$resArray['index_name']][0]; - } + $hasMetadataSection[$mdSectionType] = true; + } + + // Files are not expected to reference a dmdSec + if (isset($this->fileInfos[$id]) || isset($hasMetadataSection['dmdSec'])) { + return $metadata; + } else { + $this->logger->warning('No supported descriptive metadata found for logical structure with @ID "' . $id . '"'); + return []; + } + } + + /** + * Get logical unit type. + * + * @access private + * + * @param string $id + * + * @return array + */ + private function getLogicalUnitType(string $id): array + { + if (!empty($this->logicalUnits[$id])) { + return [$this->logicalUnits[$id]['type']]; + } else { + $struct = $this->mets->xpath('./mets:structMap[@TYPE="LOGICAL"]//mets:div[@ID="' . $id . '"]/@TYPE'); + if (!empty($struct)) { + return [(string) $struct[0]]; + } + } + return []; + } + + /** + * Extract and process metadata. + * + * @access private + * + * @param string $dmdId + * @param string $mdSectionType + * @param array $metadata + * @param integer $cPid + * @param array $hasMetadataSection + * + * @return boolean + */ + private function extractAndProcessMetadata(string $dmdId, string $mdSectionType, array &$metadata, int $cPid, array $hasMetadataSection): bool + { + if ($mdSectionType === 'dmdSec' && isset($hasMetadataSection['dmdSec'])) { + return true; + } + + $metadataExtracted = $this->extractMetadataIfTypeSupported($dmdId, $mdSectionType, $metadata); + + if (!$metadataExtracted) { + return false; + } + + $additionalMetadata = $this->getAdditionalMetadataFromDatabase($cPid, $dmdId); + // We need a \DOMDocument here, because SimpleXML doesn't support XPath functions properly. + $domNode = dom_import_simplexml($this->mdSec[$dmdId]['xml']); + $domXPath = new \DOMXPath($domNode->ownerDocument); + $this->registerNamespaces($domXPath); + + $this->processAdditionalMetadata($additionalMetadata, $domXPath, $domNode, $metadata); + + return true; + } + + /** + * Process additional metadata. + * + * @access private + * + * @param array $additionalMetadata + * @param \DOMXPath $domXPath + * @param \DOMElement $domNode + * @param array $metadata + * + * @return void + */ + private function processAdditionalMetadata(array $additionalMetadata, \DOMXPath $domXPath, \DOMElement $domNode, array &$metadata): void + { + foreach ($additionalMetadata as $resArray) { + $this->setMetadataFieldValues($resArray, $domXPath, $domNode, $metadata); + $this->setDefaultMetadataValue($resArray, $metadata); + $this->setSortableMetadataValue($resArray, $domXPath, $domNode, $metadata); + } + } + + /** + * Set metadata field values. + * + * @access private + * + * @param array $resArray + * @param \DOMXPath $domXPath + * @param \DOMElement $domNode + * @param array $metadata + * + * @return void + */ + private function setMetadataFieldValues(array $resArray, \DOMXPath $domXPath, \DOMElement $domNode, array &$metadata): void + { + if ($resArray['format'] > 0 && !empty($resArray['xpath'])) { + $values = $domXPath->evaluate($resArray['xpath'], $domNode); + if ($values instanceof \DOMNodeList && $values->length > 0) { + $metadata[$resArray['index_name']] = []; + foreach ($values as $value) { + $metadata[$resArray['index_name']][] = trim((string) $value->nodeValue); } + } elseif (!($values instanceof \DOMNodeList)) { + $metadata[$resArray['index_name']] = [trim((string) $values)]; } + } + } - $hasMetadataSection[$mdSectionType] = true; + /** + * Set default metadata value. + * + * @access private + * + * @param array $resArray + * @param array $metadata + * + * @return void + */ + private function setDefaultMetadataValue(array $resArray, array &$metadata): void + { + if (empty($metadata[$resArray['index_name']][0]) && strlen($resArray['default_value']) > 0) { + $metadata[$resArray['index_name']] = [$resArray['default_value']]; } + } + + /** + * Set sortable metadata value. + * + * @access private + * + * @param array $resArray + * @param \DOMXPath $domXPath + * @param \DOMElement $domNode + * @param array $metadata + * + * @return void + */ + private function setSortableMetadataValue(array $resArray, \DOMXPath $domXPath, \DOMElement $domNode, array &$metadata): void + { + if (!empty($metadata[$resArray['index_name']]) && $resArray['is_sortable']) { + if ($resArray['format'] > 0 && !empty($resArray['xpath_sorting'])) { + $values = $domXPath->evaluate($resArray['xpath_sorting'], $domNode); + if ($values instanceof \DOMNodeList && $values->length > 0) { + $metadata[$resArray['index_name'] . '_sorting'][0] = trim((string) $values->item(0)->nodeValue); + } elseif (!($values instanceof \DOMNodeList)) { + $metadata[$resArray['index_name'] . '_sorting'][0] = trim((string) $values); + } + } + if (empty($metadata[$resArray['index_name'] . '_sorting'][0])) { + $metadata[$resArray['index_name'] . '_sorting'][0] = $metadata[$resArray['index_name']][0]; + } + } + } + + /** + * Set default title and date if those metadata is not set. + * + * @access private + * + * @param array $metadata + * + * @return array + */ + private function setDefaultTitleAndDate(array $metadata): array + { // Set title to empty string if not present. if (empty($metadata['title'][0])) { $metadata['title'][0] = ''; $metadata['title_sorting'][0] = ''; } + // Set title_sorting to title as default. if (empty($metadata['title_sorting'][0])) { $metadata['title_sorting'][0] = $metadata['title'][0]; } + // Set date to empty string if not present. if (empty($metadata['date'][0])) { $metadata['date'][0] = ''; } - // Files are not expected to reference a dmdSec - if (isset($this->fileInfos[$id]) || isset($hasMetadataSection['dmdSec'])) { - return $metadata; - } else { - $this->logger->warning('No supported descriptive metadata found for logical structure with @ID "' . $id . '"'); - return []; - } + return $metadata; } /** From 75504d863f49aabbd5698b32b7a9cdec393e4313 Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Tue, 21 May 2024 09:07:19 +0200 Subject: [PATCH 57/72] [MAINTENANCE] Replace registry with cache (#1196) Co-authored-by: Sebastian Meyer --- Classes/Command/ReindexCommand.php | 4 ++-- Classes/Common/AbstractDocument.php | 15 ++++----------- Classes/Common/IiifManifest.php | 1 - Classes/Common/MetsDocument.php | 1 - 4 files changed, 6 insertions(+), 15 deletions(-) diff --git a/Classes/Command/ReindexCommand.php b/Classes/Command/ReindexCommand.php index 5ebdc9213..bcb2da4c6 100644 --- a/Classes/Command/ReindexCommand.php +++ b/Classes/Command/ReindexCommand.php @@ -181,8 +181,8 @@ protected function execute(InputInterface $input, OutputInterface $output): int // add to index Indexer::add($document, $this->documentRepository); } - // Clear document registry to prevent memory exhaustion. - AbstractDocument::clearRegistry(); + // Clear document cache to prevent memory exhaustion. + AbstractDocument::clearDocumentCache(); } $io->success('All done!'); diff --git a/Classes/Common/AbstractDocument.php b/Classes/Common/AbstractDocument.php index 83a315091..afa809479 100644 --- a/Classes/Common/AbstractDocument.php +++ b/Classes/Common/AbstractDocument.php @@ -211,13 +211,6 @@ abstract class AbstractDocument */ protected string $recordId = ''; - /** - * @access protected - * @static - * @var array (AbstractDocument) This holds the singleton object of the document - */ - protected static array $registry = []; - /** * @access protected * @var int This holds the UID of the root document or zero if not multi-volumed @@ -598,7 +591,7 @@ public static function &getInstance(string $location, array $settings = [], bool } /** - * This clears the static registry to prevent memory exhaustion + * Clear document cache. * * @access public * @@ -606,10 +599,10 @@ public static function &getInstance(string $location, array $settings = [], bool * * @return void */ - public static function clearRegistry(): void + public static function clearDocumentCache(): void { - // Reset registry array. - self::$registry = []; + $cache = GeneralUtility::makeInstance(CacheManager::class)->getCache('tx_dlf_doc'); + $cache->flush(); } /** diff --git a/Classes/Common/IiifManifest.php b/Classes/Common/IiifManifest.php index 27e1ff6ed..3400f74cf 100644 --- a/Classes/Common/IiifManifest.php +++ b/Classes/Common/IiifManifest.php @@ -58,7 +58,6 @@ * @property array $rawTextArray this holds the documents' raw text pages with their corresponding structMap//div's ID (METS) or Range / Manifest / Sequence ID (IIIF) as array key * @property-read bool $ready Is the document instantiated successfully? * @property-read string $recordId the METS file's / IIIF manifest's record identifier - * @property array $registry this holds the singleton object of the document * @property-read int $rootId this holds the UID of the root document or zero if not multi-volumed * @property-read array $smLinks this holds the smLinks between logical and physical structMap * @property bool $smLinksLoaded flag with information if the smLinks are loaded diff --git a/Classes/Common/MetsDocument.php b/Classes/Common/MetsDocument.php index c8b0f5f6d..3fbb125a4 100644 --- a/Classes/Common/MetsDocument.php +++ b/Classes/Common/MetsDocument.php @@ -45,7 +45,6 @@ * @property array $rawTextArray this holds the documents' raw text pages with their corresponding structMap//div's ID (METS) or Range / Manifest / Sequence ID (IIIF) as array key * @property-read bool $ready Is the document instantiated successfully? * @property-read string $recordId the METS file's / IIIF manifest's record identifier - * @property array $registry this holds the singleton object of the document * @property-read int $rootId this holds the UID of the root document or zero if not multi-volumed * @property-read array $smLinks this holds the smLinks between logical and physical structMap * @property bool $smLinksLoaded flag with information if the smLinks are loaded From 87aa878e631f65e1c4c5366e7e43b5e0d59a7b40 Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Tue, 21 May 2024 09:14:51 +0200 Subject: [PATCH 58/72] [MAINTENANCE] Clear state of persistence manager to avoid memory exhaustion (#1197) Co-authored-by: Sebastian Meyer --- Classes/Command/BaseCommand.php | 20 +++++++++++++------- Classes/Command/ReindexCommand.php | 2 ++ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/Classes/Command/BaseCommand.php b/Classes/Command/BaseCommand.php index 7752a79aa..76e1a51d4 100644 --- a/Classes/Command/BaseCommand.php +++ b/Classes/Command/BaseCommand.php @@ -89,12 +89,18 @@ class BaseCommand extends Command */ protected ConfigurationManager $configurationManager; + /** + * @var PersistenceManager + */ + protected PersistenceManager $persistenceManager; + public function __construct( CollectionRepository $collectionRepository, DocumentRepository $documentRepository, LibraryRepository $libraryRepository, StructureRepository $structureRepository, - ConfigurationManager $configurationManager + ConfigurationManager $configurationManager, + PersistenceManager $persistenceManager ) { parent::__construct(); @@ -103,6 +109,7 @@ public function __construct( $this->libraryRepository = $libraryRepository; $this->structureRepository = $structureRepository; $this->configurationManager = $configurationManager; + $this->persistenceManager = $persistenceManager; } /** @@ -202,7 +209,7 @@ protected function saveToDatabase(Document $document): bool if ($doc === null) { return false; } - $persistenceManager = GeneralUtility::makeInstance(PersistenceManager::class); + $doc->cPid = $this->storagePid; $metadata = $doc->getToplevelMetadata($this->storagePid); @@ -227,7 +234,7 @@ protected function saveToDatabase(Document $document): bool $document->setStructure($structure); if (is_array($metadata['collection'])) { - $this->addCollections($document, $metadata['collection'], $persistenceManager); + $this->addCollections($document, $metadata['collection']); } // set identifiers @@ -268,7 +275,7 @@ protected function saveToDatabase(Document $document): bool $this->documentRepository->update($document); } - $persistenceManager->persistAll(); + $this->persistenceManager->persistAll(); return true; } @@ -324,11 +331,10 @@ protected function getParentDocumentUidForSaving(Document $document): int * * @param Document &$document * @param array $collections - * @param PersistenceManager $persistenceManager * * @return void */ - private function addCollections(Document &$document, array $collections, PersistenceManager $persistenceManager): void + private function addCollections(Document &$document, array $collections): void { foreach ($collections as $collection) { $documentCollection = $this->collectionRepository->findOneByIndexName($collection); @@ -343,7 +349,7 @@ private function addCollections(Document &$document, array $collections, Persist // add to CollectionRepository $this->collectionRepository->add($documentCollection); // persist collection to prevent duplicates - $persistenceManager->persistAll(); + $this->persistenceManager->persistAll(); } // add to document $document->addCollection($documentCollection); diff --git a/Classes/Command/ReindexCommand.php b/Classes/Command/ReindexCommand.php index bcb2da4c6..794709f41 100644 --- a/Classes/Command/ReindexCommand.php +++ b/Classes/Command/ReindexCommand.php @@ -183,6 +183,8 @@ protected function execute(InputInterface $input, OutputInterface $output): int } // Clear document cache to prevent memory exhaustion. AbstractDocument::clearDocumentCache(); + // Clear state of persistence manager to prevent memory exhaustion. + $this->persistenceManager->clearState(); } $io->success('All done!'); From 52e202216010a6e2daed27e260187fb4b050e8b1 Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Tue, 21 May 2024 09:19:30 +0200 Subject: [PATCH 59/72] [MAINTENANCE] Use intermediate variables to decrease accessing the array (#1200) Co-authored-by: Sebastian Meyer --- Classes/Common/MetsDocument.php | 41 ++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/Classes/Common/MetsDocument.php b/Classes/Common/MetsDocument.php index 3fbb125a4..3d2831d45 100644 --- a/Classes/Common/MetsDocument.php +++ b/Classes/Common/MetsDocument.php @@ -1193,15 +1193,16 @@ protected function magicGetPhysicalStructure(): array $fileUse = $this->magicGetFileGrps(); // Get the physical sequence's metadata. $physNode = $this->mets->xpath('./mets:structMap[@TYPE="PHYSICAL"]/mets:div[@TYPE="physSequence"]'); - $id = (string) $physNode[0]['ID']; - $this->physicalStructureInfo[$id]['id'] = (string) $physNode[0]['ID']; - $this->physicalStructureInfo[$id]['dmdId'] = (isset($physNode[0]['DMDID']) ? (string) $physNode[0]['DMDID'] : ''); - $this->physicalStructureInfo[$id]['admId'] = (isset($physNode[0]['ADMID']) ? (string) $physNode[0]['ADMID'] : ''); - $this->physicalStructureInfo[$id]['order'] = (isset($physNode[0]['ORDER']) ? (string) $physNode[0]['ORDER'] : ''); - $this->physicalStructureInfo[$id]['label'] = (isset($physNode[0]['LABEL']) ? (string) $physNode[0]['LABEL'] : ''); - $this->physicalStructureInfo[$id]['orderlabel'] = (isset($physNode[0]['ORDERLABEL']) ? (string) $physNode[0]['ORDERLABEL'] : ''); - $this->physicalStructureInfo[$id]['type'] = (string) $physNode[0]['TYPE']; - $this->physicalStructureInfo[$id]['contentIds'] = (isset($physNode[0]['CONTENTIDS']) ? (string) $physNode[0]['CONTENTIDS'] : ''); + $firstNode = $physNode[0]; + $id = (string) $firstNode['ID']; + $this->physicalStructureInfo[$id]['id'] = $id; + $this->physicalStructureInfo[$id]['dmdId'] = (isset($firstNode['DMDID']) ? (string) $firstNode['DMDID'] : ''); + $this->physicalStructureInfo[$id]['admId'] = (isset($firstNode['ADMID']) ? (string) $firstNode['ADMID'] : ''); + $this->physicalStructureInfo[$id]['order'] = (isset($firstNode['ORDER']) ? (string) $firstNode['ORDER'] : ''); + $this->physicalStructureInfo[$id]['label'] = (isset($firstNode['LABEL']) ? (string) $firstNode['LABEL'] : ''); + $this->physicalStructureInfo[$id]['orderlabel'] = (isset($firstNode['ORDERLABEL']) ? (string) $firstNode['ORDERLABEL'] : ''); + $this->physicalStructureInfo[$id]['type'] = (string) $firstNode['TYPE']; + $this->physicalStructureInfo[$id]['contentIds'] = (isset($firstNode['CONTENTIDS']) ? (string) $firstNode['CONTENTIDS'] : ''); // Get the file representations from fileSec node. foreach ($physNode[0]->children('http://www.loc.gov/METS/')->fptr as $fptr) { // Check if file has valid @USE attribute. @@ -1212,20 +1213,22 @@ protected function magicGetPhysicalStructure(): array // Build the physical elements' array from the physical structMap node. $elements = []; foreach ($elementNodes as $elementNode) { - $elements[(int) $elementNode['ORDER']] = (string) $elementNode['ID']; - $this->physicalStructureInfo[$elements[(int) $elementNode['ORDER']]]['id'] = (string) $elementNode['ID']; - $this->physicalStructureInfo[$elements[(int) $elementNode['ORDER']]]['dmdId'] = (isset($elementNode['DMDID']) ? (string) $elementNode['DMDID'] : ''); - $this->physicalStructureInfo[$elements[(int) $elementNode['ORDER']]]['admId'] = (isset($elementNode['ADMID']) ? (string) $elementNode['ADMID'] : ''); - $this->physicalStructureInfo[$elements[(int) $elementNode['ORDER']]]['order'] = (isset($elementNode['ORDER']) ? (string) $elementNode['ORDER'] : ''); - $this->physicalStructureInfo[$elements[(int) $elementNode['ORDER']]]['label'] = (isset($elementNode['LABEL']) ? (string) $elementNode['LABEL'] : ''); - $this->physicalStructureInfo[$elements[(int) $elementNode['ORDER']]]['orderlabel'] = (isset($elementNode['ORDERLABEL']) ? (string) $elementNode['ORDERLABEL'] : ''); - $this->physicalStructureInfo[$elements[(int) $elementNode['ORDER']]]['type'] = (string) $elementNode['TYPE']; - $this->physicalStructureInfo[$elements[(int) $elementNode['ORDER']]]['contentIds'] = (isset($elementNode['CONTENTIDS']) ? (string) $elementNode['CONTENTIDS'] : ''); + $id = (string) $elementNode['ID']; + $order = (int) $elementNode['ORDER']; + $elements[$order] = $id; + $this->physicalStructureInfo[$elements[$order]]['id'] = $id; + $this->physicalStructureInfo[$elements[$order]]['dmdId'] = (isset($elementNode['DMDID']) ? (string) $elementNode['DMDID'] : ''); + $this->physicalStructureInfo[$elements[$order]]['admId'] = (isset($elementNode['ADMID']) ? (string) $elementNode['ADMID'] : ''); + $this->physicalStructureInfo[$elements[$order]]['order'] = (isset($elementNode['ORDER']) ? (string) $elementNode['ORDER'] : ''); + $this->physicalStructureInfo[$elements[$order]]['label'] = (isset($elementNode['LABEL']) ? (string) $elementNode['LABEL'] : ''); + $this->physicalStructureInfo[$elements[$order]]['orderlabel'] = (isset($elementNode['ORDERLABEL']) ? (string) $elementNode['ORDERLABEL'] : ''); + $this->physicalStructureInfo[$elements[$order]]['type'] = (string) $elementNode['TYPE']; + $this->physicalStructureInfo[$elements[$order]]['contentIds'] = (isset($elementNode['CONTENTIDS']) ? (string) $elementNode['CONTENTIDS'] : ''); // Get the file representations from fileSec node. foreach ($elementNode->children('http://www.loc.gov/METS/')->fptr as $fptr) { // Check if file has valid @USE attribute. if (!empty($fileUse[(string) $fptr->attributes()->FILEID])) { - $this->physicalStructureInfo[$elements[(int) $elementNode['ORDER']]]['files'][$fileUse[(string) $fptr->attributes()->FILEID]] = (string) $fptr->attributes()->FILEID; + $this->physicalStructureInfo[$elements[$order]]['files'][$fileUse[(string) $fptr->attributes()->FILEID]] = (string) $fptr->attributes()->FILEID; } } } From 2a1bd982cfbc55118c86dd63f500bbc4aadddc32 Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Tue, 21 May 2024 09:25:01 +0200 Subject: [PATCH 60/72] [FEATURE] Add option for reindexing documents in chunks (#1201) Co-authored-by: Sebastian Meyer --- Classes/Command/ReindexCommand.php | 24 ++++++++++++++++ Documentation/User/Index.rst | 45 +++++++++++++++++++++++++++++- 2 files changed, 68 insertions(+), 1 deletion(-) diff --git a/Classes/Command/ReindexCommand.php b/Classes/Command/ReindexCommand.php index 794709f41..d1895d752 100644 --- a/Classes/Command/ReindexCommand.php +++ b/Classes/Command/ReindexCommand.php @@ -79,6 +79,18 @@ public function configure(): void 'a', InputOption::VALUE_NONE, 'Reindex all documents on the given page.' + ) + ->addOption( + 'index-limit', + 'il', + InputOption::VALUE_OPTIONAL, + 'Reindex the given amount of documents on the given page.' + ) + ->addOption( + 'index-start', + 'is', + InputOption::VALUE_OPTIONAL, + 'Reindex documents on the given page starting from the given value.' ); } @@ -145,6 +157,18 @@ protected function execute(InputInterface $input, OutputInterface $output): int if (!empty($input->getOption('all'))) { // Get all documents. $documents = $this->documentRepository->findAll(); + } elseif ( + !empty($input->getOption('index-limit')) + && $input->getOption('index-start') >= 0 + ) { + // Get all documents for given limit and start. + $documents = $this->documentRepository->findAll() + ->getQuery() + ->setLimit((int) $input->getOption('index-limit')) + ->setOffset((int) $input->getOption('index-start')) + ->execute(); + + $io->writeln($input->getOption('index-limit') . ' documents starting from ' . $input->getOption('index-start') . ' will be indexed.'); } elseif ( !empty($input->getOption('coll')) && !is_array($input->getOption('coll')) diff --git a/Documentation/User/Index.rst b/Documentation/User/Index.rst index 778206f31..f71a86480 100644 --- a/Documentation/User/Index.rst +++ b/Documentation/User/Index.rst @@ -129,13 +129,30 @@ With the command `kitodo:reindex` it is possible to reindex one or more collections or even to reindex all documents on the given page.:: # reindex collection with uid 1 on page 123 with solr core 'dlfCore1' + # short notation ./vendor/bin/typo3 kitodo:reindex -c 1 -p 123 -s dlfCore1 + # long notation + ./vendor/bin/typo3 kitodo:reindex --coll 1 --pid 123 --solr dlfCore1 # reindex collection with uid 1 and 4 on page 123 with solr core 'dlfCore1' + # short notation ./vendor/bin/typo3 kitodo:reindex -c 1,4 -p 123 -s dlfCore1 + # long notation + ./vendor/bin/typo3 kitodo:reindex --coll 1,4 --pid 123 --solr dlfCore1 - # reindex all documents on page 123 with solr core 'dlfCore1' + # reindex all documents on page 123 with solr core 'dlfCore1' (caution can result in memory problems for big amount of documents) + # short notation ./vendor/bin/typo3 kitodo:reindex -a -p 123 -s dlfCore1 + # long notation + ./vendor/bin/typo3 kitodo:reindex --all --pid 123 --solr dlfCore1 + + # reindex all documents on page 123 with solr core 'dlfCore1' in given range + # short notation + ./vendor/bin/typo3 kitodo:reindex -il 1000 -is 0 -p 123 -s dlfCore1 + ./vendor/bin/typo3 kitodo:reindex -il 1000 -is 1000 -p 123 -s dlfCore1 + # long notation + ./vendor/bin/typo3 kitodo:reindex --index-limit=1000 --index-start=0 --pid 123 ---solr dlfCore1 + ./vendor/bin/typo3 kitodo:reindex --index-limit=1000 --index-start=1000 --pid 123 --solr dlfCore1 .. t3-field-list-table:: @@ -201,6 +218,32 @@ collections or even to reindex all documents on the given page.:: :Example: 123 + - :Option: + ``-il|--index-limit`` + :Required: + no + :Description: + With this option, all documents in given limit for the given page will + be reindex. + + Used when it is expected that memory problems can appear due to the high + amount of documents. + :Example: + 1000 + + - :Option: + ``-is|--index-start`` + :Required: + no + :Description: + With this option, all documents starting from given value for the given page + will be reindex. + + Used when it is expected that memory problems can appear due to the high + amount of documents. + :Example: + 0 + - :Option: ``--dry-run`` :Required: From 543daf6cdec64cc4c194261172d5a91b0694e11a Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Tue, 21 May 2024 10:30:55 +0200 Subject: [PATCH 61/72] [MAINTENANCE] Remove unnecessary casts `$cPid` to `int` (#1198) --- Classes/Common/MetsDocument.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Classes/Common/MetsDocument.php b/Classes/Common/MetsDocument.php index 3d2831d45..020b3f2b4 100644 --- a/Classes/Common/MetsDocument.php +++ b/Classes/Common/MetsDocument.php @@ -1273,7 +1273,7 @@ protected function magicGetThumbnail(bool $forceReload = false): string || $forceReload ) { // Retain current PID. - $cPid = ($this->cPid ? $this->cPid : $this->pid); + $cPid = $this->cPid ?: $this->pid; if (!$cPid) { $this->logger->error('Invalid PID ' . $cPid . ' for structure definitions'); $this->thumbnailLoaded = true; @@ -1297,7 +1297,7 @@ protected function magicGetThumbnail(bool $forceReload = false): string ->select('tx_dlf_structures.thumbnail AS thumbnail') ->from('tx_dlf_structures') ->where( - $queryBuilder->expr()->eq('tx_dlf_structures.pid', (int) $cPid), + $queryBuilder->expr()->eq('tx_dlf_structures.pid', $cPid), $queryBuilder->expr()->eq('tx_dlf_structures.index_name', $queryBuilder->expr()->literal($metadata['type'][0])), Helper::whereExpression('tx_dlf_structures') ) From a7c80a8b930d7a23d2bd10a3ab0e534608b8a4a7 Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Tue, 21 May 2024 10:35:00 +0200 Subject: [PATCH 62/72] [MAINTENANCE] Remove unnecessary parentheses (#1199) Co-authored-by: Sebastian Meyer --- Classes/Common/MetsDocument.php | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Classes/Common/MetsDocument.php b/Classes/Common/MetsDocument.php index 020b3f2b4..7f317feb8 100644 --- a/Classes/Common/MetsDocument.php +++ b/Classes/Common/MetsDocument.php @@ -1196,13 +1196,13 @@ protected function magicGetPhysicalStructure(): array $firstNode = $physNode[0]; $id = (string) $firstNode['ID']; $this->physicalStructureInfo[$id]['id'] = $id; - $this->physicalStructureInfo[$id]['dmdId'] = (isset($firstNode['DMDID']) ? (string) $firstNode['DMDID'] : ''); - $this->physicalStructureInfo[$id]['admId'] = (isset($firstNode['ADMID']) ? (string) $firstNode['ADMID'] : ''); - $this->physicalStructureInfo[$id]['order'] = (isset($firstNode['ORDER']) ? (string) $firstNode['ORDER'] : ''); - $this->physicalStructureInfo[$id]['label'] = (isset($firstNode['LABEL']) ? (string) $firstNode['LABEL'] : ''); - $this->physicalStructureInfo[$id]['orderlabel'] = (isset($firstNode['ORDERLABEL']) ? (string) $firstNode['ORDERLABEL'] : ''); + $this->physicalStructureInfo[$id]['dmdId'] = isset($firstNode['DMDID']) ? (string) $firstNode['DMDID'] : ''; + $this->physicalStructureInfo[$id]['admId'] = isset($firstNode['ADMID']) ? (string) $firstNode['ADMID'] : ''; + $this->physicalStructureInfo[$id]['order'] = isset($firstNode['ORDER']) ? (string) $firstNode['ORDER'] : ''; + $this->physicalStructureInfo[$id]['label'] = isset($firstNode['LABEL']) ? (string) $firstNode['LABEL'] : ''; + $this->physicalStructureInfo[$id]['orderlabel'] = isset($firstNode['ORDERLABEL']) ? (string) $firstNode['ORDERLABEL'] : ''; $this->physicalStructureInfo[$id]['type'] = (string) $firstNode['TYPE']; - $this->physicalStructureInfo[$id]['contentIds'] = (isset($firstNode['CONTENTIDS']) ? (string) $firstNode['CONTENTIDS'] : ''); + $this->physicalStructureInfo[$id]['contentIds'] = isset($firstNode['CONTENTIDS']) ? (string) $firstNode['CONTENTIDS'] : ''; // Get the file representations from fileSec node. foreach ($physNode[0]->children('http://www.loc.gov/METS/')->fptr as $fptr) { // Check if file has valid @USE attribute. @@ -1217,13 +1217,13 @@ protected function magicGetPhysicalStructure(): array $order = (int) $elementNode['ORDER']; $elements[$order] = $id; $this->physicalStructureInfo[$elements[$order]]['id'] = $id; - $this->physicalStructureInfo[$elements[$order]]['dmdId'] = (isset($elementNode['DMDID']) ? (string) $elementNode['DMDID'] : ''); - $this->physicalStructureInfo[$elements[$order]]['admId'] = (isset($elementNode['ADMID']) ? (string) $elementNode['ADMID'] : ''); - $this->physicalStructureInfo[$elements[$order]]['order'] = (isset($elementNode['ORDER']) ? (string) $elementNode['ORDER'] : ''); - $this->physicalStructureInfo[$elements[$order]]['label'] = (isset($elementNode['LABEL']) ? (string) $elementNode['LABEL'] : ''); - $this->physicalStructureInfo[$elements[$order]]['orderlabel'] = (isset($elementNode['ORDERLABEL']) ? (string) $elementNode['ORDERLABEL'] : ''); + $this->physicalStructureInfo[$elements[$order]]['dmdId'] = isset($elementNode['DMDID']) ? (string) $elementNode['DMDID'] : ''; + $this->physicalStructureInfo[$elements[$order]]['admId'] = isset($elementNode['ADMID']) ? (string) $elementNode['ADMID'] : ''; + $this->physicalStructureInfo[$elements[$order]]['order'] = isset($elementNode['ORDER']) ? (string) $elementNode['ORDER'] : ''; + $this->physicalStructureInfo[$elements[$order]]['label'] = isset($elementNode['LABEL']) ? (string) $elementNode['LABEL'] : ''; + $this->physicalStructureInfo[$elements[$order]]['orderlabel'] = isset($elementNode['ORDERLABEL']) ? (string) $elementNode['ORDERLABEL'] : ''; $this->physicalStructureInfo[$elements[$order]]['type'] = (string) $elementNode['TYPE']; - $this->physicalStructureInfo[$elements[$order]]['contentIds'] = (isset($elementNode['CONTENTIDS']) ? (string) $elementNode['CONTENTIDS'] : ''); + $this->physicalStructureInfo[$elements[$order]]['contentIds'] = isset($elementNode['CONTENTIDS']) ? (string) $elementNode['CONTENTIDS'] : ''; // Get the file representations from fileSec node. foreach ($elementNode->children('http://www.loc.gov/METS/')->fptr as $fptr) { // Check if file has valid @USE attribute. From 80508d74425412609811e3ffa4df82e0fd176fbd Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Tue, 21 May 2024 17:46:40 +0200 Subject: [PATCH 63/72] [BUGFIX] Rename reindex options to be able use one letter shorts (#1203) --- Classes/Command/ReindexCommand.php | 10 +++++----- Documentation/User/Index.rst | 14 +++++++------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Classes/Command/ReindexCommand.php b/Classes/Command/ReindexCommand.php index d1895d752..edcb2dc77 100644 --- a/Classes/Command/ReindexCommand.php +++ b/Classes/Command/ReindexCommand.php @@ -82,13 +82,13 @@ public function configure(): void ) ->addOption( 'index-limit', - 'il', + 'l', InputOption::VALUE_OPTIONAL, 'Reindex the given amount of documents on the given page.' ) ->addOption( - 'index-start', - 'is', + 'index-begin', + 'b', InputOption::VALUE_OPTIONAL, 'Reindex documents on the given page starting from the given value.' ); @@ -165,10 +165,10 @@ protected function execute(InputInterface $input, OutputInterface $output): int $documents = $this->documentRepository->findAll() ->getQuery() ->setLimit((int) $input->getOption('index-limit')) - ->setOffset((int) $input->getOption('index-start')) + ->setOffset((int) $input->getOption('index-begin')) ->execute(); - $io->writeln($input->getOption('index-limit') . ' documents starting from ' . $input->getOption('index-start') . ' will be indexed.'); + $io->writeln($input->getOption('index-limit') . ' documents starting from ' . $input->getOption('index-begin') . ' will be indexed.'); } elseif ( !empty($input->getOption('coll')) && !is_array($input->getOption('coll')) diff --git a/Documentation/User/Index.rst b/Documentation/User/Index.rst index f71a86480..148cbc980 100644 --- a/Documentation/User/Index.rst +++ b/Documentation/User/Index.rst @@ -148,11 +148,11 @@ collections or even to reindex all documents on the given page.:: # reindex all documents on page 123 with solr core 'dlfCore1' in given range # short notation - ./vendor/bin/typo3 kitodo:reindex -il 1000 -is 0 -p 123 -s dlfCore1 - ./vendor/bin/typo3 kitodo:reindex -il 1000 -is 1000 -p 123 -s dlfCore1 + ./vendor/bin/typo3 kitodo:reindex -l 1000 -b 0 -p 123 -s dlfCore1 + ./vendor/bin/typo3 kitodo:reindex -l 1000 -b 1000 -p 123 -s dlfCore1 # long notation - ./vendor/bin/typo3 kitodo:reindex --index-limit=1000 --index-start=0 --pid 123 ---solr dlfCore1 - ./vendor/bin/typo3 kitodo:reindex --index-limit=1000 --index-start=1000 --pid 123 --solr dlfCore1 + ./vendor/bin/typo3 kitodo:reindex --index-limit=1000 --index-begin=0 --pid 123 ---solr dlfCore1 + ./vendor/bin/typo3 kitodo:reindex --index-limit=1000 --index-begin=1000 --pid 123 --solr dlfCore1 .. t3-field-list-table:: @@ -219,7 +219,7 @@ collections or even to reindex all documents on the given page.:: 123 - :Option: - ``-il|--index-limit`` + ``-l|--index-limit`` :Required: no :Description: @@ -232,11 +232,11 @@ collections or even to reindex all documents on the given page.:: 1000 - :Option: - ``-is|--index-start`` + ``-b|--index-begin`` :Required: no :Description: - With this option, all documents starting from given value for the given page + With this option, all documents beginning from given value for the given page will be reindex. Used when it is expected that memory problems can appear due to the high From 6f570be423974e358b4e21234798a6c51ec245a5 Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Tue, 21 May 2024 18:09:22 +0200 Subject: [PATCH 64/72] [BUGFIX] Clear state of the persistence memory after given chunk of data was indexed (#1202) Co-authored-by: Sebastian Meyer --- Classes/Command/ReindexCommand.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Classes/Command/ReindexCommand.php b/Classes/Command/ReindexCommand.php index edcb2dc77..ec84955a6 100644 --- a/Classes/Command/ReindexCommand.php +++ b/Classes/Command/ReindexCommand.php @@ -207,10 +207,11 @@ protected function execute(InputInterface $input, OutputInterface $output): int } // Clear document cache to prevent memory exhaustion. AbstractDocument::clearDocumentCache(); - // Clear state of persistence manager to prevent memory exhaustion. - $this->persistenceManager->clearState(); } + // Clear state of persistence manager to prevent memory exhaustion. + $this->persistenceManager->clearState(); + $io->success('All done!'); return BaseCommand::SUCCESS; From d72caae564584a501dbb6210c5d21be7983f2228 Mon Sep 17 00:00:00 2001 From: Bernd Fallert Date: Wed, 22 May 2024 12:19:56 +0200 Subject: [PATCH 65/72] [BUGFIX] fix incomplete renaming reindexing option "index-start" to "index-begin" (#1204) --- Classes/Command/ReindexCommand.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/Command/ReindexCommand.php b/Classes/Command/ReindexCommand.php index ec84955a6..7d8dc45f6 100644 --- a/Classes/Command/ReindexCommand.php +++ b/Classes/Command/ReindexCommand.php @@ -159,7 +159,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $documents = $this->documentRepository->findAll(); } elseif ( !empty($input->getOption('index-limit')) - && $input->getOption('index-start') >= 0 + && $input->getOption('index-begin') >= 0 ) { // Get all documents for given limit and start. $documents = $this->documentRepository->findAll() From de717f1601c8034e8904597fe845db153138dcd8 Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Thu, 23 May 2024 12:35:22 +0200 Subject: [PATCH 66/72] [MAINTENANCE] Replace `chr(31)` with `pack('C', 31)` (#1207) --- Classes/Command/BaseCommand.php | 2 +- Classes/Common/Indexer.php | 2 +- Classes/Format/Mods.php | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Classes/Command/BaseCommand.php b/Classes/Command/BaseCommand.php index 76e1a51d4..559790b52 100644 --- a/Classes/Command/BaseCommand.php +++ b/Classes/Command/BaseCommand.php @@ -222,7 +222,7 @@ protected function saveToDatabase(Document $document): bool // Remove appended "valueURI" from authors' names for storing in database. foreach ($metadata['author'] as $i => $author) { - $splitName = explode(chr(31), $author); + $splitName = explode(pack('C', 31), $author); $metadata['author'][$i] = $splitName[0]; } $document->setAuthor($this->getAuthors($metadata['author'])); diff --git a/Classes/Common/Indexer.php b/Classes/Common/Indexer.php index 59a652db7..d100fd4d4 100644 --- a/Classes/Common/Indexer.php +++ b/Classes/Common/Indexer.php @@ -608,7 +608,7 @@ private static function removeAppendsFromAuthor($authors) { if (is_array($authors)) { foreach ($authors as $i => $author) { - $splitName = explode(chr(31), $author); + $splitName = explode(pack('C', 31), $author); $authors[$i] = $splitName[0]; } } diff --git a/Classes/Format/Mods.php b/Classes/Format/Mods.php index eeb4f0b18..c62f3605c 100644 --- a/Classes/Format/Mods.php +++ b/Classes/Format/Mods.php @@ -177,7 +177,7 @@ private function getAuthorFromXml(array $authors, int $i): void } // Append "valueURI" to name using Unicode unit separator. if (isset($authors[$i]['valueURI'])) { - $this->metadata['author'][$i] .= chr(31) . (string) $authors[$i]['valueURI']; + $this->metadata['author'][$i] .= pack('C', 31) . (string) $authors[$i]['valueURI']; } } @@ -265,7 +265,7 @@ private function getHolderFromXml(array $holders, int $i): void $this->getHolderFromXmlDisplayForm($holders, $i); // Append "valueURI" to name using Unicode unit separator. if (isset($holders[$i]['valueURI'])) { - $this->metadata['holder'][$i] .= chr(31) . (string) $holders[$i]['valueURI']; + $this->metadata['holder'][$i] .= pack('C', 31) . (string) $holders[$i]['valueURI']; } } From 97fcb4fc7b6719eab5794d9546d53175bf2f15b7 Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Thu, 23 May 2024 12:37:41 +0200 Subject: [PATCH 67/72] [MAINTENANCE] Use Dotenv for accessing environmental variables (#1206) Co-authored-by: Sebastian Meyer --- Build/Test/docker-compose.yml | 3 ++- Build/Test/test.env | 1 + Tests/Functional/FunctionalTestCase.php | 4 ++++ composer.json | 3 ++- 4 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 Build/Test/test.env diff --git a/Build/Test/docker-compose.yml b/Build/Test/docker-compose.yml index 2f0e8c9c3..62f44bd25 100644 --- a/Build/Test/docker-compose.yml +++ b/Build/Test/docker-compose.yml @@ -85,7 +85,8 @@ services: typo3DatabaseUsername: root typo3DatabasePassword: funcp typo3DatabaseHost: ${DBMS} - dlfTestingSolrHost: solr + env_file: + - ./test.env working_dir: ${DLF_ROOT} extra_hosts: - "host.docker.internal:host-gateway" diff --git a/Build/Test/test.env b/Build/Test/test.env new file mode 100644 index 000000000..46288a044 --- /dev/null +++ b/Build/Test/test.env @@ -0,0 +1 @@ +dlfTestingSolrHost=solr \ No newline at end of file diff --git a/Tests/Functional/FunctionalTestCase.php b/Tests/Functional/FunctionalTestCase.php index 77a256a5d..966474d71 100644 --- a/Tests/Functional/FunctionalTestCase.php +++ b/Tests/Functional/FunctionalTestCase.php @@ -12,6 +12,7 @@ namespace Kitodo\Dlf\Tests\Functional; +use Dotenv\Dotenv; use GuzzleHttp\Client as HttpClient; use Kitodo\Dlf\Common\Solr\Solr; use Symfony\Component\Yaml\Yaml; @@ -121,6 +122,9 @@ public function setUp(): void protected function getDlfConfiguration() { + $dotenv = Dotenv::createImmutable('/home/runner/work/kitodo-presentation/kitodo-presentation/Build/Test/', 'test.env'); + $dotenv->load(); + return [ 'useExternalApisForMetadata' => 0, 'fileGrpImages' => 'DEFAULT,MAX', diff --git a/composer.json b/composer.json index def78b13f..ee1aa78f2 100644 --- a/composer.json +++ b/composer.json @@ -46,7 +46,8 @@ "typo3/cms-fluid": "^10.4.37|^11.5.35", "typo3/cms-fluid-styled-content": "^10.4.37|^11.5.35", "typo3/cms-frontend": "^10.4.37|^11.5.35", - "typo3/testing-framework": "^6.16.9" + "typo3/testing-framework": "^6.16.9", + "vlucas/phpdotenv": "^5.6.0" }, "replace": { "typo3-ter/dlf": "self.version" From 62fb085aca10632f0a432b67cd054caf471c0672 Mon Sep 17 00:00:00 2001 From: Christos Sidiropoulos Date: Thu, 23 May 2024 12:42:58 +0200 Subject: [PATCH 68/72] [BUGFIX] Add `languageUid` to `index_name` to make it unique (#1186) Signed-off-by: Christos Sidiropoulos Co-authored-by: Sebastian Meyer --- Classes/Controller/Backend/NewTenantController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/Controller/Backend/NewTenantController.php b/Classes/Controller/Backend/NewTenantController.php index 25fc19d4e..2e7ce82a8 100644 --- a/Classes/Controller/Backend/NewTenantController.php +++ b/Classes/Controller/Backend/NewTenantController.php @@ -272,7 +272,7 @@ public function addMetadataAction(): void $translatedRecord->setL18nParent($newRecord); $translatedRecord->_setProperty('_languageUid', $siteLanguage->getLanguageId()); $translatedRecord->setLabel($this->getLLL('metadata.' . $indexName, $siteLanguage->getTypo3Language(), $metadataLabels)); - $translatedRecord->setIndexName($indexName); + $translatedRecord->setIndexName($indexName . "_" . $siteLanguage->getLanguageId()); $translatedRecord->setWrap($newRecord->getWrap()); $this->metadataRepository->add($translatedRecord); From 2c961bbb646263836f6996c270ee8d042e622977 Mon Sep 17 00:00:00 2001 From: Christos Sidiropoulos Date: Thu, 23 May 2024 13:35:29 +0200 Subject: [PATCH 69/72] [BUGFIX] Add `sorting` key to metadata (#1184) Signed-off-by: Christos Sidiropoulos Co-authored-by: Sebastian Meyer --- .../Backend/NewTenantController.php | 1 + Resources/Private/Data/MetadataDefaults.php | 37 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/Classes/Controller/Backend/NewTenantController.php b/Classes/Controller/Backend/NewTenantController.php index 2e7ce82a8..4d39f8259 100644 --- a/Classes/Controller/Backend/NewTenantController.php +++ b/Classes/Controller/Backend/NewTenantController.php @@ -248,6 +248,7 @@ public function addMetadataAction(): void $newRecord->setIsFacet((int) $values['is_facet']); $newRecord->setIsListed((int) $values['is_listed']); $newRecord->setIndexAutocomplete((int) $values['index_autocomplete']); + $newRecord->setSorting((int) $values['sorting']); if (is_array($values['format'])) { foreach ($values['format'] as $format) { diff --git a/Resources/Private/Data/MetadataDefaults.php b/Resources/Private/Data/MetadataDefaults.php index f542da4b5..de8d572dd 100644 --- a/Resources/Private/Data/MetadataDefaults.php +++ b/Resources/Private/Data/MetadataDefaults.php @@ -31,6 +31,7 @@ 'is_facet' => 1, 'is_listed' => 1, 'index_autocomplete' => 0, + 'sorting' => 1, ], 'title' => [ 'format' => [ @@ -60,6 +61,7 @@ 'is_facet' => 0, 'is_listed' => 1, 'index_autocomplete' => 1, + 'sorting' => 2, ], 'volume' => [ 'format' => [ @@ -79,6 +81,7 @@ 'is_facet' => 0, 'is_listed' => 1, 'index_autocomplete' => 0, + 'sorting' => 3, ], 'date' => [ 'format' => [ @@ -98,6 +101,7 @@ 'is_facet' => 0, 'is_listed' => 1, 'index_autocomplete' => 0, + 'sorting' => 4, ], 'author' => [ 'format' => [ @@ -122,6 +126,7 @@ 'is_facet' => 1, 'is_listed' => 1, 'index_autocomplete' => 1, + 'sorting' => 5, ], 'place' => [ 'format' => [ @@ -146,6 +151,7 @@ 'is_facet' => 1, 'is_listed' => 1, 'index_autocomplete' => 0, + 'sorting' => 6, ], 'year' => [ 'format' => [ @@ -170,6 +176,7 @@ 'is_facet' => 1, 'is_listed' => 1, 'index_autocomplete' => 0, + 'sorting' => 7, ], 'language' => [ 'format' => [ @@ -189,6 +196,7 @@ 'is_facet' => 1, 'is_listed' => 0, 'index_autocomplete' => 0, + 'sorting' => 8, ], 'collection' => [ 'format' => [ @@ -218,6 +226,7 @@ 'is_facet' => 1, 'is_listed' => 0, 'index_autocomplete' => 0, + 'sorting' => 9, ], 'owner' => [ 'format' => [ @@ -247,6 +256,7 @@ 'is_facet' => 1, 'is_listed' => 0, 'index_autocomplete' => 0, + 'sorting' => 10, ], 'purl' => [ 'format' => [ @@ -271,6 +281,7 @@ 'is_facet' => 0, 'is_listed' => 0, 'index_autocomplete' => 0, + 'sorting' => 11, ], 'urn' => [ 'format' => [ @@ -300,6 +311,7 @@ 'is_facet' => 0, 'is_listed' => 0, 'index_autocomplete' => 0, + 'sorting' => 12, ], 'opac_id' => [ 'format' => [ @@ -324,6 +336,7 @@ 'is_facet' => 0, 'is_listed' => 0, 'index_autocomplete' => 0, + 'sorting' => 13, ], 'union_id' => [ 'format' => [ @@ -348,6 +361,7 @@ 'is_facet' => 0, 'is_listed' => 0, 'index_autocomplete' => 0, + 'sorting' => 14, ], 'record_id' => [ 'format' => [ @@ -377,6 +391,7 @@ 'is_facet' => 0, 'is_listed' => 0, 'index_autocomplete' => 0, + 'sorting' => 15, ], 'prod_id' => [ 'format' => [ @@ -406,6 +421,7 @@ 'is_facet' => 0, 'is_listed' => 0, 'index_autocomplete' => 0, + 'sorting' => 16, ], 'coordinates' => [ 'format' => [ @@ -425,6 +441,7 @@ 'is_facet' => 0, 'is_listed' => 0, 'index_autocomplete' => 0, + 'sorting' => 17, ], 'license' => [ 'format' => [ @@ -444,6 +461,7 @@ 'is_facet' => 1, 'is_listed' => 0, 'index_autocomplete' => 0, + 'sorting' => 18, ], 'terms' => [ 'format' => [ @@ -463,6 +481,7 @@ 'is_facet' => 1, 'is_listed' => 0, 'index_autocomplete' => 0, + 'sorting' => 19, ], 'restrictions' => [ 'format' => [ @@ -482,6 +501,7 @@ 'is_facet' => 0, 'is_listed' => 0, 'index_autocomplete' => 0, + 'sorting' => 20, ], 'out_of_print' => [ 'format' => [ @@ -501,6 +521,7 @@ 'is_facet' => 1, 'is_listed' => 0, 'index_autocomplete' => 0, + 'sorting' => 21, ], 'rights_info' => [ 'format' => [ @@ -520,6 +541,7 @@ 'is_facet' => 0, 'is_listed' => 0, 'index_autocomplete' => 0, + 'sorting' => 22, ], 'description' => [ 'format' => [ @@ -539,6 +561,7 @@ 'is_facet' => 0, 'is_listed' => 0, 'index_autocomplete' => 0, + 'sorting' => 23, ], 'identifier' => [ 'format' => [ @@ -558,6 +581,7 @@ 'is_facet' => 0, 'is_listed' => 0, 'index_autocomplete' => 0, + 'sorting' => 24, ], 'object_name' => [ 'format' => [ @@ -577,6 +601,7 @@ 'is_facet' => 0, 'is_listed' => 0, 'index_autocomplete' => 0, + 'sorting' => 25, ], 'object_alternative_names' => [ 'format' => [ @@ -596,6 +621,7 @@ 'is_facet' => 0, 'is_listed' => 0, 'index_autocomplete' => 0, + 'sorting' => 26, ], 'object_location' => [ 'format' => [ @@ -615,6 +641,7 @@ 'is_facet' => 0, 'is_listed' => 0, 'index_autocomplete' => 0, + 'sorting' => 27, ], 'geonames' => [ 'format' => [ @@ -634,6 +661,7 @@ 'is_facet' => 0, 'is_listed' => 0, 'index_autocomplete' => 0, + 'sorting' => 28, ], 'wikidata' => [ 'format' => [ @@ -653,6 +681,7 @@ 'is_facet' => 0, 'is_listed' => 0, 'index_autocomplete' => 0, + 'sorting' => 29, ], 'wikipedia' => [ 'format' => [ @@ -672,6 +701,7 @@ 'is_facet' => 0, 'is_listed' => 0, 'index_autocomplete' => 0, + 'sorting' => 30, ], 'identifier' => [ 'format' => [ @@ -691,6 +721,7 @@ 'is_facet' => 0, 'is_listed' => 0, 'index_autocomplete' => 0, + 'sorting' => 31, ], 'object_name' => [ 'format' => [ @@ -710,6 +741,7 @@ 'is_facet' => 0, 'is_listed' => 0, 'index_autocomplete' => 0, + 'sorting' => 32, ], 'object_alternative_names' => [ 'format' => [ @@ -729,6 +761,7 @@ 'is_facet' => 0, 'is_listed' => 0, 'index_autocomplete' => 0, + 'sorting' => 33, ], 'object_location' => [ 'format' => [ @@ -748,6 +781,7 @@ 'is_facet' => 0, 'is_listed' => 0, 'index_autocomplete' => 0, + 'sorting' => 34, ], 'geonames' => [ 'format' => [ @@ -767,6 +801,7 @@ 'is_facet' => 0, 'is_listed' => 0, 'index_autocomplete' => 0, + 'sorting' => 35, ], 'wikidata' => [ 'format' => [ @@ -786,6 +821,7 @@ 'is_facet' => 0, 'is_listed' => 0, 'index_autocomplete' => 0, + 'sorting' => 36, ], 'wikipedia' => [ 'format' => [ @@ -805,5 +841,6 @@ 'is_facet' => 0, 'is_listed' => 0, 'index_autocomplete' => 0, + 'sorting' => 37, ] ]; From 459f7227d9ae663eea87d06d0efd70d1aa95bbc9 Mon Sep 17 00:00:00 2001 From: Stefan Weil Date: Thu, 23 May 2024 14:02:40 +0200 Subject: [PATCH 70/72] [MAINTENANCE] Add support for PHP 8.3.x (#1172) Signed-off-by: Stefan Weil Co-authored-by: Sebastian Meyer --- Build/Test/docker-compose.yml | 8 ++++---- Build/Test/runTests.sh | 8 +++++--- Classes/Common/Solr/Solr.php | 30 ++++++++++++++++++------------ composer.json | 4 ++-- 4 files changed, 29 insertions(+), 21 deletions(-) diff --git a/Build/Test/docker-compose.yml b/Build/Test/docker-compose.yml index 62f44bd25..16ed46f24 100644 --- a/Build/Test/docker-compose.yml +++ b/Build/Test/docker-compose.yml @@ -25,21 +25,21 @@ services: extra_hosts: - "host.docker.internal:host-gateway" ports: - - "8000:8000" + - "${SERVER_PORT}:${SERVER_PORT}" # NOTE: For testing PageViewProxy, we need another web server web:8001 that - # can be requested from TYPO3 running on web:8000. + # can be requested from TYPO3 running on web:${SERVER_PORT}. # Setting PHP_CLI_SERVER_WORKERS wouldn't seem to work consistently. command: > /bin/sh -c " if [ ${PHP_XDEBUG_ON} -eq 0 ]; then XDEBUG_MODE=\"off\" \ - php -S web:8000 -t ${DLF_ROOT} ${DLF_ROOT}/Tests/routeFunctionalInstance.php & + php -S web:${SERVER_PORT} -t ${DLF_ROOT} ${DLF_ROOT}/Tests/routeFunctionalInstance.php & php -S web:8001 -t ${DLF_ROOT} else XDEBUG_MODE=\"debug,develop\" \ XDEBUG_TRIGGER=\"foo\" \ XDEBUG_CONFIG=\"client_port=${PHP_XDEBUG_PORT} client_host=host.docker.internal\" \ - php -S web:8000 -t ${DLF_ROOT} ${DLF_ROOT}/Tests/routeFunctionalInstance.php & + php -S web:${SERVER_PORT} -t ${DLF_ROOT} ${DLF_ROOT}/Tests/routeFunctionalInstance.php & php -S web:8001 -t ${DLF_ROOT} fi " diff --git a/Build/Test/runTests.sh b/Build/Test/runTests.sh index dc73a9a75..dd5ad53fe 100755 --- a/Build/Test/runTests.sh +++ b/Build/Test/runTests.sh @@ -24,6 +24,7 @@ setUpDockerComposeDotEnv() { echo "TEST_FILE=${TEST_FILE}" echo "PHP_XDEBUG_ON=${PHP_XDEBUG_ON}" echo "PHP_XDEBUG_PORT=${PHP_XDEBUG_PORT}" + echo "SERVER_PORT=${SERVER_PORT}" echo "DOCKER_PHP_IMAGE=${DOCKER_PHP_IMAGE}" echo "EXTRA_TEST_OPTIONS=${EXTRA_TEST_OPTIONS}" echo "SCRIPT_VERBOSE=${SCRIPT_VERBOSE}" @@ -188,6 +189,7 @@ DBMS="mariadb" PHP_VERSION="7.4" PHP_XDEBUG_ON=0 PHP_XDEBUG_PORT=9003 +SERVER_PORT=8000 EXTRA_TEST_OPTIONS="" SCRIPT_VERBOSE=0 PHPUNIT_WATCH=0 @@ -217,19 +219,19 @@ while getopts ":a:s:t:d:i:j:p:e:xy:whuv" OPT; do ;; i) MARIADB_VERSION=${OPTARG} - if ! [[ ${MARIADB_VERSION} =~ ^(10.1|10.2|10.3|10.4|10.5)$ ]]; then + if ! [[ ${MARIADB_VERSION} =~ ^(10.2|10.3|10.4|10.5|10.6|10.11)$ ]]; then INVALID_OPTIONS+=("${OPTARG}") fi ;; j) MYSQL_VERSION=${OPTARG} - if ! [[ ${MYSQL_VERSION} =~ ^(5.5|5.6|5.7|8.0)$ ]]; then + if ! [[ ${MYSQL_VERSION} =~ ^(5.7|8.0)$ ]]; then INVALID_OPTIONS+=("${OPTARG}") fi ;; p) PHP_VERSION=${OPTARG} - if ! [[ ${PHP_VERSION} =~ ^(7.4|8.0|8.1)$ ]]; then + if ! [[ ${PHP_VERSION} =~ ^(7.4|8.0|8.1|8.2|8.3)$ ]]; then INVALID_OPTIONS+=("${OPTARG}") fi ;; diff --git a/Classes/Common/Solr/Solr.php b/Classes/Common/Solr/Solr.php index 52c1ba081..9f2b0ce5c 100644 --- a/Classes/Common/Solr/Solr.php +++ b/Classes/Common/Solr/Solr.php @@ -21,6 +21,7 @@ use TYPO3\CMS\Core\Cache\CacheManager; use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Database\ConnectionPool; +use TYPO3\CMS\Core\EventDispatcher\EventDispatcher; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Core\Utility\MathUtility; @@ -579,19 +580,22 @@ public function __set(string $var, $value): void */ protected function __construct(?string $core) { + // Solarium requires different code for version 5 and 6. + $isSolarium5 = Client::checkExact('5'); // Get Solr connection parameters from configuration. $this->loadSolrConnectionInfo(); // Configure connection adapter. $adapter = GeneralUtility::makeInstance(Http::class); - // Todo: When updating to TYPO3 >=10.x and Solarium >=6.x - // the timeout must be set with the adapter instead of the - // endpoint (see below). - // $adapter->setTimeout($this->config['timeout']); + $adapter->setTimeout($this->config['timeout']); // Configure event dispatcher. - // Todo: When updating to TYPO3 >=10.x and Solarium >=6.x + if ($isSolarium5) { + $eventDispatcher = null; + } else { + // When updating to TYPO3 >=10.x and Solarium >=6.x // we have to provide an PSR-14 Event Dispatcher instead of // "null". - // $eventDispatcher = GeneralUtility::makeInstance(\TYPO3\CMS\Core\EventDispatcher\EventDispatcher::class); + $eventDispatcher = GeneralUtility::makeInstance(EventDispatcher::class); + } // Configure endpoint. $config = [ 'endpoint' => [ @@ -602,18 +606,20 @@ protected function __construct(?string $core) 'path' => '/' . $this->config['path'], 'core' => $core, 'username' => $this->config['username'], - 'password' => $this->config['password'], - 'timeout' => $this->config['timeout'] // Remove when upgrading to Solarium 6.x + 'password' => $this->config['password'] ] ] ]; // Instantiate Solarium\Client class. - $this->service = GeneralUtility::makeInstance(Client::class, $config); - $this->service->setAdapter($adapter); - // Todo: When updating to TYPO3 >=10.x and Solarium >=6.x + if ($isSolarium5) { + $this->service = GeneralUtility::makeInstance(Client::class, $config); + } else { + // When updating to TYPO3 >=10.x and Solarium >=6.x // $adapter and $eventDispatcher are mandatory arguments // of the \Solarium\Client constructor. - // $this->service = GeneralUtility::makeInstance(\Solarium\Client::class, $adapter, $eventDispatcher, $config); + $this->service = GeneralUtility::makeInstance(Client::class, $adapter, $eventDispatcher, $config); + } + $this->service->setAdapter($adapter); // Check if connection is established. $query = $this->service->createCoreAdmin(); $action = $query->createStatus(); diff --git a/composer.json b/composer.json index ee1aa78f2..51323ea8d 100644 --- a/composer.json +++ b/composer.json @@ -25,7 +25,7 @@ "docs": "https://docs.typo3.org/p/kitodo/presentation/main/en-us/" }, "require": { - "php": "^7.4", + "php": "7.4 - 8.3", "ext-curl": "*", "ext-dom": "*", "ext-json": "*", @@ -37,7 +37,7 @@ "typo3/cms-tstemplate": "^10.4.37|^11.5.35", "caseyamcl/phpoaipmh": "^3.3.1", "ubl/php-iiif-prezi-reader": "0.3.0", - "solarium/solarium": "^5.2.0" + "solarium/solarium": "5.2 - 6.3" }, "require-dev": { "phpstan/phpstan": "^1.10.58", From 0dd0bfef744d25fb8aebc65190422f7f90011069 Mon Sep 17 00:00:00 2001 From: Sebastian Meyer Date: Thu, 23 May 2024 14:38:34 +0200 Subject: [PATCH 71/72] Prepare Release 5.0 (#1210) --- Documentation/Administrator/Index.rst | 2 +- Documentation/Community/Index.rst | 6 +- README.md | 4 +- composer.json | 16 +- composer.lock | 1367 +++-- composer.lock-t3v10 | 8165 ------------------------- 6 files changed, 867 insertions(+), 8693 deletions(-) delete mode 100644 composer.lock-t3v10 diff --git a/Documentation/Administrator/Index.rst b/Documentation/Administrator/Index.rst index 2bb2acc53..159e66061 100644 --- a/Documentation/Administrator/Index.rst +++ b/Documentation/Administrator/Index.rst @@ -35,7 +35,7 @@ Please run the following commands in your webroot where the TYPO3 :file:`compose .. code-block:: shell - composer require kitodo/presentation:^4 + composer require kitodo/presentation:^5 #. Install and Activate the Extension diff --git a/Documentation/Community/Index.rst b/Documentation/Community/Index.rst index 28edf5cd8..143dbe141 100644 --- a/Documentation/Community/Index.rst +++ b/Documentation/Community/Index.rst @@ -20,7 +20,7 @@ All sources of Kitodo.Presentation and other Kitodo software are hosted at If you find a bug, please report it to the Kitodo.Presentation `issue tracker on GitHub `_. -Pull-requests are greatly appreciated! ;-) +Pull Requests are greatly appreciated! ;-) Mailing Lists ------------- @@ -31,10 +31,10 @@ lists of Kitodo: * Community mailing list helps on any questions about installation and usage of the software. Its address is kitodo-community@kitodo.org. The list archive - can be found at https://maillist.slub-dresden.de/pipermail/kitodo-community/ + can be found at https://maillist.slub-dresden.de/mailman3/postorius/lists/kitodo-community.kitodo.org/ * Developer mailing list discusses implementation details. Its address is kitodo-developer@kitodo.org. The list archive can be found at - https://maillist.slub-dresden.de/pipermail/kitodo-developer/ + https://maillist.slub-dresden.de/mailman3/postorius/lists/kitodo-developer.kitodo.org/ Please write to the lists in English or German. diff --git a/README.md b/README.md index ef6536b27..dc7a17fcb 100644 --- a/README.md +++ b/README.md @@ -18,8 +18,8 @@ Currently **TYPO3 10.4 ELTS** and **TYPO3 11.5 LTS** is supported with the follo | Component | Constraints for 10 LTS | Constraints for 11 LTS | | ----------------------- | ---------------------- | ---------------------- | -| TYPO3 | 10.4.43+ | 11.5.35+ | -| PHP | 7.4.33 | 7.4.33 | +| TYPO3 | 10.4.45+ (ELTS) | 11.5.37+ | +| PHP | 7.4.x | 7.4.x - 8.3.x | | MySQL | 5.7.x - 8.0.x | 5.7.9 - 8.0.x | | MariaDB | 10.2.7 - 10.11.x | 10.2.7 - 10.11.x | | Apache Solr | 8.x | 8.x | diff --git a/composer.json b/composer.json index 51323ea8d..e021aa535 100644 --- a/composer.json +++ b/composer.json @@ -32,20 +32,20 @@ "ext-libxml": "*", "ext-openssl": "*", "ext-simplexml": "*", - "typo3/cms-core": "^10.4.37|^11.5.35", - "typo3/cms-extbase": "^10.4.37|^11.5.35", - "typo3/cms-tstemplate": "^10.4.37|^11.5.35", + "typo3/cms-core": "^10.4.37|^11.5.37", + "typo3/cms-extbase": "^10.4.37|^11.5.37", + "typo3/cms-tstemplate": "^10.4.37|^11.5.37", "caseyamcl/phpoaipmh": "^3.3.1", "ubl/php-iiif-prezi-reader": "0.3.0", "solarium/solarium": "5.2 - 6.3" }, "require-dev": { - "phpstan/phpstan": "^1.10.58", + "phpstan/phpstan": "^1.11.1", "spatie/phpunit-watcher": "^1.23.6", - "typo3/cms-backend": "^10.4.37|^11.5.35", - "typo3/cms-fluid": "^10.4.37|^11.5.35", - "typo3/cms-fluid-styled-content": "^10.4.37|^11.5.35", - "typo3/cms-frontend": "^10.4.37|^11.5.35", + "typo3/cms-backend": "^10.4.37|^11.5.37", + "typo3/cms-fluid": "^10.4.37|^11.5.37", + "typo3/cms-fluid-styled-content": "^10.4.37|^11.5.37", + "typo3/cms-frontend": "^10.4.37|^11.5.37", "typo3/testing-framework": "^6.16.9", "vlucas/phpdotenv": "^5.6.0" }, diff --git a/composer.lock b/composer.lock index c79a18a53..e174632ea 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": "bb30465fb94afd5de16d054918739002", + "content-hash": "bd3bfc47ff15cf3a39b881512541048a", "packages": [ { "name": "bacon/bacon-qr-code", @@ -865,25 +865,25 @@ }, { "name": "enshrined/svg-sanitize", - "version": "0.15.4", + "version": "0.18.0", "source": { "type": "git", "url": "https://github.com/darylldoyle/svg-sanitizer.git", - "reference": "e50b83a2f1f296ca61394fe88fbfe3e896a84cf4" + "reference": "6a2c069dab3843ca4d887ff09c972fc7033888d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/darylldoyle/svg-sanitizer/zipball/e50b83a2f1f296ca61394fe88fbfe3e896a84cf4", - "reference": "e50b83a2f1f296ca61394fe88fbfe3e896a84cf4", + "url": "https://api.github.com/repos/darylldoyle/svg-sanitizer/zipball/6a2c069dab3843ca4d887ff09c972fc7033888d0", + "reference": "6a2c069dab3843ca4d887ff09c972fc7033888d0", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", - "php": "^7.0 || ^8.0" + "php": "^5.6 || ^7.0 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^6.5 || ^8.5" + "phpunit/phpunit": "^5.7 || ^6.5 || ^8.5" }, "type": "library", "autoload": { @@ -904,9 +904,9 @@ "description": "An SVG sanitizer for PHP", "support": { "issues": "https://github.com/darylldoyle/svg-sanitizer/issues", - "source": "https://github.com/darylldoyle/svg-sanitizer/tree/0.15.4" + "source": "https://github.com/darylldoyle/svg-sanitizer/tree/0.18.0" }, - "time": "2022-02-21T09:13:59+00:00" + "time": "2024-02-22T17:51:05+00:00" }, { "name": "flow/jsonpath", @@ -1279,31 +1279,90 @@ ], "time": "2023-12-03T20:05:35+00:00" }, + { + "name": "halaxa/json-machine", + "version": "1.1.4", + "source": { + "type": "git", + "url": "https://github.com/halaxa/json-machine.git", + "reference": "5147f38f74d7ab3e27733e3f3bdabbd2fd28e3fa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/halaxa/json-machine/zipball/5147f38f74d7ab3e27733e3f3bdabbd2fd28e3fa", + "reference": "5147f38f74d7ab3e27733e3f3bdabbd2fd28e3fa", + "shasum": "" + }, + "require": { + "php": "7.0 - 8.3" + }, + "require-dev": { + "ext-json": "*", + "friendsofphp/php-cs-fixer": "^3.0", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8.0" + }, + "suggest": { + "ext-json": "To run JSON Machine out of the box without custom decoders.", + "guzzlehttp/guzzle": "To run example with GuzzleHttp" + }, + "type": "library", + "autoload": { + "psr-4": { + "JsonMachine\\": "src/" + }, + "exclude-from-classmap": [ + "src/autoloader.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Filip Halaxa", + "email": "filip@halaxa.cz" + } + ], + "description": "Efficient, easy-to-use and fast JSON pull parser", + "support": { + "issues": "https://github.com/halaxa/json-machine/issues", + "source": "https://github.com/halaxa/json-machine/tree/1.1.4" + }, + "funding": [ + { + "url": "https://ko-fi.com/G2G57KTE4", + "type": "other" + } + ], + "time": "2023-11-28T21:12:40+00:00" + }, { "name": "lolli42/finediff", - "version": "1.0.3", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/lolli42/FineDiff.git", - "reference": "8d535de757062fed8412833f5eede7064595ca5b" + "reference": "784ade1515ba9f56d943a6a551c96073f9858b85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lolli42/FineDiff/zipball/8d535de757062fed8412833f5eede7064595ca5b", - "reference": "8d535de757062fed8412833f5eede7064595ca5b", + "url": "https://api.github.com/repos/lolli42/FineDiff/zipball/784ade1515ba9f56d943a6a551c96073f9858b85", + "reference": "784ade1515ba9f56d943a6a551c96073f9858b85", "shasum": "" }, "require": { - "php": ">=7.2.0", - "symfony/polyfill-mbstring": "^1.23" + "ext-mbstring": "*", + "php": ">=8.2" }, "replace": { "cogpowered/finediff": "*" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.4", - "phpstan/phpstan": "^1.9.14", - "phpunit/phpunit": "^8.5.33 || ^9.6.11 || ^10.3.2" + "friendsofphp/php-cs-fixer": "^3.49.0", + "phpstan/phpstan": "^1.10.57", + "phpunit/phpunit": "^10.5.10 || ^11.0.2" }, "type": "library", "autoload": { @@ -1340,22 +1399,22 @@ ], "support": { "issues": "https://github.com/lolli42/FineDiff/issues", - "source": "https://github.com/lolli42/FineDiff/tree/1.0.3" + "source": "https://github.com/lolli42/FineDiff/tree/1.1.0" }, - "time": "2024-02-06T13:56:20+00:00" + "time": "2024-02-06T15:34:02+00:00" }, { "name": "masterminds/html5", - "version": "2.8.1", + "version": "2.9.0", "source": { "type": "git", "url": "https://github.com/Masterminds/html5-php.git", - "reference": "f47dcf3c70c584de14f21143c55d9939631bc6cf" + "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f47dcf3c70c584de14f21143c55d9939631bc6cf", - "reference": "f47dcf3c70c584de14f21143c55d9939631bc6cf", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", + "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", "shasum": "" }, "require": { @@ -1363,7 +1422,7 @@ "php": ">=5.3.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8" + "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9" }, "type": "library", "extra": { @@ -1407,27 +1466,27 @@ ], "support": { "issues": "https://github.com/Masterminds/html5-php/issues", - "source": "https://github.com/Masterminds/html5-php/tree/2.8.1" + "source": "https://github.com/Masterminds/html5-php/tree/2.9.0" }, - "time": "2023-05-10T11:58:31+00:00" + "time": "2024-03-31T07:05:07+00:00" }, { "name": "nikic/php-parser", - "version": "v4.18.0", + "version": "v4.19.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999" + "reference": "4e1b88d21c69391150ace211e9eaf05810858d0b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999", - "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4e1b88d21c69391150ace211e9eaf05810858d0b", + "reference": "4e1b88d21c69391150ace211e9eaf05810858d0b", "shasum": "" }, "require": { "ext-tokenizer": "*", - "php": ">=7.0" + "php": ">=7.1" }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", @@ -1463,9 +1522,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.18.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.1" }, - "time": "2023-12-10T21:03:43+00:00" + "time": "2024-03-17T08:10:35+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -1522,28 +1581,35 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "5.3.0", + "version": "5.4.1", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" + "reference": "9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c", + "reference": "9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c", "shasum": "" }, "require": { + "doctrine/deprecations": "^1.1", "ext-filter": "*", - "php": "^7.2 || ^8.0", + "php": "^7.4 || ^8.0", "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", + "phpdocumentor/type-resolver": "^1.7", + "phpstan/phpdoc-parser": "^1.7", "webmozart/assert": "^1.9.1" }, "require-dev": { - "mockery/mockery": "~1.3.2", - "psalm/phar": "^4.8" + "mockery/mockery": "~1.3.5", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-webmozart-assert": "^1.2", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^5.13" }, "type": "library", "extra": { @@ -1567,33 +1633,33 @@ }, { "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" + "email": "opensource@ijaap.nl" } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", "support": { "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.4.1" }, - "time": "2021-10-19T17:43:47+00:00" + "time": "2024-05-21T05:55:05+00:00" }, { "name": "phpdocumentor/type-resolver", - "version": "1.8.0", + "version": "1.8.2", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "fad452781b3d774e3337b0c0b245dd8e5a4455fc" + "reference": "153ae662783729388a584b4361f2545e4d841e3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/fad452781b3d774e3337b0c0b245dd8e5a4455fc", - "reference": "fad452781b3d774e3337b0c0b245dd8e5a4455fc", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/153ae662783729388a584b4361f2545e4d841e3c", + "reference": "153ae662783729388a584b4361f2545e4d841e3c", "shasum": "" }, "require": { "doctrine/deprecations": "^1.0", - "php": "^7.4 || ^8.0", + "php": "^7.3 || ^8.0", "phpdocumentor/reflection-common": "^2.0", "phpstan/phpdoc-parser": "^1.13" }, @@ -1631,22 +1697,22 @@ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "support": { "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.8.0" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.8.2" }, - "time": "2024-01-11T11:49:22+00:00" + "time": "2024-02-23T11:10:43+00:00" }, { "name": "phpstan/phpdoc-parser", - "version": "1.25.0", + "version": "1.29.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "bd84b629c8de41aa2ae82c067c955e06f1b00240" + "reference": "536889f2b340489d328f5ffb7b02bb6b183ddedc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/bd84b629c8de41aa2ae82c067c955e06f1b00240", - "reference": "bd84b629c8de41aa2ae82c067c955e06f1b00240", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/536889f2b340489d328f5ffb7b02bb6b183ddedc", + "reference": "536889f2b340489d328f5ffb7b02bb6b183ddedc", "shasum": "" }, "require": { @@ -1678,26 +1744,26 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.25.0" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.29.0" }, - "time": "2024-01-04T17:06:16+00:00" + "time": "2024-05-06T12:04:23+00:00" }, { "name": "psr/cache", - "version": "1.0.1", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/cache.git", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=8.0.0" }, "type": "library", "extra": { @@ -1717,7 +1783,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for caching libraries", @@ -1727,9 +1793,9 @@ "psr-6" ], "support": { - "source": "https://github.com/php-fig/cache/tree/master" + "source": "https://github.com/php-fig/cache/tree/3.0.0" }, - "time": "2016-08-06T20:24:11+00:00" + "time": "2021-02-03T23:26:27+00:00" }, { "name": "psr/container", @@ -1883,20 +1949,20 @@ }, { "name": "psr/http-factory", - "version": "1.0.2", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-factory.git", - "reference": "e616d01114759c4c489f93b099585439f795fe35" + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", - "reference": "e616d01114759c4c489f93b099585439f795fe35", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", "shasum": "" }, "require": { - "php": ">=7.0.0", + "php": ">=7.1", "psr/http-message": "^1.0 || ^2.0" }, "type": "library", @@ -1920,7 +1986,7 @@ "homepage": "https://www.php-fig.org/" } ], - "description": "Common interfaces for PSR-7 HTTP message factories", + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", "keywords": [ "factory", "http", @@ -1932,9 +1998,9 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-factory/tree/1.0.2" + "source": "https://github.com/php-fig/http-factory" }, - "time": "2023-04-10T20:10:41+00:00" + "time": "2024-04-15T12:06:14+00:00" }, { "name": "psr/http-message", @@ -2198,38 +2264,42 @@ }, { "name": "solarium/solarium", - "version": "5.2.0", + "version": "6.3.5", "source": { "type": "git", "url": "https://github.com/solariumphp/solarium.git", - "reference": "9208b615cb2ed6f306be6e696431b6b71e4d42db" + "reference": "ae4ea592dc92d2be4dfd0a329f1ffbe3cbd01cf3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/solariumphp/solarium/zipball/9208b615cb2ed6f306be6e696431b6b71e4d42db", - "reference": "9208b615cb2ed6f306be6e696431b6b71e4d42db", + "url": "https://api.github.com/repos/solariumphp/solarium/zipball/ae4ea592dc92d2be4dfd0a329f1ffbe3cbd01cf3", + "reference": "ae4ea592dc92d2be4dfd0a329f1ffbe3cbd01cf3", "shasum": "" }, "require": { + "composer-runtime-api": ">=2.0", "ext-json": "*", - "php": "^7.1.3", + "halaxa/json-machine": "^1.1", + "php": "^8.0", + "psr/event-dispatcher": "^1.0", "psr/http-client": "^1.0", "psr/http-factory": "^1.0", - "symfony/event-dispatcher": "^4.3 || ^5.0" + "symfony/event-dispatcher-contracts": "^2.0 || ^3.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^2.16", - "guzzlehttp/guzzle": "^3.8 || ^6.2", - "nyholm/psr7": "^1.2", - "php-coveralls/php-coveralls": "^2.1", - "php-http/guzzle6-adapter": "^2.0", - "phpunit/phpunit": "^8.0", - "squizlabs/php_codesniffer": "^3.4", - "symfony/phpunit-bridge": "^5.0", - "zendframework/zend-http": "^2.8" - }, - "suggest": { - "minimalcode/search": "Query builder compatible with Solarium, allows simplified solr-query handling" + "escapestudios/symfony2-coding-standard": "^3.11", + "ext-curl": "*", + "ext-iconv": "*", + "nyholm/psr7": "^1.8", + "php-http/guzzle7-adapter": "^1.0", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^9.6", + "rawr/phpunit-data-provider": "^3.3", + "roave/security-advisories": "dev-master", + "symfony/event-dispatcher": "^5.0 || ^6.0" }, "type": "library", "autoload": { @@ -2244,7 +2314,7 @@ "authors": [ { "name": "See GitHub contributors", - "homepage": "https://github.com/basdenooijer/solarium/contributors" + "homepage": "https://github.com/solariumphp/solarium/contributors" } ], "description": "PHP Solr client", @@ -2256,64 +2326,63 @@ ], "support": { "issues": "https://github.com/solariumphp/solarium/issues", - "source": "https://github.com/solariumphp/solarium/tree/5.x" + "source": "https://github.com/solariumphp/solarium/tree/6.3.5" }, - "time": "2020-04-03T22:16:30+00:00" + "time": "2024-01-10T08:36:53+00:00" }, { "name": "symfony/cache", - "version": "v5.4.35", + "version": "v6.4.7", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "db1adb004e2da984085d0178964eb6f319d3cba1" + "reference": "b9e9b93c9817ec6c789c7943f5e54b57a041c16a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/db1adb004e2da984085d0178964eb6f319d3cba1", - "reference": "db1adb004e2da984085d0178964eb6f319d3cba1", + "url": "https://api.github.com/repos/symfony/cache/zipball/b9e9b93c9817ec6c789c7943f5e54b57a041c16a", + "reference": "b9e9b93c9817ec6c789c7943f5e54b57a041c16a", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/cache": "^1.0|^2.0", + "php": ">=8.1", + "psr/cache": "^2.0|^3.0", "psr/log": "^1.1|^2|^3", - "symfony/cache-contracts": "^1.1.7|^2", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/var-exporter": "^4.4|^5.0|^6.0" + "symfony/cache-contracts": "^2.5|^3", + "symfony/service-contracts": "^2.5|^3", + "symfony/var-exporter": "^6.3.6|^7.0" }, "conflict": { "doctrine/dbal": "<2.13.1", - "symfony/dependency-injection": "<4.4", - "symfony/http-kernel": "<4.4", - "symfony/var-dumper": "<4.4" + "symfony/dependency-injection": "<5.4", + "symfony/http-kernel": "<5.4", + "symfony/var-dumper": "<5.4" }, "provide": { - "psr/cache-implementation": "1.0|2.0", - "psr/simple-cache-implementation": "1.0|2.0", - "symfony/cache-implementation": "1.0|2.0" + "psr/cache-implementation": "2.0|3.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0", + "symfony/cache-implementation": "1.1|2.0|3.0" }, "require-dev": { "cache/integration-tests": "dev-master", - "doctrine/cache": "^1.6|^2.0", "doctrine/dbal": "^2.13.1|^3|^4", - "predis/predis": "^1.1", - "psr/simple-cache": "^1.0|^2.0", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/filesystem": "^4.4|^5.0|^6.0", - "symfony/http-kernel": "^4.4|^5.0|^6.0", - "symfony/messenger": "^4.4|^5.0|^6.0", - "symfony/var-dumper": "^4.4|^5.0|^6.0" + "predis/predis": "^1.1|^2.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/filesystem": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { "psr-4": { "Symfony\\Component\\Cache\\": "" }, + "classmap": [ + "Traits/ValueWrapper.php" + ], "exclude-from-classmap": [ "/Tests/" ] @@ -2339,7 +2408,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v5.4.35" + "source": "https://github.com/symfony/cache/tree/v6.4.7" }, "funding": [ { @@ -2355,33 +2424,30 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2024-04-18T09:22:46+00:00" }, { "name": "symfony/cache-contracts", - "version": "v2.5.2", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/cache-contracts.git", - "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc" + "reference": "df6a1a44c890faded49a5fca33c2d5c5fd3c2197" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/64be4a7acb83b6f2bf6de9a02cee6dad41277ebc", - "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/df6a1a44c890faded49a5fca33c2d5c5fd3c2197", + "reference": "df6a1a44c890faded49a5fca33c2d5c5fd3c2197", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/cache": "^1.0|^2.0|^3.0" - }, - "suggest": { - "symfony/cache-implementation": "" + "php": ">=8.1", + "psr/cache": "^3.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -2418,7 +2484,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/cache-contracts/tree/v3.5.0" }, "funding": [ { @@ -2434,20 +2500,20 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/config", - "version": "v5.4.35", + "version": "v5.4.39", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "6b763438a22a4f20885e994ad6702f6a3f25430e" + "reference": "62cec4a067931552624a9962002c210c502d42fd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/6b763438a22a4f20885e994ad6702f6a3f25430e", - "reference": "6b763438a22a4f20885e994ad6702f6a3f25430e", + "url": "https://api.github.com/repos/symfony/config/zipball/62cec4a067931552624a9962002c210c502d42fd", + "reference": "62cec4a067931552624a9962002c210c502d42fd", "shasum": "" }, "require": { @@ -2497,7 +2563,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v5.4.35" + "source": "https://github.com/symfony/config/tree/v5.4.39" }, "funding": [ { @@ -2513,20 +2579,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2024-04-18T08:26:06+00:00" }, { "name": "symfony/console", - "version": "v5.4.35", + "version": "v5.4.39", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "dbdf6adcb88d5f83790e1efb57ef4074309d3931" + "reference": "f3e591c48688a0cfa1a3296205926c05e84b22b1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/dbdf6adcb88d5f83790e1efb57ef4074309d3931", - "reference": "dbdf6adcb88d5f83790e1efb57ef4074309d3931", + "url": "https://api.github.com/repos/symfony/console/zipball/f3e591c48688a0cfa1a3296205926c05e84b22b1", + "reference": "f3e591c48688a0cfa1a3296205926c05e84b22b1", "shasum": "" }, "require": { @@ -2596,7 +2662,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.35" + "source": "https://github.com/symfony/console/tree/v5.4.39" }, "funding": [ { @@ -2612,20 +2678,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:28:09+00:00" + "time": "2024-04-18T08:26:06+00:00" }, { "name": "symfony/dependency-injection", - "version": "v5.4.35", + "version": "v5.4.39", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "45474d527212ca67cdb93f6c5e6da68f4bc67118" + "reference": "5b4505f2afbe1d11d43a3917d0c1c178a38f6f19" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/45474d527212ca67cdb93f6c5e6da68f4bc67118", - "reference": "45474d527212ca67cdb93f6c5e6da68f4bc67118", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/5b4505f2afbe1d11d43a3917d0c1c178a38f6f19", + "reference": "5b4505f2afbe1d11d43a3917d0c1c178a38f6f19", "shasum": "" }, "require": { @@ -2685,7 +2751,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v5.4.35" + "source": "https://github.com/symfony/dependency-injection/tree/v5.4.39" }, "funding": [ { @@ -2701,29 +2767,29 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:37:36+00:00" + "time": "2024-04-18T08:26:06+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v2.5.2", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.1" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -2752,7 +2818,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" }, "funding": [ { @@ -2768,48 +2834,43 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v5.4.35", + "version": "v6.4.7", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "7a69a85c7ea5bdd1e875806a99c51a87d3a74b38" + "reference": "d84384f3f67de3cb650db64d685d70395dacfc3f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/7a69a85c7ea5bdd1e875806a99c51a87d3a74b38", - "reference": "7a69a85c7ea5bdd1e875806a99c51a87d3a74b38", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d84384f3f67de3cb650db64d685d70395dacfc3f", + "reference": "d84384f3f67de3cb650db64d685d70395dacfc3f", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/event-dispatcher-contracts": "^2|^3", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1", + "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { - "symfony/dependency-injection": "<4.4" + "symfony/dependency-injection": "<5.4", + "symfony/service-contracts": "<2.5" }, "provide": { "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "2.0" + "symfony/event-dispatcher-implementation": "2.0|3.0" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/error-handler": "^4.4|^5.0|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/http-foundation": "^4.4|^5.0|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/stopwatch": "^4.4|^5.0|^6.0" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -2837,7 +2898,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.35" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.7" }, "funding": [ { @@ -2853,20 +2914,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2024-04-18T09:22:46+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v2.5.2", + "version": "v2.5.3", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1" + "reference": "540f4c73e87fd0c71ca44a6aa305d024ac68cb73" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/f98b54df6ad059855739db6fcbc2d36995283fe1", - "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/540f4c73e87fd0c71ca44a6aa305d024ac68cb73", + "reference": "540f4c73e87fd0c71ca44a6aa305d024ac68cb73", "shasum": "" }, "require": { @@ -2916,7 +2977,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.3" }, "funding": [ { @@ -2932,20 +2993,20 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2024-01-23T13:51:25+00:00" }, { "name": "symfony/expression-language", - "version": "v5.4.35", + "version": "v5.4.39", "source": { "type": "git", "url": "https://github.com/symfony/expression-language.git", - "reference": "d59441c10a5a73cd9d4d778b8253595a16f6716d" + "reference": "3a24a58e4eebae5dc977bc7a27f633f9c5338416" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/expression-language/zipball/d59441c10a5a73cd9d4d778b8253595a16f6716d", - "reference": "d59441c10a5a73cd9d4d778b8253595a16f6716d", + "url": "https://api.github.com/repos/symfony/expression-language/zipball/3a24a58e4eebae5dc977bc7a27f633f9c5338416", + "reference": "3a24a58e4eebae5dc977bc7a27f633f9c5338416", "shasum": "" }, "require": { @@ -2979,7 +3040,7 @@ "description": "Provides an engine that can compile and evaluate expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/expression-language/tree/v5.4.35" + "source": "https://github.com/symfony/expression-language/tree/v5.4.39" }, "funding": [ { @@ -2995,27 +3056,28 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2024-04-18T08:26:06+00:00" }, { "name": "symfony/filesystem", - "version": "v5.4.35", + "version": "v5.4.39", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "5a553607d4ffbfa9c0ab62facadea296c9db7086" + "reference": "e6edd875d5d39b03de51f3c3951148cfa79a4d12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/5a553607d4ffbfa9c0ab62facadea296c9db7086", - "reference": "5a553607d4ffbfa9c0ab62facadea296c9db7086", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/e6edd875d5d39b03de51f3c3951148cfa79a4d12", + "reference": "e6edd875d5d39b03de51f3c3951148cfa79a4d12", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.8", - "symfony/polyfill-php80": "^1.16" + "symfony/polyfill-php80": "^1.16", + "symfony/process": "^5.4|^6.4" }, "type": "library", "autoload": { @@ -3043,7 +3105,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.4.35" + "source": "https://github.com/symfony/filesystem/tree/v5.4.39" }, "funding": [ { @@ -3059,20 +3121,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2024-04-18T08:26:06+00:00" }, { "name": "symfony/finder", - "version": "v5.4.35", + "version": "v5.4.39", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "abe6d6f77d9465fed3cd2d029b29d03b56b56435" + "reference": "f6a96e4fcd468a25fede16ee665f50ced856bd0a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/abe6d6f77d9465fed3cd2d029b29d03b56b56435", - "reference": "abe6d6f77d9465fed3cd2d029b29d03b56b56435", + "url": "https://api.github.com/repos/symfony/finder/zipball/f6a96e4fcd468a25fede16ee665f50ced856bd0a", + "reference": "f6a96e4fcd468a25fede16ee665f50ced856bd0a", "shasum": "" }, "require": { @@ -3106,7 +3168,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.35" + "source": "https://github.com/symfony/finder/tree/v5.4.39" }, "funding": [ { @@ -3122,20 +3184,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2024-04-18T08:26:06+00:00" }, { "name": "symfony/http-foundation", - "version": "v5.4.35", + "version": "v5.4.39", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "f2ab692a22aef1cd54beb893aa0068bdfb093928" + "reference": "3356c93efc30b0c85a37606bdfef16b813faec0e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f2ab692a22aef1cd54beb893aa0068bdfb093928", - "reference": "f2ab692a22aef1cd54beb893aa0068bdfb093928", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/3356c93efc30b0c85a37606bdfef16b813faec0e", + "reference": "3356c93efc30b0c85a37606bdfef16b813faec0e", "shasum": "" }, "require": { @@ -3182,7 +3244,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.4.35" + "source": "https://github.com/symfony/http-foundation/tree/v5.4.39" }, "funding": [ { @@ -3198,34 +3260,34 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2024-04-18T08:26:06+00:00" }, { "name": "symfony/lock", - "version": "v5.4.35", + "version": "v6.4.7", "source": { "type": "git", "url": "https://github.com/symfony/lock.git", - "reference": "b8b0d5b283af0e117e7ef6141b5b7e5efb20b247" + "reference": "c6b3959c418a7c1115c060fab77927ca4bd2546a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/lock/zipball/b8b0d5b283af0e117e7ef6141b5b7e5efb20b247", - "reference": "b8b0d5b283af0e117e7ef6141b5b7e5efb20b247", + "url": "https://api.github.com/repos/symfony/lock/zipball/c6b3959c418a7c1115c060fab77927ca4bd2546a", + "reference": "c6b3959c418a7c1115c060fab77927ca4bd2546a", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.1", "psr/log": "^1|^2|^3", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php80": "^1.16" + "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { - "doctrine/dbal": "<2.13" + "doctrine/dbal": "<2.13", + "symfony/cache": "<6.2" }, "require-dev": { "doctrine/dbal": "^2.13|^3|^4", - "predis/predis": "~1.0" + "predis/predis": "^1.1|^2.0" }, "type": "library", "autoload": { @@ -3261,7 +3323,7 @@ "semaphore" ], "support": { - "source": "https://github.com/symfony/lock/tree/v5.4.35" + "source": "https://github.com/symfony/lock/tree/v6.4.7" }, "funding": [ { @@ -3277,20 +3339,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2024-04-18T09:22:46+00:00" }, { "name": "symfony/mailer", - "version": "v5.4.35", + "version": "v5.4.39", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "664724b0fb4646dee30859d0ed9131a2d7633320" + "reference": "93543ff1554d1098b0f80bb01ff27e9da123af5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/664724b0fb4646dee30859d0ed9131a2d7633320", - "reference": "664724b0fb4646dee30859d0ed9131a2d7633320", + "url": "https://api.github.com/repos/symfony/mailer/zipball/93543ff1554d1098b0f80bb01ff27e9da123af5c", + "reference": "93543ff1554d1098b0f80bb01ff27e9da123af5c", "shasum": "" }, "require": { @@ -3337,7 +3399,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v5.4.35" + "source": "https://github.com/symfony/mailer/tree/v5.4.39" }, "funding": [ { @@ -3353,20 +3415,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T07:33:37+00:00" + "time": "2024-04-18T08:26:06+00:00" }, { "name": "symfony/mime", - "version": "v5.4.35", + "version": "v5.4.39", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "ee94d9b538f93abbbc1ee4ccff374593117b04a9" + "reference": "a5364f016fd9e090f7b4f250a97ea6925a5ca985" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/ee94d9b538f93abbbc1ee4ccff374593117b04a9", - "reference": "ee94d9b538f93abbbc1ee4ccff374593117b04a9", + "url": "https://api.github.com/repos/symfony/mime/zipball/a5364f016fd9e090f7b4f250a97ea6925a5ca985", + "reference": "a5364f016fd9e090f7b4f250a97ea6925a5ca985", "shasum": "" }, "require": { @@ -3387,6 +3449,7 @@ "egulias/email-validator": "^2.1.10|^3.1|^4", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/process": "^5.4|^6.4", "symfony/property-access": "^4.4|^5.1|^6.0", "symfony/property-info": "^4.4|^5.1|^6.0", "symfony/serializer": "^5.4.35|~6.3.12|^6.4.3" @@ -3421,7 +3484,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v5.4.35" + "source": "https://github.com/symfony/mime/tree/v5.4.39" }, "funding": [ { @@ -3437,20 +3500,20 @@ "type": "tidelift" } ], - "time": "2024-01-30T08:00:51+00:00" + "time": "2024-04-18T08:26:06+00:00" }, { "name": "symfony/options-resolver", - "version": "v5.4.21", + "version": "v5.4.39", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "4fe5cf6ede71096839f0e4b4444d65dd3a7c1eb9" + "reference": "1303bb73d6c3882f07c618129295503085dfddb9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/4fe5cf6ede71096839f0e4b4444d65dd3a7c1eb9", - "reference": "4fe5cf6ede71096839f0e4b4444d65dd3a7c1eb9", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/1303bb73d6c3882f07c618129295503085dfddb9", + "reference": "1303bb73d6c3882f07c618129295503085dfddb9", "shasum": "" }, "require": { @@ -3490,7 +3553,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v5.4.21" + "source": "https://github.com/symfony/options-resolver/tree/v5.4.39" }, "funding": [ { @@ -3506,7 +3569,7 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:03:56+00:00" + "time": "2024-04-18T08:26:06+00:00" }, { "name": "symfony/polyfill-ctype", @@ -4299,18 +4362,79 @@ ], "time": "2024-01-29T20:11:03+00:00" }, + { + "name": "symfony/process", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "cdb1c81c145fd5aa9b0038bab694035020943381" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/cdb1c81c145fd5aa9b0038bab694035020943381", + "reference": "cdb1c81c145fd5aa9b0038bab694035020943381", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v6.4.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:22:46+00:00" + }, { "name": "symfony/property-access", - "version": "v5.4.35", + "version": "v5.4.39", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "f1341758d8046cfff0ac748a0cad238f917191d4" + "reference": "1b93ca45890ce5555895efe27bd848c41396530c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/f1341758d8046cfff0ac748a0cad238f917191d4", - "reference": "f1341758d8046cfff0ac748a0cad238f917191d4", + "url": "https://api.github.com/repos/symfony/property-access/zipball/1b93ca45890ce5555895efe27bd848c41396530c", + "reference": "1b93ca45890ce5555895efe27bd848c41396530c", "shasum": "" }, "require": { @@ -4362,7 +4486,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v5.4.35" + "source": "https://github.com/symfony/property-access/tree/v5.4.39" }, "funding": [ { @@ -4378,20 +4502,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2024-04-18T08:26:06+00:00" }, { "name": "symfony/property-info", - "version": "v5.4.35", + "version": "v5.4.39", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "d30d48f366ad2bfbf521256be85eb1c182c29198" + "reference": "bf257e78b0471e67757af038344919f498af804d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/d30d48f366ad2bfbf521256be85eb1c182c29198", - "reference": "d30d48f366ad2bfbf521256be85eb1c182c29198", + "url": "https://api.github.com/repos/symfony/property-info/zipball/bf257e78b0471e67757af038344919f498af804d", + "reference": "bf257e78b0471e67757af038344919f498af804d", "shasum": "" }, "require": { @@ -4453,7 +4577,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v5.4.35" + "source": "https://github.com/symfony/property-info/tree/v5.4.39" }, "funding": [ { @@ -4469,20 +4593,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T15:43:50+00:00" + "time": "2024-04-19T15:51:11+00:00" }, { "name": "symfony/rate-limiter", - "version": "v5.4.35", + "version": "v5.4.39", "source": { "type": "git", "url": "https://github.com/symfony/rate-limiter.git", - "reference": "9bd24ef2e0948fff4d6741798ba4c7468b75bc8d" + "reference": "3c21407e3c6be1315bc77b5e6258b6a4d0db152c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/9bd24ef2e0948fff4d6741798ba4c7468b75bc8d", - "reference": "9bd24ef2e0948fff4d6741798ba4c7468b75bc8d", + "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/3c21407e3c6be1315bc77b5e6258b6a4d0db152c", + "reference": "3c21407e3c6be1315bc77b5e6258b6a4d0db152c", "shasum": "" }, "require": { @@ -4523,7 +4647,7 @@ "rate-limiter" ], "support": { - "source": "https://github.com/symfony/rate-limiter/tree/v5.4.35" + "source": "https://github.com/symfony/rate-limiter/tree/v5.4.39" }, "funding": [ { @@ -4539,20 +4663,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2024-04-18T08:26:06+00:00" }, { "name": "symfony/routing", - "version": "v5.4.35", + "version": "v5.4.39", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "86c5a06a61ddaf17efa1403542e3d7146af96203" + "reference": "5485974ef20de1150dd195a81e9da4915d45263f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/86c5a06a61ddaf17efa1403542e3d7146af96203", - "reference": "86c5a06a61ddaf17efa1403542e3d7146af96203", + "url": "https://api.github.com/repos/symfony/routing/zipball/5485974ef20de1150dd195a81e9da4915d45263f", + "reference": "5485974ef20de1150dd195a81e9da4915d45263f", "shasum": "" }, "require": { @@ -4613,7 +4737,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v5.4.35" + "source": "https://github.com/symfony/routing/tree/v5.4.39" }, "funding": [ { @@ -4629,20 +4753,20 @@ "type": "tidelift" } ], - "time": "2024-01-30T13:10:15+00:00" + "time": "2024-04-18T08:26:06+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.5.2", + "version": "v2.5.3", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" + "reference": "a2329596ddc8fd568900e3fc76cba42489ecc7f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/a2329596ddc8fd568900e3fc76cba42489ecc7f3", + "reference": "a2329596ddc8fd568900e3fc76cba42489ecc7f3", "shasum": "" }, "require": { @@ -4696,7 +4820,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/service-contracts/tree/v2.5.3" }, "funding": [ { @@ -4712,38 +4836,38 @@ "type": "tidelift" } ], - "time": "2022-05-30T19:17:29+00:00" + "time": "2023-04-21T15:04:16+00:00" }, { "name": "symfony/string", - "version": "v5.4.35", + "version": "v6.4.7", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "c209c4d0559acce1c9a2067612cfb5d35756edc2" + "reference": "ffeb9591c61f65a68d47f77d12b83fa530227a69" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/c209c4d0559acce1c9a2067612cfb5d35756edc2", - "reference": "c209c4d0559acce1c9a2067612cfb5d35756edc2", + "url": "https://api.github.com/repos/symfony/string/zipball/ffeb9591c61f65a68d47f77d12b83fa530227a69", + "reference": "ffeb9591c61f65a68d47f77d12b83fa530227a69", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.1", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-intl-grapheme": "~1.0", "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "~1.15" + "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/translation-contracts": ">=3.0" + "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/error-handler": "^4.4|^5.0|^6.0", - "symfony/http-client": "^4.4|^5.0|^6.0", - "symfony/translation-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0|^6.0" + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/intl": "^6.2|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -4782,7 +4906,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.4.35" + "source": "https://github.com/symfony/string/tree/v6.4.7" }, "funding": [ { @@ -4798,28 +4922,29 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2024-04-18T09:22:46+00:00" }, { "name": "symfony/var-exporter", - "version": "v5.4.35", + "version": "v7.0.7", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "abb0a151b62d6b07e816487e20040464af96cae7" + "reference": "cdecc0022e40e90340ba1a59a3d5ccf069777078" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/abb0a151b62d6b07e816487e20040464af96cae7", - "reference": "abb0a151b62d6b07e816487e20040464af96cae7", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/cdecc0022e40e90340ba1a59a3d5ccf069777078", + "reference": "cdecc0022e40e90340ba1a59a3d5ccf069777078", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.2" }, "require-dev": { - "symfony/var-dumper": "^4.4.9|^5.0.9|^6.0" + "symfony/property-access": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -4852,10 +4977,12 @@ "export", "hydrate", "instantiate", + "lazy-loading", + "proxy", "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v5.4.35" + "source": "https://github.com/symfony/var-exporter/tree/v7.0.7" }, "funding": [ { @@ -4871,20 +4998,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2024-04-18T09:29:19+00:00" }, { "name": "symfony/yaml", - "version": "v5.4.35", + "version": "v5.4.39", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "e78db7f5c70a21f0417a31f414c4a95fe76c07e4" + "reference": "bc780e16879000f77a1022163c052f5323b5e640" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/e78db7f5c70a21f0417a31f414c4a95fe76c07e4", - "reference": "e78db7f5c70a21f0417a31f414c4a95fe76c07e4", + "url": "https://api.github.com/repos/symfony/yaml/zipball/bc780e16879000f77a1022163c052f5323b5e640", + "reference": "bc780e16879000f77a1022163c052f5323b5e640", "shasum": "" }, "require": { @@ -4930,7 +5057,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.4.35" + "source": "https://github.com/symfony/yaml/tree/v5.4.39" }, "funding": [ { @@ -4946,7 +5073,7 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2024-04-23T11:57:27+00:00" }, { "name": "typo3/class-alias-loader", @@ -5120,16 +5247,16 @@ }, { "name": "typo3/cms-core", - "version": "v11.5.35", + "version": "v11.5.37", "source": { "type": "git", "url": "https://github.com/TYPO3-CMS/core.git", - "reference": "184de98b0d4444f0ccf6bb3e43c98eb99ccb1d5c" + "reference": "0f5faacc2173b6e5d0828141fa11bd28dd0ebc5a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TYPO3-CMS/core/zipball/184de98b0d4444f0ccf6bb3e43c98eb99ccb1d5c", - "reference": "184de98b0d4444f0ccf6bb3e43c98eb99ccb1d5c", + "url": "https://api.github.com/repos/TYPO3-CMS/core/zipball/0f5faacc2173b6e5d0828141fa11bd28dd0ebc5a", + "reference": "0f5faacc2173b6e5d0828141fa11bd28dd0ebc5a", "shasum": "" }, "require": { @@ -5142,7 +5269,7 @@ "doctrine/instantiator": "^1.4", "doctrine/lexer": "^1.2.3", "egulias/email-validator": "^3.2.1", - "enshrined/svg-sanitize": "^0.15.4", + "enshrined/svg-sanitize": "^0.18.0", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", @@ -5259,20 +5386,20 @@ "issues": "https://forge.typo3.org", "source": "https://github.com/typo3/typo3" }, - "time": "2024-02-13T09:50:23+00:00" + "time": "2024-05-14T08:21:16+00:00" }, { "name": "typo3/cms-extbase", - "version": "v11.5.35", + "version": "v11.5.37", "source": { "type": "git", "url": "https://github.com/TYPO3-CMS/extbase.git", - "reference": "1b4920697d28998f0c4e6eef7947ae2467b50ff4" + "reference": "67a28530a40dbf9276fb55301a0c1a26f3360f15" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TYPO3-CMS/extbase/zipball/1b4920697d28998f0c4e6eef7947ae2467b50ff4", - "reference": "1b4920697d28998f0c4e6eef7947ae2467b50ff4", + "url": "https://api.github.com/repos/TYPO3-CMS/extbase/zipball/67a28530a40dbf9276fb55301a0c1a26f3360f15", + "reference": "67a28530a40dbf9276fb55301a0c1a26f3360f15", "shasum": "" }, "require": { @@ -5281,7 +5408,7 @@ "symfony/dependency-injection": "^5.4", "symfony/property-access": "^5.4", "symfony/property-info": "^5.4", - "typo3/cms-core": "11.5.35" + "typo3/cms-core": "11.5.37" }, "conflict": { "typo3/cms": "*" @@ -5328,24 +5455,24 @@ "issues": "https://forge.typo3.org", "source": "https://github.com/typo3/typo3" }, - "time": "2024-02-13T09:50:23+00:00" + "time": "2024-05-14T08:21:16+00:00" }, { "name": "typo3/cms-tstemplate", - "version": "v11.5.35", + "version": "v11.5.37", "source": { "type": "git", "url": "https://github.com/TYPO3-CMS/tstemplate.git", - "reference": "dd4737679dfb88f3af5a1e5167a899212a877672" + "reference": "45b18471260a0d1fed5086a04c71659477822215" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TYPO3-CMS/tstemplate/zipball/dd4737679dfb88f3af5a1e5167a899212a877672", - "reference": "dd4737679dfb88f3af5a1e5167a899212a877672", + "url": "https://api.github.com/repos/TYPO3-CMS/tstemplate/zipball/45b18471260a0d1fed5086a04c71659477822215", + "reference": "45b18471260a0d1fed5086a04c71659477822215", "shasum": "" }, "require": { - "typo3/cms-core": "11.5.35" + "typo3/cms-core": "11.5.37" }, "conflict": { "typo3/cms": "*" @@ -5386,7 +5513,7 @@ "issues": "https://forge.typo3.org", "source": "https://github.com/typo3/typo3" }, - "time": "2024-02-13T09:50:23+00:00" + "time": "2024-05-14T08:21:16+00:00" }, { "name": "typo3/html-sanitizer", @@ -5539,28 +5666,28 @@ }, { "name": "typo3fluid/fluid", - "version": "2.7.4", + "version": "2.11.0", "source": { "type": "git", "url": "https://github.com/TYPO3/Fluid.git", - "reference": "24f4494083c8d304680e4c9c38667dff33720dd4" + "reference": "392c7d5e494a02131843ec8b2a5ef1d3ca4dcdf5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TYPO3/Fluid/zipball/24f4494083c8d304680e4c9c38667dff33720dd4", - "reference": "24f4494083c8d304680e4c9c38667dff33720dd4", + "url": "https://api.github.com/repos/TYPO3/Fluid/zipball/392c7d5e494a02131843ec8b2a5ef1d3ca4dcdf5", + "reference": "392c7d5e494a02131843ec8b2a5ef1d3ca4dcdf5", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "ext-mbstring": "*", + "php": "^8.1" }, "require-dev": { "ext-json": "*", - "ext-mbstring": "*", - "friendsofphp/php-cs-fixer": "^3.4", - "phpstan/phpstan": "^1.7", - "phpstan/phpstan-phpunit": "^1.1", - "phpunit/phpunit": "^8.5.33 || ^9.5.28 || ^10.0.16" + "friendsofphp/php-cs-fixer": "^3.52.1", + "phpstan/phpstan": "^1.10.14", + "phpstan/phpstan-phpunit": "^1.3.11", + "phpunit/phpunit": "^10.2.6" }, "suggest": { "ext-json": "PHP JSON is needed when using JSONVariableProvider: A relatively rare use case" @@ -5585,7 +5712,7 @@ "issues": "https://github.com/TYPO3/Fluid/issues", "source": "https://github.com/TYPO3/Fluid" }, - "time": "2023-03-23T12:04:09+00:00" + "time": "2024-04-05T13:06:34+00:00" }, { "name": "ubl/php-iiif-prezi-reader", @@ -5955,28 +6082,91 @@ }, "time": "2023-08-08T05:53:35+00:00" }, + { + "name": "graham-campbell/result-type", + "version": "v1.1.2", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/fbd48bce38f73f8a4ec8583362e732e4095e5862", + "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2023-11-12T22:16:48+00:00" + }, { "name": "jolicode/jolinotif", - "version": "v2.4.0", + "version": "v2.6.0", "source": { "type": "git", "url": "https://github.com/jolicode/JoliNotif.git", - "reference": "a15bfc0d5aef432f150385924ede4e099643edb7" + "reference": "6a886aa19aec7cc283125631f31f93f71729bf40" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jolicode/JoliNotif/zipball/a15bfc0d5aef432f150385924ede4e099643edb7", - "reference": "a15bfc0d5aef432f150385924ede4e099643edb7", + "url": "https://api.github.com/repos/jolicode/JoliNotif/zipball/6a886aa19aec7cc283125631f31f93f71729bf40", + "reference": "6a886aa19aec7cc283125631f31f93f71729bf40", "shasum": "" }, "require": { - "php": ">=7.4", - "symfony/process": "^4.0|^5.0|^6.0" + "jolicode/php-os-helper": "^0.1.0", + "php": ">=8.1", + "symfony/process": "^5.4 || ^6.0 || ^7.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.0", - "symfony/finder": "^5.0", - "symfony/phpunit-bridge": "^5.0" + "friendsofphp/php-cs-fixer": "^3.13", + "symfony/finder": "^5.4 || ^6.0 || ^7.0", + "symfony/phpunit-bridge": "^5.4 || ^6.0 || ^7.0" }, "bin": [ "jolinotif" @@ -6007,7 +6197,7 @@ ], "support": { "issues": "https://github.com/jolicode/JoliNotif/issues", - "source": "https://github.com/jolicode/JoliNotif/tree/v2.4.0" + "source": "https://github.com/jolicode/JoliNotif/tree/v2.6.0" }, "funding": [ { @@ -6015,7 +6205,57 @@ "type": "tidelift" } ], - "time": "2021-12-01T16:20:42+00:00" + "time": "2023-12-03T13:14:21+00:00" + }, + { + "name": "jolicode/php-os-helper", + "version": "v0.1.0", + "source": { + "type": "git", + "url": "https://github.com/jolicode/php-os-helper.git", + "reference": "1622ad8bbcab98e62b5c041397e8519f10d90e29" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jolicode/php-os-helper/zipball/1622ad8bbcab98e62b5c041397e8519f10d90e29", + "reference": "1622ad8bbcab98e62b5c041397e8519f10d90e29", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "symfony/phpunit-bridge": "^6.3.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "JoliCode\\PhpOsHelper\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Loïck Piera", + "email": "pyrech@gmail.com" + } + ], + "description": "Helpers to detect the OS of the machine where PHP is running.", + "keywords": [ + "linux", + "os", + "osx", + "php", + "windows" + ], + "support": { + "issues": "https://github.com/jolicode/php-os-helper/issues", + "source": "https://github.com/jolicode/php-os-helper/tree/v0.1.0" + }, + "time": "2023-12-03T12:46:03+00:00" }, { "name": "mikey179/vfsstream", @@ -6129,20 +6369,21 @@ }, { "name": "phar-io/manifest", - "version": "2.0.3", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/phar-io/manifest.git", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53" + "reference": "54750ef60c58e43759730615a392c31c80e23176" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", "shasum": "" }, "require": { "ext-dom": "*", + "ext-libxml": "*", "ext-phar": "*", "ext-xmlwriter": "*", "phar-io/version": "^3.0.1", @@ -6183,9 +6424,15 @@ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", "support": { "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.3" + "source": "https://github.com/phar-io/manifest/tree/2.0.4" }, - "time": "2021-07-20T11:28:43+00:00" + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" }, { "name": "phar-io/version", @@ -6238,18 +6485,93 @@ }, "time": "2022-02-21T01:04:05+00:00" }, + { + "name": "phpoption/phpoption", + "version": "1.9.2", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/80735db690fe4fc5c76dfa7f9b770634285fa820", + "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true + }, + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.9.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2023-11-12T21:59:55+00:00" + }, { "name": "phpstan/phpstan", - "version": "1.10.58", + "version": "1.11.1", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "a23518379ec4defd9e47cbf81019526861623ec2" + "reference": "e524358f930e41a2b4cca1320e3b04fc26b39e0b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/a23518379ec4defd9e47cbf81019526861623ec2", - "reference": "a23518379ec4defd9e47cbf81019526861623ec2", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e524358f930e41a2b4cca1320e3b04fc26b39e0b", + "reference": "e524358f930e41a2b4cca1320e3b04fc26b39e0b", "shasum": "" }, "require": { @@ -6292,26 +6614,22 @@ { "url": "https://github.com/phpstan", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", - "type": "tidelift" } ], - "time": "2024-02-12T20:02:57+00:00" + "time": "2024-05-15T08:00:59+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.30", + "version": "9.2.31", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "ca2bd87d2f9215904682a9cb9bb37dda98e76089" + "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ca2bd87d2f9215904682a9cb9bb37dda98e76089", - "reference": "ca2bd87d2f9215904682a9cb9bb37dda98e76089", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/48c34b5d8d983006bd2adc2d0de92963b9155965", + "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965", "shasum": "" }, "require": { @@ -6368,7 +6686,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.30" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.31" }, "funding": [ { @@ -6376,7 +6694,7 @@ "type": "github" } ], - "time": "2023-12-22T06:47:57+00:00" + "time": "2024-03-02T06:37:42+00:00" }, { "name": "phpunit/php-file-iterator", @@ -6621,16 +6939,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.16", + "version": "9.6.19", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "3767b2c56ce02d01e3491046f33466a1ae60a37f" + "reference": "a1a54a473501ef4cdeaae4e06891674114d79db8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3767b2c56ce02d01e3491046f33466a1ae60a37f", - "reference": "3767b2c56ce02d01e3491046f33466a1ae60a37f", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a1a54a473501ef4cdeaae4e06891674114d79db8", + "reference": "a1a54a473501ef4cdeaae4e06891674114d79db8", "shasum": "" }, "require": { @@ -6704,7 +7022,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.16" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.19" }, "funding": [ { @@ -6720,7 +7038,7 @@ "type": "tidelift" } ], - "time": "2024-01-19T07:03:14+00:00" + "time": "2024-04-05T04:35:58+00:00" }, { "name": "react/event-loop", @@ -6874,16 +7192,16 @@ }, { "name": "sebastian/cli-parser", - "version": "1.0.1", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b", + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b", "shasum": "" }, "require": { @@ -6918,7 +7236,7 @@ "homepage": "https://github.com/sebastianbergmann/cli-parser", "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2" }, "funding": [ { @@ -6926,7 +7244,7 @@ "type": "github" } ], - "time": "2020-09-28T06:08:49+00:00" + "time": "2024-03-02T06:27:43+00:00" }, { "name": "sebastian/code-unit", @@ -7172,16 +7490,16 @@ }, { "name": "sebastian/diff", - "version": "4.0.5", + "version": "4.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", - "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", "shasum": "" }, "require": { @@ -7226,7 +7544,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5" + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" }, "funding": [ { @@ -7234,7 +7552,7 @@ "type": "github" } ], - "time": "2023-05-07T05:35:17+00:00" + "time": "2024-03-02T06:30:58+00:00" }, { "name": "sebastian/environment", @@ -7301,16 +7619,16 @@ }, { "name": "sebastian/exporter", - "version": "4.0.5", + "version": "4.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", - "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72", + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72", "shasum": "" }, "require": { @@ -7366,7 +7684,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6" }, "funding": [ { @@ -7374,20 +7692,20 @@ "type": "github" } ], - "time": "2022-09-14T06:03:37+00:00" + "time": "2024-03-02T06:33:00+00:00" }, { "name": "sebastian/global-state", - "version": "5.0.6", + "version": "5.0.7", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "bde739e7565280bda77be70044ac1047bc007e34" + "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bde739e7565280bda77be70044ac1047bc007e34", - "reference": "bde739e7565280bda77be70044ac1047bc007e34", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", + "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", "shasum": "" }, "require": { @@ -7430,7 +7748,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.6" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7" }, "funding": [ { @@ -7438,7 +7756,7 @@ "type": "github" } ], - "time": "2023-08-02T09:26:13+00:00" + "time": "2024-03-02T06:35:11+00:00" }, { "name": "sebastian/lines-of-code", @@ -7674,16 +7992,16 @@ }, { "name": "sebastian/resource-operations", - "version": "3.0.3", + "version": "3.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e", "shasum": "" }, "require": { @@ -7695,7 +8013,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -7716,8 +8034,7 @@ "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", "support": { - "issues": "https://github.com/sebastianbergmann/resource-operations/issues", - "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4" }, "funding": [ { @@ -7725,7 +8042,7 @@ "type": "github" } ], - "time": "2020-09-28T06:45:17+00:00" + "time": "2024-03-14T16:00:52+00:00" }, { "name": "sebastian/type", @@ -7900,80 +8217,18 @@ }, "time": "2022-01-31T11:57:13+00:00" }, - { - "name": "symfony/process", - "version": "v5.4.35", - "source": { - "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "cbc28e34015ad50166fc2f9c8962d28d0fe861eb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/cbc28e34015ad50166fc2f9c8962d28d0fe861eb", - "reference": "cbc28e34015ad50166fc2f9c8962d28d0fe861eb", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Executes commands in sub-processes", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/process/tree/v5.4.35" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-01-23T13:51:25+00:00" - }, { "name": "theseer/tokenizer", - "version": "1.2.2", + "version": "1.2.3", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96" + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96", - "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", "shasum": "" }, "require": { @@ -8002,7 +8257,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.2" + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" }, "funding": [ { @@ -8010,26 +8265,26 @@ "type": "github" } ], - "time": "2023-11-20T00:12:19+00:00" + "time": "2024-03-03T12:36:25+00:00" }, { "name": "typo3/cms-backend", - "version": "v11.5.35", + "version": "v11.5.37", "source": { "type": "git", "url": "https://github.com/TYPO3-CMS/backend.git", - "reference": "9a9d297541e2011f50eab9c8da3413d6cbb61e55" + "reference": "0901509af45490c8cabd0e3efae3c7cf92bbf2b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TYPO3-CMS/backend/zipball/9a9d297541e2011f50eab9c8da3413d6cbb61e55", - "reference": "9a9d297541e2011f50eab9c8da3413d6cbb61e55", + "url": "https://api.github.com/repos/TYPO3-CMS/backend/zipball/0901509af45490c8cabd0e3efae3c7cf92bbf2b4", + "reference": "0901509af45490c8cabd0e3efae3c7cf92bbf2b4", "shasum": "" }, "require": { "psr/event-dispatcher": "^1.0", - "typo3/cms-core": "11.5.35", - "typo3/cms-recordlist": "11.5.35" + "typo3/cms-core": "11.5.37", + "typo3/cms-recordlist": "11.5.37" }, "conflict": { "typo3/cms": "*" @@ -8084,26 +8339,26 @@ "issues": "https://forge.typo3.org", "source": "https://github.com/typo3/typo3" }, - "time": "2024-02-13T09:50:23+00:00" + "time": "2024-05-14T08:21:16+00:00" }, { "name": "typo3/cms-fluid", - "version": "v11.5.35", + "version": "v11.5.37", "source": { "type": "git", "url": "https://github.com/TYPO3-CMS/fluid.git", - "reference": "9c5473ea503fe23edef2dbf004d42acfb34d5718" + "reference": "112f4965a8fd223756c0b2aae7bb1bdec2efe29d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TYPO3-CMS/fluid/zipball/9c5473ea503fe23edef2dbf004d42acfb34d5718", - "reference": "9c5473ea503fe23edef2dbf004d42acfb34d5718", + "url": "https://api.github.com/repos/TYPO3-CMS/fluid/zipball/112f4965a8fd223756c0b2aae7bb1bdec2efe29d", + "reference": "112f4965a8fd223756c0b2aae7bb1bdec2efe29d", "shasum": "" }, "require": { "symfony/dependency-injection": "^5.4", - "typo3/cms-core": "11.5.35", - "typo3/cms-extbase": "11.5.35", + "typo3/cms-core": "11.5.37", + "typo3/cms-extbase": "11.5.37", "typo3fluid/fluid": "^2.7.2" }, "conflict": { @@ -8148,26 +8403,26 @@ "issues": "https://forge.typo3.org", "source": "https://github.com/typo3/typo3" }, - "time": "2024-02-13T09:50:23+00:00" + "time": "2024-05-14T08:21:16+00:00" }, { "name": "typo3/cms-fluid-styled-content", - "version": "v11.5.35", + "version": "v11.5.37", "source": { "type": "git", "url": "https://github.com/TYPO3-CMS/fluid_styled_content.git", - "reference": "cfafebe662c2b53cbef29d34a7b249f6646d22f3" + "reference": "c4e295fa929efcc423a2e3c5d625ba858840d776" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TYPO3-CMS/fluid_styled_content/zipball/cfafebe662c2b53cbef29d34a7b249f6646d22f3", - "reference": "cfafebe662c2b53cbef29d34a7b249f6646d22f3", + "url": "https://api.github.com/repos/TYPO3-CMS/fluid_styled_content/zipball/c4e295fa929efcc423a2e3c5d625ba858840d776", + "reference": "c4e295fa929efcc423a2e3c5d625ba858840d776", "shasum": "" }, "require": { - "typo3/cms-core": "11.5.35", - "typo3/cms-fluid": "11.5.35", - "typo3/cms-frontend": "11.5.35" + "typo3/cms-core": "11.5.37", + "typo3/cms-fluid": "11.5.37", + "typo3/cms-frontend": "11.5.37" }, "conflict": { "typo3/cms": "*" @@ -8208,26 +8463,26 @@ "issues": "https://forge.typo3.org", "source": "https://github.com/typo3/typo3" }, - "time": "2024-02-13T09:50:23+00:00" + "time": "2024-05-14T08:21:16+00:00" }, { "name": "typo3/cms-frontend", - "version": "v11.5.35", + "version": "v11.5.37", "source": { "type": "git", "url": "https://github.com/TYPO3-CMS/frontend.git", - "reference": "3cbf314767b180789c1e79e1f7921aa2e937a492" + "reference": "fcaece6603e7c1459e7c921a142c96ec3349dfab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TYPO3-CMS/frontend/zipball/3cbf314767b180789c1e79e1f7921aa2e937a492", - "reference": "3cbf314767b180789c1e79e1f7921aa2e937a492", + "url": "https://api.github.com/repos/TYPO3-CMS/frontend/zipball/fcaece6603e7c1459e7c921a142c96ec3349dfab", + "reference": "fcaece6603e7c1459e7c921a142c96ec3349dfab", "shasum": "" }, "require": { "ext-libxml": "*", "symfony/polyfill-mbstring": "^1.23.1", - "typo3/cms-core": "11.5.35" + "typo3/cms-core": "11.5.37" }, "conflict": { "typo3/cms": "*" @@ -8274,20 +8529,20 @@ "issues": "https://forge.typo3.org", "source": "https://github.com/typo3/typo3" }, - "time": "2024-02-13T09:50:23+00:00" + "time": "2024-05-14T08:21:16+00:00" }, { "name": "typo3/cms-install", - "version": "v11.5.35", + "version": "v11.5.37", "source": { "type": "git", "url": "https://github.com/TYPO3-CMS/install.git", - "reference": "d03866734a06cf8430a73e028b5b6d4f9eb8a239" + "reference": "dc82ae45fb9048c34c24dc94cb5b0ea6d39fa059" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TYPO3-CMS/install/zipball/d03866734a06cf8430a73e028b5b6d4f9eb8a239", - "reference": "d03866734a06cf8430a73e028b5b6d4f9eb8a239", + "url": "https://api.github.com/repos/TYPO3-CMS/install/zipball/dc82ae45fb9048c34c24dc94cb5b0ea6d39fa059", + "reference": "dc82ae45fb9048c34c24dc94cb5b0ea6d39fa059", "shasum": "" }, "require": { @@ -8296,9 +8551,9 @@ "nikic/php-parser": "^4.13.2", "symfony/finder": "^5.4", "symfony/http-foundation": "^5.4", - "typo3/cms-core": "11.5.35", - "typo3/cms-extbase": "11.5.35", - "typo3/cms-fluid": "11.5.35" + "typo3/cms-core": "11.5.37", + "typo3/cms-extbase": "11.5.37", + "typo3/cms-fluid": "11.5.37" }, "conflict": { "typo3/cms": "*" @@ -8342,24 +8597,24 @@ "issues": "https://forge.typo3.org", "source": "https://github.com/typo3/typo3" }, - "time": "2024-02-13T09:50:23+00:00" + "time": "2024-05-14T08:21:16+00:00" }, { "name": "typo3/cms-recordlist", - "version": "v11.5.35", + "version": "v11.5.37", "source": { "type": "git", "url": "https://github.com/TYPO3-CMS/recordlist.git", - "reference": "7c6d935ac9a6b1051156354747a28cdb86a6ef1a" + "reference": "98a3d06afafb678bb9288ab1ad83023fb99870d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TYPO3-CMS/recordlist/zipball/7c6d935ac9a6b1051156354747a28cdb86a6ef1a", - "reference": "7c6d935ac9a6b1051156354747a28cdb86a6ef1a", + "url": "https://api.github.com/repos/TYPO3-CMS/recordlist/zipball/98a3d06afafb678bb9288ab1ad83023fb99870d0", + "reference": "98a3d06afafb678bb9288ab1ad83023fb99870d0", "shasum": "" }, "require": { - "typo3/cms-core": "11.5.35" + "typo3/cms-core": "11.5.37" }, "conflict": { "typo3/cms": "*" @@ -8402,7 +8657,7 @@ "issues": "https://forge.typo3.org", "source": "https://github.com/typo3/typo3" }, - "time": "2024-02-13T09:50:23+00:00" + "time": "2024-05-14T08:21:16+00:00" }, { "name": "typo3/testing-framework", @@ -8480,6 +8735,90 @@ }, "time": "2023-08-02T16:11:00+00:00" }, + { + "name": "vlucas/phpdotenv", + "version": "v5.6.0", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4", + "reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.1.2", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.2", + "symfony/polyfill-ctype": "^1.24", + "symfony/polyfill-mbstring": "^1.24", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-filter": "*", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true + }, + "branch-alias": { + "dev-master": "5.6-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2023-11-12T22:43:29+00:00" + }, { "name": "yosymfony/resource-watcher", "version": "v3.0.0", @@ -8544,7 +8883,7 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": "^7.4", + "php": "7.4 - 8.3", "ext-curl": "*", "ext-dom": "*", "ext-json": "*", diff --git a/composer.lock-t3v10 b/composer.lock-t3v10 deleted file mode 100644 index cf873f4aa..000000000 --- a/composer.lock-t3v10 +++ /dev/null @@ -1,8165 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "ee4a20957590a7014921de9fb0633c8e", - "packages": [ - { - "name": "caseyamcl/phpoaipmh", - "version": "v3.3.1", - "source": { - "type": "git", - "url": "https://github.com/caseyamcl/phpoaipmh.git", - "reference": "17aaacafa62654b8360cfcef7db42fc6c0dc4f47" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/caseyamcl/phpoaipmh/zipball/17aaacafa62654b8360cfcef7db42fc6c0dc4f47", - "reference": "17aaacafa62654b8360cfcef7db42fc6c0dc4f47", - "shasum": "" - }, - "require": { - "ext-simplexml": "*", - "php": ">=5.5.0" - }, - "require-dev": { - "guzzlehttp/guzzle": "^6.0|^7.0", - "jaschilz/php-coverage-badger": "^2.0", - "mockery/mockery": "^0.9", - "phpunit/phpunit": "^8.5", - "squizlabs/php_codesniffer": "^3.5", - "symfony/config": "^3.4|^4.3|^5.0", - "symfony/console": "^3.4|^4.3|^5.0", - "symfony/dependency-injection": "^3.4.26|^4.3|^5.0", - "symfony/yaml": "^3.4|^4.3|^5.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Phpoaipmh\\": [ - "src/", - "tests" - ], - "Phpoaipmh\\Example\\": "example/src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Casey McLaughlin", - "email": "caseyamcl@gmail.com", - "homepage": "http://caseymclaughlin.com", - "role": "Developer" - } - ], - "description": "A PHP OAI-PMH 2.0 Harvester library", - "homepage": "https://github.com/caseyamcl/phpoaipmh", - "keywords": [ - "Harvester", - "OAI", - "OAI-PMH" - ], - "support": { - "issues": "https://github.com/caseyamcl/phpoaipmh/issues", - "source": "https://github.com/caseyamcl/phpoaipmh/tree/v3.3.1" - }, - "time": "2023-01-27T17:40:27+00:00" - }, - { - "name": "doctrine/annotations", - "version": "1.14.3", - "source": { - "type": "git", - "url": "https://github.com/doctrine/annotations.git", - "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", - "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", - "shasum": "" - }, - "require": { - "doctrine/lexer": "^1 || ^2", - "ext-tokenizer": "*", - "php": "^7.1 || ^8.0", - "psr/cache": "^1 || ^2 || ^3" - }, - "require-dev": { - "doctrine/cache": "^1.11 || ^2.0", - "doctrine/coding-standard": "^9 || ^10", - "phpstan/phpstan": "~1.4.10 || ^1.8.0", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "symfony/cache": "^4.4 || ^5.4 || ^6", - "vimeo/psalm": "^4.10" - }, - "suggest": { - "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Docblock Annotations Parser", - "homepage": "https://www.doctrine-project.org/projects/annotations.html", - "keywords": [ - "annotations", - "docblock", - "parser" - ], - "support": { - "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.14.3" - }, - "time": "2023-02-01T09:20:38+00:00" - }, - { - "name": "doctrine/cache", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/cache.git", - "reference": "1ca8f21980e770095a31456042471a57bc4c68fb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb", - "reference": "1ca8f21980e770095a31456042471a57bc4c68fb", - "shasum": "" - }, - "require": { - "php": "~7.1 || ^8.0" - }, - "conflict": { - "doctrine/common": ">2.2,<2.4" - }, - "require-dev": { - "cache/integration-tests": "dev-master", - "doctrine/coding-standard": "^9", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "psr/cache": "^1.0 || ^2.0 || ^3.0", - "symfony/cache": "^4.4 || ^5.4 || ^6", - "symfony/var-exporter": "^4.4 || ^5.4 || ^6" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", - "homepage": "https://www.doctrine-project.org/projects/cache.html", - "keywords": [ - "abstraction", - "apcu", - "cache", - "caching", - "couchdb", - "memcached", - "php", - "redis", - "xcache" - ], - "support": { - "issues": "https://github.com/doctrine/cache/issues", - "source": "https://github.com/doctrine/cache/tree/2.2.0" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", - "type": "tidelift" - } - ], - "time": "2022-05-20T20:07:39+00:00" - }, - { - "name": "doctrine/dbal", - "version": "2.13.9", - "source": { - "type": "git", - "url": "https://github.com/doctrine/dbal.git", - "reference": "c480849ca3ad6706a39c970cdfe6888fa8a058b8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/c480849ca3ad6706a39c970cdfe6888fa8a058b8", - "reference": "c480849ca3ad6706a39c970cdfe6888fa8a058b8", - "shasum": "" - }, - "require": { - "doctrine/cache": "^1.0|^2.0", - "doctrine/deprecations": "^0.5.3|^1", - "doctrine/event-manager": "^1.0", - "ext-pdo": "*", - "php": "^7.1 || ^8" - }, - "require-dev": { - "doctrine/coding-standard": "9.0.0", - "jetbrains/phpstorm-stubs": "2021.1", - "phpstan/phpstan": "1.4.6", - "phpunit/phpunit": "^7.5.20|^8.5|9.5.16", - "psalm/plugin-phpunit": "0.16.1", - "squizlabs/php_codesniffer": "3.6.2", - "symfony/cache": "^4.4", - "symfony/console": "^2.0.5|^3.0|^4.0|^5.0", - "vimeo/psalm": "4.22.0" - }, - "suggest": { - "symfony/console": "For helpful console commands such as SQL execution and import of files." - }, - "bin": [ - "bin/doctrine-dbal" - ], - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\DBAL\\": "lib/Doctrine/DBAL" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - } - ], - "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", - "homepage": "https://www.doctrine-project.org/projects/dbal.html", - "keywords": [ - "abstraction", - "database", - "db2", - "dbal", - "mariadb", - "mssql", - "mysql", - "oci8", - "oracle", - "pdo", - "pgsql", - "postgresql", - "queryobject", - "sasql", - "sql", - "sqlanywhere", - "sqlite", - "sqlserver", - "sqlsrv" - ], - "support": { - "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/2.13.9" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal", - "type": "tidelift" - } - ], - "time": "2022-05-02T20:28:55+00:00" - }, - { - "name": "doctrine/deprecations", - "version": "1.1.3", - "source": { - "type": "git", - "url": "https://github.com/doctrine/deprecations.git", - "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", - "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^9", - "phpstan/phpstan": "1.4.10 || 1.10.15", - "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "psalm/plugin-phpunit": "0.18.4", - "psr/log": "^1 || ^2 || ^3", - "vimeo/psalm": "4.30.0 || 5.12.0" - }, - "suggest": { - "psr/log": "Allows logging deprecations via PSR-3 logger implementation" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", - "homepage": "https://www.doctrine-project.org/", - "support": { - "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/1.1.3" - }, - "time": "2024-01-30T19:34:25+00:00" - }, - { - "name": "doctrine/event-manager", - "version": "1.2.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/event-manager.git", - "reference": "95aa4cb529f1e96576f3fda9f5705ada4056a520" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/95aa4cb529f1e96576f3fda9f5705ada4056a520", - "reference": "95aa4cb529f1e96576f3fda9f5705ada4056a520", - "shasum": "" - }, - "require": { - "doctrine/deprecations": "^0.5.3 || ^1", - "php": "^7.1 || ^8.0" - }, - "conflict": { - "doctrine/common": "<2.9" - }, - "require-dev": { - "doctrine/coding-standard": "^9 || ^10", - "phpstan/phpstan": "~1.4.10 || ^1.8.8", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.24" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", - "homepage": "https://www.doctrine-project.org/projects/event-manager.html", - "keywords": [ - "event", - "event dispatcher", - "event manager", - "event system", - "events" - ], - "support": { - "issues": "https://github.com/doctrine/event-manager/issues", - "source": "https://github.com/doctrine/event-manager/tree/1.2.0" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager", - "type": "tidelift" - } - ], - "time": "2022-10-12T20:51:15+00:00" - }, - { - "name": "doctrine/instantiator", - "version": "1.5.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b", - "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^9 || ^11", - "ext-pdo": "*", - "ext-phar": "*", - "phpbench/phpbench": "^0.16 || ^1", - "phpstan/phpstan": "^1.4", - "phpstan/phpstan-phpunit": "^1", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.30 || ^5.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "https://ocramius.github.io/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://www.doctrine-project.org/projects/instantiator.html", - "keywords": [ - "constructor", - "instantiate" - ], - "support": { - "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.5.0" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", - "type": "tidelift" - } - ], - "time": "2022-12-30T00:15:36+00:00" - }, - { - "name": "doctrine/lexer", - "version": "1.2.3", - "source": { - "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/c268e882d4dbdd85e36e4ad69e02dc284f89d229", - "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^9.0", - "phpstan/phpstan": "^1.3", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.11" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", - "homepage": "https://www.doctrine-project.org/projects/lexer.html", - "keywords": [ - "annotations", - "docblock", - "lexer", - "parser", - "php" - ], - "support": { - "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/1.2.3" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", - "type": "tidelift" - } - ], - "time": "2022-02-28T11:07:21+00:00" - }, - { - "name": "egulias/email-validator", - "version": "2.1.25", - "source": { - "type": "git", - "url": "https://github.com/egulias/EmailValidator.git", - "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/0dbf5d78455d4d6a41d186da50adc1122ec066f4", - "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4", - "shasum": "" - }, - "require": { - "doctrine/lexer": "^1.0.1", - "php": ">=5.5", - "symfony/polyfill-intl-idn": "^1.10" - }, - "require-dev": { - "dominicsayers/isemail": "^3.0.7", - "phpunit/phpunit": "^4.8.36|^7.5.15", - "satooshi/php-coveralls": "^1.0.1" - }, - "suggest": { - "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Egulias\\EmailValidator\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Eduardo Gulias Davis" - } - ], - "description": "A library for validating emails against several RFCs", - "homepage": "https://github.com/egulias/EmailValidator", - "keywords": [ - "email", - "emailvalidation", - "emailvalidator", - "validation", - "validator" - ], - "support": { - "issues": "https://github.com/egulias/EmailValidator/issues", - "source": "https://github.com/egulias/EmailValidator/tree/2.1.25" - }, - "funding": [ - { - "url": "https://github.com/egulias", - "type": "github" - } - ], - "time": "2020-12-29T14:50:06+00:00" - }, - { - "name": "enshrined/svg-sanitize", - "version": "0.15.4", - "source": { - "type": "git", - "url": "https://github.com/darylldoyle/svg-sanitizer.git", - "reference": "e50b83a2f1f296ca61394fe88fbfe3e896a84cf4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/darylldoyle/svg-sanitizer/zipball/e50b83a2f1f296ca61394fe88fbfe3e896a84cf4", - "reference": "e50b83a2f1f296ca61394fe88fbfe3e896a84cf4", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "php": "^7.0 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.5 || ^8.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "enshrined\\svgSanitize\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "GPL-2.0-or-later" - ], - "authors": [ - { - "name": "Daryll Doyle", - "email": "daryll@enshrined.co.uk" - } - ], - "description": "An SVG sanitizer for PHP", - "support": { - "issues": "https://github.com/darylldoyle/svg-sanitizer/issues", - "source": "https://github.com/darylldoyle/svg-sanitizer/tree/0.15.4" - }, - "time": "2022-02-21T09:13:59+00:00" - }, - { - "name": "flow/jsonpath", - "version": "0.5.0", - "source": { - "type": "git", - "url": "https://github.com/FlowCommunications/JSONPath.git", - "reference": "b9738858c75d008c1211612b973e9510f8b7f8ea" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/FlowCommunications/JSONPath/zipball/b9738858c75d008c1211612b973e9510f8b7f8ea", - "reference": "b9738858c75d008c1211612b973e9510f8b7f8ea", - "shasum": "" - }, - "require": { - "php": ">=5.4.0" - }, - "require-dev": { - "peekmo/jsonpath": "dev-master", - "phpunit/phpunit": "^7.0" - }, - "type": "library", - "autoload": { - "psr-0": { - "Flow\\JSONPath": "src/", - "Flow\\JSONPath\\Test": "tests/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Stephen Frank", - "email": "stephen@flowsa.com" - } - ], - "description": "JSONPath implementation for parsing, searching and flattening arrays", - "support": { - "issues": "https://github.com/FlowCommunications/JSONPath/issues", - "source": "https://github.com/FlowCommunications/JSONPath/tree/0.5.0" - }, - "abandoned": "softcreatr/jsonpath", - "time": "2019-07-15T17:23:22+00:00" - }, - { - "name": "guzzlehttp/guzzle", - "version": "6.5.8", - "source": { - "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "a52f0440530b54fa079ce76e8c5d196a42cad981" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/a52f0440530b54fa079ce76e8c5d196a42cad981", - "reference": "a52f0440530b54fa079ce76e8c5d196a42cad981", - "shasum": "" - }, - "require": { - "ext-json": "*", - "guzzlehttp/promises": "^1.0", - "guzzlehttp/psr7": "^1.9", - "php": ">=5.5", - "symfony/polyfill-intl-idn": "^1.17" - }, - "require-dev": { - "ext-curl": "*", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", - "psr/log": "^1.1" - }, - "suggest": { - "psr/log": "Required for using the Log middleware" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "6.5-dev" - } - }, - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "GuzzleHttp\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Jeremy Lindblom", - "email": "jeremeamia@gmail.com", - "homepage": "https://github.com/jeremeamia" - }, - { - "name": "George Mponos", - "email": "gmponos@gmail.com", - "homepage": "https://github.com/gmponos" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://github.com/sagikazarmark" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" - } - ], - "description": "Guzzle is a PHP HTTP client library", - "homepage": "http://guzzlephp.org/", - "keywords": [ - "client", - "curl", - "framework", - "http", - "http client", - "rest", - "web service" - ], - "support": { - "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/6.5.8" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", - "type": "tidelift" - } - ], - "time": "2022-06-20T22:16:07+00:00" - }, - { - "name": "guzzlehttp/promises", - "version": "1.5.3", - "source": { - "type": "git", - "url": "https://github.com/guzzle/promises.git", - "reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/67ab6e18aaa14d753cc148911d273f6e6cb6721e", - "reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e", - "shasum": "" - }, - "require": { - "php": ">=5.5" - }, - "require-dev": { - "symfony/phpunit-bridge": "^4.4 || ^5.1" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "GuzzleHttp\\Promise\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" - } - ], - "description": "Guzzle promises library", - "keywords": [ - "promise" - ], - "support": { - "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/1.5.3" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", - "type": "tidelift" - } - ], - "time": "2023-05-21T12:31:43+00:00" - }, - { - "name": "guzzlehttp/psr7", - "version": "1.9.1", - "source": { - "type": "git", - "url": "https://github.com/guzzle/psr7.git", - "reference": "e4490cabc77465aaee90b20cfc9a770f8c04be6b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/e4490cabc77465aaee90b20cfc9a770f8c04be6b", - "reference": "e4490cabc77465aaee90b20cfc9a770f8c04be6b", - "shasum": "" - }, - "require": { - "php": ">=5.4.0", - "psr/http-message": "~1.0", - "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" - }, - "provide": { - "psr/http-message-implementation": "1.0" - }, - "require-dev": { - "ext-zlib": "*", - "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10" - }, - "suggest": { - "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "GuzzleHttp\\Psr7\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "George Mponos", - "email": "gmponos@gmail.com", - "homepage": "https://github.com/gmponos" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://github.com/sagikazarmark" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" - } - ], - "description": "PSR-7 message implementation that also provides common utility methods", - "keywords": [ - "http", - "message", - "psr-7", - "request", - "response", - "stream", - "uri", - "url" - ], - "support": { - "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/1.9.1" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", - "type": "tidelift" - } - ], - "time": "2023-04-17T16:00:37+00:00" - }, - { - "name": "lolli42/finediff", - "version": "1.0.3", - "source": { - "type": "git", - "url": "https://github.com/lolli42/FineDiff.git", - "reference": "8d535de757062fed8412833f5eede7064595ca5b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/lolli42/FineDiff/zipball/8d535de757062fed8412833f5eede7064595ca5b", - "reference": "8d535de757062fed8412833f5eede7064595ca5b", - "shasum": "" - }, - "require": { - "php": ">=7.2.0", - "symfony/polyfill-mbstring": "^1.23" - }, - "replace": { - "cogpowered/finediff": "*" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^3.4", - "phpstan/phpstan": "^1.9.14", - "phpunit/phpunit": "^8.5.33 || ^9.6.11 || ^10.3.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "cogpowered\\FineDiff\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Raymond Hill" - }, - { - "name": "Rob Crowe", - "email": "rob@cogpowered.com" - }, - { - "name": "Christian Kuhn", - "email": "lolli@schwarzbu.ch", - "role": "maintainer" - } - ], - "description": "PHP implementation of a Fine granularity Diff engine", - "homepage": "https://github.com/lolli42/FineDiff", - "keywords": [ - "diff", - "finediff", - "opcode", - "string", - "text" - ], - "support": { - "issues": "https://github.com/lolli42/FineDiff/issues", - "source": "https://github.com/lolli42/FineDiff/tree/1.0.3" - }, - "time": "2024-02-06T13:56:20+00:00" - }, - { - "name": "masterminds/html5", - "version": "2.8.1", - "source": { - "type": "git", - "url": "https://github.com/Masterminds/html5-php.git", - "reference": "f47dcf3c70c584de14f21143c55d9939631bc6cf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f47dcf3c70c584de14f21143c55d9939631bc6cf", - "reference": "f47dcf3c70c584de14f21143c55d9939631bc6cf", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } - }, - "autoload": { - "psr-4": { - "Masterminds\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Matt Butcher", - "email": "technosophos@gmail.com" - }, - { - "name": "Matt Farina", - "email": "matt@mattfarina.com" - }, - { - "name": "Asmir Mustafic", - "email": "goetas@gmail.com" - } - ], - "description": "An HTML5 parser and serializer.", - "homepage": "http://masterminds.github.io/html5-php", - "keywords": [ - "HTML5", - "dom", - "html", - "parser", - "querypath", - "serializer", - "xml" - ], - "support": { - "issues": "https://github.com/Masterminds/html5-php/issues", - "source": "https://github.com/Masterminds/html5-php/tree/2.8.1" - }, - "time": "2023-05-10T11:58:31+00:00" - }, - { - "name": "nikic/php-parser", - "version": "v4.18.0", - "source": { - "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999", - "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": ">=7.0" - }, - "require-dev": { - "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" - }, - "bin": [ - "bin/php-parse" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.9-dev" - } - }, - "autoload": { - "psr-4": { - "PhpParser\\": "lib/PhpParser" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Nikita Popov" - } - ], - "description": "A PHP parser written in PHP", - "keywords": [ - "parser", - "php" - ], - "support": { - "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.18.0" - }, - "time": "2023-12-10T21:03:43+00:00" - }, - { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", - "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" - }, - "time": "2020-06-27T09:03:43+00:00" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "5.3.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", - "shasum": "" - }, - "require": { - "ext-filter": "*", - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", - "webmozart/assert": "^1.9.1" - }, - "require-dev": { - "mockery/mockery": "~1.3.2", - "psalm/phar": "^4.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - }, - { - "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" - }, - "time": "2021-10-19T17:43:47+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.8.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "fad452781b3d774e3337b0c0b245dd8e5a4455fc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/fad452781b3d774e3337b0c0b245dd8e5a4455fc", - "reference": "fad452781b3d774e3337b0c0b245dd8e5a4455fc", - "shasum": "" - }, - "require": { - "doctrine/deprecations": "^1.0", - "php": "^7.4 || ^8.0", - "phpdocumentor/reflection-common": "^2.0", - "phpstan/phpdoc-parser": "^1.13" - }, - "require-dev": { - "ext-tokenizer": "*", - "phpbench/phpbench": "^1.2", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-phpunit": "^1.1", - "phpunit/phpunit": "^9.5", - "rector/rector": "^0.13.9", - "vimeo/psalm": "^4.25" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "support": { - "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.8.0" - }, - "time": "2024-01-11T11:49:22+00:00" - }, - { - "name": "phpstan/phpdoc-parser", - "version": "1.25.0", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "bd84b629c8de41aa2ae82c067c955e06f1b00240" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/bd84b629c8de41aa2ae82c067c955e06f1b00240", - "reference": "bd84b629c8de41aa2ae82c067c955e06f1b00240", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "doctrine/annotations": "^2.0", - "nikic/php-parser": "^4.15", - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^1.5", - "phpstan/phpstan-phpunit": "^1.1", - "phpstan/phpstan-strict-rules": "^1.0", - "phpunit/phpunit": "^9.5", - "symfony/process": "^5.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "PHPStan\\PhpDocParser\\": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHPDoc parser with support for nullable, intersection and generic types", - "support": { - "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.25.0" - }, - "time": "2024-01-04T17:06:16+00:00" - }, - { - "name": "psr/cache", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Cache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for caching libraries", - "keywords": [ - "cache", - "psr", - "psr-6" - ], - "support": { - "source": "https://github.com/php-fig/cache/tree/master" - }, - "time": "2016-08-06T20:24:11+00:00" - }, - { - "name": "psr/container", - "version": "1.1.2", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", - "shasum": "" - }, - "require": { - "php": ">=7.4.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.2" - }, - "time": "2021-11-05T16:50:12+00:00" - }, - { - "name": "psr/event-dispatcher", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/event-dispatcher.git", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\EventDispatcher\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Standard interfaces for event handling.", - "keywords": [ - "events", - "psr", - "psr-14" - ], - "support": { - "issues": "https://github.com/php-fig/event-dispatcher/issues", - "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" - }, - "time": "2019-01-08T18:20:26+00:00" - }, - { - "name": "psr/http-client", - "version": "1.0.3", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-client.git", - "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", - "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", - "shasum": "" - }, - "require": { - "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0 || ^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Client\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP clients", - "homepage": "https://github.com/php-fig/http-client", - "keywords": [ - "http", - "http-client", - "psr", - "psr-18" - ], - "support": { - "source": "https://github.com/php-fig/http-client" - }, - "time": "2023-09-23T14:17:50+00:00" - }, - { - "name": "psr/http-factory", - "version": "1.0.2", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-factory.git", - "reference": "e616d01114759c4c489f93b099585439f795fe35" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", - "reference": "e616d01114759c4c489f93b099585439f795fe35", - "shasum": "" - }, - "require": { - "php": ">=7.0.0", - "psr/http-message": "^1.0 || ^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interfaces for PSR-7 HTTP message factories", - "keywords": [ - "factory", - "http", - "message", - "psr", - "psr-17", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-factory/tree/1.0.2" - }, - "time": "2023-04-10T20:10:41+00:00" - }, - { - "name": "psr/http-message", - "version": "1.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba", - "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-message/tree/1.1" - }, - "time": "2023-04-04T09:50:52+00:00" - }, - { - "name": "psr/http-server-handler", - "version": "1.0.2", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-server-handler.git", - "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/84c4fb66179be4caaf8e97bd239203245302e7d4", - "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4", - "shasum": "" - }, - "require": { - "php": ">=7.0", - "psr/http-message": "^1.0 || ^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Server\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP server-side request handler", - "keywords": [ - "handler", - "http", - "http-interop", - "psr", - "psr-15", - "psr-7", - "request", - "response", - "server" - ], - "support": { - "source": "https://github.com/php-fig/http-server-handler/tree/1.0.2" - }, - "time": "2023-04-10T20:06:20+00:00" - }, - { - "name": "psr/http-server-middleware", - "version": "1.0.2", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-server-middleware.git", - "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/c1481f747daaa6a0782775cd6a8c26a1bf4a3829", - "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829", - "shasum": "" - }, - "require": { - "php": ">=7.0", - "psr/http-message": "^1.0 || ^2.0", - "psr/http-server-handler": "^1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Server\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP server-side middleware", - "keywords": [ - "http", - "http-interop", - "middleware", - "psr", - "psr-15", - "psr-7", - "request", - "response" - ], - "support": { - "issues": "https://github.com/php-fig/http-server-middleware/issues", - "source": "https://github.com/php-fig/http-server-middleware/tree/1.0.2" - }, - "time": "2023-04-11T06:14:47+00:00" - }, - { - "name": "psr/log", - "version": "1.1.4", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "support": { - "source": "https://github.com/php-fig/log/tree/1.1.4" - }, - "time": "2021-05-03T11:20:27+00:00" - }, - { - "name": "ralouphie/getallheaders", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/ralouphie/getallheaders.git", - "reference": "120b605dfeb996808c31b6477290a714d356e822" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", - "reference": "120b605dfeb996808c31b6477290a714d356e822", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "^5 || ^6.5" - }, - "type": "library", - "autoload": { - "files": [ - "src/getallheaders.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ralph Khattar", - "email": "ralph.khattar@gmail.com" - } - ], - "description": "A polyfill for getallheaders.", - "support": { - "issues": "https://github.com/ralouphie/getallheaders/issues", - "source": "https://github.com/ralouphie/getallheaders/tree/develop" - }, - "time": "2019-03-08T08:55:37+00:00" - }, - { - "name": "solarium/solarium", - "version": "5.2.0", - "source": { - "type": "git", - "url": "https://github.com/solariumphp/solarium.git", - "reference": "9208b615cb2ed6f306be6e696431b6b71e4d42db" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/solariumphp/solarium/zipball/9208b615cb2ed6f306be6e696431b6b71e4d42db", - "reference": "9208b615cb2ed6f306be6e696431b6b71e4d42db", - "shasum": "" - }, - "require": { - "ext-json": "*", - "php": "^7.1.3", - "psr/http-client": "^1.0", - "psr/http-factory": "^1.0", - "symfony/event-dispatcher": "^4.3 || ^5.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.16", - "guzzlehttp/guzzle": "^3.8 || ^6.2", - "nyholm/psr7": "^1.2", - "php-coveralls/php-coveralls": "^2.1", - "php-http/guzzle6-adapter": "^2.0", - "phpunit/phpunit": "^8.0", - "squizlabs/php_codesniffer": "^3.4", - "symfony/phpunit-bridge": "^5.0", - "zendframework/zend-http": "^2.8" - }, - "suggest": { - "minimalcode/search": "Query builder compatible with Solarium, allows simplified solr-query handling" - }, - "type": "library", - "autoload": { - "psr-4": { - "Solarium\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "See GitHub contributors", - "homepage": "https://github.com/basdenooijer/solarium/contributors" - } - ], - "description": "PHP Solr client", - "homepage": "http://www.solarium-project.org", - "keywords": [ - "php", - "search", - "solr" - ], - "support": { - "issues": "https://github.com/solariumphp/solarium/issues", - "source": "https://github.com/solariumphp/solarium/tree/5.x" - }, - "time": "2020-04-03T22:16:30+00:00" - }, - { - "name": "symfony/cache", - "version": "v5.4.35", - "source": { - "type": "git", - "url": "https://github.com/symfony/cache.git", - "reference": "db1adb004e2da984085d0178964eb6f319d3cba1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/db1adb004e2da984085d0178964eb6f319d3cba1", - "reference": "db1adb004e2da984085d0178964eb6f319d3cba1", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/cache": "^1.0|^2.0", - "psr/log": "^1.1|^2|^3", - "symfony/cache-contracts": "^1.1.7|^2", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/var-exporter": "^4.4|^5.0|^6.0" - }, - "conflict": { - "doctrine/dbal": "<2.13.1", - "symfony/dependency-injection": "<4.4", - "symfony/http-kernel": "<4.4", - "symfony/var-dumper": "<4.4" - }, - "provide": { - "psr/cache-implementation": "1.0|2.0", - "psr/simple-cache-implementation": "1.0|2.0", - "symfony/cache-implementation": "1.0|2.0" - }, - "require-dev": { - "cache/integration-tests": "dev-master", - "doctrine/cache": "^1.6|^2.0", - "doctrine/dbal": "^2.13.1|^3|^4", - "predis/predis": "^1.1", - "psr/simple-cache": "^1.0|^2.0", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/filesystem": "^4.4|^5.0|^6.0", - "symfony/http-kernel": "^4.4|^5.0|^6.0", - "symfony/messenger": "^4.4|^5.0|^6.0", - "symfony/var-dumper": "^4.4|^5.0|^6.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Cache\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides extended PSR-6, PSR-16 (and tags) implementations", - "homepage": "https://symfony.com", - "keywords": [ - "caching", - "psr6" - ], - "support": { - "source": "https://github.com/symfony/cache/tree/v5.4.35" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-01-23T13:51:25+00:00" - }, - { - "name": "symfony/cache-contracts", - "version": "v2.5.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/cache-contracts.git", - "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/64be4a7acb83b6f2bf6de9a02cee6dad41277ebc", - "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/cache": "^1.0|^2.0|^3.0" - }, - "suggest": { - "symfony/cache-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Cache\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to caching", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v2.5.2" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-01-02T09:53:40+00:00" - }, - { - "name": "symfony/config", - "version": "v5.4.35", - "source": { - "type": "git", - "url": "https://github.com/symfony/config.git", - "reference": "6b763438a22a4f20885e994ad6702f6a3f25430e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/6b763438a22a4f20885e994ad6702f6a3f25430e", - "reference": "6b763438a22a4f20885e994ad6702f6a3f25430e", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/filesystem": "^4.4|^5.0|^6.0", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-php80": "^1.16", - "symfony/polyfill-php81": "^1.22" - }, - "conflict": { - "symfony/finder": "<4.4" - }, - "require-dev": { - "symfony/event-dispatcher": "^4.4|^5.0|^6.0", - "symfony/finder": "^4.4|^5.0|^6.0", - "symfony/messenger": "^4.4|^5.0|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/yaml": "^4.4|^5.0|^6.0" - }, - "suggest": { - "symfony/yaml": "To use the yaml reference dumper" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Config\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/config/tree/v5.4.35" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-01-23T13:51:25+00:00" - }, - { - "name": "symfony/console", - "version": "v5.4.35", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "dbdf6adcb88d5f83790e1efb57ef4074309d3931" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/dbdf6adcb88d5f83790e1efb57ef4074309d3931", - "reference": "dbdf6adcb88d5f83790e1efb57ef4074309d3931", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/string": "^5.1|^6.0" - }, - "conflict": { - "psr/log": ">=3", - "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", - "symfony/lock": "<4.4", - "symfony/process": "<4.4" - }, - "provide": { - "psr/log-implementation": "1.0|2.0" - }, - "require-dev": { - "psr/log": "^1|^2", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/event-dispatcher": "^4.4|^5.0|^6.0", - "symfony/lock": "^4.4|^5.0|^6.0", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/var-dumper": "^4.4|^5.0|^6.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Eases the creation of beautiful and testable command line interfaces", - "homepage": "https://symfony.com", - "keywords": [ - "cli", - "command-line", - "console", - "terminal" - ], - "support": { - "source": "https://github.com/symfony/console/tree/v5.4.35" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-01-23T14:28:09+00:00" - }, - { - "name": "symfony/dependency-injection", - "version": "v5.4.35", - "source": { - "type": "git", - "url": "https://github.com/symfony/dependency-injection.git", - "reference": "45474d527212ca67cdb93f6c5e6da68f4bc67118" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/45474d527212ca67cdb93f6c5e6da68f4bc67118", - "reference": "45474d527212ca67cdb93f6c5e6da68f4bc67118", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/container": "^1.1.1", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php80": "^1.16", - "symfony/polyfill-php81": "^1.22", - "symfony/service-contracts": "^1.1.6|^2" - }, - "conflict": { - "ext-psr": "<1.1|>=2", - "symfony/config": "<5.3", - "symfony/finder": "<4.4", - "symfony/proxy-manager-bridge": "<4.4", - "symfony/yaml": "<4.4.26" - }, - "provide": { - "psr/container-implementation": "1.0", - "symfony/service-implementation": "1.0|2.0" - }, - "require-dev": { - "symfony/config": "^5.3|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/yaml": "^4.4.26|^5.0|^6.0" - }, - "suggest": { - "symfony/config": "", - "symfony/expression-language": "For using expressions in service container configuration", - "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", - "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", - "symfony/yaml": "" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\DependencyInjection\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Allows you to standardize and centralize the way objects are constructed in your application", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v5.4.35" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-01-29T20:37:36+00:00" - }, - { - "name": "symfony/deprecation-contracts", - "version": "v2.5.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "files": [ - "function.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-01-02T09:53:40+00:00" - }, - { - "name": "symfony/event-dispatcher", - "version": "v5.4.35", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "7a69a85c7ea5bdd1e875806a99c51a87d3a74b38" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/7a69a85c7ea5bdd1e875806a99c51a87d3a74b38", - "reference": "7a69a85c7ea5bdd1e875806a99c51a87d3a74b38", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/event-dispatcher-contracts": "^2|^3", - "symfony/polyfill-php80": "^1.16" - }, - "conflict": { - "symfony/dependency-injection": "<4.4" - }, - "provide": { - "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "2.0" - }, - "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/error-handler": "^4.4|^5.0|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/http-foundation": "^4.4|^5.0|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/stopwatch": "^4.4|^5.0|^6.0" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\EventDispatcher\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.35" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-01-23T13:51:25+00:00" - }, - { - "name": "symfony/event-dispatcher-contracts", - "version": "v2.5.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/f98b54df6ad059855739db6fcbc2d36995283fe1", - "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/event-dispatcher": "^1" - }, - "suggest": { - "symfony/event-dispatcher-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\EventDispatcher\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to dispatching event", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.2" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-01-02T09:53:40+00:00" - }, - { - "name": "symfony/expression-language", - "version": "v5.4.35", - "source": { - "type": "git", - "url": "https://github.com/symfony/expression-language.git", - "reference": "d59441c10a5a73cd9d4d778b8253595a16f6716d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/expression-language/zipball/d59441c10a5a73cd9d4d778b8253595a16f6716d", - "reference": "d59441c10a5a73cd9d4d778b8253595a16f6716d", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/cache": "^4.4|^5.0|^6.0", - "symfony/service-contracts": "^1.1|^2|^3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\ExpressionLanguage\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides an engine that can compile and evaluate expressions", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/expression-language/tree/v5.4.35" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-01-23T13:51:25+00:00" - }, - { - "name": "symfony/filesystem", - "version": "v5.4.35", - "source": { - "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "5a553607d4ffbfa9c0ab62facadea296c9db7086" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/5a553607d4ffbfa9c0ab62facadea296c9db7086", - "reference": "5a553607d4ffbfa9c0ab62facadea296c9db7086", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8", - "symfony/polyfill-php80": "^1.16" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Filesystem\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides basic utilities for the filesystem", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.4.35" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-01-23T13:51:25+00:00" - }, - { - "name": "symfony/finder", - "version": "v5.4.35", - "source": { - "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "abe6d6f77d9465fed3cd2d029b29d03b56b56435" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/abe6d6f77d9465fed3cd2d029b29d03b56b56435", - "reference": "abe6d6f77d9465fed3cd2d029b29d03b56b56435", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php80": "^1.16" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Finds files and directories via an intuitive fluent interface", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.35" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-01-23T13:51:25+00:00" - }, - { - "name": "symfony/http-foundation", - "version": "v5.4.35", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-foundation.git", - "reference": "f2ab692a22aef1cd54beb893aa0068bdfb093928" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f2ab692a22aef1cd54beb893aa0068bdfb093928", - "reference": "f2ab692a22aef1cd54beb893aa0068bdfb093928", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php80": "^1.16" - }, - "require-dev": { - "predis/predis": "~1.0", - "symfony/cache": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", - "symfony/mime": "^4.4|^5.0|^6.0", - "symfony/rate-limiter": "^5.2|^6.0" - }, - "suggest": { - "symfony/mime": "To use the file extension guesser" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\HttpFoundation\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Defines an object-oriented layer for the HTTP specification", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.4.35" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-01-23T13:51:25+00:00" - }, - { - "name": "symfony/mailer", - "version": "v5.4.35", - "source": { - "type": "git", - "url": "https://github.com/symfony/mailer.git", - "reference": "664724b0fb4646dee30859d0ed9131a2d7633320" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/664724b0fb4646dee30859d0ed9131a2d7633320", - "reference": "664724b0fb4646dee30859d0ed9131a2d7633320", - "shasum": "" - }, - "require": { - "egulias/email-validator": "^2.1.10|^3|^4", - "php": ">=7.2.5", - "psr/event-dispatcher": "^1", - "psr/log": "^1|^2|^3", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/event-dispatcher": "^4.4|^5.0|^6.0", - "symfony/mime": "^5.2.6|^6.0", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2|^3" - }, - "conflict": { - "symfony/http-kernel": "<4.4" - }, - "require-dev": { - "symfony/http-client": "^4.4|^5.0|^6.0", - "symfony/messenger": "^4.4|^5.0|^6.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Mailer\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Helps sending emails", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/mailer/tree/v5.4.35" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-01-29T07:33:37+00:00" - }, - { - "name": "symfony/mime", - "version": "v5.4.35", - "source": { - "type": "git", - "url": "https://github.com/symfony/mime.git", - "reference": "ee94d9b538f93abbbc1ee4ccff374593117b04a9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/ee94d9b538f93abbbc1ee4ccff374593117b04a9", - "reference": "ee94d9b538f93abbbc1ee4ccff374593117b04a9", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-intl-idn": "^1.10", - "symfony/polyfill-mbstring": "^1.0", - "symfony/polyfill-php80": "^1.16" - }, - "conflict": { - "egulias/email-validator": "~3.0.0", - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0", - "symfony/mailer": "<4.4", - "symfony/serializer": "<5.4.35|>=6,<6.3.12|>=6.4,<6.4.3" - }, - "require-dev": { - "egulias/email-validator": "^2.1.10|^3.1|^4", - "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/property-access": "^4.4|^5.1|^6.0", - "symfony/property-info": "^4.4|^5.1|^6.0", - "symfony/serializer": "^5.4.35|~6.3.12|^6.4.3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Mime\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Allows manipulating MIME messages", - "homepage": "https://symfony.com", - "keywords": [ - "mime", - "mime-type" - ], - "support": { - "source": "https://github.com/symfony/mime/tree/v5.4.35" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-01-30T08:00:51+00:00" - }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.29.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", - "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "provide": { - "ext-ctype": "*" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-01-29T20:11:03+00:00" - }, - { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.29.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", - "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's grapheme_* functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "grapheme", - "intl", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-01-29T20:11:03+00:00" - }, - { - "name": "symfony/polyfill-intl-icu", - "version": "v1.29.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-icu.git", - "reference": "07094a28851a49107f3ab4f9120ca2975a64b6e1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/07094a28851a49107f3ab4f9120ca2975a64b6e1", - "reference": "07094a28851a49107f3ab4f9120ca2975a64b6e1", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance and support of other locales than \"en\"" - }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Icu\\": "" - }, - "classmap": [ - "Resources/stubs" - ], - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's ICU-related data and classes", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "icu", - "intl", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.29.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-01-29T20:12:16+00:00" - }, - { - "name": "symfony/polyfill-intl-idn", - "version": "v1.29.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "a287ed7475f85bf6f61890146edbc932c0fff919" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a287ed7475f85bf6f61890146edbc932c0fff919", - "reference": "a287ed7475f85bf6f61890146edbc932c0fff919", - "shasum": "" - }, - "require": { - "php": ">=7.1", - "symfony/polyfill-intl-normalizer": "^1.10", - "symfony/polyfill-php72": "^1.10" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Idn\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Laurent Bassin", - "email": "laurent@bassin.info" - }, - { - "name": "Trevor Rowbotham", - "email": "trevor.rowbotham@pm.me" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "idn", - "intl", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.29.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-01-29T20:11:03+00:00" - }, - { - "name": "symfony/polyfill-intl-normalizer", - "version": "v1.29.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", - "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "intl", - "normalizer", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-01-29T20:11:03+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.29.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", - "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "provide": { - "ext-mbstring": "*" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-01-29T20:11:03+00:00" - }, - { - "name": "symfony/polyfill-php72", - "version": "v1.29.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/861391a8da9a04cbad2d232ddd9e4893220d6e25", - "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.29.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-01-29T20:11:03+00:00" - }, - { - "name": "symfony/polyfill-php73", - "version": "v1.29.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "21bd091060673a1177ae842c0ef8fe30893114d2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/21bd091060673a1177ae842c0ef8fe30893114d2", - "reference": "21bd091060673a1177ae842c0ef8fe30893114d2", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.29.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-01-29T20:11:03+00:00" - }, - { - "name": "symfony/polyfill-php80", - "version": "v1.29.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", - "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-01-29T20:11:03+00:00" - }, - { - "name": "symfony/polyfill-php81", - "version": "v1.29.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/c565ad1e63f30e7477fc40738343c62b40bc672d", - "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php81\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.29.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-01-29T20:11:03+00:00" - }, - { - "name": "symfony/property-access", - "version": "v5.4.35", - "source": { - "type": "git", - "url": "https://github.com/symfony/property-access.git", - "reference": "f1341758d8046cfff0ac748a0cad238f917191d4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/f1341758d8046cfff0ac748a0cad238f917191d4", - "reference": "f1341758d8046cfff0ac748a0cad238f917191d4", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php80": "^1.16", - "symfony/property-info": "^5.2|^6.0" - }, - "require-dev": { - "symfony/cache": "^4.4|^5.0|^6.0" - }, - "suggest": { - "psr/cache-implementation": "To cache access methods." - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\PropertyAccess\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides functions to read and write from/to an object or array using a simple string notation", - "homepage": "https://symfony.com", - "keywords": [ - "access", - "array", - "extraction", - "index", - "injection", - "object", - "property", - "property-path", - "reflection" - ], - "support": { - "source": "https://github.com/symfony/property-access/tree/v5.4.35" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-01-23T13:51:25+00:00" - }, - { - "name": "symfony/property-info", - "version": "v5.4.35", - "source": { - "type": "git", - "url": "https://github.com/symfony/property-info.git", - "reference": "d30d48f366ad2bfbf521256be85eb1c182c29198" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/d30d48f366ad2bfbf521256be85eb1c182c29198", - "reference": "d30d48f366ad2bfbf521256be85eb1c182c29198", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php80": "^1.16", - "symfony/string": "^5.1|^6.0" - }, - "conflict": { - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0", - "symfony/dependency-injection": "<4.4" - }, - "require-dev": { - "doctrine/annotations": "^1.10.4|^2", - "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "phpstan/phpdoc-parser": "^1.0", - "symfony/cache": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/serializer": "^4.4|^5.0|^6.0" - }, - "suggest": { - "phpdocumentor/reflection-docblock": "To use the PHPDoc", - "psr/cache-implementation": "To cache results", - "symfony/doctrine-bridge": "To use Doctrine metadata", - "symfony/serializer": "To use Serializer metadata" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\PropertyInfo\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Kévin Dunglas", - "email": "dunglas@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Extracts information about PHP class' properties using metadata of popular sources", - "homepage": "https://symfony.com", - "keywords": [ - "doctrine", - "phpdoc", - "property", - "symfony", - "type", - "validator" - ], - "support": { - "source": "https://github.com/symfony/property-info/tree/v5.4.35" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-01-23T15:43:50+00:00" - }, - { - "name": "symfony/routing", - "version": "v5.4.35", - "source": { - "type": "git", - "url": "https://github.com/symfony/routing.git", - "reference": "86c5a06a61ddaf17efa1403542e3d7146af96203" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/86c5a06a61ddaf17efa1403542e3d7146af96203", - "reference": "86c5a06a61ddaf17efa1403542e3d7146af96203", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php80": "^1.16" - }, - "conflict": { - "doctrine/annotations": "<1.12", - "symfony/config": "<5.3", - "symfony/dependency-injection": "<4.4", - "symfony/yaml": "<4.4" - }, - "require-dev": { - "doctrine/annotations": "^1.12|^2", - "psr/log": "^1|^2|^3", - "symfony/config": "^5.3|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/http-foundation": "^4.4|^5.0|^6.0", - "symfony/yaml": "^4.4|^5.0|^6.0" - }, - "suggest": { - "symfony/config": "For using the all-in-one router or any loader", - "symfony/expression-language": "For using expression matching", - "symfony/http-foundation": "For using a Symfony Request object", - "symfony/yaml": "For using the YAML loader" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Routing\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Maps an HTTP request to a set of configuration variables", - "homepage": "https://symfony.com", - "keywords": [ - "router", - "routing", - "uri", - "url" - ], - "support": { - "source": "https://github.com/symfony/routing/tree/v5.4.35" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-01-30T13:10:15+00:00" - }, - { - "name": "symfony/service-contracts", - "version": "v2.5.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/container": "^1.1", - "symfony/deprecation-contracts": "^2.1|^3" - }, - "conflict": { - "ext-psr": "<1.1|>=2" - }, - "suggest": { - "symfony/service-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Service\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-05-30T19:17:29+00:00" - }, - { - "name": "symfony/string", - "version": "v5.4.35", - "source": { - "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "c209c4d0559acce1c9a2067612cfb5d35756edc2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/c209c4d0559acce1c9a2067612cfb5d35756edc2", - "reference": "c209c4d0559acce1c9a2067612cfb5d35756edc2", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "~1.15" - }, - "conflict": { - "symfony/translation-contracts": ">=3.0" - }, - "require-dev": { - "symfony/error-handler": "^4.4|^5.0|^6.0", - "symfony/http-client": "^4.4|^5.0|^6.0", - "symfony/translation-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0|^6.0" - }, - "type": "library", - "autoload": { - "files": [ - "Resources/functions.php" - ], - "psr-4": { - "Symfony\\Component\\String\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", - "homepage": "https://symfony.com", - "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" - ], - "support": { - "source": "https://github.com/symfony/string/tree/v5.4.35" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-01-23T13:51:25+00:00" - }, - { - "name": "symfony/var-exporter", - "version": "v5.4.35", - "source": { - "type": "git", - "url": "https://github.com/symfony/var-exporter.git", - "reference": "abb0a151b62d6b07e816487e20040464af96cae7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/abb0a151b62d6b07e816487e20040464af96cae7", - "reference": "abb0a151b62d6b07e816487e20040464af96cae7", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" - }, - "require-dev": { - "symfony/var-dumper": "^4.4.9|^5.0.9|^6.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\VarExporter\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Allows exporting any serializable PHP data structure to plain PHP code", - "homepage": "https://symfony.com", - "keywords": [ - "clone", - "construct", - "export", - "hydrate", - "instantiate", - "serialize" - ], - "support": { - "source": "https://github.com/symfony/var-exporter/tree/v5.4.35" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-01-23T13:51:25+00:00" - }, - { - "name": "symfony/yaml", - "version": "v5.4.35", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "e78db7f5c70a21f0417a31f414c4a95fe76c07e4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/e78db7f5c70a21f0417a31f414c4a95fe76c07e4", - "reference": "e78db7f5c70a21f0417a31f414c4a95fe76c07e4", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "symfony/console": "<5.3" - }, - "require-dev": { - "symfony/console": "^5.3|^6.0" - }, - "suggest": { - "symfony/console": "For validating YAML files using the lint command" - }, - "bin": [ - "Resources/bin/yaml-lint" - ], - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Loads and dumps YAML files", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/yaml/tree/v5.4.35" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-01-23T13:51:25+00:00" - }, - { - "name": "typo3/class-alias-loader", - "version": "v1.1.4", - "source": { - "type": "git", - "url": "https://github.com/TYPO3/class-alias-loader.git", - "reference": "f6fc1f5fb04c42195e8e663b43aced4919ef318f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/TYPO3/class-alias-loader/zipball/f6fc1f5fb04c42195e8e663b43aced4919ef318f", - "reference": "f6fc1f5fb04c42195e8e663b43aced4919ef318f", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.0 || ^2.0", - "php": ">=5.3.7" - }, - "replace": { - "helhum/class-alias-loader": "*" - }, - "require-dev": { - "composer/composer": "^1.1@dev || ^2.0@dev", - "mikey179/vfsstream": "~1.4.0@dev", - "phpunit/phpunit": ">4.8 <9" - }, - "type": "composer-plugin", - "extra": { - "class": "TYPO3\\ClassAliasLoader\\Plugin", - "branch-alias": { - "dev-main": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "TYPO3\\ClassAliasLoader\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Helmut Hummel", - "email": "info@helhum.io" - } - ], - "description": "Amends the composer class loader to support class aliases to provide backwards compatibility for packages", - "homepage": "http://github.com/TYPO3/class-alias-loader", - "keywords": [ - "alias", - "autoloader", - "classloader", - "composer" - ], - "support": { - "issues": "https://github.com/TYPO3/class-alias-loader/issues", - "source": "https://github.com/TYPO3/class-alias-loader/tree/v1.1.4" - }, - "time": "2022-08-07T14:48:42+00:00" - }, - { - "name": "typo3/cms-cli", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/TYPO3/cms-cli.git", - "reference": "215a0bf5c446b4e0b20f4562bbaf3d6215a5ee82" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/TYPO3/cms-cli/zipball/215a0bf5c446b4e0b20f4562bbaf3d6215a5ee82", - "reference": "215a0bf5c446b4e0b20f4562bbaf3d6215a5ee82", - "shasum": "" - }, - "require": { - "php": "^7.0" - }, - "bin": [ - "typo3" - ], - "type": "library", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "GPL-2.0-or-later" - ], - "description": "TYPO3 command line binary", - "homepage": "https://typo3.org", - "support": { - "issues": "https://github.com/TYPO3/cms-cli/issues", - "source": "https://github.com/TYPO3/cms-cli/tree/master" - }, - "time": "2018-03-08T20:16:43+00:00" - }, - { - "name": "typo3/cms-composer-installers", - "version": "v3.1.3", - "source": { - "type": "git", - "url": "https://github.com/TYPO3/CmsComposerInstallers.git", - "reference": "613d82075650ba846d287e20941e8a0e04ad0444" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/TYPO3/CmsComposerInstallers/zipball/613d82075650ba846d287e20941e8a0e04ad0444", - "reference": "613d82075650ba846d287e20941e8a0e04ad0444", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.0.0 || ^2.0.0", - "php": "^7.2 || ^8.0" - }, - "conflict": { - "composer/installers": "<2.0.0" - }, - "replace": { - "lw/typo3cms-installers": "*", - "netresearch/composer-installers": "*" - }, - "require-dev": { - "composer/composer": "1.2.*@dev || 2.0.*@dev", - "friendsofphp/php-cs-fixer": "^2.18", - "overtrue/phplint": "^2.0", - "phpunit/phpunit": "^8.5" - }, - "type": "composer-plugin", - "extra": { - "class": "TYPO3\\CMS\\Composer\\Installer\\Plugin", - "branch-alias": { - "dev-main": "3.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "TYPO3\\CMS\\Composer\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "GPL-2.0-or-later" - ], - "authors": [ - { - "name": "TYPO3 CMS Core Team", - "homepage": "https://forge.typo3.org/projects/typo3cms-core", - "role": "Developer" - }, - { - "name": "The TYPO3 Community", - "homepage": "https://typo3.org/community/", - "role": "Contributor" - } - ], - "description": "TYPO3 CMS Installers", - "homepage": "https://github.com/TYPO3/CmsComposerInstallers", - "keywords": [ - "cms", - "core", - "extension", - "installer", - "typo3" - ], - "support": { - "general": "https://typo3.org/support/", - "issues": "https://github.com/TYPO3/CmsComposerInstallers/issues", - "source": "https://github.com/TYPO3/CmsComposerInstallers/tree/v3.1.3" - }, - "time": "2022-08-05T19:06:26+00:00" - }, - { - "name": "typo3/cms-core", - "version": "v10.4.37", - "source": { - "type": "git", - "url": "https://github.com/TYPO3-CMS/core.git", - "reference": "34e4a9807eb365e202773c82dff82038da8966d3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/TYPO3-CMS/core/zipball/34e4a9807eb365e202773c82dff82038da8966d3", - "reference": "34e4a9807eb365e202773c82dff82038da8966d3", - "shasum": "" - }, - "require": { - "doctrine/annotations": "^1.7", - "doctrine/dbal": "~2.10.0 || ~2.11.2 || ~2.13.1", - "doctrine/instantiator": "^1.1", - "doctrine/lexer": "^1.0", - "egulias/email-validator": "^2.1", - "enshrined/svg-sanitize": "^0.15.4", - "ext-json": "*", - "ext-libxml": "*", - "ext-pcre": "*", - "ext-pdo": "*", - "ext-session": "*", - "ext-xml": "*", - "guzzlehttp/guzzle": "^6.5.8", - "guzzlehttp/psr7": "^1.8.5", - "lolli42/finediff": "^1.0.1", - "masterminds/html5": "^2.7.6", - "nikic/php-parser": "^4.10.4", - "php": "^7.2", - "psr/container": "^1.0", - "psr/event-dispatcher": "^1.0", - "psr/http-client": "^1.0", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.0", - "psr/http-server-handler": "^1.0", - "psr/http-server-middleware": "^1.0", - "psr/log": "^1.0", - "symfony/config": "^4.4 || ^5.0", - "symfony/console": "^4.4 || ^5.0", - "symfony/dependency-injection": "^4.4 || ^5.0", - "symfony/event-dispatcher-contracts": "^1.1 || ^2.0", - "symfony/expression-language": "^4.4 || ^5.0", - "symfony/filesystem": "^4.4 || ^5.0", - "symfony/finder": "^4.4 || ^5.0", - "symfony/http-foundation": "^4.4 || ^5.0", - "symfony/mailer": "^4.4 || ^5.0", - "symfony/mime": "^4.4.16 || ^5.1.8", - "symfony/polyfill-intl-icu": "^1.6", - "symfony/polyfill-intl-idn": "^1.10", - "symfony/polyfill-intl-normalizer": "^1.22", - "symfony/polyfill-mbstring": "^1.16", - "symfony/polyfill-php73": "^1.16", - "symfony/polyfill-php80": "^1.16", - "symfony/polyfill-php81": "^1.23", - "symfony/routing": "^4.4 || ^5.0", - "symfony/yaml": "^4.4 || ^5.0", - "typo3/class-alias-loader": "^1.0", - "typo3/cms-cli": "^2.0", - "typo3/cms-composer-installers": "^2.0 || ^3.0", - "typo3/html-sanitizer": "^2.1.1", - "typo3/phar-stream-wrapper": "^3.1.7", - "typo3/symfony-psr-event-dispatcher-adapter": "^1.0 || ^2.0", - "typo3fluid/fluid": "^2.6.10" - }, - "conflict": { - "guzzlehttp/guzzle": "6.5.0", - "hoa/core": "*", - "typo3/cms": "*" - }, - "provide": { - "psr/http-client-implementation": "1.0", - "psr/http-factory-implementation": "1.0", - "psr/http-message-implementation": "1.0" - }, - "replace": { - "typo3/cms-lang": "*", - "typo3/cms-saltedpasswords": "*", - "typo3/cms-sv": "*" - }, - "require-dev": { - "codeception/codeception": "^4.0", - "codeception/module-asserts": "^1.1", - "codeception/module-filesystem": "^1.0", - "codeception/module-webdriver": "^1.0.1", - "friendsofphp/php-cs-fixer": "^2.19 || ^3.0", - "mikey179/vfsstream": "^1.6.11", - "phpspec/prophecy": "^1.14.0", - "phpstan/phpstan": "^0.12.64", - "typo3/cms-styleguide": "~10.0.4", - "typo3/testing-framework": "^6.16.7" - }, - "suggest": { - "ext-fileinfo": "Used for proper file type detection in the file abstraction layer", - "ext-gd": "GDlib/Freetype is required for building images with text (GIFBUILDER) and can also be used to scale images", - "ext-intl": "TYPO3 with unicode-based filesystems", - "ext-mysqli": "", - "ext-openssl": "OpenSSL is required for sending SMTP mails over an encrypted channel endpoint, and for extensions such as \"rsaauth\"", - "ext-zip": "", - "ext-zlib": "TYPO3 uses zlib for amongst others output compression and un/packing t3x extension files" - }, - "type": "typo3-cms-framework", - "extra": { - "branch-alias": { - "dev-master": "10.4.x-dev" - }, - "typo3/cms": { - "Package": { - "serviceProvider": "TYPO3\\CMS\\Core\\ServiceProvider", - "protected": true, - "partOfFactoryDefault": true, - "partOfMinimalUsableSystem": true - }, - "extension-key": "core" - }, - "typo3/class-alias-loader": { - "class-alias-maps": [ - "Migrations/Code/ClassAliasMap.php" - ] - } - }, - "autoload": { - "files": [ - "Resources/PHP/GlobalDebugFunctions.php" - ], - "psr-4": { - "TYPO3\\CMS\\Core\\": "Classes/" - }, - "classmap": [ - "Resources/PHP/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "GPL-2.0-or-later" - ], - "authors": [ - { - "name": "TYPO3 Core Team", - "email": "typo3cms@typo3.org", - "role": "Developer" - } - ], - "description": "The core library of TYPO3.", - "homepage": "https://typo3.org", - "support": { - "chat": "https://typo3.org/help", - "docs": "https://docs.typo3.org", - "issues": "https://forge.typo3.org", - "source": "https://github.com/typo3/typo3" - }, - "time": "2023-04-11T13:10:15+00:00" - }, - { - "name": "typo3/cms-extbase", - "version": "v10.4.37", - "source": { - "type": "git", - "url": "https://github.com/TYPO3-CMS/extbase.git", - "reference": "9b9c88efe129b9ca04e63876a1e123d892072404" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/TYPO3-CMS/extbase/zipball/9b9c88efe129b9ca04e63876a1e123d892072404", - "reference": "9b9c88efe129b9ca04e63876a1e123d892072404", - "shasum": "" - }, - "require": { - "phpdocumentor/reflection-docblock": "^5.2", - "phpdocumentor/type-resolver": "^1.3", - "symfony/dependency-injection": "^4.4 || ^5.0", - "symfony/property-access": "^4.4 || ^5.0", - "symfony/property-info": "^4.4 || ^5.0", - "typo3/cms-core": "10.4.37" - }, - "conflict": { - "typo3/cms": "*" - }, - "suggest": { - "typo3/cms-scheduler": "Additional scheduler tasks" - }, - "type": "typo3-cms-framework", - "extra": { - "branch-alias": { - "dev-master": "10.4.x-dev" - }, - "typo3/cms": { - "Package": { - "serviceProvider": "TYPO3\\CMS\\Extbase\\ServiceProvider", - "protected": true, - "partOfFactoryDefault": true, - "partOfMinimalUsableSystem": true - }, - "extension-key": "extbase" - } - }, - "autoload": { - "psr-4": { - "TYPO3\\CMS\\Extbase\\": "Classes/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "GPL-2.0-or-later" - ], - "authors": [ - { - "name": "TYPO3 Core Team", - "email": "typo3cms@typo3.org", - "role": "Developer" - } - ], - "description": "A framework to build extensions for TYPO3 CMS.", - "homepage": "https://typo3.org", - "support": { - "chat": "https://typo3.org/help", - "docs": "https://docs.typo3.org", - "issues": "https://forge.typo3.org", - "source": "https://github.com/typo3/typo3" - }, - "time": "2023-04-11T13:10:15+00:00" - }, - { - "name": "typo3/cms-tstemplate", - "version": "v10.4.37", - "source": { - "type": "git", - "url": "https://github.com/TYPO3-CMS/tstemplate.git", - "reference": "cf923ac575c85529bc82131ea66feaa187853ae9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/TYPO3-CMS/tstemplate/zipball/cf923ac575c85529bc82131ea66feaa187853ae9", - "reference": "cf923ac575c85529bc82131ea66feaa187853ae9", - "shasum": "" - }, - "require": { - "typo3/cms-core": "10.4.37" - }, - "conflict": { - "typo3/cms": "*" - }, - "type": "typo3-cms-framework", - "extra": { - "branch-alias": { - "dev-master": "10.4.x-dev" - }, - "typo3/cms": { - "Package": { - "partOfFactoryDefault": true - }, - "extension-key": "tstemplate" - } - }, - "autoload": { - "psr-4": { - "TYPO3\\CMS\\Tstemplate\\": "Classes/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "GPL-2.0-or-later" - ], - "authors": [ - { - "name": "TYPO3 Core Team", - "email": "typo3cms@typo3.org", - "role": "Developer" - } - ], - "description": "Framework for management of TypoScript template records for the CMS frontend.", - "homepage": "https://typo3.org", - "support": { - "chat": "https://typo3.org/help", - "docs": "https://docs.typo3.org", - "issues": "https://forge.typo3.org", - "source": "https://github.com/typo3/typo3" - }, - "time": "2023-04-11T13:10:15+00:00" - }, - { - "name": "typo3/html-sanitizer", - "version": "v2.1.4", - "source": { - "type": "git", - "url": "https://github.com/TYPO3/html-sanitizer.git", - "reference": "b8f90717251d968c49dc77f8c1e5912e2fbe0dff" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/TYPO3/html-sanitizer/zipball/b8f90717251d968c49dc77f8c1e5912e2fbe0dff", - "reference": "b8f90717251d968c49dc77f8c1e5912e2fbe0dff", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "masterminds/html5": "^2.7.6", - "php": "^7.2 || ^8.0", - "psr/log": "^1.0 || ^2.0 || ^3.0" - }, - "require-dev": { - "phpunit/phpunit": "^8.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "TYPO3\\HtmlSanitizer\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Oliver Hader", - "email": "oliver@typo3.org" - } - ], - "description": "HTML sanitizer aiming to provide XSS-safe markup based on explicitly allowed tags, attributes and values.", - "support": { - "issues": "https://github.com/TYPO3/html-sanitizer/issues", - "source": "https://github.com/TYPO3/html-sanitizer/tree/v2.1.4" - }, - "time": "2023-11-14T07:41:08+00:00" - }, - { - "name": "typo3/phar-stream-wrapper", - "version": "v3.1.7", - "source": { - "type": "git", - "url": "https://github.com/TYPO3/phar-stream-wrapper.git", - "reference": "5cc2f04a4e2f5c7e9cc02a3bdf80fae0f3e11a8c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/TYPO3/phar-stream-wrapper/zipball/5cc2f04a4e2f5c7e9cc02a3bdf80fae0f3e11a8c", - "reference": "5cc2f04a4e2f5c7e9cc02a3bdf80fae0f3e11a8c", - "shasum": "" - }, - "require": { - "ext-json": "*", - "php": "^7.0 || ^8.0" - }, - "require-dev": { - "ext-xdebug": "*", - "phpspec/prophecy": "^1.10", - "symfony/phpunit-bridge": "^5.1" - }, - "suggest": { - "ext-fileinfo": "For PHP builtin file type guessing, otherwise uses internal processing" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "v3.x-dev" - } - }, - "autoload": { - "psr-4": { - "TYPO3\\PharStreamWrapper\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Interceptors for PHP's native phar:// stream handling", - "homepage": "https://typo3.org/", - "keywords": [ - "phar", - "php", - "security", - "stream-wrapper" - ], - "support": { - "issues": "https://github.com/TYPO3/phar-stream-wrapper/issues", - "source": "https://github.com/TYPO3/phar-stream-wrapper/tree/v3.1.7" - }, - "time": "2021-09-20T19:19:13+00:00" - }, - { - "name": "typo3/symfony-psr-event-dispatcher-adapter", - "version": "v2.1.0", - "source": { - "type": "git", - "url": "https://github.com/TYPO3/symfony-psr-event-dispatcher-adapter.git", - "reference": "c93fd7cc9f215cfbbc6ce89089eadabedf65a21f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/TYPO3/symfony-psr-event-dispatcher-adapter/zipball/c93fd7cc9f215cfbbc6ce89089eadabedf65a21f", - "reference": "c93fd7cc9f215cfbbc6ce89089eadabedf65a21f", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "psr/event-dispatcher": "^1.0", - "symfony/event-dispatcher-contracts": "^2.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "TYPO3\\SymfonyPsrEventDispatcherAdapter\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Adapter to provide compatibility with the Symfony's event dispatcher interface in all versions with the PSR-14 specification.", - "homepage": "https://typo3.org/", - "keywords": [ - "adapter", - "events", - "psr", - "psr-14" - ], - "support": { - "issues": "https://github.com/TYPO3/symfony-psr-event-dispatcher-adapter/issues", - "source": "https://github.com/TYPO3/symfony-psr-event-dispatcher-adapter/tree/v2.1.0" - }, - "time": "2021-03-02T09:36:49+00:00" - }, - { - "name": "typo3fluid/fluid", - "version": "2.7.4", - "source": { - "type": "git", - "url": "https://github.com/TYPO3/Fluid.git", - "reference": "24f4494083c8d304680e4c9c38667dff33720dd4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/TYPO3/Fluid/zipball/24f4494083c8d304680e4c9c38667dff33720dd4", - "reference": "24f4494083c8d304680e4c9c38667dff33720dd4", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "ext-json": "*", - "ext-mbstring": "*", - "friendsofphp/php-cs-fixer": "^3.4", - "phpstan/phpstan": "^1.7", - "phpstan/phpstan-phpunit": "^1.1", - "phpunit/phpunit": "^8.5.33 || ^9.5.28 || ^10.0.16" - }, - "suggest": { - "ext-json": "PHP JSON is needed when using JSONVariableProvider: A relatively rare use case" - }, - "bin": [ - "bin/fluid" - ], - "type": "library", - "autoload": { - "psr-4": { - "TYPO3Fluid\\Fluid\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-3.0-or-later" - ], - "description": "The TYPO3 Fluid template rendering engine", - "homepage": "https://github.com/TYPO3/Fluid", - "support": { - "docs": "https://docs.typo3.org/other/typo3fluid/fluid/main/en-us/", - "issues": "https://github.com/TYPO3/Fluid/issues", - "source": "https://github.com/TYPO3/Fluid" - }, - "time": "2023-03-23T12:04:09+00:00" - }, - { - "name": "ubl/php-iiif-prezi-reader", - "version": "0.3.0", - "source": { - "type": "git", - "url": "https://github.com/ubleipzig/php-iiif-prezi-reader.git", - "reference": "401d246af3fc2857d1a925339fea256ac32824f6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ubleipzig/php-iiif-prezi-reader/zipball/401d246af3fc2857d1a925339fea256ac32824f6", - "reference": "401d246af3fc2857d1a925339fea256ac32824f6", - "shasum": "" - }, - "require": { - "flow/jsonpath": ">=0.4.0", - "php": ">=5.6" - }, - "require-dev": { - "phpunit/phpunit": "~7.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "Ubl\\Iiif\\": "src/Iiif/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "GPL-3.0-or-later" - ], - "authors": [ - { - "name": "Lutz Helm", - "email": "helm@ub.uni-leipzig.de", - "role": "Developer" - } - ], - "description": "Read IIIF Presentation API resources into PHP objects that offer some convenient data extraction methods", - "keywords": [ - "iiif", - "iiif-presentation" - ], - "support": { - "issues": "https://github.com/ubleipzig/php-iiif-prezi-reader/issues", - "source": "https://github.com/ubleipzig/php-iiif-prezi-reader/tree/0.3.0" - }, - "time": "2019-09-13T13:54:17+00:00" - }, - { - "name": "webmozart/assert", - "version": "1.11.0", - "source": { - "type": "git", - "url": "https://github.com/webmozarts/assert.git", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "php": "^7.2 || ^8.0" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.13" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "support": { - "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.11.0" - }, - "time": "2022-06-03T18:03:27+00:00" - } - ], - "packages-dev": [ - { - "name": "clue/stdio-react", - "version": "v2.6.0", - "source": { - "type": "git", - "url": "https://github.com/clue/reactphp-stdio.git", - "reference": "dfa6c378aabdff718202d4e2453f752c38ea3399" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/clue/reactphp-stdio/zipball/dfa6c378aabdff718202d4e2453f752c38ea3399", - "reference": "dfa6c378aabdff718202d4e2453f752c38ea3399", - "shasum": "" - }, - "require": { - "clue/term-react": "^1.0 || ^0.1.1", - "clue/utf8-react": "^1.0 || ^0.1", - "php": ">=5.3", - "react/event-loop": "^1.2", - "react/stream": "^1.2" - }, - "require-dev": { - "clue/arguments": "^2.0", - "clue/commander": "^1.2", - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35" - }, - "suggest": { - "ext-mbstring": "Using ext-mbstring should provide slightly better performance for handling I/O" - }, - "type": "library", - "autoload": { - "psr-4": { - "Clue\\React\\Stdio\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Christian Lück", - "email": "christian@clue.engineering" - } - ], - "description": "Async, event-driven console input & output (STDIN, STDOUT) for truly interactive CLI applications, built on top of ReactPHP", - "homepage": "https://github.com/clue/reactphp-stdio", - "keywords": [ - "async", - "autocomplete", - "autocompletion", - "cli", - "history", - "interactive", - "reactphp", - "readline", - "stdin", - "stdio", - "stdout" - ], - "support": { - "issues": "https://github.com/clue/reactphp-stdio/issues", - "source": "https://github.com/clue/reactphp-stdio/tree/v2.6.0" - }, - "funding": [ - { - "url": "https://clue.engineering/support", - "type": "custom" - }, - { - "url": "https://github.com/clue", - "type": "github" - } - ], - "time": "2022-03-18T15:09:30+00:00" - }, - { - "name": "clue/term-react", - "version": "v1.4.0", - "source": { - "type": "git", - "url": "https://github.com/clue/reactphp-term.git", - "reference": "00f297dc597eaee2ebf98af8f27cca5d21d60fa3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/clue/reactphp-term/zipball/00f297dc597eaee2ebf98af8f27cca5d21d60fa3", - "reference": "00f297dc597eaee2ebf98af8f27cca5d21d60fa3", - "shasum": "" - }, - "require": { - "php": ">=5.3", - "react/stream": "^1.2" - }, - "require-dev": { - "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", - "react/event-loop": "^1.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "Clue\\React\\Term\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Christian Lück", - "email": "christian@clue.engineering" - } - ], - "description": "Streaming terminal emulator, built on top of ReactPHP.", - "homepage": "https://github.com/clue/reactphp-term", - "keywords": [ - "C0", - "CSI", - "ansi", - "apc", - "ascii", - "c1", - "control codes", - "dps", - "osc", - "pm", - "reactphp", - "streaming", - "terminal", - "vt100", - "xterm" - ], - "support": { - "issues": "https://github.com/clue/reactphp-term/issues", - "source": "https://github.com/clue/reactphp-term/tree/v1.4.0" - }, - "funding": [ - { - "url": "https://clue.engineering/support", - "type": "custom" - }, - { - "url": "https://github.com/clue", - "type": "github" - } - ], - "time": "2024-01-30T10:22:09+00:00" - }, - { - "name": "clue/utf8-react", - "version": "v1.3.0", - "source": { - "type": "git", - "url": "https://github.com/clue/reactphp-utf8.git", - "reference": "d5cd04d39cb5457aa5df830b7c4b301d2694217e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/clue/reactphp-utf8/zipball/d5cd04d39cb5457aa5df830b7c4b301d2694217e", - "reference": "d5cd04d39cb5457aa5df830b7c4b301d2694217e", - "shasum": "" - }, - "require": { - "php": ">=5.3", - "react/stream": "^1.0 || ^0.7 || ^0.6 || ^0.5 || ^0.4 || ^0.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", - "react/stream": "^1.0 || ^0.7" - }, - "type": "library", - "autoload": { - "psr-4": { - "Clue\\React\\Utf8\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Christian Lück", - "email": "christian@clue.engineering" - } - ], - "description": "Streaming UTF-8 parser, built on top of ReactPHP.", - "homepage": "https://github.com/clue/reactphp-utf8", - "keywords": [ - "reactphp", - "streaming", - "unicode", - "utf-8", - "utf8" - ], - "support": { - "issues": "https://github.com/clue/reactphp-utf8/issues", - "source": "https://github.com/clue/reactphp-utf8/tree/v1.3.0" - }, - "funding": [ - { - "url": "https://clue.engineering/support", - "type": "custom" - }, - { - "url": "https://github.com/clue", - "type": "github" - } - ], - "time": "2023-12-06T14:52:17+00:00" - }, - { - "name": "evenement/evenement", - "version": "v3.0.2", - "source": { - "type": "git", - "url": "https://github.com/igorw/evenement.git", - "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc", - "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc", - "shasum": "" - }, - "require": { - "php": ">=7.0" - }, - "require-dev": { - "phpunit/phpunit": "^9 || ^6" - }, - "type": "library", - "autoload": { - "psr-4": { - "Evenement\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" - } - ], - "description": "Événement is a very simple event dispatching library for PHP", - "keywords": [ - "event-dispatcher", - "event-emitter" - ], - "support": { - "issues": "https://github.com/igorw/evenement/issues", - "source": "https://github.com/igorw/evenement/tree/v3.0.2" - }, - "time": "2023-08-08T05:53:35+00:00" - }, - { - "name": "jolicode/jolinotif", - "version": "v2.4.0", - "source": { - "type": "git", - "url": "https://github.com/jolicode/JoliNotif.git", - "reference": "a15bfc0d5aef432f150385924ede4e099643edb7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/jolicode/JoliNotif/zipball/a15bfc0d5aef432f150385924ede4e099643edb7", - "reference": "a15bfc0d5aef432f150385924ede4e099643edb7", - "shasum": "" - }, - "require": { - "php": ">=7.4", - "symfony/process": "^4.0|^5.0|^6.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^3.0", - "symfony/finder": "^5.0", - "symfony/phpunit-bridge": "^5.0" - }, - "bin": [ - "jolinotif" - ], - "type": "library", - "autoload": { - "psr-4": { - "Joli\\JoliNotif\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Loïck Piera", - "email": "pyrech@gmail.com" - } - ], - "description": "Send desktop notifications on Windows, Linux, MacOS.", - "keywords": [ - "MAC", - "growl", - "linux", - "notification", - "windows" - ], - "support": { - "issues": "https://github.com/jolicode/JoliNotif/issues", - "source": "https://github.com/jolicode/JoliNotif/tree/v2.4.0" - }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/jolicode/jolinotif", - "type": "tidelift" - } - ], - "time": "2021-12-01T16:20:42+00:00" - }, - { - "name": "mikey179/vfsstream", - "version": "v1.6.11", - "source": { - "type": "git", - "url": "https://github.com/bovigo/vfsStream.git", - "reference": "17d16a85e6c26ce1f3e2fa9ceeacdc2855db1e9f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/bovigo/vfsStream/zipball/17d16a85e6c26ce1f3e2fa9ceeacdc2855db1e9f", - "reference": "17d16a85e6c26ce1f3e2fa9ceeacdc2855db1e9f", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.5|^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.6.x-dev" - } - }, - "autoload": { - "psr-0": { - "org\\bovigo\\vfs\\": "src/main/php" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Frank Kleine", - "homepage": "http://frankkleine.de/", - "role": "Developer" - } - ], - "description": "Virtual file system to mock the real file system in unit tests.", - "homepage": "http://vfs.bovigo.org/", - "support": { - "issues": "https://github.com/bovigo/vfsStream/issues", - "source": "https://github.com/bovigo/vfsStream/tree/master", - "wiki": "https://github.com/bovigo/vfsStream/wiki" - }, - "time": "2022-02-23T02:02:42+00:00" - }, - { - "name": "myclabs/deep-copy", - "version": "1.11.1", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3,<3.2.2" - }, - "require-dev": { - "doctrine/collections": "^1.6.8", - "doctrine/common": "^2.13.3 || ^3.2.2", - "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" - }, - "type": "library", - "autoload": { - "files": [ - "src/DeepCopy/deep_copy.php" - ], - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" - }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" - } - ], - "time": "2023-03-08T13:26:56+00:00" - }, - { - "name": "phar-io/manifest", - "version": "2.0.3", - "source": { - "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-phar": "*", - "ext-xmlwriter": "*", - "phar-io/version": "^3.0.1", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "support": { - "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.3" - }, - "time": "2021-07-20T11:28:43+00:00" - }, - { - "name": "phar-io/version", - "version": "3.2.1", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.2.1" - }, - "time": "2022-02-21T01:04:05+00:00" - }, - { - "name": "phpstan/phpstan", - "version": "1.10.58", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpstan.git", - "reference": "a23518379ec4defd9e47cbf81019526861623ec2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/a23518379ec4defd9e47cbf81019526861623ec2", - "reference": "a23518379ec4defd9e47cbf81019526861623ec2", - "shasum": "" - }, - "require": { - "php": "^7.2|^8.0" - }, - "conflict": { - "phpstan/phpstan-shim": "*" - }, - "bin": [ - "phpstan", - "phpstan.phar" - ], - "type": "library", - "autoload": { - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHPStan - PHP Static Analysis Tool", - "keywords": [ - "dev", - "static analysis" - ], - "support": { - "docs": "https://phpstan.org/user-guide/getting-started", - "forum": "https://github.com/phpstan/phpstan/discussions", - "issues": "https://github.com/phpstan/phpstan/issues", - "security": "https://github.com/phpstan/phpstan/security/policy", - "source": "https://github.com/phpstan/phpstan-src" - }, - "funding": [ - { - "url": "https://github.com/ondrejmirtes", - "type": "github" - }, - { - "url": "https://github.com/phpstan", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", - "type": "tidelift" - } - ], - "time": "2024-02-12T20:02:57+00:00" - }, - { - "name": "phpunit/php-code-coverage", - "version": "9.2.30", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "ca2bd87d2f9215904682a9cb9bb37dda98e76089" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ca2bd87d2f9215904682a9cb9bb37dda98e76089", - "reference": "ca2bd87d2f9215904682a9cb9bb37dda98e76089", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-xmlwriter": "*", - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=7.3", - "phpunit/php-file-iterator": "^3.0.3", - "phpunit/php-text-template": "^2.0.2", - "sebastian/code-unit-reverse-lookup": "^2.0.2", - "sebastian/complexity": "^2.0", - "sebastian/environment": "^5.1.2", - "sebastian/lines-of-code": "^1.0.3", - "sebastian/version": "^3.0.1", - "theseer/tokenizer": "^1.2.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-pcov": "PHP extension that provides line coverage", - "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "9.2-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.30" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-12-22T06:47:57+00:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "3.0.6", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", - "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2021-12-02T12:48:52+00:00" - }, - { - "name": "phpunit/php-invoker", - "version": "3.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "ext-pcntl": "*", - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-pcntl": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Invoke callables with a timeout", - "homepage": "https://github.com/sebastianbergmann/php-invoker/", - "keywords": [ - "process" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T05:58:55+00:00" - }, - { - "name": "phpunit/php-text-template", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T05:33:50+00:00" - }, - { - "name": "phpunit/php-timer", - "version": "5.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:16:10+00:00" - }, - { - "name": "phpunit/phpunit", - "version": "9.6.16", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "3767b2c56ce02d01e3491046f33466a1ae60a37f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3767b2c56ce02d01e3491046f33466a1ae60a37f", - "reference": "3767b2c56ce02d01e3491046f33466a1ae60a37f", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.3.1 || ^2", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.10.1", - "phar-io/manifest": "^2.0.3", - "phar-io/version": "^3.0.2", - "php": ">=7.3", - "phpunit/php-code-coverage": "^9.2.28", - "phpunit/php-file-iterator": "^3.0.5", - "phpunit/php-invoker": "^3.1.1", - "phpunit/php-text-template": "^2.0.3", - "phpunit/php-timer": "^5.0.2", - "sebastian/cli-parser": "^1.0.1", - "sebastian/code-unit": "^1.0.6", - "sebastian/comparator": "^4.0.8", - "sebastian/diff": "^4.0.3", - "sebastian/environment": "^5.1.3", - "sebastian/exporter": "^4.0.5", - "sebastian/global-state": "^5.0.1", - "sebastian/object-enumerator": "^4.0.3", - "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^3.2", - "sebastian/version": "^3.0.2" - }, - "suggest": { - "ext-soap": "To be able to generate mocks based on WSDL files", - "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "9.6-dev" - } - }, - "autoload": { - "files": [ - "src/Framework/Assert/Functions.php" - ], - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.16" - }, - "funding": [ - { - "url": "https://phpunit.de/sponsors.html", - "type": "custom" - }, - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", - "type": "tidelift" - } - ], - "time": "2024-01-19T07:03:14+00:00" - }, - { - "name": "react/event-loop", - "version": "v1.5.0", - "source": { - "type": "git", - "url": "https://github.com/reactphp/event-loop.git", - "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/event-loop/zipball/bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", - "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" - }, - "suggest": { - "ext-pcntl": "For signal handling support when using the StreamSelectLoop" - }, - "type": "library", - "autoload": { - "psr-4": { - "React\\EventLoop\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" - } - ], - "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.", - "keywords": [ - "asynchronous", - "event-loop" - ], - "support": { - "issues": "https://github.com/reactphp/event-loop/issues", - "source": "https://github.com/reactphp/event-loop/tree/v1.5.0" - }, - "funding": [ - { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" - } - ], - "time": "2023-11-13T13:48:05+00:00" - }, - { - "name": "react/stream", - "version": "v1.3.0", - "source": { - "type": "git", - "url": "https://github.com/reactphp/stream.git", - "reference": "6fbc9672905c7d5a885f2da2fc696f65840f4a66" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/stream/zipball/6fbc9672905c7d5a885f2da2fc696f65840f4a66", - "reference": "6fbc9672905c7d5a885f2da2fc696f65840f4a66", - "shasum": "" - }, - "require": { - "evenement/evenement": "^3.0 || ^2.0 || ^1.0", - "php": ">=5.3.8", - "react/event-loop": "^1.2" - }, - "require-dev": { - "clue/stream-filter": "~1.2", - "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" - }, - "type": "library", - "autoload": { - "psr-4": { - "React\\Stream\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" - } - ], - "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", - "keywords": [ - "event-driven", - "io", - "non-blocking", - "pipe", - "reactphp", - "readable", - "stream", - "writable" - ], - "support": { - "issues": "https://github.com/reactphp/stream/issues", - "source": "https://github.com/reactphp/stream/tree/v1.3.0" - }, - "funding": [ - { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" - } - ], - "time": "2023-06-16T10:52:11+00:00" - }, - { - "name": "sebastian/cli-parser", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for parsing CLI options", - "homepage": "https://github.com/sebastianbergmann/cli-parser", - "support": { - "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T06:08:49+00:00" - }, - { - "name": "sebastian/code-unit", - "version": "1.0.8", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", - "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the PHP code units", - "homepage": "https://github.com/sebastianbergmann/code-unit", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:08:54+00:00" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "2.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T05:30:19+00:00" - }, - { - "name": "sebastian/comparator", - "version": "4.0.8", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "fa0f136dd2334583309d32b62544682ee972b51a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", - "reference": "fa0f136dd2334583309d32b62544682ee972b51a", - "shasum": "" - }, - "require": { - "php": ">=7.3", - "sebastian/diff": "^4.0", - "sebastian/exporter": "^4.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2022-09-14T12:41:17+00:00" - }, - { - "name": "sebastian/complexity", - "version": "2.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a", - "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for calculating the complexity of PHP code units", - "homepage": "https://github.com/sebastianbergmann/complexity", - "support": { - "issues": "https://github.com/sebastianbergmann/complexity/issues", - "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-12-22T06:19:30+00:00" - }, - { - "name": "sebastian/diff", - "version": "4.0.5", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", - "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3", - "symfony/process": "^4.2 || ^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-05-07T05:35:17+00:00" - }, - { - "name": "sebastian/environment", - "version": "5.1.5", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", - "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-posix": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T06:03:51+00:00" - }, - { - "name": "sebastian/exporter", - "version": "4.0.5", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", - "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", - "shasum": "" - }, - "require": { - "php": ">=7.3", - "sebastian/recursion-context": "^4.0" - }, - "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "https://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2022-09-14T06:03:37+00:00" - }, - { - "name": "sebastian/global-state", - "version": "5.0.6", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "bde739e7565280bda77be70044ac1047bc007e34" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bde739e7565280bda77be70044ac1047bc007e34", - "reference": "bde739e7565280bda77be70044ac1047bc007e34", - "shasum": "" - }, - "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" - }, - "require-dev": { - "ext-dom": "*", - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-uopz": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.6" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-08-02T09:26:13+00:00" - }, - { - "name": "sebastian/lines-of-code", - "version": "1.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5", - "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for counting the lines of code in PHP source code", - "homepage": "https://github.com/sebastianbergmann/lines-of-code", - "support": { - "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-12-22T06:20:34+00:00" - }, - { - "name": "sebastian/object-enumerator", - "version": "4.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", - "shasum": "" - }, - "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:12:34+00:00" - }, - { - "name": "sebastian/object-reflector", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:14:26+00:00" - }, - { - "name": "sebastian/recursion-context", - "version": "4.0.5", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", - "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "https://github.com/sebastianbergmann/recursion-context", - "support": { - "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T06:07:39+00:00" - }, - { - "name": "sebastian/resource-operations", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides a list of PHP built-in functions that operate on resources", - "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "support": { - "issues": "https://github.com/sebastianbergmann/resource-operations/issues", - "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T06:45:17+00:00" - }, - { - "name": "sebastian/type", - "version": "3.2.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/type.git", - "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", - "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.2-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the types of the PHP type system", - "homepage": "https://github.com/sebastianbergmann/type", - "support": { - "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T06:13:03+00:00" - }, - { - "name": "sebastian/version", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c6c1022351a901512170118436c764e473f6de8c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", - "reference": "c6c1022351a901512170118436c764e473f6de8c", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "support": { - "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T06:39:44+00:00" - }, - { - "name": "spatie/phpunit-watcher", - "version": "1.23.6", - "source": { - "type": "git", - "url": "https://github.com/spatie/phpunit-watcher.git", - "reference": "c192fff763810c8378511bcf0069df4b91478866" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/phpunit-watcher/zipball/c192fff763810c8378511bcf0069df4b91478866", - "reference": "c192fff763810c8378511bcf0069df4b91478866", - "shasum": "" - }, - "require": { - "clue/stdio-react": "^2.4", - "jolicode/jolinotif": "^2.2", - "php": "^7.2 | ^8.0 | ^8.1", - "symfony/console": "^5 | ^6", - "symfony/finder": "^5.4 | ^6", - "symfony/process": "^5.4 | ^6", - "symfony/yaml": "^5.2 | ^6", - "yosymfony/resource-watcher": "^2.0 | ^3.0" - }, - "conflict": { - "symfony/console": "<5.2", - "yosymfony/resource-watcher": "<2.0" - }, - "require-dev": { - "phpunit/phpunit": "^8.6 | ^9.0" - }, - "bin": [ - "phpunit-watcher" - ], - "type": "library", - "autoload": { - "psr-4": { - "Spatie\\PhpUnitWatcher\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Freek Van der Herten", - "email": "freek@spatie.be", - "homepage": "https://spatie.be", - "role": "Developer" - } - ], - "description": "Automatically rerun PHPUnit tests when source code changes", - "homepage": "https://github.com/spatie/phpunit-watcher", - "keywords": [ - "phpunit-watcher", - "spatie" - ], - "support": { - "issues": "https://github.com/spatie/phpunit-watcher/issues", - "source": "https://github.com/spatie/phpunit-watcher/tree/1.23.6" - }, - "time": "2022-01-31T11:57:13+00:00" - }, - { - "name": "symfony/process", - "version": "v5.4.35", - "source": { - "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "cbc28e34015ad50166fc2f9c8962d28d0fe861eb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/cbc28e34015ad50166fc2f9c8962d28d0fe861eb", - "reference": "cbc28e34015ad50166fc2f9c8962d28d0fe861eb", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Executes commands in sub-processes", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/process/tree/v5.4.35" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-01-23T13:51:25+00:00" - }, - { - "name": "theseer/tokenizer", - "version": "1.2.2", - "source": { - "type": "git", - "url": "https://github.com/theseer/tokenizer.git", - "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96", - "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - } - ], - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "support": { - "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.2" - }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2023-11-20T00:12:19+00:00" - }, - { - "name": "typo3/cms-backend", - "version": "v10.4.37", - "source": { - "type": "git", - "url": "https://github.com/TYPO3-CMS/backend.git", - "reference": "55b4bf5bab5734ff88400d1c7b3b97e005dd12fd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/TYPO3-CMS/backend/zipball/55b4bf5bab5734ff88400d1c7b3b97e005dd12fd", - "reference": "55b4bf5bab5734ff88400d1c7b3b97e005dd12fd", - "shasum": "" - }, - "require": { - "psr/event-dispatcher": "^1.0", - "typo3/cms-core": "10.4.37", - "typo3/cms-recordlist": "10.4.37" - }, - "conflict": { - "typo3/cms": "*" - }, - "replace": { - "typo3/cms-context-help": "*", - "typo3/cms-cshmanual": "*", - "typo3/cms-func-wizards": "*", - "typo3/cms-wizard-crpages": "*", - "typo3/cms-wizard-sortpages": "*" - }, - "suggest": { - "typo3/cms-install": "To generate url to install tool in environment toolbar" - }, - "type": "typo3-cms-framework", - "extra": { - "branch-alias": { - "dev-master": "10.4.x-dev" - }, - "typo3/cms": { - "Package": { - "serviceProvider": "TYPO3\\CMS\\Backend\\ServiceProvider", - "protected": true, - "partOfFactoryDefault": true, - "partOfMinimalUsableSystem": true - }, - "extension-key": "backend" - }, - "typo3/class-alias-loader": { - "class-alias-maps": [ - "Migrations/Code/ClassAliasMap.php" - ] - } - }, - "autoload": { - "psr-4": { - "TYPO3\\CMS\\Backend\\": "Classes/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "GPL-2.0-or-later" - ], - "authors": [ - { - "name": "TYPO3 Core Team", - "email": "typo3cms@typo3.org", - "role": "Developer" - } - ], - "description": "Classes for the TYPO3 backend.", - "homepage": "https://typo3.org", - "support": { - "chat": "https://typo3.org/help", - "docs": "https://docs.typo3.org", - "issues": "https://forge.typo3.org", - "source": "https://github.com/typo3/typo3" - }, - "time": "2023-04-11T13:10:15+00:00" - }, - { - "name": "typo3/cms-fluid", - "version": "v10.4.37", - "source": { - "type": "git", - "url": "https://github.com/TYPO3-CMS/fluid.git", - "reference": "ec89e645ff50a202236dc3f66b9d07c2aa6d5b03" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/TYPO3-CMS/fluid/zipball/ec89e645ff50a202236dc3f66b9d07c2aa6d5b03", - "reference": "ec89e645ff50a202236dc3f66b9d07c2aa6d5b03", - "shasum": "" - }, - "require": { - "symfony/dependency-injection": "^4.4 || ^5.0", - "typo3/cms-core": "10.4.37", - "typo3/cms-extbase": "10.4.37", - "typo3fluid/fluid": "^2.6.10" - }, - "conflict": { - "typo3/cms": "*" - }, - "type": "typo3-cms-framework", - "extra": { - "branch-alias": { - "dev-master": "10.4.x-dev" - }, - "typo3/cms": { - "Package": { - "protected": true, - "partOfFactoryDefault": true, - "partOfMinimalUsableSystem": true - }, - "extension-key": "fluid" - } - }, - "autoload": { - "psr-4": { - "TYPO3\\CMS\\Fluid\\": "Classes/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "GPL-2.0-or-later" - ], - "authors": [ - { - "name": "TYPO3 Core Team", - "email": "typo3cms@typo3.org", - "role": "Developer" - } - ], - "description": "Fluid is a next-generation templating engine which makes the life of extension authors a lot easier!", - "homepage": "https://typo3.org", - "support": { - "chat": "https://typo3.org/help", - "docs": "https://docs.typo3.org/other/typo3/view-helper-reference/10.4/en-us/", - "issues": "https://forge.typo3.org", - "source": "https://github.com/typo3/typo3" - }, - "time": "2023-04-11T13:10:15+00:00" - }, - { - "name": "typo3/cms-fluid-styled-content", - "version": "v10.4.37", - "source": { - "type": "git", - "url": "https://github.com/TYPO3-CMS/fluid_styled_content.git", - "reference": "ebcad8581a7f81bc69bf4aebb2ef99a590f84909" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/TYPO3-CMS/fluid_styled_content/zipball/ebcad8581a7f81bc69bf4aebb2ef99a590f84909", - "reference": "ebcad8581a7f81bc69bf4aebb2ef99a590f84909", - "shasum": "" - }, - "require": { - "typo3/cms-core": "10.4.37", - "typo3/cms-fluid": "10.4.37", - "typo3/cms-frontend": "10.4.37" - }, - "conflict": { - "typo3/cms": "*" - }, - "type": "typo3-cms-framework", - "extra": { - "branch-alias": { - "dev-master": "10.4.x-dev" - }, - "typo3/cms": { - "Package": { - "partOfFactoryDefault": true - }, - "extension-key": "fluid_styled_content" - } - }, - "autoload": { - "psr-4": { - "TYPO3\\CMS\\FluidStyledContent\\": "Classes/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "GPL-2.0-or-later" - ], - "authors": [ - { - "name": "TYPO3 Core Team", - "email": "typo3cms@typo3.org", - "role": "Developer" - } - ], - "description": "A set of common content elements based on Fluid for Frontend output.", - "homepage": "https://typo3.org", - "support": { - "chat": "https://typo3.org/help", - "docs": "https://docs.typo3.org/c/typo3/cms-fluid-styled-content/10.4/en-us", - "issues": "https://forge.typo3.org", - "source": "https://github.com/typo3/typo3" - }, - "time": "2023-04-11T13:10:15+00:00" - }, - { - "name": "typo3/cms-frontend", - "version": "v10.4.37", - "source": { - "type": "git", - "url": "https://github.com/TYPO3-CMS/frontend.git", - "reference": "d97ae4ed2f9f2062374536a00ff6f7bc1cba85ad" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/TYPO3-CMS/frontend/zipball/d97ae4ed2f9f2062374536a00ff6f7bc1cba85ad", - "reference": "d97ae4ed2f9f2062374536a00ff6f7bc1cba85ad", - "shasum": "" - }, - "require": { - "ext-libxml": "*", - "symfony/polyfill-mbstring": "^1.16", - "typo3/cms-core": "10.4.37" - }, - "conflict": { - "typo3/cms": "*" - }, - "suggest": { - "typo3/cms-adminpanel": "Provides additional information and functionality for backend users in the frontend." - }, - "type": "typo3-cms-framework", - "extra": { - "branch-alias": { - "dev-master": "10.4.x-dev" - }, - "typo3/cms": { - "Package": { - "serviceProvider": "TYPO3\\CMS\\Frontend\\ServiceProvider", - "protected": true, - "partOfFactoryDefault": true, - "partOfMinimalUsableSystem": true - }, - "extension-key": "frontend" - } - }, - "autoload": { - "psr-4": { - "TYPO3\\CMS\\Frontend\\": "Classes/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "GPL-2.0-or-later" - ], - "authors": [ - { - "name": "TYPO3 Core Team", - "email": "typo3cms@typo3.org", - "role": "Developer" - } - ], - "description": "Classes for the frontend of TYPO3.", - "homepage": "https://typo3.org", - "support": { - "chat": "https://typo3.org/help", - "docs": "https://docs.typo3.org", - "issues": "https://forge.typo3.org", - "source": "https://github.com/typo3/typo3" - }, - "time": "2023-04-11T13:10:15+00:00" - }, - { - "name": "typo3/cms-install", - "version": "v10.4.37", - "source": { - "type": "git", - "url": "https://github.com/TYPO3-CMS/install.git", - "reference": "3e82477beb50e2595665ed572f52a1e9e130ded6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/TYPO3-CMS/install/zipball/3e82477beb50e2595665ed572f52a1e9e130ded6", - "reference": "3e82477beb50e2595665ed572f52a1e9e130ded6", - "shasum": "" - }, - "require": { - "doctrine/dbal": "~2.10.0 || ~2.11.2 || ~2.13.1", - "nikic/php-parser": "^4.10.4", - "symfony/finder": "^4.4 || ^5.0", - "typo3/cms-core": "10.4.37", - "typo3/cms-extbase": "10.4.37", - "typo3/cms-fluid": "10.4.37" - }, - "conflict": { - "typo3/cms": "*" - }, - "type": "typo3-cms-framework", - "extra": { - "branch-alias": { - "dev-master": "10.4.x-dev" - }, - "typo3/cms": { - "Package": { - "serviceProvider": "TYPO3\\CMS\\Install\\ServiceProvider", - "protected": true, - "partOfFactoryDefault": true, - "partOfMinimalUsableSystem": true - }, - "extension-key": "install" - } - }, - "autoload": { - "psr-4": { - "TYPO3\\CMS\\Install\\": "Classes/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "GPL-2.0-or-later" - ], - "authors": [ - { - "name": "TYPO3 Core Team", - "email": "typo3cms@typo3.org", - "role": "Developer" - } - ], - "description": "The Install Tool mounted as the module Tools>Install in TYPO3.", - "homepage": "https://typo3.org", - "support": { - "chat": "https://typo3.org/help", - "docs": "https://docs.typo3.org", - "issues": "https://forge.typo3.org", - "source": "https://github.com/typo3/typo3" - }, - "time": "2023-04-11T13:10:15+00:00" - }, - { - "name": "typo3/cms-recordlist", - "version": "v10.4.37", - "source": { - "type": "git", - "url": "https://github.com/TYPO3-CMS/recordlist.git", - "reference": "47cffea95b30726f130eb2d2bb6a7836f6fe5145" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/TYPO3-CMS/recordlist/zipball/47cffea95b30726f130eb2d2bb6a7836f6fe5145", - "reference": "47cffea95b30726f130eb2d2bb6a7836f6fe5145", - "shasum": "" - }, - "require": { - "typo3/cms-core": "10.4.37" - }, - "conflict": { - "typo3/cms": "*" - }, - "type": "typo3-cms-framework", - "extra": { - "branch-alias": { - "dev-master": "10.4.x-dev" - }, - "typo3/cms": { - "Package": { - "protected": true, - "partOfFactoryDefault": true, - "partOfMinimalUsableSystem": true - }, - "extension-key": "recordlist" - } - }, - "autoload": { - "psr-4": { - "TYPO3\\CMS\\Recordlist\\": "Classes/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "GPL-2.0-or-later" - ], - "authors": [ - { - "name": "TYPO3 Core Team", - "email": "typo3cms@typo3.org", - "role": "Developer" - } - ], - "description": "List of database-records", - "homepage": "https://typo3.org", - "support": { - "chat": "https://typo3.org/help", - "docs": "https://docs.typo3.org", - "issues": "https://forge.typo3.org", - "source": "https://github.com/typo3/typo3" - }, - "time": "2023-04-11T13:10:15+00:00" - }, - { - "name": "typo3/testing-framework", - "version": "6.16.9", - "source": { - "type": "git", - "url": "https://github.com/TYPO3/testing-framework.git", - "reference": "62005ddb550f8b1c69c955c8683a8a632a44f482" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/TYPO3/testing-framework/zipball/62005ddb550f8b1c69c955c8683a8a632a44f482", - "reference": "62005ddb550f8b1c69c955c8683a8a632a44f482", - "shasum": "" - }, - "require": { - "ext-pdo": "*", - "guzzlehttp/psr7": "^1.7 || ^2.0", - "mikey179/vfsstream": "~1.6.11", - "php": ">= 7.2", - "phpunit/phpunit": "^8.4 || ^9.0", - "psr/container": "^1.0", - "typo3/cms-backend": "10.*.*@dev || 11.*.*@dev", - "typo3/cms-core": "10.*.*@dev || 11.*.*@dev", - "typo3/cms-extbase": "10.*.*@dev || 11.*.*@dev", - "typo3/cms-fluid": "10.*.*@dev || 11.*.*@dev", - "typo3/cms-frontend": "10.*.*@dev || 11.*.*@dev", - "typo3/cms-install": "10.*.*@dev || 11.*.*@dev", - "typo3/cms-recordlist": "10.*.*@dev || 11.*.*@dev", - "typo3fluid/fluid": "^2.5" - }, - "conflict": { - "doctrine/dbal": "2.13.0 || 2.13.1" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^3.4.0", - "phpstan/phpstan": "^1.8.0", - "phpstan/phpstan-phpunit": "^1.1.1", - "typo3/cms-workspaces": "10.*.*@dev || 11.*.*@dev" - }, - "type": "library", - "autoload": { - "psr-4": { - "TYPO3\\PrivateContainer\\": "Resources/Core/Functional/Extensions/private_container/Classes/", - "TYPO3\\TestingFramework\\": "Classes/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "GPL-2.0-or-later" - ], - "authors": [ - { - "name": "TYPO3 CMS Core Team", - "homepage": "https://forge.typo3.org/projects/typo3cms-core", - "role": "Developer" - }, - { - "name": "The TYPO3 Community", - "homepage": "https://typo3.org/community/", - "role": "Contributor" - } - ], - "description": "The TYPO3 testing framework provides base classes for unit, functional and acceptance testing.", - "homepage": "https://typo3.org/", - "keywords": [ - "testing", - "tests", - "typo3" - ], - "support": { - "general": "https://typo3.org/support/", - "issues": "https://github.com/TYPO3/testing-framework/issues", - "source": "https://github.com/TYPO3/testing-framework/tree/6.16.9" - }, - "time": "2023-08-02T16:11:00+00:00" - }, - { - "name": "yosymfony/resource-watcher", - "version": "v3.0.0", - "source": { - "type": "git", - "url": "https://github.com/yosymfony/resource-watcher.git", - "reference": "2f197cee0231c06db865d4ad2d8d7cd3faead2f8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/yosymfony/resource-watcher/zipball/2f197cee0231c06db865d4ad2d8d7cd3faead2f8", - "reference": "2f197cee0231c06db865d4ad2d8d7cd3faead2f8", - "shasum": "" - }, - "require": { - "php": ">=5.6", - "symfony/finder": "^2.7|^3.0|^4.0|^5.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7", - "symfony/filesystem": "^2.7|^3.0|^4.0|^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "psr-4": { - "Yosymfony\\ResourceWatcher\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Victor Puertas", - "email": "vpgugr@gmail.com" - } - ], - "description": "A simple resource watcher using Symfony Finder", - "homepage": "http://yosymfony.com", - "keywords": [ - "finder", - "resources", - "symfony", - "watcher" - ], - "support": { - "issues": "https://github.com/yosymfony/resource-watcher/issues", - "source": "https://github.com/yosymfony/resource-watcher/tree/master" - }, - "time": "2020-06-10T14:58:36+00:00" - } - ], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": "^7.4", - "ext-curl": "*", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-openssl": "*", - "ext-simplexml": "*" - }, - "platform-dev": [], - "plugin-api-version": "2.6.0" -} From 244d6e3835e64fcd20a4a130eaf9734802473fd2 Mon Sep 17 00:00:00 2001 From: Christos Sidiropoulos Date: Fri, 24 May 2024 09:35:28 +0200 Subject: [PATCH 72/72] [BUGFIX] Add `languageUid` to `index_name` to make it unique for structures too (#1211) Signed-off-by: Christos Sidiropoulos --- Classes/Controller/Backend/NewTenantController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/Controller/Backend/NewTenantController.php b/Classes/Controller/Backend/NewTenantController.php index 4d39f8259..36821c878 100644 --- a/Classes/Controller/Backend/NewTenantController.php +++ b/Classes/Controller/Backend/NewTenantController.php @@ -366,7 +366,7 @@ public function addStructureAction(): void $translatedRecord->setL18nParent($newRecord); $translatedRecord->_setProperty('_languageUid', $siteLanguage->getLanguageId()); $translatedRecord->setLabel($this->getLLL('structure.' . $indexName, $siteLanguage->getTypo3Language(), $structLabels)); - $translatedRecord->setIndexName($indexName); + $translatedRecord->setIndexName($indexName . "_" . $siteLanguage->getLanguageId()); $this->structureRepository->add($translatedRecord); }