diff --git a/.github/ISSUE_TEMPLATE/task-for-the-development-fund.md b/.github/ISSUE_TEMPLATE/task-for-the-development-fund.md index f67eef870..d798baeac 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 2024 +labels: ⭐ development fund 2025 assignees: '' --- diff --git a/.github/codeql.yml b/.github/codeql.yml index 56085d7bf..4e2fa3a6d 100644 --- a/.github/codeql.yml +++ b/.github/codeql.yml @@ -1,16 +1,16 @@ - name: "CodeQL Configuration" +name: CodeQL Configuration - queries: - - uses: security-and-quality +queries: + - uses: security-and-quality - query-filters: - - exclude: - problem.severity: - - note +query-filters: + - exclude: + problem.severity: + - note - paths-ignore: - - Resources/Public/JavaScript/jPlayer - - Resources/Public/JavaScript/jQuery - - Resources/Public/JavaScript/jQueryUI - - Resources/Public/JavaScript/OpenLayers - - Resources/Public/JavaScript/Toastify +paths-ignore: + - Resources/Public/JavaScript/jPlayer + - Resources/Public/JavaScript/jQuery + - Resources/Public/JavaScript/jQueryUI + - Resources/Public/JavaScript/OpenLayers + - Resources/Public/JavaScript/Toastify diff --git a/.github/phpstan.neon b/.github/phpstan.neon index 750315ed9..7307b130f 100644 --- a/.github/phpstan.neon +++ b/.github/phpstan.neon @@ -1,32 +1,31 @@ parameters: - ignoreErrors: - - '#Call to an undefined method Kitodo\\Dlf\\Domain\\Repository\\[a-zA-Z]+Repository::countByPid\(\)\.#' - - '#Call to an undefined method Kitodo\\Dlf\\Domain\\Repository\\[a-zA-Z]+Repository::findByIsListed\(\)\.#' - - '#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\(\)\.#' - - '#Call to an undefined method Kitodo\\Dlf\\Domain\\Repository\\[a-zA-Z]+Repository::findOneBySessionId\(\)\.#' - - '#Call to an undefined method Kitodo\\Dlf\\Domain\\Repository\\[a-zA-Z]+Repository::findOneByType\(\)\.#' - - '#Call to an undefined method Kitodo\\Dlf\\Domain\\Repository\\[a-zA-Z]+Repository::findOneByUid\(\)\.#' - - '#Call to an undefined method Psr\\Http\\Message\\RequestFactoryInterface::request\(\)\.#' - - '#Call to an undefined method Solarium\\Core\\Query\\DocumentInterface::setField\(\)\.#' - - '#Call to an undefined method Ubl\\Iiif\\Presentation\\Common\\Model\\Resources\\IiifResourceInterface::getHeight\(\)\.#' - - '#Call to an undefined method Ubl\\Iiif\\Presentation\\Common\\Model\\Resources\\IiifResourceInterface::getWidth\(\)\.#' - - '#Call to an undefined method Ubl\\Iiif\\Presentation\\Common\\Model\\Resources\\IiifResourceInterface::getPossibleTextAnnotationContainers\(\)\.#' - - '#Call to an undefined method Ubl\\Iiif\\Presentation\\Common\\Model\\Resources\\IiifResourceInterface::getTextAnnotations\(\)\.#' - - '#Call to an undefined method Ubl\\Iiif\\Presentation\\Common\\Model\\Resources\\ManifestInterface::getOriginalJsonArray\(\)\.#' - - '#Call to an undefined method Ubl\\Iiif\\Presentation\\Common\\Model\\Resources\\RangeInterface::getMemberRangesAndRanges\(\)\.#' - - '#Constant LOG_SEVERITY_ERROR not found\.#' - - '#Constant LOG_SEVERITY_NOTICE not found\.#' - - '#Constant LOG_SEVERITY_WARNING not found\.#' - - '#Constant TYPO3_MODE not found\.#' - level: 5 - paths: - - ../Classes/ - excludePaths: - - ../Classes/Controller/OaiPmhController.php - treatPhpDocTypesAsCertain: false + ignoreErrors: + - '#Call to an undefined method Kitodo\\Dlf\\Domain\\Repository\\[a-zA-Z]+Repository::countByPid\(\)\.#' + - '#Call to an undefined method Kitodo\\Dlf\\Domain\\Repository\\[a-zA-Z]+Repository::findByIsListed\(\)\.#' + - '#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::findOneBySessionId\(\)\.#' + - '#Call to an undefined method Kitodo\\Dlf\\Domain\\Repository\\[a-zA-Z]+Repository::findOneByType\(\)\.#' + - '#Call to an undefined method Kitodo\\Dlf\\Domain\\Repository\\[a-zA-Z]+Repository::findOneByUid\(\)\.#' + - '#Call to an undefined method Psr\\Http\\Message\\RequestFactoryInterface::request\(\)\.#' + - '#Call to an undefined method Solarium\\Core\\Query\\DocumentInterface::setField\(\)\.#' + - '#Call to an undefined method Ubl\\Iiif\\Presentation\\Common\\Model\\Resources\\IiifResourceInterface::getHeight\(\)\.#' + - '#Call to an undefined method Ubl\\Iiif\\Presentation\\Common\\Model\\Resources\\IiifResourceInterface::getWidth\(\)\.#' + - '#Call to an undefined method Ubl\\Iiif\\Presentation\\Common\\Model\\Resources\\IiifResourceInterface::getPossibleTextAnnotationContainers\(\)\.#' + - '#Call to an undefined method Ubl\\Iiif\\Presentation\\Common\\Model\\Resources\\IiifResourceInterface::getTextAnnotations\(\)\.#' + - '#Call to an undefined method Ubl\\Iiif\\Presentation\\Common\\Model\\Resources\\ManifestInterface::getOriginalJsonArray\(\)\.#' + - '#Call to an undefined method Ubl\\Iiif\\Presentation\\Common\\Model\\Resources\\RangeInterface::getMemberRangesAndRanges\(\)\.#' + - '#Constant LOG_SEVERITY_ERROR not found\.#' + - '#Constant LOG_SEVERITY_NOTICE not found\.#' + - '#Constant LOG_SEVERITY_WARNING not found\.#' + - '#Constant TYPO3_MODE not found\.#' + level: 5 + paths: + - ../Classes/ + excludePaths: + - ../Classes/Controller/OaiPmhController.php + treatPhpDocTypesAsCertain: false diff --git a/.github/pull.yml b/.github/pull.yml index e00fbe74a..8ef8ba932 100644 --- a/.github/pull.yml +++ b/.github/pull.yml @@ -18,3 +18,6 @@ rules: - base: 4.x upstream: kitodo:4.x mergeMethod: hardreset + - base: 5.x + upstream: kitodo:5.x + mergeMethod: hardreset diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index c17f1b765..6b1343b20 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -1,14 +1,14 @@ -name: "CodeQL" +name: CodeQL on: push: - branches: [ "master", "1.x", "2.x", "3.2.x", "3.3.x", "4.x" ] + branches: [ "5.x" ] pull_request: - branches: [ "master" ] + branches: [ "5.x" ] jobs: analyze: - name: Analyze + name: Static Code Analysis runs-on: ubuntu-latest permissions: actions: read diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml new file mode 100644 index 000000000..769245370 --- /dev/null +++ b/.github/workflows/documentation.yml @@ -0,0 +1,17 @@ +name: Documentation + +on: [ push, pull_request ] + +jobs: + tests: + name: Build Test + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Test if the documentation will render without warning + run: | + mkdir -p Documentation-GENERATED-temp \ + && docker run --rm --pull always -v $(pwd):/project \ + ghcr.io/typo3-documentation/render-guides:latest --config=Documentation --no-progress --fail-on-log diff --git a/.github/workflows/phpstan.yml b/.github/workflows/phpstan.yml index 35c5266de..5a2ba43ef 100644 --- a/.github/workflows/phpstan.yml +++ b/.github/workflows/phpstan.yml @@ -2,12 +2,13 @@ name: PHPStan on: push: - branches: [ "master" ] + branches: [ "5.x" ] pull_request: - branches: [ "master" ] + branches: [ "5.x" ] jobs: phpstan: + name: Static Code Analysis runs-on: ubuntu-latest steps: - name: Checkout code diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 09aed9078..5954fcd43 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -2,12 +2,13 @@ name: Unit and Functional Testing on: push: - branches: [ "master", "4.x-ocr" ] + branches: [ "5.x-ocr" ] pull_request: - branches: [ "master", "4.x-ocr" ] + branches: [ "5.x-ocr" ] jobs: test: + name: TYPO3 runs-on: ubuntu-latest strategy: matrix: diff --git a/Build/Test/docker-compose.yml b/Build/Test/docker-compose.yml index 2f0e8c9c3..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 " @@ -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/runTests.sh b/Build/Test/runTests.sh index dc73a9a75..7b5483d1c 100755 --- a/Build/Test/runTests.sh +++ b/Build/Test/runTests.sh @@ -3,16 +3,16 @@ # Adopted/reduced from https://github.com/TYPO3/typo3/blob/f6d73fea5a8f3a5cd8537e29308f18bec65a0c92/Build/Scripts/runTests.sh # Function to write a .env file in Build/Test -# This is read by docker-compose and vars defined here are +# This is read by docker compose and vars defined here are # used in Build/Test/docker-compose.yml setUpDockerComposeDotEnv() { # Delete possibly existing local .env file if exists [ -e .env ] && rm .env - # Set up a new .env file for docker-compose + # Set up a new .env file for docker compose { echo "COMPOSE_PROJECT_NAME=dlf_testing" # To prevent access rights of files created by the testing, the docker image later - # runs with the same user that is currently executing the script. docker-compose can't + # runs with the same user that is currently executing the script. docker compose can't # use $UID directly itself since it is a shell variable and not an env variable, so # we have to set it explicitly here. echo "HOST_UID=$(id -u)" @@ -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}" @@ -60,7 +61,7 @@ Execute unit, functional and other test suites in a docker based test environmen execution of single test files, sending xdebug information to a local IDE and more. Recommended docker version is >=20.10 for xdebug break pointing to work reliably, and -a recent docker-compose (tested >=1.21.2) is needed. +a recent docker compose (tested >=2.27.1) is needed. Usage: $0 [options] [file] @@ -159,12 +160,6 @@ Options: Show this help. EOF -# Test if docker-compose exists, else exit out with error -if ! type "docker-compose" > /dev/null; then - echo "This script relies on docker and docker-compose. Please install" >&2 - exit 1 -fi - # Go to the directory this script is located, so everything else is relative # to this dir, no matter from where this script is called. THIS_SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" @@ -188,6 +183,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 +213,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 ;; @@ -290,9 +286,9 @@ fi case ${TEST_SUITE} in composerInstall) setUpDockerComposeDotEnv - docker-compose run composer_install + docker compose run composer_install SUITE_EXIT_CODE=$? - docker-compose down + docker compose down ;; functional) handleDbmsAndDriverOptions @@ -300,7 +296,7 @@ case ${TEST_SUITE} in case ${DBMS} in mariadb|mysql) echo "Using driver: ${DATABASE_DRIVER}" - docker-compose run functional + docker compose run functional SUITE_EXIT_CODE=$? ;; *) @@ -309,13 +305,13 @@ case ${TEST_SUITE} in echo "call \".Build/Test/runTests.sh -h\" to display help and valid options" >&2 exit 1 esac - docker-compose down + docker compose down ;; unit) setUpDockerComposeDotEnv - docker-compose run unit + docker compose run unit SUITE_EXIT_CODE=$? - docker-compose down + docker compose down ;; update) # pull typo3/core-testing-*:latest versions of those ones that exist locally 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/Classes/Command/BaseCommand.php b/Classes/Command/BaseCommand.php index 25f2b5e47..f7dab8065 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; } /** @@ -114,24 +121,16 @@ public function __construct( * * @param int $storagePid The storage pid * - * @return bool + * @return void */ - protected function initializeRepositories(int $storagePid): bool + protected function initializeRepositories(int $storagePid): void { - if (MathUtility::canBeInterpretedAsInteger($storagePid)) { - $frameworkConfiguration = $this->configurationManager->getConfiguration(ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK); - - $frameworkConfiguration['persistence']['storagePid'] = MathUtility::forceIntegerInRange((int) $storagePid, 0); - $this->configurationManager->setConfiguration($frameworkConfiguration); - - // Get extension configuration. - $this->extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('dlf'); - } else { - return false; - } - $this->storagePid = MathUtility::forceIntegerInRange((int) $storagePid, 0); - - return true; + $frameworkConfiguration = $this->configurationManager->getConfiguration(ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK); + $frameworkConfiguration['persistence']['storagePid'] = MathUtility::forceIntegerInRange($storagePid, 0); + $this->configurationManager->setConfiguration($frameworkConfiguration); + $this->extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('dlf'); + $this->storagePid = MathUtility::forceIntegerInRange($storagePid, 0); + $this->persistenceManager = GeneralUtility::makeInstance(PersistenceManager::class); } /** @@ -202,23 +201,23 @@ 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); // 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'])); // 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(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] ? : ''); @@ -227,7 +226,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 +267,7 @@ protected function saveToDatabase(Document $document): bool $this->documentRepository->update($document); } - $persistenceManager->persistAll(); + $this->persistenceManager->persistAll(); return true; } @@ -321,14 +320,13 @@ protected function getParentDocumentUidForSaving(Document $document): int * 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 + private function addCollections(Document &$document, array $collections): void { foreach ($collections as $collection) { $documentCollection = $this->collectionRepository->findOneByIndexName($collection); @@ -337,19 +335,53 @@ private function addCollections(Document &$document, array $collections, Persist $documentCollection = GeneralUtility::makeInstance(Collection::class); $documentCollection->setIndexName($collection); $documentCollection->setLabel($collection); - $documentCollection->setOaiName((!empty($this->extConf['publishNewCollections']) ? Helper::getCleanString($collection) : '')); + $documentCollection->setOaiName((!empty($this->extConf['general']['publishNewCollections']) ? Helper::getCleanString($collection) : '')); $documentCollection->setIndexSearch(''); $documentCollection->setDescription(''); // add to CollectionRepository $this->collectionRepository->add($documentCollection); // persist collection to prevent duplicates - $persistenceManager->persistAll(); + $this->persistenceManager->persistAll(); } // add to document $document->addCollection($documentCollection); } } + /** + * 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. * diff --git a/Classes/Command/HarvestCommand.php b/Classes/Command/HarvestCommand.php index b3e565538..5ddb9edc2 100644 --- a/Classes/Command/HarvestCommand.php +++ b/Classes/Command/HarvestCommand.php @@ -108,7 +108,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $io = new SymfonyStyle($input, $output); $io->title($this->getDescription()); - $this->initializeRepositories($input->getOption('pid')); + $this->initializeRepositories((int) $input->getOption('pid')); if ($this->storagePid == 0) { $io->error('ERROR: No valid PID (' . $this->storagePid . ') given.'); @@ -127,15 +127,15 @@ protected function execute(InputInterface $input, OutputInterface $output): int } // Abort if solrCoreUid is empty or not in the array of allowed solr cores. if (empty($solrCoreUid) || !in_array($solrCoreUid, $allSolrCores)) { - $output_solrCores = []; - foreach ($allSolrCores as $index_name => $uid) { - $output_solrCores[] = $uid . ' : ' . $index_name; + $outputSolrCores = []; + foreach ($allSolrCores as $indexName => $uid) { + $outputSolrCores[] = $uid . ' : ' . $indexName; } - if (empty($output_solrCores)) { + if (empty($outputSolrCores)) { $io->error('ERROR: No valid Solr core ("' . $input->getOption('solr') . '") given. No valid cores found on PID ' . $this->storagePid . ".\n"); return BaseCommand::FAILURE; } else { - $io->error('ERROR: No valid Solr core ("' . $input->getOption('solr') . '") given. ' . "Valid cores are (:):\n" . implode("\n", $output_solrCores) . "\n"); + $io->error('ERROR: No valid Solr core ("' . $input->getOption('solr') . '") given. ' . "Valid cores are (:):\n" . implode("\n", $outputSolrCores) . "\n"); return BaseCommand::FAILURE; } } diff --git a/Classes/Command/IndexCommand.php b/Classes/Command/IndexCommand.php index c8dbd4ce6..4cb0ab189 100644 --- a/Classes/Command/IndexCommand.php +++ b/Classes/Command/IndexCommand.php @@ -95,7 +95,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $io = new SymfonyStyle($input, $output); $io->title($this->getDescription()); - $this->initializeRepositories($input->getOption('pid')); + $this->initializeRepositories((int) $input->getOption('pid')); if ($this->storagePid == 0) { $io->error('ERROR: No valid PID (' . $this->storagePid . ') given.'); @@ -111,15 +111,15 @@ protected function execute(InputInterface $input, OutputInterface $output): int // Abort if solrCoreUid is empty or not in the array of allowed solr cores. if (empty($solrCoreUid) || !in_array($solrCoreUid, $allSolrCores)) { - $output_solrCores = []; - foreach ($allSolrCores as $index_name => $uid) { - $output_solrCores[] = $uid . ' : ' . $index_name; + $outputSolrCores = []; + foreach ($allSolrCores as $indexName => $uid) { + $outputSolrCores[] = $uid . ' : ' . $indexName; } - if (empty($output_solrCores)) { + if (empty($outputSolrCores)) { $io->error('ERROR: No valid Solr core ("' . $input->getOption('solr') . '") given. No valid cores found on PID ' . $this->storagePid . ".\n"); return BaseCommand::FAILURE; } else { - $io->error('ERROR: No valid Solr core ("' . $input->getOption('solr') . '") given. ' . "Valid cores are (:):\n" . implode("\n", $output_solrCores) . "\n"); + $io->error('ERROR: No valid Solr core ("' . $input->getOption('solr') . '") given. ' . "Valid cores are (:):\n" . implode("\n", $outputSolrCores) . "\n"); return BaseCommand::FAILURE; } } diff --git a/Classes/Command/ReindexCommand.php b/Classes/Command/ReindexCommand.php index 5ebdc9213..828c26c37 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', + 'l', + InputOption::VALUE_OPTIONAL, + 'Reindex the given amount of documents on the given page.' + ) + ->addOption( + 'index-begin', + 'b', + InputOption::VALUE_OPTIONAL, + 'Reindex documents on the given page starting from the given value.' ); } @@ -99,7 +111,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $io = new SymfonyStyle($input, $output); $io->title($this->getDescription()); - $this->initializeRepositories($input->getOption('pid')); + $this->initializeRepositories((int) $input->getOption('pid')); if ($this->storagePid == 0) { $io->error('ERROR: No valid PID (' . $this->storagePid . ') given.'); @@ -115,15 +127,15 @@ protected function execute(InputInterface $input, OutputInterface $output): int // Abort if solrCoreUid is empty or not in the array of allowed solr cores. if (empty($solrCoreUid) || !in_array($solrCoreUid, $allSolrCores)) { - $output_solrCores = []; - foreach ($allSolrCores as $index_name => $uid) { - $output_solrCores[] = $uid . ' : ' . $index_name; + $outputSolrCores = []; + foreach ($allSolrCores as $indexName => $uid) { + $outputSolrCores[] = $uid . ' : ' . $indexName; } - if (empty($output_solrCores)) { + if (empty($outputSolrCores)) { $io->error('ERROR: No valid Solr core ("' . $input->getOption('solr') . '") given. No valid cores found on PID ' . $this->storagePid . ".\n"); return BaseCommand::FAILURE; } else { - $io->error('ERROR: No valid Solr core ("' . $input->getOption('solr') . '") given. ' . "Valid cores are (:):\n" . implode("\n", $output_solrCores) . "\n"); + $io->error('ERROR: No valid Solr core ("' . $input->getOption('solr') . '") given. ' . "Valid cores are (:):\n" . implode("\n", $outputSolrCores) . "\n"); return BaseCommand::FAILURE; } } @@ -143,19 +155,43 @@ protected function execute(InputInterface $input, OutputInterface $output): int } if (!empty($input->getOption('all'))) { - // Get all documents. - $documents = $this->documentRepository->findAll(); + if ( + !empty($input->getOption('index-limit')) + && $input->getOption('index-begin') >= 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-begin')) + ->execute(); + $io->writeln($input->getOption('index-limit') . ' documents starting from ' . $input->getOption('index-begin') . ' will be indexed.'); + } else { + // Get all documents. + $documents = $this->documentRepository->findAll(); + } } elseif ( !empty($input->getOption('coll')) && !is_array($input->getOption('coll')) ) { + $collections = GeneralUtility::intExplode(',', $input->getOption('coll'), true); // "coll" may be a single integer or a comma-separated list of integers. - if (empty(array_filter(GeneralUtility::intExplode(',', $input->getOption('coll'), true)))) { + if (empty(array_filter($collections))) { $io->error('ERROR: Parameter --coll|-c is not a valid comma-separated list of collection UIDs.'); return BaseCommand::FAILURE; } - // Get all documents of given collections. - $documents = $this->documentRepository->findAllByCollectionsLimited(GeneralUtility::intExplode(',', $input->getOption('coll'), true), 0); + + if ( + !empty($input->getOption('index-limit')) + && $input->getOption('index-begin') >= 0 + ) { + $documents = $this->documentRepository->findAllByCollectionsLimited($collections, (int) $input->getOption('index-limit'), (int) $input->getOption('index-begin')); + + $io->writeln($input->getOption('index-limit') . ' documents starting from ' . $input->getOption('index-begin') . ' will be indexed.'); + } else { + // Get all documents of given collections. + $documents = $this->documentRepository->findAllByCollectionsLimited($collections, 0); + } } else { $io->error('ERROR: One of parameters --all|-a or --coll|-c must be given.'); return BaseCommand::FAILURE; @@ -181,10 +217,13 @@ 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(); } + // Clear state of persistence manager to prevent memory exhaustion. + $this->persistenceManager->clearState(); + $io->success('All done!'); return BaseCommand::SUCCESS; diff --git a/Classes/Common/AbstractDocument.php b/Classes/Common/AbstractDocument.php index 83a315091..42901fc8e 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 @@ -569,8 +562,8 @@ public static function &getInstance(string $location, array $settings = [], bool $contentAsJsonArray = json_decode($content, true); if ($contentAsJsonArray !== null) { IiifHelper::setUrlReader(IiifUrlReader::getInstance()); - IiifHelper::setMaxThumbnailHeight($extConf['iiifThumbnailHeight']); - IiifHelper::setMaxThumbnailWidth($extConf['iiifThumbnailWidth']); + IiifHelper::setMaxThumbnailHeight($extConf['iiif']['thumbnailHeight']); + IiifHelper::setMaxThumbnailWidth($extConf['iiif']['thumbnailWidth']); $iiif = IiifHelper::loadIiifResource($contentAsJsonArray); if ($iiif instanceof IiifResourceInterface) { $documentFormat = 'IIIF'; @@ -581,7 +574,7 @@ public static function &getInstance(string $location, array $settings = [], bool } // Sanitize input. - $pid = max((int) $settings['storagePid'], 0); + $pid = array_key_exists('storagePid', $settings) ? max((int) $settings['storagePid'], 0) : 0; if ($documentFormat == 'METS') { $instance = new MetsDocument($pid, $location, $xml, $settings); } elseif ($documentFormat == 'IIIF') { @@ -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(); } /** @@ -660,7 +653,7 @@ protected function getFullTextFromXml(string $id): string // ... physical structure ... $this->magicGetPhysicalStructure(); // ... and extension configuration. - $extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get(self::$extKey); + $extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get(self::$extKey, 'files'); $fileGrpsFulltext = GeneralUtility::trimExplode(',', $extConf['fileGrpFulltext']); $textFormat = ""; if (!empty($this->physicalStructureInfo[$id])) { diff --git a/Classes/Common/Helper.php b/Classes/Common/Helper.php index be0ec00eb..7c3ad22a8 100644 --- a/Classes/Common/Helper.php +++ b/Classes/Common/Helper.php @@ -12,6 +12,7 @@ namespace Kitodo\Dlf\Common; +use TYPO3\CMS\Core\Configuration\ConfigurationManager; use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Http\Uri; @@ -26,6 +27,7 @@ use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Core\Utility\MathUtility; use TYPO3\CMS\Extbase\Utility\LocalizationUtility; +use TYPO3\CMS\Core\DataHandling\DataHandler; use TYPO3\CMS\Core\Domain\Repository\PageRepository; /** @@ -206,7 +208,7 @@ public static function decrypt(string $encrypted) self::log('OpenSSL library doesn\'t support cipher and/or hash algorithm', LOG_SEVERITY_ERROR); return false; } - if (empty($GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'])) { + if (empty(self::getEncryptionKey())) { self::log('No encryption key set in TYPO3 configuration', LOG_SEVERITY_ERROR); return false; } @@ -221,7 +223,7 @@ public static function decrypt(string $encrypted) $binary = base64_decode($encrypted); $iv = substr($binary, 0, openssl_cipher_iv_length(self::$cipherAlgorithm)); $data = substr($binary, openssl_cipher_iv_length(self::$cipherAlgorithm)); - $key = openssl_digest($GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'], self::$hashAlgorithm, true); + $key = openssl_digest(self::getEncryptionKey(), self::$hashAlgorithm, true); // Decrypt data. return openssl_decrypt($data, self::$cipherAlgorithm, $key, OPENSSL_RAW_DATA, $iv); } @@ -248,12 +250,19 @@ public static function getXmlFileAsString($content) // Turn off libxml's error logging. $libxmlErrors = libxml_use_internal_errors(true); - // Disables the functionality to allow external entities to be loaded when parsing the XML, must be kept - $previousValueOfEntityLoader = libxml_disable_entity_loader(true); + + if (\PHP_VERSION_ID < 80000) { + // Disables the functionality to allow external entities to be loaded when parsing the XML, must be kept + $previousValueOfEntityLoader = libxml_disable_entity_loader(true); + } + // Try to load XML from file. $xml = simplexml_load_string($content); - // reset entity loader setting - libxml_disable_entity_loader($previousValueOfEntityLoader); + + if (\PHP_VERSION_ID < 80000) { + // reset entity loader setting + libxml_disable_entity_loader($previousValueOfEntityLoader); + } // Reset libxml's error logging. libxml_use_internal_errors($libxmlErrors); return $xml; @@ -334,13 +343,13 @@ public static function encrypt(string $string) self::log('OpenSSL library doesn\'t support cipher and/or hash algorithm', LOG_SEVERITY_ERROR); return false; } - if (empty($GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'])) { + if (empty(self::getEncryptionKey())) { self::log('No encryption key set in TYPO3 configuration', LOG_SEVERITY_ERROR); return false; } // Generate random initialization vector. $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length(self::$cipherAlgorithm)); - $key = openssl_digest($GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'], self::$hashAlgorithm, true); + $key = openssl_digest(self::getEncryptionKey(), self::$hashAlgorithm, true); // Encrypt data. $encrypted = openssl_encrypt($string, self::$cipherAlgorithm, $key, OPENSSL_RAW_DATA, $iv); // Merge initialization vector and encrypted data. @@ -350,23 +359,6 @@ public static function encrypt(string $string) return $encrypted; } - /** - * Get the unqualified name of a class - * - * @access public - * - * @static - * - * @param string $qualifiedClassName The qualified class name from get_class() - * - * @return string The unqualified class name - */ - public static function getUnqualifiedClassName(string $qualifiedClassName): string - { - $nameParts = explode('\\', $qualifiedClassName); - return end($nameParts); - } - /** * Clean up a string to use in an URL. * @@ -404,8 +396,8 @@ public static function getCleanString(string $string): string public static function getHookObjects(string $scriptRelPath): array { $hookObjects = []; - if (is_array($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS'][self::$extKey . '/' . $scriptRelPath]['hookClass'])) { - foreach ($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS'][self::$extKey . '/' . $scriptRelPath]['hookClass'] as $classRef) { + if (is_array(self::getOptions()[self::$extKey . '/' . $scriptRelPath]['hookClass'])) { + foreach (self::getOptions()[self::$extKey . '/' . $scriptRelPath]['hookClass'] as $classRef) { $hookObjects[] = GeneralUtility::makeInstance($classRef); } } @@ -548,94 +540,6 @@ public static function getDocumentStructures(int $pid = -1): array return array_column($allStructures, 'indexName', 'uid'); } - /** - * Get the URN of an object - * @see http://www.persistent-identifier.de/?link=316 - * - * @access public - * - * @static - * - * @param string $base The namespace and base URN - * @param string $id The object's identifier - * - * @return string Uniform Resource Name as string - */ - public static function getURN(string $base, string $id): string - { - $concordance = [ - '0' => 1, - '1' => 2, - '2' => 3, - '3' => 4, - '4' => 5, - '5' => 6, - '6' => 7, - '7' => 8, - '8' => 9, - '9' => 41, - 'a' => 18, - 'b' => 14, - 'c' => 19, - 'd' => 15, - 'e' => 16, - 'f' => 21, - 'g' => 22, - 'h' => 23, - 'i' => 24, - 'j' => 25, - 'k' => 42, - 'l' => 26, - 'm' => 27, - 'n' => 13, - 'o' => 28, - 'p' => 29, - 'q' => 31, - 'r' => 12, - 's' => 32, - 't' => 33, - 'u' => 11, - 'v' => 34, - 'w' => 35, - 'x' => 36, - 'y' => 37, - 'z' => 38, - '-' => 39, - ':' => 17, - ]; - $urn = strtolower($base . $id); - if (preg_match('/[^a-z\d:-]/', $urn)) { - self::log('Invalid chars in given parameters', LOG_SEVERITY_WARNING); - return ''; - } - $digits = ''; - for ($i = 0, $j = strlen($urn); $i < $j; $i++) { - $digits .= $concordance[substr($urn, $i, 1)]; - } - $checksum = 0; - for ($i = 0, $j = strlen($digits); $i < $j; $i++) { - $checksum += ($i + 1) * (int) substr($digits, $i, 1); - } - $checksum = substr((string) floor($checksum / (int) substr($digits, -1, 1)), -1, 1); - return $base . $id . $checksum; - } - - /** - * Check if given ID is a valid Pica Production Number (PPN) - * - * @access public - * - * @static - * - * @param string $id The identifier to check - * - * @return bool Is $id a valid PPN? - */ - public static function isPPN(string $id): bool - { - return self::checkIdentifier($id, 'PPN'); - } - /** * Determine whether or not $url is a valid URL using HTTP or HTTPS scheme. * @@ -663,25 +567,55 @@ public static function isValidHttpUrl(string $url): bool } /** - * Merges two arrays recursively and actually returns the modified array. - * @see ArrayUtility::mergeRecursiveWithOverrule() + * Process a data and/or command map with TYPO3 core engine as admin. * * @access public * - * @static - * - * @param array $original Original array - * @param array $overrule Overrule array, overruling the original array - * @param bool $addKeys If set to false, keys that are not found in $original will not be set - * @param bool $includeEmptyValues If set, values from $overrule will overrule if they are empty - * @param bool $enableUnsetFeature If set, special value "__UNSET" can be used in the overrule array to unset keys in the original array + * @param array $data Data map + * @param array $cmd Command map + * @param bool $reverseOrder Should the data map be reversed? + * @param bool $cmdFirst Should the command map be processed first? * - * @return array Merged array + * @return array Array of substituted "NEW..." identifiers and their actual UIDs. */ - public static function mergeRecursiveWithOverrule(array $original, array $overrule, bool $addKeys = true, bool $includeEmptyValues = true, bool $enableUnsetFeature = true): array + public static function processDatabaseAsAdmin(array $data = [], array $cmd = [], $reverseOrder = false, $cmdFirst = false) { - ArrayUtility::mergeRecursiveWithOverrule($original, $overrule, $addKeys, $includeEmptyValues, $enableUnsetFeature); - return $original; + $context = GeneralUtility::makeInstance(Context::class); + + if ( + \TYPO3_MODE === 'BE' + && $context->getPropertyFromAspect('backend.user', 'isAdmin') + ) { + // Instantiate TYPO3 core engine. + $dataHandler = GeneralUtility::makeInstance(DataHandler::class); + // We do not use workspaces and have to bypass restrictions in DataHandler. + $dataHandler->bypassWorkspaceRestrictions = true; + // Load data and command arrays. + $dataHandler->start($data, $cmd); + // Process command map first if default order is reversed. + if ( + !empty($cmd) + && $cmdFirst + ) { + $dataHandler->process_cmdmap(); + } + // Process data map. + if (!empty($data)) { + $dataHandler->reverseOrder = $reverseOrder; + $dataHandler->process_datamap(); + } + // Process command map if processing order is not reversed. + if ( + !empty($cmd) + && !$cmdFirst + ) { + $dataHandler->process_cmdmap(); + } + return $dataHandler->substNEWwithIDs; + } else { + self::log('Current backend user has no admin privileges', LOG_SEVERITY_ERROR); + return []; + } } /** @@ -923,14 +857,14 @@ public static function getUrl(string $url) } // Get extension configuration. - $extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('dlf'); + $extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('dlf', 'general'); /** @var RequestFactory $requestFactory */ $requestFactory = GeneralUtility::makeInstance(RequestFactory::class); $configuration = [ 'timeout' => 30, 'headers' => [ - 'User-Agent' => $extConf['useragent'] ?? 'Kitodo.Presentation Proxy', + 'User-Agent' => $extConf['userAgent'] ?? 'Kitodo.Presentation Proxy', ], ]; try { @@ -958,4 +892,54 @@ public static function isValidXmlId($id): bool { return preg_match('/^[_a-z][_a-z0-9-.]*$/i', $id) === 1; } + + /** + * Get options from local configuration. + * + * @access private + * + * @static + * + * @return array + */ + private static function getOptions(): array + { + return self::getLocalConfigurationByPath('SC_OPTIONS'); + } + + /** + * Get encryption key from local configuration. + * + * @access private + * + * @static + * + * @return string|null + */ + private static function getEncryptionKey(): ?string + { + return self::getLocalConfigurationByPath('SYS/encryptionKey'); + } + + /** + * Get local configuration for given path. + * + * @access private + * + * @static + * + * @param string $path + * + * @return mixed + */ + private static function getLocalConfigurationByPath(string $path) + { + $configurationManager = GeneralUtility::makeInstance(ConfigurationManager::class); + + if (array_key_exists(strtok($path, '/'), $configurationManager->getLocalConfiguration())) { + return $configurationManager->getLocalConfigurationValueByPath($path); + } + + return ArrayUtility::getValueByPath($GLOBALS['TYPO3_CONF_VARS'], $path); + } } diff --git a/Classes/Common/IiifManifest.php b/Classes/Common/IiifManifest.php index 27e1ff6ed..073bf5a53 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 @@ -234,7 +233,7 @@ protected function getUseGroups(string $use) { if (!$this->useGrpsLoaded) { // Get configured USE attributes. - $extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get(self::$extKey); + $extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get(self::$extKey, 'files'); if (!empty($extConf['fileGrpImages'])) { $this->useGrps['fileGrpImages'] = GeneralUtility::trimExplode(',', $extConf['fileGrpImages']); } @@ -265,7 +264,7 @@ protected function magicGetPhysicalStructure(): array if ($this->iiif == null || !($this->iiif instanceof ManifestInterface)) { return []; } - $extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get(self::$extKey); + $extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get(self::$extKey, 'iiif'); $iiifId = $this->iiif->getId(); $this->physicalStructureInfo[$iiifId]['id'] = $iiifId; $this->physicalStructureInfo[$iiifId]['dmdId'] = $iiifId; @@ -367,7 +366,7 @@ public function getFileInfo($id): ?array $this->fileInfos[$id]['mimeType'] = $this->getFileMimeType($id); } - return $this->fileInfos[$id]; + return $this->fileInfos[$id] ?? null; } /** @@ -755,7 +754,7 @@ public function getFullText(string $id): string $this->magicGetPhysicalStructure(); // ... and extension configuration. $extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get(self::$extKey); - $fileGrpsFulltext = GeneralUtility::trimExplode(',', $extConf['fileGrpFulltext']); + $fileGrpsFulltext = GeneralUtility::trimExplode(',', $extConf['files']['fileGrpFulltext']); if (!empty($this->physicalStructureInfo[$id])) { while ($fileGrpFulltext = array_shift($fileGrpsFulltext)) { if (!empty($this->physicalStructureInfo[$id]['files'][$fileGrpFulltext])) { @@ -763,7 +762,7 @@ public function getFullText(string $id): string break; } } - if ($extConf['indexAnnotations'] == 1) { + if ($extConf['iiif']['indexAnnotations'] == 1) { $iiifResource = $this->iiif->getContainedResourceById($id); // Get annotation containers $annotationContainerIds = $this->physicalStructureInfo[$id]['annotationContainers']; @@ -808,10 +807,10 @@ protected function loadLocation(string $location): bool { $fileResource = GeneralUtility::getUrl($location); if ($fileResource !== false) { - $conf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get(self::$extKey); + $conf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get(self::$extKey, 'iiif'); IiifHelper::setUrlReader(IiifUrlReader::getInstance()); - IiifHelper::setMaxThumbnailHeight($conf['iiifThumbnailHeight']); - IiifHelper::setMaxThumbnailWidth($conf['iiifThumbnailWidth']); + IiifHelper::setMaxThumbnailHeight($conf['thumbnailHeight']); + IiifHelper::setMaxThumbnailWidth($conf['thumbnailWidth']); $resource = IiifHelper::loadIiifResource($fileResource); if ($resource instanceof ManifestInterface) { $this->iiif = $resource; @@ -866,7 +865,7 @@ protected function ensureHasFulltextIsSet(): void $this->hasFulltext = true; return; } - $extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get(self::$extKey); + $extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get(self::$extKey, 'iiif'); if ($extConf['indexAnnotations'] == 1 && !empty($canvas->getPossibleTextAnnotationContainers(Motivation::PAINTING))) { foreach ($canvas->getPossibleTextAnnotationContainers(Motivation::PAINTING) as $annotationContainer) { $textAnnotations = $annotationContainer->getTextAnnotations(Motivation::PAINTING); @@ -999,10 +998,10 @@ private function setFileUseFulltext(string $iiifId, $iiif): void */ public function __wakeup(): void { - $conf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get(self::$extKey); + $conf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get(self::$extKey, 'iiif'); IiifHelper::setUrlReader(IiifUrlReader::getInstance()); - IiifHelper::setMaxThumbnailHeight($conf['iiifThumbnailHeight']); - IiifHelper::setMaxThumbnailWidth($conf['iiifThumbnailWidth']); + IiifHelper::setMaxThumbnailHeight($conf['thumbnailHeight']); + IiifHelper::setMaxThumbnailWidth($conf['thumbnailWidth']); $resource = IiifHelper::loadIiifResource($this->asJson); if ($resource instanceof ManifestInterface) { $this->asJson = ''; @@ -1024,6 +1023,6 @@ public function __sleep(): array // TODO implement serialization in IIIF library $jsonArray = $this->iiif->getOriginalJsonArray(); $this->asJson = json_encode($jsonArray); - return ['uid', 'pid', 'recordId', 'parentId', 'asJson']; + return ['pid', 'recordId', 'parentId', 'asJson']; } } diff --git a/Classes/Common/Indexer.php b/Classes/Common/Indexer.php index 59a652db7..587c8e0c8 100644 --- a/Classes/Common/Indexer.php +++ b/Classes/Common/Indexer.php @@ -388,7 +388,7 @@ protected static function processPhysical(Document $document, int $page, array $ $doc->cPid = $document->getPid(); if ($doc->hasFulltext && $fullText = $doc->getFullText($physicalUnit['id'])) { // Read extension configuration. - $extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get(self::$extKey); + $extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get(self::$extKey, 'files'); // Create new Solr document. $updateQuery = self::$solr->service->createUpdate(); $solrDoc = self::getSolrDocument($updateQuery, $document, $physicalUnit, $fullText); @@ -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/Common/MetsDocument.php b/Classes/Common/MetsDocument.php index 41f3cebd0..3610bf98c 100644 --- a/Classes/Common/MetsDocument.php +++ b/Classes/Common/MetsDocument.php @@ -12,6 +12,9 @@ namespace Kitodo\Dlf\Common; +use \DOMElement; +use \DOMXPath; +use \SimpleXMLElement; use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Database\Query\Restriction\HiddenRestriction; @@ -45,7 +48,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 @@ -54,14 +56,14 @@ * @property-read string $thumbnail this holds the document's thumbnail location * @property bool $thumbnailLoaded flag with information if the thumbnail is loaded * @property-read string $toplevelId this holds the toplevel structure's "@ID" (METS) or the manifest's "@id" (IIIF) - * @property \SimpleXMLElement $xml this holds the whole XML file as \SimpleXMLElement object + * @property SimpleXMLElement $xml this holds the whole XML file as SimpleXMLElement object * @property-read array $mdSec associative array of METS metadata sections indexed by their IDs. * @property bool $mdSecLoaded flag with information if the array of METS metadata sections is loaded * @property-read array $dmdSec subset of `$mdSec` storing only the dmdSec entries; kept for compatibility. * @property-read array $fileGrps this holds the file ID -> USE concordance * @property bool $fileGrpsLoaded flag with information if file groups array is loaded * @property-read array $fileInfos additional information about files (e.g., ADMID), indexed by ID. - * @property-read \SimpleXMLElement $mets this holds the XML file's METS part as \SimpleXMLElement object + * @property-read SimpleXMLElement $mets this holds the XML file's METS part as SimpleXMLElement object * @property-read string $parentHref URL of the parent document (determined via mptr element), or empty string if none is available */ final class MetsDocument extends AbstractDocument @@ -127,9 +129,9 @@ final class MetsDocument extends AbstractDocument /** * @access protected - * @var \SimpleXMLElement This holds the XML file's METS part as \SimpleXMLElement object + * @var SimpleXMLElement This holds the XML file's METS part as SimpleXMLElement object */ - protected \SimpleXMLElement $mets; + protected SimpleXMLElement $mets; /** * @access protected @@ -190,10 +192,10 @@ public function getDownloadLocation(string $id): string $file = $this->getFileInfo($id); if ($file['mimeType'] === 'application/vnd.kitodo.iiif') { $file['location'] = (strrpos($file['location'], 'info.json') === strlen($file['location']) - 9) ? $file['location'] : (strrpos($file['location'], '/') === strlen($file['location']) ? $file['location'] . 'info.json' : $file['location'] . '/info.json'); - $conf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get(self::$extKey); + $conf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get(self::$extKey, 'iiif'); IiifHelper::setUrlReader(IiifUrlReader::getInstance()); - IiifHelper::setMaxThumbnailHeight($conf['iiifThumbnailHeight']); - IiifHelper::setMaxThumbnailWidth($conf['iiifThumbnailWidth']); + IiifHelper::setMaxThumbnailHeight($conf['thumbnailHeight']); + IiifHelper::setMaxThumbnailWidth($conf['thumbnailWidth']); $service = IiifHelper::loadIiifResource($file['location']); if ($service instanceof AbstractImageService) { return $service->getImageUrl(); @@ -222,7 +224,7 @@ public function getFileInfo($id): ?array $this->fileInfos[$id]['mimeType'] = $this->getFileMimeType($id); } - return $this->fileInfos[$id]; + return $this->fileInfos[$id] ?? null; } /** @@ -298,60 +300,105 @@ public function getLogicalStructure(string $id, bool $recursive = false): array * * @access protected * - * @param \SimpleXMLElement $structure The logical structure node + * @param SimpleXMLElement $structure The logical structure node * @param bool $recursive Whether to include the child elements * * @return array Array of the element's id, label, type and physical page indexes/mptr link */ - protected function getLogicalStructureInfo(\SimpleXMLElement $structure, 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)) { + + $this->getPage($details, $structure->children('http://www.loc.gov/METS/')->mptr); + $this->getFiles($details, $structure->children('http://www.loc.gov/METS/')->fptr); + + // Keep for later usage. + $this->logicalUnits[$details['id']] = $details; + // Walk the structure recursively? And are there any children of the current element? + if ( + $recursive + && count($structure->children('http://www.loc.gov/METS/')->div) + ) { + $details['children'] = []; + foreach ($structure->children('http://www.loc.gov/METS/')->div as $child) { + // Repeat for all children. + $details['children'][] = $this->getLogicalStructureInfo($child, true); + } + } + return $details; + } + + /** + * Get the files this structure element is pointing at. + * + * @param ?SimpleXMLElement $filePointers + * + * @return void + */ + private function getFiles(array &$details, ?SimpleXMLElement $filePointers): void + { + $fileUse = $this->magicGetFileGrps(); + // Get the file representations from fileSec node. + foreach ($filePointers as $filePointer) { + $fileId = (string) $filePointer->attributes()->FILEID; + // Check if file has valid @USE attribute. + if (!empty($fileUse[$fileId])) { + $details['files'][$fileUse[$fileId]] = $fileId; + } + } + } + + /** + * Get the physical page or external file this structure element is pointing at. + * + * @access private + * + * @param array $details passed as reference + * @param ?SimpleXMLElement $metsPointers + * + * @return void + */ + private function getPage(array &$details, ?SimpleXMLElement $metsPointers): void + { + if (count($metsPointers)) { // Yes. Get the file reference. - $details['points'] = (string) $structure->children('http://www.loc.gov/METS/')->mptr[0]->attributes('http://www.w3.org/1999/xlink')->href; + $details['points'] = (string) $metsPointers[0]->attributes('http://www.w3.org/1999/xlink')->href; } elseif ( !empty($this->physicalStructure) && array_key_exists($details['id'], $this->smLinks['l2p']) @@ -369,30 +416,6 @@ protected function getLogicalStructureInfo(\SimpleXMLElement $structure, bool $r if ($details['thumbnailId'] === null) { 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) { - // Check if file has valid @USE attribute. - if (!empty($fileUse[(string) $fptr->attributes()->FILEID])) { - $details['files'][$fileUse[(string) $fptr->attributes()->FILEID]] = (string) $fptr->attributes()->FILEID; - } - } - // Keep for later usage. - $this->logicalUnits[$details['id']] = $details; - // Walk the structure recursively? And are there any children of the current element? - if ( - $recursive - && count($structure->children('http://www.loc.gov/METS/')->div) - ) { - $details['children'] = []; - foreach ($structure->children('http://www.loc.gov/METS/')->div as $child) { - // Repeat for all children. - $details['children'][] = $this->getLogicalStructureInfo($child, true); - } - } - return $details; } /** @@ -407,7 +430,7 @@ protected function getLogicalStructureInfo(\SimpleXMLElement $structure, bool $r private function getThumbnail(string $id = '') { // Load plugin configuration. - $extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get(self::$extKey); + $extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get(self::$extKey, 'files'); $fileGrpsThumb = GeneralUtility::trimExplode(',', $extConf['fileGrpThumbs']); $thumbnail = null; @@ -432,142 +455,310 @@ 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. return []; } - // Associative array used as set of available section types (dmdSec, techMD, ...) - $hasMetadataSection = []; + // Array used as set of available section types (dmdSec, techMD, ...) + $metadataSections = []; // 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'])) { + if ($this->hasMetadataSection($metadataSections, $mdSectionType, '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, $metadataSections)) { 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]; - } + $metadataSections[] = $mdSectionType; + } + + // Files are not expected to reference a dmdSec + if (isset($this->fileInfos[$id]) || in_array('dmdSec', $metadataSections)) { + 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 $metadataSections + * + * @return boolean + */ + private function extractAndProcessMetadata(string $dmdId, string $mdSectionType, array &$metadata, int $cPid, array $metadataSections): bool + { + if ($this->hasMetadataSection($metadataSections, $mdSectionType, '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; + } + + /** + * Check if searched metadata section is stored in the array. + * + * @access private + * + * @param array $metadataSections + * @param string $currentMetadataSection + * @param string $searchedMetadataSection + * + * @return boolean + */ + private function hasMetadataSection(array $metadataSections, string $currentMetadataSection, string $searchedMetadataSection): bool + { + return $currentMetadataSection === $searchedMetadataSection && in_array($searchedMetadataSection, $metadataSections); + } + + /** + * 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)]; } + } + } + + /** + * 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']]; + } + } - $hasMetadataSection[$mdSectionType] = true; + /** + * Set sortable metadata value. + * + * @access private + * + * @param array $resArray + * @param $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; } /** @@ -591,7 +782,7 @@ private function extractMetadataIfTypeSupported(string $dmdId, string $mdSection 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']); + $obj->extractMetadata($this->mdSec[$dmdId]['xml'], $metadata, GeneralUtility::makeInstance(ExtensionConfiguration::class)->get(self::$extKey, 'general')['useExternalApisForMetadata']); return true; } } else { @@ -841,7 +1032,7 @@ protected function ensureHasFulltextIsSet(): void protected function setPreloadedDocument($preloadedDocument): bool { - if ($preloadedDocument instanceof \SimpleXMLElement) { + if ($preloadedDocument instanceof SimpleXMLElement) { $this->xml = $preloadedDocument; return true; } @@ -851,7 +1042,7 @@ protected function setPreloadedDocument($preloadedDocument): bool /** * @see AbstractDocument::getDocument() */ - protected function getDocument(): \SimpleXMLElement + protected function getDocument(): SimpleXMLElement { return $this->mets; } @@ -924,11 +1115,11 @@ protected function magicGetDmdSec(): array * * @access protected * - * @param \SimpleXMLElement $element + * @param SimpleXMLElement $element * * @return array|null The processed metadata section */ - protected function processMdSec(\SimpleXMLElement $element): ?array + protected function processMdSec(SimpleXMLElement $element): ?array { $mdId = (string) $element->attributes()->ID; if (empty($mdId)) { @@ -974,7 +1165,7 @@ protected function magicGetFileGrps(): array { if (!$this->fileGrpsLoaded) { // Get configured USE attributes. - $extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get(self::$extKey); + $extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get(self::$extKey, 'files'); $useGrps = GeneralUtility::trimExplode(',', $extConf['fileGrpImages']); if (!empty($extConf['fileGrpThumbs'])) { $useGrps = array_merge($useGrps, GeneralUtility::trimExplode(',', $extConf['fileGrpThumbs'])); @@ -1038,9 +1229,9 @@ protected function prepareMetadataArray(int $cPid): void * * @access protected * - * @return \SimpleXMLElement The XML's METS part as \SimpleXMLElement object + * @return SimpleXMLElement The XML's METS part as SimpleXMLElement object */ - protected function magicGetMets(): \SimpleXMLElement + protected function magicGetMets(): SimpleXMLElement { return $this->mets; } @@ -1059,55 +1250,96 @@ 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'] : ''); - // 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[$id]['files'][$fileUse[(string) $fptr->attributes()->FILEID]] = (string) $fptr->attributes()->FILEID; - } - } - // 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'] : ''); - // 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; - } - } - } - // Sort array by keys (= @ORDER). - ksort($elements); - // Set total number of pages/tracks. - $this->numPages = count($elements); - // Merge and re-index the array to get numeric indexes. - array_unshift($elements, $id); - $this->physicalStructure = $elements; + $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'] : ''; + + $this->getFileRepresentation($id, $firstNode); + + $this->physicalStructure = $this->getPhysicalElements($elementNodes, $fileUse); } $this->physicalStructureLoaded = true; } return $this->physicalStructure; } + /** + * Get the file representations from fileSec node. + * + * @access private + * + * @param string $id + * @param SimpleXMLElement $physicalNode + * + * @return void + */ + private function getFileRepresentation(string $id, SimpleXMLElement $physicalNode): void + { + // Get file groups. + $fileUse = $this->magicGetFileGrps(); + + foreach ($physicalNode->children('http://www.loc.gov/METS/')->fptr as $fptr) { + $fileId = (string) $fptr->attributes()->FILEID; + // Check if file has valid @USE attribute. + if (!empty($fileUse[$fileId])) { + $this->physicalStructureInfo[$id]['files'][$fileUse[$fileId]] = $fileId; + } + } + } + + /** + * Build the physical elements' array from the physical structMap node. + * + * @access private + * + * @param array $elementNodes + * @param array $fileUse + * + * @return array + */ + private function getPhysicalElements(array $elementNodes, array $fileUse): array + { + $elements = []; + $id = ''; + + foreach ($elementNodes as $elementNode) { + $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[$order]]['files'][$fileUse[(string) $fptr->attributes()->FILEID]] = (string) $fptr->attributes()->FILEID; + } + } + } + + // Sort array by keys (= @ORDER). + ksort($elements); + // Set total number of pages/tracks. + $this->numPages = count($elements); + // Merge and re-index the array to get numeric indexes. + array_unshift($elements, $id); + + return $elements; + } + /** * @see AbstractDocument::magicGetSmLinks() */ @@ -1136,14 +1368,14 @@ 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; return $this->thumbnail; } // Load extension configuration. - $extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get(self::$extKey); + $extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get(self::$extKey, 'files'); if (empty($extConf['fileGrpThumbs'])) { $this->logger->warning('No fileGrp for thumbnails specified'); $this->thumbnailLoaded = true; @@ -1160,7 +1392,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') ) @@ -1263,9 +1495,9 @@ public function magicGetParentHref(): string */ public function __sleep(): array { - // \SimpleXMLElement objects can't be serialized, thus save the XML as string for serialization + // SimpleXMLElement objects can't be serialized, thus save the XML as string for serialization $this->asXML = $this->xml->asXML(); - return ['uid', 'pid', 'recordId', 'parentId', 'asXML']; + return ['pid', 'recordId', 'parentId', 'asXML']; } /** diff --git a/Classes/Common/Solr/SearchResult/Region.php b/Classes/Common/Solr/SearchResult/Region.php index 86b21c506..7416cb3f4 100644 --- a/Classes/Common/Solr/SearchResult/Region.php +++ b/Classes/Common/Solr/SearchResult/Region.php @@ -90,7 +90,7 @@ class Region public function __construct(int $id, array $region) { $this->id = $id; - $this->pageId = $region['pageIdx']; + $this->pageId = $region['pageIdx'] ?? null; $this->xBeginPosition = $region['ulx']; $this->xEndPosition = $region['lrx']; $this->yBeginPosition = $region['uly']; diff --git a/Classes/Common/Solr/SearchResult/ResultDocument.php b/Classes/Common/Solr/SearchResult/ResultDocument.php index 2105c73df..764070aef 100644 --- a/Classes/Common/Solr/SearchResult/ResultDocument.php +++ b/Classes/Common/Solr/SearchResult/ResultDocument.php @@ -102,9 +102,9 @@ class ResultDocument * * @access public * - * @param Document $record: found document record - * @param array $highlighting: Array of found highlight elements - * @param array $fields: Array of fields used for search + * @param Document $record found document record + * @param array $highlighting array of found highlight elements + * @param array $fields array of fields used for search * * @return void */ @@ -115,11 +115,13 @@ public function __construct(Document $record, array $highlighting, array $fields $this->page = $record[$fields['page']]; $this->thumbnail = $record[$fields['thumbnail']]; $this->title = $record[$fields['title']]; - $this->toplevel = $record[$fields['toplevel']]; + $this->toplevel = $record[$fields['toplevel']] ?? false; $this->type = $record[$fields['type']]; - $highlightingForRecord = $highlighting[$record[$fields['id']]][$fields['fulltext']]; - $this->snippetsForRecord = is_array($highlightingForRecord['snippets']) ? $highlightingForRecord['snippets'] : []; + if (!empty($highlighting[$this->id])) { + $highlightingForRecord = $highlighting[$this->id][$fields['fulltext']]; + $this->snippetsForRecord = is_array($highlightingForRecord['snippets']) ? $highlightingForRecord['snippets'] : []; + } $this->parseSnippets(); $this->parsePages(); diff --git a/Classes/Common/Solr/Solr.php b/Classes/Common/Solr/Solr.php index 52c1ba081..c6eea82e4 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; @@ -242,34 +243,34 @@ public static function escapeQueryKeepField(string $query, int $pid): string public static function getFields(): array { if (empty(self::$fields)) { - $conf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get(self::$extKey); - - self::$fields['id'] = $conf['solrFieldId']; - self::$fields['uid'] = $conf['solrFieldUid']; - self::$fields['pid'] = $conf['solrFieldPid']; - self::$fields['page'] = $conf['solrFieldPage']; - self::$fields['partof'] = $conf['solrFieldPartof']; - self::$fields['root'] = $conf['solrFieldRoot']; - self::$fields['sid'] = $conf['solrFieldSid']; - self::$fields['toplevel'] = $conf['solrFieldToplevel']; - self::$fields['type'] = $conf['solrFieldType']; - self::$fields['title'] = $conf['solrFieldTitle']; - self::$fields['volume'] = $conf['solrFieldVolume']; - self::$fields['date'] = $conf['solrFieldDate']; - self::$fields['thumbnail'] = $conf['solrFieldThumbnail']; - self::$fields['default'] = $conf['solrFieldDefault']; - self::$fields['timestamp'] = $conf['solrFieldTimestamp']; - self::$fields['autocomplete'] = $conf['solrFieldAutocomplete']; - self::$fields['fulltext'] = $conf['solrFieldFulltext']; - self::$fields['record_id'] = $conf['solrFieldRecordId']; - self::$fields['purl'] = $conf['solrFieldPurl']; - self::$fields['urn'] = $conf['solrFieldUrn']; - self::$fields['location'] = $conf['solrFieldLocation']; - self::$fields['collection'] = $conf['solrFieldCollection']; - self::$fields['license'] = $conf['solrFieldLicense']; - self::$fields['terms'] = $conf['solrFieldTerms']; - self::$fields['restrictions'] = $conf['solrFieldRestrictions']; - self::$fields['geom'] = $conf['solrFieldGeom']; + $conf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get(self::$extKey, 'solr'); + $solrFields = $conf['fields']; + self::$fields['id'] = $solrFields['id']; + self::$fields['uid'] = $solrFields['uid']; + self::$fields['pid'] = $solrFields['pid']; + self::$fields['page'] = $solrFields['page']; + self::$fields['partof'] = $solrFields['partof']; + self::$fields['root'] = $solrFields['root']; + self::$fields['sid'] = $solrFields['sid']; + self::$fields['toplevel'] = $solrFields['toplevel']; + self::$fields['type'] = $solrFields['type']; + self::$fields['title'] = $solrFields['title']; + self::$fields['volume'] = $solrFields['volume']; + self::$fields['date'] = $solrFields['date']; + self::$fields['thumbnail'] = $solrFields['thumbnail']; + self::$fields['default'] = $solrFields['default']; + self::$fields['timestamp'] = $solrFields['timestamp']; + self::$fields['autocomplete'] = $solrFields['autocomplete']; + self::$fields['fulltext'] = $solrFields['fulltext']; + self::$fields['record_id'] = $solrFields['recordId']; + self::$fields['purl'] = $solrFields['purl']; + self::$fields['urn'] = $solrFields['urn']; + self::$fields['location'] = $solrFields['location']; + self::$fields['collection'] = $solrFields['collection']; + self::$fields['license'] = $solrFields['license']; + self::$fields['terms'] = $solrFields['terms']; + self::$fields['restrictions'] = $solrFields['restrictions']; + self::$fields['geom'] = $solrFields['geom']; } return self::$fields; @@ -300,7 +301,7 @@ public static function getInstance($core = null): Solr if (!empty($core)) { // Check if there is an instance in the registry already. if ( - is_object(self::$registry[$core]) + array_key_exists($core, self::$registry) && self::$registry[$core] instanceof self ) { // Return singleton instance if available. @@ -349,25 +350,25 @@ protected function loadSolrConnectionInfo(): void if (empty($this->config)) { $config = []; // Extract extension configuration. - $conf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get(self::$extKey); + $conf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get(self::$extKey, 'solr'); // Derive Solr scheme - $config['scheme'] = empty($conf['solrHttps']) ? 'http' : 'https'; + $config['scheme'] = empty($conf['https']) ? 'http' : 'https'; // Derive Solr host name. - $config['host'] = ($conf['solrHost'] ? $conf['solrHost'] : '127.0.0.1'); + $config['host'] = ($conf['host'] ? $conf['host'] : '127.0.0.1'); // Set username and password. - $config['username'] = $conf['solrUser']; - $config['password'] = $conf['solrPass']; + $config['username'] = $conf['user']; + $config['password'] = $conf['pass']; // Set port if not set. - $config['port'] = MathUtility::forceIntegerInRange($conf['solrPort'], 1, 65535, 8983); + $config['port'] = MathUtility::forceIntegerInRange($conf['port'], 1, 65535, 8983); // Trim path of slashes and (re-)add trailing slash if path not empty. - $config['path'] = trim($conf['solrPath'], '/'); + $config['path'] = trim($conf['path'], '/'); if (!empty($config['path'])) { $config['path'] .= '/'; } // Set connection timeout lower than PHP's max_execution_time. $maxExecutionTime = (int) ini_get('max_execution_time') ? : 30; - $config['timeout'] = MathUtility::forceIntegerInRange($conf['solrTimeout'], 1, $maxExecutionTime, 10); + $config['timeout'] = MathUtility::forceIntegerInRange($conf['timeout'], 1, $maxExecutionTime, 10); $this->config = $config; } } @@ -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/Classes/Common/Solr/SolrSearch.php b/Classes/Common/Solr/SolrSearch.php index 4b40e91f3..c8fcd41bd 100644 --- a/Classes/Common/Solr/SolrSearch.php +++ b/Classes/Common/Solr/SolrSearch.php @@ -365,8 +365,8 @@ public function prepare() // Set search query. if ( - (!empty($this->searchParams['fulltext'])) - || preg_match('/' . $fields['fulltext'] . ':\((.*)\)/', trim($this->searchParams['query']), $matches) + !empty($this->searchParams['fulltext']) + || preg_match('/' . $fields['fulltext'] . ':\((.*)\)/', trim($this->searchParams['query'] ?? ''), $matches) ) { // If the query already is a fulltext query e.g using the facets $this->searchParams['query'] = empty($matches[1]) ? $this->searchParams['query'] : $matches[1]; @@ -499,10 +499,10 @@ public function submit($start, $rows, $processResults = true) $childrenOf = $this->documentRepository->findChildrenOfEach($documentSet); foreach ($result['documents'] as $doc) { - if (empty($documents[$doc['uid']]) && $allDocuments[$doc['uid']]) { + if (empty($documents[$doc['uid']]) && isset($allDocuments[$doc['uid']])) { $documents[$doc['uid']] = $allDocuments[$doc['uid']]; } - if ($documents[$doc['uid']]) { + if (isset($documents[$doc['uid']])) { $this->translateLanguageCode($doc); if ($doc['toplevel'] === false) { // this maybe a chapter, article, ..., year @@ -536,7 +536,7 @@ public function submit($start, $rows, $processResults = true) $documents[$doc['uid']]['metadata'][$indexName] = $doc['metadata'][$indexName]; } } - if ($this->searchParams['fulltext'] != '1') { + if (!array_key_exists('fulltext', $this->searchParams) || $this->searchParams['fulltext'] != '1') { $documents[$doc['uid']]['page'] = 1; $children = $childrenOf[$doc['uid']] ?? []; @@ -669,14 +669,15 @@ protected function searchSolr($parameters = [], $enableCache = true) $grouping->setLimit(100); // Results in group (TODO: check) $grouping->setNumberOfGroups(true); - if ($parameters['fulltext'] === true) { + $fulltextExists = $parameters['fulltext'] ?? false; + if ($fulltextExists === true) { // get highlighting component and apply settings $selectQuery->getHighlighting(); } $solrRequest = $solr->service->createRequest($selectQuery); - if ($parameters['fulltext'] === true) { + if ($fulltextExists === true) { // If it is a fulltext search, enable highlighting. // field for which highlighting is going to be performed, // is required if you want to have OCR highlighting @@ -703,7 +704,7 @@ protected function searchSolr($parameters = [], $enableCache = true) $resultSet['numberOfToplevels'] = $uidGroup->getNumberOfGroups(); $resultSet['numFound'] = $uidGroup->getMatches(); $highlighting = []; - if ($parameters['fulltext'] === true) { + if ($fulltextExists === true) { $data = $result->getData(); $highlighting = $data['ocrHighlighting']; } @@ -836,7 +837,7 @@ private function getDocument(Document $record, array $highlighting, array $field */ private function translateLanguageCode(&$doc): void { - if ($doc['metadata']['language']) { + if (array_key_exists('language', $doc['metadata'])) { foreach($doc['metadata']['language'] as $indexName => $language) { $doc['metadata']['language'][$indexName] = Helper::getLanguageName($language); } diff --git a/Classes/Controller/AbstractController.php b/Classes/Controller/AbstractController.php index e7db9f0ee..b30395c39 100644 --- a/Classes/Controller/AbstractController.php +++ b/Classes/Controller/AbstractController.php @@ -81,6 +81,12 @@ public function injectDocumentRepository(DocumentRepository $documentRepository) */ protected array $viewData; + /** + * @access protected + * @var int + */ + protected int $pageUid; + /** * Initialize the plugin controller * @@ -91,6 +97,7 @@ public function injectDocumentRepository(DocumentRepository $documentRepository) protected function initialize(): void { $this->requestData = GeneralUtility::_GPmerged('tx_dlf'); + $this->pageUid = (int) GeneralUtility::_GET('id'); // Sanitize user input to prevent XSS attacks. $this->sanitizeRequestData(); @@ -99,7 +106,7 @@ protected function initialize(): void $this->extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('dlf'); $this->viewData = [ - 'pageUid' => $GLOBALS['TSFE']->id, + 'pageUid' => $this->pageUid, 'uniqueId' => uniqid(), 'requestData' => $this->requestData ]; @@ -165,8 +172,8 @@ protected function loadDocument(int $documentId = 0): void protected function configureProxyUrl(string &$url): void { $this->uriBuilder->reset() - ->setTargetPageUid($GLOBALS['TSFE']->id) - ->setCreateAbsoluteUri(!empty($this->settings['forceAbsoluteUrl'])) + ->setTargetPageUid($this->pageUid) + ->setCreateAbsoluteUri(!empty($this->extConf['general']['forceAbsoluteUrl'])) ->setArguments( [ 'eID' => 'tx_dlf_pageview_proxy', @@ -259,7 +266,7 @@ protected function sanitizeRequestData(): void } // tx_dlf[double] may only be 0 or 1. - $this->requestData['double'] = MathUtility::forceIntegerInRange($this->requestData['double'], 0, 1, 0); + $this->requestData['double'] = MathUtility::forceIntegerInRange($this->requestData['double'] ?? 0, 0, 1); } /** @@ -291,10 +298,9 @@ protected function setDefaultPage(): void { // Set default values if not set. // $this->requestData['page'] may be integer or string (physical structure @ID) - if ( - (int) $this->requestData['page'] > 0 - || empty($this->requestData['page']) - ) { + if (empty($this->requestData['page'])) { + $this->requestData['page'] = 1; + } elseif ((int) $this->requestData['page'] > 0) { $this->requestData['page'] = MathUtility::forceIntegerInRange((int) $this->requestData['page'], 1, $this->document->getCurrentDocument()->numPages, 1); } else { $this->requestData['page'] = array_search($this->requestData['page'], $this->document->getCurrentDocument()->physicalStructure); @@ -322,6 +328,7 @@ public function __construct() * @param PaginatorInterface $paginator * @return array */ + //TODO: clean this function protected function buildSimplePagination(PaginationInterface $pagination, PaginatorInterface $paginator): array { $firstPage = $pagination->getFirstPageNumber(); @@ -399,8 +406,9 @@ protected function buildSimplePagination(PaginationInterface $pagination, Pagina array_push($pagesSect, ['label' => '...', 'startRecordNumber' => '...']); }; - $nextPageNumber = $pages[$currentPageNumber + 1]['startRecordNumber']; - $previousPageNumber = $pages[$currentPageNumber - 1]['startRecordNumber']; + // Safely get the next and previous page numbers + $nextPageNumber = isset($pages[$currentPageNumber + 1]) ? $pages[$currentPageNumber + 1]['startRecordNumber'] : null; + $previousPageNumber = isset($pages[$currentPageNumber - 1]) ? $pages[$currentPageNumber - 1]['startRecordNumber'] : null; // 'startRecordNumber' is not required in GridView, only the variant for each loop is required // 'endRecordNumber' is not required in both views diff --git a/Classes/Controller/AudioPlayerController.php b/Classes/Controller/AudioPlayerController.php index c546cd5b7..1ac7dfc87 100644 --- a/Classes/Controller/AudioPlayerController.php +++ b/Classes/Controller/AudioPlayerController.php @@ -85,7 +85,7 @@ public function mainAction(): void $this->setDefaultPage(); // Check if there are any audio files available. - $fileGrpsAudio = GeneralUtility::trimExplode(',', $this->extConf['fileGrpAudio']); + $fileGrpsAudio = GeneralUtility::trimExplode(',', $this->extConf['files']['fileGrpAudio']); while ($fileGrpAudio = array_shift($fileGrpsAudio)) { $physicalStructureInfo = $this->document->getCurrentDocument()->physicalStructureInfo[$this->document->getCurrentDocument()->physicalStructure[$this->requestData['page']]]; $fileId = $physicalStructureInfo['files'][$fileGrpAudio]; diff --git a/Classes/Controller/Backend/NewTenantController.php b/Classes/Controller/Backend/NewTenantController.php index 25fc19d4e..2b5d0b64a 100644 --- a/Classes/Controller/Backend/NewTenantController.php +++ b/Classes/Controller/Backend/NewTenantController.php @@ -11,28 +11,26 @@ namespace Kitodo\Dlf\Controller\Backend; +use Kitodo\Dlf\Common\Helper; use Kitodo\Dlf\Common\Solr\Solr; use Kitodo\Dlf\Controller\AbstractController; use Kitodo\Dlf\Domain\Model\Format; -use Kitodo\Dlf\Domain\Model\Metadata; -use Kitodo\Dlf\Domain\Model\MetadataFormat; use Kitodo\Dlf\Domain\Model\SolrCore; -use Kitodo\Dlf\Domain\Model\Structure; use Kitodo\Dlf\Domain\Repository\FormatRepository; use Kitodo\Dlf\Domain\Repository\MetadataRepository; -use Kitodo\Dlf\Domain\Repository\StructureRepository; use Kitodo\Dlf\Domain\Repository\SolrCoreRepository; -use Psr\Http\Message\ResponseInterface; +use Kitodo\Dlf\Domain\Repository\StructureRepository; use TYPO3\CMS\Backend\Utility\BackendUtility; use TYPO3\CMS\Backend\View\BackendTemplateView; +use TYPO3\CMS\Core\Core\Environment; +use TYPO3\CMS\Core\Exception\SiteNotFoundException; use TYPO3\CMS\Core\Localization\LocalizationFactory; -use TYPO3\CMS\Core\Utility\ExtensionManagementUtility; +use TYPO3\CMS\Core\Resource\ResourceFactory; +use TYPO3\CMS\Core\Site\Entity\NullSite; +use TYPO3\CMS\Core\Site\SiteFinder; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Mvc\View\ViewInterface; use TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager; -use TYPO3\CMS\Core\Exception\SiteNotFoundException; -use TYPO3\CMS\Core\Site\Entity\NullSite; -use TYPO3\CMS\Core\Site\SiteFinder; /** * Controller class for the backend module 'New Tenant'. @@ -182,7 +180,7 @@ protected function initializeAction(): void public function addFormatAction(): void { // Include formats definition file. - $formatsDefaults = include(ExtensionManagementUtility::extPath('dlf') . 'Resources/Private/Data/FormatDefaults.php'); + $formatsDefaults = $this->getRecords('Format'); $frameworkConfiguration = $this->configurationManager->getConfiguration($this->configurationManager::CONFIGURATION_TYPE_FRAMEWORK); // tx_dlf_formats are stored on PID = 0 @@ -224,70 +222,78 @@ public function addFormatAction(): void public function addMetadataAction(): void { // Include metadata definition file. - $metadataDefaults = include(ExtensionManagementUtility::extPath('dlf') . 'Resources/Private/Data/MetadataDefaults.php'); - - $doPersist = false; + $metadataDefaults = $this->getRecords('Metadata'); // load language file in own array $metadataLabels = $this->languageFactory->getParsedData('EXT:dlf/Resources/Private/Language/locallang_metadata.xlf', $this->siteLanguages[0]->getTypo3Language()); + $insertedFormats = $this->formatRepository->findAll(); + + $availableFormats = []; + foreach ($insertedFormats as $insertedFormat) { + $availableFormats[$insertedFormat->getRoot()] = $insertedFormat->getUid(); + } + + $defaultWrap = BackendUtility::getTcaFieldConfiguration('tx_dlf_metadata', 'wrap')['default']; + + $data = []; foreach ($metadataDefaults as $indexName => $values) { - // if default format record is not found, add it to the repository - if ($this->metadataRepository->findOneByIndexName($indexName) === null) { + $formatIds = []; + + foreach ($values['format'] as $format) { + $format['encoded'] = $availableFormats[$format['format_root']]; + unset($format['format_root']); + $formatIds[] = uniqid('NEW'); + $data['tx_dlf_metadataformat'][end($formatIds)] = $format; + $data['tx_dlf_metadataformat'][end($formatIds)]['pid'] = $this->pid; + } - $newRecord = GeneralUtility::makeInstance(Metadata::class); - $newRecord->setLabel($this->getLLL('metadata.' . $indexName, $this->siteLanguages[0]->getTypo3Language(), $metadataLabels)); - $newRecord->setIndexName($indexName); - $newRecord->setDefaultValue($values['default_value']); - $newRecord->setWrap($values['wrap'] ? : $GLOBALS['TCA']['tx_dlf_metadata']['columns']['wrap']['config']['default']); - $newRecord->setIndexTokenized($values['index_tokenized']); - $newRecord->setIndexStored((int) $values['index_stored']); - $newRecord->setIndexIndexed((int) $values['index_indexed']); - $newRecord->setIndexBoost((float) $values['index_boost']); - $newRecord->setIsSortable((int) $values['is_sortable']); - $newRecord->setIsFacet((int) $values['is_facet']); - $newRecord->setIsListed((int) $values['is_listed']); - $newRecord->setIndexAutocomplete((int) $values['index_autocomplete']); - - if (is_array($values['format'])) { - foreach ($values['format'] as $format) { - $formatRecord = $this->formatRepository->findOneByRoot($format['format_root']); - // If formatRecord is null, we cannot create a MetadataFormat record. - if ($formatRecord !== null) { - $newMetadataFormat = GeneralUtility::makeInstance(MetadataFormat::class); - $newMetadataFormat->setEncoded($formatRecord->getUid()); - $newMetadataFormat->setXpath($format['xpath']); - $newMetadataFormat->setXpathSorting($format['xpath_sorting']); - $newRecord->addFormat($newMetadataFormat); - } - } - } - - foreach ($this->siteLanguages as $siteLanguage) { - if ($siteLanguage->getLanguageId() === 0) { - // skip default language - continue; - } - $translatedRecord = GeneralUtility::makeInstance(Metadata::class); - $translatedRecord->setL18nParent($newRecord); - $translatedRecord->_setProperty('_languageUid', $siteLanguage->getLanguageId()); - $translatedRecord->setLabel($this->getLLL('metadata.' . $indexName, $siteLanguage->getTypo3Language(), $metadataLabels)); - $translatedRecord->setIndexName($indexName); - $translatedRecord->setWrap($newRecord->getWrap()); - - $this->metadataRepository->add($translatedRecord); - } - - $this->metadataRepository->add($newRecord); + $data['tx_dlf_metadata'][uniqid('NEW')] = [ + 'pid' => $this->pid, + 'label' => $this->getLLL('metadata.' . $indexName, $this->siteLanguages[0]->getTypo3Language(), $metadataLabels), + 'index_name' => $indexName, + 'format' => implode(',', $formatIds), + 'default_value' => $values['default_value'], + 'wrap' => !empty($values['wrap']) ? $values['wrap'] : $defaultWrap, + 'index_tokenized' => $values['index_tokenized'], + 'index_stored' => $values['index_stored'], + 'index_indexed' => $values['index_indexed'], + 'index_boost' => $values['index_boost'], + 'is_sortable' => $values['is_sortable'], + 'is_facet' => $values['is_facet'], + 'is_listed' => $values['is_listed'], + 'index_autocomplete' => $values['index_autocomplete'], + ]; + } - $doPersist = true; + $metadataIds = Helper::processDatabaseAsAdmin($data, [], true); + + $insertedMetadata = []; + foreach ($metadataIds as $id => $uid) { + $metadata = $this->metadataRepository->findByUid($uid); + // id array contains also ids of formats + if ($metadata != null) { + $insertedMetadata[$uid] = $metadata->getIndexName(); } } - // We must persist here, if we changed anything. - if ($doPersist === true) { - $persistenceManager = GeneralUtility::makeInstance(PersistenceManager::class); - $persistenceManager->persistAll(); + foreach ($this->siteLanguages as $siteLanguage) { + if ($siteLanguage->getLanguageId() === 0) { + // skip default language + continue; + } + + $translateData = []; + foreach ($insertedMetadata as $id => $indexName) { + $translateData['tx_dlf_metadata'][uniqid('NEW')] = [ + 'pid' => $this->pid, + 'sys_language_uid' => $siteLanguage->getLanguageId(), + 'l18n_parent' => $id, + 'label' => $this->getLLL('metadata.' . $indexName, $siteLanguage->getTypo3Language(), $metadataLabels), + ]; + } + + Helper::processDatabaseAsAdmin($translateData); } $this->forward('index'); @@ -339,45 +345,46 @@ public function addSolrCoreAction(): void public function addStructureAction(): void { // Include structure definition file. - $structureDefaults = include(ExtensionManagementUtility::extPath('dlf') . 'Resources/Private/Data/StructureDefaults.php'); - - $doPersist = false; + $structureDefaults = $this->getRecords('Structure'); // load language file in own array - $structLabels = $this->languageFactory->getParsedData('EXT:dlf/Resources/Private/Language/locallang_structure.xlf', $this->siteLanguages[0]->getTypo3Language()); + $structureLabels = $this->languageFactory->getParsedData('EXT:dlf/Resources/Private/Language/locallang_structure.xlf', $this->siteLanguages[0]->getTypo3Language()); + $data = []; foreach ($structureDefaults as $indexName => $values) { - // if default format record is not found, add it to the repository - if ($this->structureRepository->findOneByIndexName($indexName) === null) { - $newRecord = GeneralUtility::makeInstance(Structure::class); - $newRecord->setLabel($this->getLLL('structure.' . $indexName, $this->siteLanguages[0]->getTypo3Language(), $structLabels)); - $newRecord->setIndexName($indexName); - $newRecord->setToplevel($values['toplevel']); - $newRecord->setOaiName($values['oai_name']); - $this->structureRepository->add($newRecord); - - foreach ($this->siteLanguages as $siteLanguage) { - if ($siteLanguage->getLanguageId() === 0) { - // skip default language - continue; - } - $translatedRecord = GeneralUtility::makeInstance(Structure::class); - $translatedRecord->setL18nParent($newRecord); - $translatedRecord->_setProperty('_languageUid', $siteLanguage->getLanguageId()); - $translatedRecord->setLabel($this->getLLL('structure.' . $indexName, $siteLanguage->getTypo3Language(), $structLabels)); - $translatedRecord->setIndexName($indexName); - - $this->structureRepository->add($translatedRecord); - } + $data['tx_dlf_structures'][uniqid('NEW')] = [ + 'pid' => $this->pid, + 'toplevel' => $values['toplevel'], + 'label' => $this->getLLL('structure.' . $indexName, $this->siteLanguages[0]->getTypo3Language(), $structureLabels), + 'index_name' => $indexName, + 'oai_name' => $values['oai_name'], + 'thumbnail' => 0, + ]; + } + $structureIds = Helper::processDatabaseAsAdmin($data, [], true); - $doPersist = true; - } + $insertedStructures = []; + foreach ($structureIds as $id => $uid) { + $insertedStructures[$uid] = $this->structureRepository->findByUid($uid)->getIndexName(); } - // We must persist here, if we changed anything. - if ($doPersist === true) { - $persistenceManager = GeneralUtility::makeInstance(PersistenceManager::class); - $persistenceManager->persistAll(); + foreach ($this->siteLanguages as $siteLanguage) { + if ($siteLanguage->getLanguageId() === 0) { + // skip default language + continue; + } + + $translateData = []; + foreach ($insertedStructures as $id => $indexName) { + $translateData['tx_dlf_structures'][uniqid('NEW')] = [ + 'pid' => $this->pid, + 'sys_language_uid' => $siteLanguage->getLanguageId(), + 'l18n_parent' => $id, + 'label' => $this->getLLL('structure.' . $indexName, $siteLanguage->getTypo3Language(), $structureLabels), + ]; + } + + Helper::processDatabaseAsAdmin($translateData); } $this->forward('index'); @@ -420,15 +427,15 @@ public function indexAction(): void $this->forward('error'); } - $formatsDefaults = include(ExtensionManagementUtility::extPath('dlf') . 'Resources/Private/Data/FormatDefaults.php'); + $formatsDefaults = $this->getRecords('Format'); $recordInfos['formats']['numCurrent'] = $this->formatRepository->countAll(); $recordInfos['formats']['numDefault'] = count($formatsDefaults); - $structuresDefaults = include(ExtensionManagementUtility::extPath('dlf') . 'Resources/Private/Data/StructureDefaults.php'); + $structuresDefaults = $this->getRecords('Structure'); $recordInfos['structures']['numCurrent'] = $this->structureRepository->countByPid($this->pid); $recordInfos['structures']['numDefault'] = count($structuresDefaults); - $metadataDefaults = include(ExtensionManagementUtility::extPath('dlf') . 'Resources/Private/Data/MetadataDefaults.php'); + $metadataDefaults = $this->getRecords('Metadata'); $recordInfos['metadata']['numCurrent'] = $this->metadataRepository->countByPid($this->pid); $recordInfos['metadata']['numDefault'] = count($metadataDefaults); @@ -453,7 +460,7 @@ public function errorAction(): void /** * Get language label for given key and language. * - * @access protected + * @access private * * @param string $index * @param string $lang @@ -461,7 +468,7 @@ public function errorAction(): void * * @return string */ - protected function getLLL(string $index, string $lang, array $langArray): string + private function getLLL(string $index, string $lang, array $langArray): string { if (isset($langArray[$lang][$index][0]['target'])) { return $langArray[$lang][$index][0]['target']; @@ -471,4 +478,31 @@ protected function getLLL(string $index, string $lang, array $langArray): string return 'Missing translation for ' . $index; } } + + /** + * Get records from file for given record type. + * + * @access private + * + * @param string $recordType + * + * @return array + */ + private function getRecords(string $recordType): array + { + $filePath = Environment::getPublicPath() . '/typo3conf/ext/dlf/Resources/Private/Data/' . $recordType . 'Defaults.json'; + + $resourceFactory = GeneralUtility::makeInstance(ResourceFactory::class); + $fileObject = $resourceFactory->getFileObjectFromCombinedIdentifier($filePath); + + if ($fileObject !== null) { + $fileContents = $fileObject->getContents(); + $records = json_decode($fileContents, true); + + if (json_last_error() === JSON_ERROR_NONE) { + return $records; + } + } + return []; + } } diff --git a/Classes/Controller/BasketController.php b/Classes/Controller/BasketController.php index e3e3ced84..2240cbd27 100644 --- a/Classes/Controller/BasketController.php +++ b/Classes/Controller/BasketController.php @@ -268,20 +268,18 @@ protected function getBasketData(): Basket * * @access protected * - * @param array $data DocumentData + * @param bool|null|object $data DocumentData * * @return array One basket entry */ - protected function getEntry(array $data): array + protected function getEntry($data): array { - // TODO: Call to function is_object() with array will always evaluate to false. - // @phpstan-ignore-next-line if (is_object($data)) { $data = get_object_vars($data); } $id = $data['id']; - $startpage = $data['startpage']; - $endpage = $data['endpage']; + $startPage = $data['startpage']; + $endPage = $data['endpage']; $startX = $data['startX']; $startY = $data['startY']; $endX = $data['endX']; @@ -290,9 +288,7 @@ protected function getEntry(array $data): array $docData = $this->getDocumentData((int) $id, $data); - $entryArray['BASKETDATA'] = $docData; - - $entryKey = $id . '_' . $startpage; + $entryKey = $id . '_' . $startPage; if (!empty($startX)) { $entryKey .= '_' . $startX; } @@ -300,10 +296,16 @@ protected function getEntry(array $data): array $entryKey .= '_' . $endX; } - $entryArray['id'] = $id; - $entryArray['CONTROLS'] = [ - 'startpage' => $startpage, - 'endpage' => $endpage, + $entry = [ + 'BASKETDATA' => $docData, + 'id' => $id, + 'NUMBER' => $docData['record_id'], + 'key' => $entryKey + ]; + + $entry['CONTROLS'] = [ + 'startpage' => $startPage, + 'endpage' => $endPage, 'startX' => $startX, 'startY' => $startY, 'endX' => $endX, @@ -311,11 +313,8 @@ protected function getEntry(array $data): array 'rotation' => $rotation, ]; - $entryArray['NUMBER'] = $docData['record_id']; - $entryArray['key'] = $entryKey; - // return one entry - return $entryArray; + return $entry; } /** diff --git a/Classes/Controller/CollectionController.php b/Classes/Controller/CollectionController.php index c7ecb958b..890e75f5c 100644 --- a/Classes/Controller/CollectionController.php +++ b/Classes/Controller/CollectionController.php @@ -81,9 +81,7 @@ public function listAction(): void $this->logger->error('Apache Solr not available'); return; } - // We only care about the UID and partOf in the results and want them sorted - $params['fields'] = 'uid,partof'; - $params['sort'] = ['uid' => 'asc']; + $collections = []; // Sort collections according to order in plugin flexform configuration @@ -217,22 +215,29 @@ private function processCollections($collections, Solr $solr): array // Process results. foreach ($collections as $collection) { - $solr_query = ''; + $solrQuery = ''; if ($collection->getIndexSearch() != '') { - $solr_query .= '(' . $collection->getIndexSearch() . ')'; + $solrQuery .= '(' . $collection->getIndexSearch() . ')'; } else { - $solr_query .= 'collection:("' . Solr::escapeQuery($collection->getIndexName()) . '")'; + $solrQuery .= 'collection:("' . Solr::escapeQuery($collection->getIndexName()) . '")'; } + // We only care about the UID and partOf in the results and want them sorted + $params = [ + 'fields' => 'uid,partof', + 'sort' => [ + 'uid' => 'asc' + ] + ]; // virtual collection might yield documents, that are not toplevel true or partof anything if ($collection->getIndexSearch()) { - $params['query'] = $solr_query; + $params['query'] = $solrQuery; } else { - $params['query'] = $solr_query . ' AND partof:0 AND toplevel:true'; + $params['query'] = $solrQuery . ' AND partof:0 AND toplevel:true'; } $partOfNothing = $solr->searchRaw($params); - $params['query'] = $solr_query . ' AND NOT partof:0 AND toplevel:true'; + $params['query'] = $solrQuery . ' AND NOT partof:0 AND toplevel:true'; $partOfSomething = $solr->searchRaw($params); $collectionInfo = []; diff --git a/Classes/Controller/ListViewController.php b/Classes/Controller/ListViewController.php index 75944bff9..66bb47835 100644 --- a/Classes/Controller/ListViewController.php +++ b/Classes/Controller/ListViewController.php @@ -81,17 +81,14 @@ public function mainAction(): void // extract collection(s) from collection parameter $collections = []; - if ($this->searchParams['collection']) { + if (array_key_exists('collection', $this->searchParams)) { foreach(explode(',', $this->searchParams['collection']) as $collectionEntry) { $collections[] = $this->collectionRepository->findByUid((int) $collectionEntry); } } // Get current page from request data because the parameter is shared between plugins - $currentPage = $this->requestData['page']; - if (empty($currentPage)) { - $currentPage = 1; - } + $currentPage = $this->requestData['page'] ?? 1; // get all sortable metadata records $sortableMetadata = $this->metadataRepository->findByIsSortable(true); diff --git a/Classes/Controller/MetadataController.php b/Classes/Controller/MetadataController.php index c75548c0b..7979d4011 100644 --- a/Classes/Controller/MetadataController.php +++ b/Classes/Controller/MetadataController.php @@ -114,6 +114,7 @@ public function mainAction(): void $this->setDefault('displayIiifDescription', 1); $this->setDefault('displayIiifRights', 1); $this->setDefault('displayIiifLinks', 1); + $this->setPage(); } $this->currentDocument = $this->document->getCurrentDocument(); @@ -133,8 +134,8 @@ public function mainAction(): void $data['_id'] = $topLevelId; array_unshift($metadata, $data); } - // @phpstan-ignore-next-line - if (!$metadata) { + + if (empty(array_filter($metadata))) { $this->logger->warning('No metadata found for document with UID ' . $this->document->getUid()); return; } diff --git a/Classes/Controller/PageGridController.php b/Classes/Controller/PageGridController.php index e0b864b1d..b3fb67fcd 100644 --- a/Classes/Controller/PageGridController.php +++ b/Classes/Controller/PageGridController.php @@ -37,7 +37,7 @@ public function mainAction(): void $this->loadDocument(); if ( $this->isDocMissingOrEmpty() - || empty($this->extConf['fileGrpThumbs']) + || empty($this->extConf['files']['fileGrpThumbs']) ) { // Quit without doing anything if required variables are not set. return; @@ -48,16 +48,13 @@ public function mainAction(): void $numPages = $this->document->getCurrentDocument()->numPages; // Iterate through visible page set and display thumbnails. for ($i = 1; $i <= $numPages; $i++) { - $foundEntry = $this->getEntry($i, $this->extConf['fileGrpThumbs']); + $foundEntry = $this->getEntry($i, $this->extConf['files']['fileGrpThumbs']); $foundEntry['state'] = ($i == $this->requestData['page']) ? 'cur' : 'no'; $entryArray[] = $foundEntry; } // Get current page from request data because the parameter is shared between plugins - $currentPage = $this->requestData['page']; - if (empty($currentPage)) { - $currentPage = 1; - } + $currentPage = $this->requestData['page'] ?? 1; $itemsPerPage = $this->settings['paginate']['itemsPerPage']; if (empty($itemsPerPage)) { diff --git a/Classes/Controller/PageViewController.php b/Classes/Controller/PageViewController.php index 0404529c3..5961eee9b 100644 --- a/Classes/Controller/PageViewController.php +++ b/Classes/Controller/PageViewController.php @@ -104,7 +104,7 @@ public function mainAction(): void // Get the controls for the map. $this->controls = explode(',', $this->settings['features']); - $this->view->assign('forceAbsoluteUrl', $this->settings['forceAbsoluteUrl']); + $this->view->assign('forceAbsoluteUrl', $this->extConf['general']['forceAbsoluteUrl']); $this->addViewerJS(); @@ -126,16 +126,16 @@ protected function getFulltext(int $page): array { $fulltext = []; // Get fulltext link: - $fileGrpsFulltext = GeneralUtility::trimExplode(',', $this->extConf['fileGrpFulltext']); + $fileGrpsFulltext = GeneralUtility::trimExplode(',', $this->extConf['files']['fileGrpFulltext']); $ocrEngine = PageViewController::getOCRengine(AbstractDocument::$extKey); //check if remote fulltext exists: while ($fileGrpFulltext = array_shift($fileGrpsFulltext)) { $physicalStructureInfo = $this->document->getCurrentDocument()->physicalStructureInfo[$this->document->getCurrentDocument()->physicalStructure[$page]]; - $fileId = $physicalStructureInfo['files'][$fileGrpFulltext]; - if (!empty($fileId)) { //fulltext is remote present + $files = $physicalStructureInfo['files']; + if (!empty($files[$fileGrpFulltext])) { //fulltext is remote present if (PageViewController::getOCRengine(AbstractDocument::$extKey) == "originalremote") { - $file = $this->document->getCurrentDocument()->getFileInfo($fileId); + $file = $this->document->getCurrentDocument()->getFileInfo($files[$fileGrpFulltext]); $fulltext['url'] = $file['location']; if ($this->settings['useInternalProxy']) { $this->configureProxyUrl($fulltext['url']); @@ -162,7 +162,7 @@ protected function getFulltext(int $page): array } if (empty($fulltext)) { - $this->logger->notice('No full-text file found for page "' . $page . '" in fileGrps "' . $this->extConf['fileGrpFulltext'] . '"'); + $this->logger->notice('No full-text file found for page "' . $page . '" in fileGrps "' . $this->extConf['files']['fileGrpFulltext'] . '"'); } return $fulltext; } @@ -262,13 +262,13 @@ protected function getImage(int $page): array { $image = []; // Get @USE value of METS fileGrp. - $fileGrpsImages = GeneralUtility::trimExplode(',', $this->extConf['fileGrpImages']); + $fileGrpsImages = GeneralUtility::trimExplode(',', $this->extConf['files']['fileGrpImages']); while ($fileGrpImages = array_pop($fileGrpsImages)) { // Get image link. $physicalStructureInfo = $this->document->getCurrentDocument()->physicalStructureInfo[$this->document->getCurrentDocument()->physicalStructure[$page]]; - $fileId = $physicalStructureInfo['files'][$fileGrpImages]; - if (!empty($fileId)) { - $file = $this->document->getCurrentDocument()->getFileInfo($fileId); + $files = $physicalStructureInfo['files']; + if (!empty($files[$fileGrpImages])) { + $file = $this->document->getCurrentDocument()->getFileInfo($files[$fileGrpImages]); $image['url'] = $file['location']; $image['mimetype'] = $file['mimeType']; @@ -283,7 +283,7 @@ protected function getImage(int $page): array } } if (empty($image)) { - $this->logger->warning('No image file found for page "' . $page . '" in fileGrps "' . $this->extConf['fileGrpImages'] . '"'); + $this->logger->warning('No image file found for page "' . $page . '" in fileGrps "' . $this->extConf['files']['fileGrpImages'] . '"'); } return $image; } diff --git a/Classes/Controller/SearchController.php b/Classes/Controller/SearchController.php index f2e8788d6..1e19c97ad 100644 --- a/Classes/Controller/SearchController.php +++ b/Classes/Controller/SearchController.php @@ -115,6 +115,11 @@ public function mainAction(): void $this->searchParams = $this->getParametersSafely('searchParameter'); // if search was triggered by the ListView plugin, get the parameters from GET variables $listRequestData = GeneralUtility::_GPmerged('tx_dlf_listview'); + // Quit without doing anything if no search parameters. + if (empty($this->searchParams) && empty($listRequestData)) { + $this->logger->warning('Missing search parameters'); + return; + } if (isset($listRequestData['searchParameter']) && is_array($listRequestData['searchParameter'])) { $this->searchParams = array_merge($this->searchParams ?: [], $listRequestData['searchParameter']); @@ -123,16 +128,20 @@ public function mainAction(): void } // sanitize date search input - if (empty($this->searchParams['dateFrom']) && !empty($this->searchParams['dateTo'])) { - $this->searchParams['dateFrom'] = '*'; - } - if (empty($this->searchParams['dateTo']) && !empty($this->searchParams['dateFrom'])) { - $this->searchParams['dateTo'] = 'NOW'; - } - if ($this->searchParams['dateFrom'] > $this->searchParams['dateTo']) { - $tmpDate = $this->searchParams['dateFrom']; - $this->searchParams['dateFrom'] = $this->searchParams['dateTo']; - $this->searchParams['dateTo'] = $tmpDate; + if (!empty($this->searchParams['dateFrom']) || !empty($this->searchParams['dateTo'])) { + if (empty($this->searchParams['dateFrom']) && !empty($this->searchParams['dateTo'])) { + $this->searchParams['dateFrom'] = '*'; + } + + if (empty($this->searchParams['dateTo']) && !empty($this->searchParams['dateFrom'])) { + $this->searchParams['dateTo'] = 'NOW'; + } + + if ($this->searchParams['dateFrom'] > $this->searchParams['dateTo']) { + $tmpDate = $this->searchParams['dateFrom']; + $this->searchParams['dateFrom'] = $this->searchParams['dateTo']; + $this->searchParams['dateTo'] = $tmpDate; + } } // Pagination of Results: Pass the currentPage to the fluid template to calculate current index of search result. @@ -323,7 +332,7 @@ public function makeFacetsMenuArray(array $facets): array } foreach (array_keys($facets) as $field) { - $search['params']['component']['facetset']['facet'][] = [ + $search['params']['component']['facetset']['facet'][$field] = [ 'type' => 'field', 'mincount' => '1', 'key' => $field, @@ -381,7 +390,7 @@ private function addCollectionsQuery(string $query): string // if collections are given, we prepare the collections query string // extract collections from collection parameter $collections = null; - if ($this->searchParams['collection']) { + if (array_key_exists('collection', $this->searchParams)) { foreach (explode(',', $this->searchParams['collection']) as $collectionEntry) { $collections[] = $this->collectionRepository->findByUid((int) $collectionEntry); } diff --git a/Classes/Controller/TableOfContentsController.php b/Classes/Controller/TableOfContentsController.php index e15428d9a..7bbcefd43 100644 --- a/Classes/Controller/TableOfContentsController.php +++ b/Classes/Controller/TableOfContentsController.php @@ -131,44 +131,8 @@ private function getMenuEntry(array $entry, bool $recursive = false): array $entryArray['doNotLinkIt'] = 1; $entryArray['ITEM_STATE'] = 'NO'; - // Build menu links based on the $entry['points'] array. - if ( - !empty($entry['points']) - && MathUtility::canBeInterpretedAsInteger($entry['points']) - ) { - $entryArray['page'] = $entry['points']; + $this->buildMenuLinks($entryArray, $entry['id'], $entry['points'], $entry['targetUid']); - $entryArray['doNotLinkIt'] = 0; - if ($this->settings['basketButton']) { - $entryArray['basketButton'] = [ - 'logId' => $entry['id'], - 'startpage' => $entry['points'] - ]; - } - } elseif ( - !empty($entry['points']) - && is_string($entry['points']) - ) { - $entryArray['id'] = $entry['points']; - $entryArray['page'] = 1; - $entryArray['doNotLinkIt'] = 0; - if ($this->settings['basketButton']) { - $entryArray['basketButton'] = [ - 'logId' => $entry['id'], - 'startpage' => $entry['points'] - ]; - } - } elseif (!empty($entry['targetUid'])) { - $entryArray['id'] = $entry['targetUid']; - $entryArray['page'] = 1; - $entryArray['doNotLinkIt'] = 0; - if ($this->settings['basketButton']) { - $entryArray['basketButton'] = [ - 'logId' => $entry['id'], - 'startpage' => $entry['targetUid'] - ]; - } - } // Set "ITEM_STATE" to "CUR" if this entry points to current page. if (in_array($entry['id'], $this->activeEntries)) { $entryArray['ITEM_STATE'] = 'CUR'; @@ -202,6 +166,61 @@ private function getMenuEntry(array $entry, bool $recursive = false): array return $entryArray; } + /** + * Build menu links based on the $entry['points'] array. + * + * @access private + * + * @param array &$entryArray passed by reference + * @param mixed $id + * @param mixed $points + * @param mixed $targetUid + * + * @return void + */ + private function buildMenuLinks(array &$entryArray, $id, $points, $targetUid): void + { + if ( + !empty($points) + && MathUtility::canBeInterpretedAsInteger($points) + ) { + $entryArray['page'] = $points; + $entryArray['doNotLinkIt'] = 0; + $this->setBasket($entryArray, $id, $points); + } elseif ( + !empty($points) + && is_string($points) + ) { + $entryArray['id'] = $points; + $entryArray['page'] = 1; + $entryArray['doNotLinkIt'] = 0; + $this->setBasket($entryArray, $id, $points); + } elseif (!empty($targetUid)) { + $entryArray['id'] = $targetUid; + $entryArray['page'] = 1; + $entryArray['doNotLinkIt'] = 0; + $this->setBasket($entryArray, $id, $targetUid); + } + } + + /** + * Set basket if basket is included in settings. + * + * @param array $entryArray passed by reference + * @param mixed $id + * @param mixed $startPage + * @return void + */ + private function setBasket(array &$entryArray, $id, $startPage): void + { + if (isset($this->settings['basketButton'])) { + $entryArray['basketButton'] = [ + 'logId' => $id, + 'startpage' => $startPage + ]; + } + } + /** * If $entry references an external METS file (as mptr), * try to resolve its database UID and return an updated $entry. @@ -241,18 +260,25 @@ private function resolveMenuEntry(array $entry): array */ private function getAllLogicalUnits(): void { + $page = $this->requestData['page']; + $physicalStructure = $this->document->getCurrentDocument()->physicalStructure; if ( - !empty($this->requestData['page']) - && !empty($this->document->getCurrentDocument()->physicalStructure) + !empty($page) + && !empty($physicalStructure) ) { - $this->activeEntries = array_merge((array) $this->document->getCurrentDocument()->smLinks['p2l'][$this->document->getCurrentDocument()->physicalStructure[0]], - (array) $this->document->getCurrentDocument()->smLinks['p2l'][$this->document->getCurrentDocument()->physicalStructure[$this->requestData['page']]]); + $structureMapLinks = $this->document->getCurrentDocument()->smLinks; + $this->activeEntries = array_merge( + (array) $structureMapLinks['p2l'][$physicalStructure[0]], + (array) $structureMapLinks['p2l'][$physicalStructure[$page]] + ); if ( !empty($this->requestData['double']) - && $this->requestData['page'] < $this->document->getCurrentDocument()->numPages + && $page < $this->document->getCurrentDocument()->numPages ) { - $this->activeEntries = array_merge($this->activeEntries, - (array) $this->document->getCurrentDocument()->smLinks['p2l'][$this->document->getCurrentDocument()->physicalStructure[$this->requestData['page'] + 1]]); + $this->activeEntries = array_merge( + $this->activeEntries, + (array) $structureMapLinks['p2l'][$physicalStructure[$page + 1]] + ); } } } @@ -302,7 +328,10 @@ private function isMultiElement(string $type): bool */ private function setTitle(array $entry): string { - if (empty($entry['label']) && empty($entry['orderlabel'])) { + $label = $entry['label']; + $orderLabel = $entry['orderlabel']; + + if (empty($label) && empty($orderLabel)) { foreach ($this->settings['titleReplacements'] as $titleReplacement) { if ($entry['type'] == $titleReplacement['type']) { $fields = explode(",", $titleReplacement['fields']); @@ -314,12 +343,11 @@ private function setTitle(array $entry): string $title .= $entry[$field] . ' '; } } - return trim($title); } } } - return $entry['label'] ?: $entry['orderlabel']; + return $label ?: $orderLabel; } /** @@ -352,11 +380,14 @@ private function sortMenu(array &$menu): void */ private function sortSubMenu(array &$menu): void { - usort($menu[0]['_SUB_MENU'], function ($firstElement, $secondElement) { - if (!empty($firstElement['orderlabel'])) { - return $firstElement['orderlabel'] <=> $secondElement['orderlabel']; + usort( + $menu[0]['_SUB_MENU'], + function ($firstElement, $secondElement) { + if (!empty($firstElement['orderlabel'])) { + return $firstElement['orderlabel'] <=> $secondElement['orderlabel']; + } + return $firstElement['year'] <=> $secondElement['year']; } - return $firstElement['year'] <=> $secondElement['year']; - }); + ); } } diff --git a/Classes/Controller/ToolboxController.php b/Classes/Controller/ToolboxController.php index 974876167..1ce430ed4 100644 --- a/Classes/Controller/ToolboxController.php +++ b/Classes/Controller/ToolboxController.php @@ -161,7 +161,7 @@ private function renderFulltextDownloadTool(): void { if ( $this->isDocMissingOrEmpty() - || empty($this->extConf['fileGrpFulltext']) + || empty($this->extConf['files']['fileGrpFulltext']) ) { // Quit without doing anything if required variables are not set. return; @@ -185,7 +185,7 @@ private function renderFulltextTool(): void { if ( $this->isDocMissingOrEmpty() - || empty($this->extConf['fileGrpFulltext']) + || empty($this->extConf['files']['fileGrpFulltext']) ) { // Quit without doing anything if required variables are not set. return; @@ -298,7 +298,7 @@ private function renderPdfDownloadTool(): void { if ( $this->isDocMissingOrEmpty() - || empty($this->extConf['fileGrpDownload']) + || empty($this->extConf['files']['fileGrpDownload']) ) { // Quit without doing anything if required variables are not set. return; @@ -325,7 +325,7 @@ private function getPageLink(): array $secondPageLink = ''; $pageLinkArray = []; $pageNumber = $this->requestData['page']; - $fileGrpsDownload = GeneralUtility::trimExplode(',', $this->extConf['fileGrpDownload']); + $fileGrpsDownload = GeneralUtility::trimExplode(',', $this->extConf['files']['fileGrpDownload']); // Get image link. while ($fileGrpDownload = array_shift($fileGrpsDownload)) { $firstFileGroupDownload = $this->currentDocument->physicalStructureInfo[$this->currentDocument->physicalStructure[$pageNumber]]['files'][$fileGrpDownload]; @@ -347,7 +347,7 @@ private function getPageLink(): array empty($firstPageLink) && empty($secondPageLink) ) { - $this->logger->warning('File not found in fileGrps "' . $this->extConf['fileGrpDownload'] . '"'); + $this->logger->warning('File not found in fileGrps "' . $this->extConf['files']['fileGrpDownload'] . '"'); } if (!empty($firstPageLink)) { @@ -369,7 +369,7 @@ private function getPageLink(): array private function getWorkLink(): string { $workLink = ''; - $fileGrpsDownload = GeneralUtility::trimExplode(',', $this->extConf['fileGrpDownload']); + $fileGrpsDownload = GeneralUtility::trimExplode(',', $this->extConf['files']['fileGrpDownload']); // Get work link. while ($fileGrpDownload = array_shift($fileGrpsDownload)) { $fileGroupDownload = $this->currentDocument->physicalStructureInfo[$this->currentDocument->physicalStructure[0]]['files'][$fileGrpDownload]; @@ -385,7 +385,7 @@ private function getWorkLink(): string } } if (empty($workLink)) { - $this->logger->warning('File not found in fileGrps "' . $this->extConf['fileGrpDownload'] . '"'); + $this->logger->warning('File not found in fileGrps "' . $this->extConf['files']['fileGrpDownload'] . '"'); } return $workLink; } @@ -402,7 +402,7 @@ private function renderSearchInDocumentTool(): void { if ( $this->isDocMissingOrEmpty() - || empty($this->extConf['fileGrpFulltext']) + || empty($this->extConf['files']['fileGrpFulltext']) || empty($this->settings['solrcore']) ) { // Quit without doing anything if required variables are not set. @@ -416,17 +416,17 @@ private function renderSearchInDocumentTool(): void return; } - // Fill markers. $viewArray = [ - 'LABEL_QUERY_URL' => $this->settings['queryInputName'], - 'LABEL_START' => $this->settings['startInputName'], - 'LABEL_ID' => $this->settings['idInputName'], - 'LABEL_PID' => $this->settings['pidInputName'], - 'LABEL_PAGE_URL' => $this->settings['pageInputName'], - 'LABEL_HIGHLIGHT_WORD' => $this->settings['highlightWordInputName'], - 'LABEL_ENCRYPTED' => $this->settings['encryptedInputName'], - 'CURRENT_DOCUMENT' => $this->getCurrentDocumentId(), - 'SOLR_ENCRYPTED' => $this->getEncryptedCoreName() ? : '' + 'labelQueryUrl' => $this->settings['queryInputName'], + 'labelStart' => $this->settings['startInputName'], + 'labelId' => $this->settings['idInputName'], + 'labelPid' => $this->settings['pidInputName'], + 'labelPageUrl' => $this->settings['pageInputName'], + 'labelHighlightWord' => $this->settings['highlightWordInputName'], + 'labelEncrypted' => $this->settings['encryptedInputName'], + 'documentId' => $this->getCurrentDocumentId(), + 'documentPageId' => $this->document->getPid(), + 'solrEncrypted' => $this->getEncryptedCoreName() ? : '' ]; $this->view->assign('searchInDocument', $viewArray); @@ -497,13 +497,13 @@ private function getEncryptedCoreName(): string */ private function isFullTextEmpty(): bool { - $fileGrpsFulltext = GeneralUtility::trimExplode(',', $this->extConf['fileGrpFulltext']); + $fileGrpsFulltext = GeneralUtility::trimExplode(',', $this->extConf['files']['fileGrpFulltext']); while ($fileGrpFulltext = array_shift($fileGrpsFulltext)) { - $fullTextFile = $this->currentDocument->physicalStructureInfo[$this->currentDocument->physicalStructure[$this->requestData['page']]]['files'][$fileGrpFulltext]; - if (!empty($fullTextFile)) { - break; + $files = $this->currentDocument->physicalStructureInfo[$this->currentDocument->physicalStructure[$this->requestData['page']]]['files']; + if (!empty($files[$fileGrpFulltext])) { + return false; } } - return empty($fullTextFile); + return true; } } diff --git a/Classes/Domain/Repository/DocumentRepository.php b/Classes/Domain/Repository/DocumentRepository.php index e0307b63e..7e09a5df7 100644 --- a/Classes/Domain/Repository/DocumentRepository.php +++ b/Classes/Domain/Repository/DocumentRepository.php @@ -190,16 +190,17 @@ public function findDocumentsBySettings($settings = []) } /** - * Finds all documents for the given collections + * Finds all documents for the given collections and conditions * * @access public * * @param array $collections * @param int $limit + * @param int $offset * * @return array|\TYPO3\CMS\Extbase\Persistence\QueryResultInterface */ - public function findAllByCollectionsLimited($collections, $limit = 50) + public function findAllByCollectionsLimited($collections, int $limit = 50, int $offset = 0) { $query = $this->createQuery(); @@ -221,6 +222,7 @@ public function findAllByCollectionsLimited($collections, $limit = 50) if ($limit > 0) { $query->setLimit((int) $limit); + $query->setOffset($offset); } return $query->execute(); diff --git a/Classes/Domain/Repository/MetadataRepository.php b/Classes/Domain/Repository/MetadataRepository.php index dc38aa20b..5c0c89c6d 100644 --- a/Classes/Domain/Repository/MetadataRepository.php +++ b/Classes/Domain/Repository/MetadataRepository.php @@ -41,11 +41,11 @@ public function findBySettings(array $settings = []): QueryResultInterface $constraints = []; - if ($settings['is_listed']) { + if (isset($settings['is_listed']) && $settings['is_listed'] == true) { $constraints[] = $query->equals('is_listed', 1); } - if ($settings['is_sortable']) { + if (isset($settings['is_sortable']) && $settings['is_sortable'] == true) { $constraints[] = $query->equals('is_sortable', 1); } diff --git a/Classes/Eid/PageViewProxy.php b/Classes/Eid/PageViewProxy.php index d745b5064..99d3fc37c 100644 --- a/Classes/Eid/PageViewProxy.php +++ b/Classes/Eid/PageViewProxy.php @@ -58,7 +58,7 @@ class PageViewProxy public function __construct() { $this->requestFactory = GeneralUtility::makeInstance(RequestFactory::class); - $this->extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('dlf'); + $this->extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('dlf', 'general'); } /** @@ -148,7 +148,7 @@ protected function handleHead(ServerRequestInterface $request): ResponseInterfac try { $targetResponse = $this->requestFactory->request($url, 'HEAD', [ 'headers' => [ - 'User-Agent' => $this->extConf['useragent'] ?? 'Kitodo.Presentation Proxy', + 'User-Agent' => $this->extConf['userAgent'] ?? 'Kitodo.Presentation Proxy', ] ]); } catch (\Exception $e) { @@ -193,7 +193,7 @@ protected function handleGet(ServerRequestInterface $request): ResponseInterface try { $targetResponse = $this->requestFactory->request($url, 'GET', [ 'headers' => [ - 'User-Agent' => $this->extConf['useragent'] ?? 'Kitodo.Presentation Proxy', + 'User-Agent' => $this->extConf['userAgent'] ?? 'Kitodo.Presentation Proxy', ], // For performance, don't download content up-front. Rather, we'll diff --git a/Classes/ExpressionLanguage/DocumentTypeFunctionProvider.php b/Classes/ExpressionLanguage/DocumentTypeFunctionProvider.php index b9b374fa5..8998f6832 100644 --- a/Classes/ExpressionLanguage/DocumentTypeFunctionProvider.php +++ b/Classes/ExpressionLanguage/DocumentTypeFunctionProvider.php @@ -73,7 +73,7 @@ public function injectConfigurationManager(ConfigurationManager $configurationMa * @var DocumentRepository */ protected $documentRepository; - + /** * @param DocumentRepository $documentRepository */ @@ -134,6 +134,11 @@ function($arguments, $cPid) return $type; } + // It happens that $queryParams does not contain a key 'tx_dlf[id]' + if (!isset($queryParams['tx_dlf']['id'])) { + return $type; + } + // Load document with current plugin parameters. $this->loadDocument($queryParams['tx_dlf'], $cPid); if ($this->document === null || $this->document->getCurrentDocument() === null) { 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#'); + } + } } diff --git a/Classes/Format/Mods.php b/Classes/Format/Mods.php index eeb4f0b18..3905a4e8e 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']; } } @@ -273,7 +273,7 @@ private function getHolderFromXml(array $holders, int $i): void * Get holder from XML display form. * * @access private - * + * * @param array $holders * @param int $i * @@ -306,7 +306,7 @@ private function getPlaces(): void if (!empty($places)) { foreach ($places as $place) { $this->metadata['place'][] = (string) $place; - if (!$this->metadata['place_sorting'][0]) { + if (empty($this->metadata['place_sorting'][0])) { $this->metadata['place_sorting'][0] = preg_replace('/[[:punct:]]/', '', (string) $place); } } @@ -339,7 +339,7 @@ private function getYears(): void if (!empty($years)) { foreach ($years as $year) { $this->metadata['year'][] = (string) $year; - if (!$this->metadata['year_sorting'][0]) { + if (empty($this->metadata['year_sorting'][0])) { $yearSorting = str_ireplace('x', '5', preg_replace('/[^\d.x]/i', '', (string) $year)); if ( strpos($yearSorting, '.') diff --git a/Classes/Hooks/DataHandler.php b/Classes/Hooks/DataHandler.php index ad646b322..6304efcbd 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); } @@ -157,7 +157,8 @@ public function processDatamap_postProcessFieldArray(string $status, string $tab ->setMaxResults(1) ->execute(); - if ($resArray = $result->fetchAssociative()) { + $resArray = $result->fetchAssociative(); + if (is_array($resArray)) { // Reset storing to current. $fieldArray['index_stored'] = $resArray['is_listed']; } @@ -244,27 +245,12 @@ public function processDatamap_afterDatabaseOperations(string $status, string $t ->setMaxResults(1) ->execute(); - if ($resArray = $result->fetchAssociative()) { + $resArray = $result->fetchAssociative(); + if (is_array($resArray)) { if ($resArray['hidden']) { - // Establish Solr connection. - $solr = Solr::getInstance($resArray['core']); - if ($solr->ready) { - // Delete Solr document. - $updateQuery = $solr->service->createUpdate(); - $updateQuery->addDeleteQuery('uid:' . (int) $id); - $updateQuery->addCommit(); - $solr->service->update($updateQuery); - } + $this->deleteDocument($resArray['core'], $id); } else { - // Reindex document. - $document = $this->getDocumentRepository()->findByUid((int) $id); - $doc = AbstractDocument::getInstance($document->getLocation(), ['storagePid' => $document->getPid()], true); - if ($document !== null && $doc !== null) { - $document->setCurrentDocument($doc); - Indexer::add($document, $this->getDocumentRepository()); - } else { - $this->logger->error('Failed to re-index document with UID ' . (string) $id); - } + $this->reindexDocument($id); } } } @@ -321,32 +307,17 @@ public function processCmdmap_postProcess(string $command, string $table, $id): ->setMaxResults(1) ->execute(); - if ($resArray = $result->fetchAssociative()) { + $resArray = $result->fetchAssociative(); + if (is_array($resArray)) { switch ($command) { case 'move': case 'delete': - // Establish Solr connection. - $solr = Solr::getInstance($resArray['core']); - if ($solr->ready) { - // Delete Solr document. - $updateQuery = $solr->service->createUpdate(); - $updateQuery->addDeleteQuery('uid:' . (int) $id); - $updateQuery->addCommit(); - $solr->service->update($updateQuery); - if ($command == 'delete') { - break; - } + $this->deleteDocument($resArray['core'], $id); + if ($command == 'delete') { + break; } case 'undelete': - // Reindex document. - $document = $this->getDocumentRepository()->findByUid((int) $id); - $doc = AbstractDocument::getInstance($document->getLocation(), ['storagePid' => $document->getPid()], true); - if ($document !== null && $doc !== null) { - $document->setCurrentDocument($doc); - Indexer::add($document, $this->getDocumentRepository()); - } else { - $this->logger->error('Failed to re-index document with UID ' . (string) $id); - } + $this->reindexDocument($id); break; } } @@ -355,48 +326,106 @@ public function processCmdmap_postProcess(string $command, string $table, $id): $command === 'delete' && $table == 'tx_dlf_solrcores' ) { - // Is core deletion allowed in extension configuration? - $extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('dlf'); - if (!empty($extConf['solrAllowCoreDelete'])) { - // Delete core from Apache Solr as well. - $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class) - ->getQueryBuilderForTable('tx_dlf_solrcores'); - // Record in "tx_dlf_solrcores" is already deleted at this point. - $queryBuilder - ->getRestrictions() - ->removeByType(DeletedRestriction::class); + $this->deleteSolrCore($id); + } + } - $result = $queryBuilder - ->select( - 'tx_dlf_solrcores.index_name AS core' - ) - ->from('tx_dlf_solrcores') - ->where($queryBuilder->expr()->eq('tx_dlf_solrcores.uid', (int) $id)) - ->setMaxResults(1) - ->execute(); + /** + * Delete document from index. + * + * @access private + * + * @param mixed $core + * @param int|string $id + * + * @return void + */ + private function deleteDocument($core, $id): void + { + // Establish Solr connection. + $solr = Solr::getInstance($core); + if ($solr->ready) { + // Delete Solr document. + $updateQuery = $solr->service->createUpdate(); + $updateQuery->addDeleteQuery('uid:' . (int) $id); + $updateQuery->addCommit(); + $solr->service->update($updateQuery); + } + } - if ($resArray = $result->fetchAssociative()) { - // Establish Solr connection. - $solr = Solr::getInstance(); - if ($solr->ready) { - // Delete Solr core. - $query = $solr->service->createCoreAdmin(); - $action = $query->createUnload(); - $action->setCore($resArray['core']); - $action->setDeleteDataDir(true); - $action->setDeleteIndex(true); - $action->setDeleteInstanceDir(true); - $query->setAction($action); - try { - $response = $solr->service->coreAdmin($query); - if ($response->getWasSuccessful()) { - return; - } - } catch (\Exception $e) { - // Nothing to do here. + /** + * Reindex document. + * + * @access private + * + * @param int|string $id + * + * @return void + */ + private function reindexDocument($id):void + { + $document = $this->getDocumentRepository()->findByUid((int) $id); + $doc = AbstractDocument::getInstance($document->getLocation(), ['storagePid' => $document->getPid()], true); + if ($document !== null && $doc !== null) { + $document->setCurrentDocument($doc); + Indexer::add($document, $this->getDocumentRepository()); + } else { + $this->logger->error('Failed to re-index document with UID ' . (string) $id); + } + } + + /** + * Delete SOLR core if deletion is allowed. + * + * @access private + * + * @param int|string $id + * + * @return void + */ + private function deleteSolrCore($id): void + { + // Is core deletion allowed in extension configuration? + $extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('dlf', 'solr'); + if (!empty($extConf['allowCoreDelete'])) { + // Delete core from Apache Solr as well. + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class) + ->getQueryBuilderForTable('tx_dlf_solrcores'); + // Record in "tx_dlf_solrcores" is already deleted at this point. + $queryBuilder + ->getRestrictions() + ->removeByType(DeletedRestriction::class); + + $result = $queryBuilder + ->select( + 'tx_dlf_solrcores.index_name AS core' + ) + ->from('tx_dlf_solrcores') + ->where($queryBuilder->expr()->eq('tx_dlf_solrcores.uid', (int) $id)) + ->setMaxResults(1) + ->execute(); + + $resArray = $result->fetchAssociative(); + if (is_array($resArray)) { + // Establish Solr connection. + $solr = Solr::getInstance(); + if ($solr->ready) { + // Delete Solr core. + $query = $solr->service->createCoreAdmin(); + $action = $query->createUnload(); + $action->setCore($resArray['core']); + $action->setDeleteDataDir(true); + $action->setDeleteIndex(true); + $action->setDeleteInstanceDir(true); + $query->setAction($action); + try { + $response = $solr->service->coreAdmin($query); + if ($response->getWasSuccessful() == false) { + $this->logger->warning('Core ' . $resArray['core'] . ' could not be deleted from Apache Solr'); } + } catch (\Exception $e) { + $this->logger->warning($e->getMessage()); } - $this->logger->warning('Core ' . $resArray['core'] . ' could not be deleted from Apache Solr'); } } } diff --git a/Classes/Hooks/ItemsProcFunc.php b/Classes/Hooks/ItemsProcFunc.php index c3c4277e2..f4f82c783 100644 --- a/Classes/Hooks/ItemsProcFunc.php +++ b/Classes/Hooks/ItemsProcFunc.php @@ -16,6 +16,7 @@ use Psr\Log\LoggerAwareInterface; use Psr\Log\LoggerAwareTrait; use TYPO3\CMS\Backend\Utility\BackendUtility; +use TYPO3\CMS\Core\Configuration\ConfigurationManager; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\TypoScript\TemplateService; use TYPO3\CMS\Core\Utility\GeneralUtility; @@ -50,7 +51,9 @@ class ItemsProcFunc implements LoggerAwareInterface */ public function toolList(array &$params): void { - foreach ($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['dlf/Classes/Plugin/Toolbox.php']['tools'] as $class => $label) { + $configurationManager = GeneralUtility::makeInstance(ConfigurationManager::class); + $options = $configurationManager->getLocalConfigurationValueByPath('SC_OPTIONS'); + foreach ($options['dlf/Classes/Plugin/Toolbox.php']['tools'] as $class => $label) { $params['items'][] = [Helper::getLanguageService()->sL($label), $class]; } } @@ -70,9 +73,9 @@ public function getTyposcriptConfigFromPluginSiteRoot(array $params): void $pid = $params['flexParentDatabaseRow']['pid']; $rootLine = BackendUtility::BEgetRootLine($pid); $siteRootRow = []; - foreach ($rootLine as $_row) { - if ($_row['is_siteroot'] == '1') { - $siteRootRow = $_row; + foreach ($rootLine as $row) { + if ($row['is_siteroot'] == '1') { + $siteRootRow = $row; break; } } @@ -152,7 +155,7 @@ protected function generateList(array &$params, string $fields, string $table, s ->select(...explode(',', $fields)) ->from($table) ->where( - $queryBuilder->expr()->eq($table . '.pid', intval($this->storagePid)), + $queryBuilder->expr()->eq($table . '.pid', $this->storagePid), $queryBuilder->expr()->in($table . '.sys_language_uid', [-1, 0]), $andWhere ) diff --git a/Classes/Hooks/KitodoProductionHacks.php b/Classes/Hooks/KitodoProductionHacks.php index e0b247e01..526cdda20 100644 --- a/Classes/Hooks/KitodoProductionHacks.php +++ b/Classes/Hooks/KitodoProductionHacks.php @@ -39,12 +39,16 @@ public function postProcessRecordId(\SimpleXMLElement &$xml, &$recordId): void if (!$recordId) { $xml->registerXPathNamespace('mods', 'http://www.loc.gov/mods/v3'); // Get all logical structure nodes with metadata, but without associated METS-Pointers. - if (($divs = $xml->xpath('//mets:structMap[@TYPE="LOGICAL"]//mets:div[@DMDID and not(./mets:mptr)]'))) { + $divs = $xml->xpath('//mets:structMap[@TYPE="LOGICAL"]//mets:div[@DMDID and not(./mets:mptr)]'); + if (is_array($divs)) { $smLinks = $xml->xpath('//mets:structLink/mets:smLink'); if (!empty($smLinks)) { + $links = []; + foreach ($smLinks as $smLink) { $links[(string) $smLink->attributes('http://www.w3.org/1999/xlink')->from][] = (string) $smLink->attributes('http://www.w3.org/1999/xlink')->to; } + foreach ($divs as $div) { if (!empty($links[(string) $div['ID']])) { $id = (string) $div['DMDID']; diff --git a/Classes/Middleware/SearchInDocument.php b/Classes/Middleware/SearchInDocument.php index 014629c5d..9c0cfdeed 100644 --- a/Classes/Middleware/SearchInDocument.php +++ b/Classes/Middleware/SearchInDocument.php @@ -63,7 +63,7 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface { $response = $handler->handle($request); // Get input parameters and decrypt core name. - $parameters = $request->getQueryParams(); + $parameters = $request->getParsedBody(); // Return if not this middleware if (!isset($parameters['middleware']) || ($parameters['middleware'] != 'dlf/search-in-document')) { return $response; @@ -93,7 +93,7 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface $highlighting = $data['ocrHighlighting']; $siteFinder = GeneralUtility::makeInstance(SiteFinder::class); - $site = $siteFinder->getSiteByPageId($parameters['pid']); + $site = $siteFinder->getSiteByPageId((int) $parameters['pid']); // @phpstan-ignore-next-line foreach ($result as $record) { diff --git a/Classes/ViewHelpers/MetadataWrapVariableViewHelper.php b/Classes/ViewHelpers/MetadataWrapVariableViewHelper.php index 5f8771e2d..ac7cadd41 100644 --- a/Classes/ViewHelpers/MetadataWrapVariableViewHelper.php +++ b/Classes/ViewHelpers/MetadataWrapVariableViewHelper.php @@ -71,9 +71,9 @@ public static function renderStatic( $parser = GeneralUtility::makeInstance(TypoScriptParser::class); $parser->parse($renderChildrenClosure()); $wrap = [ - 'key' => $parser->setup['key.'], - 'value' => $parser->setup['value.'], - 'all' => $parser->setup['all.'], + 'key' => $parser->setup['key.'] ?? [], + 'value' => $parser->setup['value.'] ?? [], + 'all' => $parser->setup['all.'] ?? [], ]; $renderingContext->getVariableProvider()->add($arguments['name'], $wrap); } diff --git a/Configuration/FlexForms/Navigation.xml b/Configuration/FlexForms/Navigation.xml index e1c551be2..5f46fa541 100644 --- a/Configuration/FlexForms/Navigation.xml +++ b/Configuration/FlexForms/Navigation.xml @@ -29,8 +29,8 @@ selectMultipleSideBySide - LLL:EXT:dlf/Resources/Private/Language/locallang_be.xlf:plugins.navigation.flexform.features.doublepage - doublepage + LLL:EXT:dlf/Resources/Private/Language/locallang_be.xlf:plugins.navigation.flexform.features.doublePage + doublePage LLL:EXT:dlf/Resources/Private/Language/locallang_be.xlf:plugins.navigation.flexform.features.pageFirst @@ -45,8 +45,8 @@ pageStepBack - LLL:EXT:dlf/Resources/Private/Language/locallang_be.xlf:plugins.navigation.flexform.features.pageselect - pageselect + LLL:EXT:dlf/Resources/Private/Language/locallang_be.xlf:plugins.navigation.flexform.features.pageSelect + pageSelect LLL:EXT:dlf/Resources/Private/Language/locallang_be.xlf:plugins.navigation.flexform.features.pageForward @@ -61,8 +61,8 @@ pageLast - LLL:EXT:dlf/Resources/Private/Language/locallang_be.xlf:plugins.navigation.flexform.features.listview - listview + LLL:EXT:dlf/Resources/Private/Language/locallang_be.xlf:plugins.navigation.flexform.features.listView + listView LLL:EXT:dlf/Resources/Private/Language/locallang_be.xlf:plugins.navigation.flexform.features.zoom @@ -73,7 +73,7 @@ rotation - doublepage,pageFirst,pageBack,pageStepBack,pageselect,pageForward,pageStepForward,pageLast,listview,zoom,rotation + doublePage,pageFirst,pageBack,pageStepBack,pageSelect,pageForward,pageStepForward,pageLast,listView,zoom,rotation 1 @@ -81,7 +81,6 @@ 1 - FIELD:settings.features:IN:pagestep input @@ -93,7 +92,7 @@ 1 - FIELD:settings.features:IN:listview + FIELD:settings.features:IN:listView group diff --git a/Configuration/TCA/Overrides/tt_content.php b/Configuration/TCA/Overrides/tt_content.php index 20f45466a..df133f2e4 100644 --- a/Configuration/TCA/Overrides/tt_content.php +++ b/Configuration/TCA/Overrides/tt_content.php @@ -79,105 +79,105 @@ \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPiFlexFormValue('dlf_view3d', 'FILE:EXT:' . 'dlf/Configuration/FlexForms/View3D.xml'); \TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin( - 'Kitodo.Dlf', + 'Dlf', 'Search', 'LLL:EXT:dlf/Resources/Private/Language/locallang_be.xlf:plugins.search.title', 'EXT:dlf/Resources/Public/Icons/tx-dlf-search.svg' ); \TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin( - 'Kitodo.Dlf', + 'Dlf', 'Feeds', 'LLL:EXT:dlf/Resources/Private/Language/locallang_be.xlf:plugins.feeds.title', 'EXT:dlf/Resources/Public/Icons/tx-dlf-feeds.svg' ); \TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin( - 'Kitodo.Dlf', + 'Dlf', 'Statistics', 'LLL:EXT:dlf/Resources/Private/Language/locallang_be.xlf:plugins.statistics.title', 'EXT:dlf/Resources/Public/Icons/tx-dlf-statistics.svg' ); \TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin( - 'Kitodo.Dlf', + 'Dlf', 'TableOfContents', 'LLL:EXT:dlf/Resources/Private/Language/locallang_be.xlf:plugins.tableofcontents.title', 'EXT:dlf/Resources/Public/Icons/tx-dlf-tableofcontents.svg' ); \TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin( - 'Kitodo.Dlf', + 'Dlf', 'PageGrid', 'LLL:EXT:dlf/Resources/Private/Language/locallang_be.xlf:plugins.pagegrid.title', 'EXT:dlf/Resources/Public/Icons/tx-dlf-pagegrid.svg' ); \TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin( - 'Kitodo.Dlf', + 'Dlf', 'Navigation', 'LLL:EXT:dlf/Resources/Private/Language/locallang_be.xlf:plugins.navigation.title', 'EXT:dlf/Resources/Public/Icons/tx-dlf-navigation.svg' ); \TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin( - 'Kitodo.Dlf', + 'Dlf', 'AudioPlayer', 'LLL:EXT:dlf/Resources/Private/Language/locallang_be.xlf:plugins.audioplayer.title', 'EXT:dlf/Resources/Public/Icons/tx-dlf-audioplayer.svg' ); \TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin( - 'Kitodo.Dlf', + 'Dlf', 'Calendar', 'LLL:EXT:dlf/Resources/Private/Language/locallang_be.xlf:plugins.calendar.title', 'EXT:dlf/Resources/Public/Icons/tx-dlf-calendar.svg' ); \TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin( - 'Kitodo.Dlf', + 'Dlf', 'PageView', 'LLL:EXT:dlf/Resources/Private/Language/locallang_be.xlf:plugins.pageview.title', 'EXT:dlf/Resources/Public/Icons/tx-dlf-pageview.svg' ); \TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin( - 'Kitodo.Dlf', + 'Dlf', 'Basket', 'LLL:EXT:dlf/Resources/Private/Language/locallang_be.xlf:plugins.basket.title', 'EXT:dlf/Resources/Public/Icons/tx-dlf-basket.svg' ); \TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin( - 'Kitodo.Dlf', + 'Dlf', 'Toolbox', 'LLL:EXT:dlf/Resources/Private/Language/locallang_be.xlf:plugins.toolbox.title', 'EXT:dlf/Resources/Public/Icons/tx-dlf-toolbox.svg' ); \TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin( - 'Kitodo.Dlf', + 'Dlf', 'OaiPmh', 'LLL:EXT:dlf/Resources/Private/Language/locallang_be.xlf:plugins.oaipmh.title', 'EXT:dlf/Resources/Public/Icons/tx-dlf-oaipmh.svg' ); \TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin( - 'Kitodo.Dlf', + 'Dlf', 'ListView', 'LLL:EXT:dlf/Resources/Private/Language/locallang_be.xlf:plugins.listview.title', 'EXT:dlf/Resources/Public/Icons/tx-dlf-listview.svg' ); \TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin( - 'Kitodo.Dlf', + 'Dlf', 'Collection', 'LLL:EXT:dlf/Resources/Private/Language/locallang_be.xlf:plugins.collection.title', 'EXT:dlf/Resources/Public/Icons/tx-dlf-collection.svg' ); \TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin( - 'Kitodo.Dlf', + 'Dlf', 'Metadata', 'LLL:EXT:dlf/Resources/Private/Language/locallang_be.xlf:plugins.metadata.title', 'EXT:dlf/Resources/Public/Icons/tx-dlf-metadata.svg' diff --git a/Configuration/TCA/tx_dlf_metadataformat.php b/Configuration/TCA/tx_dlf_metadataformat.php index fc63a9718..fc13b0f4d 100644 --- a/Configuration/TCA/tx_dlf_metadataformat.php +++ b/Configuration/TCA/tx_dlf_metadataformat.php @@ -17,9 +17,6 @@ 'tstamp' => 'tstamp', 'crdate' => 'crdate', 'cruser_id' => 'cruser_id', - 'languageField' => 'sys_language_uid', - 'transOrigPointerField' => 'l18n_parent', - 'transOrigDiffSourceField' => 'l18n_diffsource', 'delete' => 'deleted', 'iconfile' => 'EXT:dlf/Resources/Public/Icons/txdlfmetadata.png', 'rootLevel' => 0, @@ -29,41 +26,6 @@ 'interface' => [ ], 'columns' => [ - 'sys_language_uid' => [ - 'exclude' => 1, - 'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.language', - 'config' => [ - 'type' => 'select', - 'renderType' => 'selectSingle', - 'foreign_table' => 'sys_language', - 'foreign_table_where' => 'ORDER BY sys_language.title', - 'items' => [ - ['LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.allLanguages', -1], - ['LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.default_value', 0], - ], - 'default' => 0, - ], - ], - 'l18n_parent' => [ - 'displayCond' => 'FIELD:sys_language_uid:>:0', - 'exclude' => 1, - 'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.l18n_parent', - 'config' => [ - 'type' => 'select', - 'renderType' => 'selectSingle', - 'foreign_table' => 'tx_dlf_metadataformat', - 'foreign_table_where' => 'AND tx_dlf_metadataformat.pid=###CURRENT_PID### AND tx_dlf_metadataformat.sys_language_uid IN (-1,0) ORDER BY encoded ASC', - 'items' => [ - ['', 0], - ], - 'default' => 0, - ], - ], - 'l18n_diffsource' => [ - 'config' => [ - 'type' => 'passthrough', - ], - ], 'parent_id' => [ 'config' => [ 'type' => 'passthrough', diff --git a/Configuration/TypoScript/setup.typoscript b/Configuration/TypoScript/setup.typoscript index aec7c16eb..e5be481cf 100644 --- a/Configuration/TypoScript/setup.typoscript +++ b/Configuration/TypoScript/setup.typoscript @@ -5,7 +5,6 @@ plugin.tx_dlf { } settings { storagePid = {$plugin.tx_dlf.persistence.storagePid} - useInternalProxy = 1 } } diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index d5308c685..fbc4a99ec 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -99,9 +99,9 @@ You may also interact with the Docker containers directly: ```bash cd Build/Test/ vim .env # Edit configuration -docker-compose run unit -docker-compose run functional -docker-compose down +docker compose run unit +docker compose run functional +docker compose down ``` ### Fixtures @@ -124,50 +124,68 @@ docker-compose down ## Documentation -Following TYPO3's practices, the main documentation of the extension is located in `Documentation` and written in [reStructuredText](https://en.wikipedia.org/wiki/ReStructuredText). The build system is [Sphinx](https://en.wikipedia.org/wiki/Sphinx_(documentation_generator)). +Build the documentation using the `docs:build` script with Composer. This +script generates the documentation using the rendering tool for Typo3 and +places it in the `Documentation-GENERATED-temp` folder. -### Local Preview Server +```bash +composer docs:build +``` -To preview the rendered output and automatically rebuild documentation on changes, you may spawn a local server. This supports auto-refresh and is faster than the official preview build, but omits some features such as syntax highlighting. +Take a look at the documentation by opening the file `Index.html` in the folder +`Documentation-GENERATED-temp` in your browser. -This requires Python 2 to be installed. +### Provide via HTTP Server (optional) -```bash -# First start: Setup Sphinx in a virtualenv -composer docs:setup +Starts the HTTP server and mounts the mandatory directory `Documentation-GENERATED-temp`. -# Spawn server -composer docs:serve -composer docs:serve -- -E # Don't use a saved environment (useful when changing toctree) -composer docs:serve -- -p 8000 # Port may be specified +```bash +composer docs:start ``` -By default, the output is served to http://127.0.0.1:8000. +Take a look at the documentation by opening +in your browser. -> The setup and serve commands are defined in [Build/Documentation/sphinx.sh](./Build/Documentation/sphinx.sh). +The server runs in detached mode, so you will need to stop it manually. -### Official Preview Build +```bash +composer docs:stop +``` -The TYPO3 project [provides a Docker image to build documentation](https://docs.typo3.org/m/typo3/docs-how-to-document/main/en-us/RenderingDocs/Quickstart.html). This requires both Docker and Docker Compose to be installed. +### Database Documentation + +Generate the database reference table: ```bash -# Full build -composer docs:t3 makehtml +composer install +composer docs:db +``` + +### Troubleshooting + +#### Permission -# Only run sphinx-build -composer docs:t3 just1sphinxbuild +The documentation container runs as a non-root user. If there are some problem regarding +the permission of container user you can link the UID and GID of host into the container +using the `--user` parameter. -# (Alternative) Run docker-compose manually -docker-compose -f ./Build/Documentation/docker-compose.t3docs.yml run --rm t3docs makehtml +**Example:** + +```bash +docker run --rm --user=$(id -u):$(id -g) [...] ``` -The build output is available at [Documentation-GENERATED-temp/Result/project/0.0.0/Index.html](./Documentation-GENERATED-temp/Result/project/0.0.0/Index.html). +_In the `docs:build` Composer script, this parameter is already included. +If any issues arise, you can adjust or remove it as needed._ -### Database Documentation +#### Output directory -Generate the database reference table: +The default documentation directory name is `Documentation-GENERATED-temp`. +If you want to change the directory name add the `--output` parameter at the +end of the building command. + +**Example:** ```bash -composer install -composer docs:db +[...] --config ./Documentation --output="My_Documentation_Directory" ``` 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/Documentation/Configuration/Index.rst b/Documentation/Configuration/Index.rst index a3d27a747..9af4e6535 100644 --- a/Documentation/Configuration/Index.rst +++ b/Documentation/Configuration/Index.rst @@ -77,7 +77,7 @@ This is not the desired behaviour. You should disable requested page instead. The caching will be disabled in this case. This was the default behaviour before TYPO3 6.x. -.. figure:: ../Images/Configuration/New\ TYPO3\ site\ \[TYPO3\ CMS\ 9.5.26\ .png +.. figure:: ../Images/Configuration/New_TYPO3_site.png :width: 820px :alt: TYPO3 Configuration of pageNotFoundOnCHashError in Install Tool @@ -185,7 +185,7 @@ To setup Apache Solr, perform the following steps: 3. Get the Solr OCR Highlighting plugin and put it into contrib-directory. - The plugin is available on GitHub (https://github.com/dbmdz/solr-ocrhighlighting/releases). + The plugin is available on GitHub: https://github.com/dbmdz/solr-ocrhighlighting/releases. The documentation can be found here: https://dbmdz.github.io/solr-ocrhighlighting/. The Solr OCR Highlighting plugin is required for full text search as of Kitodo.Presentation 3.3. diff --git a/Documentation/Developers/Metadata.rst b/Documentation/Developers/Metadata.rst index c7bfc8e92..b6dbd3bc4 100644 --- a/Documentation/Developers/Metadata.rst +++ b/Documentation/Developers/Metadata.rst @@ -17,32 +17,38 @@ Data format records, which are stored on the root page (PID = 0), tell Kitodo ho A record contains the following fields: .. t3-field-list-table:: - :header-rows: 1 - - - :---: Make description column three times the width of field column. - :field,1: Field - :description,3: Description - - - :field: Format Name - :description: Name of the type that is used to reference it. - - - For metadata embedded via ````, this corresponds to its ``MDTYPE`` or ``OTHERMDTYPE`` attribute. - - - For XML fulltext files, this corresponds to the capitalized root tag of the file. - - - :field: Root Element - :description: The XML root element used by this format. In METS, this is used to locate the sub-root within an ````. - - - :field: Namespace URI - :description: The XML namespace URI used by this format. It is registered within the parser and may be used to declare namespace prefixes. - - - :field: Class Name - :description: (Optional) Fully qualified name of the PHP class that handles the format. Some formats are pre-defined in the ``Kitodo\Dlf\Format`` namespace. - - For metadata, this is used to programmatically extract values by implementing ``MetadataInterface``. - This may be useful, for example, when the value is needed universally, is difficult to extract via XPath, or requires post-processing. - - For fulltext, this is used to parse the fulltext file by implementing the ``FulltextInterface``. + :header-rows: 1 + + - :field,1: + Field + :description,3: + Description + - :field: + Format Name + :description: + Name of the type that is used to reference it. + + For metadata embedded via ````, this corresponds to its ``MDTYPE`` or ``OTHERMDTYPE`` attribute. + + For XML fulltext files, this corresponds to the capitalized root tag of the file. + - :field: + Root Element + :description: + The XML root element used by this format. In METS, this is used to locate the sub-root within an ````. + - :field: + Namespace URI + :description: + The XML namespace URI used by this format. It is registered within the parser and may be used to declare namespace prefixes. + + - :field: + Class Name + :description: + (Optional) Fully qualified name of the PHP class that handles the format. Some formats are pre-defined in the ``Kitodo\Dlf\Format`` namespace. + + For metadata, this is used to programmatically extract values by implementing ``MetadataInterface``. + This may be useful, for example, when the value is needed universally, is difficult to extract via XPath, or requires post-processing. + + For fulltext, this is used to parse the fulltext file by implementing the ``FulltextInterface``. TypoScript Wrap diff --git a/Documentation/Images/AdministratorManual/ExtensionManager.png b/Documentation/Images/AdministratorManual/ExtensionManager.png deleted file mode 100644 index 67ea69381..000000000 Binary files a/Documentation/Images/AdministratorManual/ExtensionManager.png and /dev/null differ diff --git a/Documentation/Images/Configuration/New TYPO3 site [TYPO3 CMS 9.5.26 .png b/Documentation/Images/Configuration/New_TYPO3_site.png similarity index 100% rename from Documentation/Images/Configuration/New TYPO3 site [TYPO3 CMS 9.5.26 .png rename to Documentation/Images/Configuration/New_TYPO3_site.png diff --git a/Documentation/Images/Introduction/Digitale Sammlungen Colloquia Lutheri conscripta a quibusdam et alia quaedam addita sunt. Thesaurus theologiae - Mscr.Dresd.A.180.d.png b/Documentation/Images/Introduction/Digitale_Sammlungen_Colloquia_Lutheri.png similarity index 100% rename from Documentation/Images/Introduction/Digitale Sammlungen Colloquia Lutheri conscripta a quibusdam et alia quaedam addita sunt. Thesaurus theologiae - Mscr.Dresd.A.180.d.png rename to Documentation/Images/Introduction/Digitale_Sammlungen_Colloquia_Lutheri.png diff --git a/Documentation/Images/Introduction/Digitale Sammlungen Dresdner Nachrichten.png b/Documentation/Images/Introduction/Digitale_Sammlungen_Dresdner_Nachrichten.png similarity index 100% rename from Documentation/Images/Introduction/Digitale Sammlungen Dresdner Nachrichten.png rename to Documentation/Images/Introduction/Digitale_Sammlungen_Dresdner_Nachrichten.png diff --git a/Documentation/Images/Introduction/Digitale Sammlungen Dresdner Nachrichten 1942.png b/Documentation/Images/Introduction/Digitale_Sammlungen_Dresdner_Nachrichten_1942.png similarity index 100% rename from Documentation/Images/Introduction/Digitale Sammlungen Dresdner Nachrichten 1942.png rename to Documentation/Images/Introduction/Digitale_Sammlungen_Dresdner_Nachrichten_1942.png diff --git a/Documentation/Images/Introduction/Digitale Sammlungen The Daily record and the Dresden daily 01.06.1906.png b/Documentation/Images/Introduction/Digitale_Sammlungen_The_Daily_1906.png similarity index 100% rename from Documentation/Images/Introduction/Digitale Sammlungen The Daily record and the Dresden daily 01.06.1906.png rename to Documentation/Images/Introduction/Digitale_Sammlungen_The_Daily_1906.png diff --git a/Documentation/Introduction/Index.rst b/Documentation/Introduction/Index.rst index 6f09e9abc..ca9a7bb94 100644 --- a/Documentation/Introduction/Index.rst +++ b/Documentation/Introduction/Index.rst @@ -109,7 +109,7 @@ Some examples of Kitodo.Presentation in action on the `Digital Collection of SLU http://digital.slub-dresden.de/id457052678 -.. figure:: ../Images/Introduction/Digitale\ Sammlungen\ \ Colloquia\ Lutheri\ conscripta\ a\ quibusdam\ et\ alia\ quaedam\ addita\ sunt.\ Thesaurus\ theologiae\ -\ Mscr.Dresd.A.180.d.png +.. figure:: ../Images/Introduction/Digitale_Sammlungen_Colloquia_Lutheri.png :width: 820px :alt: Mscr.Dresd.A.180.d @@ -117,7 +117,7 @@ http://digital.slub-dresden.de/id457052678 http://digital.slub-dresden.de/id416971482-19060601 -.. figure:: ../Images/Introduction/Digitale\ Sammlungen\ \ The\ Daily\ record\ and\ the\ Dresden\ daily\ \ \ 01.06.1906.png +.. figure:: ../Images/Introduction/Digitale_Sammlungen_The_Daily_1906.png :width: 820px :alt: Newspaper issue with full-text switched on @@ -125,7 +125,7 @@ http://digital.slub-dresden.de/id416971482-19060601 http://digital.slub-dresden.de/id501434038 -.. figure:: ../Images/Introduction/Digitale\ Sammlungen\ \ Dresdner\ Nachrichten.png +.. figure:: ../Images/Introduction/Digitale_Sammlungen_Dresdner_Nachrichten.png :width: 820px :alt: All Years Overview of a Newspaper Title @@ -133,7 +133,7 @@ http://digital.slub-dresden.de/id501434038 http://digital.slub-dresden.de/id501434038-1942 -.. figure:: ../Images/Introduction/Digitale\ Sammlungen\ \ Dresdner\ Nachrichten\ \ \ 1942.png +.. figure:: ../Images/Introduction/Digitale_Sammlungen_Dresdner_Nachrichten_1942.png :width: 820px :alt: Calendar View of a Newspaper Year diff --git a/Documentation/Plugins/Index.rst b/Documentation/Plugins/Index.rst index cf65955b2..7fe5975fd 100644 --- a/Documentation/Plugins/Index.rst +++ b/Documentation/Plugins/Index.rst @@ -157,7 +157,7 @@ Basket - :Property: targetBasket :Data Type: - :ref:`t3tsref:data-type-page-id` + `t3tsref:data-type-page-id` :Default: @@ -252,12 +252,12 @@ The collection plugin shows one collection, all collections or selected collecti Default :Description: Description - + - :Property: collections :Data Type: - :ref:`t3tsref:data-type-list` + `t3tsref:data-type-list` :Default: - :Property: @@ -283,13 +283,13 @@ The collection plugin shows one collection, all collections or selected collecti - :Property: targetPid :Data Type: - :ref:`t3tsref:data-type-page-id` + `t3tsref:data-type-page-id` :Default: - :Property: targetFeed :Data Type: - :ref:`t3tsref:data-type-page-id` + `t3tsref:data-type-page-id` :Default: @@ -321,7 +321,7 @@ The TypoScript part is necessary to switch the page rendering to a different pag - :Property: collections :Data Type: - :ref:`t3tsref:data-type-list` + `t3tsref:data-type-list` :Default: - :Property: @@ -354,7 +354,7 @@ The TypoScript part is necessary to switch the page rendering to a different pag - :Property: targetPid :Data Type: - :ref:`t3tsref:data-type-page-id` + `t3tsref:data-type-page-id` :Default: - :Property: @@ -395,7 +395,7 @@ List View - :Property: targetPid :Data Type: - :ref:`t3tsref:data-type-page-id` + `t3tsref:data-type-page-id` :Default: - :Property: @@ -415,7 +415,7 @@ List View - :Property: targetBasket :Data Type: - :ref:`t3tsref:data-type-page-id` + `t3tsref:data-type-page-id` :Default: @@ -451,7 +451,7 @@ Metadata - :Property: targetPid :Data Type: - :ref:`t3tsref:data-type-page-id` + `t3tsref:data-type-page-id` :Default: - :Property: @@ -502,9 +502,9 @@ Navigation :Data Type: :ref:`t3tsref:data-type-string` :Default: - By default all features are activated. The selection is stored as comma separated list. + By default all features are activated. The selection is stored as comma separated list. - doublepage,pageFirst,pageBack,pageStepBack,pageselect,pageForward,pageStepForward,pageLast,listview,zoom,rotation + doublePage,pageFirst,pageBack,pageStepBack,pageSelect,pageForward,pageStepForward,pageLast,listView,zoom,rotation - :Property: pageStep @@ -516,7 +516,7 @@ Navigation - :Property: targetPid :Data Type: - :ref:`t3tsref:data-type-page-id` + `t3tsref:data-type-page-id` :Default: @@ -602,7 +602,7 @@ Page Grid - :Property: targetPid :Data Type: - :ref:`t3tsref:data-type-page-id` + `t3tsref:data-type-page-id` :Default: Page View @@ -630,7 +630,7 @@ Page View - :Property: features :Data Type: - :ref:`t3tsref:data-type-list` + `t3tsref:data-type-list` :Default: 1 @@ -679,7 +679,7 @@ Page View - :Property: targetBasket :Data Type: - :ref:`t3tsref:data-type-page-id` + `t3tsref:data-type-page-id` :Default: Search @@ -755,13 +755,13 @@ Search - :Property: collections :Data Type: - :ref:`t3tsref:data-type-list` + `t3tsref:data-type-list` :Default: - :Property: facets :Data Type: - :ref:`t3tsref:data-type-list` + `t3tsref:data-type-list` :Default: - :Property: @@ -800,13 +800,13 @@ Search - :Property: targetPid :Data Type: - :ref:`t3tsref:data-type-page-id` + `t3tsref:data-type-page-id` :Default: - :Property: targetPidPageView :Data Type: - :ref:`t3tsref:data-type-page-id` + `t3tsref:data-type-page-id` :Default: Statistics @@ -827,7 +827,7 @@ Statistics - :Property: collections :Data Type: - :ref:`t3tsref:data-type-list` + `t3tsref:data-type-list` :Default: - :Property: @@ -871,19 +871,19 @@ Table Of Contents - :Property: targetBasket :Data Type: - :ref:`t3tsref:data-type-page-id` + `t3tsref:data-type-page-id` :Default: - :Property: targetPid :Data Type: - :ref:`t3tsref:data-type-page-id` + `t3tsref:data-type-page-id` :Default: - :Property: titleReplacement :Data Type: - :ref:`t3tsref:data-type-list` + `t3tsref:data-type-list` :Default: :Description: List containing types for which title should be replaced @@ -919,7 +919,7 @@ Toolbox - :Property: tools :Data Type: - :ref:`t3tsref:data-type-list` + `t3tsref:data-type-list` :Default: :Values: * tx_dlf_annotationtool @@ -939,7 +939,7 @@ Toolbox - :Property: fileGrpsImageDownload :Data Type: - :ref:`t3tsref:data-type-list` + `t3tsref:data-type-list` :Default: MIN,DEFAULT,MAX diff --git a/Documentation/Settings.cfg b/Documentation/Settings.cfg deleted file mode 100644 index 43073e62a..000000000 --- a/Documentation/Settings.cfg +++ /dev/null @@ -1,16 +0,0 @@ -[general] -project = Kitodo.Presentation -release = 4.0 -copyright = since 2017 by Kitodo Release Management Team - -[html_theme_options] -github_branch = master -github_repository = kitodo/kitodo-presentation - -project_contact = mailto:contact@kitodo.org -project_home = https://kitodo.org -project_issues = https://github.com/kitodo/kitodo-presentation/issues -project_repository = https://github.com/kitodo/kitodo-presentation - -[intersphinx_mapping] -t3tsref = http://docs.typo3.org/typo3cms/TyposcriptReference/ diff --git a/Documentation/User/Index.rst b/Documentation/User/Index.rst index 778206f31..d3bc8d9b0 100644 --- a/Documentation/User/Index.rst +++ b/Documentation/User/Index.rst @@ -129,13 +129,46 @@ 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 on page 123 with solr core 'dlfCore1' in given range + # short notation + ./vendor/bin/typo3 kitodo:reindex -c 1 -l 1000 -b 0 -p 123 -s dlfCore1 + ./vendor/bin/typo3 kitodo:reindex -c 1 -l 1000 -b 1000 -p 123 -s dlfCore1 + # long notation + ./vendor/bin/typo3 kitodo:reindex --coll 1 --index-limit=1000 --index-begin=0 --pid 123 ---solr dlfCore1 + ./vendor/bin/typo3 kitodo:reindex --coll 1 --index-limit=1000 --index-begin=1000 --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 - - # reindex all documents on page 123 with solr core 'dlfCore1' + # long notation + ./vendor/bin/typo3 kitodo:reindex --coll 1,4 --pid 123 --solr dlfCore1 + + # reindex collection with uid 1 and 4 on page 123 with solr core 'dlfCore1' in given range + # short notation + ./vendor/bin/typo3 kitodo:reindex -c 1,4 -l 1000 -b 0 -p 123 -s dlfCore1 + ./vendor/bin/typo3 kitodo:reindex -c 1,4 -l 1000 -b 1000 -p 123 -s dlfCore1 + # long notation + ./vendor/bin/typo3 kitodo:reindex --coll 1,4 --index-limit=1000 --index-begin=0 --pid 123 ---solr dlfCore1 + ./vendor/bin/typo3 kitodo:reindex --coll 1,4 --index-limit=1000 --index-begin=1000 --pid 123 --solr 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 -a -l 1000 -b 0 -p 123 -s dlfCore1 + ./vendor/bin/typo3 kitodo:reindex -a -l 1000 -b 1000 -p 123 -s dlfCore1 + # long notation + ./vendor/bin/typo3 kitodo:reindex --all --index-limit=1000 --index-begin=0 --pid 123 ---solr dlfCore1 + ./vendor/bin/typo3 kitodo:reindex --all --index-limit=1000 --index-begin=1000 --pid 123 --solr dlfCore1 .. t3-field-list-table:: @@ -201,6 +234,32 @@ collections or even to reindex all documents on the given page.:: :Example: 123 + - :Option: + ``-l|--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: + ``-b|--index-begin`` + :Required: + no + :Description: + 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 + amount of documents. + :Example: + 0 + - :Option: ``--dry-run`` :Required: diff --git a/Documentation/guides.xml b/Documentation/guides.xml new file mode 100644 index 000000000..68f35cdec --- /dev/null +++ b/Documentation/guides.xml @@ -0,0 +1,6 @@ + + + + + + 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/Resources/Private/Data/FormatDefaults.json b/Resources/Private/Data/FormatDefaults.json new file mode 100644 index 000000000..a8493eb4e --- /dev/null +++ b/Resources/Private/Data/FormatDefaults.json @@ -0,0 +1,32 @@ +{ + "MODS": { + "root": "mods", + "namespace": "http://www.loc.gov/mods/v3", + "class": "Kitodo\\Dlf\\Format\\Mods" + }, + "TEIHDR": { + "root": "teiHeader", + "namespace": "http://www.tei-c.org/ns/1.0", + "class": "Kitodo\\Dlf\\Format\\TeiHeader" + }, + "ALTO": { + "root": "alto", + "namespace": "http://www.loc.gov/standards/alto/ns-v2#", + "class": "Kitodo\\Dlf\\Format\\Alto" + }, + "IIIF1": { + "root": "IIIF1", + "namespace": "http://www.shared-canvas.org/ns/context.json", + "class": "" + }, + "IIIF2": { + "root": "IIIF2", + "namespace": "http://iiif.io/api/presentation/2/context.json", + "class": "" + }, + "IIIF3": { + "root": "IIIF3", + "namespace": "http://iiif.io/api/presentation/3/context.json", + "class": "" + } +} diff --git a/Resources/Private/Data/FormatDefaults.php b/Resources/Private/Data/FormatDefaults.php deleted file mode 100644 index 30725a78e..000000000 --- a/Resources/Private/Data/FormatDefaults.php +++ /dev/null @@ -1,44 +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. - */ - -return [ - 'MODS' => [ - 'root' => 'mods', - 'namespace' => 'http://www.loc.gov/mods/v3', - 'class' => Kitodo\Dlf\Format\Mods::class, - ], - 'TEIHDR' => [ - 'root' => 'teiHeader', - 'namespace' => 'http://www.tei-c.org/ns/1.0', - 'class' => Kitodo\Dlf\Format\TeiHeader::class, - ], - 'ALTO' => [ - 'root' => 'alto', - 'namespace' => 'http://www.loc.gov/standards/alto/ns-v2#', - 'class' => Kitodo\Dlf\Format\Alto::class, - ], - 'IIIF1' => [ - 'root' => 'IIIF1', - 'namespace' => 'http://www.shared-canvas.org/ns/context.json', - 'class' => '', - ], - 'IIIF2' => [ - 'root' => 'IIIF2', - 'namespace' => 'http://iiif.io/api/presentation/2/context.json', - 'class' => '', - ], - 'IIIF3' => [ - 'root' => 'IIIF3', - 'namespace' => 'http://iiif.io/api/presentation/3/context.json', - 'class' => '', - ], -]; diff --git a/Resources/Private/Data/MetadataDefaults.json b/Resources/Private/Data/MetadataDefaults.json new file mode 100644 index 000000000..a92b9ae95 --- /dev/null +++ b/Resources/Private/Data/MetadataDefaults.json @@ -0,0 +1,692 @@ +{ + "type": { + "format": [ + { + "format_root": "IIIF2", + "xpath": "$.metadata.[?(@.label=='Manifest Type')].value", + "xpath_sorting": "" + } + ], + "default_value": "", + "wrap": "", + "index_tokenized": 0, + "index_stored": 1, + "index_indexed": 0, + "index_boost": 1.00, + "is_sortable": 1, + "is_facet": 1, + "is_listed": 1, + "index_autocomplete": 0, + "sorting": 1 + }, + "title": { + "format": [ + { + "format_root": "mods", + "xpath": "concat(./mods:titleInfo/mods:nonSort,' ',./mods:titleInfo/mods:title)", + "xpath_sorting": "./mods:titleInfo/mods:title" + }, + { + "format_root": "teiHeader", + "xpath": "./teihdr:fileDesc/teihdr:sourceDesc/teihdr:msDesc/teihdr:head/teihdr:note[@type=\"caption\"]", + "xpath_sorting": "" + }, + { + "format_root": "IIIF2", + "xpath": "$[label]", + "xpath_sorting": "" + } + ], + "default_value": "", + "wrap": "key.wrap = \nvalue.required = 1\nvalue.wrap = ", + "index_tokenized": 1, + "index_stored": 1, + "index_indexed": 1, + "index_boost": 2.00, + "is_sortable": 1, + "is_facet": 0, + "is_listed": 1, + "index_autocomplete": 1, + "sorting": 2 + }, + "volume": { + "format": [ + { + "format_root": "mods", + "xpath": "./mods:part/mods:detail/mods:number", + "xpath_sorting": "./mods:part[@type=\"host\"]/@order" + } + ], + "default_value": "", + "wrap": "", + "index_tokenized": 0, + "index_stored": 1, + "index_indexed": 0, + "index_boost": 1.00, + "is_sortable": 1, + "is_facet": 0, + "is_listed": 1, + "index_autocomplete": 0, + "sorting": 3 + }, + "date": { + "format": [ + { + "format_root": "mods", + "xpath": "./mods:originInfo/*[@encoding=\"iso8601\" or @encoding=\"w3cdtf\"][@keyDate=\"yes\"]", + "xpath_sorting": "" + } + ], + "default_value": "", + "wrap": "", + "index_tokenized": 0, + "index_stored": 1, + "index_indexed": 1, + "index_boost": 1.00, + "is_sortable": 1, + "is_facet": 0, + "is_listed": 1, + "index_autocomplete": 0, + "sorting": 4 + }, + "author": { + "format": [ + { + "format_root": "teiHeader", + "xpath": "./teihdr:fileDesc/teihdr:sourceDesc/teihdr:msDesc/teihdr:head/teihdr:name", + "xpath_sorting": "" + }, + { + "format_root": "IIIF2", + "xpath": "$.metadata.[?(@.label=='Author')].value", + "xpath_sorting": "" + } + ], + "default_value": "", + "wrap": "key.wrap = \nvalue.required = 1\nvalue.split.token.char = 31\nvalue.split.cObjNum = 1\nvalue.split.1.1 = CASE\nvalue.split.1.1.key.data = register:SPLIT_COUNT\nvalue.split.1.1.0 = LOAD_REGISTER\nvalue.split.1.1.0.tx_dlf_metadata_author_name.current = 1\nvalue.split.1.1.1 = LOAD_REGISTER\nvalue.split.1.1.1.tx_dlf_metadata_author_uri.current = 1\nvalue.postCObject = TEXT\nvalue.postCObject.value = {register:tx_dlf_metadata_author_name}\nvalue.postCObject.value.insertData = 1\nvalue.postCObject.value.stdWrap.typolink.parameter = {register:tx_dlf_metadata_author_uri} _blank external\nvalue.postCObject.value.stdWrap.typolink.parameter.insertData = 1\nvalue.postCObject.value.stdWrap.typolink.title = {register:tx_dlf_metadata_author_name}\nvalue.postCObject.value.stdWrap.typolink.ifNotEmpty = 1\nvalue.wrap = ", + "index_tokenized": 1, + "index_stored": 1, + "index_indexed": 1, + "index_boost": 2.00, + "is_sortable": 1, + "is_facet": 1, + "is_listed": 1, + "index_autocomplete": 1, + "sorting": 5 + }, + "place": { + "format": [ + { + "format_root": "teiHeader", + "xpath": "./teihdr:fileDesc/teihdr:sourceDesc/teihdr:msDesc/teihdr:head/teihdr:origPlace", + "xpath_sorting": "" + }, + { + "format_root": "IIIF2", + "xpath": "$.metadata.[?(@.label=='Place of publication')].value", + "xpath_sorting": "" + } + ], + "default_value": "", + "wrap": "", + "index_tokenized": 1, + "index_stored": 1, + "index_indexed": 1, + "index_boost": 1.00, + "is_sortable": 1, + "is_facet": 1, + "is_listed": 1, + "index_autocomplete": 0, + "sorting": 6 + }, + "year": { + "format": [ + { + "format_root": "teiHeader", + "xpath": "./teihdr:fileDesc/teihdr:sourceDesc/teihdr:msDesc/teihdr:head/teihdr:origDate", + "xpath_sorting": "./teihdr:fileDesc/teihdr:sourceDesc/teihdr:msDesc/teihdr:head/teihdr:origDate/@when" + }, + { + "format_root": "IIIF2", + "xpath": "$.metadata.[?(@.label=='Date of publication')].value", + "xpath_sorting": "" + } + ], + "default_value": "", + "wrap": "", + "index_tokenized": 0, + "index_stored": 1, + "index_indexed": 1, + "index_boost": 1.00, + "is_sortable": 1, + "is_facet": 1, + "is_listed": 1, + "index_autocomplete": 0, + "sorting": 7 + }, + "language": { + "format": [ + { + "format_root": "mods", + "xpath": "./mods:language/mods:languageTerm", + "xpath_sorting": "" + } + ], + "default_value": "", + "wrap": "", + "index_tokenized": 0, + "index_stored": 0, + "index_indexed": 1, + "index_boost": 1.00, + "is_sortable": 0, + "is_facet": 1, + "is_listed": 0, + "index_autocomplete": 0, + "sorting": 8 + }, + "collection": { + "format": [ + { + "format_root": "mods", + "xpath": "./mods:classification", + "xpath_sorting": "" + }, + { + "format_root": "teiHeader", + "xpath": "./teihdr:fileDesc/teihdr:sourceDesc/teihdr:msDesc/teihdr:msIdentifier/teihdr:collection", + "xpath_sorting": "" + }, + { + "format_root": "IIIF2", + "xpath": "$.metadata.[?(@.label=='Collection')].value", + "xpath_sorting": "" + } + ], + "default_value": "", + "wrap": "", + "index_tokenized": 1, + "index_stored": 0, + "index_indexed": 1, + "index_boost": 1.00, + "is_sortable": 0, + "is_facet": 1, + "is_listed": 0, + "index_autocomplete": 0, + "sorting": 9 + }, + "owner": { + "format": [ + { + "format_root": "mods", + "xpath": "./mods:name[./mods:role/mods:roleTerm=\"own\"]/mods:displayForm", + "xpath_sorting": "" + }, + { + "format_root": "teiHeader", + "xpath": "./teihdr:fileDesc/teihdr:publicationStmt/teihdr:publisher", + "xpath_sorting": "" + }, + { + "format_root": "IIIF2", + "xpath": "$.metadata.[?(@.label=='Owner')].value", + "xpath_sorting": "" + } + ], + "default_value": "", + "wrap": "", + "index_tokenized": 0, + "index_stored": 0, + "index_indexed": 1, + "index_boost": 1.00, + "is_sortable": 0, + "is_facet": 1, + "is_listed": 0, + "index_autocomplete": 0, + "sorting": 10 + }, + "purl": { + "format": [ + { + "format_root": "mods", + "xpath": "./mods:identifier[@type=\"purl\"]", + "xpath_sorting": "" + }, + { + "format_root": "teiHeader", + "xpath": "./teihdr:fileDesc/teihdr:publicationStmt/teihdr:idno[@type=\"purl\"]", + "xpath_sorting": "" + } + ], + "default_value": "", + "wrap": "key.wrap =
|
\nvalue.required = 1\nvalue.setContentToCurrent = 1\nvalue.typolink.parameter.current = 1\nvalue.wrap =
|
", + "index_tokenized": 0, + "index_stored": 0, + "index_indexed": 0, + "index_boost": 0.0, + "is_sortable": 0, + "is_facet": 0, + "is_listed": 0, + "index_autocomplete": 0, + "sorting": 11 + }, + "urn": { + "format": [ + { + "format_root": "mods", + "xpath": "./mods:identifier[@type=\"urn\"]", + "xpath_sorting": "" + }, + { + "format_root": "teiHeader", + "xpath": "./teihdr:fileDesc/teihdr:publicationStmt/teihdr:idno[@type=\"urn\"]", + "xpath_sorting": "" + }, + { + "format_root": "IIIF2", + "xpath": "$.metadata.[?(@.label=='URN')].value", + "xpath_sorting": "" + } + ], + "default_value": "", + "wrap": "key.wrap =
|
\nvalue.required = 1\nvalue.setContentToCurrent = 1\nvalue.typolink.parameter.current = 1\nvalue.typolink.parameter.prepend = TEXT\nvalue.typolink.parameter.prepend.value = http://nbn-resolving.de/\nvalue.wrap =
|
", + "index_tokenized": 0, + "index_stored": 0, + "index_indexed": 1, + "index_boost": 1.00, + "is_sortable": 0, + "is_facet": 0, + "is_listed": 0, + "index_autocomplete": 0, + "sorting": 12 + }, + "opac_id": { + "format": [ + { + "format_root": "mods", + "xpath": "./mods:identifier[@type=\"opac\"]", + "xpath_sorting": "" + }, + { + "format_root": "teiHeader", + "xpath": "./teihdr:fileDesc/teihdr:publicationStmt/teihdr:idno[@type=\"opac\"]", + "xpath_sorting": "" + } + ], + "default_value": "", + "wrap": "", + "index_tokenized": 0, + "index_stored": 0, + "index_indexed": 1, + "index_boost": 1.0, + "is_sortable": 0, + "is_facet": 0, + "is_listed": 0, + "index_autocomplete": 0, + "sorting": 13 + }, + "union_id": { + "format": [ + { + "format_root": "mods", + "xpath": "./mods:identifier[@type=\"ppn\"]", + "xpath_sorting": "" + }, + { + "format_root": "teiHeader", + "xpath": "./teihdr:fileDesc/teihdr:publicationStmt/teihdr:idno[@type=\"mmid\"]", + "xpath_sorting": "" + } + ], + "default_value": "", + "wrap": "", + "index_tokenized": 0, + "index_stored": 0, + "index_indexed": 1, + "index_boost": 1.00, + "is_sortable": 0, + "is_facet": 0, + "is_listed": 0, + "index_autocomplete": 0, + "sorting": 14 + }, + "record_id": { + "format": [ + { + "format_root": "mods", + "xpath": "./mods:recordInfo/mods:recordIdentifier", + "xpath_sorting": "" + }, + { + "format_root": "teiHeader", + "xpath": "./teihdr:fileDesc/teihdr:publicationStmt/teihdr:idno[@type=\"recordIdentifier\"]", + "xpath_sorting": "" + }, + { + "format_root": "IIIF2", + "xpath": "$['@id']", + "xpath_sorting": "" + } + ], + "default_value": "", + "wrap": "", + "index_tokenized": 0, + "index_stored": 0, + "index_indexed": 1, + "index_boost": 1.0, + "is_sortable": 0, + "is_facet": 0, + "is_listed": 0, + "index_autocomplete": 0, + "sorting": 15 + }, + "prod_id": { + "format": [ + { + "format_root": "mods", + "xpath": "./mods:identifier[@type=\"kitodo\"]", + "xpath_sorting": "" + }, + { + "format_root": "teiHeader", + "xpath": "./teihdr:fileDesc/teihdr:publicationStmt/teihdr:idno[@type=\"kitodo\"]", + "xpath_sorting": "" + }, + { + "format_root": "IIIF2", + "xpath": "$.metadata.[?(@.label=='Kitodo')].value", + "xpath_sorting": "" + } + ], + "default_value": "", + "wrap": "", + "index_tokenized": 0, + "index_stored": 0, + "index_indexed": 0, + "index_boost": 0.00, + "is_sortable": 0, + "is_facet": 0, + "is_listed": 0, + "index_autocomplete": 0, + "sorting": 16 + }, + "coordinates": { + "format": [ + { + "format_root": "mods", + "xpath": "./mods:subject/mods:cartographics/mods:coordinates", + "xpath_sorting": "" + } + ], + "default_value": "", + "wrap": "", + "index_tokenized": 0, + "index_stored": 1, + "index_indexed": 1, + "index_boost": 1.0, + "is_sortable": 0, + "is_facet": 0, + "is_listed": 0, + "index_autocomplete": 0, + "sorting": 17 + }, + "license": { + "format": [ + { + "format_root": "mods", + "xpath": "./mods:accessCondition[@type=\"use and reproduction\"]/@xlink:href", + "xpath_sorting": "" + } + ], + "default_value": "", + "wrap": "", + "index_tokenized": 0, + "index_stored": 1, + "index_indexed": 1, + "index_boost": 1.0, + "is_sortable": 0, + "is_facet": 1, + "is_listed": 0, + "index_autocomplete": 0, + "sorting": 18 + }, + "terms": { + "format": [ + { + "format_root": "mods", + "xpath": "./mods:accessCondition[@type=\"local terms of use\"]/@xlink:href", + "xpath_sorting": "" + } + ], + "default_value": "", + "wrap": "", + "index_tokenized": 0, + "index_stored": 1, + "index_indexed": 1, + "index_boost": 1.00, + "is_sortable": 0, + "is_facet": 1, + "is_listed": 0, + "index_autocomplete": 0, + "sorting": 19 + }, + "restrictions": { + "format": [ + { + "format_root": "mods", + "xpath": "./mods:accessCondition[@type=\"restriction on access\"]/@xlink:href", + "xpath_sorting": "" + } + ], + "default_value": "", + "wrap": "", + "index_tokenized": 0, + "index_stored": 1, + "index_indexed": 1, + "index_boost": 1.00, + "is_sortable": 0, + "is_facet": 0, + "is_listed": 0, + "index_autocomplete": 0, + "sorting": 20 + }, + "out_of_print": { + "format": [ + { + "format_root": "mods", + "xpath": "./mods:accessCondition[@type=\"out of print work\"]", + "xpath_sorting": "" + } + ], + "default_value": "", + "wrap": "", + "index_tokenized": 0, + "index_stored": 0, + "index_indexed": 1, + "index_boost": 1.0, + "is_sortable": 0, + "is_facet": 1, + "is_listed": 0, + "index_autocomplete": 0, + "sorting": 21 + }, + "rights_info": { + "format": [ + { + "format_root": "mods", + "xpath": "./mods:accessCondition[@type=\"info\"]", + "xpath_sorting": "" + } + ], + "default_value": "", + "wrap": "", + "index_tokenized": 0, + "index_stored": 0, + "index_indexed": 0, + "index_boost": 0.0, + "is_sortable": 0, + "is_facet": 0, + "is_listed": 0, + "index_autocomplete": 0, + "sorting": 22 + }, + "description": { + "format": [ + { + "format_root": "mods", + "xpath": "./mods:recordInfo/mods:recordInfoNote", + "xpath_sorting": "" + } + ], + "default_value": "", + "wrap": "key.wrap =
|
\nvalue.required = 1\nvalue.wrap =
|
", + "index_tokenized": 0, + "index_stored": 0, + "index_indexed": 0, + "index_boost": 0.0, + "is_sortable": 0, + "is_facet": 0, + "is_listed": 0, + "index_autocomplete": 0, + "sorting": 23 + }, + "identifier": { + "format": [ + { + "format_root": "mods", + "xpath": "./mods:identifier", + "xpath_sorting": "" + } + ], + "default_value": "", + "wrap": "key.wrap =
|
\nvalue.required = 1\nvalue.wrap =
|
", + "index_tokenized": 0, + "index_stored": 0, + "index_indexed": 0, + "index_boost": 0.0, + "is_sortable": 0, + "is_facet": 0, + "is_listed": 0, + "index_autocomplete": 0, + "sorting": 24 + }, + "object_name": { + "format": [ + { + "format_root": "mods", + "xpath": "./mods:relatedItem[@type=\"original\"]/mods:titleInfo[not(@type=\"alternative\")]/mods:title", + "xpath_sorting": "" + } + ], + "default_value": "", + "wrap": "key.wrap =
|
\nvalue.required = 1\nvalue.wrap =
|
", + "index_tokenized": 0, + "index_stored": 0, + "index_indexed": 0, + "index_boost": 0.0, + "is_sortable": 0, + "is_facet": 0, + "is_listed": 0, + "index_autocomplete": 0, + "sorting": 25 + }, + "object_alternative_names": { + "format": [ + { + "format_root": "mods", + "xpath": "./mods:relatedItem[@type=\"original\"]/mods:titleInfo[@type=\"alternative\"]/mods:title", + "xpath_sorting": "" + } + ], + "default_value": "", + "wrap": "key.wrap =
|
\nvalue.required = 1\nvalue.wrap =
|
", + "index_tokenized": 0, + "index_stored": 0, + "index_indexed": 0, + "index_boost": 0.0, + "is_sortable": 0, + "is_facet": 0, + "is_listed": 0, + "index_autocomplete": 0, + "sorting": 26 + }, + "object_location": { + "format": [ + { + "format_root": "mods", + "xpath": "./mods:relatedItem[@type=\"original\"]/mods:location/mods:physicalLocation", + "xpath_sorting": "" + } + ], + "default_value": "", + "wrap": "key.wrap =
|
\nvalue.required = 1\nvalue.wrap =
|
", + "index_tokenized": 0, + "index_stored": 0, + "index_indexed": 0, + "index_boost": 0.0, + "is_sortable": 0, + "is_facet": 0, + "is_listed": 0, + "index_autocomplete": 0, + "sorting": 27 + }, + "geonames": { + "format": [ + { + "format_root": "mods", + "xpath": "./mods:relatedItem[@type=\"original\"]/mods:location/mods:physicalLocation[@authority=\"geonames\"]/@valueURI", + "xpath_sorting": "" + } + ], + "default_value": "", + "wrap": "key.wrap =
|
\nvalue.required = 1\nvalue.wrap =
|
", + "index_tokenized": 0, + "index_stored": 0, + "index_indexed": 0, + "index_boost": 0.0, + "is_sortable": 0, + "is_facet": 0, + "is_listed": 0, + "index_autocomplete": 0, + "sorting": 28 + }, + "wikidata": { + "format": [ + { + "format_root": "mods", + "xpath": "./mods:relatedItem[@type=\"original\"]/mods:location/mods:url[@note=\"wikidata\"]", + "xpath_sorting": "" + } + ], + "default_value": "", + "wrap": "key.wrap =
|
\nvalue.required = 1\nvalue.wrap =
|
", + "index_tokenized": 0, + "index_stored": 0, + "index_indexed": 0, + "index_boost": 0.0, + "is_sortable": 0, + "is_facet": 0, + "is_listed": 0, + "index_autocomplete": 0, + "sorting": 29 + }, + "wikipedia": { + "format": [ + { + "format_root": "mods", + "xpath": "./mods:relatedItem[@type=\"original\"]/mods:location/mods:url[@note=\"wikipedia\"]", + "xpath_sorting": "" + } + ], + "default_value": "", + "wrap": "key.wrap =
|
\nvalue.required = 1\nvalue.wrap =
|
", + "index_tokenized": 0, + "index_stored": 0, + "index_indexed": 0, + "index_boost": 0.0, + "is_sortable": 0, + "is_facet": 0, + "is_listed": 0, + "index_autocomplete": 0, + "sorting": 30 + } +} diff --git a/Resources/Private/Data/MetadataDefaults.php b/Resources/Private/Data/MetadataDefaults.php deleted file mode 100644 index f542da4b5..000000000 --- a/Resources/Private/Data/MetadataDefaults.php +++ /dev/null @@ -1,809 +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. - */ - -// Define metadata elements. -// @see http://dfg-viewer.de/en/profile-of-the-metadata/ -return [ - 'type' => [ - 'format' => [ - [ - 'format_root' => 'IIIF2', - 'xpath' => '$.metadata.[?(@.label==\'Manifest Type\')].value', - 'xpath_sorting' => '', - ], - ], - 'default_value' => '', - 'wrap' => '', - 'index_tokenized' => 0, - 'index_stored' => 1, - 'index_indexed' => 0, - 'index_boost' => 1.00, - 'is_sortable' => 1, - 'is_facet' => 1, - 'is_listed' => 1, - 'index_autocomplete' => 0, - ], - 'title' => [ - 'format' => [ - [ - 'format_root' => 'mods', - 'xpath' => 'concat(./mods:titleInfo/mods:nonSort," ",./mods:titleInfo/mods:title)', - 'xpath_sorting' => './mods:titleInfo/mods:title', - ], - [ - 'format_root' => 'teiHeader', - 'xpath' => './teihdr:fileDesc/teihdr:sourceDesc/teihdr:msDesc/teihdr:head/teihdr:note[@type="caption"]', - 'xpath_sorting' => '', - ], - [ - 'format_root' => 'IIIF2', - 'xpath' => '$[label]', - 'xpath_sorting' => '', - ], - ], - 'default_value' => '', - 'wrap' => "key.wrap = \nvalue.required = 1\nvalue.wrap = ", - 'index_tokenized' => 1, - 'index_stored' => 1, - 'index_indexed' => 1, - 'index_boost' => 2.00, - 'is_sortable' => 1, - 'is_facet' => 0, - 'is_listed' => 1, - 'index_autocomplete' => 1, - ], - 'volume' => [ - 'format' => [ - [ - 'format_root' => 'mods', - 'xpath' => './mods:part/mods:detail/mods:number', - 'xpath_sorting' => './mods:part[@type="host"]/@order', - ], - ], - 'default_value' => '', - 'wrap' => '', - 'index_tokenized' => 0, - 'index_stored' => 1, - 'index_indexed' => 0, - 'index_boost' => 1.00, - 'is_sortable' => 1, - 'is_facet' => 0, - 'is_listed' => 1, - 'index_autocomplete' => 0, - ], - 'date' => [ - 'format' => [ - [ - 'format_root' => 'mods', - 'xpath' => './mods:originInfo/*[@encoding="iso8601" or @encoding="w3cdtf"][@keyDate="yes"]', - 'xpath_sorting' => '', - ], - ], - 'default_value' => '', - 'wrap' => '', - 'index_tokenized' => 0, - 'index_stored' => 1, - 'index_indexed' => 1, - 'index_boost' => 1.00, - 'is_sortable' => 1, - 'is_facet' => 0, - 'is_listed' => 1, - 'index_autocomplete' => 0, - ], - 'author' => [ - 'format' => [ - [ - 'format_root' => 'teiHeader', - 'xpath' => './teihdr:fileDesc/teihdr:sourceDesc/teihdr:msDesc/teihdr:head/teihdr:name', - 'xpath_sorting' => '', - ], - [ - 'format_root' => 'IIIF2', - 'xpath' => "$.metadata.[?(@.label=='Author')].value", - 'xpath_sorting' => '', - ], - ], - 'default_value' => '', - 'wrap' => "key.wrap = \nvalue.required = 1\nvalue.split.token.char = 31\nvalue.split.cObjNum = 1\nvalue.split.1.1 = CASE\nvalue.split.1.1.key.data = register:SPLIT_COUNT\nvalue.split.1.1.0 = LOAD_REGISTER\nvalue.split.1.1.0.tx_dlf_metadata_author_name.current = 1\nvalue.split.1.1.1 = LOAD_REGISTER\nvalue.split.1.1.1.tx_dlf_metadata_author_uri.current = 1\nvalue.postCObject = TEXT\nvalue.postCObject.value = {register:tx_dlf_metadata_author_name}\nvalue.postCObject.value.insertData = 1\nvalue.postCObject.value.stdWrap.typolink.parameter = {register:tx_dlf_metadata_author_uri} _blank external\nvalue.postCObject.value.stdWrap.typolink.parameter.insertData = 1\nvalue.postCObject.value.stdWrap.typolink.title = {register:tx_dlf_metadata_author_name}\nvalue.postCObject.value.stdWrap.typolink.ifNotEmpty = 1\nvalue.wrap = ", - 'index_tokenized' => 1, - 'index_stored' => 1, - 'index_indexed' => 1, - 'index_boost' => 2.00, - 'is_sortable' => 1, - 'is_facet' => 1, - 'is_listed' => 1, - 'index_autocomplete' => 1, - ], - 'place' => [ - 'format' => [ - [ - 'format_root' => 'teiHeader', - 'xpath' => './teihdr:fileDesc/teihdr:sourceDesc/teihdr:msDesc/teihdr:head/teihdr:origPlace', - 'xpath_sorting' => '', - ], - [ - 'format_root' => 'IIIF2', - 'xpath' => "$.metadata.[?(@.label=='Place of publication')].value", - 'xpath_sorting' => '', - ], - ], - 'default_value' => '', - 'wrap' => '', - 'index_tokenized' => 1, - 'index_stored' => 1, - 'index_indexed' => 1, - 'index_boost' => 1.00, - 'is_sortable' => 1, - 'is_facet' => 1, - 'is_listed' => 1, - 'index_autocomplete' => 0, - ], - 'year' => [ - 'format' => [ - [ - 'format_root' => 'teiHeader', - 'xpath' => './teihdr:fileDesc/teihdr:sourceDesc/teihdr:msDesc/teihdr:head/teihdr:origDate', - 'xpath_sorting' => './teihdr:fileDesc/teihdr:sourceDesc/teihdr:msDesc/teihdr:head/teihdr:origDate/@when', - ], - [ - 'format_root' => 'IIIF2', - 'xpath' => "$.metadata.[?(@.label=='Date of publication')].value", - 'xpath_sorting' => '', - ], - ], - 'default_value' => '', - 'wrap' => '', - 'index_tokenized' => 0, - 'index_stored' => 1, - 'index_indexed' => 1, - 'index_boost' => 1.00, - 'is_sortable' => 1, - 'is_facet' => 1, - 'is_listed' => 1, - 'index_autocomplete' => 0, - ], - 'language' => [ - 'format' => [ - [ - 'format_root' => 'mods', - 'xpath' => './mods:language/mods:languageTerm', - 'xpath_sorting' => '', - ], - ], - 'default_value' => '', - 'wrap' => '', - 'index_tokenized' => 0, - 'index_stored' => 0, - 'index_indexed' => 1, - 'index_boost' => 1.00, - 'is_sortable' => 0, - 'is_facet' => 1, - 'is_listed' => 0, - 'index_autocomplete' => 0, - ], - 'collection' => [ - 'format' => [ - [ - 'format_root' => 'mods', - 'xpath' => './mods:classification', - 'xpath_sorting' => '', - ], - [ - 'format_root' => 'teiHeader', - 'xpath' => './teihdr:fileDesc/teihdr:sourceDesc/teihdr:msDesc/teihdr:msIdentifier/teihdr:collection', - 'xpath_sorting' => '', - ], - [ - 'format_root' => 'IIIF2', - 'xpath' => "$.metadata.[?(@.label=='Collection')].value", - 'xpath_sorting' => '', - ], - ], - 'default_value' => '', - 'wrap' => '', - 'index_tokenized' => 1, - 'index_stored' => 0, - 'index_indexed' => 1, - 'index_boost' => 1.00, - 'is_sortable' => 0, - 'is_facet' => 1, - 'is_listed' => 0, - 'index_autocomplete' => 0, - ], - 'owner' => [ - 'format' => [ - [ - 'format_root' => 'mods', - 'xpath' => './mods:name[./mods:role/mods:roleTerm="own"]/mods:displayForm', - 'xpath_sorting' => '', - ], - [ - 'format_root' => 'teiHeader', - 'xpath' => './teihdr:fileDesc/teihdr:publicationStmt/teihdr:publisher', - 'xpath_sorting' => '', - ], - [ - 'format_root' => 'IIIF2', - 'xpath' => "$.metadata.[?(@.label=='Owner')].value", - 'xpath_sorting' => '', - ], - ], - 'default_value' => '', - 'wrap' => '', - 'index_tokenized' => 0, - 'index_stored' => 0, - 'index_indexed' => 1, - 'index_boost' => 1.00, - 'is_sortable' => 0, - 'is_facet' => 1, - 'is_listed' => 0, - 'index_autocomplete' => 0, - ], - 'purl' => [ - 'format' => [ - [ - 'format_root' => 'mods', - 'xpath' => './mods:identifier[@type="purl"]', - 'xpath_sorting' => '', - ], - [ - 'format_root' => 'teiHeader', - 'xpath' => './teihdr:fileDesc/teihdr:publicationStmt/teihdr:idno[@type="purl"]', - 'xpath_sorting' => '', - ], - ], - 'default_value' => '', - 'wrap' => "key.wrap =
|
\nvalue.required = 1\nvalue.setContentToCurrent = 1\nvalue.typolink.parameter.current = 1\nvalue.wrap =
|
", - 'index_tokenized' => 0, - 'index_stored' => 0, - 'index_indexed' => 0, - 'index_boost' => 0.00, - 'is_sortable' => 0, - 'is_facet' => 0, - 'is_listed' => 0, - 'index_autocomplete' => 0, - ], - 'urn' => [ - 'format' => [ - [ - 'format_root' => 'mods', - 'xpath' => './mods:identifier[@type="urn"]', - 'xpath_sorting' => '', - ], - [ - 'format_root' => 'teiHeader', - 'xpath' => './teihdr:fileDesc/teihdr:publicationStmt/teihdr:idno[@type="urn"]', - 'xpath_sorting' => '', - ], - [ - 'format_root' => 'IIIF2', - 'xpath' => "$.metadata.[?(@.label=='URN')].value", - 'xpath_sorting' => '', - ], - ], - 'default_value' => '', - 'wrap' => "key.wrap =
|
\nvalue.required = 1\nvalue.setContentToCurrent = 1\nvalue.typolink.parameter.current = 1\nvalue.typolink.parameter.prepend = TEXT\nvalue.typolink.parameter.prepend.value = http://nbn-resolving.de/\nvalue.wrap =
|
", - 'index_tokenized' => 0, - 'index_stored' => 0, - 'index_indexed' => 1, - 'index_boost' => 1.00, - 'is_sortable' => 0, - 'is_facet' => 0, - 'is_listed' => 0, - 'index_autocomplete' => 0, - ], - 'opac_id' => [ - 'format' => [ - [ - 'format_root' => 'mods', - 'xpath' => './mods:identifier[@type="opac"]', - 'xpath_sorting' => '', - ], - [ - 'format_root' => 'teiHeader', - 'xpath' => './teihdr:fileDesc/teihdr:publicationStmt/teihdr:idno[@type="opac"]', - 'xpath_sorting' => '', - ], - ], - 'default_value' => '', - 'wrap' => '', - 'index_tokenized' => 0, - 'index_stored' => 0, - 'index_indexed' => 1, - 'index_boost' => 1.00, - 'is_sortable' => 0, - 'is_facet' => 0, - 'is_listed' => 0, - 'index_autocomplete' => 0, - ], - 'union_id' => [ - 'format' => [ - [ - 'format_root' => 'mods', - 'xpath' => './mods:identifier[@type="ppn"]', - 'xpath_sorting' => '', - ], - [ - 'format_root' => 'teiHeader', - 'xpath' => './teihdr:fileDesc/teihdr:publicationStmt/teihdr:idno[@type="mmid"]', - 'xpath_sorting' => '', - ], - ], - 'default_value' => '', - 'wrap' => '', - 'index_tokenized' => 0, - 'index_stored' => 0, - 'index_indexed' => 1, - 'index_boost' => 1.00, - 'is_sortable' => 0, - 'is_facet' => 0, - 'is_listed' => 0, - 'index_autocomplete' => 0, - ], - 'record_id' => [ - 'format' => [ - [ - 'format_root' => 'mods', - 'xpath' => './mods:recordInfo/mods:recordIdentifier', - 'xpath_sorting' => '', - ], - [ - 'format_root' => 'teiHeader', - 'xpath' => './teihdr:fileDesc/teihdr:publicationStmt/teihdr:idno[@type="recordIdentifier"]', - 'xpath_sorting' => '', - ], - [ - 'format_root' => 'IIIF2', - 'xpath' => "$['@id']", - 'xpath_sorting' => '', - ], - ], - 'default_value' => '', - 'wrap' => '', - 'index_tokenized' => 0, - 'index_stored' => 0, - 'index_indexed' => 1, - 'index_boost' => 1.00, - 'is_sortable' => 0, - 'is_facet' => 0, - 'is_listed' => 0, - 'index_autocomplete' => 0, - ], - 'prod_id' => [ - 'format' => [ - [ - 'format_root' => 'mods', - 'xpath' => './mods:identifier[@type="kitodo"]', - 'xpath_sorting' => '', - ], - [ - 'format_root' => 'teiHeader', - 'xpath' => './teihdr:fileDesc/teihdr:publicationStmt/teihdr:idno[@type="kitodo"]', - 'xpath_sorting' => '', - ], - [ - 'format_root' => 'IIIF2', - 'xpath' => "$.metadata.[?(@.label=='Kitodo')].value", - 'xpath_sorting' => '', - ], - ], - 'default_value' => '', - 'wrap' => '', - 'index_tokenized' => 0, - 'index_stored' => 0, - 'index_indexed' => 0, - 'index_boost' => 0.00, - 'is_sortable' => 0, - 'is_facet' => 0, - 'is_listed' => 0, - 'index_autocomplete' => 0, - ], - 'coordinates' => [ - 'format' => [ - [ - 'format_root' => 'mods', - 'xpath' => './mods:subject/mods:cartographics/mods:coordinates', - 'xpath_sorting' => '', - ], - ], - 'default_value' => '', - 'wrap' => '', - 'index_tokenized' => 0, - 'index_stored' => 1, - 'index_indexed' => 1, - 'index_boost' => 1.00, - 'is_sortable' => 0, - 'is_facet' => 0, - 'is_listed' => 0, - 'index_autocomplete' => 0, - ], - 'license' => [ - 'format' => [ - [ - 'format_root' => 'mods', - 'xpath' => './mods:accessCondition[@type="use and reproduction"]/@xlink:href', - 'xpath_sorting' => '', - ], - ], - 'default_value' => '', - 'wrap' => '', - 'index_tokenized' => 0, - 'index_stored' => 1, - 'index_indexed' => 1, - 'index_boost' => 1.00, - 'is_sortable' => 0, - 'is_facet' => 1, - 'is_listed' => 0, - 'index_autocomplete' => 0, - ], - 'terms' => [ - 'format' => [ - [ - 'format_root' => 'mods', - 'xpath' => './mods:accessCondition[@type="local terms of use"]/@xlink:href', - 'xpath_sorting' => '', - ], - ], - 'default_value' => '', - 'wrap' => '', - 'index_tokenized' => 0, - 'index_stored' => 1, - 'index_indexed' => 1, - 'index_boost' => 1.00, - 'is_sortable' => 0, - 'is_facet' => 1, - 'is_listed' => 0, - 'index_autocomplete' => 0, - ], - 'restrictions' => [ - 'format' => [ - [ - 'format_root' => 'mods', - 'xpath' => './mods:accessCondition[@type="restriction on access"]/@xlink:href', - 'xpath_sorting' => '', - ], - ], - 'default_value' => '', - 'wrap' => '', - 'index_tokenized' => 0, - 'index_stored' => 1, - 'index_indexed' => 1, - 'index_boost' => 1.00, - 'is_sortable' => 0, - 'is_facet' => 0, - 'is_listed' => 0, - 'index_autocomplete' => 0, - ], - 'out_of_print' => [ - 'format' => [ - [ - 'format_root' => 'mods', - 'xpath' => './mods:accessCondition[@type="out of print work"]', - 'xpath_sorting' => '', - ], - ], - 'default_value' => '', - 'wrap' => '', - 'index_tokenized' => 0, - 'index_stored' => 0, - 'index_indexed' => 1, - 'index_boost' => 1.00, - 'is_sortable' => 0, - 'is_facet' => 1, - 'is_listed' => 0, - 'index_autocomplete' => 0, - ], - 'rights_info' => [ - 'format' => [ - [ - 'format_root' => 'mods', - 'xpath' => './mods:accessCondition[@type="info"]', - 'xpath_sorting' => '', - ], - ], - 'default_value' => '', - 'wrap' => '', - 'index_tokenized' => 0, - 'index_stored' => 0, - 'index_indexed' => 0, - 'index_boost' => 0.00, - 'is_sortable' => 0, - 'is_facet' => 0, - 'is_listed' => 0, - 'index_autocomplete' => 0, - ], - 'description' => [ - 'format' => [ - [ - 'format_root' => 'mods', - 'xpath' => './mods:recordInfo/mods:recordInfoNote', - 'xpath_sorting' => '', - ], - ], - 'default_value' => '', - 'wrap' => "key.wrap =
|
\nvalue.required = 1\nvalue.wrap =
|
", - 'index_tokenized' => 0, - 'index_stored' => 0, - 'index_indexed' => 0, - 'index_boost' => 0.00, - 'is_sortable' => 0, - 'is_facet' => 0, - 'is_listed' => 0, - 'index_autocomplete' => 0, - ], - 'identifier' => [ - 'format' => [ - [ - 'format_root' => 'mods', - 'xpath' => './mods:identifier', - 'xpath_sorting' => '', - ], - ], - 'default_value' => '', - 'wrap' => "key.wrap =
|
\nvalue.required = 1\nvalue.wrap =
|
", - 'index_tokenized' => 0, - 'index_stored' => 0, - 'index_indexed' => 0, - 'index_boost' => 0.00, - 'is_sortable' => 0, - 'is_facet' => 0, - 'is_listed' => 0, - 'index_autocomplete' => 0, - ], - 'object_name' => [ - 'format' => [ - [ - 'format_root' => 'mods', - 'xpath' => './mods:relatedItem[@type="original"]/mods:titleInfo[not(@type="alternative")]/mods:title', - 'xpath_sorting' => '', - ], - ], - 'default_value' => '', - 'wrap' => "key.wrap =
|
\nvalue.required = 1\nvalue.wrap =
|
", - 'index_tokenized' => 0, - 'index_stored' => 0, - 'index_indexed' => 0, - 'index_boost' => 0.00, - 'is_sortable' => 0, - 'is_facet' => 0, - 'is_listed' => 0, - 'index_autocomplete' => 0, - ], - 'object_alternative_names' => [ - 'format' => [ - [ - 'format_root' => 'mods', - 'xpath' => './mods:relatedItem[@type="original"]/mods:titleInfo[@type="alternative"]/mods:title', - 'xpath_sorting' => '', - ], - ], - 'default_value' => '', - 'wrap' => "key.wrap =
|
\nvalue.required = 1\nvalue.wrap =
|
", - 'index_tokenized' => 0, - 'index_stored' => 0, - 'index_indexed' => 0, - 'index_boost' => 0.00, - 'is_sortable' => 0, - 'is_facet' => 0, - 'is_listed' => 0, - 'index_autocomplete' => 0, - ], - 'object_location' => [ - 'format' => [ - [ - 'format_root' => 'mods', - 'xpath' => './mods:relatedItem[@type="original"]/mods:location/mods:physicalLocation', - 'xpath_sorting' => '', - ], - ], - 'default_value' => '', - 'wrap' => "key.wrap =
|
\nvalue.required = 1\nvalue.wrap =
|
", - 'index_tokenized' => 0, - 'index_stored' => 0, - 'index_indexed' => 0, - 'index_boost' => 0.00, - 'is_sortable' => 0, - 'is_facet' => 0, - 'is_listed' => 0, - 'index_autocomplete' => 0, - ], - 'geonames' => [ - 'format' => [ - [ - 'format_root' => 'mods', - 'xpath' => './mods:relatedItem[@type="original"]/mods:location/mods:physicalLocation[@authority="geonames"]/@valueURI', - 'xpath_sorting' => '', - ], - ], - 'default_value' => '', - 'wrap' => "key.wrap =
|
\nvalue.required = 1\nvalue.wrap =
|
", - 'index_tokenized' => 0, - 'index_stored' => 0, - 'index_indexed' => 0, - 'index_boost' => 0.00, - 'is_sortable' => 0, - 'is_facet' => 0, - 'is_listed' => 0, - 'index_autocomplete' => 0, - ], - 'wikidata' => [ - 'format' => [ - [ - 'format_root' => 'mods', - 'xpath' => './mods:relatedItem[@type="original"]/mods:location/mods:url[@note="wikidata"]', - 'xpath_sorting' => '', - ], - ], - 'default_value' => '', - 'wrap' => "key.wrap =
|
\nvalue.required = 1\nvalue.wrap =
|
", - 'index_tokenized' => 0, - 'index_stored' => 0, - 'index_indexed' => 0, - 'index_boost' => 0.00, - 'is_sortable' => 0, - 'is_facet' => 0, - 'is_listed' => 0, - 'index_autocomplete' => 0, - ], - 'wikipedia' => [ - 'format' => [ - [ - 'format_root' => 'mods', - 'xpath' => './mods:relatedItem[@type="original"]/mods:location/mods:url[@note="wikipedia"]', - 'xpath_sorting' => '', - ], - ], - 'default_value' => '', - 'wrap' => "key.wrap =
|
\nvalue.required = 1\nvalue.wrap =
|
", - 'index_tokenized' => 0, - 'index_stored' => 0, - 'index_indexed' => 0, - 'index_boost' => 0.00, - 'is_sortable' => 0, - 'is_facet' => 0, - 'is_listed' => 0, - 'index_autocomplete' => 0, - ], - 'identifier' => [ - 'format' => [ - [ - 'format_root' => 'mods', - 'xpath' => './mods:identifier', - 'xpath_sorting' => '', - ], - ], - 'default_value' => '', - 'wrap' => '', - 'index_tokenized' => 0, - 'index_stored' => 0, - 'index_indexed' => 0, - 'index_boost' => 0.00, - 'is_sortable' => 0, - 'is_facet' => 0, - 'is_listed' => 0, - 'index_autocomplete' => 0, - ], - 'object_name' => [ - 'format' => [ - [ - 'format_root' => 'mods', - 'xpath' => './mods:relatedItem/mods:titleInfo[not(@displayLabel="alternative")]/mods:title', - 'xpath_sorting' => '', - ], - ], - 'default_value' => '', - 'wrap' => '', - 'index_tokenized' => 0, - 'index_stored' => 0, - 'index_indexed' => 0, - 'index_boost' => 0.00, - 'is_sortable' => 0, - 'is_facet' => 0, - 'is_listed' => 0, - 'index_autocomplete' => 0, - ], - 'object_alternative_names' => [ - 'format' => [ - [ - 'format_root' => 'mods', - 'xpath' => './mods:relatedItem/mods:titleInfo[@displayLabel="alternative"]/mods:title', - 'xpath_sorting' => '', - ], - ], - 'default_value' => '', - 'wrap' => '', - 'index_tokenized' => 0, - 'index_stored' => 0, - 'index_indexed' => 0, - 'index_boost' => 0.00, - 'is_sortable' => 0, - 'is_facet' => 0, - 'is_listed' => 0, - 'index_autocomplete' => 0, - ], - 'object_location' => [ - 'format' => [ - [ - 'format_root' => 'mods', - 'xpath' => './mods:relatedItem/mods:location/mods:physicalLocation', - 'xpath_sorting' => '', - ], - ], - 'default_value' => '', - 'wrap' => '', - 'index_tokenized' => 0, - 'index_stored' => 0, - 'index_indexed' => 0, - 'index_boost' => 0.00, - 'is_sortable' => 0, - 'is_facet' => 0, - 'is_listed' => 0, - 'index_autocomplete' => 0, - ], - 'geonames' => [ - 'format' => [ - [ - 'format_root' => 'mods', - 'xpath' => './mods:relatedItem/mods:location/mods:url[@displayLabel="geonames"]', - 'xpath_sorting' => '', - ], - ], - 'default_value' => '', - 'wrap' => '', - 'index_tokenized' => 0, - 'index_stored' => 0, - 'index_indexed' => 0, - 'index_boost' => 0.00, - 'is_sortable' => 0, - 'is_facet' => 0, - 'is_listed' => 0, - 'index_autocomplete' => 0, - ], - 'wikidata' => [ - 'format' => [ - [ - 'format_root' => 'mods', - 'xpath' => './mods:relatedItem/mods:location/mods:url[@displayLabel="wikidata"]', - 'xpath_sorting' => '', - ], - ], - 'default_value' => '', - 'wrap' => '', - 'index_tokenized' => 0, - 'index_stored' => 0, - 'index_indexed' => 0, - 'index_boost' => 0.00, - 'is_sortable' => 0, - 'is_facet' => 0, - 'is_listed' => 0, - 'index_autocomplete' => 0, - ], - 'wikipedia' => [ - 'format' => [ - [ - 'format_root' => 'mods', - 'xpath' => './mods:relatedItem/mods:location/mods:url[@displayLabel="wikipedia"]', - 'xpath_sorting' => '', - ], - ], - 'default_value' => '', - 'wrap' => '', - 'index_tokenized' => 0, - 'index_stored' => 0, - 'index_indexed' => 0, - 'index_boost' => 0.00, - 'is_sortable' => 0, - 'is_facet' => 0, - 'is_listed' => 0, - 'index_autocomplete' => 0, - ] -]; diff --git a/Resources/Private/Data/StructureDefaults.json b/Resources/Private/Data/StructureDefaults.json new file mode 100644 index 000000000..47a9bac80 --- /dev/null +++ b/Resources/Private/Data/StructureDefaults.json @@ -0,0 +1,370 @@ +{ + "act": { + "toplevel": 1, + "oai_name": "" + }, + "additional": { + "toplevel": 0, + "oai_name": "" + }, + "address": { + "toplevel": 0, + "oai_name": "" + }, + "album": { + "toplevel": 1, + "oai_name": "" + }, + "annotation": { + "toplevel": 0, + "oai_name": "" + }, + "article": { + "toplevel": 0, + "oai_name": "" + }, + "atlas": { + "toplevel": 1, + "oai_name": "" + }, + "bachelor_thesis": { + "toplevel": 1, + "oai_name": "" + }, + "binding": { + "toplevel": 0, + "oai_name": "" + }, + "bookplate": { + "toplevel": 0, + "oai_name": "" + }, + "cartulary": { + "toplevel": 1, + "oai_name": "" + }, + "chapter": { + "toplevel": 0, + "oai_name": "" + }, + "collation": { + "toplevel": 0, + "oai_name": "" + }, + "colophon": { + "toplevel": 0, + "oai_name": "" + }, + "contained_work": { + "toplevel": 0, + "oai_name": "" + }, + "contents": { + "toplevel": 0, + "oai_name": "" + }, + "corrigenda": { + "toplevel": 0, + "oai_name": "" + }, + "cover": { + "toplevel": 0, + "oai_name": "" + }, + "cover_front": { + "toplevel": 0, + "oai_name": "" + }, + "cover_back": { + "toplevel": 0, + "oai_name": "" + }, + "day": { + "toplevel": 0, + "oai_name": "" + }, + "dedication": { + "toplevel": 0, + "oai_name": "" + }, + "diploma_thesis": { + "toplevel": 1, + "oai_name": "" + }, + "doctoral_thesis": { + "toplevel": 1, + "oai_name": "" + }, + "document": { + "toplevel": 1, + "oai_name": "" + }, + "dossier": { + "toplevel": 1, + "oai_name": "" + }, + "edge": { + "toplevel": 0, + "oai_name": "" + }, + "endsheet": { + "toplevel": 0, + "oai_name": "" + }, + "engraved_titlepage": { + "toplevel": 0, + "oai_name": "" + }, + "entry": { + "toplevel": 0, + "oai_name": "" + }, + "ephemera": { + "toplevel": 1, + "oai_name": "" + }, + "fascicle": { + "toplevel": 0, + "oai_name": "" + }, + "figure": { + "toplevel": 0, + "oai_name": "" + }, + "file": { + "toplevel": 1, + "oai_name": "" + }, + "folder": { + "toplevel": 1, + "oai_name": "" + }, + "fragment": { + "toplevel": 1, + "oai_name": "" + }, + "ground_plan": { + "toplevel": 1, + "oai_name": "" + }, + "habilitation_thesis": { + "toplevel": 1, + "oai_name": "" + }, + "illustration": { + "toplevel": 0, + "oai_name": "" + }, + "image": { + "toplevel": 1, + "oai_name": "" + }, + "imprint": { + "toplevel": 0, + "oai_name": "" + }, + "index": { + "toplevel": 0, + "oai_name": "" + }, + "initial_decoration": { + "toplevel": 0, + "oai_name": "" + }, + "inventory": { + "toplevel": 1, + "oai_name": "" + }, + "issue": { + "toplevel": 1, + "oai_name": "" + }, + "judgement": { + "toplevel": 1, + "oai_name": "" + }, + "land_register": { + "toplevel": 1, + "oai_name": "" + }, + "leaflet": { + "toplevel": 1, + "oai_name": "" + }, + "lecture": { + "toplevel": 1, + "oai_name": "" + }, + "letter": { + "toplevel": 0, + "oai_name": "" + }, + "magister_thesis": { + "toplevel": 1, + "oai_name": "" + }, + "master_thesis": { + "toplevel": 1, + "oai_name": "" + }, + "manuscript": { + "toplevel": 1, + "oai_name": "" + }, + "map": { + "toplevel": 0, + "oai_name": "" + }, + "monograph": { + "toplevel": 1, + "oai_name": "" + }, + "month": { + "toplevel": 0, + "oai_name": "" + }, + "multivolume_work": { + "toplevel": 1, + "oai_name": "" + }, + "musical_notation": { + "toplevel": 0, + "oai_name": "" + }, + "newspaper": { + "toplevel": 1, + "oai_name": "" + }, + "note": { + "toplevel": 0, + "oai_name": "" + }, + "official_notification": { + "toplevel": 1, + "oai_name": "" + }, + "ornament": { + "toplevel": 0, + "oai_name": "" + }, + "page": { + "toplevel": 0, + "oai_name": "" + }, + "paper": { + "toplevel": 1, + "oai_name": "" + }, + "paste_down": { + "toplevel": 0, + "oai_name": "" + }, + "periodical": { + "toplevel": 1, + "oai_name": "" + }, + "photograph": { + "toplevel": 1, + "oai_name": "" + }, + "plan": { + "toplevel": 1, + "oai_name": "" + }, + "poster": { + "toplevel": 1, + "oai_name": "" + }, + "preface": { + "toplevel": 0, + "oai_name": "" + }, + "preprint": { + "toplevel": 1, + "oai_name": "" + }, + "printed_archives": { + "toplevel": 1, + "oai_name": "" + }, + "printers_mark": { + "toplevel": 0, + "oai_name": "" + }, + "privileges": { + "toplevel": 0, + "oai_name": "" + }, + "proceeding": { + "toplevel": 1, + "oai_name": "" + }, + "provenance": { + "toplevel": 0, + "oai_name": "" + }, + "register": { + "toplevel": 1, + "oai_name": "" + }, + "report": { + "toplevel": 1, + "oai_name": "" + }, + "research_paper": { + "toplevel": 1, + "oai_name": "" + }, + "scheme": { + "toplevel": 0, + "oai_name": "" + }, + "seal": { + "toplevel": 0, + "oai_name": "" + }, + "section": { + "toplevel": 0, + "oai_name": "" + }, + "spine": { + "toplevel": 0, + "oai_name": "" + }, + "stamp": { + "toplevel": 0, + "oai_name": "" + }, + "study": { + "toplevel": 1, + "oai_name": "" + }, + "subinventory": { + "toplevel": 0, + "oai_name": "" + }, + "table": { + "toplevel": 0, + "oai_name": "" + }, + "text": { + "toplevel": 0, + "oai_name": "" + }, + "title_page": { + "toplevel": 0, + "oai_name": "" + }, + "verse": { + "toplevel": 0, + "oai_name": "" + }, + "volume": { + "toplevel": 1, + "oai_name": "" + }, + "year": { + "toplevel": 1, + "oai_name": "" + } +} diff --git a/Resources/Private/Data/StructureDefaults.php b/Resources/Private/Data/StructureDefaults.php deleted file mode 100644 index 3c2178252..000000000 --- a/Resources/Private/Data/StructureDefaults.php +++ /dev/null @@ -1,384 +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. - */ - -// Define structure elements. -// @see http://dfg-viewer.de/en/structural-data-set/ -return [ - 'act' => [ - 'toplevel' => 1, - 'oai_name' => '', - ], - 'additional' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'address' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'album' => [ - 'toplevel' => 1, - 'oai_name' => '', - ], - 'annotation' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'article' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'atlas' => [ - 'toplevel' => 1, - 'oai_name' => '', - ], - 'bachelor_thesis' => [ - 'toplevel' => 1, - 'oai_name' => '', - ], - 'binding' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'bookplate' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'cartulary' => [ - 'toplevel' => 1, - 'oai_name' => '', - ], - 'chapter' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'collation' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'colophon' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'contained_work' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'contents' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'corrigenda' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'cover' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'cover_front' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'cover_back' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'day' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'dedication' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'diploma_thesis' => [ - 'toplevel' => 1, - 'oai_name' => '', - ], - 'doctoral_thesis' => [ - 'toplevel' => 1, - 'oai_name' => '', - ], - 'document' => [ - 'toplevel' => 1, - 'oai_name' => '', - ], - 'dossier' => [ - 'toplevel' => 1, - 'oai_name' => '', - ], - 'edge' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'endsheet' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'engraved_titlepage' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'entry' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'ephemera' => [ - 'toplevel' => 1, - 'oai_name' => '' - ], - 'fascicle' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'figure' => [ - 'toplevel' => 0, - 'oai_name' => '', - ], - 'file' => [ - 'toplevel' => 1, - 'oai_name' => '', - ], - 'folder' => [ - 'toplevel' => 1, - 'oai_name' => '', - ], - 'fragment' => [ - 'toplevel' => 1, - 'oai_name' => '' - ], - 'ground_plan' => [ - 'toplevel' => 1, - 'oai_name' => '', - ], - 'habilitation_thesis' => [ - 'toplevel' => 1, - 'oai_name' => '', - ], - 'illustration' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'image' => [ - 'toplevel' => 1, - 'oai_name' => '', - ], - 'imprint' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'index' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'initial_decoration' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'inventory' => [ - 'toplevel' => 1, - 'oai_name' => '' - ], - 'issue' => [ - 'toplevel' => 1, - 'oai_name' => '' - ], - 'judgement' => [ - 'toplevel' => 1, - 'oai_name' => '', - ], - 'land_register' => [ - 'toplevel' => 1, - 'oai_name' => '', - ], - 'leaflet' => [ - 'toplevel' => 1, - 'oai_name' => '', - ], - 'lecture' => [ - 'toplevel' => 1, - 'oai_name' => '', - ], - 'letter' => [ - 'toplevel' => 0, - 'oai_name' => '', - ], - 'magister_thesis' => [ - 'toplevel' => 1, - 'oai_name' => '', - ], - 'master_thesis' => [ - 'toplevel' => 1, - 'oai_name' => '', - ], - 'manuscript' => [ - 'toplevel' => 1, - 'oai_name' => '' - ], - 'map' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'monograph' => [ - 'toplevel' => 1, - 'oai_name' => '' - ], - 'month' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'multivolume_work' => [ - 'toplevel' => 1, - 'oai_name' => '' - ], - 'musical_notation' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'newspaper' => [ - 'toplevel' => 1, - 'oai_name' => '' - ], - 'note' => [ - 'toplevel' => 0, - 'oai_name' => '', - ], - 'official_notification' => [ - 'toplevel' => 1, - 'oai_name' => '', - ], - 'ornament' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'page' => [ - 'toplevel' => 0, - 'oai_name' => '', - ], - 'paper' => [ - 'toplevel' => 1, - 'oai_name' => '', - ], - 'paste_down' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'periodical' => [ - 'toplevel' => 1, - 'oai_name' => '' - ], - 'photograph' => [ - 'toplevel' => 1, - 'oai_name' => '', - ], - 'plan' => [ - 'toplevel' => 1, - 'oai_name' => '', - ], - 'poster' => [ - 'toplevel' => 1, - 'oai_name' => '', - ], - 'preface' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'preprint' => [ - 'toplevel' => 1, - 'oai_name' => '', - ], - 'printed_archives' => [ - 'toplevel' => 1, - 'oai_name' => '', - ], - 'printers_mark' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'privileges' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'proceeding' => [ - 'toplevel' => 1, - 'oai_name' => '', - ], - 'provenance' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'register' => [ - 'toplevel' => 1, - 'oai_name' => '', - ], - 'report' => [ - 'toplevel' => 1, - 'oai_name' => '', - ], - 'research_paper' => [ - 'toplevel' => 1, - 'oai_name' => '', - ], - 'scheme' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'seal' => [ - 'toplevel' => 0, - 'oai_name' => '', - ], - 'section' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'spine' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'stamp' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'study' => [ - 'toplevel' => 1, - 'oai_name' => '', - ], - 'subinventory' => [ - 'toplevel' => 0, - 'oai_name' => '', - ], - 'table' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'text' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'title_page' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'verse' => [ - 'toplevel' => 0, - 'oai_name' => '' - ], - 'volume' => [ - 'toplevel' => 1, - 'oai_name' => '' - ], - 'year' => [ - 'toplevel' => 1, - 'oai_name' => '' - ] -]; diff --git a/Resources/Private/Language/de.locallang_be.xlf b/Resources/Private/Language/de.locallang_be.xlf index 455238957..f26fe4872 100644 --- a/Resources/Private/Language/de.locallang_be.xlf +++ b/Resources/Private/Language/de.locallang_be.xlf @@ -253,11 +253,11 @@ - + - + @@ -285,7 +285,7 @@ - + diff --git a/Resources/Private/Language/de.locallang_labels.xlf b/Resources/Private/Language/de.locallang_labels.xlf index b0b901d48..d72b4dc15 100644 --- a/Resources/Private/Language/de.locallang_labels.xlf +++ b/Resources/Private/Language/de.locallang_labels.xlf @@ -629,62 +629,62 @@ DLF: Toolbox DLF: Werkzeugkasten - + Default metadata namespaces Standard-Namensräume für Metadaten - - Enable internal page view proxy?: (default is "FALSE") - Internen Proxy für Werkansicht aktivieren? (Standard ist "FALSE") - - - DLF User-Agent: (Standard ist "Kitodo.Presentation") - DLF User-Agent: (default is "Kitodo.Presentation") - - - Verwende nur absolute Links für Seiten und Ressourcen?: Wird nur in speziellen Multi-Domain-Umgebungen benötigt; erfordert einen voll qualifizierten Einstiegspunkt in der Seitenkonfiguration (Standard ist "FALSE") - Force all links to pages and resources to be absolute?: Only needed for some multi-domain environments; requires a fully qualified Entry Point in Site Configuration (default is "FALSE") - - - Verwende HTTPS for absolute Links?: erfordert einen Einstiegspunkt mit "https://..." in der Seitenkonfiguration (Standard ist "FALSE") - Use HTTPS for absolute links?: requires a valid Entry Point with "https://..." in Site Configuration (default is "FALSE") - - - Eingelesene METS Dateien / IIIF-Manifeste zwischenspeichern: Dies kann die Geschwindigkeit geringfügig verbessern, führt aber zu einer sehr großen "fe_session_data" Tabelle (Standard ist "FALSE") - Cache parsed METS files / IIIF manifests: Caching improves performance a little bit but can result in a very large "fe_session_data" table (default is "FALSE") - - - Neue Kollektionen publizieren?: Sollen neue Kollektionen automatisch in der OAI-PMH-Schnittstelle veröffentlicht werden? (Standard ist "TRUE") - Publish new collections?: Should new collections automatically be published in the OAI-PMH interface? (default is "TRUE") - - - Unhide ided documents?: Should hidden documents be unhidden when re-iding them? (default is "FALSE") - Indexierte Dokumente einblenden?: Sollen ausgeblendete Dokumente bei der erneuten Indexierung wieder eingeblendet werden? (Standard ist "FALSE") - - - Verwende externe APIs zum Abrufen von Metadaten?: (Standard ist "FALSE") - Use external APIs for getting metadata?: (default is "FALSE") - - - Seiten fileGrps: Komma-getrennte Liste der @USE Attributwerte der Seitenansichten nach aufsteigender Größe sortiert (Standard ist "DEFAULT,MAX") - Page fileGrps: comma-separated list of @USE attribute values ordered by increasing size (default is "DEFAULT,MAX") - - - Vorschau fileGrp: Komma-getrennte Liste der @USE Attributwerte der Vorschaubilder nach absteigender Priorität sortiert (Standard ist "THUMBS") - Thumbnail fileGrp: comma-separated list of @USE attribute values ordered by decreasing priority (default is "THUMBS") - - - Download fileGrp: Komma-getrennte Liste der @USE Attributwerte der Downloads nach absteigender Priorität sortiert (Standard ist "DOWNLOAD") - Download fileGrp: comma-separated list of @USE attribute values ordered by decreasing priority (default is "DOWNLOAD") - - - Volltext fileGrp: Komma-getrennte Liste der @USE Attributwerte der Volltexte nach absteigender Priorität sortiert (Standard ist "FULLTEXT") - Fulltext fileGrp: comma-separated list of @USE attribute values ordered by decreasing priority (default is "FULLTEXT") - - - Audio fileGrp: Komma-getrennte Liste der @USE Attributwerte der Audiodateien nach absteigender Priorität sortiert (Standard ist "AUDIO") - Audio fileGrp: comma-separated list of @USE attribute values ordered by decreasing priority (default is "AUDIO") - + + Enable internal page view proxy?: (default is "FALSE") + Internen Proxy für Werkansicht aktivieren? (Standard ist "FALSE") + + + DLF User-Agent: (Standard ist "Kitodo.Presentation") + DLF User-Agent: (default is "Kitodo.Presentation") + + + Verwende nur absolute Links für Seiten und Ressourcen?: Wird nur in speziellen Multi-Domain-Umgebungen benötigt; erfordert einen voll qualifizierten Einstiegspunkt in der Seitenkonfiguration (Standard ist "FALSE") + Force all links to pages and resources to be absolute?: Only needed for some multi-domain environments; requires a fully qualified Entry Point in Site Configuration (default is "FALSE") + + + Verwende HTTPS for absolute Links?: erfordert einen Einstiegspunkt mit "https://..." in der Seitenkonfiguration (Standard ist "FALSE") + Use HTTPS for absolute links?: requires a valid Entry Point with "https://..." in Site Configuration (default is "FALSE") + + + Eingelesene METS Dateien / IIIF-Manifeste zwischenspeichern: Dies kann die Geschwindigkeit geringfügig verbessern, führt aber zu einer sehr großen "fe_session_data" Tabelle (Standard ist "FALSE") + Cache parsed METS files / IIIF manifests: Caching improves performance a little bit but can result in a very large "fe_session_data" table (default is "FALSE") + + + Neue Kollektionen publizieren?: Sollen neue Kollektionen automatisch in der OAI-PMH-Schnittstelle veröffentlicht werden? (Standard ist "TRUE") + Publish new collections?: Should new collections automatically be published in the OAI-PMH interface? (default is "TRUE") + + + Unhide ided documents?: Should hidden documents be unhidden when re-iding them? (default is "FALSE") + Indexierte Dokumente einblenden?: Sollen ausgeblendete Dokumente bei der erneuten Indexierung wieder eingeblendet werden? (Standard ist "FALSE") + + + Verwende externe APIs zum Abrufen von Metadaten?: (Standard ist "FALSE") + Use external APIs for getting metadata?: (default is "FALSE") + + + Seiten fileGrps: Komma-getrennte Liste der @USE Attributwerte der Seitenansichten nach aufsteigender Größe sortiert (Standard ist "DEFAULT,MAX") + Page fileGrps: comma-separated list of @USE attribute values ordered by increasing size (default is "DEFAULT,MAX") + + + Vorschau fileGrp: Komma-getrennte Liste der @USE Attributwerte der Vorschaubilder nach absteigender Priorität sortiert (Standard ist "THUMBS") + Thumbnail fileGrp: comma-separated list of @USE attribute values ordered by decreasing priority (default is "THUMBS") + + + Download fileGrp: Komma-getrennte Liste der @USE Attributwerte der Downloads nach absteigender Priorität sortiert (Standard ist "DOWNLOAD") + Download fileGrp: comma-separated list of @USE attribute values ordered by decreasing priority (default is "DOWNLOAD") + + + Volltext fileGrp: Komma-getrennte Liste der @USE Attributwerte der Volltexte nach absteigender Priorität sortiert (Standard ist "FULLTEXT") + Fulltext fileGrp: comma-separated list of @USE attribute values ordered by decreasing priority (default is "FULLTEXT") + + + Audio fileGrp: Komma-getrennte Liste der @USE Attributwerte der Audiodateien nach absteigender Priorität sortiert (Standard ist "AUDIO") + Audio fileGrp: comma-separated list of @USE attribute values ordered by decreasing priority (default is "AUDIO") + Verzeichnis für die erzeugten Volltexte Directory for the generated OCR fulltexts @@ -761,158 +761,158 @@ Bilder für lokale OCR-Engines (wie Tesseract) herunterladen Download images localy for local OCR engines (like tesseract) - - IIIF-Annotationen mit Motivation "painting" als Volltext behandeln?: Als Volltext behandelte Annotationen werden im Suchid idiert (Standard ist "FALSE") - Handle IIIF annotations with motivation "painting" as fulltext?: Handling annotations as fulltexts means they are ided (default is "FALSE") - - - Maximale Thumbnail-Breite für IIIF-Images: Gilt nur für Bilder ohne Thumbnail-Angaben (Standard ist "150") - Maximum thumbnail width for IIIF images: Only for images without a thumbnail declaration (default is "150") - - - Maximale Thumbnail-Höhe für IIIF-Images: Gilt nur für Bilder ohne Thumbnail-Angaben (Standard ist "150") - Maximum thumbnail height for IIIF images: Only for images without a thumbnail declaration (default is "150") - - - Solr Connection - Solr Verbindung - - - HTTPS verwenden: (Standard ist "FALSE") - Use HTTPS: (default is "FALSE") - - - Solr Server Host: (Standard ist "localhost") - Solr Server Host: (default is "localhost") - - - Solr Server Port: (Standard ist "8983") - Solr Server Port: (default is "8983") - - - Solr Server Pfad: ohne API-Endpunkt "/solr" (Standard ist "/") - Solr Server Path: without API endpoint "/solr" (default is "/") - - - Solr Server Benutzername: (Standard ist "") - Solr Server User: (default is "") - - - Solr Server Kennwort: (Standard ist "") - Solr Server Password: (default is "") - - - Solr Server Timeout: (Standard ist "10") - Solr Server Timeout: (default is "10") - - - Löschen von Solr Kern zulassen?: Soll beim Löschen eines Solr Kerns im TYPO3 Backend auch der entsprechende Index in Apache Solr gelöscht werden? (Standard ist "FALSE") - Allow Solr Core Deletion?: If a Solr Core is deleted in the TYPO3 Backend, should it be deleted in Apache Solr as well? (default is "FALSE") - - - Solr-Schema-Feld "id" : Unique identifier for the document in the id (Standard ist "id") - Solr Schema Field "id" : Unique identifier for the document in the id (default is "id") - - - Solr-Schema-Feld "uid" : Unique identifier for the document (or its top-level parent) in the TYPO3 database (Standard ist "uid") - Solr Schema Field "uid" : Unique identifier for the document (or its top-level parent) in the TYPO3 database (default is "uid") - - - Solr-Schema-Feld "pid" : PageID for the document (or its top-level parent) in the TYPO3 database (Standard ist "pid") - Solr Schema Field "pid" : PageID for the document (or its top-level parent) in the TYPO3 database (default is "pid") - - - Solr-Schema-Feld "page" : Image number where this document starts (Standard ist "page") - Solr Schema Field "page" : Image number where this document starts (default is "page") - - - Solr-Schema-Feld "partof" : Unique identifier for the parent document in the TYPO3 database. Only if this is a multi-volume work! (Standard ist "partof") - Solr Schema Field "partof" : Unique identifier for the parent document in the TYPO3 database. Only if this is a multi-volume work! (default is "partof") - - - Solr-Schema-Feld "root" : Unique identifier for the root document in the TYPO3 database. Only if this is a multi-volume work! (Standard ist "root") - Solr Schema Field "root" : Unique identifier for the root document in the TYPO3 database. Only if this is a multi-volume work! (default is "root") - - - Solr-Schema-Feld "sid" : XML ID of this document in the METS file. This is only unique within the METS file! (Standard ist "sid") - Solr Schema Field "sid" : XML ID of this document in the METS file. This is only unique within the METS file! (default is "sid") - - - Solr-Schema-Feld "toplevel" : Information if it is a top-level document (Standard ist "toplevel") - Solr Schema Field "toplevel" : Information if it is a top-level document (default is "toplevel") - - - Solr-Schema-Feld "type" : Type of document (eg. monograph, chapter, etc.) (Standard ist "type") - Solr Schema Field "type" : Type of document (eg. monograph, chapter, etc.) (default is "type") - - - Solr-Schema-Feld "title" : Title field is mandatory for identifying documents (Standard ist "title") - Solr Schema Field "title" : Title field is mandatory for identifying documents (default is "title") - - - Solr-Schema-Feld "volume" : Volume field is mandatory for identifying documents (Standard ist "volume") - Solr Schema Field "volume" : Volume field is mandatory for identifying documents (default is "volume") - - - Solr Schema Field "date" : The date a resource was issued or created. Used for datesearch (Standard ist "date") - Solr Schema Field "date" : The date a resource was issued or created. Used for datesearch (default is "date") - - - Solr-Schema-Feld "thumbnail" : URL of thumbnail image for the document (Standard ist "thumbnail") - Solr Schema Field "thumbnail" : URL of thumbnail image for the document (default is "thumbnail") - - - Solr-Schema-Feld "default" : CatchAll field (Standard ist "default") - Solr Schema Field default" : CatchAll field (default is "default") - - - Solr-Schema-Feld "timestamp" : (Standard ist "timestamp") - Solr Schema Field "timestamp" : (default is "timestamp") - - - Solr-Schema-Feld "autocomplete" : Autocomplete field for search form (Standard ist "autocomplete") - Solr Schema Field "autocomplete" : Autocomplete field for search form (default is "autocomplete") - - - Solr-Schema-Feld "fulltext" : Fulltext field for OCR results (Standard ist "fulltext") - Solr Schema Field "fulltext" : Fulltext field for OCR results (default is "fulltext") - - - Solr-Schema-Feld "record_id" : Record ID of the document (required for OAI_DC output) (Standard ist "record_id") - Solr Schema Field "record_id" : Record ID of the document (required for OAI_DC output) (default is "record_id") - - - Solr-Schema-Feld "purl" : Permanent URL of the document (required for EPICUR output) (Standard ist "purl") - Solr Schema Field "purl" : Permanent URL of the document (required for EPICUR output) (default is "purl") - - - Solr-Schema-Feld "urn" : URN of the Document (required for EPICUR output) (Standard ist "urn") - Solr Schema Field "urn" : URN of the Document (required for EPICUR output) (default is "urn") - - - Solr-Schema-Feld "location" : Location of METS XML (required for METS output) (Standard ist "location") - Solr Schema Field "location" : Location of METS XML (required for METS output) (default is "location") - - - Solr-Schema-Feld "collection" : Associated collection(s) of the document (Standard ist "collection") - Solr Schema Field "collection" : Associated collection(s) of the document (default is "collection") - - - Solr-Schema-Feld "license" : License (should be URI) (Standard ist "license") - Solr Schema Field "license" : License (should be URI) (default is "license") - - - Solr-Schema-Feld "terms" : Term of Use (should be URI) (Standard ist "terms") - Solr Schema Field "terms" : Term of Use (should be URI) (default is "terms") - - - Solr-Schema-Feld "restrictions" : Access Restrictions (should be URI) (Standard ist "restrictions") - Solr Schema Field "restrictions" : Access Restrictions (should be URI) (default is "restrictions") - - - Solr-Schema-Feld "geom" : GeoJSON geometry for spatial search (Standard ist "geom") - Solr Schema Field "geom" : GeoJSON geometry for spatial search (default is "geom") - + + IIIF-Annotationen mit Motivation "painting" als Volltext behandeln?: Als Volltext behandelte Annotationen werden im Suchid idiert (Standard ist "FALSE") + Handle IIIF annotations with motivation "painting" as fulltext?: Handling annotations as fulltexts means they are ided (default is "FALSE") + + + Maximale Thumbnail-Breite für IIIF-Images: Gilt nur für Bilder ohne Thumbnail-Angaben (Standard ist "150") + Maximum thumbnail width for IIIF images: Only for images without a thumbnail declaration (default is "150") + + + Maximale Thumbnail-Höhe für IIIF-Images: Gilt nur für Bilder ohne Thumbnail-Angaben (Standard ist "150") + Maximum thumbnail height for IIIF images: Only for images without a thumbnail declaration (default is "150") + + + Solr Connection + Solr Verbindung + + + HTTPS verwenden: (Standard ist "FALSE") + Use HTTPS: (default is "FALSE") + + + Solr Server Host: (Standard ist "localhost") + Solr Server Host: (default is "localhost") + + + Solr Server Port: (Standard ist "8983") + Solr Server Port: (default is "8983") + + + Solr Server Pfad: ohne API-Endpunkt "/solr" (Standard ist "/") + Solr Server Path: without API endpoint "/solr" (default is "/") + + + Solr Server Benutzername: (Standard ist "") + Solr Server User: (default is "") + + + Solr Server Kennwort: (Standard ist "") + Solr Server Password: (default is "") + + + Solr Server Timeout: (Standard ist "10") + Solr Server Timeout: (default is "10") + + + Löschen von Solr Kern zulassen?: Soll beim Löschen eines Solr Kerns im TYPO3 Backend auch der entsprechende Index in Apache Solr gelöscht werden? (Standard ist "FALSE") + Allow Solr Core Deletion?: If a Solr Core is deleted in the TYPO3 Backend, should it be deleted in Apache Solr as well? (default is "FALSE") + + + Solr-Schema-Feld "id" : Unique identifier for the document in the id (Standard ist "id") + Solr Schema Field "id" : Unique identifier for the document in the id (default is "id") + + + Solr-Schema-Feld "uid" : Unique identifier for the document (or its top-level parent) in the TYPO3 database (Standard ist "uid") + Solr Schema Field "uid" : Unique identifier for the document (or its top-level parent) in the TYPO3 database (default is "uid") + + + Solr-Schema-Feld "pid" : PageID for the document (or its top-level parent) in the TYPO3 database (Standard ist "pid") + Solr Schema Field "pid" : PageID for the document (or its top-level parent) in the TYPO3 database (default is "pid") + + + Solr-Schema-Feld "page" : Image number where this document starts (Standard ist "page") + Solr Schema Field "page" : Image number where this document starts (default is "page") + + + Solr-Schema-Feld "partof" : Unique identifier for the parent document in the TYPO3 database. Only if this is a multi-volume work! (Standard ist "partof") + Solr Schema Field "partof" : Unique identifier for the parent document in the TYPO3 database. Only if this is a multi-volume work! (default is "partof") + + + Solr-Schema-Feld "root" : Unique identifier for the root document in the TYPO3 database. Only if this is a multi-volume work! (Standard ist "root") + Solr Schema Field "root" : Unique identifier for the root document in the TYPO3 database. Only if this is a multi-volume work! (default is "root") + + + Solr-Schema-Feld "sid" : XML ID of this document in the METS file. This is only unique within the METS file! (Standard ist "sid") + Solr Schema Field "sid" : XML ID of this document in the METS file. This is only unique within the METS file! (default is "sid") + + + Solr-Schema-Feld "toplevel" : Information if it is a top-level document (Standard ist "toplevel") + Solr Schema Field "toplevel" : Information if it is a top-level document (default is "toplevel") + + + Solr-Schema-Feld "type" : Type of document (eg. monograph, chapter, etc.) (Standard ist "type") + Solr Schema Field "type" : Type of document (eg. monograph, chapter, etc.) (default is "type") + + + Solr-Schema-Feld "title" : Title field is mandatory for identifying documents (Standard ist "title") + Solr Schema Field "title" : Title field is mandatory for identifying documents (default is "title") + + + Solr-Schema-Feld "volume" : Volume field is mandatory for identifying documents (Standard ist "volume") + Solr Schema Field "volume" : Volume field is mandatory for identifying documents (default is "volume") + + + Solr Schema Field "date" : The date a resource was issued or created. Used for datesearch (Standard ist "date") + Solr Schema Field "date" : The date a resource was issued or created. Used for datesearch (default is "date") + + + Solr-Schema-Feld "thumbnail" : URL of thumbnail image for the document (Standard ist "thumbnail") + Solr Schema Field "thumbnail" : URL of thumbnail image for the document (default is "thumbnail") + + + Solr-Schema-Feld "default" : CatchAll field (Standard ist "default") + Solr Schema Field default" : CatchAll field (default is "default") + + + Solr-Schema-Feld "timestamp" : (Standard ist "timestamp") + Solr Schema Field "timestamp" : (default is "timestamp") + + + Solr-Schema-Feld "autocomplete" : Autocomplete field for search form (Standard ist "autocomplete") + Solr Schema Field "autocomplete" : Autocomplete field for search form (default is "autocomplete") + + + Solr-Schema-Feld "fulltext" : Fulltext field for OCR results (Standard ist "fulltext") + Solr Schema Field "fulltext" : Fulltext field for OCR results (default is "fulltext") + + + Solr-Schema-Feld "record_id" : Record ID of the document (required for OAI_DC output) (Standard ist "record_id") + Solr Schema Field "record_id" : Record ID of the document (required for OAI_DC output) (default is "record_id") + + + Solr-Schema-Feld "purl" : Permanent URL of the document (required for EPICUR output) (Standard ist "purl") + Solr Schema Field "purl" : Permanent URL of the document (required for EPICUR output) (default is "purl") + + + Solr-Schema-Feld "urn" : URN of the Document (required for EPICUR output) (Standard ist "urn") + Solr Schema Field "urn" : URN of the Document (required for EPICUR output) (default is "urn") + + + Solr-Schema-Feld "location" : Location of METS XML (required for METS output) (Standard ist "location") + Solr Schema Field "location" : Location of METS XML (required for METS output) (default is "location") + + + Solr-Schema-Feld "collection" : Associated collection(s) of the document (Standard ist "collection") + Solr Schema Field "collection" : Associated collection(s) of the document (default is "collection") + + + Solr-Schema-Feld "license" : License (should be URI) (Standard ist "license") + Solr Schema Field "license" : License (should be URI) (default is "license") + + + Solr-Schema-Feld "terms" : Term of Use (should be URI) (Standard ist "terms") + Solr Schema Field "terms" : Term of Use (should be URI) (default is "terms") + + + Solr-Schema-Feld "restrictions" : Access Restrictions (should be URI) (Standard ist "restrictions") + Solr Schema Field "restrictions" : Access Restrictions (should be URI) (default is "restrictions") + + + Solr-Schema-Feld "geom" : GeoJSON geometry for spatial search (Standard ist "geom") + Solr Schema Field "geom" : GeoJSON geometry for spatial search (default is "geom") + diff --git a/Resources/Private/Language/locallang_be.xlf b/Resources/Private/Language/locallang_be.xlf index 0b19763e2..5f4a67d41 100644 --- a/Resources/Private/Language/locallang_be.xlf +++ b/Resources/Private/Language/locallang_be.xlf @@ -197,13 +197,13 @@ - + - + - + diff --git a/Resources/Private/Language/locallang_labels.xlf b/Resources/Private/Language/locallang_labels.xlf index 0e30e60d2..0ee62e502 100644 --- a/Resources/Private/Language/locallang_labels.xlf +++ b/Resources/Private/Language/locallang_labels.xlf @@ -473,46 +473,49 @@ DLF: Toolbox - + Default metadata namespaces - + Enable internal page view proxy?: (default is "FALSE") - - DLF User-Agent: (default is "Kitodo.Presentation") - - + Force all links to pages and resources to be absolute?: Only needed for some multi-domain environments; requires a fully qualified Entry Point in Site Configuration (default is "FALSE") - + + DLF User-Agent: (default is "Kitodo.Presentation") + + Use HTTPS for absolute links?: requires a valid Entry Point with "https://..." in Site Configuration (default is "FALSE") - + Cache parsed METS files / IIIF manifests: Caching improves performance a little bit but can result in a very large "fe_session_data" table (default is "FALSE") - + Publish new collections?: Should new collections automatically be published in the OAI-PMH interface? (default is "TRUE") - + Unhide ided documents?: Should hidden documents be unhidden when re-iding them? (default is "FALSE") - + Use external APIs for getting metadata?: (default is "FALSE") - + + Metadata fields required for indexing documents + + Page fileGrps: comma-separated list of @USE attribute values ordered by increasing size (default is "DEFAULT,MAX") - + Thumbnail fileGrp: comma-separated list of @USE attribute values ordered by decreasing priority (default is "THUMBS") - + Download fileGrp: comma-separated list of @USE attribute values ordered by decreasing priority (default is "DOWNLOAD") - + Fulltext fileGrp: comma-separated list of @USE attribute values ordered by decreasing priority (default is "FULLTEXT") - + Audio fileGrp: comma-separated list of @USE attribute values ordered by decreasing priority (default is "AUDIO") @@ -572,118 +575,118 @@ Download images localy for local OCR engines (like tesseract) - + Handle IIIF annotations with motivation "painting" as fulltext?: Handling annotations as fulltexts means they are ided (default is "FALSE") - + Maximum thumbnail width for IIIF images: Only for images without a thumbnail declaration (default is "150") - + Maximum thumbnail height for IIIF images: Only for images without a thumbnail declaration (default is "150") - + Solr Connection - + Use HTTPS: (default is "FALSE") - + Solr Server Host: (default is "localhost") - + Solr Server Port: (default is "8983") - + Solr Server Path: without API endpoint "/solr" (default is "/") - + Solr Server User: (default is "") - + Solr Server Password: (default is "") - + Solr Server Timeout: (default is "10") - + Allow Solr Core Deletion?: If a Solr Core is deleted in the TYPO3 Backend, should it be deleted in Apache Solr as well? (default is "FALSE") - + Solr Schema Field "id" : Unique identifier for the document in the id (default is "id") - + Solr Schema Field "uid" : Unique identifier for the document (or its top-level parent) in the TYPO3 database (default is "uid") - + Solr Schema Field "pid" : PageID for the document (or its top-level parent) in the TYPO3 database (default is "pid") - + Solr Schema Field "page" : Image number where this document starts (default is "page") - + Solr Schema Field "partof" : Unique identifier for the parent document in the TYPO3 database. Only if this is a multi-volume work! (default is "partof") - + Solr Schema Field "root" : Unique identifier for the root document in the TYPO3 database. Only if this is a multi-volume work! (default is "root") - + Solr Schema Field "sid" : XML ID of this document in the METS file. This is only unique within the METS file! (default is "sid") - + Solr Schema Field "toplevel" : Information if it is a top-level document (default is "toplevel") - + Solr Schema Field "type" : Type of document (eg. monograph, chapter, etc.) (default is "type") - + Solr Schema Field "title" : Title field is mandatory for identifying documents (default is "title") - + Solr Schema Field "volume" : Volume field is mandatory for identifying documents (default is "volume") - + Solr Schema Field "date" : The date a resource was issued or created. Used for datesearch (default is "date") - + Solr Schema Field "thumbnail" : URL of thumbnail image for the document (default is "thumbnail") - + Solr Schema Field default" : CatchAll field (default is "default") - + Solr Schema Field "timestamp" : (default is "timestamp") - + Solr Schema Field "autocomplete" : Autocomplete field for search form (default is "autocomplete") - + Solr Schema Field "fulltext" : Fulltext field for OCR results (default is "fulltext") - + Solr Schema Field "record_id" : Record ID of the document (required for OAI_DC output) (default is "record_id") - + Solr Schema Field "purl" : Permanent URL of the document (required for EPICUR output) (default is "purl") - + Solr Schema Field "urn" : URN of the Document (required for EPICUR output) (default is "urn") - + Solr Schema Field "location" : Location of METS XML (required for METS output) (default is "location") - + Solr Schema Field "collection" : Associated collection(s) of the document (default is "collection") - + Solr Schema Field "license" : License (should be URI) (default is "license") - + Solr Schema Field "terms" : Term of Use (should be URI) (default is "terms") - + Solr Schema Field "restrictions" : Access Restrictions (should be URI) (default is "restrictions") - + Solr Schema Field "geom" : GeoJSON geometry for spatial search (default is "geom") diff --git a/Resources/Private/Partials/TableOfContents/Children.html b/Resources/Private/Partials/TableOfContents/Children.html index b1b4fe284..bd5aa7994 100644 --- a/Resources/Private/Partials/TableOfContents/Children.html +++ b/Resources/Private/Partials/TableOfContents/Children.html @@ -36,7 +36,9 @@ - + + + One section for each feature. - + @@ -116,7 +116,7 @@ - +
  • @@ -192,7 +192,7 @@ - +
    diff --git a/Resources/Private/Templates/Toolbox/Main.html b/Resources/Private/Templates/Toolbox/Main.html index d0cadc5eb..f432e383b 100644 --- a/Resources/Private/Templates/Toolbox/Main.html +++ b/Resources/Private/Templates/Toolbox/Main.html @@ -173,14 +173,14 @@ - + - - - - - - + + + + + +
    diff --git a/Tests/Fixtures/Common/metadata.csv b/Tests/Fixtures/Common/metadata.csv index 418ad82cc..b1c4fbff2 100644 --- a/Tests/Fixtures/Common/metadata.csv +++ b/Tests/Fixtures/Common/metadata.csv @@ -3,9 +3,9 @@ ,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","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 +,"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_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 3eb25995e..5b6da2dae 100644 --- a/Tests/Fixtures/MetsDocument/metadata_mets.csv +++ b/Tests/Fixtures/MetsDocument/metadata_mets.csv @@ -5,11 +5,11 @@ ,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","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 +,"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_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 0fc37c97d..b5e1c52c9 100644 --- a/Tests/Fixtures/Repository/metadata.csv +++ b/Tests/Fixtures/Repository/metadata.csv @@ -7,9 +7,9 @@ ,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","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 +,"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_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/Functional/Api/PageViewProxyTest.php b/Tests/Functional/Api/PageViewProxyTest.php index fe6f3ed4c..2a0879f51 100644 --- a/Tests/Functional/Api/PageViewProxyTest.php +++ b/Tests/Functional/Api/PageViewProxyTest.php @@ -22,7 +22,9 @@ class PageViewProxyTest extends FunctionalTestCase protected function getDlfConfiguration() { return array_merge(parent::getDlfConfiguration(), [ - 'enableInternalProxy' => true, + 'general' => [ + 'enableInternalProxy' => true + ] ]); } diff --git a/Tests/Functional/Common/MetsDocumentTest.php b/Tests/Functional/Common/MetsDocumentTest.php index 49b3b8fa7..07df0098b 100644 --- a/Tests/Functional/Common/MetsDocumentTest.php +++ b/Tests/Functional/Common/MetsDocumentTest.php @@ -29,7 +29,7 @@ public function setUp(): void protected function doc(string $file) { $url = 'http://web:8001/Tests/Fixtures/MetsDocument/' . $file; - $doc = AbstractDocument::getInstance($url, ['useExternalApisForMetadata' => 0]); + $doc = AbstractDocument::getInstance($url, ['general' => ['useExternalApisForMetadata' => 0]]); self::assertNotNull($doc); return $doc; } diff --git a/Tests/Functional/FunctionalTestCase.php b/Tests/Functional/FunctionalTestCase.php index 77a256a5d..662f28dbc 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; @@ -43,6 +44,9 @@ class FunctionalTestCase extends \TYPO3\TestingFramework\Core\Functional\Functio ], 'displayErrors' => '1' ], + 'SC_OPTIONS' => [ + 'dlf/Classes/Plugin/Toolbox.php' => [] + ], 'EXTENSIONS' => [ 'dlf' => [], // = $this->getDlfConfiguration(), set in constructor ], @@ -121,40 +125,50 @@ 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', - 'fileGrpThumbs' => 'THUMBS', - 'fileGrpDownload' => 'DOWNLOAD', - 'fileGrpFulltext' => 'FULLTEXT', - 'fileGrpAudio' => 'AUDIO', - 'solrFieldAutocomplete' => 'autocomplete', - 'solrFieldCollection' => 'collection', - 'solrFieldDefault' => 'default', - 'solrFieldFulltext' => 'fulltext', - 'solrFieldGeom' => 'geom', - 'solrFieldId' => 'id', - 'solrFieldLicense' => 'license', - 'solrFieldLocation' => 'location', - 'solrFieldPage' => 'page', - 'solrFieldPartof' => 'partof', - 'solrFieldPid' => 'pid', - 'solrFieldPurl' => 'purl', - 'solrFieldRecordId' => 'record_id', - 'solrFieldRestrictions' => 'restrictions', - 'solrFieldRoot' => 'root', - 'solrFieldSid' => 'sid', - 'solrFieldTerms' => 'terms', - 'solrFieldThumbnail' => 'thumbnail', - 'solrFieldTimestamp' => 'timestamp', - 'solrFieldTitle' => 'title', - 'solrFieldToplevel' => 'toplevel', - 'solrFieldType' => 'type', - 'solrFieldUid' => 'uid', - 'solrFieldUrn' => 'urn', - 'solrFieldVolume' => 'volume', - - 'solrHost' => getenv('dlfTestingSolrHost'), + 'general' => [ + 'useExternalApisForMetadata' => 0 + ], + 'files' => [ + 'fileGrpImages' => 'DEFAULT,MAX', + 'fileGrpThumbs' => 'THUMBS', + 'fileGrpDownload' => 'DOWNLOAD', + 'fileGrpFulltext' => 'FULLTEXT', + 'fileGrpAudio' => 'AUDIO' + ], + 'solr' => [ + 'host' => getenv('dlfTestingSolrHost'), + 'fields' => [ + 'autocomplete' => 'autocomplete', + 'collection' => 'collection', + 'default' => 'default', + 'fulltext' => 'fulltext', + 'geom' => 'geom', + 'id' => 'id', + 'license' => 'license', + 'location' => 'location', + 'page' => 'page', + 'partof' => 'partof', + 'pid' => 'pid', + 'purl' => 'purl', + 'recordId' => 'record_id', + 'restrictions' => 'restrictions', + 'root' => 'root', + 'sid' => 'sid', + 'terms' => 'terms', + 'thumbnail' => 'thumbnail', + 'timestamp' => 'timestamp', + 'title' => 'title', + 'toplevel' => 'toplevel', + 'type' => 'type', + 'uid' => 'uid', + 'urn' => 'urn', + 'volume' => 'volume' + ] + ] ]; } diff --git a/composer.json b/composer.json index e7c34e019..2fe76d851 100644 --- a/composer.json +++ b/composer.json @@ -31,29 +31,30 @@ "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": "*", "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.39", + "typo3/cms-extbase": "^10.4.37|^11.5.39", + "typo3/cms-tstemplate": "^10.4.37|^11.5.39", "caseyamcl/phpoaipmh": "^3.3.1", "ubl/php-iiif-prezi-reader": "0.3.0", - "solarium/solarium": "^5.2.0", + "solarium/solarium": "5.2 - 6.3", "hakre/xmlreaderiterator": "dev-master" }, "require-dev": { - "phpstan/phpstan": "^1.10.58", + "phpstan/phpstan": "^1.11.11", "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/testing-framework": "^6.16.9" + "typo3/cms-backend": "^10.4.37|^11.5.39", + "typo3/cms-fluid": "^10.4.37|^11.5.39", + "typo3/cms-fluid-styled-content": "^10.4.37|^11.5.39", + "typo3/cms-frontend": "^10.4.37|^11.5.39", + "typo3/testing-framework": "^6.16.9", + "vlucas/phpdotenv": "^5.6.1" }, "replace": { "typo3-ter/dlf": "self.version" @@ -85,16 +86,25 @@ "@test:unit", "@test:func" ], - "install-via-docker": "Build/Test/runTests.sh -s composerInstall", + "install-via-docker": "Build/Test/runTests.sh -s composerInstall", "test:unit": "Build/Test/runTests.sh -s unit", "test:unit:local": "phpunit -c Build/Test/UnitTests.xml", "test:unit:watch": "phpunit-watcher watch -c Build/Test/UnitTests.xml", "test:func": "Build/Test/runTests.sh -s functional", "test:func:watch": "@test:func -w", - "docs:db": "./Build/Documentation/dbdocs/generate.php ./Documentation/Developers/Database.rst", - "docs:setup": "./Build/Documentation/sphinx.sh install", - "docs:serve": "./Build/Documentation/sphinx.sh serve", - "docs:t3": "docker-compose -f ./Build/Documentation/docker-compose.t3docs.yml run --rm t3docs" + "docs:db": "./Build/Documentation/dbdocs/generate.php ./Documentation/Developers/Database.rst", + "docs:build": [ + "rm -Rf ./Documentation-GENERATED-temp", + "docker run --user=$(id -u):$(id -g) --rm -v ./:/project -it ghcr.io/typo3-documentation/render-guides:latest --config ./Documentation", + "cp ./Build/Documentation/index.html ./Documentation-GENERATED-temp" + ], + "docs:start": "docker run -d --name dlf_docs --rm -v ./Documentation-GENERATED-temp:/serve -p 9000:8000 jdkelley/simple-http-server:latest", + "docs:stop": "docker stop dlf_docs", + "docs:rebuild": [ + "@composer docs:stop", + "@composer docs:build", + "@composer docs:start" + ] }, "config": { "allow-plugins": { diff --git a/composer.lock b/composer.lock index c79a18a53..5c17bc5bf 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": "518f8480392b72037a3d4eea0a98e182", "packages": [ { "name": "bacon/bacon-qr-code", @@ -185,23 +185,23 @@ }, { "name": "dasprid/enum", - "version": "1.0.5", + "version": "1.0.6", "source": { "type": "git", "url": "https://github.com/DASPRiD/Enum.git", - "reference": "6faf451159fb8ba4126b925ed2d78acfce0dc016" + "reference": "8dfd07c6d2cf31c8da90c53b83c026c7696dda90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/DASPRiD/Enum/zipball/6faf451159fb8ba4126b925ed2d78acfce0dc016", - "reference": "6faf451159fb8ba4126b925ed2d78acfce0dc016", + "url": "https://api.github.com/repos/DASPRiD/Enum/zipball/8dfd07c6d2cf31c8da90c53b83c026c7696dda90", + "reference": "8dfd07c6d2cf31c8da90c53b83c026c7696dda90", "shasum": "" }, "require": { "php": ">=7.1 <9.0" }, "require-dev": { - "phpunit/phpunit": "^7 | ^8 | ^9", + "phpunit/phpunit": "^7 || ^8 || ^9 || ^10 || ^11", "squizlabs/php_codesniffer": "*" }, "type": "library", @@ -229,9 +229,9 @@ ], "support": { "issues": "https://github.com/DASPRiD/Enum/issues", - "source": "https://github.com/DASPRiD/Enum/tree/1.0.5" + "source": "https://github.com/DASPRiD/Enum/tree/1.0.6" }, - "time": "2023-08-25T16:18:39+00:00" + "time": "2024-08-09T14:30:48+00:00" }, { "name": "doctrine/annotations", @@ -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", @@ -956,22 +956,22 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.8.1", + "version": "7.9.2", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "41042bc7ab002487b876a0683fc8dce04ddce104" + "reference": "d281ed313b989f213357e3be1a179f02196ac99b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104", - "reference": "41042bc7ab002487b876a0683fc8dce04ddce104", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.5.3 || ^2.0.1", - "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", + "guzzlehttp/promises": "^1.5.3 || ^2.0.3", + "guzzlehttp/psr7": "^2.7.0", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" @@ -982,9 +982,9 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "ext-curl": "*", - "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "guzzle/client-integration-tests": "3.0.2", "php-http/message-factory": "^1.1", - "phpunit/phpunit": "^8.5.36 || ^9.6.15", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", "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.1" + "source": "https://github.com/guzzle/guzzle/tree/7.9.2" }, "funding": [ { @@ -1078,20 +1078,20 @@ "type": "tidelift" } ], - "time": "2023-12-03T20:35:24+00:00" + "time": "2024-07-24T11:22:20+00:00" }, { "name": "guzzlehttp/promises", - "version": "2.0.2", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223" + "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223", - "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223", + "url": "https://api.github.com/repos/guzzle/promises/zipball/6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", + "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", "shasum": "" }, "require": { @@ -1099,7 +1099,7 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.36 || ^9.6.15" + "phpunit/phpunit": "^8.5.39 || ^9.6.20" }, "type": "library", "extra": { @@ -1145,7 +1145,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.2" + "source": "https://github.com/guzzle/promises/tree/2.0.3" }, "funding": [ { @@ -1161,20 +1161,20 @@ "type": "tidelift" } ], - "time": "2023-12-03T20:19:20+00:00" + "time": "2024-07-18T10:29:17+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.6.2", + "version": "2.7.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221" + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221", - "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", "shasum": "" }, "require": { @@ -1189,8 +1189,8 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "http-interop/http-factory-tests": "^0.9", - "phpunit/phpunit": "^8.5.36 || ^9.6.15" + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" }, "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.2" + "source": "https://github.com/guzzle/psr7/tree/2.7.0" }, "funding": [ { @@ -1277,33 +1277,92 @@ "type": "tidelift" } ], - "time": "2023-12-03T20:05:35+00:00" + "time": "2024-07-18T11:15:46+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.1", "source": { "type": "git", "url": "https://github.com/lolli42/FineDiff.git", - "reference": "8d535de757062fed8412833f5eede7064595ca5b" + "reference": "015a2f50782d2639c0fb21325dcf747c4136ad2b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lolli42/FineDiff/zipball/8d535de757062fed8412833f5eede7064595ca5b", - "reference": "8d535de757062fed8412833f5eede7064595ca5b", + "url": "https://api.github.com/repos/lolli42/FineDiff/zipball/015a2f50782d2639c0fb21325dcf747c4136ad2b", + "reference": "015a2f50782d2639c0fb21325dcf747c4136ad2b", "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.50.0", + "phpstan/phpstan": "^1.10.57", + "phpunit/phpunit": "^11.2.6" }, "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.1" }, - "time": "2024-02-06T13:56:20+00:00" + "time": "2024-07-09T14:25:40+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.1", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "bd84b629c8de41aa2ae82c067c955e06f1b00240" + "reference": "fcaefacf2d5c417e928405b71b400d4ce10daaf4" }, "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/fcaefacf2d5c417e928405b71b400d4ce10daaf4", + "reference": "fcaefacf2d5c417e928405b71b400d4ce10daaf4", "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.1" }, - "time": "2024-01-04T17:06:16+00:00" + "time": "2024-05-31T08:52:43+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.10", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "db1adb004e2da984085d0178964eb6f319d3cba1" + "reference": "6702d2d777260e6ff3451fee2d7d78ab5f715cdc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/db1adb004e2da984085d0178964eb6f319d3cba1", - "reference": "db1adb004e2da984085d0178964eb6f319d3cba1", + "url": "https://api.github.com/repos/symfony/cache/zipball/6702d2d777260e6ff3451fee2d7d78ab5f715cdc", + "reference": "6702d2d777260e6ff3451fee2d7d78ab5f715cdc", "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.10" }, "funding": [ { @@ -2355,33 +2424,30 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2024-07-17T06:05:49+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.40", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "6b763438a22a4f20885e994ad6702f6a3f25430e" + "reference": "d4e1db78421163b98dd9971d247fd0df4a57ee5e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/6b763438a22a4f20885e994ad6702f6a3f25430e", - "reference": "6b763438a22a4f20885e994ad6702f6a3f25430e", + "url": "https://api.github.com/repos/symfony/config/zipball/d4e1db78421163b98dd9971d247fd0df4a57ee5e", + "reference": "d4e1db78421163b98dd9971d247fd0df4a57ee5e", "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.40" }, "funding": [ { @@ -2513,20 +2579,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2024-05-31T14:33:22+00:00" }, { "name": "symfony/console", - "version": "v5.4.35", + "version": "v5.4.42", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "dbdf6adcb88d5f83790e1efb57ef4074309d3931" + "reference": "cef62396a0477e94fc52e87a17c6e5c32e226b7f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/dbdf6adcb88d5f83790e1efb57ef4074309d3931", - "reference": "dbdf6adcb88d5f83790e1efb57ef4074309d3931", + "url": "https://api.github.com/repos/symfony/console/zipball/cef62396a0477e94fc52e87a17c6e5c32e226b7f", + "reference": "cef62396a0477e94fc52e87a17c6e5c32e226b7f", "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.42" }, "funding": [ { @@ -2612,20 +2678,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:28:09+00:00" + "time": "2024-07-26T12:21:55+00:00" }, { "name": "symfony/dependency-injection", - "version": "v5.4.35", + "version": "v5.4.42", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "45474d527212ca67cdb93f6c5e6da68f4bc67118" + "reference": "c8409889fdbf48b99271930ea0ebcf3ee5e1ceae" }, "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/c8409889fdbf48b99271930ea0ebcf3ee5e1ceae", + "reference": "c8409889fdbf48b99271930ea0ebcf3ee5e1ceae", "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.42" }, "funding": [ { @@ -2701,29 +2767,29 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:37:36+00:00" + "time": "2024-07-25T13:57:40+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.8", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "7a69a85c7ea5bdd1e875806a99c51a87d3a74b38" + "reference": "8d7507f02b06e06815e56bb39aa0128e3806208b" }, "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/8d7507f02b06e06815e56bb39aa0128e3806208b", + "reference": "8d7507f02b06e06815e56bb39aa0128e3806208b", "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.8" }, "funding": [ { @@ -2853,20 +2914,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2024-05-31T14:49:08+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.40", "source": { "type": "git", "url": "https://github.com/symfony/expression-language.git", - "reference": "d59441c10a5a73cd9d4d778b8253595a16f6716d" + "reference": "77670d1e74086dc8d941a18f97097bbf988f2840" }, "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/77670d1e74086dc8d941a18f97097bbf988f2840", + "reference": "77670d1e74086dc8d941a18f97097bbf988f2840", "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.40" }, "funding": [ { @@ -2995,20 +3056,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2024-05-31T14:33:22+00:00" }, { "name": "symfony/filesystem", - "version": "v5.4.35", + "version": "v5.4.41", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "5a553607d4ffbfa9c0ab62facadea296c9db7086" + "reference": "6d29dd9340b372fa603f04e6df4dd76bb808591e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/5a553607d4ffbfa9c0ab62facadea296c9db7086", - "reference": "5a553607d4ffbfa9c0ab62facadea296c9db7086", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/6d29dd9340b372fa603f04e6df4dd76bb808591e", + "reference": "6d29dd9340b372fa603f04e6df4dd76bb808591e", "shasum": "" }, "require": { @@ -3017,6 +3078,9 @@ "symfony/polyfill-mbstring": "~1.8", "symfony/polyfill-php80": "^1.16" }, + "require-dev": { + "symfony/process": "^5.4|^6.4" + }, "type": "library", "autoload": { "psr-4": { @@ -3043,7 +3107,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.41" }, "funding": [ { @@ -3059,20 +3123,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2024-06-28T09:36:24+00:00" }, { "name": "symfony/finder", - "version": "v5.4.35", + "version": "v5.4.42", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "abe6d6f77d9465fed3cd2d029b29d03b56b56435" + "reference": "0724c51fa067b198e36506d2864e09a52180998a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/abe6d6f77d9465fed3cd2d029b29d03b56b56435", - "reference": "abe6d6f77d9465fed3cd2d029b29d03b56b56435", + "url": "https://api.github.com/repos/symfony/finder/zipball/0724c51fa067b198e36506d2864e09a52180998a", + "reference": "0724c51fa067b198e36506d2864e09a52180998a", "shasum": "" }, "require": { @@ -3106,7 +3170,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.42" }, "funding": [ { @@ -3122,20 +3186,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2024-07-22T08:53:29+00:00" }, { "name": "symfony/http-foundation", - "version": "v5.4.35", + "version": "v5.4.42", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "f2ab692a22aef1cd54beb893aa0068bdfb093928" + "reference": "9c375b2abef0b657aa0b7612b763df5c12a465ab" }, "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/9c375b2abef0b657aa0b7612b763df5c12a465ab", + "reference": "9c375b2abef0b657aa0b7612b763df5c12a465ab", "shasum": "" }, "require": { @@ -3145,7 +3209,7 @@ "symfony/polyfill-php80": "^1.16" }, "require-dev": { - "predis/predis": "~1.0", + "predis/predis": "^1.0|^2.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", @@ -3182,7 +3246,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.42" }, "funding": [ { @@ -3198,34 +3262,34 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2024-07-26T11:59:59+00:00" }, { "name": "symfony/lock", - "version": "v5.4.35", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/lock.git", - "reference": "b8b0d5b283af0e117e7ef6141b5b7e5efb20b247" + "reference": "1387f50285c23607467c1f05b258bde65f1ab276" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/lock/zipball/b8b0d5b283af0e117e7ef6141b5b7e5efb20b247", - "reference": "b8b0d5b283af0e117e7ef6141b5b7e5efb20b247", + "url": "https://api.github.com/repos/symfony/lock/zipball/1387f50285c23607467c1f05b258bde65f1ab276", + "reference": "1387f50285c23607467c1f05b258bde65f1ab276", "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 +3325,7 @@ "semaphore" ], "support": { - "source": "https://github.com/symfony/lock/tree/v5.4.35" + "source": "https://github.com/symfony/lock/tree/v6.4.8" }, "funding": [ { @@ -3277,20 +3341,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/mailer", - "version": "v5.4.35", + "version": "v5.4.41", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "664724b0fb4646dee30859d0ed9131a2d7633320" + "reference": "13f4fac7f8450381122f0f4cd750a63c2821c7fa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/664724b0fb4646dee30859d0ed9131a2d7633320", - "reference": "664724b0fb4646dee30859d0ed9131a2d7633320", + "url": "https://api.github.com/repos/symfony/mailer/zipball/13f4fac7f8450381122f0f4cd750a63c2821c7fa", + "reference": "13f4fac7f8450381122f0f4cd750a63c2821c7fa", "shasum": "" }, "require": { @@ -3337,7 +3401,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.41" }, "funding": [ { @@ -3353,20 +3417,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T07:33:37+00:00" + "time": "2024-06-27T20:38:52+00:00" }, { "name": "symfony/mime", - "version": "v5.4.35", + "version": "v5.4.41", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "ee94d9b538f93abbbc1ee4ccff374593117b04a9" + "reference": "c71c7a1aeed60b22d05e738197e31daf2120bd42" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/ee94d9b538f93abbbc1ee4ccff374593117b04a9", - "reference": "ee94d9b538f93abbbc1ee4ccff374593117b04a9", + "url": "https://api.github.com/repos/symfony/mime/zipball/c71c7a1aeed60b22d05e738197e31daf2120bd42", + "reference": "c71c7a1aeed60b22d05e738197e31daf2120bd42", "shasum": "" }, "require": { @@ -3387,6 +3451,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 +3486,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v5.4.35" + "source": "https://github.com/symfony/mime/tree/v5.4.41" }, "funding": [ { @@ -3437,20 +3502,20 @@ "type": "tidelift" } ], - "time": "2024-01-30T08:00:51+00:00" + "time": "2024-06-28T09:36:24+00:00" }, { "name": "symfony/options-resolver", - "version": "v5.4.21", + "version": "v5.4.40", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "4fe5cf6ede71096839f0e4b4444d65dd3a7c1eb9" + "reference": "bd1afbde6613a8d6b956115e0e14b196191fd0c4" }, "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/bd1afbde6613a8d6b956115e0e14b196191fd0c4", + "reference": "bd1afbde6613a8d6b956115e0e14b196191fd0c4", "shasum": "" }, "require": { @@ -3490,7 +3555,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v5.4.21" + "source": "https://github.com/symfony/options-resolver/tree/v5.4.40" }, "funding": [ { @@ -3506,20 +3571,20 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:03:56+00:00" + "time": "2024-05-31T14:33:22+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" + "reference": "0424dff1c58f028c451efff2045f5d92410bd540" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", - "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/0424dff1c58f028c451efff2045f5d92410bd540", + "reference": "0424dff1c58f028c451efff2045f5d92410bd540", "shasum": "" }, "require": { @@ -3569,7 +3634,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.30.0" }, "funding": [ { @@ -3585,20 +3650,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" + "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", - "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/64647a7c30b2283f5d49b874d84a18fc22054b7a", + "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a", "shasum": "" }, "require": { @@ -3647,7 +3712,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.30.0" }, "funding": [ { @@ -3663,20 +3728,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-intl-icu", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-icu.git", - "reference": "07094a28851a49107f3ab4f9120ca2975a64b6e1" + "reference": "e76343c631b453088e2260ac41dfebe21954de81" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/07094a28851a49107f3ab4f9120ca2975a64b6e1", - "reference": "07094a28851a49107f3ab4f9120ca2975a64b6e1", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/e76343c631b453088e2260ac41dfebe21954de81", + "reference": "e76343c631b453088e2260ac41dfebe21954de81", "shasum": "" }, "require": { @@ -3731,7 +3796,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.30.0" }, "funding": [ { @@ -3747,20 +3812,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:12:16+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "a287ed7475f85bf6f61890146edbc932c0fff919" + "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a287ed7475f85bf6f61890146edbc932c0fff919", - "reference": "a287ed7475f85bf6f61890146edbc932c0fff919", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", + "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", "shasum": "" }, "require": { @@ -3815,7 +3880,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.30.0" }, "funding": [ { @@ -3831,20 +3896,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" + "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", - "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/a95281b0be0d9ab48050ebd988b967875cdb9fdb", + "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb", "shasum": "" }, "require": { @@ -3896,7 +3961,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.30.0" }, "funding": [ { @@ -3912,20 +3977,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" + "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", - "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c", + "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c", "shasum": "" }, "require": { @@ -3976,7 +4041,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.0" }, "funding": [ { @@ -3992,20 +4057,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-06-19T12:30:46+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25" + "reference": "10112722600777e02d2745716b70c5db4ca70442" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/861391a8da9a04cbad2d232ddd9e4893220d6e25", - "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/10112722600777e02d2745716b70c5db4ca70442", + "reference": "10112722600777e02d2745716b70c5db4ca70442", "shasum": "" }, "require": { @@ -4049,7 +4114,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.30.0" }, "funding": [ { @@ -4065,20 +4130,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-06-19T12:30:46+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "21bd091060673a1177ae842c0ef8fe30893114d2" + "reference": "ec444d3f3f6505bb28d11afa41e75faadebc10a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/21bd091060673a1177ae842c0ef8fe30893114d2", - "reference": "21bd091060673a1177ae842c0ef8fe30893114d2", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/ec444d3f3f6505bb28d11afa41e75faadebc10a1", + "reference": "ec444d3f3f6505bb28d11afa41e75faadebc10a1", "shasum": "" }, "require": { @@ -4125,7 +4190,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.30.0" }, "funding": [ { @@ -4141,20 +4206,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" + "reference": "77fa7995ac1b21ab60769b7323d600a991a90433" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", - "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/77fa7995ac1b21ab60769b7323d600a991a90433", + "reference": "77fa7995ac1b21ab60769b7323d600a991a90433", "shasum": "" }, "require": { @@ -4205,7 +4270,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.30.0" }, "funding": [ { @@ -4221,20 +4286,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-php81", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d" + "reference": "3fb075789fb91f9ad9af537c4012d523085bd5af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/c565ad1e63f30e7477fc40738343c62b40bc672d", - "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/3fb075789fb91f9ad9af537c4012d523085bd5af", + "reference": "3fb075789fb91f9ad9af537c4012d523085bd5af", "shasum": "" }, "require": { @@ -4281,7 +4346,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.30.0" }, "funding": [ { @@ -4297,20 +4362,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-06-19T12:30:46+00:00" }, { "name": "symfony/property-access", - "version": "v5.4.35", + "version": "v5.4.40", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "f1341758d8046cfff0ac748a0cad238f917191d4" + "reference": "6e4834145c2231b34eafabe440aaac478a95b456" }, "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/6e4834145c2231b34eafabe440aaac478a95b456", + "reference": "6e4834145c2231b34eafabe440aaac478a95b456", "shasum": "" }, "require": { @@ -4362,7 +4427,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v5.4.35" + "source": "https://github.com/symfony/property-access/tree/v5.4.40" }, "funding": [ { @@ -4378,20 +4443,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2024-05-31T14:33:22+00:00" }, { "name": "symfony/property-info", - "version": "v5.4.35", + "version": "v5.4.42", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "d30d48f366ad2bfbf521256be85eb1c182c29198" + "reference": "825aa937f6e8cd63dcc118d0af84d7d4979cddf4" }, "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/825aa937f6e8cd63dcc118d0af84d7d4979cddf4", + "reference": "825aa937f6e8cd63dcc118d0af84d7d4979cddf4", "shasum": "" }, "require": { @@ -4453,7 +4518,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v5.4.35" + "source": "https://github.com/symfony/property-info/tree/v5.4.42" }, "funding": [ { @@ -4469,20 +4534,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T15:43:50+00:00" + "time": "2024-07-22T18:03:36+00:00" }, { "name": "symfony/rate-limiter", - "version": "v5.4.35", + "version": "v5.4.40", "source": { "type": "git", "url": "https://github.com/symfony/rate-limiter.git", - "reference": "9bd24ef2e0948fff4d6741798ba4c7468b75bc8d" + "reference": "b3de902fc83923b9121169ade2453c41d0819110" }, "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/b3de902fc83923b9121169ade2453c41d0819110", + "reference": "b3de902fc83923b9121169ade2453c41d0819110", "shasum": "" }, "require": { @@ -4523,7 +4588,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.40" }, "funding": [ { @@ -4539,20 +4604,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2024-05-31T14:33:22+00:00" }, { "name": "symfony/routing", - "version": "v5.4.35", + "version": "v5.4.42", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "86c5a06a61ddaf17efa1403542e3d7146af96203" + "reference": "f8dd6f80c96aeec9b13fc13757842342e05c4878" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/86c5a06a61ddaf17efa1403542e3d7146af96203", - "reference": "86c5a06a61ddaf17efa1403542e3d7146af96203", + "url": "https://api.github.com/repos/symfony/routing/zipball/f8dd6f80c96aeec9b13fc13757842342e05c4878", + "reference": "f8dd6f80c96aeec9b13fc13757842342e05c4878", "shasum": "" }, "require": { @@ -4613,7 +4678,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v5.4.35" + "source": "https://github.com/symfony/routing/tree/v5.4.42" }, "funding": [ { @@ -4629,20 +4694,20 @@ "type": "tidelift" } ], - "time": "2024-01-30T13:10:15+00:00" + "time": "2024-07-09T20:57:15+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 +4761,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 +4777,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.10", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "c209c4d0559acce1c9a2067612cfb5d35756edc2" + "reference": "ccf9b30251719567bfd46494138327522b9a9446" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/c209c4d0559acce1c9a2067612cfb5d35756edc2", - "reference": "c209c4d0559acce1c9a2067612cfb5d35756edc2", + "url": "https://api.github.com/repos/symfony/string/zipball/ccf9b30251719567bfd46494138327522b9a9446", + "reference": "ccf9b30251719567bfd46494138327522b9a9446", "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 +4847,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.4.35" + "source": "https://github.com/symfony/string/tree/v6.4.10" }, "funding": [ { @@ -4798,28 +4863,29 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2024-07-22T10:21:14+00:00" }, { "name": "symfony/var-exporter", - "version": "v5.4.35", + "version": "v7.1.2", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "abb0a151b62d6b07e816487e20040464af96cae7" + "reference": "b80a669a2264609f07f1667f891dbfca25eba44c" }, "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/b80a669a2264609f07f1667f891dbfca25eba44c", + "reference": "b80a669a2264609f07f1667f891dbfca25eba44c", "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 +4918,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.1.2" }, "funding": [ { @@ -4871,20 +4939,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2024-06-28T08:00:31+00:00" }, { "name": "symfony/yaml", - "version": "v5.4.35", + "version": "v5.4.40", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "e78db7f5c70a21f0417a31f414c4a95fe76c07e4" + "reference": "81cad0ceab3d61fe14fe941ff18a230ac9c80f83" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/e78db7f5c70a21f0417a31f414c4a95fe76c07e4", - "reference": "e78db7f5c70a21f0417a31f414c4a95fe76c07e4", + "url": "https://api.github.com/repos/symfony/yaml/zipball/81cad0ceab3d61fe14fe941ff18a230ac9c80f83", + "reference": "81cad0ceab3d61fe14fe941ff18a230ac9c80f83", "shasum": "" }, "require": { @@ -4930,7 +4998,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.40" }, "funding": [ { @@ -4946,7 +5014,7 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2024-05-31T14:33:22+00:00" }, { "name": "typo3/class-alias-loader", @@ -5045,16 +5113,16 @@ }, { "name": "typo3/cms-composer-installers", - "version": "v3.1.3", + "version": "v3.1.4", "source": { "type": "git", "url": "https://github.com/TYPO3/CmsComposerInstallers.git", - "reference": "613d82075650ba846d287e20941e8a0e04ad0444" + "reference": "29fb214976fe05f39c7d0619ce1d648d59c50a08" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TYPO3/CmsComposerInstallers/zipball/613d82075650ba846d287e20941e8a0e04ad0444", - "reference": "613d82075650ba846d287e20941e8a0e04ad0444", + "url": "https://api.github.com/repos/TYPO3/CmsComposerInstallers/zipball/29fb214976fe05f39c7d0619ce1d648d59c50a08", + "reference": "29fb214976fe05f39c7d0619ce1d648d59c50a08", "shasum": "" }, "require": { @@ -5114,22 +5182,22 @@ "support": { "general": "https://typo3.org/support/", "issues": "https://github.com/TYPO3/CmsComposerInstallers/issues", - "source": "https://github.com/TYPO3/CmsComposerInstallers/tree/v3.1.3" + "source": "https://github.com/TYPO3/CmsComposerInstallers/tree/v3.1.4" }, - "time": "2022-08-05T19:06:26+00:00" + "time": "2024-08-13T14:56:37+00:00" }, { "name": "typo3/cms-core", - "version": "v11.5.35", + "version": "v11.5.39", "source": { "type": "git", "url": "https://github.com/TYPO3-CMS/core.git", - "reference": "184de98b0d4444f0ccf6bb3e43c98eb99ccb1d5c" + "reference": "abd8216fb314e214ef35aaff2ceb2e018b2a352e" }, "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/abd8216fb314e214ef35aaff2ceb2e018b2a352e", + "reference": "abd8216fb314e214ef35aaff2ceb2e018b2a352e", "shasum": "" }, "require": { @@ -5142,7 +5210,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 +5327,20 @@ "issues": "https://forge.typo3.org", "source": "https://github.com/typo3/typo3" }, - "time": "2024-02-13T09:50:23+00:00" + "time": "2024-08-13T08:25:48+00:00" }, { "name": "typo3/cms-extbase", - "version": "v11.5.35", + "version": "v11.5.39", "source": { "type": "git", "url": "https://github.com/TYPO3-CMS/extbase.git", - "reference": "1b4920697d28998f0c4e6eef7947ae2467b50ff4" + "reference": "5c66d051f21c59b56b2d83d8867a1d5bc57dede6" }, "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/5c66d051f21c59b56b2d83d8867a1d5bc57dede6", + "reference": "5c66d051f21c59b56b2d83d8867a1d5bc57dede6", "shasum": "" }, "require": { @@ -5281,7 +5349,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.39" }, "conflict": { "typo3/cms": "*" @@ -5328,24 +5396,24 @@ "issues": "https://forge.typo3.org", "source": "https://github.com/typo3/typo3" }, - "time": "2024-02-13T09:50:23+00:00" + "time": "2024-08-13T08:25:48+00:00" }, { "name": "typo3/cms-tstemplate", - "version": "v11.5.35", + "version": "v11.5.39", "source": { "type": "git", "url": "https://github.com/TYPO3-CMS/tstemplate.git", - "reference": "dd4737679dfb88f3af5a1e5167a899212a877672" + "reference": "829db8b12fe24d269ad6313954bb3decfd50c46d" }, "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/829db8b12fe24d269ad6313954bb3decfd50c46d", + "reference": "829db8b12fe24d269ad6313954bb3decfd50c46d", "shasum": "" }, "require": { - "typo3/cms-core": "11.5.35" + "typo3/cms-core": "11.5.39" }, "conflict": { "typo3/cms": "*" @@ -5386,20 +5454,20 @@ "issues": "https://forge.typo3.org", "source": "https://github.com/typo3/typo3" }, - "time": "2024-02-13T09:50:23+00:00" + "time": "2024-08-13T08:25:48+00:00" }, { "name": "typo3/html-sanitizer", - "version": "v2.1.4", + "version": "v2.2.0", "source": { "type": "git", "url": "https://github.com/TYPO3/html-sanitizer.git", - "reference": "b8f90717251d968c49dc77f8c1e5912e2fbe0dff" + "reference": "c672a2e02925de8eed0dcaeb3a3c90d3642049a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TYPO3/html-sanitizer/zipball/b8f90717251d968c49dc77f8c1e5912e2fbe0dff", - "reference": "b8f90717251d968c49dc77f8c1e5912e2fbe0dff", + "url": "https://api.github.com/repos/TYPO3/html-sanitizer/zipball/c672a2e02925de8eed0dcaeb3a3c90d3642049a0", + "reference": "c672a2e02925de8eed0dcaeb3a3c90d3642049a0", "shasum": "" }, "require": { @@ -5435,9 +5503,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.4" + "source": "https://github.com/TYPO3/html-sanitizer/tree/v2.2.0" }, - "time": "2023-11-14T07:41:08+00:00" + "time": "2024-07-12T15:52:25+00:00" }, { "name": "typo3/phar-stream-wrapper", @@ -5539,31 +5607,33 @@ }, { "name": "typo3fluid/fluid", - "version": "2.7.4", + "version": "2.14.1", "source": { "type": "git", "url": "https://github.com/TYPO3/Fluid.git", - "reference": "24f4494083c8d304680e4c9c38667dff33720dd4" + "reference": "ad0deb5ee02b6149efcd635892563d20c0663274" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TYPO3/Fluid/zipball/24f4494083c8d304680e4c9c38667dff33720dd4", - "reference": "24f4494083c8d304680e4c9c38667dff33720dd4", + "url": "https://api.github.com/repos/TYPO3/Fluid/zipball/ad0deb5ee02b6149efcd635892563d20c0663274", + "reference": "ad0deb5ee02b6149efcd635892563d20c0663274", "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" + "ext-simplexml": "*", + "friendsofphp/php-cs-fixer": "^3.59.3", + "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" + "ext-json": "PHP JSON is needed when using JSONVariableProvider: A relatively rare use case", + "ext-simplexml": "SimpleXML is required for the XSD schema generator" }, "bin": [ "bin/fluid" @@ -5585,7 +5655,7 @@ "issues": "https://github.com/TYPO3/Fluid/issues", "source": "https://github.com/TYPO3/Fluid" }, - "time": "2023-03-23T12:04:09+00:00" + "time": "2024-07-31T09:09:50+00:00" }, { "name": "ubl/php-iiif-prezi-reader", @@ -5955,28 +6025,95 @@ }, "time": "2023-08-08T05:53:35+00:00" }, + { + "name": "graham-campbell/result-type", + "version": "v1.1.3", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/3ba905c11371512af9d9bdd27d99b782216b6945", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" + }, + "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.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:45:45+00:00" + }, { "name": "jolicode/jolinotif", - "version": "v2.4.0", + "version": "v2.7.2", "source": { "type": "git", "url": "https://github.com/jolicode/JoliNotif.git", - "reference": "a15bfc0d5aef432f150385924ede4e099643edb7" + "reference": "b34dac1826c8d33e9fd5c300546261e94f1ebdb8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jolicode/JoliNotif/zipball/a15bfc0d5aef432f150385924ede4e099643edb7", - "reference": "a15bfc0d5aef432f150385924ede4e099643edb7", + "url": "https://api.github.com/repos/jolicode/JoliNotif/zipball/b34dac1826c8d33e9fd5c300546261e94f1ebdb8", + "reference": "b34dac1826c8d33e9fd5c300546261e94f1ebdb8", "shasum": "" }, "require": { - "php": ">=7.4", - "symfony/process": "^4.0|^5.0|^6.0" + "jolicode/php-os-helper": "^0.1.0", + "php": ">=8.1", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "symfony/deprecation-contracts": "^3", + "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" + "symfony/finder": "^5.4 || ^6.0 || ^7.0", + "symfony/phpunit-bridge": "^5.4 || ^6.0 || ^7.0" + }, + "suggest": { + "ext-ffi": "Needed to send notifications via libnotify on Linux" }, "bin": [ "jolinotif" @@ -6007,7 +6144,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.7.2" }, "funding": [ { @@ -6015,7 +6152,57 @@ "type": "tidelift" } ], - "time": "2021-12-01T16:20:42+00:00" + "time": "2024-06-01T06:05:49+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", @@ -6070,16 +6257,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.11.1", + "version": "1.12.0", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", "shasum": "" }, "require": { @@ -6087,11 +6274,12 @@ }, "conflict": { "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3,<3.2.2" + "doctrine/common": "<2.13.3 || >=3 <3.2.2" }, "require-dev": { "doctrine/collections": "^1.6.8", "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" }, "type": "library", @@ -6117,7 +6305,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0" }, "funding": [ { @@ -6125,24 +6313,25 @@ "type": "tidelift" } ], - "time": "2023-03-08T13:26:56+00:00" + "time": "2024-06-12T14:39:25+00:00" }, { "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 +6372,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 +6433,93 @@ }, "time": "2022-02-21T01:04:05+00:00" }, + { + "name": "phpoption/phpoption", + "version": "1.9.3", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/e3fac8b24f56113f7cb96af14958c0dd16330f54", + "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "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.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:41:07+00:00" + }, { "name": "phpstan/phpstan", - "version": "1.10.58", + "version": "1.11.11", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "a23518379ec4defd9e47cbf81019526861623ec2" + "reference": "707c2aed5d8d0075666e673a5e71440c1d01a5a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/a23518379ec4defd9e47cbf81019526861623ec2", - "reference": "a23518379ec4defd9e47cbf81019526861623ec2", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/707c2aed5d8d0075666e673a5e71440c1d01a5a3", + "reference": "707c2aed5d8d0075666e673a5e71440c1d01a5a3", "shasum": "" }, "require": { @@ -6292,45 +6562,41 @@ { "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-08-19T14:37:29+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.30", + "version": "9.2.32", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "ca2bd87d2f9215904682a9cb9bb37dda98e76089" + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5" }, "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/85402a822d1ecf1db1096959413d35e1c37cf1a5", + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.18 || ^5.0", + "nikic/php-parser": "^4.19.1 || ^5.1.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" + "phpunit/php-file-iterator": "^3.0.6", + "phpunit/php-text-template": "^2.0.4", + "sebastian/code-unit-reverse-lookup": "^2.0.3", + "sebastian/complexity": "^2.0.3", + "sebastian/environment": "^5.1.5", + "sebastian/lines-of-code": "^1.0.4", + "sebastian/version": "^3.0.2", + "theseer/tokenizer": "^1.2.3" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^9.6" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -6339,7 +6605,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "9.2-dev" + "dev-main": "9.2.x-dev" } }, "autoload": { @@ -6368,7 +6634,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.32" }, "funding": [ { @@ -6376,7 +6642,7 @@ "type": "github" } ], - "time": "2023-12-22T06:47:57+00:00" + "time": "2024-08-22T04:23:01+00:00" }, { "name": "phpunit/php-file-iterator", @@ -6621,45 +6887,45 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.16", + "version": "9.6.20", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "3767b2c56ce02d01e3491046f33466a1ae60a37f" + "reference": "49d7820565836236411f5dc002d16dd689cde42f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3767b2c56ce02d01e3491046f33466a1ae60a37f", - "reference": "3767b2c56ce02d01e3491046f33466a1ae60a37f", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/49d7820565836236411f5dc002d16dd689cde42f", + "reference": "49d7820565836236411f5dc002d16dd689cde42f", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.3.1 || ^2", + "doctrine/instantiator": "^1.5.0 || ^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", + "myclabs/deep-copy": "^1.12.0", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", "php": ">=7.3", - "phpunit/php-code-coverage": "^9.2.28", - "phpunit/php-file-iterator": "^3.0.5", + "phpunit/php-code-coverage": "^9.2.31", + "phpunit/php-file-iterator": "^3.0.6", "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", + "phpunit/php-text-template": "^2.0.4", + "phpunit/php-timer": "^5.0.3", + "sebastian/cli-parser": "^1.0.2", + "sebastian/code-unit": "^1.0.8", "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/diff": "^4.0.6", + "sebastian/environment": "^5.1.5", + "sebastian/exporter": "^4.0.6", + "sebastian/global-state": "^5.0.7", + "sebastian/object-enumerator": "^4.0.4", + "sebastian/resource-operations": "^3.0.4", + "sebastian/type": "^3.2.1", "sebastian/version": "^3.0.2" }, "suggest": { @@ -6704,7 +6970,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.20" }, "funding": [ { @@ -6720,7 +6986,7 @@ "type": "tidelift" } ], - "time": "2024-01-19T07:03:14+00:00" + "time": "2024-07-10T11:45:39+00:00" }, { "name": "react/event-loop", @@ -6796,16 +7062,16 @@ }, { "name": "react/stream", - "version": "v1.3.0", + "version": "v1.4.0", "source": { "type": "git", "url": "https://github.com/reactphp/stream.git", - "reference": "6fbc9672905c7d5a885f2da2fc696f65840f4a66" + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/stream/zipball/6fbc9672905c7d5a885f2da2fc696f65840f4a66", - "reference": "6fbc9672905c7d5a885f2da2fc696f65840f4a66", + "url": "https://api.github.com/repos/reactphp/stream/zipball/1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d", "shasum": "" }, "require": { @@ -6815,7 +7081,7 @@ }, "require-dev": { "clue/stream-filter": "~1.2", - "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" }, "type": "library", "autoload": { @@ -6862,7 +7128,7 @@ ], "support": { "issues": "https://github.com/reactphp/stream/issues", - "source": "https://github.com/reactphp/stream/tree/v1.3.0" + "source": "https://github.com/reactphp/stream/tree/v1.4.0" }, "funding": [ { @@ -6870,20 +7136,20 @@ "type": "open_collective" } ], - "time": "2023-06-16T10:52:11+00:00" + "time": "2024-06-11T12:45:25+00:00" }, { "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 +7184,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 +7192,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 +7438,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 +7492,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 +7500,7 @@ "type": "github" } ], - "time": "2023-05-07T05:35:17+00:00" + "time": "2024-03-02T06:30:58+00:00" }, { "name": "sebastian/environment", @@ -7301,16 +7567,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 +7632,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 +7640,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 +7696,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 +7704,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 +7940,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 +7961,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -7716,8 +7982,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 +7990,7 @@ "type": "github" } ], - "time": "2020-09-28T06:45:17+00:00" + "time": "2024-03-14T16:00:52+00:00" }, { "name": "sebastian/type", @@ -7902,21 +8167,20 @@ }, { "name": "symfony/process", - "version": "v5.4.35", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "cbc28e34015ad50166fc2f9c8962d28d0fe861eb" + "reference": "8d92dd79149f29e89ee0f480254db595f6a6a2c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/cbc28e34015ad50166fc2f9c8962d28d0fe861eb", - "reference": "cbc28e34015ad50166fc2f9c8962d28d0fe861eb", + "url": "https://api.github.com/repos/symfony/process/zipball/8d92dd79149f29e89ee0f480254db595f6a6a2c5", + "reference": "8d92dd79149f29e89ee0f480254db595f6a6a2c5", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1" }, "type": "library", "autoload": { @@ -7944,7 +8208,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.35" + "source": "https://github.com/symfony/process/tree/v6.4.8" }, "funding": [ { @@ -7960,20 +8224,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2024-05-31T14:49:08+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 +8266,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 +8274,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.39", "source": { "type": "git", "url": "https://github.com/TYPO3-CMS/backend.git", - "reference": "9a9d297541e2011f50eab9c8da3413d6cbb61e55" + "reference": "766d0ee6b84b82af192309ec87212ef9015db0da" }, "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/766d0ee6b84b82af192309ec87212ef9015db0da", + "reference": "766d0ee6b84b82af192309ec87212ef9015db0da", "shasum": "" }, "require": { "psr/event-dispatcher": "^1.0", - "typo3/cms-core": "11.5.35", - "typo3/cms-recordlist": "11.5.35" + "typo3/cms-core": "11.5.39", + "typo3/cms-recordlist": "11.5.39" }, "conflict": { "typo3/cms": "*" @@ -8084,26 +8348,26 @@ "issues": "https://forge.typo3.org", "source": "https://github.com/typo3/typo3" }, - "time": "2024-02-13T09:50:23+00:00" + "time": "2024-08-13T08:25:48+00:00" }, { "name": "typo3/cms-fluid", - "version": "v11.5.35", + "version": "v11.5.39", "source": { "type": "git", "url": "https://github.com/TYPO3-CMS/fluid.git", - "reference": "9c5473ea503fe23edef2dbf004d42acfb34d5718" + "reference": "2aa55fe0c295f41a8aa2d38c292e3ade7965b41f" }, "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/2aa55fe0c295f41a8aa2d38c292e3ade7965b41f", + "reference": "2aa55fe0c295f41a8aa2d38c292e3ade7965b41f", "shasum": "" }, "require": { "symfony/dependency-injection": "^5.4", - "typo3/cms-core": "11.5.35", - "typo3/cms-extbase": "11.5.35", + "typo3/cms-core": "11.5.39", + "typo3/cms-extbase": "11.5.39", "typo3fluid/fluid": "^2.7.2" }, "conflict": { @@ -8148,26 +8412,26 @@ "issues": "https://forge.typo3.org", "source": "https://github.com/typo3/typo3" }, - "time": "2024-02-13T09:50:23+00:00" + "time": "2024-08-13T08:25:48+00:00" }, { "name": "typo3/cms-fluid-styled-content", - "version": "v11.5.35", + "version": "v11.5.39", "source": { "type": "git", "url": "https://github.com/TYPO3-CMS/fluid_styled_content.git", - "reference": "cfafebe662c2b53cbef29d34a7b249f6646d22f3" + "reference": "2b9fc468962dac197e2422bdb938a825ea37ca63" }, "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/2b9fc468962dac197e2422bdb938a825ea37ca63", + "reference": "2b9fc468962dac197e2422bdb938a825ea37ca63", "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.39", + "typo3/cms-fluid": "11.5.39", + "typo3/cms-frontend": "11.5.39" }, "conflict": { "typo3/cms": "*" @@ -8208,26 +8472,26 @@ "issues": "https://forge.typo3.org", "source": "https://github.com/typo3/typo3" }, - "time": "2024-02-13T09:50:23+00:00" + "time": "2024-08-13T08:25:48+00:00" }, { "name": "typo3/cms-frontend", - "version": "v11.5.35", + "version": "v11.5.39", "source": { "type": "git", "url": "https://github.com/TYPO3-CMS/frontend.git", - "reference": "3cbf314767b180789c1e79e1f7921aa2e937a492" + "reference": "e10fde3aaf0485c2c937061c65ca114903944dbd" }, "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/e10fde3aaf0485c2c937061c65ca114903944dbd", + "reference": "e10fde3aaf0485c2c937061c65ca114903944dbd", "shasum": "" }, "require": { "ext-libxml": "*", "symfony/polyfill-mbstring": "^1.23.1", - "typo3/cms-core": "11.5.35" + "typo3/cms-core": "11.5.39" }, "conflict": { "typo3/cms": "*" @@ -8274,20 +8538,20 @@ "issues": "https://forge.typo3.org", "source": "https://github.com/typo3/typo3" }, - "time": "2024-02-13T09:50:23+00:00" + "time": "2024-08-13T08:25:48+00:00" }, { "name": "typo3/cms-install", - "version": "v11.5.35", + "version": "v11.5.39", "source": { "type": "git", "url": "https://github.com/TYPO3-CMS/install.git", - "reference": "d03866734a06cf8430a73e028b5b6d4f9eb8a239" + "reference": "3bb82d446c6e22cf0393d3b1f60d03d2af5e6055" }, "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/3bb82d446c6e22cf0393d3b1f60d03d2af5e6055", + "reference": "3bb82d446c6e22cf0393d3b1f60d03d2af5e6055", "shasum": "" }, "require": { @@ -8296,9 +8560,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.39", + "typo3/cms-extbase": "11.5.39", + "typo3/cms-fluid": "11.5.39" }, "conflict": { "typo3/cms": "*" @@ -8342,24 +8606,24 @@ "issues": "https://forge.typo3.org", "source": "https://github.com/typo3/typo3" }, - "time": "2024-02-13T09:50:23+00:00" + "time": "2024-08-13T08:25:48+00:00" }, { "name": "typo3/cms-recordlist", - "version": "v11.5.35", + "version": "v11.5.39", "source": { "type": "git", "url": "https://github.com/TYPO3-CMS/recordlist.git", - "reference": "7c6d935ac9a6b1051156354747a28cdb86a6ef1a" + "reference": "43ad9b8ac66ef505ab3ffc94e4b54679481dbcfa" }, "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/43ad9b8ac66ef505ab3ffc94e4b54679481dbcfa", + "reference": "43ad9b8ac66ef505ab3ffc94e4b54679481dbcfa", "shasum": "" }, "require": { - "typo3/cms-core": "11.5.35" + "typo3/cms-core": "11.5.39" }, "conflict": { "typo3/cms": "*" @@ -8402,7 +8666,7 @@ "issues": "https://forge.typo3.org", "source": "https://github.com/typo3/typo3" }, - "time": "2024-02-13T09:50:23+00:00" + "time": "2024-08-13T08:25:48+00:00" }, { "name": "typo3/testing-framework", @@ -8480,6 +8744,90 @@ }, "time": "2023-08-02T16:11:00+00:00" }, + { + "name": "vlucas/phpdotenv", + "version": "v5.6.1", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/a59a13791077fe3d44f90e7133eb68e7d22eaff2", + "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.1.3", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3", + "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": false + }, + "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.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:52:34+00:00" + }, { "name": "yosymfony/resource-watcher", "version": "v3.0.0", @@ -8544,7 +8892,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" -} diff --git a/ext_conf_template.txt b/ext_conf_template.txt index be2213a9b..fc06037d6 100644 --- a/ext_conf_template.txt +++ b/ext_conf_template.txt @@ -1,29 +1,29 @@ -# cat=Basic; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.enableInternalProxy -enableInternalProxy = 0 -# cat=Basic; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.useragent -useragent = Kitodo.Presentation -# cat=Basic; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.forceAbsoluteUrl -forceAbsoluteUrl = 0 -# cat=Basic; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.forceAbsoluteUrlHttps -forceAbsoluteUrlHttps = 0 -# cat=Basic; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.caching -caching = 0 -# cat=Basic; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.publishNewCollections -publishNewCollections = 1 -# cat=Basic; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.unhideOnIndex -unhideOnIndex = 0 -# cat=Basic; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.useExternalApisForMetadata -useExternalApisForMetadata = 0 -# cat=Files; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.fileGrpImages -fileGrpImages = DEFAULT,MAX -# cat=Files; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.fileGrpThumbs -fileGrpThumbs = THUMBS -# cat=Files; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.fileGrpDownload -fileGrpDownload = DOWNLOAD -# cat=Files; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.fileGrpFulltext -fileGrpFulltext = FULLTEXT -# cat=Files; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.fileGrpAudio -fileGrpAudio = AUDIO +# cat=General; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.general.enableInternalProxy +general.enableInternalProxy = 0 +# cat=General; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.general.userAgent +general.userAgent = Kitodo.Presentation +# cat=General; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.general.forceAbsoluteUrl +general.forceAbsoluteUrl = 0 +# cat=General; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.general.forceAbsoluteUrlHttps +general.forceAbsoluteUrlHttps = 0 +# cat=General; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.general.caching +general.caching = 0 +# cat=General; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.general.publishNewCollections +general.publishNewCollections = 1 +# cat=General; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.general.unhideOnIndex +general.unhideOnIndex = 0 +# cat=General; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.general.useExternalApisForMetadata +general.useExternalApisForMetadata = 0 +# cat=Files; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.files.fileGrpImages +files.fileGrpImages = DEFAULT,MAX +# cat=Files; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.files.fileGrpThumbs +files.fileGrpThumbs = THUMBS +# cat=Files; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.files.fileGrpDownload +files.fileGrpDownload = DOWNLOAD +# cat=Files; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.files.fileGrpFulltext +files.fileGrpFulltext = FULLTEXT +# cat=Files; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.files.fileGrpAudio +files.fileGrpAudio = AUDIO #//OCR-On-Demand # cat=Fulltext-OCR-general; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.fulltextFolder fulltextFolder = fileadmin/fulltextFolder @@ -63,79 +63,79 @@ ocrUpdateMets=0 ocrIndexMets=0 # cat=Fulltext-OCR-Engines; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.ocrDwnlTempImage ocrDwnlTempImage=0 -# cat=IIIF; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.indexAnnotations +# cat=IIIF; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.iiif.indexAnnotations indexAnnotations = 0 -# cat=IIIF; type=int[1-2000]; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.iiifThumbnailWidth -iiifThumbnailWidth = 150 -# cat=IIIF; type=int[1-2000]; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.iiifThumbnailHeight -iiifThumbnailHeight = 150 -# cat=Solr; type=user[Kitodo\Dlf\Hooks\ConfigurationForm->checkSolrConnection]; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrConnect -solrConnect = 0 -# cat=Solr; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrHttps -solrHttps = 0 -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrHost -solrHost = localhost -# cat=Solr; type=int[0-65535]; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrPort -solrPort = 8983 -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrPath -solrPath = / -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrUser -solrUser = -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrPass -solrPass = -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrTimeout -solrTimeout = 10 -# cat=Solr; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrAllowCoreDelete -solrAllowCoreDelete = 0 -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldId -solrFieldId = id -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldUid -solrFieldUid = uid -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldPid -solrFieldPid = pid -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldPage -solrFieldPage = page -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldPartof -solrFieldPartof = partof -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldRoot -solrFieldRoot = root -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldSid -solrFieldSid = sid -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldToplevel -solrFieldToplevel = toplevel -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldType -solrFieldType = type -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldTitle -solrFieldTitle = title -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldVolume -solrFieldVolume = volume -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldDate -solrFieldDate = date -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldThumbnail -solrFieldThumbnail = thumbnail -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldDefault -solrFieldDefault = default -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldTimestamp -solrFieldTimestamp = timestamp -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldAutocomplete -solrFieldAutocomplete = autocomplete -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldFulltext -solrFieldFulltext = fulltext -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldRecordId -solrFieldRecordId = record_id -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldPurl -solrFieldPurl = purl -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldUrn -solrFieldUrn = urn -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldLocation -solrFieldLocation = location -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldCollection -solrFieldCollection = collection -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldLicense -solrFieldLicense = license -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldTerms -solrFieldTerms = terms -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldRestrictions -solrFieldRestrictions = restrictions -# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solrFieldGeom -solrFieldGeom = geom +# cat=IIIF; type=int[1-2000]; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.iiif.thumbnailWidth +iiif.thumbnailWidth = 150 +# cat=IIIF; type=int[1-2000]; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.iiif.thumbnailHeight +iiif.thumbnailHeight = 150 +# cat=Solr; type=user[Kitodo\Dlf\Hooks\ConfigurationForm->checkSolrConnection]; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solr.connect +solr.connect = 0 +# cat=Solr; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solr.https +solr.https = 0 +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solr.host +solr.host = localhost +# cat=Solr; type=int[0-65535]; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solr.port +solr.port = 8983 +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solr.path +solr.path = / +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solr.user +solr.user = +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solr.pass +solr.pass = +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solr.timeout +solr.timeout = 10 +# cat=Solr; type=boolean; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solr.allowCoreDelete +solr.allowCoreDelete = 0 +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solr.fields.id +solr.fields.id = id +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solr.fields.uid +solr.fields.uid = uid +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solr.fields.pid +solr.fields.pid = pid +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solr.fields.page +solr.fields.page = page +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solr.fields.partof +solr.fields.partof = partof +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solr.fields.root +solr.fields.root = root +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solr.fields.sid +solr.fields.sid = sid +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solr.fields.toplevel +solr.fields.toplevel = toplevel +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solr.fields.type +solr.fields.type = type +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solr.fields.title +solr.fields.title = title +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solr.fields.volume +solr.fields.volume = volume +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solr.fields.date +solr.fields.date = date +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solr.fields.thumbnail +solr.fields.thumbnail = thumbnail +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solr.fields.default +solr.fields.default = default +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solr.fields.timestamp +solr.fields.timestamp = timestamp +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solr.fields.autocomplete +solr.fields.autocomplete = autocomplete +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solr.fields.fulltext +solr.fields.fulltext = fulltext +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solr.fields.recordId +solr.fields.recordId = record_id +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solr.fields.purl +solr.fields.purl = purl +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solr.fields.urn +solr.fields.urn = urn +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solr.fields.location +solr.fields.location = location +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solr.fields.collection +solr.fields.collection = collection +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solr.fields.license +solr.fields.license = license +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solr.fields.terms +solr.fields.terms = terms +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solr.fields.restrictions +solr.fields.restrictions = restrictions +# cat=Solr; type=string; label=LLL:EXT:dlf/Resources/Private/Language/locallang_labels.xlf:config.solr.fields.geom +solr.fields.geom = geom diff --git a/ext_emconf.php b/ext_emconf.php index b9ad60bc1..3fb11f603 100644 --- a/ext_emconf.php +++ b/ext_emconf.php @@ -13,12 +13,12 @@ $EM_CONF[$_EXTKEY] = [ 'title' => 'Kitodo.Presentation - OCR-On-Demand', 'description' => 'Base plugins, modules, services and API of the Digital Library Framework. It is part of the community-based Kitodo Digitization Suite.', - 'version' => '4.0.1-ocr', + 'version' => '5.0.4-ocr', 'category' => 'misc', 'constraints' => [ 'depends' => [ - 'php' => '7.3.0-7.4.99', - 'typo3' => '9.5.0-10.4.99' + 'php' => '7.4.0-8.3.99', + 'typo3' => '10.4.0-11.5.99' ], 'conflicts' => [], 'suggests' => [] diff --git a/ext_localconf.php b/ext_localconf.php index 6ad9b5f46..34cd30d3e 100644 --- a/ext_localconf.php +++ b/ext_localconf.php @@ -78,13 +78,12 @@ $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processCmdmapClass'][] = \Kitodo\Dlf\Hooks\DataHandler::class; $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['dlf/Classes/Common/MetsDocument.php']['hookClass'][] = \Kitodo\Dlf\Hooks\KitodoProductionHacks::class; // Register AJAX eID handlers. -if ($GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['dlf']['enableInternalProxy'] ?? false) { +if ($GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['dlf']['general']['enableInternalProxy'] ?? false) { $GLOBALS['TYPO3_CONF_VARS']['FE']['eID_include']['tx_dlf_pageview_proxy'] = \Kitodo\Dlf\Eid\PageViewProxy::class . '::main'; } // Use Caching Framework for Solr queries -if (!is_array($GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['tx_dlf_solr'])) { - $GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['tx_dlf_solr'] = []; -} +$GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['tx_dlf_solr'] ??= []; + if (!isset($GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['tx_dlf_solr']['backend'])) { $GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['tx_dlf_solr']['backend'] = 'TYPO3\\CMS\\Core\\Cache\\Backend\\FileBackend'; } @@ -92,9 +91,8 @@ $GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['tx_dlf_solr']['options']['defaultLifeTime'] = 86400; // 86400 seconds = 1 day } // Use Caching Framework for XML file caching -if (!is_array($GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['tx_dlf_doc'])) { - $GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['tx_dlf_doc'] = []; -} +$GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['tx_dlf_doc'] ??= []; + if (!isset($GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['tx_dlf_doc']['backend'])) { $GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['tx_dlf_doc']['backend'] = 'TYPO3\\CMS\\Core\\Cache\\Backend\\FileBackend'; } diff --git a/ext_tables.sql b/ext_tables.sql index 7d7da2a01..c2dbefa3d 100644 --- a/ext_tables.sql +++ b/ext_tables.sql @@ -128,9 +128,6 @@ CREATE TABLE tx_dlf_metadataformat ( crdate int(11) DEFAULT '0' NOT NULL, cruser_id int(11) DEFAULT '0' NOT NULL, 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,