diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 80fd101..b87217b 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -5,6 +5,9 @@ on: branches: [ "*" ] pull_request: branches: [ "main" ] + schedule: + - cron: '13 5 * * *' + workflow_dispatch: permissions: contents: read @@ -59,6 +62,7 @@ jobs: - name: Run phpstan run: vendor/bin/phpstan analyse + if: matrix.dep == 'highest' - name: Run phpunit run: | diff --git a/.phive/phars.xml b/.phive/phars.xml index 2b1f5c8..ad6ca89 100644 --- a/.phive/phars.xml +++ b/.phive/phars.xml @@ -1,4 +1,4 @@ - + diff --git a/CHANGELOG.md b/CHANGELOG.md index 0aa0be6..79f438a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # CHANGELOG +## 1.12.0 + +* fix: fix phpstan errors +* build: schedule weekly CI +* build: update to phpstan 2 +* build: update to psalm 6 +* fix: handle attempts to resize corrupt images +* feat: `FileLocationResolverCommand` to debug file location + ## 1.11.0 * test: modernization diff --git a/composer.json b/composer.json index 62f782b..a95b838 100644 --- a/composer.json +++ b/composer.json @@ -50,17 +50,17 @@ "require-dev": { "bnf/phpstan-psr-container": "^1.0", "doctrine/doctrine-bundle": "^2.10", - "ekino/phpstan-banned-code": "^2.1", + "ekino/phpstan-banned-code": "^3.0", "league/flysystem-memory": "^3.16", "mockery/mockery": "^1.6", - "phpstan/phpstan": "^1.12.5 || ^1.13", - "phpstan/phpstan-deprecation-rules": "^1.1", - "phpstan/phpstan-mockery": "^1.1", - "phpstan/phpstan-phpunit": "^1.3", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-deprecation-rules": "^2.0", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", "phpunit/phpunit": "^10.5", "psalm/plugin-mockery": "^1.1", "psalm/plugin-phpunit": "^0.19.0", - "rector/rector": "^1.2", + "rector/rector": "^2.0", "symfony/asset": "^6.2 || ^7.0", "symfony/asset-mapper": "^6.2 || ^7.0", "symfony/console": "^6.2 || ^7.0", @@ -80,7 +80,8 @@ "symfony/yaml": "^6.2 || ^7.0", "symplify/monorepo-builder": "^11.2.20 || ^11.3", "twig/extra-bundle": "^2.12|^3.0", - "vimeo/psalm": "^5.26" + "vimeo/psalm": "^6.0", + "league/flysystem-bundle": "^3.4" }, "autoload": { "psr-4": { @@ -116,22 +117,22 @@ } }, "replace": { - "rekalogika/file": "1.11.0", - "rekalogika/file-association": "1.11.0", - "rekalogika/file-association-contracts": "1.11.0", - "rekalogika/file-association-entity": "1.11.0", - "rekalogika/file-bundle": "1.11.0", - "rekalogika/file-contracts": "1.11.0", - "rekalogika/file-derivation": "1.11.0", - "rekalogika/file-filepond": "1.11.0", - "rekalogika/file-image": "1.11.0", - "rekalogika/file-metadata": "1.11.0", - "rekalogika/file-metadata-contracts": "1.11.0", - "rekalogika/file-null": "1.11.0", - "rekalogika/file-oneup-uploader-bridge": "1.11.0", - "rekalogika/file-server": "1.11.0", - "rekalogika/file-symfony-bridge": "1.11.0", - "rekalogika/file-tree-contracts": "1.11.0", - "rekalogika/file-zip": "1.11.0" + "rekalogika/file": "1.12.0", + "rekalogika/file-association": "1.12.0", + "rekalogika/file-association-contracts": "1.12.0", + "rekalogika/file-association-entity": "1.12.0", + "rekalogika/file-bundle": "1.12.0", + "rekalogika/file-contracts": "1.12.0", + "rekalogika/file-derivation": "1.12.0", + "rekalogika/file-filepond": "1.12.0", + "rekalogika/file-image": "1.12.0", + "rekalogika/file-metadata": "1.12.0", + "rekalogika/file-metadata-contracts": "1.12.0", + "rekalogika/file-null": "1.12.0", + "rekalogika/file-oneup-uploader-bridge": "1.12.0", + "rekalogika/file-server": "1.12.0", + "rekalogika/file-symfony-bridge": "1.12.0", + "rekalogika/file-tree-contracts": "1.12.0", + "rekalogika/file-zip": "1.12.0" } } diff --git a/packages/file-association-contracts/composer.json b/packages/file-association-contracts/composer.json index 8197597..b6084f2 100644 --- a/packages/file-association-contracts/composer.json +++ b/packages/file-association-contracts/composer.json @@ -23,7 +23,7 @@ }, "extra": { "branch-alias": { - "dev-main": "1.12-dev" + "dev-main": "1.13-dev" } } } diff --git a/packages/file-association-entity/composer.json b/packages/file-association-entity/composer.json index a554604..127af87 100644 --- a/packages/file-association-entity/composer.json +++ b/packages/file-association-entity/composer.json @@ -27,14 +27,14 @@ }, "require": { "doctrine/collections": "^2.0", - "rekalogika/file-contracts": "^1.11", - "rekalogika/file-metadata": "^1.11", - "rekalogika/file-null": "^1.11", + "rekalogika/file-contracts": "^1.12", + "rekalogika/file-metadata": "^1.12", + "rekalogika/file-null": "^1.12", "rekalogika/doctrine-collections-decorator": "^2.0" }, "extra": { "branch-alias": { - "dev-main": "1.12-dev" + "dev-main": "1.13-dev" } } } diff --git a/packages/file-association-entity/src/EmbeddedMetadata.php b/packages/file-association-entity/src/EmbeddedMetadata.php index a56ce1a..127350d 100644 --- a/packages/file-association-entity/src/EmbeddedMetadata.php +++ b/packages/file-association-entity/src/EmbeddedMetadata.php @@ -22,7 +22,7 @@ * * @implements \IteratorAggregate */ -class EmbeddedMetadata implements RawMetadataInterface, \IteratorAggregate +final class EmbeddedMetadata implements RawMetadataInterface, \IteratorAggregate { private ?string $name = null; @@ -38,6 +38,7 @@ class EmbeddedMetadata implements RawMetadataInterface, \IteratorAggregate /** * @var array + * @phpstan-ignore property.unusedType */ private ?array $other = []; diff --git a/packages/file-association-entity/src/FileDecorator.php b/packages/file-association-entity/src/FileDecorator.php index ead454c..6207db4 100644 --- a/packages/file-association-entity/src/FileDecorator.php +++ b/packages/file-association-entity/src/FileDecorator.php @@ -21,7 +21,7 @@ use Rekalogika\Domain\File\Null\NullFile; use Rekalogika\File\RawMetadata; -class FileDecorator implements FileInterface +final class FileDecorator implements FileInterface { use FileDecoratorTrait; @@ -125,6 +125,7 @@ public static function syncMetadata(FileInterface $file): void } + #[\Override] protected function getWrapped(): FileInterface { return $this->file; diff --git a/packages/file-association-entity/src/FileMetadataDecorator.php b/packages/file-association-entity/src/FileMetadataDecorator.php index f364f1f..bda9c28 100644 --- a/packages/file-association-entity/src/FileMetadataDecorator.php +++ b/packages/file-association-entity/src/FileMetadataDecorator.php @@ -18,7 +18,7 @@ /** * @implements \IteratorAggregate */ -class FileMetadataDecorator implements RawMetadataInterface, \IteratorAggregate +final class FileMetadataDecorator implements RawMetadataInterface, \IteratorAggregate { /** * @param RawMetadataInterface $embeddedMetadata Metadata embedded in entities diff --git a/packages/file-association-entity/src/UnsetFile.php b/packages/file-association-entity/src/UnsetFile.php index c6bc1e8..31a7c56 100644 --- a/packages/file-association-entity/src/UnsetFile.php +++ b/packages/file-association-entity/src/UnsetFile.php @@ -24,7 +24,7 @@ * A null file that indicates the file is unset. Used by `FileTrait` when the * file property is unset. */ -class UnsetFile extends \Exception implements NullFileInterface +final class UnsetFile extends \Exception implements NullFileInterface { use NullFileTrait; diff --git a/packages/file-association/composer.json b/packages/file-association/composer.json index 06854b5..c67987f 100644 --- a/packages/file-association/composer.json +++ b/packages/file-association/composer.json @@ -27,14 +27,17 @@ }, "require": { "rekalogika/direct-property-access": "^1.1.2 || ^1.2", - "rekalogika/file-association-contracts": "^1.11", - "rekalogika/file-contracts": "^1.11", + "rekalogika/file-association-contracts": "^1.12", + "rekalogika/file-contracts": "^1.12", "rekalogika/reconstitutor": "^1.3.2 || ^1.4", "symfony/property-access": "^6.2 || ^7.0" }, + "suggest": { + "symfony/console": "Enables console commands" + }, "extra": { "branch-alias": { - "dev-main": "1.12-dev" + "dev-main": "1.13-dev" } } } diff --git a/packages/file-association/src/Attribute/AsFileAssociation.php b/packages/file-association/src/Attribute/AsFileAssociation.php index 554065f..dc7f168 100644 --- a/packages/file-association/src/Attribute/AsFileAssociation.php +++ b/packages/file-association/src/Attribute/AsFileAssociation.php @@ -14,7 +14,7 @@ namespace Rekalogika\File\Association\Attribute; #[\Attribute(\Attribute::TARGET_PROPERTY)] -class AsFileAssociation +final class AsFileAssociation { /** * @var 'EAGER'|'LAZY' diff --git a/packages/file-association/src/Attribute/WithFileAssociation.php b/packages/file-association/src/Attribute/WithFileAssociation.php index e5c4174..acf1dab 100644 --- a/packages/file-association/src/Attribute/WithFileAssociation.php +++ b/packages/file-association/src/Attribute/WithFileAssociation.php @@ -14,4 +14,4 @@ namespace Rekalogika\File\Association\Attribute; #[\Attribute(\Attribute::TARGET_CLASS)] -class WithFileAssociation {} +final class WithFileAssociation {} diff --git a/packages/file-association/src/Command/FileLocationResolverCommand.php b/packages/file-association/src/Command/FileLocationResolverCommand.php new file mode 100644 index 0000000..a431956 --- /dev/null +++ b/packages/file-association/src/Command/FileLocationResolverCommand.php @@ -0,0 +1,78 @@ + + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +namespace Rekalogika\File\Association\Command; + +use Doctrine\Persistence\ManagerRegistry; +use Rekalogika\File\Association\Contracts\FileLocationResolverInterface; +use Symfony\Component\Console\Attribute\AsCommand; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; + +#[AsCommand( + name: 'rekalogika:file:resolve', + description: 'Resolves the location of the file based on the object and property name.', +)] +final class FileLocationResolverCommand extends Command +{ + public function __construct( + private readonly ManagerRegistry $managerRegistry, + private readonly FileLocationResolverInterface $fileLocationResolver, + ) { + parent::__construct(); + } + + #[\Override] + protected function configure(): void + { + $this->addArgument('class', InputArgument::REQUIRED, 'Class name'); + $this->addArgument('id', InputArgument::REQUIRED, 'Identifier'); + $this->addArgument('property', InputArgument::REQUIRED, 'Property name'); + } + + #[\Override] + protected function execute(InputInterface $input, OutputInterface $output): int + { + $class = $input->getArgument('class'); + + if (!\is_string($class) || !class_exists($class)) { + throw new \InvalidArgumentException(\sprintf('Class %s not found', get_debug_type($class))); + } + + $id = $input->getArgument('id'); + + if (!\is_string($id)) { + throw new \InvalidArgumentException(\sprintf('Id %s not found', get_debug_type($id))); + } + + $propertyName = $input->getArgument('property'); + + if (!\is_string($propertyName)) { + throw new \InvalidArgumentException(\sprintf('Property name %s not found', get_debug_type($propertyName))); + } + + $object = $this->managerRegistry->getRepository($class)->find($id); + + if (!$object) { + throw new \InvalidArgumentException('Object not found'); + } + + $filePointer = $this->fileLocationResolver->getFileLocation($object, $propertyName); + + $output->writeln($filePointer->getKey()); + + return Command::SUCCESS; + } +} diff --git a/packages/file-association/src/Exception/FileLocationResolver/ChainedObjectNotSupportedException.php b/packages/file-association/src/Exception/FileLocationResolver/ChainedObjectNotSupportedException.php index 417a9e1..86a055d 100644 --- a/packages/file-association/src/Exception/FileLocationResolver/ChainedObjectNotSupportedException.php +++ b/packages/file-association/src/Exception/FileLocationResolver/ChainedObjectNotSupportedException.php @@ -13,7 +13,7 @@ namespace Rekalogika\File\Association\Exception\FileLocationResolver; -class ChainedObjectNotSupportedException extends FileLocationResolverException +final class ChainedObjectNotSupportedException extends FileLocationResolverException { /** * @param iterable $exceptions diff --git a/packages/file-association/src/Exception/FileLocationResolver/ObjectNotSupportedException.php b/packages/file-association/src/Exception/FileLocationResolver/ObjectNotSupportedException.php index 48b24ed..23ae34c 100644 --- a/packages/file-association/src/Exception/FileLocationResolver/ObjectNotSupportedException.php +++ b/packages/file-association/src/Exception/FileLocationResolver/ObjectNotSupportedException.php @@ -15,7 +15,7 @@ use Rekalogika\File\Association\Contracts\FileLocationResolverInterface; -class ObjectNotSupportedException extends FileLocationResolverException +final class ObjectNotSupportedException extends FileLocationResolverException { /** * @param class-string $class diff --git a/packages/file-association/src/Exception/ObjectIdResolver/ChainedObjectIdResolverException.php b/packages/file-association/src/Exception/ObjectIdResolver/ChainedObjectIdResolverException.php index 1c034d6..0af94f2 100644 --- a/packages/file-association/src/Exception/ObjectIdResolver/ChainedObjectIdResolverException.php +++ b/packages/file-association/src/Exception/ObjectIdResolver/ChainedObjectIdResolverException.php @@ -13,7 +13,7 @@ namespace Rekalogika\File\Association\Exception\ObjectIdResolver; -class ChainedObjectIdResolverException extends ObjectIdResolverException +final class ChainedObjectIdResolverException extends ObjectIdResolverException { /** * @param iterable $exceptions diff --git a/packages/file-association/src/Exception/ObjectIdResolver/EmptyIdException.php b/packages/file-association/src/Exception/ObjectIdResolver/EmptyIdException.php index ce2ee58..9786222 100644 --- a/packages/file-association/src/Exception/ObjectIdResolver/EmptyIdException.php +++ b/packages/file-association/src/Exception/ObjectIdResolver/EmptyIdException.php @@ -13,7 +13,7 @@ namespace Rekalogika\File\Association\Exception\ObjectIdResolver; -class EmptyIdException extends ObjectIdResolverException +final class EmptyIdException extends ObjectIdResolverException { public function __construct( object $object, diff --git a/packages/file-association/src/Exception/ObjectIdResolver/IdNotSupportedException.php b/packages/file-association/src/Exception/ObjectIdResolver/IdNotSupportedException.php index 13d3eab..e3d3c61 100644 --- a/packages/file-association/src/Exception/ObjectIdResolver/IdNotSupportedException.php +++ b/packages/file-association/src/Exception/ObjectIdResolver/IdNotSupportedException.php @@ -13,7 +13,7 @@ namespace Rekalogika\File\Association\Exception\ObjectIdResolver; -class IdNotSupportedException extends ObjectIdResolverException +final class IdNotSupportedException extends ObjectIdResolverException { public function __construct( object $object, diff --git a/packages/file-association/src/Exception/ObjectIdResolver/MethodNotFoundException.php b/packages/file-association/src/Exception/ObjectIdResolver/MethodNotFoundException.php index eac97eb..0c454b7 100644 --- a/packages/file-association/src/Exception/ObjectIdResolver/MethodNotFoundException.php +++ b/packages/file-association/src/Exception/ObjectIdResolver/MethodNotFoundException.php @@ -13,7 +13,7 @@ namespace Rekalogika\File\Association\Exception\ObjectIdResolver; -class MethodNotFoundException extends ObjectIdResolverException +final class MethodNotFoundException extends ObjectIdResolverException { public function __construct( object $object, diff --git a/packages/file-association/src/Exception/ObjectIdResolver/ObjectNotSupportedException.php b/packages/file-association/src/Exception/ObjectIdResolver/ObjectNotSupportedException.php index 7c8550a..973500b 100644 --- a/packages/file-association/src/Exception/ObjectIdResolver/ObjectNotSupportedException.php +++ b/packages/file-association/src/Exception/ObjectIdResolver/ObjectNotSupportedException.php @@ -13,7 +13,7 @@ namespace Rekalogika\File\Association\Exception\ObjectIdResolver; -class ObjectNotSupportedException extends ObjectIdResolverException +final class ObjectNotSupportedException extends ObjectIdResolverException { public function __construct( object $object, diff --git a/packages/file-association/src/Exception/PropertyInspector/MissingPropertyException.php b/packages/file-association/src/Exception/PropertyInspector/MissingPropertyException.php index d7e07d2..a3b4378 100644 --- a/packages/file-association/src/Exception/PropertyInspector/MissingPropertyException.php +++ b/packages/file-association/src/Exception/PropertyInspector/MissingPropertyException.php @@ -13,7 +13,7 @@ namespace Rekalogika\File\Association\Exception\PropertyInspector; -class MissingPropertyException extends PropertyInspectorException +final class MissingPropertyException extends PropertyInspectorException { public function __construct( string $propertyName, diff --git a/packages/file-association/src/Exception/PropertyReader/PropertyReaderException.php b/packages/file-association/src/Exception/PropertyReader/PropertyReaderException.php index 179966f..6bffdf3 100644 --- a/packages/file-association/src/Exception/PropertyReader/PropertyReaderException.php +++ b/packages/file-association/src/Exception/PropertyReader/PropertyReaderException.php @@ -15,7 +15,7 @@ use Rekalogika\File\Association\Exception\FileAssociationException; -class PropertyReaderException extends FileAssociationException +final class PropertyReaderException extends FileAssociationException { public function __construct( object $object, diff --git a/packages/file-association/src/Exception/PropertyWriter/PropertyWriterException.php b/packages/file-association/src/Exception/PropertyWriter/PropertyWriterException.php index 06e646f..6fd28b2 100644 --- a/packages/file-association/src/Exception/PropertyWriter/PropertyWriterException.php +++ b/packages/file-association/src/Exception/PropertyWriter/PropertyWriterException.php @@ -15,7 +15,7 @@ use Rekalogika\File\Association\Exception\FileAssociationException; -class PropertyWriterException extends FileAssociationException +final class PropertyWriterException extends FileAssociationException { /** * @param object|array $object diff --git a/packages/file-association/src/FileLocationResolver/ChainedFileLocationResolver.php b/packages/file-association/src/FileLocationResolver/ChainedFileLocationResolver.php index afec9c2..a27f352 100644 --- a/packages/file-association/src/FileLocationResolver/ChainedFileLocationResolver.php +++ b/packages/file-association/src/FileLocationResolver/ChainedFileLocationResolver.php @@ -18,7 +18,7 @@ use Rekalogika\File\Association\Exception\FileLocationResolver\ChainedObjectNotSupportedException; use Rekalogika\File\Association\Exception\FileLocationResolver\ObjectNotSupportedException; -class ChainedFileLocationResolver implements FileLocationResolverInterface +final class ChainedFileLocationResolver implements FileLocationResolverInterface { /** * @param iterable $fileLocationResolvers diff --git a/packages/file-association/src/FileLocationResolver/DefaultFileLocationResolver.php b/packages/file-association/src/FileLocationResolver/DefaultFileLocationResolver.php index ba83650..f74e96d 100644 --- a/packages/file-association/src/FileLocationResolver/DefaultFileLocationResolver.php +++ b/packages/file-association/src/FileLocationResolver/DefaultFileLocationResolver.php @@ -18,7 +18,7 @@ use Rekalogika\File\Association\Contracts\ObjectIdResolverInterface; use Rekalogika\File\Association\Model\FilePointer; -class DefaultFileLocationResolver implements FileLocationResolverInterface +final class DefaultFileLocationResolver implements FileLocationResolverInterface { public function __construct( private readonly ObjectIdResolverInterface $objectIdResolver, diff --git a/packages/file-association/src/Model/FilePointer.php b/packages/file-association/src/Model/FilePointer.php index d431e78..0e1da0c 100644 --- a/packages/file-association/src/Model/FilePointer.php +++ b/packages/file-association/src/Model/FilePointer.php @@ -20,7 +20,7 @@ * An implementation of FilePointerInterface. We don't use the one in the * rekalogika/file package so that this package does not have to depend on that. */ -class FilePointer implements FilePointerInterface +final class FilePointer implements FilePointerInterface { use EqualityTrait; diff --git a/packages/file-association/src/Model/MissingFile.php b/packages/file-association/src/Model/MissingFile.php index b13c487..23aa8fa 100644 --- a/packages/file-association/src/Model/MissingFile.php +++ b/packages/file-association/src/Model/MissingFile.php @@ -24,7 +24,7 @@ * A null file that indicates the file is expected to exist, but missing in the * storage backend. */ -class MissingFile extends \Exception implements NullFileInterface +final class MissingFile extends \Exception implements NullFileInterface { use NullFileTrait; diff --git a/packages/file-association/src/ObjectIdResolver/ChainedObjectIdResolver.php b/packages/file-association/src/ObjectIdResolver/ChainedObjectIdResolver.php index c80e685..2c6aeb8 100644 --- a/packages/file-association/src/ObjectIdResolver/ChainedObjectIdResolver.php +++ b/packages/file-association/src/ObjectIdResolver/ChainedObjectIdResolver.php @@ -17,7 +17,7 @@ use Rekalogika\File\Association\Exception\ObjectIdResolver\ChainedObjectIdResolverException; use Rekalogika\File\Association\Exception\ObjectIdResolver\ObjectIdResolverException; -class ChainedObjectIdResolver implements ObjectIdResolverInterface +final class ChainedObjectIdResolver implements ObjectIdResolverInterface { /** * @var \WeakMap @@ -40,6 +40,7 @@ public function __construct( public function getObjectId(object $object): string { if (isset($this->cache[$object])) { + /** @var string */ return $this->cache[$object]; } diff --git a/packages/file-association/src/ObjectIdResolver/DefaultObjectIdResolver.php b/packages/file-association/src/ObjectIdResolver/DefaultObjectIdResolver.php index a51a34a..90703a1 100644 --- a/packages/file-association/src/ObjectIdResolver/DefaultObjectIdResolver.php +++ b/packages/file-association/src/ObjectIdResolver/DefaultObjectIdResolver.php @@ -18,7 +18,7 @@ use Rekalogika\File\Association\Exception\ObjectIdResolver\IdNotSupportedException; use Rekalogika\File\Association\Exception\ObjectIdResolver\MethodNotFoundException; -class DefaultObjectIdResolver implements ObjectIdResolverInterface +final class DefaultObjectIdResolver implements ObjectIdResolverInterface { public function __construct( private readonly string $method = 'getId', diff --git a/packages/file-association/src/ObjectIdResolver/DoctrineObjectIdResolver.php b/packages/file-association/src/ObjectIdResolver/DoctrineObjectIdResolver.php index b682d23..6f34b9c 100644 --- a/packages/file-association/src/ObjectIdResolver/DoctrineObjectIdResolver.php +++ b/packages/file-association/src/ObjectIdResolver/DoctrineObjectIdResolver.php @@ -23,7 +23,7 @@ * * @todo this code is untested */ -class DoctrineObjectIdResolver implements ObjectIdResolverInterface +final class DoctrineObjectIdResolver implements ObjectIdResolverInterface { public function __construct( private readonly ManagerRegistry $managerRegistry, @@ -40,7 +40,6 @@ public function getObjectId(object $object): string } if (method_exists($objectManager, 'getUnitOfWork')) { - /** @var UnitOfWork */ $unitOfWork = $objectManager->getUnitOfWork(); if (!$unitOfWork instanceof UnitOfWork) { throw new \LogicException('Expected Doctrine\ORM\UnitOfWork'); diff --git a/packages/file-association/src/PropertyInspector/PropertyInspector.php b/packages/file-association/src/PropertyInspector/PropertyInspector.php index f81561f..1e421ef 100644 --- a/packages/file-association/src/PropertyInspector/PropertyInspector.php +++ b/packages/file-association/src/PropertyInspector/PropertyInspector.php @@ -18,7 +18,7 @@ use Rekalogika\File\Association\Exception\PropertyInspector\MissingPropertyException; use Rekalogika\File\Association\Model\PropertyInspectorResult; -class PropertyInspector implements PropertyInspectorInterface +final class PropertyInspector implements PropertyInspectorInterface { /** * @var array @@ -68,10 +68,6 @@ public function inspect(object $object, string $propertyName): PropertyInspector $attribute = $attributes[0]->newInstance(); - if (!$attribute instanceof AsFileAssociation) { - throw new \LogicException('Attribute must be instance of ' . AsFileAssociation::class); - } - return $this->cache[$cacheKey] = new PropertyInspectorResult( mandatory: $mandatory, fetch: $attribute->fetch, diff --git a/packages/file-association/src/PropertyLister/AttributesPropertyLister.php b/packages/file-association/src/PropertyLister/AttributesPropertyLister.php index 011170a..eecbf71 100644 --- a/packages/file-association/src/PropertyLister/AttributesPropertyLister.php +++ b/packages/file-association/src/PropertyLister/AttributesPropertyLister.php @@ -20,7 +20,7 @@ * Determines all the file association properties by looking at * AsFileAssociation attributes. */ -class AttributesPropertyLister implements PropertyListerInterface +final class AttributesPropertyLister implements PropertyListerInterface { /** * @var array> diff --git a/packages/file-association/src/PropertyLister/ChainPropertyLister.php b/packages/file-association/src/PropertyLister/ChainPropertyLister.php index ea2be4c..a1d3e9c 100644 --- a/packages/file-association/src/PropertyLister/ChainPropertyLister.php +++ b/packages/file-association/src/PropertyLister/ChainPropertyLister.php @@ -18,7 +18,7 @@ /** * Chains multiple property listers */ -class ChainPropertyLister implements PropertyListerInterface +final class ChainPropertyLister implements PropertyListerInterface { /** * @param iterable $propertyListers diff --git a/packages/file-association/src/PropertyLister/FileAssociationInterfacePropertyLister.php b/packages/file-association/src/PropertyLister/FileAssociationInterfacePropertyLister.php index 162b76a..37e6918 100644 --- a/packages/file-association/src/PropertyLister/FileAssociationInterfacePropertyLister.php +++ b/packages/file-association/src/PropertyLister/FileAssociationInterfacePropertyLister.php @@ -20,7 +20,7 @@ * Determines applicable file association properties by using * FileAssociationInterface. */ -class FileAssociationInterfacePropertyLister implements PropertyListerInterface +final class FileAssociationInterfacePropertyLister implements PropertyListerInterface { #[\Override] public function getFileProperties(object $object): iterable diff --git a/packages/file-association/src/PropertyReaderWriter/SymfonyPropertyAccessorBridge.php b/packages/file-association/src/PropertyReaderWriter/SymfonyPropertyAccessorBridge.php index 088715e..ac9375a 100644 --- a/packages/file-association/src/PropertyReaderWriter/SymfonyPropertyAccessorBridge.php +++ b/packages/file-association/src/PropertyReaderWriter/SymfonyPropertyAccessorBridge.php @@ -22,7 +22,7 @@ use Symfony\Component\PropertyAccess\Exception\UnexpectedTypeException; use Symfony\Component\PropertyAccess\PropertyAccessorInterface as SymfonyPropertyAccessorInterface; -class SymfonyPropertyAccessorBridge implements +final class SymfonyPropertyAccessorBridge implements PropertyReaderInterface, PropertyWriterInterface { @@ -35,7 +35,7 @@ public function write(object $object, string $propertyName, mixed $value): void { try { $this->propertyAccessor->setValue($object, $propertyName, $value); - } catch (InvalidArgumentException | AccessException | UnexpectedTypeException | \TypeError $e) { + } catch (InvalidArgumentException | AccessException | UnexpectedTypeException $e) { throw new PropertyWriterException($object, $propertyName, $value, $e); } } @@ -45,7 +45,7 @@ public function read(object $object, string $propertyName): mixed { try { return $this->propertyAccessor->getValue($object, $propertyName); - } catch (InvalidArgumentException | AccessException | UnexpectedTypeException | \TypeError $e) { + } catch (InvalidArgumentException | AccessException | UnexpectedTypeException $e) { throw new PropertyReaderException($object, $propertyName, $e); } } diff --git a/packages/file-association/src/Reconstitutor/AttributeReconstitutor.php b/packages/file-association/src/Reconstitutor/AttributeReconstitutor.php index 745f51c..497be12 100644 --- a/packages/file-association/src/Reconstitutor/AttributeReconstitutor.php +++ b/packages/file-association/src/Reconstitutor/AttributeReconstitutor.php @@ -20,7 +20,7 @@ /** * Reconstitutes objects with WithFileAssociation attribute */ -class AttributeReconstitutor implements AttributeReconstitutorInterface +final class AttributeReconstitutor implements AttributeReconstitutorInterface { public function __construct( private readonly FileAssociationManager $fileAssociationManager, diff --git a/packages/file-association/src/Reconstitutor/InterfaceReconstitutor.php b/packages/file-association/src/Reconstitutor/InterfaceReconstitutor.php index b8814f7..ce7b6ca 100644 --- a/packages/file-association/src/Reconstitutor/InterfaceReconstitutor.php +++ b/packages/file-association/src/Reconstitutor/InterfaceReconstitutor.php @@ -22,7 +22,7 @@ * * @implements ClassReconstitutorInterface */ -class InterfaceReconstitutor implements ClassReconstitutorInterface +final class InterfaceReconstitutor implements ClassReconstitutorInterface { public function __construct( private readonly FileAssociationManager $fileAssociationService, diff --git a/packages/file-bundle/composer.json b/packages/file-bundle/composer.json index c5092ea..ab02d20 100644 --- a/packages/file-bundle/composer.json +++ b/packages/file-bundle/composer.json @@ -28,8 +28,8 @@ "league/flysystem": "^3.16", "league/flysystem-local": "^3.16", "psr/container": "^2.0", - "rekalogika/file": "^1.11", - "rekalogika/file-contracts": "^1.11", + "rekalogika/file": "^1.12", + "rekalogika/file-contracts": "^1.12", "symfony/config": "^6.2 || ^7.0", "symfony/dependency-injection": "^6.2 || ^7.0", "symfony/http-kernel": "^6.2 || ^7.0" @@ -46,7 +46,7 @@ }, "extra": { "branch-alias": { - "dev-main": "1.12-dev" + "dev-main": "1.13-dev" } } } diff --git a/packages/file-bundle/config/file-association.php b/packages/file-bundle/config/file-association.php index 7dc652d..e5faacd 100644 --- a/packages/file-bundle/config/file-association.php +++ b/packages/file-bundle/config/file-association.php @@ -14,6 +14,7 @@ use Doctrine\Persistence\ManagerRegistry; use Rekalogika\Contracts\File\FileRepositoryInterface; use Rekalogika\DirectPropertyAccess\DirectPropertyAccessor; +use Rekalogika\File\Association\Command\FileLocationResolverCommand; use Rekalogika\File\Association\Contracts\FileLocationResolverInterface; use Rekalogika\File\Association\Contracts\ObjectIdResolverInterface; use Rekalogika\File\Association\Contracts\PropertyInspectorInterface; @@ -163,4 +164,15 @@ // $services->set(PropertyInspectorInterface::class, PropertyInspector::class); + + // + // commands + // + + $services->set(FileLocationResolverCommand::class) + ->args([ + '$managerRegistry' => service('doctrine'), + '$fileLocationResolver' => service(FileLocationResolverInterface::class), + ]) + ->tag('console.command'); }; diff --git a/packages/file-bundle/src/DefaultFilesystemFactory.php b/packages/file-bundle/src/DefaultFilesystemFactory.php index 56460c0..2b98164 100644 --- a/packages/file-bundle/src/DefaultFilesystemFactory.php +++ b/packages/file-bundle/src/DefaultFilesystemFactory.php @@ -21,7 +21,7 @@ * Provides a good default, ready-to-use filesystem post-installation without * any dependency except on Flysystem. */ -class DefaultFilesystemFactory +final class DefaultFilesystemFactory { private ?FilesystemOperator $filesystem = null; diff --git a/packages/file-bundle/src/DependencyInjection/Configuration.php b/packages/file-bundle/src/DependencyInjection/Configuration.php index 33d8f3a..dba12c7 100644 --- a/packages/file-bundle/src/DependencyInjection/Configuration.php +++ b/packages/file-bundle/src/DependencyInjection/Configuration.php @@ -16,7 +16,7 @@ use Symfony\Component\Config\Definition\Builder\TreeBuilder; use Symfony\Component\Config\Definition\ConfigurationInterface; -class Configuration implements ConfigurationInterface +final class Configuration implements ConfigurationInterface { #[\Override] public function getConfigTreeBuilder(): TreeBuilder diff --git a/packages/file-bundle/src/DependencyInjection/FilterPass.php b/packages/file-bundle/src/DependencyInjection/FilterPass.php index 974106a..dd56bdc 100644 --- a/packages/file-bundle/src/DependencyInjection/FilterPass.php +++ b/packages/file-bundle/src/DependencyInjection/FilterPass.php @@ -18,7 +18,7 @@ use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; -class FilterPass implements CompilerPassInterface +final class FilterPass implements CompilerPassInterface { #[\Override] public function process(ContainerBuilder $container): void diff --git a/packages/file-bundle/src/DependencyInjection/RekalogikaFileExtension.php b/packages/file-bundle/src/DependencyInjection/RekalogikaFileExtension.php index b0f47f5..3fd2374 100644 --- a/packages/file-bundle/src/DependencyInjection/RekalogikaFileExtension.php +++ b/packages/file-bundle/src/DependencyInjection/RekalogikaFileExtension.php @@ -32,7 +32,7 @@ use Symfony\Component\DependencyInjection\Loader\PhpFileLoader; use Symfony\Component\DependencyInjection\Reference; -class RekalogikaFileExtension extends Extension implements PrependExtensionInterface +final class RekalogikaFileExtension extends Extension implements PrependExtensionInterface { #[\Override] public function load(array $configs, ContainerBuilder $container): void diff --git a/packages/file-bundle/src/DependencyInjection/RemoveUnusedPass.php b/packages/file-bundle/src/DependencyInjection/RemoveUnusedPass.php new file mode 100644 index 0000000..b953f69 --- /dev/null +++ b/packages/file-bundle/src/DependencyInjection/RemoveUnusedPass.php @@ -0,0 +1,33 @@ + + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +namespace Rekalogika\File\Bundle\DependencyInjection; + +use Rekalogika\File\Association\Command\FileLocationResolverCommand; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\DependencyInjection\ContainerBuilder; + +final class RemoveUnusedPass implements CompilerPassInterface +{ + #[\Override] + public function process(ContainerBuilder $container): void + { + if ( + !class_exists(Command::class) + || !$container->hasDefinition('doctrine') + ) { + $container->removeDefinition(FileLocationResolverCommand::class); + } + } +} diff --git a/packages/file-bundle/src/RekalogikaFileBundle.php b/packages/file-bundle/src/RekalogikaFileBundle.php index eb324de..3d774dc 100644 --- a/packages/file-bundle/src/RekalogikaFileBundle.php +++ b/packages/file-bundle/src/RekalogikaFileBundle.php @@ -14,10 +14,11 @@ namespace Rekalogika\File\Bundle; use Rekalogika\File\Bundle\DependencyInjection\FilterPass; +use Rekalogika\File\Bundle\DependencyInjection\RemoveUnusedPass; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\HttpKernel\Bundle\Bundle; -class RekalogikaFileBundle extends Bundle +final class RekalogikaFileBundle extends Bundle { #[\Override] public function getPath(): string @@ -30,6 +31,9 @@ public function build(ContainerBuilder $container): void { parent::build($container); - $container->addCompilerPass(new FilterPass()); + $container + ->addCompilerPass(new FilterPass()) + ->addCompilerPass(new RemoveUnusedPass()) + ; } } diff --git a/packages/file-contracts/composer.json b/packages/file-contracts/composer.json index 468dee1..7c91a82 100644 --- a/packages/file-contracts/composer.json +++ b/packages/file-contracts/composer.json @@ -32,7 +32,7 @@ }, "extra": { "branch-alias": { - "dev-main": "1.12-dev" + "dev-main": "1.13-dev" } } } diff --git a/packages/file-contracts/src/Exception/File/DerivationNotSupportedException.php b/packages/file-contracts/src/Exception/File/DerivationNotSupportedException.php index 6978431..3c49e1e 100644 --- a/packages/file-contracts/src/Exception/File/DerivationNotSupportedException.php +++ b/packages/file-contracts/src/Exception/File/DerivationNotSupportedException.php @@ -13,4 +13,4 @@ namespace Rekalogika\Contracts\File\Exception\File; -class DerivationNotSupportedException extends FileException {} +final class DerivationNotSupportedException extends FileException {} diff --git a/packages/file-contracts/src/Exception/File/FatalErrorException.php b/packages/file-contracts/src/Exception/File/FatalErrorException.php index c835e3a..f3177b6 100644 --- a/packages/file-contracts/src/Exception/File/FatalErrorException.php +++ b/packages/file-contracts/src/Exception/File/FatalErrorException.php @@ -13,4 +13,4 @@ namespace Rekalogika\Contracts\File\Exception\File; -class FatalErrorException extends FileException {} +final class FatalErrorException extends FileException {} diff --git a/packages/file-contracts/src/Exception/File/FileNotFoundException.php b/packages/file-contracts/src/Exception/File/FileNotFoundException.php index ebf373d..181df8e 100644 --- a/packages/file-contracts/src/Exception/File/FileNotFoundException.php +++ b/packages/file-contracts/src/Exception/File/FileNotFoundException.php @@ -13,7 +13,7 @@ namespace Rekalogika\Contracts\File\Exception\File; -class FileNotFoundException extends FileException +final class FileNotFoundException extends FileException { public function __construct( string $key, diff --git a/packages/file-contracts/src/Exception/File/LocalTemporaryFileException.php b/packages/file-contracts/src/Exception/File/LocalTemporaryFileException.php index 617b3a9..0aa7d02 100644 --- a/packages/file-contracts/src/Exception/File/LocalTemporaryFileException.php +++ b/packages/file-contracts/src/Exception/File/LocalTemporaryFileException.php @@ -13,4 +13,4 @@ namespace Rekalogika\Contracts\File\Exception\File; -class LocalTemporaryFileException extends FileException {} +final class LocalTemporaryFileException extends FileException {} diff --git a/packages/file-contracts/src/Exception/File/NullFileOperationException.php b/packages/file-contracts/src/Exception/File/NullFileOperationException.php index 80acbfd..f35c167 100644 --- a/packages/file-contracts/src/Exception/File/NullFileOperationException.php +++ b/packages/file-contracts/src/Exception/File/NullFileOperationException.php @@ -18,4 +18,4 @@ * involving a null file that will potentially cause a side effect should throw * this exception. */ -class NullFileOperationException extends FileException {} +final class NullFileOperationException extends FileException {} diff --git a/packages/file-contracts/src/Exception/File/TemporaryFileException.php b/packages/file-contracts/src/Exception/File/TemporaryFileException.php index 920e7ef..647b52e 100644 --- a/packages/file-contracts/src/Exception/File/TemporaryFileException.php +++ b/packages/file-contracts/src/Exception/File/TemporaryFileException.php @@ -13,7 +13,7 @@ namespace Rekalogika\Contracts\File\Exception\File; -class TemporaryFileException extends FileException +final class TemporaryFileException extends FileException { public function __construct( string $prefix, diff --git a/packages/file-contracts/src/Exception/FileRepository/AdHocFilesystemException.php b/packages/file-contracts/src/Exception/FileRepository/AdHocFilesystemException.php index fe4f8a3..fca80fb 100644 --- a/packages/file-contracts/src/Exception/FileRepository/AdHocFilesystemException.php +++ b/packages/file-contracts/src/Exception/FileRepository/AdHocFilesystemException.php @@ -15,7 +15,7 @@ use Rekalogika\Contracts\File\FileInterface; -class AdHocFilesystemException extends FileRepositoryException +final class AdHocFilesystemException extends FileRepositoryException { public function __construct( FileInterface $file, diff --git a/packages/file-contracts/src/Exception/MetadataNotFoundException.php b/packages/file-contracts/src/Exception/MetadataNotFoundException.php index aba8bac..658ac27 100644 --- a/packages/file-contracts/src/Exception/MetadataNotFoundException.php +++ b/packages/file-contracts/src/Exception/MetadataNotFoundException.php @@ -13,7 +13,7 @@ namespace Rekalogika\Contracts\File\Exception; -class MetadataNotFoundException extends \Exception +final class MetadataNotFoundException extends \Exception { public function __construct(string $metadataName, ?\Throwable $previous = null) { diff --git a/packages/file-contracts/src/FileProxy.php b/packages/file-contracts/src/FileProxy.php index 4633c4a..2d6a831 100644 --- a/packages/file-contracts/src/FileProxy.php +++ b/packages/file-contracts/src/FileProxy.php @@ -86,6 +86,7 @@ private function load(): void } } + #[\Override] protected function getWrapped(): FileInterface { $this->load(); diff --git a/packages/file-derivation/composer.json b/packages/file-derivation/composer.json index ee6283b..3376872 100644 --- a/packages/file-derivation/composer.json +++ b/packages/file-derivation/composer.json @@ -21,11 +21,11 @@ } }, "require": { - "rekalogika/file-contracts": "^1.11" + "rekalogika/file-contracts": "^1.12" }, "extra": { "branch-alias": { - "dev-main": "1.12-dev" + "dev-main": "1.13-dev" } } } diff --git a/packages/file-filepond/assets/package-lock.json b/packages/file-filepond/assets/package-lock.json index de17e5a..1e481f0 100644 --- a/packages/file-filepond/assets/package-lock.json +++ b/packages/file-filepond/assets/package-lock.json @@ -9,7 +9,7 @@ "version": "1.6.0", "license": "MIT", "dependencies": { - "filepond": "^4.31.4", + "filepond": "^4.32.7", "filepond-plugin-file-encode": "^2.1.11", "filepond-plugin-file-metadata": "^1.0.8", "filepond-plugin-file-poster": "^2.5.1", @@ -24,10 +24,10 @@ "filepond-plugin-image-validate-size": "^1.2.7" }, "devDependencies": { - "@babel/cli": "^7.25", - "@babel/core": "^7.25", + "@babel/cli": "^7.26", + "@babel/core": "^7.26", "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/preset-env": "^7.25.4", + "@babel/preset-env": "^7.26.9", "@hotwired/stimulus": "^3.0" }, "peerDependencies": { @@ -48,10 +48,11 @@ } }, "node_modules/@babel/cli": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.25.7.tgz", - "integrity": "sha512-vQw4QjrqjLSuL0Tt3gfVXbxEHOfsCcHN8tKyTclpSMYLq3Bp0BTzWYZfMKBs3PQ+to8q3BnumBIAsMdOqDJ6nw==", + "version": "7.26.4", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.26.4.tgz", + "integrity": "sha512-+mORf3ezU3p3qr+82WvJSnQNE1GAYeoCfEv4fik6B5/2cvKZ75AX8oawWQdXtM9MmndooQj15Jr9kelRFWsuRw==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "commander": "^6.2.0", @@ -77,12 +78,14 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", - "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { @@ -90,30 +93,32 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.7.tgz", - "integrity": "sha512-9ickoLz+hcXCeh7jrcin+/SLWm+GkxE2kTvoYyp38p4WkdFXfQJxDFGWp/YHjiKLPx06z2A7W8XKuqbReXDzsw==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz", - "integrity": "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz", + "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.25.7", - "@babel/generator": "^7.25.7", - "@babel/helper-compilation-targets": "^7.25.7", - "@babel/helper-module-transforms": "^7.25.7", - "@babel/helpers": "^7.25.7", - "@babel/parser": "^7.25.7", - "@babel/template": "^7.25.7", - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.9", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.9", + "@babel/parser": "^7.26.9", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.9", + "@babel/types": "^7.26.9", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -129,12 +134,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", - "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz", + "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.25.7", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -144,38 +151,26 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz", - "integrity": "sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", "dev": true, "dependencies": { - "@babel/types": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.7.tgz", - "integrity": "sha512-12xfNeKNH7jubQNm7PAkzlLwEmCs1tfuX3UjIw6vP6QXi+leKh6+LyC/+Ed4EIQermwd58wsyh070yjDHFlNGg==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz", - "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.7", - "@babel/helper-validator-option": "^7.25.7", + "@babel/compat-data": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -185,17 +180,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.7.tgz", - "integrity": "sha512-bD4WQhbkx80mAyj/WCm4ZHcF4rDxkoLFO6ph8/5/mQ3z4vAzltQXAmbc7GvVJx5H+lk5Mi5EmbTeox5nMGCsbw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", + "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.7", - "@babel/helper-member-expression-to-functions": "^7.25.7", - "@babel/helper-optimise-call-expression": "^7.25.7", - "@babel/helper-replace-supers": "^7.25.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", - "@babel/traverse": "^7.25.7", + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.25.9", "semver": "^6.3.1" }, "engines": { @@ -206,12 +201,12 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.7.tgz", - "integrity": "sha512-byHhumTj/X47wJ6C6eLpK7wW/WBEcnUeb7D0FNc/jFQnQVw7DOso3Zz5u9x/zLrFVkHa89ZGDbkAa1D54NdrCQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz", + "integrity": "sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-annotate-as-pure": "^7.25.9", "regexpu-core": "^6.1.1", "semver": "^6.3.1" }, @@ -223,10 +218,11 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", - "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz", + "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-plugin-utils": "^7.22.5", @@ -239,41 +235,40 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.7.tgz", - "integrity": "sha512-O31Ssjd5K6lPbTX9AAYpSKrZmLeagt9uwschJd+Ixo6QiRyfpvgtVQp8qrDR9UNFjZ8+DO34ZkdrN+BnPXemeA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", "dev": true, "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz", - "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dev": true, "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz", - "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.25.7", - "@babel/helper-simple-access": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "@babel/traverse": "^7.25.7" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -283,35 +278,36 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.7.tgz", - "integrity": "sha512-VAwcwuYhv/AT+Vfr28c9y6SHzTan1ryqrydSTFGjU0uDJHw3uZ+PduI8plCLkRsDnqK2DMEDmwrOQRsK/Ykjng==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", "dev": true, "dependencies": { - "@babel/types": "^7.25.7" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz", - "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.7.tgz", - "integrity": "sha512-kRGE89hLnPfcz6fTrlNU+uhgcwv0mBE4Gv3P9Ke9kLVJYpi4AMVVEElXvB5CabrPZW4nCM8P8UyyjrzCM0O2sw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.7", - "@babel/helper-wrap-function": "^7.25.7", - "@babel/traverse": "^7.25.7" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -321,14 +317,14 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.7.tgz", - "integrity": "sha512-iy8JhqlUW9PtZkd4pHM96v6BdJ66Ba9yWSE4z0W4TvSZwLBPkyDsiIU3ENe4SmrzRBs76F7rQXTy1lYC49n6Lw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", + "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", "dev": true, "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.25.7", - "@babel/helper-optimise-call-expression": "^7.25.7", - "@babel/traverse": "^7.25.7" + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -337,108 +333,82 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz", - "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.7.tgz", - "integrity": "sha512-pPbNbchZBkPMD50K0p3JGcFMNLVUCuU/ABybm/PGNj4JiHrpmNyqqCphBk4i19xXtNV0JhldQJJtbSW5aUvbyA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", "dev": true, "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", - "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", - "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz", - "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.7.tgz", - "integrity": "sha512-MA0roW3JF2bD1ptAaJnvcabsVlNQShUaThyJbCDD4bCp8NEgiFvpoqRI2YS22hHlc2thjO/fTg2ShLMC3jygAg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", "dev": true, "dependencies": { - "@babel/template": "^7.25.7", - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.7.tgz", - "integrity": "sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==", - "dev": true, - "dependencies": { - "@babel/template": "^7.25.7", - "@babel/types": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", - "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz", + "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.7.tgz", - "integrity": "sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", + "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.25.7" + "@babel/types": "^7.26.9" }, "bin": { "parser": "bin/babel-parser.js" @@ -448,13 +418,13 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.7.tgz", - "integrity": "sha512-UV9Lg53zyebzD1DwQoT9mzkEKa922LNUp5YkTJ6Uta0RbyXaQNUgcvSt7qIu1PpPzVb6rd10OVNTzkyBGeVmxQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", + "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/traverse": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -464,12 +434,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.7.tgz", - "integrity": "sha512-GDDWeVLNxRIkQTnJn2pDOM1pkCgYdSqPeT1a9vh9yIqu2uzzgw1zcqEb+IJOhy+dTBMlNdThrDIksr2o09qrrQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", + "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -479,12 +449,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.7.tgz", - "integrity": "sha512-wxyWg2RYaSUYgmd9MR0FyRGyeOMQE/Uzr1wzd/g5cf5bwi9A4v6HFdDm7y1MgDtod/fLOSTZY6jDgV0xU9d5bA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", + "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -494,14 +464,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.7.tgz", - "integrity": "sha512-Xwg6tZpLxc4iQjorYsyGMyfJE7nP5MV8t/Ka58BgiA7Jw0fRqQNcANlLfdJ/yvBt9z9LD2We+BEkT7vLqZRWng==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", - "@babel/plugin-transform-optional-chaining": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -511,13 +481,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.7.tgz", - "integrity": "sha512-UVATLMidXrnH+GMUIuxq55nejlj02HP7F5ETyBONzP6G87fPBogG4CH6kxrSrdIuAjdwNO9VzyaYsrZPscWUrw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", + "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/traverse": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -555,76 +525,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.7.tgz", - "integrity": "sha512-ZvZQRmME0zfJnDQnVBKYzHxXT7lYBB3Revz1GuS7oLXWMgqUPX4G+DDbT30ICClht9WKV34QVrZhSw6WdklwZQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -634,138 +541,12 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.7.tgz", - "integrity": "sha512-AqVo+dguCgmpi/3mYBdu9lkngOBlQ2w2vnNpa6gfiCxQZLzV4ZbhsXitJ2Yblkoe1VQwtHSaNmIaGll/26YWRw==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -791,12 +572,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.7.tgz", - "integrity": "sha512-EJN2mKxDwfOUCPxMO6MUI58RN3ganiRAG/MS/S3HfB6QFNjroAMelQo/gybyYq97WerCBAZoyrAoW8Tzdq2jWg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -806,15 +587,15 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.7.tgz", - "integrity": "sha512-4B6OhTrwYKHYYgcwErvZjbmH9X5TxQBsaBHdzEIB4l71gR5jh/tuHGlb9in47udL2+wVUcOz5XXhhfhVJwEpEg==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz", + "integrity": "sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-remap-async-to-generator": "^7.25.7", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/traverse": "^7.25.7" + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.26.8" }, "engines": { "node": ">=6.9.0" @@ -824,14 +605,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.7.tgz", - "integrity": "sha512-ZUCjAavsh5CESCmi/xCpX1qcCaAglzs/7tmuvoFnJgA1dM7gQplsguljoTg+Ru8WENpX89cQyAtWoaE0I3X3Pg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-remap-async-to-generator": "^7.25.7" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -841,12 +622,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.7.tgz", - "integrity": "sha512-xHttvIM9fvqW+0a3tZlYcZYSBpSWzGBFIt/sYG3tcdSzBB8ZeVgz2gBP7Df+sM0N1850jrviYSSeUuc+135dmQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz", + "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -856,12 +638,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.7.tgz", - "integrity": "sha512-ZEPJSkVZaeTFG/m2PARwLZQ+OG0vFIhPlKHK/JdIMy8DbRJ/htz6LRrTFtdzxi9EHmcwbNPAKDnadpNSIW+Aow==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", + "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -871,13 +653,13 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.7.tgz", - "integrity": "sha512-mhyfEW4gufjIqYFo9krXHJ3ElbFLIze5IDp+wQTxoPd+mwFb1NxatNAwmv8Q8Iuxv7Zc+q8EkiMQwc9IhyGf4g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", + "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -887,14 +669,13 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.7.tgz", - "integrity": "sha512-rvUUtoVlkDWtDWxGAiiQj0aNktTPn3eFynBcMC2IhsXweehwgdI9ODe+XjWw515kEmv22sSOTp/rxIRuTiB7zg==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-class-static-block": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -904,16 +685,16 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.7.tgz", - "integrity": "sha512-9j9rnl+YCQY0IGoeipXvnk3niWicIB6kCsWRGLwX241qSXpbA4MKxtp/EdvFxsc4zI5vqfLxzOd0twIJ7I99zg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.7", - "@babel/helper-compilation-targets": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-replace-supers": "^7.25.7", - "@babel/traverse": "^7.25.7", + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", "globals": "^11.1.0" }, "engines": { @@ -924,13 +705,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.7.tgz", - "integrity": "sha512-QIv+imtM+EtNxg/XBKL3hiWjgdLjMOmZ+XzQwSgmBfKbfxUjBzGgVPklUuE55eq5/uVoh8gg3dqlrwR/jw3ZeA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/template": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -940,12 +721,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.7.tgz", - "integrity": "sha512-xKcfLTlJYUczdaM1+epcdh1UGewJqr9zATgrNHcLBcV2QmfvPPEixo/sK/syql9cEmbr7ulu5HMFG5vbbt/sEA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -955,13 +736,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.7.tgz", - "integrity": "sha512-kXzXMMRzAtJdDEgQBLF4oaiT6ZCU3oWHgpARnTKDAqPkDJ+bs3NrZb310YYevR5QlRo3Kn7dzzIdHbZm1VzJdQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -971,12 +752,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.7.tgz", - "integrity": "sha512-by+v2CjoL3aMnWDOyCIg+yxU9KXSRa9tN6MbqggH5xvymmr9p4AMjYkNlQy4brMceBnUyHZ9G8RnpvT8wP7Cfg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -986,13 +767,13 @@ } }, "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.7.tgz", - "integrity": "sha512-HvS6JF66xSS5rNKXLqkk7L9c/jZ/cdIVIcoPVrnl8IsVpLggTjXs8OWekbLHs/VtYDDh5WXnQyeE3PPUGm22MA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1002,13 +783,12 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.7.tgz", - "integrity": "sha512-UvcLuual4h7/GfylKm2IAA3aph9rwvAM2XBA0uPKU3lca+Maai4jBjjEVUS568ld6kJcgbouuumCBhMd/Yz17w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", + "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1018,13 +798,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.7.tgz", - "integrity": "sha512-yjqtpstPfZ0h/y40fAXRv2snciYr0OAoMXY/0ClC7tm4C/nG5NJKmIItlaYlLbIVAWNfrYuy9dq1bE0SbX0PEg==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", + "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1034,13 +814,12 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.7.tgz", - "integrity": "sha512-h3MDAP5l34NQkkNulsTNyjdaR+OiB0Im67VU//sFupouP8Q6m9Spy7l66DcaAQxtmCqGdanPByLsnwFttxKISQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", + "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1050,13 +829,14 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.7.tgz", - "integrity": "sha512-n/TaiBGJxYFWvpJDfsxSj9lEEE44BFM1EPGz4KEiTipTgkoFVVcCmzAL3qA7fdQU96dpo4gGf5HBx/KnDvqiHw==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.26.9.tgz", + "integrity": "sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1066,14 +846,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.7.tgz", - "integrity": "sha512-5MCTNcjCMxQ63Tdu9rxyN6cAWurqfrDZ76qvVPrGYdBxIj+EawuuxTu/+dgJlhK5eRz3v1gLwp6XwS8XaX2NiQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/traverse": "^7.25.7" + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1083,13 +863,12 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.7.tgz", - "integrity": "sha512-Ot43PrL9TEAiCe8C/2erAjXMeVSnE/BLEx6eyrKLNFCCw5jvhTHKyHxdI1pA0kz5njZRYAnMO2KObGqOCRDYSA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", + "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1099,12 +878,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.7.tgz", - "integrity": "sha512-fwzkLrSu2fESR/cm4t6vqd7ebNIopz2QHGtjoU+dswQo/P6lwAG04Q98lliE3jkz/XqnbGFLnUcE0q0CVUf92w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1114,13 +893,12 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.7.tgz", - "integrity": "sha512-iImzbA55BjiovLyG2bggWS+V+OLkaBorNvc/yJoeeDQGztknRnDdYfp2d/UPmunZYEnZi6Lg8QcTmNMHOB0lGA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", + "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1130,12 +908,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.7.tgz", - "integrity": "sha512-Std3kXwpXfRV0QtQy5JJcRpkqP8/wG4XL7hSKZmGlxPlDqmpXtEPRmhF7ztnlTCtUN3eXRUJp+sBEZjaIBVYaw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1145,13 +923,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.7.tgz", - "integrity": "sha512-CgselSGCGzjQvKzghCvDTxKHP3iooenLpJDO842ehn5D2G5fJB222ptnDwQho0WjEvg7zyoxb9P+wiYxiJX5yA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1161,14 +939,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.7.tgz", - "integrity": "sha512-L9Gcahi0kKFYXvweO6n0wc3ZG1ChpSFdgG+eV1WYZ3/dGbJK7vvk91FgGgak8YwRgrCuihF8tE/Xg07EkL5COg==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", + "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-simple-access": "^7.25.7" + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1178,15 +956,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.7.tgz", - "integrity": "sha512-t9jZIvBmOXJsiuyOwhrIGs8dVcD6jDyg2icw1VL4A/g+FnWyJKwUfSSU2nwJuMV2Zqui856El9u+ElB+j9fV1g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "@babel/traverse": "^7.25.7" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1196,13 +974,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.7.tgz", - "integrity": "sha512-p88Jg6QqsaPh+EB7I9GJrIqi1Zt4ZBHUQtjw3z1bzEXcLh6GfPqzZJ6G+G1HBGKUNukT58MnKG7EN7zXQBCODw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1212,13 +990,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.7.tgz", - "integrity": "sha512-BtAT9LzCISKG3Dsdw5uso4oV1+v2NlVXIIomKJgQybotJY3OwCwJmkongjHgwGKoZXd0qG5UZ12JUlDQ07W6Ow==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1228,12 +1006,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.7.tgz", - "integrity": "sha512-CfCS2jDsbcZaVYxRFo2qtavW8SpdzmBXC2LOI4oO0rP+JSRDxxF3inF4GcPsLgfb5FjkhXG5/yR/lxuRs2pySA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1243,13 +1021,13 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.7.tgz", - "integrity": "sha512-FbuJ63/4LEL32mIxrxwYaqjJxpbzxPVQj5a+Ebrc8JICV6YX8nE53jY+K0RZT3um56GoNWgkS2BQ/uLGTjtwfw==", + "version": "7.26.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz", + "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -1259,13 +1037,12 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.7.tgz", - "integrity": "sha512-8CbutzSSh4hmD+jJHIA8vdTNk15kAzOnFLVVgBSMGr28rt85ouT01/rezMecks9pkU939wDInImwCKv4ahU4IA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", + "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1275,15 +1052,14 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.7.tgz", - "integrity": "sha512-1JdVKPhD7Y5PvgfFy0Mv2brdrolzpzSoUq2pr6xsR+m+3viGGeHEokFKsCgOkbeFOQxfB1Vt2F0cPJLRpFI4Zg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", + "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.25.7" + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1293,13 +1069,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.7.tgz", - "integrity": "sha512-pWT6UXCEW3u1t2tcAGtE15ornCBvopHj9Bps9D2DsH15APgNVOTwwczGckX+WkAvBmuoYKRCFa4DK+jM8vh5AA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-replace-supers": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1309,13 +1085,12 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.7.tgz", - "integrity": "sha512-m9obYBA39mDPN7lJzD5WkGGb0GO54PPLXsbcnj1Hyeu8mSRz7Gb4b1A6zxNX32ZuUySDK4G6it8SDFWD1nCnqg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", + "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1325,14 +1100,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.7.tgz", - "integrity": "sha512-h39agClImgPWg4H8mYVAbD1qP9vClFbEjqoJmt87Zen8pjqK8FTPUwrOXAvqu5soytwxrLMd2fx2KSCp2CHcNg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1342,12 +1116,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.7.tgz", - "integrity": "sha512-FYiTvku63me9+1Nz7TOx4YMtW3tWXzfANZtrzHhUZrz4d47EEtMQhzFoZWESfXuAMMT5mwzD4+y1N8ONAX6lMQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1357,13 +1131,13 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.7.tgz", - "integrity": "sha512-KY0hh2FluNxMLwOCHbxVOKfdB5sjWG4M183885FmaqWWiGMhRZq4DQRKH6mHdEucbJnyDyYiZNwNG424RymJjA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1373,15 +1147,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.7.tgz", - "integrity": "sha512-LzA5ESzBy7tqj00Yjey9yWfs3FKy4EmJyKOSWld144OxkTji81WWnUT8nkLUn+imN/zHL8ZQlOu/MTUAhHaX3g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", + "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.7", - "@babel/helper-create-class-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1391,12 +1164,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.7.tgz", - "integrity": "sha512-lQEeetGKfFi0wHbt8ClQrUSUMfEeI3MMm74Z73T9/kuz990yYVtfofjf3NuA42Jy3auFOpbjDyCSiIkTs1VIYw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1406,12 +1179,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.7.tgz", - "integrity": "sha512-mgDoQCRjrY3XK95UuV60tZlFCQGXEtMg8H+IsW72ldw1ih1jZhzYXbJvghmAEpg5UVhhnCeia1CkGttUvCkiMQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", + "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.9", "regenerator-transform": "^0.15.2" }, "engines": { @@ -1421,13 +1194,29 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", + "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.7.tgz", - "integrity": "sha512-3OfyfRRqiGeOvIWSagcwUTVk2hXBsr/ww7bLn6TRTuXnexA+Udov2icFOxFX9abaj4l96ooYkcNN1qi2Zvqwng==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1437,12 +1226,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.7.tgz", - "integrity": "sha512-uBbxNwimHi5Bv3hUccmOFlUy3ATO6WagTApenHz9KzoIdn0XeACdB12ZJ4cjhuB2WSi80Ez2FWzJnarccriJeA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1452,13 +1241,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.7.tgz", - "integrity": "sha512-Mm6aeymI0PBh44xNIv/qvo8nmbkpZze1KvR8MkEqbIREDxoiWTi18Zr2jryfRMwDfVZF9foKh060fWgni44luw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1468,12 +1257,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.7.tgz", - "integrity": "sha512-ZFAeNkpGuLnAQ/NCsXJ6xik7Id+tHuS+NT+ue/2+rn/31zcdnupCdmunOizEaP0JsUmTFSTOPoQY7PkK2pttXw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1483,12 +1272,13 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.7.tgz", - "integrity": "sha512-SI274k0nUsFFmyQupiO7+wKATAmMFf8iFgq2O+vVFXZ0SV9lNfT1NGzBEhjquFmD8I9sqHLguH+gZVN3vww2AA==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz", + "integrity": "sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -1498,12 +1288,13 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.7.tgz", - "integrity": "sha512-OmWmQtTHnO8RSUbL0NTdtpbZHeNTnm68Gj5pA4Y2blFNh+V4iZR68V1qL9cI37J21ZN7AaCnkfdHtLExQPf2uA==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.26.7.tgz", + "integrity": "sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -1513,12 +1304,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.7.tgz", - "integrity": "sha512-BN87D7KpbdiABA+t3HbVqHzKWUDN3dymLaTnPFAMyc8lV+KN3+YzNhVRNdinaCPA4AUqx7ubXbQ9shRjYBl3SQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1528,13 +1319,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.7.tgz", - "integrity": "sha512-IWfR89zcEPQGB/iB408uGtSPlQd3Jpq11Im86vUgcmSTcoWAiQMCTOa2K2yNNqFJEBVICKhayctee65Ka8OB0w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", + "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1544,13 +1335,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.7.tgz", - "integrity": "sha512-8JKfg/hiuA3qXnlLx8qtv5HWRbgyFx2hMMtpDDuU2rTckpKkGu4ycK5yYHwuEa16/quXfoxHBIApEsNyMWnt0g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1560,13 +1351,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.7.tgz", - "integrity": "sha512-YRW8o9vzImwmh4Q3Rffd09bH5/hvY0pxg+1H1i0f7APoUeg12G7+HhLj9ZFNIrYkgBXhIijPJ+IXypN0hLTIbw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", + "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1576,93 +1367,80 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.7.tgz", - "integrity": "sha512-Gibz4OUdyNqqLj+7OAvBZxOD7CklCtMA5/j0JgUEwOnaRULsPDXmic2iKxL2DX2vQduPR5wH2hjZas/Vr/Oc0g==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.25.7", - "@babel/helper-compilation-targets": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-validator-option": "^7.25.7", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.7", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.7", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.7", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.7", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz", + "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.8", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.25.7", - "@babel/plugin-syntax-import-attributes": "^7.25.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.25.7", - "@babel/plugin-transform-async-generator-functions": "^7.25.7", - "@babel/plugin-transform-async-to-generator": "^7.25.7", - "@babel/plugin-transform-block-scoped-functions": "^7.25.7", - "@babel/plugin-transform-block-scoping": "^7.25.7", - "@babel/plugin-transform-class-properties": "^7.25.7", - "@babel/plugin-transform-class-static-block": "^7.25.7", - "@babel/plugin-transform-classes": "^7.25.7", - "@babel/plugin-transform-computed-properties": "^7.25.7", - "@babel/plugin-transform-destructuring": "^7.25.7", - "@babel/plugin-transform-dotall-regex": "^7.25.7", - "@babel/plugin-transform-duplicate-keys": "^7.25.7", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.7", - "@babel/plugin-transform-dynamic-import": "^7.25.7", - "@babel/plugin-transform-exponentiation-operator": "^7.25.7", - "@babel/plugin-transform-export-namespace-from": "^7.25.7", - "@babel/plugin-transform-for-of": "^7.25.7", - "@babel/plugin-transform-function-name": "^7.25.7", - "@babel/plugin-transform-json-strings": "^7.25.7", - "@babel/plugin-transform-literals": "^7.25.7", - "@babel/plugin-transform-logical-assignment-operators": "^7.25.7", - "@babel/plugin-transform-member-expression-literals": "^7.25.7", - "@babel/plugin-transform-modules-amd": "^7.25.7", - "@babel/plugin-transform-modules-commonjs": "^7.25.7", - "@babel/plugin-transform-modules-systemjs": "^7.25.7", - "@babel/plugin-transform-modules-umd": "^7.25.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.7", - "@babel/plugin-transform-new-target": "^7.25.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.7", - "@babel/plugin-transform-numeric-separator": "^7.25.7", - "@babel/plugin-transform-object-rest-spread": "^7.25.7", - "@babel/plugin-transform-object-super": "^7.25.7", - "@babel/plugin-transform-optional-catch-binding": "^7.25.7", - "@babel/plugin-transform-optional-chaining": "^7.25.7", - "@babel/plugin-transform-parameters": "^7.25.7", - "@babel/plugin-transform-private-methods": "^7.25.7", - "@babel/plugin-transform-private-property-in-object": "^7.25.7", - "@babel/plugin-transform-property-literals": "^7.25.7", - "@babel/plugin-transform-regenerator": "^7.25.7", - "@babel/plugin-transform-reserved-words": "^7.25.7", - "@babel/plugin-transform-shorthand-properties": "^7.25.7", - "@babel/plugin-transform-spread": "^7.25.7", - "@babel/plugin-transform-sticky-regex": "^7.25.7", - "@babel/plugin-transform-template-literals": "^7.25.7", - "@babel/plugin-transform-typeof-symbol": "^7.25.7", - "@babel/plugin-transform-unicode-escapes": "^7.25.7", - "@babel/plugin-transform-unicode-property-regex": "^7.25.7", - "@babel/plugin-transform-unicode-regex": "^7.25.7", - "@babel/plugin-transform-unicode-sets-regex": "^7.25.7", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.26.8", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.26.5", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.26.3", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.26.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.26.3", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.26.8", + "@babel/plugin-transform-typeof-symbol": "^7.26.7", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-corejs3": "^0.11.0", "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.38.1", + "core-js-compat": "^3.40.0", "semver": "^6.3.1" }, "engines": { @@ -1687,9 +1465,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", - "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" @@ -1699,30 +1477,32 @@ } }, "node_modules/@babel/template": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", - "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", + "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.7", - "@babel/parser": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", - "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz", + "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.7", - "@babel/generator": "^7.25.7", - "@babel/parser": "^7.25.7", - "@babel/template": "^7.25.7", - "@babel/types": "^7.25.7", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.9", + "@babel/parser": "^7.26.9", + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1731,14 +1511,14 @@ } }, "node_modules/@babel/types": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", - "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", + "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1805,18 +1585,6 @@ "dev": true, "optional": true }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -1846,13 +1614,14 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", - "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", + "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2", - "core-js-compat": "^3.38.0" + "@babel/helper-define-polyfill-provider": "^0.6.3", + "core-js-compat": "^3.40.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -1913,9 +1682,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", - "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, "funding": [ { @@ -1931,11 +1700,12 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001663", - "electron-to-chromium": "^1.5.28", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -1945,9 +1715,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001666", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001666.tgz", - "integrity": "sha512-gD14ICmoV5ZZM1OdzPWmpx+q4GyefaK06zi8hmfHV5xe4/2nOQX3+Dw5o+fSqOws2xVwL9j+anOPFwHzdEdV4g==", + "version": "1.0.30001702", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001702.tgz", + "integrity": "sha512-LoPe/D7zioC0REI5W73PeR1e1MLCipRGq/VkovJnd6Df+QVqT+vT33OXCp8QUd7kA7RZrHWxb1B36OQKI/0gOA==", "dev": true, "funding": [ { @@ -1962,21 +1732,8 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } + ], + "license": "CC-BY-4.0" }, "node_modules/chokidar": { "version": "3.6.0", @@ -2003,21 +1760,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, "node_modules/commander": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", @@ -2040,12 +1782,13 @@ "dev": true }, "node_modules/core-js-compat": { - "version": "3.38.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", - "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", + "version": "3.41.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.41.0.tgz", + "integrity": "sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==", "dev": true, + "license": "MIT", "dependencies": { - "browserslist": "^4.23.3" + "browserslist": "^4.24.4" }, "funding": { "type": "opencollective", @@ -2070,10 +1813,11 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.31", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.31.tgz", - "integrity": "sha512-QcDoBbQeYt0+3CWcK/rEbuHvwpbT/8SV9T3OSgs6cX1FlcUAkgrkqbg9zLnDrMM/rLamzQwal4LYFCiWk861Tg==", - "dev": true + "version": "1.5.112", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.112.tgz", + "integrity": "sha512-oen93kVyqSb3l+ziUgzIOlWt/oOuy4zRmpwestMn4rhFWAoFJeFuCVte9F2fASjeZZo7l/Cif9TiyrdW4CwEMA==", + "dev": true, + "license": "ISC" }, "node_modules/escalade": { "version": "3.2.0", @@ -2084,15 +1828,6 @@ "node": ">=6" } }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -2103,9 +1838,10 @@ } }, "node_modules/filepond": { - "version": "4.31.4", - "resolved": "https://registry.npmjs.org/filepond/-/filepond-4.31.4.tgz", - "integrity": "sha512-3kR87Rsw2OP8CktlIehdbFjWB33GEH5iLs8izl2OcZGOszUFWYTjRY6pffLpjz/gRE61u1F67rZ2++ujFiUxPQ==" + "version": "4.32.7", + "resolved": "https://registry.npmjs.org/filepond/-/filepond-4.32.7.tgz", + "integrity": "sha512-L2idUfC31Qb2ZuFn8yAjX+Km6Ouq0kQn6JHcwhqrl5Ee9cB7xctLa0nkbbAeCML2+a1/cUsd0TqBgVcxYW08GA==", + "license": "MIT" }, "node_modules/filepond-plugin-file-encode": { "version": "2.1.14", @@ -2303,15 +2039,6 @@ "node": ">=4" } }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -2488,10 +2215,11 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", - "dev": true + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" }, "node_modules/normalize-path": { "version": "3.0.0", @@ -2671,18 +2399,6 @@ "node": ">=6" } }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -2695,15 +2411,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", diff --git a/packages/file-filepond/assets/package.json b/packages/file-filepond/assets/package.json index 39c9ae5..21b8de5 100644 --- a/packages/file-filepond/assets/package.json +++ b/packages/file-filepond/assets/package.json @@ -76,14 +76,14 @@ "@hotwired/stimulus": "^3.0" }, "devDependencies": { - "@babel/cli": "^7.25", - "@babel/core": "^7.25", + "@babel/cli": "^7.26", + "@babel/core": "^7.26", "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/preset-env": "^7.25.4", + "@babel/preset-env": "^7.26.9", "@hotwired/stimulus": "^3.0" }, "dependencies": { - "filepond": "^4.31.4", + "filepond": "^4.32.7", "filepond-plugin-file-encode": "^2.1.11", "filepond-plugin-file-metadata": "^1.0.8", "filepond-plugin-file-poster": "^2.5.1", diff --git a/packages/file-filepond/composer.json b/packages/file-filepond/composer.json index 6d112ce..aac9741 100644 --- a/packages/file-filepond/composer.json +++ b/packages/file-filepond/composer.json @@ -25,13 +25,13 @@ } }, "require": { - "rekalogika/file": "^1.11", - "rekalogika/file-association-entity": "^1.11", - "rekalogika/file-bundle": "^1.11", - "rekalogika/file-contracts": "^1.11", - "rekalogika/file-image": "^1.11", - "rekalogika/file-server": "^1.11", - "rekalogika/file-symfony-bridge": "^1.11", + "rekalogika/file": "^1.12", + "rekalogika/file-association-entity": "^1.12", + "rekalogika/file-bundle": "^1.12", + "rekalogika/file-contracts": "^1.12", + "rekalogika/file-image": "^1.12", + "rekalogika/file-server": "^1.12", + "rekalogika/file-symfony-bridge": "^1.12", "rekalogika/temporary-url-bundle": "^1.3", "symfony/form": "^6.2 || ^7.0", "symfony/options-resolver": "^6.2 || ^7.0", @@ -39,7 +39,7 @@ }, "extra": { "branch-alias": { - "dev-main": "1.12-dev" + "dev-main": "1.13-dev" } } } diff --git a/packages/file-filepond/src/DependencyInjection/RekalogikaFileFilePondExtension.php b/packages/file-filepond/src/DependencyInjection/RekalogikaFileFilePondExtension.php index ed9b30e..e836901 100644 --- a/packages/file-filepond/src/DependencyInjection/RekalogikaFileFilePondExtension.php +++ b/packages/file-filepond/src/DependencyInjection/RekalogikaFileFilePondExtension.php @@ -20,7 +20,7 @@ use Symfony\Component\DependencyInjection\Extension\Extension; use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface; -class RekalogikaFileFilePondExtension extends Extension implements +final class RekalogikaFileFilePondExtension extends Extension implements PrependExtensionInterface { #[\Override] diff --git a/packages/file-filepond/src/FilePondCollectionType.php b/packages/file-filepond/src/FilePondCollectionType.php index f3e4673..45160a7 100644 --- a/packages/file-filepond/src/FilePondCollectionType.php +++ b/packages/file-filepond/src/FilePondCollectionType.php @@ -26,7 +26,7 @@ /** * Form type for handling multiple files. */ -class FilePondCollectionType extends FileType +final class FilePondCollectionType extends FileType { #[\Override] public function buildForm(FormBuilderInterface $builder, array $options): void @@ -57,8 +57,6 @@ public function buildForm(FormBuilderInterface $builder, array $options): void } } - /** @var array $incomingFiles */ - foreach ($incomingFiles as $file) { if ($file instanceof UploadedFile) { $file = FromHttpFoundationFileAdapter::adapt($file); diff --git a/packages/file-filepond/src/FilePondFileEncodeAdapter.php b/packages/file-filepond/src/FilePondFileEncodeAdapter.php index dc33615..2fef21d 100644 --- a/packages/file-filepond/src/FilePondFileEncodeAdapter.php +++ b/packages/file-filepond/src/FilePondFileEncodeAdapter.php @@ -21,7 +21,7 @@ * * @see https://pqina.nl/filepond/docs/api/plugins/file-encode/ */ -class FilePondFileEncodeAdapter +final class FilePondFileEncodeAdapter { /** * @param array $input diff --git a/packages/file-filepond/src/FilePondType.php b/packages/file-filepond/src/FilePondType.php index 55542d5..aa7f88f 100644 --- a/packages/file-filepond/src/FilePondType.php +++ b/packages/file-filepond/src/FilePondType.php @@ -39,7 +39,7 @@ * ], * ``` */ -class FilePondType extends FileType +final class FilePondType extends FileType { #[\Override] public function buildForm(FormBuilderInterface $builder, array $options): void diff --git a/packages/file-filepond/src/RekalogikaFileFilePondBundle.php b/packages/file-filepond/src/RekalogikaFileFilePondBundle.php index bdc772f..1679af2 100644 --- a/packages/file-filepond/src/RekalogikaFileFilePondBundle.php +++ b/packages/file-filepond/src/RekalogikaFileFilePondBundle.php @@ -16,7 +16,7 @@ use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\HttpKernel\Bundle\Bundle; -class RekalogikaFileFilePondBundle extends Bundle +final class RekalogikaFileFilePondBundle extends Bundle { #[\Override] public function getPath(): string diff --git a/packages/file-image/composer.json b/packages/file-image/composer.json index 0cc06bd..b7b004a 100644 --- a/packages/file-image/composer.json +++ b/packages/file-image/composer.json @@ -27,15 +27,15 @@ }, "require": { "intervention/image": "^3.3", - "rekalogika/file-contracts": "^1.11", - "rekalogika/file-derivation": "^1.11", + "rekalogika/file-contracts": "^1.12", + "rekalogika/file-derivation": "^1.12", "symfony/service-contracts": "^3.3", "twig/twig": "^2.12|^3.0", "webmozart/assert": "^1.11" }, "extra": { "branch-alias": { - "dev-main": "1.12-dev" + "dev-main": "1.13-dev" } } } diff --git a/packages/file-image/src/ImageResizer.php b/packages/file-image/src/ImageResizer.php index 818d580..fb3e8be 100644 --- a/packages/file-image/src/ImageResizer.php +++ b/packages/file-image/src/ImageResizer.php @@ -14,12 +14,21 @@ namespace Rekalogika\File\Image; use Intervention\Image\Encoders\AutoEncoder; +use Intervention\Image\Encoders\MediaTypeEncoder; +use Intervention\Image\Exceptions\EncoderException; +use Intervention\Image\Image; use Intervention\Image\ImageManager; +use Intervention\Image\Interfaces\ImageInterface; +use Psr\Log\LoggerInterface; use Rekalogika\Contracts\File\FileInterface; use Rekalogika\File\Derivation\Filter\AbstractFileFilter; -class ImageResizer extends AbstractFileFilter +final class ImageResizer extends AbstractFileFilter { + // vars + + private ImageManager $manager; + // // constants // @@ -28,18 +37,35 @@ class ImageResizer extends AbstractFileFilter final public const ASPECTRATIO_SQUARE = 'square'; + // + // constructor + // + + public function __construct( + ?ImageManager $manager = null, + private ?LoggerInterface $logger = null, + ) { + $this->manager = $manager ?? ImageManager::gd(); + } + // // properties // private int $maxWidthOrHeight = 512; + /** + * @var self::ASPECTRATIO_* + */ private string $aspect = self::ASPECTRATIO_ORIGINAL; // // action setters // + /** + * @param self::ASPECTRATIO_* $aspect + */ public function resize( int $maxWidthOrHeight = 512, string $aspect = self::ASPECTRATIO_ORIGINAL, @@ -68,42 +94,53 @@ protected function getDerivationId(): string #[\Override] protected function process(): FileInterface { - $ratio = null; + $width = $this->maxWidthOrHeight; + $height = $this->maxWidthOrHeight; - $img = ImageManager::gd() - ->read($this->getSourceFile()->getContentAsStream()->detach()); + try { + $ratio = null; - $w = $img->width(); - $h = $img->height(); + $img = $this->manager + ->read($this->getSourceFile()->getContentAsStream()->detach()); - if ($this->aspect === self::ASPECTRATIO_SQUARE) { - if ($w > $h) { - $img->crop($h, $h); + $w = $img->width(); + $h = $img->height(); + + if ($this->aspect === self::ASPECTRATIO_SQUARE) { + if ($w > $h) { + $img->crop($h, $h); + } else { + $img->crop($w, $w); + } + + $ratio = 1; } else { - $img->crop($w, $w); + $ratio = $w / $h; } - $ratio = 1; - } elseif ($this->aspect === self::ASPECTRATIO_ORIGINAL) { - $ratio = $w / $h; - } else { - throw new \InvalidArgumentException(\sprintf( - 'Unknown aspect ratio "%s"', - $this->aspect, - )); - } + if ($width / $height > $ratio) { + $width = (int) round((float) $height * (float) $ratio); + } else { + $height = (int) round((float) $width / (float) $ratio); + } - $width = $this->maxWidthOrHeight; - $height = $this->maxWidthOrHeight; + $img->resize($width, $height); + $encoded = $img->encode(new AutoEncoder()); + } catch (\Throwable $e) { + // log the exception + $this->logger?->error($e->getMessage(), ['exception' => $e]); - if ($width / $height > $ratio) { - $width = $height * $ratio; - } else { - $height = $width / $ratio; - } + // output gray image + $mimeType = $this->getSourceFile()->getType()->getName(); + + $img = $this->createBlankImage($width, $height); - $img->resize((int) round($width), (int) round($height)); - $encoded = $img->encode(new AutoEncoder()); + try { + $encoded = $img->encode(new AutoEncoder($mimeType)); + } catch (EncoderException) { + $encoded = $img->encode(new MediaTypeEncoder('image/png')); + } + } return $this->getFileRepository() ->createFromString( @@ -111,4 +148,11 @@ protected function process(): FileInterface $encoded->toString(), ); } + + private function createBlankImage(int $width, int $height): ImageInterface + { + $manager = ImageManager::gd(); + + return $manager->create($width, $height)->fill('808080'); + } } diff --git a/packages/file-image/src/ImageTwigExtension.php b/packages/file-image/src/ImageTwigExtension.php index 4f935af..f85127d 100644 --- a/packages/file-image/src/ImageTwigExtension.php +++ b/packages/file-image/src/ImageTwigExtension.php @@ -20,7 +20,7 @@ use Twig\Extension\AbstractExtension; use Twig\TwigFilter; -class ImageTwigExtension extends AbstractExtension implements ServiceSubscriberInterface +final class ImageTwigExtension extends AbstractExtension implements ServiceSubscriberInterface { protected ContainerInterface $container; @@ -40,8 +40,8 @@ public function setContainer(ContainerInterface $container): void private function getImageResizer(): ImageResizer { + /** @var ImageResizer */ $resizer = $this->container->get(ImageResizer::class); - \assert($resizer instanceof ImageResizer); return $resizer; } @@ -54,6 +54,9 @@ public function getFilters(): array ]; } + /** + * @param ImageResizer::ASPECTRATIO_* $aspect + */ public function fileImageResize( ?FileInterface $file, int $maxWidthOrHeight = 512, diff --git a/packages/file-metadata-contracts/composer.json b/packages/file-metadata-contracts/composer.json index cd23f55..5f3bb5a 100644 --- a/packages/file-metadata-contracts/composer.json +++ b/packages/file-metadata-contracts/composer.json @@ -22,7 +22,7 @@ }, "extra": { "branch-alias": { - "dev-main": "1.12-dev" + "dev-main": "1.13-dev" } } } diff --git a/packages/file-metadata/composer.json b/packages/file-metadata/composer.json index 253cf7a..ab48395 100644 --- a/packages/file-metadata/composer.json +++ b/packages/file-metadata/composer.json @@ -25,13 +25,13 @@ "require": { "cardinalby/content-disposition": "^1.1", "fileeye/mimemap": "^2.0", - "rekalogika/file-contracts": "^1.11", - "rekalogika/file-metadata-contracts": "^1.11", + "rekalogika/file-contracts": "^1.12", + "rekalogika/file-metadata-contracts": "^1.12", "symfony/translation-contracts": "^3.0" }, "extra": { "branch-alias": { - "dev-main": "1.12-dev" + "dev-main": "1.13-dev" } } } diff --git a/packages/file-metadata/src/Constants.php b/packages/file-metadata/src/Constants.php index 9e3360e..54bdb11 100644 --- a/packages/file-metadata/src/Constants.php +++ b/packages/file-metadata/src/Constants.php @@ -18,7 +18,7 @@ * * @internal */ -class Constants +final class Constants { public const HTTP_CACHE_CONTROL = 'http.cacheControl'; diff --git a/packages/file-metadata/src/Model/FileName.php b/packages/file-metadata/src/Model/FileName.php index 5b2fe9f..a235dec 100644 --- a/packages/file-metadata/src/Model/FileName.php +++ b/packages/file-metadata/src/Model/FileName.php @@ -64,7 +64,6 @@ public function trans(TranslatorInterface $translator, ?string $locale = null): { if ($this->name === null) { $full = $this->getFull(); - \assert($full instanceof TranslatableInterface); return $full->trans($translator, $locale); } diff --git a/packages/file-null/composer.json b/packages/file-null/composer.json index c3cc772..00eaaba 100644 --- a/packages/file-null/composer.json +++ b/packages/file-null/composer.json @@ -25,12 +25,12 @@ }, "require": { "psr/http-message": "^1.0 || ^2.0", - "rekalogika/file-contracts": "^1.11", + "rekalogika/file-contracts": "^1.12", "symfony/translation-contracts": "^3.0" }, "extra": { "branch-alias": { - "dev-main": "1.12-dev" + "dev-main": "1.13-dev" } } } diff --git a/packages/file-null/src/InvalidFile.php b/packages/file-null/src/InvalidFile.php index 1181d00..744acac 100644 --- a/packages/file-null/src/InvalidFile.php +++ b/packages/file-null/src/InvalidFile.php @@ -20,7 +20,7 @@ /** * A null file object that is also an exception */ -class InvalidFile extends \Exception implements NullFileInterface +final class InvalidFile extends \Exception implements NullFileInterface { use NullFileTrait; diff --git a/packages/file-null/src/NullFile.php b/packages/file-null/src/NullFile.php index 1746e4a..a2378d6 100644 --- a/packages/file-null/src/NullFile.php +++ b/packages/file-null/src/NullFile.php @@ -20,7 +20,7 @@ /** * A null-value pattern implementation for FileInterface. */ -class NullFile implements NullFileInterface +final class NullFile implements NullFileInterface { use NullFileTrait; diff --git a/packages/file-null/src/NullName.php b/packages/file-null/src/NullName.php index 44dfa6d..e24e7b5 100644 --- a/packages/file-null/src/NullName.php +++ b/packages/file-null/src/NullName.php @@ -17,7 +17,7 @@ use Symfony\Contracts\Translation\TranslatableInterface; use Symfony\Contracts\Translation\TranslatorInterface; -class NullName implements FileNameInterface +final class NullName implements FileNameInterface { public function __construct( private readonly string $name, diff --git a/packages/file-null/src/NullPointer.php b/packages/file-null/src/NullPointer.php index 919bbbe..bfeee37 100644 --- a/packages/file-null/src/NullPointer.php +++ b/packages/file-null/src/NullPointer.php @@ -17,7 +17,7 @@ use Rekalogika\Contracts\File\FilePointerInterface; use Rekalogika\Contracts\File\NullFilePointerInterface; -class NullPointer implements NullFilePointerInterface +final class NullPointer implements NullFilePointerInterface { #[\Override] public function getFilesystemIdentifier(): ?string diff --git a/packages/file-null/src/NullType.php b/packages/file-null/src/NullType.php index 2aa20c3..a7b32c0 100644 --- a/packages/file-null/src/NullType.php +++ b/packages/file-null/src/NullType.php @@ -16,7 +16,7 @@ use Rekalogika\Contracts\File\FileTypeInterface; use Symfony\Contracts\Translation\TranslatableInterface; -class NullType implements FileTypeInterface +final class NullType implements FileTypeInterface { public function __construct( private readonly string $description, diff --git a/packages/file-null/src/TranslatableMessage.php b/packages/file-null/src/TranslatableMessage.php index 29b35aa..95ab19b 100644 --- a/packages/file-null/src/TranslatableMessage.php +++ b/packages/file-null/src/TranslatableMessage.php @@ -16,7 +16,7 @@ use Symfony\Contracts\Translation\TranslatableInterface; use Symfony\Contracts\Translation\TranslatorInterface; -class TranslatableMessage implements \Stringable, TranslatableInterface +final class TranslatableMessage implements \Stringable, TranslatableInterface { public function __construct( private readonly string $name, diff --git a/packages/file-oneup-uploader-bridge/composer.json b/packages/file-oneup-uploader-bridge/composer.json index 5a87537..9fafb2d 100644 --- a/packages/file-oneup-uploader-bridge/composer.json +++ b/packages/file-oneup-uploader-bridge/composer.json @@ -24,12 +24,12 @@ }, "require": { "oneup/uploader-bundle": "^5.0", - "rekalogika/file-contracts": "^1.11", - "rekalogika/file": "^1.11" + "rekalogika/file-contracts": "^1.12", + "rekalogika/file": "^1.12" }, "extra": { "branch-alias": { - "dev-main": "1.12-dev" + "dev-main": "1.13-dev" } } } diff --git a/packages/file-oneup-uploader-bridge/src/FromOneUpUploaderFileAdapter.php b/packages/file-oneup-uploader-bridge/src/FromOneUpUploaderFileAdapter.php index 5201006..36de90a 100644 --- a/packages/file-oneup-uploader-bridge/src/FromOneUpUploaderFileAdapter.php +++ b/packages/file-oneup-uploader-bridge/src/FromOneUpUploaderFileAdapter.php @@ -21,12 +21,12 @@ /** * Adapter to convert a OneUpUploader's FileInterface into our FileInterface */ -class FromOneUpUploaderFileAdapter extends File +final class FromOneUpUploaderFileAdapter extends File { private function __construct(TheirFileInterface $file) { + /** @psalm-suppress MixedAssignment */ $filesystem = $file->getFileSystem(); - \assert($filesystem === null || $filesystem instanceof FilesystemOperator); if ($filesystem === null) { $ourFilesystem = null; diff --git a/packages/file-server/composer.json b/packages/file-server/composer.json index e768dde..a2292cc 100644 --- a/packages/file-server/composer.json +++ b/packages/file-server/composer.json @@ -23,14 +23,14 @@ } }, "require": { - "rekalogika/file-contracts": "^1.11", - "rekalogika/file-symfony-bridge": "^1.11", + "rekalogika/file-contracts": "^1.12", + "rekalogika/file-symfony-bridge": "^1.12", "rekalogika/temporary-url-bundle": "^1.3", "symfony/http-foundation": "^6.2 || ^7.0" }, "extra": { "branch-alias": { - "dev-main": "1.12-dev" + "dev-main": "1.13-dev" } } } diff --git a/packages/file-server/src/FileInterfaceResourceServer.php b/packages/file-server/src/FileInterfaceResourceServer.php index c45cd21..2545a1a 100644 --- a/packages/file-server/src/FileInterfaceResourceServer.php +++ b/packages/file-server/src/FileInterfaceResourceServer.php @@ -21,7 +21,7 @@ use Rekalogika\TemporaryUrl\Attribute\AsTemporaryUrlServer; use Symfony\Component\HttpFoundation\Response; -class FileInterfaceResourceServer +final class FileInterfaceResourceServer { public function __construct( private readonly FileRepositoryInterface $fileRepository, diff --git a/packages/file-symfony-bridge/composer.json b/packages/file-symfony-bridge/composer.json index a643c42..c6fd30b 100644 --- a/packages/file-symfony-bridge/composer.json +++ b/packages/file-symfony-bridge/composer.json @@ -26,16 +26,16 @@ } }, "require": { - "rekalogika/file": "^1.11", - "rekalogika/file-contracts": "^1.11", - "rekalogika/file-metadata-contracts": "^1.11", + "rekalogika/file": "^1.12", + "rekalogika/file-contracts": "^1.12", + "rekalogika/file-metadata-contracts": "^1.12", "symfony/form": "^6.2 || ^7.0", "symfony/http-foundation": "^6.2 || ^7.0", "symfony/validator": "^6.3 || ^7.1" }, "extra": { "branch-alias": { - "dev-main": "1.12-dev" + "dev-main": "1.13-dev" } } } diff --git a/packages/file-symfony-bridge/src/Constraints/File.php b/packages/file-symfony-bridge/src/Constraints/File.php index d416464..c6eb916 100644 --- a/packages/file-symfony-bridge/src/Constraints/File.php +++ b/packages/file-symfony-bridge/src/Constraints/File.php @@ -16,4 +16,4 @@ use Symfony\Component\Validator\Constraints\File as SymfonyFile; #[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)] -class File extends SymfonyFile {} +final class File extends SymfonyFile {} diff --git a/packages/file-symfony-bridge/src/Constraints/FileValidator.php b/packages/file-symfony-bridge/src/Constraints/FileValidator.php index 2c1cc14..4c672cc 100644 --- a/packages/file-symfony-bridge/src/Constraints/FileValidator.php +++ b/packages/file-symfony-bridge/src/Constraints/FileValidator.php @@ -18,7 +18,7 @@ use Symfony\Component\Validator\Constraint; use Symfony\Component\Validator\Constraints\FileValidator as SymfonyFileValidator; -class FileValidator extends SymfonyFileValidator +final class FileValidator extends SymfonyFileValidator { #[\Override] public function validate(mixed $value, Constraint $constraint): void diff --git a/packages/file-symfony-bridge/src/Constraints/Image.php b/packages/file-symfony-bridge/src/Constraints/Image.php index d45fecf..b4f97b2 100644 --- a/packages/file-symfony-bridge/src/Constraints/Image.php +++ b/packages/file-symfony-bridge/src/Constraints/Image.php @@ -15,5 +15,8 @@ use Symfony\Component\Validator\Constraints\Image as SymfonyImage; +/** + * @api + */ #[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)] class Image extends SymfonyImage {} diff --git a/packages/file-symfony-bridge/src/Form/FileTransformer.php b/packages/file-symfony-bridge/src/Form/FileTransformer.php index 5333d41..f1865c1 100644 --- a/packages/file-symfony-bridge/src/Form/FileTransformer.php +++ b/packages/file-symfony-bridge/src/Form/FileTransformer.php @@ -25,7 +25,7 @@ * * @implements DataTransformerInterface */ -class FileTransformer implements DataTransformerInterface +final class FileTransformer implements DataTransformerInterface { /** * Transforms a FileInterface to HttpFoundation File @@ -43,6 +43,7 @@ public function transform($value): ?File return $value; } + // @phpstan-ignore instanceof.alwaysTrue if (!$value instanceof FileInterface) { throw new TransformationFailedException(\sprintf( 'Expecting "%s", but getting "%s" instead.', @@ -71,6 +72,7 @@ public function reverseTransform(mixed $value): ?FileInterface return $value; } + // @phpstan-ignore instanceof.alwaysTrue if (!$value instanceof File) { throw new TransformationFailedException(\sprintf( 'Expecting "%s", but getting "%s" instead.', diff --git a/packages/file-symfony-bridge/src/Form/FileType.php b/packages/file-symfony-bridge/src/Form/FileType.php index accd7b4..342d897 100644 --- a/packages/file-symfony-bridge/src/Form/FileType.php +++ b/packages/file-symfony-bridge/src/Form/FileType.php @@ -17,7 +17,7 @@ use Symfony\Component\Form\Extension\Core\Type\FileType as SymfonyFileType; use Symfony\Component\Form\FormBuilderInterface; -class FileType extends AbstractType +final class FileType extends AbstractType { #[\Override] public function getParent(): string diff --git a/packages/file-symfony-bridge/src/Form/FileTypeExtension.php b/packages/file-symfony-bridge/src/Form/FileTypeExtension.php index 714ba56..b7aad78 100644 --- a/packages/file-symfony-bridge/src/Form/FileTypeExtension.php +++ b/packages/file-symfony-bridge/src/Form/FileTypeExtension.php @@ -17,7 +17,7 @@ use Symfony\Component\Form\Extension\Core\Type\FileType; use Symfony\Component\Form\FormBuilderInterface; -class FileTypeExtension extends AbstractTypeExtension +final class FileTypeExtension extends AbstractTypeExtension { #[\Override] public static function getExtendedTypes(): iterable diff --git a/packages/file-symfony-bridge/src/HttpFoundation/FileResponse.php b/packages/file-symfony-bridge/src/HttpFoundation/FileResponse.php index ce5083d..3f49031 100644 --- a/packages/file-symfony-bridge/src/HttpFoundation/FileResponse.php +++ b/packages/file-symfony-bridge/src/HttpFoundation/FileResponse.php @@ -17,7 +17,7 @@ use Rekalogika\Contracts\File\Metadata\HttpMetadataInterface; use Symfony\Component\HttpFoundation\StreamedResponse; -class FileResponse extends StreamedResponse +final class FileResponse extends StreamedResponse { /** * @param int $status HTTP status code (200 OK by default) diff --git a/packages/file-symfony-bridge/src/HttpFoundation/FromHttpFoundationFileAdapter.php b/packages/file-symfony-bridge/src/HttpFoundation/FromHttpFoundationFileAdapter.php index aa514a5..16e7e68 100644 --- a/packages/file-symfony-bridge/src/HttpFoundation/FromHttpFoundationFileAdapter.php +++ b/packages/file-symfony-bridge/src/HttpFoundation/FromHttpFoundationFileAdapter.php @@ -23,7 +23,7 @@ /** * Adapter to convert a HttpFoundation File to a FileInterface object. */ -class FromHttpFoundationFileAdapter extends File +final class FromHttpFoundationFileAdapter extends File { private ?RawMetadata $cachedMetadata = null; diff --git a/packages/file-symfony-bridge/src/HttpFoundation/ToHttpFoundationFileAdapter.php b/packages/file-symfony-bridge/src/HttpFoundation/ToHttpFoundationFileAdapter.php index f870e06..f0808c3 100644 --- a/packages/file-symfony-bridge/src/HttpFoundation/ToHttpFoundationFileAdapter.php +++ b/packages/file-symfony-bridge/src/HttpFoundation/ToHttpFoundationFileAdapter.php @@ -23,7 +23,7 @@ * and then passing that to the HttpFoundation File constructor. If the file is * local, it will be used directly. */ -class ToHttpFoundationFileAdapter extends HttpFoundationFile +final class ToHttpFoundationFileAdapter extends HttpFoundationFile { /** * We keep the original output of createLocalTemporaryFile here to prevent @@ -188,7 +188,6 @@ public function getPath(): string #[\Override] public function getPathInfo($class = null): ?\SplFileInfo { - // @phpstan-ignore return.type return $this->getHttpFoundationFile()->getPathInfo($class); } diff --git a/packages/file-tree-contracts/composer.json b/packages/file-tree-contracts/composer.json index d06d3b4..3009636 100644 --- a/packages/file-tree-contracts/composer.json +++ b/packages/file-tree-contracts/composer.json @@ -21,11 +21,11 @@ } }, "require": { - "rekalogika/file-contracts": "^1.11" + "rekalogika/file-contracts": "^1.12" }, "extra": { "branch-alias": { - "dev-main": "1.12-dev" + "dev-main": "1.13-dev" } } } diff --git a/packages/file-zip/composer.json b/packages/file-zip/composer.json index 52549a3..19dc0d8 100644 --- a/packages/file-zip/composer.json +++ b/packages/file-zip/composer.json @@ -27,8 +27,8 @@ }, "require": { "psr/http-message": "^1.0 || ^2.0", - "rekalogika/file-contracts": "^1.11", - "rekalogika/file-metadata": "^1.11", + "rekalogika/file-contracts": "^1.12", + "rekalogika/file-metadata": "^1.12", "rekalogika/temporary-url-bundle": "^1.3", "maennchen/zipstream-php": "^3.1", "symfony/http-foundation": "^6.2 || ^7.0", @@ -36,7 +36,7 @@ }, "extra": { "branch-alias": { - "dev-main": "1.12-dev" + "dev-main": "1.13-dev" } } } diff --git a/packages/file/composer.json b/packages/file/composer.json index 1e0b87a..f555281 100644 --- a/packages/file/composer.json +++ b/packages/file/composer.json @@ -33,8 +33,8 @@ "psr/http-factory-implementation": "^1.0", "league/flysystem": "^3.16", "league/mime-type-detection": "^1.0.0", - "rekalogika/file-contracts": "^1.11", - "rekalogika/file-metadata": "^1.11", + "rekalogika/file-contracts": "^1.12", + "rekalogika/file-metadata": "^1.12", "symfony/deprecation-contracts": "^3.1" }, "require-dev": { @@ -47,7 +47,7 @@ }, "extra": { "branch-alias": { - "dev-main": "1.12-dev" + "dev-main": "1.13-dev" } } } diff --git a/packages/file/src/Adapter/FromSplFileInfoAdapter.php b/packages/file/src/Adapter/FromSplFileInfoAdapter.php index 1f52641..1aa0f0d 100644 --- a/packages/file/src/Adapter/FromSplFileInfoAdapter.php +++ b/packages/file/src/Adapter/FromSplFileInfoAdapter.php @@ -19,7 +19,7 @@ /** * Adapter to convert an \SplFileInfo to a FileInterface object. */ -class FromSplFileInfoAdapter extends File +final class FromSplFileInfoAdapter extends File { private function __construct( private readonly \SplFileInfo $source, diff --git a/packages/file/src/Directory.php b/packages/file/src/Directory.php index 62abb40..6e52d28 100644 --- a/packages/file/src/Directory.php +++ b/packages/file/src/Directory.php @@ -26,7 +26,7 @@ * @implements \IteratorAggregate * @implements DirectoryInterface */ -class Directory implements DirectoryInterface, \IteratorAggregate +final class Directory implements DirectoryInterface, \IteratorAggregate { /** * @param array $entries diff --git a/packages/file/src/Exception/FilesystemRepository/FilesystemAlreadyExistsException.php b/packages/file/src/Exception/FilesystemRepository/FilesystemAlreadyExistsException.php index aa2279b..f4d7025 100644 --- a/packages/file/src/Exception/FilesystemRepository/FilesystemAlreadyExistsException.php +++ b/packages/file/src/Exception/FilesystemRepository/FilesystemAlreadyExistsException.php @@ -13,7 +13,7 @@ namespace Rekalogika\File\Exception\FilesystemRepository; -class FilesystemAlreadyExistsException extends FilesystemRepositoryException +final class FilesystemAlreadyExistsException extends FilesystemRepositoryException { public function __construct(string $filesystemId) { diff --git a/packages/file/src/Exception/FilesystemRepository/FilesystemNotFoundException.php b/packages/file/src/Exception/FilesystemRepository/FilesystemNotFoundException.php index 79a65e5..da2128e 100644 --- a/packages/file/src/Exception/FilesystemRepository/FilesystemNotFoundException.php +++ b/packages/file/src/Exception/FilesystemRepository/FilesystemNotFoundException.php @@ -13,7 +13,7 @@ namespace Rekalogika\File\Exception\FilesystemRepository; -class FilesystemNotFoundException extends FilesystemRepositoryException +final class FilesystemNotFoundException extends FilesystemRepositoryException { public function __construct(string $filesystemId) { diff --git a/packages/file/src/File.php b/packages/file/src/File.php index c22a1ea..6a09a23 100644 --- a/packages/file/src/File.php +++ b/packages/file/src/File.php @@ -30,6 +30,9 @@ use Rekalogika\File\Contracts\MetadataAwareFilesystemWriter; use Rekalogika\File\Repository\FilesystemRepository; +/** + * @api + */ class File implements FileInterface { use EqualityTrait; diff --git a/packages/file/src/FileAdapter.php b/packages/file/src/FileAdapter.php index dfb609a..72f1a56 100644 --- a/packages/file/src/FileAdapter.php +++ b/packages/file/src/FileAdapter.php @@ -23,7 +23,7 @@ /** * Universal adapter. Converts any supported object to a FileInterface. */ -class FileAdapter +final class FileAdapter { private function __construct() {} diff --git a/packages/file/src/FileFactory.php b/packages/file/src/FileFactory.php index 8b63273..375e10b 100644 --- a/packages/file/src/FileFactory.php +++ b/packages/file/src/FileFactory.php @@ -23,7 +23,7 @@ use Rekalogika\File\Repository\FileRepository; use Rekalogika\File\Repository\FilesystemRepository; -class FileFactory +final class FileFactory { // // properties diff --git a/packages/file/src/FilePointer.php b/packages/file/src/FilePointer.php index 6997c64..8797a20 100644 --- a/packages/file/src/FilePointer.php +++ b/packages/file/src/FilePointer.php @@ -16,7 +16,7 @@ use Rekalogika\Contracts\File\FilePointerInterface; use Rekalogika\Contracts\File\Trait\EqualityTrait; -class FilePointer implements FilePointerInterface +final class FilePointer implements FilePointerInterface { use EqualityTrait; diff --git a/packages/file/src/Filesystem/LocalFilesystemDecorator.php b/packages/file/src/Filesystem/LocalFilesystemDecorator.php index cfb3637..11d576d 100644 --- a/packages/file/src/Filesystem/LocalFilesystemDecorator.php +++ b/packages/file/src/Filesystem/LocalFilesystemDecorator.php @@ -20,7 +20,7 @@ use Rekalogika\File\Contracts\MetadataAwareFilesystemOperator; use Rekalogika\File\RawMetadata; -class LocalFilesystemDecorator implements MetadataAwareFilesystemOperator +final class LocalFilesystemDecorator implements MetadataAwareFilesystemOperator { public function __construct( private readonly FilesystemOperator $wrapped, diff --git a/packages/file/src/Filesystem/RemoteFilesystemDecorator.php b/packages/file/src/Filesystem/RemoteFilesystemDecorator.php index 9bdf51c..146407e 100644 --- a/packages/file/src/Filesystem/RemoteFilesystemDecorator.php +++ b/packages/file/src/Filesystem/RemoteFilesystemDecorator.php @@ -31,7 +31,7 @@ * A decorator for Flysystem Operators that stores and caches metadata in a * sidecar file. */ -class RemoteFilesystemDecorator implements MetadataAwareFilesystemOperator +final class RemoteFilesystemDecorator implements MetadataAwareFilesystemOperator { private ?FilesystemOperator $wrapped = null; diff --git a/packages/file/src/MetadataSerializer/MetadataSerializer.php b/packages/file/src/MetadataSerializer/MetadataSerializer.php index 1dcaa0f..45b1855 100644 --- a/packages/file/src/MetadataSerializer/MetadataSerializer.php +++ b/packages/file/src/MetadataSerializer/MetadataSerializer.php @@ -17,7 +17,7 @@ use Rekalogika\Domain\File\Metadata\Constants; use Rekalogika\File\RawMetadata; -class MetadataSerializer implements MetadataSerializerInterface +final class MetadataSerializer implements MetadataSerializerInterface { #[\Override] public function serialize(RawMetadataInterface $metadata): string diff --git a/packages/file/src/RawMetadata.php b/packages/file/src/RawMetadata.php index fa20d1d..6c938c1 100644 --- a/packages/file/src/RawMetadata.php +++ b/packages/file/src/RawMetadata.php @@ -19,7 +19,7 @@ /** * @implements \IteratorAggregate */ -class RawMetadata implements RawMetadataInterface, \IteratorAggregate +final class RawMetadata implements RawMetadataInterface, \IteratorAggregate { /** * @var array $metadata diff --git a/packages/file/src/Repository/FileRepository.php b/packages/file/src/Repository/FileRepository.php index e738f86..90d8c65 100644 --- a/packages/file/src/Repository/FileRepository.php +++ b/packages/file/src/Repository/FileRepository.php @@ -31,7 +31,7 @@ use Rekalogika\File\RawMetadata; use Rekalogika\File\TemporaryFile; -class FileRepository implements FileRepositoryInterface +final class FileRepository implements FileRepositoryInterface { /** * @var array diff --git a/packages/file/src/Repository/FilesystemRepository.php b/packages/file/src/Repository/FilesystemRepository.php index 1b17647..fcdc788 100644 --- a/packages/file/src/Repository/FilesystemRepository.php +++ b/packages/file/src/Repository/FilesystemRepository.php @@ -23,7 +23,7 @@ use Rekalogika\File\Filesystem\LocalFilesystemDecorator; use Rekalogika\File\Filesystem\RemoteFilesystemDecorator; -class FilesystemRepository implements FilesystemRepositoryInterface +final class FilesystemRepository implements FilesystemRepositoryInterface { private static ?MetadataAwareFilesystemOperator $localFilesystem = null; diff --git a/packages/file/src/Repository/LocalFilesystemAdapter.php b/packages/file/src/Repository/LocalFilesystemAdapter.php index 824ad56..97f5f5d 100644 --- a/packages/file/src/Repository/LocalFilesystemAdapter.php +++ b/packages/file/src/Repository/LocalFilesystemAdapter.php @@ -15,7 +15,7 @@ use League\Flysystem\Local\LocalFilesystemAdapter as FlysystemLocalFilesystemAdapter; -class LocalFilesystemAdapter extends FlysystemLocalFilesystemAdapter +final class LocalFilesystemAdapter extends FlysystemLocalFilesystemAdapter { #[\Override] protected function ensureDirectoryExists(string $dirname, int $visibility): void {} diff --git a/packages/file/src/TemporaryFile.php b/packages/file/src/TemporaryFile.php index 9d38be8..5e77538 100644 --- a/packages/file/src/TemporaryFile.php +++ b/packages/file/src/TemporaryFile.php @@ -16,7 +16,7 @@ use League\Flysystem\FilesystemOperator; use Rekalogika\Contracts\File\Exception\File\TemporaryFileException; -class TemporaryFile extends File +final class TemporaryFile extends File { private function __construct( string $key, diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 91eeea5..ca26624 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -12,6 +12,12 @@ parameters: - message: '#Attribute class Override does not exist#' reportUnmatched: false + - + identifier: method.nonObject + path: packages/file-bundle/src/DependencyInjection/Configuration.php + - + identifier: return.unusedType + path: packages/file-symfony-bridge/src/HttpFoundation/ToHttpFoundationFileAdapter.php includes: - vendor/phpstan/phpstan-phpunit/extension.neon diff --git a/psalm.xml b/psalm.xml index d68c956..95c7712 100644 --- a/psalm.xml +++ b/psalm.xml @@ -13,6 +13,7 @@ + @@ -48,36 +49,16 @@ - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + diff --git a/tests/config/packages/flysystem.yaml b/tests/config/packages/flysystem.yaml new file mode 100644 index 0000000..2391f5e --- /dev/null +++ b/tests/config/packages/flysystem.yaml @@ -0,0 +1,4 @@ +flysystem: + storages: + default.storage: + adapter: memory diff --git a/tests/config/packages/rekalogika_file.yaml b/tests/config/packages/rekalogika_file.yaml new file mode 100644 index 0000000..fe24415 --- /dev/null +++ b/tests/config/packages/rekalogika_file.yaml @@ -0,0 +1,5 @@ +rekalogika_file: + filesystems: + # 'default.storage' is the filesystem key under 'flysystem.storages' + # in config/packages/flysystem.yaml + default: 'default.storage' diff --git a/tests/src/App/Controller/TestController.php b/tests/src/App/Controller/TestController.php index 04bd087..e8445ec 100644 --- a/tests/src/App/Controller/TestController.php +++ b/tests/src/App/Controller/TestController.php @@ -17,7 +17,7 @@ use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; -class TestController extends AbstractController +final class TestController extends AbstractController { #[Route('/', name: 'index')] public function index(): Response diff --git a/tests/src/App/Entity/User.php b/tests/src/App/Entity/User.php index 00d65af..5a4d79f 100644 --- a/tests/src/App/Entity/User.php +++ b/tests/src/App/Entity/User.php @@ -14,23 +14,26 @@ namespace Rekalogika\File\Tests\App\Entity; use Doctrine\ORM\Mapping as ORM; +use Rekalogika\Contracts\File\FileInterface; +use Rekalogika\File\Association\Attribute\AsFileAssociation; +use Rekalogika\File\Association\Attribute\WithFileAssociation; #[ORM\Entity] +#[WithFileAssociation] class User { #[ORM\Id, ORM\GeneratedValue, ORM\Column(type: 'integer')] - private ?int $id = null; + private ?int $id = null; // @phpstan-ignore property.unusedType #[ORM\Column(type: 'string', length: 255)] private string $name; - #[ORM\Column(type: 'string', length: 255)] - private string $email; + #[AsFileAssociation] + private ?FileInterface $image = null; - public function __construct(string $name, string $email) + public function __construct(string $name) { $this->name = $name; - $this->email = $email; } public function getId(): ?int @@ -43,9 +46,15 @@ public function getName(): string return $this->name; } - public function getEmail(): string + public function getImage(): ?FileInterface { - return $this->email; + return $this->image; } + public function setImage(?FileInterface $image): self + { + $this->image = $image; + + return $this; + } } diff --git a/tests/src/Factory.php b/tests/src/Factory.php index 775c9f5..a0d0832 100644 --- a/tests/src/Factory.php +++ b/tests/src/Factory.php @@ -18,7 +18,7 @@ use League\Flysystem\InMemory\InMemoryFilesystemAdapter; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; -class Factory +final class Factory { public static function createUrlGenerator(): UrlGeneratorInterface { diff --git a/tests/src/TestKernel.php b/tests/src/TestKernel.php index e825868..b894789 100644 --- a/tests/src/TestKernel.php +++ b/tests/src/TestKernel.php @@ -14,6 +14,7 @@ namespace Rekalogika\File\Tests; use Doctrine\Bundle\DoctrineBundle\DoctrineBundle; +use League\FlysystemBundle\FlysystemBundle; use Rekalogika\Contracts\File\FileRepositoryInterface; use Rekalogika\DirectPropertyAccess\RekalogikaDirectPropertyAccessBundle; use Rekalogika\File\Association\Contracts\FileLocationResolverInterface; @@ -52,7 +53,7 @@ use Symfony\UX\Turbo\TurboBundle; use Twig\Extra\TwigExtraBundle\TwigExtraBundle; -class TestKernel extends HttpKernelKernel +final class TestKernel extends HttpKernelKernel { use MicroKernelTrait { registerContainerConfiguration as private baseRegisterContainerConfiguration; @@ -92,6 +93,7 @@ public function registerBundles(): iterable yield new RekalogikaFileFilePondBundle(); yield new RekalogikaTemporaryUrlBundle(); yield new RekalogikaPsr16SimpleCacheBundle(); + yield new FlysystemBundle(); } #[\Override] @@ -101,6 +103,7 @@ protected function build(ContainerBuilder $container): void } + #[\Override] public function getBuildDir(): string { return $this->getProjectDir() . '/var/build/' . $this->env; diff --git a/tests/src/Tests/File/FileFactory.php b/tests/src/Tests/File/FileFactory.php index 6f43b37..03b8aa7 100644 --- a/tests/src/Tests/File/FileFactory.php +++ b/tests/src/Tests/File/FileFactory.php @@ -25,7 +25,7 @@ use Rekalogika\File\Repository\FileRepository; use Rekalogika\File\Repository\FilesystemRepository; -class FileFactory +final class FileFactory { private function __construct() {} diff --git a/tests/src/Tests/File/FileNameTest.php b/tests/src/Tests/File/FileNameTest.php index 6abad6e..4ca3cb1 100644 --- a/tests/src/Tests/File/FileNameTest.php +++ b/tests/src/Tests/File/FileNameTest.php @@ -16,7 +16,7 @@ use PHPUnit\Framework\TestCase; use Rekalogika\Domain\File\Metadata\Model\FileName; -class FileNameTest extends TestCase +final class FileNameTest extends TestCase { public function testFileName(): void { diff --git a/tests/src/Tests/File/FileRepositoryTest.php b/tests/src/Tests/File/FileRepositoryTest.php index d959e4b..8a8c940 100644 --- a/tests/src/Tests/File/FileRepositoryTest.php +++ b/tests/src/Tests/File/FileRepositoryTest.php @@ -19,7 +19,7 @@ use Rekalogika\Domain\File\Metadata\Constants; use Rekalogika\File\FilePointer; -class FileRepositoryTest extends TestCase +final class FileRepositoryTest extends TestCase { use FileTestTrait; diff --git a/tests/src/Tests/File/FileTest.php b/tests/src/Tests/File/FileTest.php index f5f17fd..0a8ffe1 100644 --- a/tests/src/Tests/File/FileTest.php +++ b/tests/src/Tests/File/FileTest.php @@ -19,7 +19,7 @@ use Rekalogika\File\File; use Rekalogika\File\TemporaryFile; -class FileTest extends TestCase +final class FileTest extends TestCase { use FileTestTrait; @@ -145,7 +145,11 @@ public function testNaming(): void public function testOpenBasedir(): void { $openBaseDir = realpath(__DIR__ . '/../../../../'); + $this->assertIsString($openBaseDir); + $dir = realpath(__DIR__ . '/../../../'); + $this->assertIsString($dir); + ini_set('open_basedir', $openBaseDir . ":" . '/tmp'); mkdir($dir . '/var/', 0777, true); $path = $dir . '/var/test.txt'; diff --git a/tests/src/Tests/File/FileTestTrait.php b/tests/src/Tests/File/FileTestTrait.php index 9ce4dc5..b48855a 100644 --- a/tests/src/Tests/File/FileTestTrait.php +++ b/tests/src/Tests/File/FileTestTrait.php @@ -86,6 +86,7 @@ protected function assertFileInterface( $this->assertSame($file->getSize(), \strlen($content)); // last modified + // @phpstan-ignore method.alreadyNarrowedType $this->assertInstanceOf(\DateTimeInterface::class, $file->getLastModified()); // metadata tests @@ -98,6 +99,7 @@ protected function assertFileInterface( $this->assertSame($metadata->get(Constants::FILE_TYPE), $type); $fileMetadata = $file->get(FileMetadataInterface::class); + // @phpstan-ignore method.alreadyNarrowedType $this->assertNotNull($fileMetadata); $this->assertSame((string) $fileMetadata->getType(), $type); diff --git a/tests/src/Tests/File/FileTypeTest.php b/tests/src/Tests/File/FileTypeTest.php index b15c7d9..869be9d 100644 --- a/tests/src/Tests/File/FileTypeTest.php +++ b/tests/src/Tests/File/FileTypeTest.php @@ -17,7 +17,7 @@ use Rekalogika\Domain\File\Metadata\Model\MimeMapFileTypeAdapter; use Symfony\Contracts\Translation\TranslatableInterface; -class FileTypeTest extends TestCase +final class FileTypeTest extends TestCase { public function testFileType(): void { @@ -37,6 +37,7 @@ public function testUnknownFileType(): void { $type = new MimeMapFileTypeAdapter('application/x-zerosize'); $this->assertSame('Unknown file type (application/x-zerosize)', (string) $type->getDescription()); + // @phpstan-ignore method.alreadyNarrowedType $this->assertInstanceOf(TranslatableInterface::class, $type->getDescription()); } } diff --git a/tests/src/Tests/File/FilesystemRepositoryTest.php b/tests/src/Tests/File/FilesystemRepositoryTest.php index b603658..1129b67 100644 --- a/tests/src/Tests/File/FilesystemRepositoryTest.php +++ b/tests/src/Tests/File/FilesystemRepositoryTest.php @@ -20,13 +20,14 @@ use Rekalogika\File\Exception\FilesystemRepository\FilesystemAlreadyExistsException; use Rekalogika\File\Exception\FilesystemRepository\FilesystemNotFoundException; -class FilesystemRepositoryTest extends TestCase +final class FilesystemRepositoryTest extends TestCase { public function testFilesystemRepository(): void { $repository = FileFactory::createFilesystemRepository(); $localFilesystem = $repository->getFilesystem(null); + // @phpstan-ignore method.alreadyNarrowedType $this->assertInstanceOf(FilesystemOperator::class, $localFilesystem); } @@ -39,6 +40,7 @@ public function testAddFilesystem(): void new Filesystem(new LocalFilesystemAdapter('/tmp')), ); $filesystem = $repository->getFilesystem('test'); + // @phpstan-ignore method.alreadyNarrowedType $this->assertInstanceOf(FilesystemOperator::class, $filesystem); } diff --git a/tests/src/Tests/File/FromSplFileInfoAdapterTest.php b/tests/src/Tests/File/FromSplFileInfoAdapterTest.php index 4616a71..de06de6 100644 --- a/tests/src/Tests/File/FromSplFileInfoAdapterTest.php +++ b/tests/src/Tests/File/FromSplFileInfoAdapterTest.php @@ -16,7 +16,7 @@ use PHPUnit\Framework\TestCase; use Rekalogika\File\Adapter\FromSplFileInfoAdapter; -class FromSplFileInfoAdapterTest extends TestCase +final class FromSplFileInfoAdapterTest extends TestCase { use FileTestTrait; diff --git a/tests/src/Tests/File/MetadataSerializerTest.php b/tests/src/Tests/File/MetadataSerializerTest.php index be88e41..f51b996 100644 --- a/tests/src/Tests/File/MetadataSerializerTest.php +++ b/tests/src/Tests/File/MetadataSerializerTest.php @@ -19,7 +19,7 @@ use Rekalogika\File\MetadataSerializer\MetadataSerializer; use Rekalogika\File\RawMetadata; -class MetadataSerializerTest extends TestCase +final class MetadataSerializerTest extends TestCase { public function testSerialize(): void { diff --git a/tests/src/Tests/File/MetadataTest.php b/tests/src/Tests/File/MetadataTest.php index 2eb3c39..0fc16b1 100644 --- a/tests/src/Tests/File/MetadataTest.php +++ b/tests/src/Tests/File/MetadataTest.php @@ -19,7 +19,7 @@ use Rekalogika\Domain\File\Metadata\Metadata\HttpMetadata; use Rekalogika\File\RawMetadata; -class MetadataTest extends TestCase +final class MetadataTest extends TestCase { private string $originalTimeZone = 'UTC'; diff --git a/tests/src/Tests/File/ReferenceTest.php b/tests/src/Tests/File/ReferenceTest.php index e095cf8..50f530f 100644 --- a/tests/src/Tests/File/ReferenceTest.php +++ b/tests/src/Tests/File/ReferenceTest.php @@ -22,7 +22,7 @@ use Rekalogika\Domain\File\Metadata\Constants; use Rekalogika\File\FilePointer; -class ReferenceTest extends TestCase +final class ReferenceTest extends TestCase { use FileTestTrait; diff --git a/tests/src/Tests/FileAssociation/CommandTest.php b/tests/src/Tests/FileAssociation/CommandTest.php new file mode 100644 index 0000000..746aea2 --- /dev/null +++ b/tests/src/Tests/FileAssociation/CommandTest.php @@ -0,0 +1,53 @@ + + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +namespace Rekalogika\File\Tests\Tests\FileAssociation; + +use Doctrine\ORM\EntityManagerInterface; +use Rekalogika\File\File; +use Rekalogika\File\Tests\App\Entity\User; +use Symfony\Bundle\FrameworkBundle\Console\Application; +use Symfony\Component\Console\Tester\CommandTester; + +final class CommandTest extends DoctrineTestCase +{ + public function testCommand(): void + { + /** @var EntityManagerInterface */ + $entityManager = static::getContainer()->get(EntityManagerInterface::class); + + $image = new File(__DIR__ . '/../Resources/smiley.png'); + $user = new User('foo'); + $user->setImage($image); + + $entityManager->persist($user); + $entityManager->flush(); + + /** + * @psalm-suppress InvalidArgument + * @phpstan-ignore argument.type + */ + $application = new Application(self::$kernel); + $command = $application->find('rekalogika:file:resolve'); + $commandTester = new CommandTester($command); + $commandTester->execute([ + 'class' => User::class, + 'id' => (string) $user->getId(), + 'property' => 'image', + ]); + + $commandTester->assertCommandIsSuccessful(); + $output = $commandTester->getDisplay(); + $this->assertStringContainsString('entity/', $output); + } +} diff --git a/tests/src/Tests/FileAssociation/DefaultFileLocationResolverTest.php b/tests/src/Tests/FileAssociation/DefaultFileLocationResolverTest.php index 8e5e2c6..6a99e1d 100644 --- a/tests/src/Tests/FileAssociation/DefaultFileLocationResolverTest.php +++ b/tests/src/Tests/FileAssociation/DefaultFileLocationResolverTest.php @@ -18,7 +18,7 @@ use Rekalogika\File\Association\ObjectIdResolver\DefaultObjectIdResolver; use Rekalogika\File\Tests\Tests\Model\Entity; -class DefaultFileLocationResolverTest extends TestCase +final class DefaultFileLocationResolverTest extends TestCase { public function testDefaultLocationResolver(): void { diff --git a/tests/src/Tests/FileAssociation/DefaultObjectIdResolverTest.php b/tests/src/Tests/FileAssociation/DefaultObjectIdResolverTest.php index 2a20318..dcc4141 100644 --- a/tests/src/Tests/FileAssociation/DefaultObjectIdResolverTest.php +++ b/tests/src/Tests/FileAssociation/DefaultObjectIdResolverTest.php @@ -21,7 +21,7 @@ use Rekalogika\File\Tests\Tests\Model\EntityWithAnyId; use Rekalogika\File\Tests\Tests\Model\EntityWithoutId; -class DefaultObjectIdResolverTest extends TestCase +final class DefaultObjectIdResolverTest extends TestCase { public function testIntegerIdDefaultObjectIdResolver(): void { diff --git a/tests/src/Tests/FileAssociation/DoctrineTestCase.php b/tests/src/Tests/FileAssociation/DoctrineTestCase.php new file mode 100644 index 0000000..3d46820 --- /dev/null +++ b/tests/src/Tests/FileAssociation/DoctrineTestCase.php @@ -0,0 +1,37 @@ + + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +namespace Rekalogika\File\Tests\Tests\FileAssociation; + +use Doctrine\ORM\EntityManagerInterface; +use Doctrine\ORM\Tools\SchemaTool; +use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; + +abstract class DoctrineTestCase extends KernelTestCase +{ + #[\Override] + public function setUp(): void + { + parent::setUp(); + + // save entity manager to class property + + $entityManager = static::getContainer()->get('doctrine.orm.entity_manager'); + $this->assertInstanceOf(EntityManagerInterface::class, $entityManager); + + // create schema + + $schemaTool = new SchemaTool($entityManager); + $schemaTool->createSchema($entityManager->getMetadataFactory()->getAllMetadata()); + } +} diff --git a/tests/src/Tests/FileAssociation/FileAssociationManagerTest.php b/tests/src/Tests/FileAssociation/FileAssociationManagerTest.php index 7a5930b..6ec7469 100644 --- a/tests/src/Tests/FileAssociation/FileAssociationManagerTest.php +++ b/tests/src/Tests/FileAssociation/FileAssociationManagerTest.php @@ -26,7 +26,7 @@ use Rekalogika\File\Tests\Tests\Model\EntityWithMandatoryFile; use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; -class FileAssociationManagerTest extends KernelTestCase +final class FileAssociationManagerTest extends KernelTestCase { use FileTestTrait; @@ -40,6 +40,7 @@ protected function setUp(): void $fileAssociationManager = static::getContainer() ->get(FileAssociationManager::class); + // @phpstan-ignore method.alreadyNarrowedType $this->assertInstanceOf( FileAssociationManager::class, $fileAssociationManager, @@ -50,6 +51,7 @@ protected function setUp(): void $fileRepository = static::getContainer() ->get(FileRepositoryInterface::class); + // @phpstan-ignore method.alreadyNarrowedType $this->assertInstanceOf( FileRepositoryInterface::class, $fileRepository, @@ -71,6 +73,7 @@ public function testPersistEntity(): void $entity->setFile($newFile); $file = $entity->getFile(); + // @phpstan-ignore method.impossibleType $this->assertInstanceOf(TemporaryFile::class, $file); $oldPointer = $file->getPointer(); @@ -80,6 +83,7 @@ public function testPersistEntity(): void $this->assertInstanceOf(File::class, $file); $newPointer = $file->getPointer(); + // @phpstan-ignore argument.type $this->assertFalse($newPointer->isEqualTo($oldPointer)); $this->assertFileInterface( file: $file, @@ -163,6 +167,7 @@ public function testLoadEntity(): void $this->fileAssociationManager?->load($entity); $file = $entity->getFile(); + /** @psalm-suppress DocblockTypeContradiction */ $this->assertInstanceOf(File::class, $file); // remove @@ -196,6 +201,7 @@ public function testLazyLoadEntity(): void $this->fileAssociationManager?->load($entity); $file = $entity->getFile(); + /** @psalm-suppress DocblockTypeContradiction */ $this->assertInstanceOf(FileProxy::class, $file); // remove diff --git a/tests/src/Tests/FileAssociation/PropertyInspectorTest.php b/tests/src/Tests/FileAssociation/PropertyInspectorTest.php index dea5cc3..8bd2fa7 100644 --- a/tests/src/Tests/FileAssociation/PropertyInspectorTest.php +++ b/tests/src/Tests/FileAssociation/PropertyInspectorTest.php @@ -17,7 +17,7 @@ use Rekalogika\File\Association\PropertyInspector\PropertyInspector; use Rekalogika\File\Tests\Tests\Model\EntityWithDifferentFileProperties; -class PropertyInspectorTest extends TestCase +final class PropertyInspectorTest extends TestCase { public function testPropertyInspector(): void { diff --git a/tests/src/Tests/FileAssociation/PropertyListerTest.php b/tests/src/Tests/FileAssociation/PropertyListerTest.php index ec6f77b..1a1a2fb 100644 --- a/tests/src/Tests/FileAssociation/PropertyListerTest.php +++ b/tests/src/Tests/FileAssociation/PropertyListerTest.php @@ -18,7 +18,7 @@ use Rekalogika\File\Tests\Tests\Model\EntityWithAttribute; use Rekalogika\File\Tests\Tests\Model\SubclassOfEntityWithAttribute; -class PropertyListerTest extends TestCase +final class PropertyListerTest extends TestCase { public function testAttributePropertyLister(): void { diff --git a/tests/src/Tests/FileAssociationEntity/AbstractFileTest.php b/tests/src/Tests/FileAssociationEntity/AbstractFileTest.php index ac127bb..d310350 100644 --- a/tests/src/Tests/FileAssociationEntity/AbstractFileTest.php +++ b/tests/src/Tests/FileAssociationEntity/AbstractFileTest.php @@ -22,7 +22,7 @@ use Rekalogika\File\Tests\Tests\File\FileTestTrait; use Rekalogika\File\Tests\Tests\Model\EntityExtendingAbstractFile; -class AbstractFileTest extends TestCase +final class AbstractFileTest extends TestCase { use FileTestTrait; diff --git a/tests/src/Tests/FileAssociationEntity/EmbeddedMetadataTest.php b/tests/src/Tests/FileAssociationEntity/EmbeddedMetadataTest.php index 9965a46..ad2de0f 100644 --- a/tests/src/Tests/FileAssociationEntity/EmbeddedMetadataTest.php +++ b/tests/src/Tests/FileAssociationEntity/EmbeddedMetadataTest.php @@ -21,7 +21,7 @@ use Rekalogika\File\Tests\Tests\File\FileTestTrait; use Rekalogika\File\Tests\Tests\Model\EntityWithEmbeddedMetadata; -class EmbeddedMetadataTest extends TestCase +final class EmbeddedMetadataTest extends TestCase { use FileTestTrait; @@ -61,6 +61,7 @@ public function testEmbeddedMetadata(): void $originalMetadata = $file->get(RawMetadataInterface::class); $this->assertInstanceOf(RawMetadataInterface::class, $originalMetadata); $entityMetadata = $entity->getFileMetadata(); + // @phpstan-ignore method.alreadyNarrowedType $this->assertInstanceOf(RawMetadataInterface::class, $entityMetadata); $this->assertSame( diff --git a/tests/src/Tests/FileContracts/FileProxyTest.php b/tests/src/Tests/FileContracts/FileProxyTest.php index 9353092..1ddda10 100644 --- a/tests/src/Tests/FileContracts/FileProxyTest.php +++ b/tests/src/Tests/FileContracts/FileProxyTest.php @@ -24,7 +24,7 @@ use Rekalogika\File\Tests\Tests\Model\EntityWithFileProxyUtilGetterSetter; use Rekalogika\File\Tests\Tests\Model\EntityWithPlainGetterSetter; -class FileProxyTest extends TestCase +final class FileProxyTest extends TestCase { use FileTestTrait; @@ -32,7 +32,6 @@ public function testProxy(): void { $fileRepository = FileFactory::createFileRepository(); - $this->assertTrue(true); $file = TemporaryFile::createFromString('foo', 'test.txt'); $pointer = $file->getPointer(); $proxy = new FileProxy($pointer, $fileRepository); diff --git a/tests/src/Tests/FileImage/ImageResizerTest.php b/tests/src/Tests/FileImage/ImageResizerTest.php index 79511a3..a26f13e 100644 --- a/tests/src/Tests/FileImage/ImageResizerTest.php +++ b/tests/src/Tests/FileImage/ImageResizerTest.php @@ -20,7 +20,7 @@ use Rekalogika\File\Image\ImageResizer; use Rekalogika\File\Tests\Tests\File\FileFactory; -class ImageResizerTest extends TestCase +final class ImageResizerTest extends TestCase { private FileRepositoryInterface $fileRepository; @@ -49,4 +49,24 @@ public function testImageResizer(): void $this->assertEquals(120, $resizedFile->get(ImageMetadataInterface::class)?->getHeight()); $this->assertEquals('smiley.d/square-120', $resizedFile->getKey()); } + + public function testCorruptImage(): void + { + $file = $this->fileRepository->createFromLocalFile( + new FilePointer('inmemory', 'corrupt'), + __DIR__ . '/../Resources/corrupt.jpg', + ); + + $imageResizer = new ImageResizer(); + $imageResizer->setFileRepository($this->fileRepository); + + $resizedFile = $imageResizer + ->take($file) + ->resize(120, ImageResizer::ASPECTRATIO_SQUARE) + ->getResult(); + + $this->assertEquals(120, $resizedFile->get(ImageMetadataInterface::class)?->getWidth()); + $this->assertEquals(120, $resizedFile->get(ImageMetadataInterface::class)?->getHeight()); + $this->assertEquals('corrupt.d/square-120', $resizedFile->getKey()); + } } diff --git a/tests/src/Tests/FileNull/NullFileTest.php b/tests/src/Tests/FileNull/NullFileTest.php index 42c098b..a1a2d36 100644 --- a/tests/src/Tests/FileNull/NullFileTest.php +++ b/tests/src/Tests/FileNull/NullFileTest.php @@ -22,7 +22,7 @@ use Rekalogika\Domain\File\Null\NullType; use Rekalogika\File\File; -class NullFileTest extends TestCase +final class NullFileTest extends TestCase { public function testNullFile(): void { @@ -31,6 +31,7 @@ public function testNullFile(): void $nullName = $nullFile->getName(); $nullPointer = $nullFile->getPointer(); + // @phpstan-ignore method.alreadyNarrowedType $this->assertInstanceOf(NullFile::class, $nullFile); $this->assertInstanceOf(NullType::class, $nullType); $this->assertInstanceOf(NullName::class, $nullName); diff --git a/tests/src/Tests/FileServer/TemporaryUrlTest.php b/tests/src/Tests/FileServer/TemporaryUrlTest.php index 886e7ae..4bc342d 100644 --- a/tests/src/Tests/FileServer/TemporaryUrlTest.php +++ b/tests/src/Tests/FileServer/TemporaryUrlTest.php @@ -18,7 +18,7 @@ use Rekalogika\TemporaryUrl\TemporaryUrlGeneratorInterface; use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; -class TemporaryUrlTest extends KernelTestCase +final class TemporaryUrlTest extends KernelTestCase { public function testTemporaryUrlWithFilePointer(): void { diff --git a/tests/src/Tests/FileSymfonyBridge/FileAdapterTest.php b/tests/src/Tests/FileSymfonyBridge/FileAdapterTest.php index 7135d5c..eae8955 100644 --- a/tests/src/Tests/FileSymfonyBridge/FileAdapterTest.php +++ b/tests/src/Tests/FileSymfonyBridge/FileAdapterTest.php @@ -24,7 +24,7 @@ use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; use Symfony\Component\HttpFoundation\File\File; -class FileAdapterTest extends KernelTestCase +final class FileAdapterTest extends KernelTestCase { use FileTestTrait; @@ -33,6 +33,7 @@ private function createRemoteFile(): FileInterface $fileRepository = static::getContainer() ->get(FileRepositoryInterface::class); + // @phpstan-ignore method.alreadyNarrowedType $this->assertInstanceOf(FileRepositoryInterface::class, $fileRepository); return $fileRepository->createFromString(new FilePointer('default', 'key'), 'asdf'); diff --git a/tests/src/Tests/FileSymfonyBridge/FileExtensionTest.php b/tests/src/Tests/FileSymfonyBridge/FileExtensionTest.php index e87442d..6482af5 100644 --- a/tests/src/Tests/FileSymfonyBridge/FileExtensionTest.php +++ b/tests/src/Tests/FileSymfonyBridge/FileExtensionTest.php @@ -22,7 +22,7 @@ use Symfony\Component\Form\Test\TypeTestCase; use Symfony\Component\HttpFoundation\File\UploadedFile; -class FileExtensionTest extends TypeTestCase +final class FileExtensionTest extends TypeTestCase { use FileTestTrait; @@ -53,9 +53,6 @@ public function testFileType(): void ); } - /** - * @return array - */ #[\Override] protected function getTypeExtensions(): array { diff --git a/tests/src/Tests/FileSymfonyBridge/FileResponseTest.php b/tests/src/Tests/FileSymfonyBridge/FileResponseTest.php index 435fa85..f2b7e76 100644 --- a/tests/src/Tests/FileSymfonyBridge/FileResponseTest.php +++ b/tests/src/Tests/FileSymfonyBridge/FileResponseTest.php @@ -18,7 +18,7 @@ use Rekalogika\File\File; use Symfony\Component\HttpFoundation\Response; -class FileResponseTest extends TestCase +final class FileResponseTest extends TestCase { public function testResponse(): void { diff --git a/tests/src/Tests/FileSymfonyBridge/FileTransformerTest.php b/tests/src/Tests/FileSymfonyBridge/FileTransformerTest.php index 5a30f46..677bdc3 100644 --- a/tests/src/Tests/FileSymfonyBridge/FileTransformerTest.php +++ b/tests/src/Tests/FileSymfonyBridge/FileTransformerTest.php @@ -18,7 +18,7 @@ use Rekalogika\File\TemporaryFile; use Symfony\Component\HttpFoundation\File\File; -class FileTransformerTest extends TestCase +final class FileTransformerTest extends TestCase { public function testTransform(): void { diff --git a/tests/src/Tests/FileSymfonyBridge/FileTypeTest.php b/tests/src/Tests/FileSymfonyBridge/FileTypeTest.php index 7abb348..c869e15 100644 --- a/tests/src/Tests/FileSymfonyBridge/FileTypeTest.php +++ b/tests/src/Tests/FileSymfonyBridge/FileTypeTest.php @@ -21,7 +21,7 @@ use Symfony\Component\Form\Test\TypeTestCase; use Symfony\Component\HttpFoundation\File\UploadedFile; -class FileTypeTest extends TypeTestCase +final class FileTypeTest extends TypeTestCase { use FileTestTrait; diff --git a/tests/src/Tests/FileSymfonyBridge/FileValidatorTest.php b/tests/src/Tests/FileSymfonyBridge/FileValidatorTest.php index 618b488..d9b5b7b 100644 --- a/tests/src/Tests/FileSymfonyBridge/FileValidatorTest.php +++ b/tests/src/Tests/FileSymfonyBridge/FileValidatorTest.php @@ -22,7 +22,7 @@ /** * @extends ConstraintValidatorTestCase */ -class FileValidatorTest extends ConstraintValidatorTestCase +final class FileValidatorTest extends ConstraintValidatorTestCase { #[\Override] protected function createValidator(): ConstraintValidatorInterface @@ -45,8 +45,12 @@ public function testExceedingMaxsize(): void $this->validator->validate($file, $constraint); $violation = $this->context->getViolations()->get(0); - $file = (string) $violation->getParameters()['{{ file }}']; - $name = (string) $violation->getParameters()['{{ name }}']; + /** @psalm-suppress MixedAssignment */ + $file = $violation->getParameters()['{{ file }}']; + $name = $violation->getParameters()['{{ name }}']; + + $this->assertIsString($file); + $this->assertIsString($name); /** @var string */ $maxSizeMessage = $constraint->maxSizeMessage; diff --git a/tests/src/Tests/FileSymfonyBridge/ImageValidatorTest.php b/tests/src/Tests/FileSymfonyBridge/ImageValidatorTest.php index 1b3097e..343b8c1 100644 --- a/tests/src/Tests/FileSymfonyBridge/ImageValidatorTest.php +++ b/tests/src/Tests/FileSymfonyBridge/ImageValidatorTest.php @@ -22,7 +22,7 @@ /** * @extends ConstraintValidatorTestCase */ -class ImageValidatorTest extends ConstraintValidatorTestCase +final class ImageValidatorTest extends ConstraintValidatorTestCase { #[\Override] protected function createValidator(): ConstraintValidatorInterface diff --git a/tests/src/Tests/FileZip/ZipTest.php b/tests/src/Tests/FileZip/ZipTest.php index eea4584..29b8dea 100644 --- a/tests/src/Tests/FileZip/ZipTest.php +++ b/tests/src/Tests/FileZip/ZipTest.php @@ -20,7 +20,7 @@ use Rekalogika\File\Zip\Model\Directory; use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; -class ZipTest extends KernelTestCase +final class ZipTest extends KernelTestCase { private ?FileRepositoryInterface $fileRepository = null; @@ -32,6 +32,7 @@ protected function setUp(): void $fileRepository = static::getContainer() ->get(FileRepositoryInterface::class); + // @phpstan-ignore method.alreadyNarrowedType $this->assertInstanceOf( FileRepositoryInterface::class, $fileRepository, @@ -42,6 +43,7 @@ protected function setUp(): void $fileZip = static::getContainer() ->get(FileZip::class); + // @phpstan-ignore method.alreadyNarrowedType $this->assertInstanceOf( FileZip::class, $fileZip, diff --git a/tests/src/Tests/Model/Entity.php b/tests/src/Tests/Model/Entity.php index 212e51d..996f447 100644 --- a/tests/src/Tests/Model/Entity.php +++ b/tests/src/Tests/Model/Entity.php @@ -16,7 +16,7 @@ use Rekalogika\Contracts\File\Association\FileAssociationInterface; use Rekalogika\Contracts\File\FileInterface; -class Entity implements FileAssociationInterface +final class Entity implements FileAssociationInterface { private ?FileInterface $file = null; @@ -35,9 +35,6 @@ public function getId(): string return $this->id; } - /** - * @phpstan-impure - */ public function getFile(): ?FileInterface { return $this->file; diff --git a/tests/src/Tests/Model/EntityExtendingAbstractFile.php b/tests/src/Tests/Model/EntityExtendingAbstractFile.php index 56e5941..949fffc 100644 --- a/tests/src/Tests/Model/EntityExtendingAbstractFile.php +++ b/tests/src/Tests/Model/EntityExtendingAbstractFile.php @@ -17,4 +17,4 @@ use Rekalogika\Domain\File\Association\Entity\AbstractFile; #[Entity()] -class EntityExtendingAbstractFile extends AbstractFile {} +final class EntityExtendingAbstractFile extends AbstractFile {} diff --git a/tests/src/Tests/Model/EntityWithAnyId.php b/tests/src/Tests/Model/EntityWithAnyId.php index cdd0584..3455fdd 100644 --- a/tests/src/Tests/Model/EntityWithAnyId.php +++ b/tests/src/Tests/Model/EntityWithAnyId.php @@ -13,7 +13,7 @@ namespace Rekalogika\File\Tests\Tests\Model; -class EntityWithAnyId +final class EntityWithAnyId { public function __construct( private readonly mixed $id, diff --git a/tests/src/Tests/Model/EntityWithAttribute.php b/tests/src/Tests/Model/EntityWithAttribute.php index 44ed8c4..2d12ac7 100644 --- a/tests/src/Tests/Model/EntityWithAttribute.php +++ b/tests/src/Tests/Model/EntityWithAttribute.php @@ -32,9 +32,6 @@ public function getId(): string return $this->id; } - /** - * @phpstan-impure - */ public function getFile(): ?FileInterface { return $this->file; diff --git a/tests/src/Tests/Model/EntityWithDifferentFileProperties.php b/tests/src/Tests/Model/EntityWithDifferentFileProperties.php index 2a272b2..6f312e9 100644 --- a/tests/src/Tests/Model/EntityWithDifferentFileProperties.php +++ b/tests/src/Tests/Model/EntityWithDifferentFileProperties.php @@ -17,7 +17,7 @@ use Rekalogika\File\Association\Attribute\AsFileAssociation; /** @psalm-suppress MissingConstructor */ -class EntityWithDifferentFileProperties +final class EntityWithDifferentFileProperties { #[AsFileAssociation(fetch: 'EAGER')] protected ?FileInterface $mandatoryEager = null; diff --git a/tests/src/Tests/Model/EntityWithEmbeddedMetadata.php b/tests/src/Tests/Model/EntityWithEmbeddedMetadata.php index a68c159..c698d72 100644 --- a/tests/src/Tests/Model/EntityWithEmbeddedMetadata.php +++ b/tests/src/Tests/Model/EntityWithEmbeddedMetadata.php @@ -21,7 +21,7 @@ use Rekalogika\Domain\File\Association\Entity\FileDecorator; #[Entity()] -class EntityWithEmbeddedMetadata +final class EntityWithEmbeddedMetadata { private ?FileInterface $file = null; diff --git a/tests/src/Tests/Model/EntityWithFileProxyUtilGetterSetter.php b/tests/src/Tests/Model/EntityWithFileProxyUtilGetterSetter.php index 69287e4..4a17ca2 100644 --- a/tests/src/Tests/Model/EntityWithFileProxyUtilGetterSetter.php +++ b/tests/src/Tests/Model/EntityWithFileProxyUtilGetterSetter.php @@ -16,7 +16,7 @@ use Rekalogika\Contracts\File\FileInterface; use Rekalogika\Contracts\File\FileProxy; -class EntityWithFileProxyUtilGetterSetter +final class EntityWithFileProxyUtilGetterSetter { public function __construct( private ?FileInterface $file = null, diff --git a/tests/src/Tests/Model/EntityWithLazyFile.php b/tests/src/Tests/Model/EntityWithLazyFile.php index e2d0d7f..90e2500 100644 --- a/tests/src/Tests/Model/EntityWithLazyFile.php +++ b/tests/src/Tests/Model/EntityWithLazyFile.php @@ -18,7 +18,7 @@ use Rekalogika\File\Association\Attribute\WithFileAssociation; #[WithFileAssociation] -class EntityWithLazyFile +final class EntityWithLazyFile { #[AsFileAssociation(fetch: 'LAZY')] private ?FileInterface $file = null; diff --git a/tests/src/Tests/Model/EntityWithMandatoryFile.php b/tests/src/Tests/Model/EntityWithMandatoryFile.php index 938fd41..7c2d3f7 100644 --- a/tests/src/Tests/Model/EntityWithMandatoryFile.php +++ b/tests/src/Tests/Model/EntityWithMandatoryFile.php @@ -18,7 +18,7 @@ use Rekalogika\File\Association\Attribute\WithFileAssociation; #[WithFileAssociation] -class EntityWithMandatoryFile +final class EntityWithMandatoryFile { #[AsFileAssociation] private FileInterface $file; diff --git a/tests/src/Tests/Model/EntityWithPlainGetterSetter.php b/tests/src/Tests/Model/EntityWithPlainGetterSetter.php index 97e4610..7f3d279 100644 --- a/tests/src/Tests/Model/EntityWithPlainGetterSetter.php +++ b/tests/src/Tests/Model/EntityWithPlainGetterSetter.php @@ -15,7 +15,7 @@ use Rekalogika\Contracts\File\FileInterface; -class EntityWithPlainGetterSetter +final class EntityWithPlainGetterSetter { public function __construct( private ?FileInterface $file = null, diff --git a/tests/src/Tests/Model/EntityWithoutId.php b/tests/src/Tests/Model/EntityWithoutId.php index d15d0e2..dc47b3c 100644 --- a/tests/src/Tests/Model/EntityWithoutId.php +++ b/tests/src/Tests/Model/EntityWithoutId.php @@ -15,13 +15,10 @@ use Rekalogika\Contracts\File\FileInterface; -class EntityWithoutId +final class EntityWithoutId { private ?FileInterface $file = null; - /** - * @phpstan-impure - */ public function getFile(): ?FileInterface { return $this->file; diff --git a/tests/src/Tests/Model/SubclassOfEntityWithAttribute.php b/tests/src/Tests/Model/SubclassOfEntityWithAttribute.php index a5dae87..c0c9ca3 100644 --- a/tests/src/Tests/Model/SubclassOfEntityWithAttribute.php +++ b/tests/src/Tests/Model/SubclassOfEntityWithAttribute.php @@ -16,7 +16,7 @@ use Rekalogika\Contracts\File\FileInterface; use Rekalogika\File\Association\Attribute\AsFileAssociation; -class SubclassOfEntityWithAttribute extends EntityWithAttribute +final class SubclassOfEntityWithAttribute extends EntityWithAttribute { #[AsFileAssociation] private ?FileInterface $anotherFile = null; diff --git a/tests/src/Tests/Resources/corrupt.jpg b/tests/src/Tests/Resources/corrupt.jpg new file mode 100644 index 0000000..b772794 Binary files /dev/null and b/tests/src/Tests/Resources/corrupt.jpg differ