例行性安全性更新&合并PR

This commit is contained in:
celaraze 2023-02-28 10:57:59 +08:00
parent 9e81dd15a9
commit a478e48167
143 changed files with 5262 additions and 1500 deletions

View File

@ -1,21 +1,28 @@
{
"name": "adldap2/adldap2-laravel",
"description": "LDAP Authentication & Management for Laravel.",
"keywords": ["adldap", "adldap2", "ldap", "laravel"],
"keywords": [
"adldap",
"adldap2",
"ldap",
"laravel"
],
"license": "MIT",
"type": "project",
"require": {
"php": ">=7.1",
"adldap2/adldap2": "^10.1",
"illuminate/support": "~5.5|~6.0|~7.0|~8.0|~9.0"
"illuminate/support": "~5.5|~6.0|~7.0|~8.0|~9.0|^10.0"
},
"require-dev": {
"mockery/mockery": "~1.0",
"phpunit/phpunit": "~7.0|~8.0",
"orchestra/testbench": "~3.7|~4.0"
"phpunit/phpunit": "~7.0|~8.0|^9.5.10",
"orchestra/testbench": "~3.7|~4.0|^8.0"
},
"archive": {
"exclude": ["/tests"]
"exclude": [
"/tests"
]
},
"autoload": {
"psr-4": {

View File

@ -32,6 +32,7 @@ jobs:
- "7.4"
- "8.0"
- "8.1"
- "8.2"
name: PHP ${{ matrix.php-version }} tests

View File

@ -29,14 +29,14 @@
"php": ">=7.0",
"ext-ldap": "*",
"ext-json": "*",
"psr/log": "~1.0|~2.0|~3.0",
"psr/simple-cache": "~1.0|~2.0",
"tightenco/collect": "~5.0|~6.0|~7.0|~8.0",
"illuminate/contracts": "~5.0|~6.0|~7.0|~8.0|~9.0"
"psr/log": "^1.0|^2.0|^3.0",
"psr/simple-cache": "^1.0|^2.0|^3.0",
"tightenco/collect": "^5.0|^6.0|^7.0|^8.0|^9.0",
"illuminate/contracts": "^5.0|^6.0|^7.0|^8.0|^9.0|^10.0"
},
"require-dev": {
"symfony/phpunit-bridge": "~5.2|~6.0",
"mockery/mockery": "~1.0"
"symfony/phpunit-bridge": "^5.2|^6.0",
"mockery/mockery": "^1.0"
},
"suggest": {
"ext-fileinfo": "fileinfo is required when retrieving user encoded thumbnails"

View File

@ -2981,6 +2981,7 @@ return array(
'Illuminate\\Cache\\Events\\CacheMissed' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/Events/CacheMissed.php',
'Illuminate\\Cache\\Events\\KeyForgotten' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/Events/KeyForgotten.php',
'Illuminate\\Cache\\Events\\KeyWritten' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/Events/KeyWritten.php',
'Illuminate\\Cache\\FileLock' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/FileLock.php',
'Illuminate\\Cache\\FileStore' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/FileStore.php',
'Illuminate\\Cache\\HasCacheLock' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/HasCacheLock.php',
'Illuminate\\Cache\\Lock' => $vendorDir . '/laravel/framework/src/Illuminate/Cache/Lock.php',
@ -3368,6 +3369,7 @@ return array(
'Illuminate\\Database\\Query\\Grammars\\PostgresGrammar' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Query/Grammars/PostgresGrammar.php',
'Illuminate\\Database\\Query\\Grammars\\SQLiteGrammar' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Query/Grammars/SQLiteGrammar.php',
'Illuminate\\Database\\Query\\Grammars\\SqlServerGrammar' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Query/Grammars/SqlServerGrammar.php',
'Illuminate\\Database\\Query\\IndexHint' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Query/IndexHint.php',
'Illuminate\\Database\\Query\\JoinClause' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Query/JoinClause.php',
'Illuminate\\Database\\Query\\Processors\\MySqlProcessor' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Query/Processors/MySqlProcessor.php',
'Illuminate\\Database\\Query\\Processors\\PostgresProcessor' => $vendorDir . '/laravel/framework/src/Illuminate/Database/Query/Processors/PostgresProcessor.php',
@ -3637,6 +3639,7 @@ return array(
'Illuminate\\Mail\\Transport\\ArrayTransport' => $vendorDir . '/laravel/framework/src/Illuminate/Mail/Transport/ArrayTransport.php',
'Illuminate\\Mail\\Transport\\LogTransport' => $vendorDir . '/laravel/framework/src/Illuminate/Mail/Transport/LogTransport.php',
'Illuminate\\Mail\\Transport\\SesTransport' => $vendorDir . '/laravel/framework/src/Illuminate/Mail/Transport/SesTransport.php',
'Illuminate\\Mail\\Transport\\SesV2Transport' => $vendorDir . '/laravel/framework/src/Illuminate/Mail/Transport/SesV2Transport.php',
'Illuminate\\Notifications\\Action' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/Action.php',
'Illuminate\\Notifications\\AnonymousNotifiable' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/AnonymousNotifiable.php',
'Illuminate\\Notifications\\ChannelManager' => $vendorDir . '/laravel/framework/src/Illuminate/Notifications/ChannelManager.php',
@ -6466,6 +6469,9 @@ return array(
'Spipu\\Html2Pdf\\Tag\\Svg\\Polyline' => $vendorDir . '/spipu/html2pdf/src/Tag/Svg/Polyline.php',
'Spipu\\Html2Pdf\\Tag\\Svg\\Rect' => $vendorDir . '/spipu/html2pdf/src/Tag/Svg/Rect.php',
'Spipu\\Html2Pdf\\Tag\\TagInterface' => $vendorDir . '/spipu/html2pdf/src/Tag/TagInterface.php',
'Spiral\\Core\\Attribute\\Finalize' => $vendorDir . '/spiral/core/src/Attribute/Finalize.php',
'Spiral\\Core\\Attribute\\Scope' => $vendorDir . '/spiral/core/src/Attribute/Scope.php',
'Spiral\\Core\\Attribute\\Singleton' => $vendorDir . '/spiral/core/src/Attribute/Singleton.php',
'Spiral\\Core\\BinderInterface' => $vendorDir . '/spiral/core/src/BinderInterface.php',
'Spiral\\Core\\Config' => $vendorDir . '/spiral/core/src/Config.php',
'Spiral\\Core\\ConfigsInterface' => $vendorDir . '/spiral/core/src/ConfigsInterface.php',
@ -6495,20 +6501,29 @@ return array(
'Spiral\\Core\\Exception\\Resolver\\WrongTypeException' => $vendorDir . '/spiral/core/src/Exception/Resolver/WrongTypeException.php',
'Spiral\\Core\\Exception\\RuntimeException' => $vendorDir . '/spiral/core/src/Exception/RuntimeException.php',
'Spiral\\Core\\Exception\\ScopeException' => $vendorDir . '/spiral/core/src/Exception/ScopeException.php',
'Spiral\\Core\\Exception\\Scope\\BadScopeException' => $vendorDir . '/spiral/core/src/Exception/Scope/BadScopeException.php',
'Spiral\\Core\\Exception\\Scope\\FinalizersException' => $vendorDir . '/spiral/core/src/Exception/Scope/FinalizersException.php',
'Spiral\\Core\\Exception\\Scope\\NamedScopeDuplicationException' => $vendorDir . '/spiral/core/src/Exception/Scope/NamedScopeDuplicationException.php',
'Spiral\\Core\\Exception\\Scope\\ScopeContainerLeakedException' => $vendorDir . '/spiral/core/src/Exception/Scope/ScopeContainerLeakedException.php',
'Spiral\\Core\\Exception\\Scope\\ScopeException' => $vendorDir . '/spiral/core/src/Exception/Scope/ScopeException.php',
'Spiral\\Core\\Exception\\Traits\\ClosureRendererTrait' => $vendorDir . '/spiral/core/src/Exception/Traits/ClosureRendererTrait.php',
'Spiral\\Core\\FactoryInterface' => $vendorDir . '/spiral/core/src/FactoryInterface.php',
'Spiral\\Core\\InjectableConfig' => $vendorDir . '/spiral/core/src/InjectableConfig.php',
'Spiral\\Core\\Internal\\Binder' => $vendorDir . '/spiral/core/src/Internal/Binder.php',
'Spiral\\Core\\Internal\\Common\\DestructorTrait' => $vendorDir . '/spiral/core/src/Internal/Common/DestructorTrait.php',
'Spiral\\Core\\Internal\\Common\\Registry' => $vendorDir . '/spiral/core/src/Internal/Common/Registry.php',
'Spiral\\Core\\Internal\\Config\\StateBinder' => $vendorDir . '/spiral/core/src/Internal/Config/StateBinder.php',
'Spiral\\Core\\Internal\\Config\\StateStorage' => $vendorDir . '/spiral/core/src/Internal/Config/StateStorage.php',
'Spiral\\Core\\Internal\\Container' => $vendorDir . '/spiral/core/src/Internal/Container.php',
'Spiral\\Core\\Internal\\DestructorTrait' => $vendorDir . '/spiral/core/src/Internal/DestructorTrait.php',
'Spiral\\Core\\Internal\\Factory' => $vendorDir . '/spiral/core/src/Internal/Factory.php',
'Spiral\\Core\\Internal\\Factory\\Ctx' => $vendorDir . '/spiral/core/src/Internal/Factory/Ctx.php',
'Spiral\\Core\\Internal\\Invoker' => $vendorDir . '/spiral/core/src/Internal/Invoker.php',
'Spiral\\Core\\Internal\\Registry' => $vendorDir . '/spiral/core/src/Internal/Registry.php',
'Spiral\\Core\\Internal\\Resolver' => $vendorDir . '/spiral/core/src/Internal/Resolver.php',
'Spiral\\Core\\Internal\\ResolvingState' => $vendorDir . '/spiral/core/src/Internal/ResolvingState.php',
'Spiral\\Core\\Internal\\Resolver\\ResolvingState' => $vendorDir . '/spiral/core/src/Internal/Resolver/ResolvingState.php',
'Spiral\\Core\\Internal\\Scope' => $vendorDir . '/spiral/core/src/Internal/Scope.php',
'Spiral\\Core\\Internal\\State' => $vendorDir . '/spiral/core/src/Internal/State.php',
'Spiral\\Core\\Internal\\Trace' => $vendorDir . '/spiral/core/src/Internal/Trace.php',
'Spiral\\Core\\Internal\\Tracer' => $vendorDir . '/spiral/core/src/Internal/Tracer.php',
'Spiral\\Core\\Internal\\Tracer\\Trace' => $vendorDir . '/spiral/core/src/Internal/Tracer/Trace.php',
'Spiral\\Core\\InvokerInterface' => $vendorDir . '/spiral/core/src/InvokerInterface.php',
'Spiral\\Core\\ResolverInterface' => $vendorDir . '/spiral/core/src/ResolverInterface.php',
'Spiral\\Core\\ScopeInterface' => $vendorDir . '/spiral/core/src/ScopeInterface.php',
@ -6630,6 +6645,9 @@ return array(
'Spiral\\RoadRunner\\WorkerAwareInterface' => $vendorDir . '/spiral/roadrunner-worker/src/WorkerAwareInterface.php',
'Spiral\\RoadRunner\\WorkerInterface' => $vendorDir . '/spiral/roadrunner-worker/src/WorkerInterface.php',
'Spiral\\Tokenizer\\AbstractLocator' => $vendorDir . '/spiral/tokenizer/src/AbstractLocator.php',
'Spiral\\Tokenizer\\Attribute\\AbstractTarget' => $vendorDir . '/spiral/tokenizer/src/Attribute/AbstractTarget.php',
'Spiral\\Tokenizer\\Attribute\\TargetAttribute' => $vendorDir . '/spiral/tokenizer/src/Attribute/TargetAttribute.php',
'Spiral\\Tokenizer\\Attribute\\TargetClass' => $vendorDir . '/spiral/tokenizer/src/Attribute/TargetClass.php',
'Spiral\\Tokenizer\\Bootloader\\TokenizerBootloader' => $vendorDir . '/spiral/tokenizer/src/Bootloader/TokenizerBootloader.php',
'Spiral\\Tokenizer\\Bootloader\\TokenizerListenerBootloader' => $vendorDir . '/spiral/tokenizer/src/Bootloader/TokenizerListenerBootloader.php',
'Spiral\\Tokenizer\\ClassLocator' => $vendorDir . '/spiral/tokenizer/src/ClassLocator.php',
@ -6642,6 +6660,10 @@ return array(
'Spiral\\Tokenizer\\InvocationLocator' => $vendorDir . '/spiral/tokenizer/src/InvocationLocator.php',
'Spiral\\Tokenizer\\InvocationLocatorInjector' => $vendorDir . '/spiral/tokenizer/src/InvocationLocatorInjector.php',
'Spiral\\Tokenizer\\InvocationsInterface' => $vendorDir . '/spiral/tokenizer/src/InvocationsInterface.php',
'Spiral\\Tokenizer\\Listener\\CachedClassesLoader' => $vendorDir . '/spiral/tokenizer/src/Listener/CachedClassesLoader.php',
'Spiral\\Tokenizer\\Listener\\ClassLocatorByTarget' => $vendorDir . '/spiral/tokenizer/src/Listener/ClassLocatorByTarget.php',
'Spiral\\Tokenizer\\Listener\\ClassesLoaderInterface' => $vendorDir . '/spiral/tokenizer/src/Listener/ClassesLoaderInterface.php',
'Spiral\\Tokenizer\\Listener\\ListenerInvoker' => $vendorDir . '/spiral/tokenizer/src/Listener/ListenerInvoker.php',
'Spiral\\Tokenizer\\Reflection\\ReflectionArgument' => $vendorDir . '/spiral/tokenizer/src/Reflection/ReflectionArgument.php',
'Spiral\\Tokenizer\\Reflection\\ReflectionFile' => $vendorDir . '/spiral/tokenizer/src/Reflection/ReflectionFile.php',
'Spiral\\Tokenizer\\Reflection\\ReflectionInvocation' => $vendorDir . '/spiral/tokenizer/src/Reflection/ReflectionInvocation.php',
@ -7704,6 +7726,7 @@ return array(
'TheSeer\\Tokenizer\\TokenCollectionException' => $vendorDir . '/theseer/tokenizer/src/TokenCollectionException.php',
'TheSeer\\Tokenizer\\Tokenizer' => $vendorDir . '/theseer/tokenizer/src/Tokenizer.php',
'TheSeer\\Tokenizer\\XMLSerializer' => $vendorDir . '/theseer/tokenizer/src/XMLSerializer.php',
'Tightenco\\Collect\\Conditionable\\HigherOrderWhenProxy' => $vendorDir . '/tightenco/collect/src/Collect/Conditionable/HigherOrderWhenProxy.php',
'Tightenco\\Collect\\Contracts\\Support\\Arrayable' => $vendorDir . '/tightenco/collect/src/Collect/Contracts/Support/Arrayable.php',
'Tightenco\\Collect\\Contracts\\Support\\CanBeEscapedWhenCastToString' => $vendorDir . '/tightenco/collect/src/Collect/Contracts/Support/CanBeEscapedWhenCastToString.php',
'Tightenco\\Collect\\Contracts\\Support\\Htmlable' => $vendorDir . '/tightenco/collect/src/Collect/Contracts/Support/Htmlable.php',
@ -7712,8 +7735,9 @@ return array(
'Tightenco\\Collect\\Support\\Collection' => $vendorDir . '/tightenco/collect/src/Collect/Support/Collection.php',
'Tightenco\\Collect\\Support\\Enumerable' => $vendorDir . '/tightenco/collect/src/Collect/Support/Enumerable.php',
'Tightenco\\Collect\\Support\\HigherOrderCollectionProxy' => $vendorDir . '/tightenco/collect/src/Collect/Support/HigherOrderCollectionProxy.php',
'Tightenco\\Collect\\Support\\HigherOrderWhenProxy' => $vendorDir . '/tightenco/collect/src/Collect/Support/HigherOrderWhenProxy.php',
'Tightenco\\Collect\\Support\\LazyCollection' => $vendorDir . '/tightenco/collect/src/Collect/Support/LazyCollection.php',
'Tightenco\\Collect\\Support\\Str' => $vendorDir . '/tightenco/collect/src/Collect/Support/Str.php',
'Tightenco\\Collect\\Support\\Traits\\Conditionable' => $vendorDir . '/tightenco/collect/src/Collect/Support/Traits/Conditionable.php',
'Tightenco\\Collect\\Support\\Traits\\EnumeratesValues' => $vendorDir . '/tightenco/collect/src/Collect/Support/Traits/EnumeratesValues.php',
'Tightenco\\Collect\\Support\\Traits\\Macroable' => $vendorDir . '/tightenco/collect/src/Collect/Support/Traits/Macroable.php',
'Tightenco\\Collect\\Support\\Traits\\Tappable' => $vendorDir . '/tightenco/collect/src/Collect/Support/Traits/Tappable.php',

View File

@ -3755,6 +3755,7 @@ class ComposerStaticInite758755b0ce068cedf69837a0c438f81
'Illuminate\\Cache\\Events\\CacheMissed' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/Events/CacheMissed.php',
'Illuminate\\Cache\\Events\\KeyForgotten' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/Events/KeyForgotten.php',
'Illuminate\\Cache\\Events\\KeyWritten' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/Events/KeyWritten.php',
'Illuminate\\Cache\\FileLock' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/FileLock.php',
'Illuminate\\Cache\\FileStore' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/FileStore.php',
'Illuminate\\Cache\\HasCacheLock' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/HasCacheLock.php',
'Illuminate\\Cache\\Lock' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Cache/Lock.php',
@ -4142,6 +4143,7 @@ class ComposerStaticInite758755b0ce068cedf69837a0c438f81
'Illuminate\\Database\\Query\\Grammars\\PostgresGrammar' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Query/Grammars/PostgresGrammar.php',
'Illuminate\\Database\\Query\\Grammars\\SQLiteGrammar' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Query/Grammars/SQLiteGrammar.php',
'Illuminate\\Database\\Query\\Grammars\\SqlServerGrammar' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Query/Grammars/SqlServerGrammar.php',
'Illuminate\\Database\\Query\\IndexHint' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Query/IndexHint.php',
'Illuminate\\Database\\Query\\JoinClause' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Query/JoinClause.php',
'Illuminate\\Database\\Query\\Processors\\MySqlProcessor' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Query/Processors/MySqlProcessor.php',
'Illuminate\\Database\\Query\\Processors\\PostgresProcessor' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Database/Query/Processors/PostgresProcessor.php',
@ -4411,6 +4413,7 @@ class ComposerStaticInite758755b0ce068cedf69837a0c438f81
'Illuminate\\Mail\\Transport\\ArrayTransport' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Mail/Transport/ArrayTransport.php',
'Illuminate\\Mail\\Transport\\LogTransport' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Mail/Transport/LogTransport.php',
'Illuminate\\Mail\\Transport\\SesTransport' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Mail/Transport/SesTransport.php',
'Illuminate\\Mail\\Transport\\SesV2Transport' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Mail/Transport/SesV2Transport.php',
'Illuminate\\Notifications\\Action' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/Action.php',
'Illuminate\\Notifications\\AnonymousNotifiable' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/AnonymousNotifiable.php',
'Illuminate\\Notifications\\ChannelManager' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Notifications/ChannelManager.php',
@ -7240,6 +7243,9 @@ class ComposerStaticInite758755b0ce068cedf69837a0c438f81
'Spipu\\Html2Pdf\\Tag\\Svg\\Polyline' => __DIR__ . '/..' . '/spipu/html2pdf/src/Tag/Svg/Polyline.php',
'Spipu\\Html2Pdf\\Tag\\Svg\\Rect' => __DIR__ . '/..' . '/spipu/html2pdf/src/Tag/Svg/Rect.php',
'Spipu\\Html2Pdf\\Tag\\TagInterface' => __DIR__ . '/..' . '/spipu/html2pdf/src/Tag/TagInterface.php',
'Spiral\\Core\\Attribute\\Finalize' => __DIR__ . '/..' . '/spiral/core/src/Attribute/Finalize.php',
'Spiral\\Core\\Attribute\\Scope' => __DIR__ . '/..' . '/spiral/core/src/Attribute/Scope.php',
'Spiral\\Core\\Attribute\\Singleton' => __DIR__ . '/..' . '/spiral/core/src/Attribute/Singleton.php',
'Spiral\\Core\\BinderInterface' => __DIR__ . '/..' . '/spiral/core/src/BinderInterface.php',
'Spiral\\Core\\Config' => __DIR__ . '/..' . '/spiral/core/src/Config.php',
'Spiral\\Core\\ConfigsInterface' => __DIR__ . '/..' . '/spiral/core/src/ConfigsInterface.php',
@ -7269,20 +7275,29 @@ class ComposerStaticInite758755b0ce068cedf69837a0c438f81
'Spiral\\Core\\Exception\\Resolver\\WrongTypeException' => __DIR__ . '/..' . '/spiral/core/src/Exception/Resolver/WrongTypeException.php',
'Spiral\\Core\\Exception\\RuntimeException' => __DIR__ . '/..' . '/spiral/core/src/Exception/RuntimeException.php',
'Spiral\\Core\\Exception\\ScopeException' => __DIR__ . '/..' . '/spiral/core/src/Exception/ScopeException.php',
'Spiral\\Core\\Exception\\Scope\\BadScopeException' => __DIR__ . '/..' . '/spiral/core/src/Exception/Scope/BadScopeException.php',
'Spiral\\Core\\Exception\\Scope\\FinalizersException' => __DIR__ . '/..' . '/spiral/core/src/Exception/Scope/FinalizersException.php',
'Spiral\\Core\\Exception\\Scope\\NamedScopeDuplicationException' => __DIR__ . '/..' . '/spiral/core/src/Exception/Scope/NamedScopeDuplicationException.php',
'Spiral\\Core\\Exception\\Scope\\ScopeContainerLeakedException' => __DIR__ . '/..' . '/spiral/core/src/Exception/Scope/ScopeContainerLeakedException.php',
'Spiral\\Core\\Exception\\Scope\\ScopeException' => __DIR__ . '/..' . '/spiral/core/src/Exception/Scope/ScopeException.php',
'Spiral\\Core\\Exception\\Traits\\ClosureRendererTrait' => __DIR__ . '/..' . '/spiral/core/src/Exception/Traits/ClosureRendererTrait.php',
'Spiral\\Core\\FactoryInterface' => __DIR__ . '/..' . '/spiral/core/src/FactoryInterface.php',
'Spiral\\Core\\InjectableConfig' => __DIR__ . '/..' . '/spiral/core/src/InjectableConfig.php',
'Spiral\\Core\\Internal\\Binder' => __DIR__ . '/..' . '/spiral/core/src/Internal/Binder.php',
'Spiral\\Core\\Internal\\Common\\DestructorTrait' => __DIR__ . '/..' . '/spiral/core/src/Internal/Common/DestructorTrait.php',
'Spiral\\Core\\Internal\\Common\\Registry' => __DIR__ . '/..' . '/spiral/core/src/Internal/Common/Registry.php',
'Spiral\\Core\\Internal\\Config\\StateBinder' => __DIR__ . '/..' . '/spiral/core/src/Internal/Config/StateBinder.php',
'Spiral\\Core\\Internal\\Config\\StateStorage' => __DIR__ . '/..' . '/spiral/core/src/Internal/Config/StateStorage.php',
'Spiral\\Core\\Internal\\Container' => __DIR__ . '/..' . '/spiral/core/src/Internal/Container.php',
'Spiral\\Core\\Internal\\DestructorTrait' => __DIR__ . '/..' . '/spiral/core/src/Internal/DestructorTrait.php',
'Spiral\\Core\\Internal\\Factory' => __DIR__ . '/..' . '/spiral/core/src/Internal/Factory.php',
'Spiral\\Core\\Internal\\Factory\\Ctx' => __DIR__ . '/..' . '/spiral/core/src/Internal/Factory/Ctx.php',
'Spiral\\Core\\Internal\\Invoker' => __DIR__ . '/..' . '/spiral/core/src/Internal/Invoker.php',
'Spiral\\Core\\Internal\\Registry' => __DIR__ . '/..' . '/spiral/core/src/Internal/Registry.php',
'Spiral\\Core\\Internal\\Resolver' => __DIR__ . '/..' . '/spiral/core/src/Internal/Resolver.php',
'Spiral\\Core\\Internal\\ResolvingState' => __DIR__ . '/..' . '/spiral/core/src/Internal/ResolvingState.php',
'Spiral\\Core\\Internal\\Resolver\\ResolvingState' => __DIR__ . '/..' . '/spiral/core/src/Internal/Resolver/ResolvingState.php',
'Spiral\\Core\\Internal\\Scope' => __DIR__ . '/..' . '/spiral/core/src/Internal/Scope.php',
'Spiral\\Core\\Internal\\State' => __DIR__ . '/..' . '/spiral/core/src/Internal/State.php',
'Spiral\\Core\\Internal\\Trace' => __DIR__ . '/..' . '/spiral/core/src/Internal/Trace.php',
'Spiral\\Core\\Internal\\Tracer' => __DIR__ . '/..' . '/spiral/core/src/Internal/Tracer.php',
'Spiral\\Core\\Internal\\Tracer\\Trace' => __DIR__ . '/..' . '/spiral/core/src/Internal/Tracer/Trace.php',
'Spiral\\Core\\InvokerInterface' => __DIR__ . '/..' . '/spiral/core/src/InvokerInterface.php',
'Spiral\\Core\\ResolverInterface' => __DIR__ . '/..' . '/spiral/core/src/ResolverInterface.php',
'Spiral\\Core\\ScopeInterface' => __DIR__ . '/..' . '/spiral/core/src/ScopeInterface.php',
@ -7404,6 +7419,9 @@ class ComposerStaticInite758755b0ce068cedf69837a0c438f81
'Spiral\\RoadRunner\\WorkerAwareInterface' => __DIR__ . '/..' . '/spiral/roadrunner-worker/src/WorkerAwareInterface.php',
'Spiral\\RoadRunner\\WorkerInterface' => __DIR__ . '/..' . '/spiral/roadrunner-worker/src/WorkerInterface.php',
'Spiral\\Tokenizer\\AbstractLocator' => __DIR__ . '/..' . '/spiral/tokenizer/src/AbstractLocator.php',
'Spiral\\Tokenizer\\Attribute\\AbstractTarget' => __DIR__ . '/..' . '/spiral/tokenizer/src/Attribute/AbstractTarget.php',
'Spiral\\Tokenizer\\Attribute\\TargetAttribute' => __DIR__ . '/..' . '/spiral/tokenizer/src/Attribute/TargetAttribute.php',
'Spiral\\Tokenizer\\Attribute\\TargetClass' => __DIR__ . '/..' . '/spiral/tokenizer/src/Attribute/TargetClass.php',
'Spiral\\Tokenizer\\Bootloader\\TokenizerBootloader' => __DIR__ . '/..' . '/spiral/tokenizer/src/Bootloader/TokenizerBootloader.php',
'Spiral\\Tokenizer\\Bootloader\\TokenizerListenerBootloader' => __DIR__ . '/..' . '/spiral/tokenizer/src/Bootloader/TokenizerListenerBootloader.php',
'Spiral\\Tokenizer\\ClassLocator' => __DIR__ . '/..' . '/spiral/tokenizer/src/ClassLocator.php',
@ -7416,6 +7434,10 @@ class ComposerStaticInite758755b0ce068cedf69837a0c438f81
'Spiral\\Tokenizer\\InvocationLocator' => __DIR__ . '/..' . '/spiral/tokenizer/src/InvocationLocator.php',
'Spiral\\Tokenizer\\InvocationLocatorInjector' => __DIR__ . '/..' . '/spiral/tokenizer/src/InvocationLocatorInjector.php',
'Spiral\\Tokenizer\\InvocationsInterface' => __DIR__ . '/..' . '/spiral/tokenizer/src/InvocationsInterface.php',
'Spiral\\Tokenizer\\Listener\\CachedClassesLoader' => __DIR__ . '/..' . '/spiral/tokenizer/src/Listener/CachedClassesLoader.php',
'Spiral\\Tokenizer\\Listener\\ClassLocatorByTarget' => __DIR__ . '/..' . '/spiral/tokenizer/src/Listener/ClassLocatorByTarget.php',
'Spiral\\Tokenizer\\Listener\\ClassesLoaderInterface' => __DIR__ . '/..' . '/spiral/tokenizer/src/Listener/ClassesLoaderInterface.php',
'Spiral\\Tokenizer\\Listener\\ListenerInvoker' => __DIR__ . '/..' . '/spiral/tokenizer/src/Listener/ListenerInvoker.php',
'Spiral\\Tokenizer\\Reflection\\ReflectionArgument' => __DIR__ . '/..' . '/spiral/tokenizer/src/Reflection/ReflectionArgument.php',
'Spiral\\Tokenizer\\Reflection\\ReflectionFile' => __DIR__ . '/..' . '/spiral/tokenizer/src/Reflection/ReflectionFile.php',
'Spiral\\Tokenizer\\Reflection\\ReflectionInvocation' => __DIR__ . '/..' . '/spiral/tokenizer/src/Reflection/ReflectionInvocation.php',
@ -8478,6 +8500,7 @@ class ComposerStaticInite758755b0ce068cedf69837a0c438f81
'TheSeer\\Tokenizer\\TokenCollectionException' => __DIR__ . '/..' . '/theseer/tokenizer/src/TokenCollectionException.php',
'TheSeer\\Tokenizer\\Tokenizer' => __DIR__ . '/..' . '/theseer/tokenizer/src/Tokenizer.php',
'TheSeer\\Tokenizer\\XMLSerializer' => __DIR__ . '/..' . '/theseer/tokenizer/src/XMLSerializer.php',
'Tightenco\\Collect\\Conditionable\\HigherOrderWhenProxy' => __DIR__ . '/..' . '/tightenco/collect/src/Collect/Conditionable/HigherOrderWhenProxy.php',
'Tightenco\\Collect\\Contracts\\Support\\Arrayable' => __DIR__ . '/..' . '/tightenco/collect/src/Collect/Contracts/Support/Arrayable.php',
'Tightenco\\Collect\\Contracts\\Support\\CanBeEscapedWhenCastToString' => __DIR__ . '/..' . '/tightenco/collect/src/Collect/Contracts/Support/CanBeEscapedWhenCastToString.php',
'Tightenco\\Collect\\Contracts\\Support\\Htmlable' => __DIR__ . '/..' . '/tightenco/collect/src/Collect/Contracts/Support/Htmlable.php',
@ -8486,8 +8509,9 @@ class ComposerStaticInite758755b0ce068cedf69837a0c438f81
'Tightenco\\Collect\\Support\\Collection' => __DIR__ . '/..' . '/tightenco/collect/src/Collect/Support/Collection.php',
'Tightenco\\Collect\\Support\\Enumerable' => __DIR__ . '/..' . '/tightenco/collect/src/Collect/Support/Enumerable.php',
'Tightenco\\Collect\\Support\\HigherOrderCollectionProxy' => __DIR__ . '/..' . '/tightenco/collect/src/Collect/Support/HigherOrderCollectionProxy.php',
'Tightenco\\Collect\\Support\\HigherOrderWhenProxy' => __DIR__ . '/..' . '/tightenco/collect/src/Collect/Support/HigherOrderWhenProxy.php',
'Tightenco\\Collect\\Support\\LazyCollection' => __DIR__ . '/..' . '/tightenco/collect/src/Collect/Support/LazyCollection.php',
'Tightenco\\Collect\\Support\\Str' => __DIR__ . '/..' . '/tightenco/collect/src/Collect/Support/Str.php',
'Tightenco\\Collect\\Support\\Traits\\Conditionable' => __DIR__ . '/..' . '/tightenco/collect/src/Collect/Support/Traits/Conditionable.php',
'Tightenco\\Collect\\Support\\Traits\\EnumeratesValues' => __DIR__ . '/..' . '/tightenco/collect/src/Collect/Support/Traits/EnumeratesValues.php',
'Tightenco\\Collect\\Support\\Traits\\Macroable' => __DIR__ . '/..' . '/tightenco/collect/src/Collect/Support/Traits/Macroable.php',
'Tightenco\\Collect\\Support\\Traits\\Tappable' => __DIR__ . '/..' . '/tightenco/collect/src/Collect/Support/Traits/Tappable.php',

View File

@ -1,3 +1,7 @@
### [2.5.4] 2023-02-15
* Fixed extra.plugin-optional support in PluginInstaller when doing pre-install checks (#11318)
### [2.5.3] 2023-02-10
* Added extra.plugin-optional support for allow auto-disabling unknown plugins which are not critical when running non-interactive (#11315)
@ -1695,6 +1699,7 @@
* Initial release
[2.5.4]: https://github.com/composer/composer/compare/2.5.3...2.5.4
[2.5.3]: https://github.com/composer/composer/compare/2.5.2...2.5.3
[2.5.2]: https://github.com/composer/composer/compare/2.5.1...2.5.2
[2.5.1]: https://github.com/composer/composer/compare/2.5.0...2.5.1

View File

@ -51,9 +51,9 @@ class Composer extends PartialComposer
*
* @see getVersion()
*/
public const VERSION = '2.5.3';
public const VERSION = '2.5.4';
public const BRANCH_ALIAS_VERSION = '';
public const RELEASE_DATE = '2023-02-10 13:23:52';
public const RELEASE_DATE = '2023-02-15 13:10:06';
public const SOURCE_VERSION = '';
/**

View File

@ -50,7 +50,7 @@ class PluginInstaller extends LibraryInstaller
{
// fail install process early if it is going to fail due to a plugin not being allowed
if (($type === 'install' || $type === 'update') && !$this->getPluginManager()->arePluginsDisabled('local')) {
$this->getPluginManager()->isPluginAllowed($package->getName(), false);
$this->getPluginManager()->isPluginAllowed($package->getName(), false, true === ($package->getExtra()['plugin-optional'] ?? false));
}
return parent::prepare($type, $package, $prevPackage);

View File

@ -187,7 +187,7 @@ class PluginManager
}
}
if (!$this->isPluginAllowed($package->getName(), $isGlobalPlugin, $package->getExtra()['plugin-optional'] ?? false)) {
if (!$this->isPluginAllowed($package->getName(), $isGlobalPlugin, true === ($package->getExtra()['plugin-optional'] ?? false))) {
$this->io->writeError('Skipped loading "'.$package->getName() . '" '.($isGlobalPlugin || $this->runningInGlobalDir ? '(installed globally) ' : '').'as it is not in config.allow-plugins', true, IOInterface::DEBUG);
return;
@ -370,7 +370,7 @@ class PluginManager
if ($sourcePackage === null) {
trigger_error('Calling PluginManager::addPlugin without $sourcePackage is deprecated, if you are using this please get in touch with us to explain the use case', E_USER_DEPRECATED);
} elseif (!$this->isPluginAllowed($sourcePackage->getName(), $isGlobalPlugin, $sourcePackage->getExtra()['plugin-optional'] ?? false)) {
} elseif (!$this->isPluginAllowed($sourcePackage->getName(), $isGlobalPlugin, true === ($sourcePackage->getExtra()['plugin-optional'] ?? false))) {
$this->io->writeError('Skipped loading "'.get_class($plugin).' from '.$sourcePackage->getName() . '" '.($isGlobalPlugin || $this->runningInGlobalDir ? '(installed globally) ' : '').' as it is not in config.allow-plugins', true, IOInterface::DEBUG);
return;

View File

@ -2,36 +2,36 @@
"packages": [
{
"name": "adldap2/adldap2",
"version": "v10.4.3",
"version_normalized": "10.4.3.0",
"version": "v10.5.0",
"version_normalized": "10.5.0.0",
"source": {
"type": "git",
"url": "https://github.com/Adldap2/Adldap2.git",
"reference": "a55e2c5285b9e101ed555894bd7b97b20c0c293e"
"reference": "e400eecb7bd7de8ee79aae320b54ad70d37f86b1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Adldap2/Adldap2/zipball/a55e2c5285b9e101ed555894bd7b97b20c0c293e",
"reference": "a55e2c5285b9e101ed555894bd7b97b20c0c293e",
"url": "https://api.github.com/repos/Adldap2/Adldap2/zipball/e400eecb7bd7de8ee79aae320b54ad70d37f86b1",
"reference": "e400eecb7bd7de8ee79aae320b54ad70d37f86b1",
"shasum": ""
},
"require": {
"ext-json": "*",
"ext-ldap": "*",
"illuminate/contracts": "~5.0|~6.0|~7.0|~8.0|~9.0",
"illuminate/contracts": "^5.0|^6.0|^7.0|^8.0|^9.0|^10.0",
"php": ">=7.0",
"psr/log": "~1.0|~2.0|~3.0",
"psr/simple-cache": "~1.0|~2.0",
"tightenco/collect": "~5.0|~6.0|~7.0|~8.0"
"psr/log": "^1.0|^2.0|^3.0",
"psr/simple-cache": "^1.0|^2.0|^3.0",
"tightenco/collect": "^5.0|^6.0|^7.0|^8.0|^9.0"
},
"require-dev": {
"mockery/mockery": "~1.0",
"symfony/phpunit-bridge": "~5.2|~6.0"
"mockery/mockery": "^1.0",
"symfony/phpunit-bridge": "^5.2|^6.0"
},
"suggest": {
"ext-fileinfo": "fileinfo is required when retrieving user encoded thumbnails"
},
"time": "2022-10-18T13:33:00+00:00",
"time": "2023-02-23T15:00:03+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@ -70,30 +70,30 @@
},
{
"name": "adldap2/adldap2-laravel",
"version": "v6.1.6",
"version_normalized": "6.1.6.0",
"version": "v6.1.7",
"version_normalized": "6.1.7.0",
"source": {
"type": "git",
"url": "https://github.com/Adldap2/Adldap2-Laravel.git",
"reference": "e67f845db08389acdf7326fd596fda10b3560d25"
"reference": "d587c4dea4ffefbbbea7601958c125216ea43452"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Adldap2/Adldap2-Laravel/zipball/e67f845db08389acdf7326fd596fda10b3560d25",
"reference": "e67f845db08389acdf7326fd596fda10b3560d25",
"url": "https://api.github.com/repos/Adldap2/Adldap2-Laravel/zipball/d587c4dea4ffefbbbea7601958c125216ea43452",
"reference": "d587c4dea4ffefbbbea7601958c125216ea43452",
"shasum": ""
},
"require": {
"adldap2/adldap2": "^10.1",
"illuminate/support": "~5.5|~6.0|~7.0|~8.0|~9.0",
"illuminate/support": "~5.5|~6.0|~7.0|~8.0|~9.0|^10.0",
"php": ">=7.1"
},
"require-dev": {
"mockery/mockery": "~1.0",
"orchestra/testbench": "~3.7|~4.0",
"phpunit/phpunit": "~7.0|~8.0"
"orchestra/testbench": "~3.7|~4.0|^8.0",
"phpunit/phpunit": "~7.0|~8.0|^9.5.10"
},
"time": "2022-02-09T13:04:53+00:00",
"time": "2023-02-15T14:51:44+00:00",
"type": "project",
"extra": {
"laravel": {
@ -125,7 +125,7 @@
],
"support": {
"issues": "https://github.com/Adldap2/Adldap2-Laravel/issues",
"source": "https://github.com/Adldap2/Adldap2-Laravel/tree/v6.1.6"
"source": "https://github.com/Adldap2/Adldap2-Laravel/tree/v6.1.7"
},
"install-path": "../adldap2/adldap2-laravel"
},
@ -520,17 +520,17 @@
},
{
"name": "composer/composer",
"version": "2.5.3",
"version_normalized": "2.5.3.0",
"version": "2.5.4",
"version_normalized": "2.5.4.0",
"source": {
"type": "git",
"url": "https://github.com/composer/composer.git",
"reference": "607a4c04006ce1d2b6fdfd5467bae3d7ad9ce5ab"
"reference": "6b67eeea4d72051c369ccdbfb2423a56e2ab51a9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/composer/composer/zipball/607a4c04006ce1d2b6fdfd5467bae3d7ad9ce5ab",
"reference": "607a4c04006ce1d2b6fdfd5467bae3d7ad9ce5ab",
"url": "https://api.github.com/repos/composer/composer/zipball/6b67eeea4d72051c369ccdbfb2423a56e2ab51a9",
"reference": "6b67eeea4d72051c369ccdbfb2423a56e2ab51a9",
"shasum": ""
},
"require": {
@ -569,7 +569,7 @@
"ext-zip": "Enabling the zip extension allows you to unzip archives",
"ext-zlib": "Allow gzip compression of HTTP requests"
},
"time": "2023-02-10T12:23:52+00:00",
"time": "2023-02-15T12:10:06+00:00",
"bin": [
"bin/composer"
],
@ -616,7 +616,7 @@
"support": {
"irc": "ircs://irc.libera.chat:6697/composer",
"issues": "https://github.com/composer/composer/issues",
"source": "https://github.com/composer/composer/tree/2.5.3"
"source": "https://github.com/composer/composer/tree/2.5.4"
},
"funding": [
{
@ -2422,27 +2422,27 @@
},
{
"name": "graham-campbell/result-type",
"version": "v1.1.0",
"version_normalized": "1.1.0.0",
"version": "v1.1.1",
"version_normalized": "1.1.1.0",
"source": {
"type": "git",
"url": "https://github.com/GrahamCampbell/Result-Type.git",
"reference": "a878d45c1914464426dc94da61c9e1d36ae262a8"
"reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/a878d45c1914464426dc94da61c9e1d36ae262a8",
"reference": "a878d45c1914464426dc94da61c9e1d36ae262a8",
"url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831",
"reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831",
"shasum": ""
},
"require": {
"php": "^7.2.5 || ^8.0",
"phpoption/phpoption": "^1.9"
"phpoption/phpoption": "^1.9.1"
},
"require-dev": {
"phpunit/phpunit": "^8.5.28 || ^9.5.21"
"phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12"
},
"time": "2022-07-30T15:56:11+00:00",
"time": "2023-02-25T20:23:15+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@ -2471,7 +2471,7 @@
],
"support": {
"issues": "https://github.com/GrahamCampbell/Result-Type/issues",
"source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.0"
"source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.1"
},
"funding": [
{
@ -3041,17 +3041,17 @@
},
{
"name": "laravel/framework",
"version": "v9.51.0",
"version_normalized": "9.51.0.0",
"version": "v9.52.4",
"version_normalized": "9.52.4.0",
"source": {
"type": "git",
"url": "https://github.com/laravel/framework.git",
"reference": "b81123134349a013a738a9f7f715c6ce99d5a414"
"reference": "9239128cfb4d22afefb64060dfecf53e82987267"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/framework/zipball/b81123134349a013a738a9f7f715c6ce99d5a414",
"reference": "b81123134349a013a738a9f7f715c6ce99d5a414",
"url": "https://api.github.com/repos/laravel/framework/zipball/9239128cfb4d22afefb64060dfecf53e82987267",
"reference": "9239128cfb4d22afefb64060dfecf53e82987267",
"shasum": ""
},
"require": {
@ -3194,7 +3194,7 @@
"symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^6.0).",
"symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0)."
},
"time": "2023-02-07T15:37:18+00:00",
"time": "2023-02-22T14:38:06+00:00",
"type": "library",
"extra": {
"branch-alias": {
@ -3305,17 +3305,17 @@
},
{
"name": "laravel/tinker",
"version": "v2.8.0",
"version_normalized": "2.8.0.0",
"version": "v2.8.1",
"version_normalized": "2.8.1.0",
"source": {
"type": "git",
"url": "https://github.com/laravel/tinker.git",
"reference": "74d0b287cc4ae65d15c368dd697aae71d62a73ad"
"reference": "04a2d3bd0d650c0764f70bf49d1ee39393e4eb10"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/tinker/zipball/74d0b287cc4ae65d15c368dd697aae71d62a73ad",
"reference": "74d0b287cc4ae65d15c368dd697aae71d62a73ad",
"url": "https://api.github.com/repos/laravel/tinker/zipball/04a2d3bd0d650c0764f70bf49d1ee39393e4eb10",
"reference": "04a2d3bd0d650c0764f70bf49d1ee39393e4eb10",
"shasum": ""
},
"require": {
@ -3333,7 +3333,7 @@
"suggest": {
"illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0)."
},
"time": "2023-01-10T18:03:30+00:00",
"time": "2023-02-15T16:40:09+00:00",
"type": "library",
"extra": {
"branch-alias": {
@ -3370,7 +3370,7 @@
],
"support": {
"issues": "https://github.com/laravel/tinker/issues",
"source": "https://github.com/laravel/tinker/tree/v2.8.0"
"source": "https://github.com/laravel/tinker/tree/v2.8.1"
},
"install-path": "../laravel/tinker"
},
@ -3520,17 +3520,17 @@
},
{
"name": "league/commonmark",
"version": "2.3.8",
"version_normalized": "2.3.8.0",
"version": "2.3.9",
"version_normalized": "2.3.9.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/commonmark.git",
"reference": "c493585c130544c4e91d2e0e131e6d35cb0cbc47"
"reference": "c1e114f74e518daca2729ea8c4bf1167038fa4b5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/thephpleague/commonmark/zipball/c493585c130544c4e91d2e0e131e6d35cb0cbc47",
"reference": "c493585c130544c4e91d2e0e131e6d35cb0cbc47",
"url": "https://api.github.com/repos/thephpleague/commonmark/zipball/c1e114f74e518daca2729ea8c4bf1167038fa4b5",
"reference": "c1e114f74e518daca2729ea8c4bf1167038fa4b5",
"shasum": ""
},
"require": {
@ -3563,7 +3563,7 @@
"suggest": {
"symfony/yaml": "v2.3+ required if using the Front Matter extension"
},
"time": "2022-12-10T16:02:17+00:00",
"time": "2023-02-15T14:07:24+00:00",
"type": "library",
"extra": {
"branch-alias": {
@ -3714,17 +3714,17 @@
},
{
"name": "league/flysystem",
"version": "3.12.2",
"version_normalized": "3.12.2.0",
"version": "3.12.3",
"version_normalized": "3.12.3.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/flysystem.git",
"reference": "f6377c709d2275ed6feaf63e44be7a7162b0e77f"
"reference": "81e87e74dd5213795c7846d65089712d2dda90ce"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/thephpleague/flysystem/zipball/f6377c709d2275ed6feaf63e44be7a7162b0e77f",
"reference": "f6377c709d2275ed6feaf63e44be7a7162b0e77f",
"url": "https://api.github.com/repos/thephpleague/flysystem/zipball/81e87e74dd5213795c7846d65089712d2dda90ce",
"reference": "81e87e74dd5213795c7846d65089712d2dda90ce",
"shasum": ""
},
"require": {
@ -3754,7 +3754,7 @@
"phpunit/phpunit": "^9.5.11",
"sabre/dav": "^4.3.1"
},
"time": "2023-01-19T12:02:19+00:00",
"time": "2023-02-18T15:32:41+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@ -3788,7 +3788,7 @@
],
"support": {
"issues": "https://github.com/thephpleague/flysystem/issues",
"source": "https://github.com/thephpleague/flysystem/tree/3.12.2"
"source": "https://github.com/thephpleague/flysystem/tree/3.12.3"
},
"funding": [
{
@ -5157,27 +5157,27 @@
},
{
"name": "phpoption/phpoption",
"version": "1.9.0",
"version_normalized": "1.9.0.0",
"version": "1.9.1",
"version_normalized": "1.9.1.0",
"source": {
"type": "git",
"url": "https://github.com/schmittjoh/php-option.git",
"reference": "dc5ff11e274a90cc1c743f66c9ad700ce50db9ab"
"reference": "dd3a383e599f49777d8b628dadbb90cae435b87e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/schmittjoh/php-option/zipball/dc5ff11e274a90cc1c743f66c9ad700ce50db9ab",
"reference": "dc5ff11e274a90cc1c743f66c9ad700ce50db9ab",
"url": "https://api.github.com/repos/schmittjoh/php-option/zipball/dd3a383e599f49777d8b628dadbb90cae435b87e",
"reference": "dd3a383e599f49777d8b628dadbb90cae435b87e",
"shasum": ""
},
"require": {
"php": "^7.2.5 || ^8.0"
},
"require-dev": {
"bamarni/composer-bin-plugin": "^1.8",
"phpunit/phpunit": "^8.5.28 || ^9.5.21"
"bamarni/composer-bin-plugin": "^1.8.2",
"phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12"
},
"time": "2022-07-30T15:51:26+00:00",
"time": "2023-02-25T19:38:58+00:00",
"type": "library",
"extra": {
"bamarni-bin": {
@ -5219,7 +5219,7 @@
],
"support": {
"issues": "https://github.com/schmittjoh/php-option/issues",
"source": "https://github.com/schmittjoh/php-option/tree/1.9.0"
"source": "https://github.com/schmittjoh/php-option/tree/1.9.1"
},
"funding": [
{
@ -5302,24 +5302,24 @@
},
{
"name": "phpunit/php-code-coverage",
"version": "9.2.24",
"version_normalized": "9.2.24.0",
"version": "9.2.25",
"version_normalized": "9.2.25.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
"reference": "2cf940ebc6355a9d430462811b5aaa308b174bed"
"reference": "0e2b40518197a8c0d4b08bc34dfff1c99c508954"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2cf940ebc6355a9d430462811b5aaa308b174bed",
"reference": "2cf940ebc6355a9d430462811b5aaa308b174bed",
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/0e2b40518197a8c0d4b08bc34dfff1c99c508954",
"reference": "0e2b40518197a8c0d4b08bc34dfff1c99c508954",
"shasum": ""
},
"require": {
"ext-dom": "*",
"ext-libxml": "*",
"ext-xmlwriter": "*",
"nikic/php-parser": "^4.14",
"nikic/php-parser": "^4.15",
"php": ">=7.3",
"phpunit/php-file-iterator": "^3.0.3",
"phpunit/php-text-template": "^2.0.2",
@ -5337,7 +5337,7 @@
"ext-pcov": "*",
"ext-xdebug": "*"
},
"time": "2023-01-26T08:26:55+00:00",
"time": "2023-02-25T05:32:00+00:00",
"type": "library",
"extra": {
"branch-alias": {
@ -5370,7 +5370,7 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
"source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.24"
"source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.25"
},
"funding": [
{
@ -5635,17 +5635,17 @@
},
{
"name": "phpunit/phpunit",
"version": "9.6.3",
"version_normalized": "9.6.3.0",
"version": "9.6.4",
"version_normalized": "9.6.4.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
"reference": "e7b1615e3e887d6c719121c6d4a44b0ab9645555"
"reference": "9125ee085b6d95e78277dc07aa1f46f9e0607b8d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e7b1615e3e887d6c719121c6d4a44b0ab9645555",
"reference": "e7b1615e3e887d6c719121c6d4a44b0ab9645555",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9125ee085b6d95e78277dc07aa1f46f9e0607b8d",
"reference": "9125ee085b6d95e78277dc07aa1f46f9e0607b8d",
"shasum": ""
},
"require": {
@ -5681,7 +5681,7 @@
"ext-soap": "*",
"ext-xdebug": "*"
},
"time": "2023-02-04T13:37:15+00:00",
"time": "2023-02-27T13:06:37+00:00",
"bin": [
"phpunit"
],
@ -5720,7 +5720,7 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
"source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.3"
"source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.4"
},
"funding": [
{
@ -6174,27 +6174,27 @@
},
{
"name": "psr/simple-cache",
"version": "2.0.0",
"version_normalized": "2.0.0.0",
"version": "3.0.0",
"version_normalized": "3.0.0.0",
"source": {
"type": "git",
"url": "https://github.com/php-fig/simple-cache.git",
"reference": "8707bf3cea6f710bf6ef05491234e3ab06f6432a"
"reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/simple-cache/zipball/8707bf3cea6f710bf6ef05491234e3ab06f6432a",
"reference": "8707bf3cea6f710bf6ef05491234e3ab06f6432a",
"url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865",
"reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865",
"shasum": ""
},
"require": {
"php": ">=8.0.0"
},
"time": "2021-10-29T13:22:09+00:00",
"time": "2021-10-29T13:26:27+00:00",
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.0.x-dev"
"dev-master": "3.0.x-dev"
}
},
"installation-source": "dist",
@ -6222,7 +6222,7 @@
"simple-cache"
],
"support": {
"source": "https://github.com/php-fig/simple-cache/tree/2.0.0"
"source": "https://github.com/php-fig/simple-cache/tree/3.0.0"
},
"install-path": "../psr/simple-cache"
},
@ -7815,17 +7815,17 @@
},
{
"name": "spatie/backtrace",
"version": "1.2.1",
"version_normalized": "1.2.1.0",
"version": "1.2.2",
"version_normalized": "1.2.2.0",
"source": {
"type": "git",
"url": "https://github.com/spatie/backtrace.git",
"reference": "4ee7d41aa5268107906ea8a4d9ceccde136dbd5b"
"reference": "7b34fee6c1ad45f8ee0498d17cd8ea9a076402c1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/spatie/backtrace/zipball/4ee7d41aa5268107906ea8a4d9ceccde136dbd5b",
"reference": "4ee7d41aa5268107906ea8a4d9ceccde136dbd5b",
"url": "https://api.github.com/repos/spatie/backtrace/zipball/7b34fee6c1ad45f8ee0498d17cd8ea9a076402c1",
"reference": "7b34fee6c1ad45f8ee0498d17cd8ea9a076402c1",
"shasum": ""
},
"require": {
@ -7836,7 +7836,7 @@
"phpunit/phpunit": "^9.3",
"symfony/var-dumper": "^5.1"
},
"time": "2021-11-09T10:57:15+00:00",
"time": "2023-02-21T08:29:12+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@ -7863,8 +7863,7 @@
"spatie"
],
"support": {
"issues": "https://github.com/spatie/backtrace/issues",
"source": "https://github.com/spatie/backtrace/tree/1.2.1"
"source": "https://github.com/spatie/backtrace/tree/1.2.2"
},
"funding": [
{
@ -8322,17 +8321,17 @@
},
{
"name": "spiral/core",
"version": "3.5.0",
"version_normalized": "3.5.0.0",
"version": "3.6.1",
"version_normalized": "3.6.1.0",
"source": {
"type": "git",
"url": "https://github.com/spiral/core.git",
"reference": "4745ec855e74b2d52d49232349d4b11dc19fa7e4"
"reference": "dffbc4e7b326004376545aac39161dcfddb57281"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/spiral/core/zipball/4745ec855e74b2d52d49232349d4b11dc19fa7e4",
"reference": "4745ec855e74b2d52d49232349d4b11dc19fa7e4",
"url": "https://api.github.com/repos/spiral/core/zipball/dffbc4e7b326004376545aac39161dcfddb57281",
"reference": "dffbc4e7b326004376545aac39161dcfddb57281",
"shasum": ""
},
"require": {
@ -8342,13 +8341,13 @@
"require-dev": {
"mockery/mockery": "^1.5",
"phpunit/phpunit": "^9.5.20",
"vimeo/psalm": "^4.27"
"vimeo/psalm": "^5.6"
},
"time": "2022-12-23T13:32:05+00:00",
"time": "2023-02-19T07:31:17+00:00",
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.5.x-dev"
"dev-master": "3.7.x-dev"
}
},
"installation-source": "dist",
@ -8454,34 +8453,34 @@
},
{
"name": "spiral/logger",
"version": "3.5.0",
"version_normalized": "3.5.0.0",
"version": "3.6.1",
"version_normalized": "3.6.1.0",
"source": {
"type": "git",
"url": "https://github.com/spiral/logger.git",
"reference": "1f00e1b57a31af5339a351ecd420df3f76667ecc"
"reference": "9fca2309638c9eb90888b1f7ddf2298d90769dd1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/spiral/logger/zipball/1f00e1b57a31af5339a351ecd420df3f76667ecc",
"reference": "1f00e1b57a31af5339a351ecd420df3f76667ecc",
"url": "https://api.github.com/repos/spiral/logger/zipball/9fca2309638c9eb90888b1f7ddf2298d90769dd1",
"reference": "9fca2309638c9eb90888b1f7ddf2298d90769dd1",
"shasum": ""
},
"require": {
"php": ">=8.1",
"psr/log": "1 - 3",
"spiral/core": "^3.5"
"spiral/core": "^3.6.1"
},
"require-dev": {
"mockery/mockery": "^1.5",
"phpunit/phpunit": "^9.5.20",
"vimeo/psalm": "^4.27"
},
"time": "2022-12-23T13:35:08+00:00",
"time": "2023-02-20T15:47:39+00:00",
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.5.x-dev"
"dev-master": "3.7.x-dev"
}
},
"installation-source": "dist",
@ -8522,17 +8521,17 @@
},
{
"name": "spiral/roadrunner",
"version": "v2.12.2",
"version_normalized": "2.12.2.0",
"version": "v2.12.3",
"version_normalized": "2.12.3.0",
"source": {
"type": "git",
"url": "https://github.com/roadrunner-server/roadrunner.git",
"reference": "c794a7ab2ae828af8068776b9dfcdcce5299d855"
"reference": "18f526ad9eef19b57bdf1ad4b0252683f514c718"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/roadrunner-server/roadrunner/zipball/c794a7ab2ae828af8068776b9dfcdcce5299d855",
"reference": "c794a7ab2ae828af8068776b9dfcdcce5299d855",
"url": "https://api.github.com/repos/roadrunner-server/roadrunner/zipball/18f526ad9eef19b57bdf1ad4b0252683f514c718",
"reference": "18f526ad9eef19b57bdf1ad4b0252683f514c718",
"shasum": ""
},
"require": {
@ -8540,7 +8539,7 @@
"spiral/roadrunner-http": "^2.0",
"spiral/roadrunner-worker": "^2.0"
},
"time": "2023-01-12T11:55:21+00:00",
"time": "2023-02-16T13:00:26+00:00",
"type": "metapackage",
"notification-url": "https://packagist.org/downloads/",
"license": [
@ -8551,16 +8550,30 @@
"name": "Anton Titov / Wolfy-J",
"email": "wolfy.jd@gmail.com"
},
{
"name": "Valery Piashchynski",
"homepage": "https://github.com/rustatian"
},
{
"name": "RoadRunner Community",
"homepage": "https://github.com/roadrunner-server/roadrunner/graphs/contributors"
}
],
"description": "RoadRunner: High-performance PHP application server and process manager written in Go and powered with plugins",
"homepage": "https://roadrunner.dev/",
"support": {
"chat": "https://discord.gg/V6EK4he",
"docs": "https://roadrunner.dev/docs",
"forum": "https://forum.roadrunner.dev/",
"issues": "https://github.com/roadrunner-server/roadrunner/issues",
"source": "https://github.com/roadrunner-server/roadrunner/tree/v2.12.2"
"source": "https://github.com/roadrunner-server/roadrunner/tree/v2.12.3"
},
"funding": [
{
"url": "https://github.com/sponsors/roadrunner-server",
"type": "github"
}
],
"install-path": null
},
{
@ -8766,36 +8779,38 @@
},
{
"name": "spiral/tokenizer",
"version": "3.5.0",
"version_normalized": "3.5.0.0",
"version": "3.6.1",
"version_normalized": "3.6.1.0",
"source": {
"type": "git",
"url": "https://github.com/spiral/tokenizer.git",
"reference": "a11f4f1c5f0a5daad6d02ca4effe42ad45b68ff4"
"reference": "1920f0a9d0d78de3dee8c8b9ef6a68b0724c830e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/spiral/tokenizer/zipball/a11f4f1c5f0a5daad6d02ca4effe42ad45b68ff4",
"reference": "a11f4f1c5f0a5daad6d02ca4effe42ad45b68ff4",
"url": "https://api.github.com/repos/spiral/tokenizer/zipball/1920f0a9d0d78de3dee8c8b9ef6a68b0724c830e",
"reference": "1920f0a9d0d78de3dee8c8b9ef6a68b0724c830e",
"shasum": ""
},
"require": {
"ext-tokenizer": "*",
"php": ">=8.1",
"spiral/core": "^3.5",
"spiral/logger": "^3.5",
"spiral/core": "^3.6.1",
"spiral/logger": "^3.6.1",
"symfony/finder": "^5.3.7|^6.0"
},
"require-dev": {
"phpunit/phpunit": "^9.5.20",
"spiral/boot": "^3.5",
"spiral/attributes": "^2.8|^3.0",
"spiral/boot": "^3.6.1",
"spiral/files": "^3.6.1",
"vimeo/psalm": "^4.27"
},
"time": "2022-12-23T13:37:56+00:00",
"time": "2023-02-20T15:49:04+00:00",
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.5.x-dev"
"dev-master": "3.7.x-dev"
}
},
"installation-source": "dist",
@ -11789,21 +11804,21 @@
},
{
"name": "tightenco/collect",
"version": "v8.83.27",
"version_normalized": "8.83.27.0",
"version": "v9.52.0",
"version_normalized": "9.52.0.0",
"source": {
"type": "git",
"url": "https://github.com/tighten/collect.git",
"reference": "07eed6cf7441c7a69c379fdcb118eec1a1fdd0e6"
"reference": "d4772fe52bbc823d1d2e3d289d3f1ca8c0f3323b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/tighten/collect/zipball/07eed6cf7441c7a69c379fdcb118eec1a1fdd0e6",
"reference": "07eed6cf7441c7a69c379fdcb118eec1a1fdd0e6",
"url": "https://api.github.com/repos/tighten/collect/zipball/d4772fe52bbc823d1d2e3d289d3f1ca8c0f3323b",
"reference": "d4772fe52bbc823d1d2e3d289d3f1ca8c0f3323b",
"shasum": ""
},
"require": {
"php": "^7.3|^8.0",
"php": "^8.0",
"symfony/var-dumper": "^3.4 || ^4.0 || ^5.0 || ^6.0"
},
"require-dev": {
@ -11811,7 +11826,7 @@
"nesbot/carbon": "^2.23.0",
"phpunit/phpunit": "^8.3"
},
"time": "2023-01-13T18:05:42+00:00",
"time": "2023-02-17T21:37:36+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@ -11840,7 +11855,7 @@
],
"support": {
"issues": "https://github.com/tighten/collect/issues",
"source": "https://github.com/tighten/collect/tree/v8.83.27"
"source": "https://github.com/tighten/collect/tree/v9.52.0"
},
"install-path": "../tightenco/collect"
},

View File

@ -3,7 +3,7 @@
'name' => 'celaraze/chemex',
'pretty_version' => 'dev-main',
'version' => 'dev-main',
'reference' => '6c06b8eb13bc10a4afcb415a0159a4f55a98d32c',
'reference' => '9e81dd15a9d64f3e43112b1c1e1a25443f9a13bc',
'type' => 'project',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
@ -11,18 +11,18 @@
),
'versions' => array(
'adldap2/adldap2' => array(
'pretty_version' => 'v10.4.3',
'version' => '10.4.3.0',
'reference' => 'a55e2c5285b9e101ed555894bd7b97b20c0c293e',
'pretty_version' => 'v10.5.0',
'version' => '10.5.0.0',
'reference' => 'e400eecb7bd7de8ee79aae320b54ad70d37f86b1',
'type' => 'library',
'install_path' => __DIR__ . '/../adldap2/adldap2',
'aliases' => array(),
'dev_requirement' => false,
),
'adldap2/adldap2-laravel' => array(
'pretty_version' => 'v6.1.6',
'version' => '6.1.6.0',
'reference' => 'e67f845db08389acdf7326fd596fda10b3560d25',
'pretty_version' => 'v6.1.7',
'version' => '6.1.7.0',
'reference' => 'd587c4dea4ffefbbbea7601958c125216ea43452',
'type' => 'project',
'install_path' => __DIR__ . '/../adldap2/adldap2-laravel',
'aliases' => array(),
@ -58,7 +58,7 @@
'celaraze/chemex' => array(
'pretty_version' => 'dev-main',
'version' => 'dev-main',
'reference' => '6c06b8eb13bc10a4afcb415a0159a4f55a98d32c',
'reference' => '9e81dd15a9d64f3e43112b1c1e1a25443f9a13bc',
'type' => 'project',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
@ -94,9 +94,9 @@
'dev_requirement' => false,
),
'composer/composer' => array(
'pretty_version' => '2.5.3',
'version' => '2.5.3.0',
'reference' => '607a4c04006ce1d2b6fdfd5467bae3d7ad9ce5ab',
'pretty_version' => '2.5.4',
'version' => '2.5.4.0',
'reference' => '6b67eeea4d72051c369ccdbfb2423a56e2ab51a9',
'type' => 'library',
'install_path' => __DIR__ . '/./composer',
'aliases' => array(),
@ -322,9 +322,9 @@
'dev_requirement' => false,
),
'graham-campbell/result-type' => array(
'pretty_version' => 'v1.1.0',
'version' => '1.1.0.0',
'reference' => 'a878d45c1914464426dc94da61c9e1d36ae262a8',
'pretty_version' => 'v1.1.1',
'version' => '1.1.1.0',
'reference' => '672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831',
'type' => 'library',
'install_path' => __DIR__ . '/../graham-campbell/result-type',
'aliases' => array(),
@ -378,193 +378,193 @@
'illuminate/auth' => array(
'dev_requirement' => false,
'replaced' => array(
0 => 'v9.51.0',
0 => 'v9.52.4',
),
),
'illuminate/broadcasting' => array(
'dev_requirement' => false,
'replaced' => array(
0 => 'v9.51.0',
0 => 'v9.52.4',
),
),
'illuminate/bus' => array(
'dev_requirement' => false,
'replaced' => array(
0 => 'v9.51.0',
0 => 'v9.52.4',
),
),
'illuminate/cache' => array(
'dev_requirement' => false,
'replaced' => array(
0 => 'v9.51.0',
0 => 'v9.52.4',
),
),
'illuminate/collections' => array(
'dev_requirement' => false,
'replaced' => array(
0 => 'v9.51.0',
0 => 'v9.52.4',
),
),
'illuminate/conditionable' => array(
'dev_requirement' => false,
'replaced' => array(
0 => 'v9.51.0',
0 => 'v9.52.4',
),
),
'illuminate/config' => array(
'dev_requirement' => false,
'replaced' => array(
0 => 'v9.51.0',
0 => 'v9.52.4',
),
),
'illuminate/console' => array(
'dev_requirement' => false,
'replaced' => array(
0 => 'v9.51.0',
0 => 'v9.52.4',
),
),
'illuminate/container' => array(
'dev_requirement' => false,
'replaced' => array(
0 => 'v9.51.0',
0 => 'v9.52.4',
),
),
'illuminate/contracts' => array(
'dev_requirement' => false,
'replaced' => array(
0 => 'v9.51.0',
0 => 'v9.52.4',
),
),
'illuminate/cookie' => array(
'dev_requirement' => false,
'replaced' => array(
0 => 'v9.51.0',
0 => 'v9.52.4',
),
),
'illuminate/database' => array(
'dev_requirement' => false,
'replaced' => array(
0 => 'v9.51.0',
0 => 'v9.52.4',
),
),
'illuminate/encryption' => array(
'dev_requirement' => false,
'replaced' => array(
0 => 'v9.51.0',
0 => 'v9.52.4',
),
),
'illuminate/events' => array(
'dev_requirement' => false,
'replaced' => array(
0 => 'v9.51.0',
0 => 'v9.52.4',
),
),
'illuminate/filesystem' => array(
'dev_requirement' => false,
'replaced' => array(
0 => 'v9.51.0',
0 => 'v9.52.4',
),
),
'illuminate/hashing' => array(
'dev_requirement' => false,
'replaced' => array(
0 => 'v9.51.0',
0 => 'v9.52.4',
),
),
'illuminate/http' => array(
'dev_requirement' => false,
'replaced' => array(
0 => 'v9.51.0',
0 => 'v9.52.4',
),
),
'illuminate/log' => array(
'dev_requirement' => false,
'replaced' => array(
0 => 'v9.51.0',
0 => 'v9.52.4',
),
),
'illuminate/macroable' => array(
'dev_requirement' => false,
'replaced' => array(
0 => 'v9.51.0',
0 => 'v9.52.4',
),
),
'illuminate/mail' => array(
'dev_requirement' => false,
'replaced' => array(
0 => 'v9.51.0',
0 => 'v9.52.4',
),
),
'illuminate/notifications' => array(
'dev_requirement' => false,
'replaced' => array(
0 => 'v9.51.0',
0 => 'v9.52.4',
),
),
'illuminate/pagination' => array(
'dev_requirement' => false,
'replaced' => array(
0 => 'v9.51.0',
0 => 'v9.52.4',
),
),
'illuminate/pipeline' => array(
'dev_requirement' => false,
'replaced' => array(
0 => 'v9.51.0',
0 => 'v9.52.4',
),
),
'illuminate/queue' => array(
'dev_requirement' => false,
'replaced' => array(
0 => 'v9.51.0',
0 => 'v9.52.4',
),
),
'illuminate/redis' => array(
'dev_requirement' => false,
'replaced' => array(
0 => 'v9.51.0',
0 => 'v9.52.4',
),
),
'illuminate/routing' => array(
'dev_requirement' => false,
'replaced' => array(
0 => 'v9.51.0',
0 => 'v9.52.4',
),
),
'illuminate/session' => array(
'dev_requirement' => false,
'replaced' => array(
0 => 'v9.51.0',
0 => 'v9.52.4',
),
),
'illuminate/support' => array(
'dev_requirement' => false,
'replaced' => array(
0 => 'v9.51.0',
0 => 'v9.52.4',
),
),
'illuminate/testing' => array(
'dev_requirement' => false,
'replaced' => array(
0 => 'v9.51.0',
0 => 'v9.52.4',
),
),
'illuminate/translation' => array(
'dev_requirement' => false,
'replaced' => array(
0 => 'v9.51.0',
0 => 'v9.52.4',
),
),
'illuminate/validation' => array(
'dev_requirement' => false,
'replaced' => array(
0 => 'v9.51.0',
0 => 'v9.52.4',
),
),
'illuminate/view' => array(
'dev_requirement' => false,
'replaced' => array(
0 => 'v9.51.0',
0 => 'v9.52.4',
),
),
'justinrainbow/json-schema' => array(
@ -583,9 +583,9 @@
),
),
'laravel/framework' => array(
'pretty_version' => 'v9.51.0',
'version' => '9.51.0.0',
'reference' => 'b81123134349a013a738a9f7f715c6ce99d5a414',
'pretty_version' => 'v9.52.4',
'version' => '9.52.4.0',
'reference' => '9239128cfb4d22afefb64060dfecf53e82987267',
'type' => 'library',
'install_path' => __DIR__ . '/../laravel/framework',
'aliases' => array(),
@ -601,9 +601,9 @@
'dev_requirement' => false,
),
'laravel/tinker' => array(
'pretty_version' => 'v2.8.0',
'version' => '2.8.0.0',
'reference' => '74d0b287cc4ae65d15c368dd697aae71d62a73ad',
'pretty_version' => 'v2.8.1',
'version' => '2.8.1.0',
'reference' => '04a2d3bd0d650c0764f70bf49d1ee39393e4eb10',
'type' => 'library',
'install_path' => __DIR__ . '/../laravel/tinker',
'aliases' => array(),
@ -628,9 +628,9 @@
'dev_requirement' => false,
),
'league/commonmark' => array(
'pretty_version' => '2.3.8',
'version' => '2.3.8.0',
'reference' => 'c493585c130544c4e91d2e0e131e6d35cb0cbc47',
'pretty_version' => '2.3.9',
'version' => '2.3.9.0',
'reference' => 'c1e114f74e518daca2729ea8c4bf1167038fa4b5',
'type' => 'library',
'install_path' => __DIR__ . '/../league/commonmark',
'aliases' => array(),
@ -646,9 +646,9 @@
'dev_requirement' => false,
),
'league/flysystem' => array(
'pretty_version' => '3.12.2',
'version' => '3.12.2.0',
'reference' => 'f6377c709d2275ed6feaf63e44be7a7162b0e77f',
'pretty_version' => '3.12.3',
'version' => '3.12.3.0',
'reference' => '81e87e74dd5213795c7846d65089712d2dda90ce',
'type' => 'library',
'install_path' => __DIR__ . '/../league/flysystem',
'aliases' => array(),
@ -835,9 +835,9 @@
),
),
'phpoption/phpoption' => array(
'pretty_version' => '1.9.0',
'version' => '1.9.0.0',
'reference' => 'dc5ff11e274a90cc1c743f66c9ad700ce50db9ab',
'pretty_version' => '1.9.1',
'version' => '1.9.1.0',
'reference' => 'dd3a383e599f49777d8b628dadbb90cae435b87e',
'type' => 'library',
'install_path' => __DIR__ . '/../phpoption/phpoption',
'aliases' => array(),
@ -853,9 +853,9 @@
'dev_requirement' => false,
),
'phpunit/php-code-coverage' => array(
'pretty_version' => '9.2.24',
'version' => '9.2.24.0',
'reference' => '2cf940ebc6355a9d430462811b5aaa308b174bed',
'pretty_version' => '9.2.25',
'version' => '9.2.25.0',
'reference' => '0e2b40518197a8c0d4b08bc34dfff1c99c508954',
'type' => 'library',
'install_path' => __DIR__ . '/../phpunit/php-code-coverage',
'aliases' => array(),
@ -898,9 +898,9 @@
'dev_requirement' => true,
),
'phpunit/phpunit' => array(
'pretty_version' => '9.6.3',
'version' => '9.6.3.0',
'reference' => 'e7b1615e3e887d6c719121c6d4a44b0ab9645555',
'pretty_version' => '9.6.4',
'version' => '9.6.4.0',
'reference' => '9125ee085b6d95e78277dc07aa1f46f9e0607b8d',
'type' => 'library',
'install_path' => __DIR__ . '/../phpunit/phpunit',
'aliases' => array(),
@ -1017,14 +1017,14 @@
'psr/log-implementation' => array(
'dev_requirement' => false,
'provided' => array(
0 => '1.0|2.0|3.0',
1 => '1.0.0 || 2.0.0 || 3.0.0',
0 => '1.0.0 || 2.0.0 || 3.0.0',
1 => '1.0|2.0|3.0',
),
),
'psr/simple-cache' => array(
'pretty_version' => '2.0.0',
'version' => '2.0.0.0',
'reference' => '8707bf3cea6f710bf6ef05491234e3ab06f6432a',
'pretty_version' => '3.0.0',
'version' => '3.0.0.0',
'reference' => '764e0b3939f5ca87cb904f570ef9be2d78a07865',
'type' => 'library',
'install_path' => __DIR__ . '/../psr/simple-cache',
'aliases' => array(),
@ -1259,9 +1259,9 @@
'dev_requirement' => false,
),
'spatie/backtrace' => array(
'pretty_version' => '1.2.1',
'version' => '1.2.1.0',
'reference' => '4ee7d41aa5268107906ea8a4d9ceccde136dbd5b',
'pretty_version' => '1.2.2',
'version' => '1.2.2.0',
'reference' => '7b34fee6c1ad45f8ee0498d17cd8ea9a076402c1',
'type' => 'library',
'install_path' => __DIR__ . '/../spatie/backtrace',
'aliases' => array(),
@ -1322,9 +1322,9 @@
'dev_requirement' => false,
),
'spiral/core' => array(
'pretty_version' => '3.5.0',
'version' => '3.5.0.0',
'reference' => '4745ec855e74b2d52d49232349d4b11dc19fa7e4',
'pretty_version' => '3.6.1',
'version' => '3.6.1.0',
'reference' => 'dffbc4e7b326004376545aac39161dcfddb57281',
'type' => 'library',
'install_path' => __DIR__ . '/../spiral/core',
'aliases' => array(),
@ -1340,18 +1340,18 @@
'dev_requirement' => false,
),
'spiral/logger' => array(
'pretty_version' => '3.5.0',
'version' => '3.5.0.0',
'reference' => '1f00e1b57a31af5339a351ecd420df3f76667ecc',
'pretty_version' => '3.6.1',
'version' => '3.6.1.0',
'reference' => '9fca2309638c9eb90888b1f7ddf2298d90769dd1',
'type' => 'library',
'install_path' => __DIR__ . '/../spiral/logger',
'aliases' => array(),
'dev_requirement' => false,
),
'spiral/roadrunner' => array(
'pretty_version' => 'v2.12.2',
'version' => '2.12.2.0',
'reference' => 'c794a7ab2ae828af8068776b9dfcdcce5299d855',
'pretty_version' => 'v2.12.3',
'version' => '2.12.3.0',
'reference' => '18f526ad9eef19b57bdf1ad4b0252683f514c718',
'type' => 'metapackage',
'install_path' => NULL,
'aliases' => array(),
@ -1385,9 +1385,9 @@
'dev_requirement' => false,
),
'spiral/tokenizer' => array(
'pretty_version' => '3.5.0',
'version' => '3.5.0.0',
'reference' => 'a11f4f1c5f0a5daad6d02ca4effe42ad45b68ff4',
'pretty_version' => '3.6.1',
'version' => '3.6.1.0',
'reference' => '1920f0a9d0d78de3dee8c8b9ef6a68b0724c830e',
'type' => 'library',
'install_path' => __DIR__ . '/../spiral/tokenizer',
'aliases' => array(),
@ -1736,9 +1736,9 @@
'dev_requirement' => true,
),
'tightenco/collect' => array(
'pretty_version' => 'v8.83.27',
'version' => '8.83.27.0',
'reference' => '07eed6cf7441c7a69c379fdcb118eec1a1fdd0e6',
'pretty_version' => 'v9.52.0',
'version' => '9.52.0.0',
'reference' => 'd4772fe52bbc823d1d2e3d289d3f1ca8c0f3323b',
'type' => 'library',
'install_path' => __DIR__ . '/../tightenco/collect',
'aliases' => array(),

View File

@ -1,6 +1,6 @@
The MIT License (MIT)
Copyright (c) 2020-2022 Graham Campbell <hello@gjcampbell.co.uk>
Copyright (c) 2020-2023 Graham Campbell <hello@gjcampbell.co.uk>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@ -12,10 +12,10 @@
],
"require": {
"php": "^7.2.5 || ^8.0",
"phpoption/phpoption": "^1.9"
"phpoption/phpoption": "^1.9.1"
},
"require-dev": {
"phpunit/phpunit": "^8.5.28 || ^9.5.21"
"phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12"
},
"autoload": {
"psr-4": {

View File

@ -1,6 +1,97 @@
# Release Notes for 9.x
## [Unreleased](https://github.com/laravel/framework/compare/v9.49.0...9.x)
## [Unreleased](https://github.com/laravel/framework/compare/v9.52.2...9.x)
## [v9.52.2](https://github.com/laravel/framework/compare/v9.52.1...v9.52.2) - 2023-02-21
### Fixed
- Fixed `Illuminate/Collections/Arr::shuffle()` with empty array ([0c6cae0](https://github.com/laravel/framework/commit/0c6cae0ef647158b9554cad05ff39db7e7ad0d33))
## [v9.52.1](https://github.com/laravel/framework/compare/v9.52.0...v9.52.1) - 2023-02-21
### Changed
- Use secure randomness in Arr:random and Arr:shuffle ([#46105](https://github.com/laravel/framework/pull/46105))
## [v9.52.0](https://github.com/laravel/framework/compare/v9.51.0...v9.52.0) - 2023-02-14
### Added
- Added methods to Enumerable contract ([#46021](https://github.com/laravel/framework/pull/46021))
- Added new mailer transport for AWS SES V2 API ([#45977](https://github.com/laravel/framework/pull/45977))
- Add S3 temporaryUploadUrl method to AwsS3V3Adapter ([#45753](https://github.com/laravel/framework/pull/45753))
- Add index hinting support to query builder ([#46063](https://github.com/laravel/framework/pull/46063))
- Add mailer name to data for SentMessage and MessageSending events ([#46079](https://github.com/laravel/framework/pull/46079))
- Added --pending option to migrate:status ([#46089](https://github.com/laravel/framework/pull/46089))
### Fixed
- Fixed pdo exception when rollbacking without active transaction ([#46017](https://github.com/laravel/framework/pull/46017))
- Fix duplicated columns on select ([#46049](https://github.com/laravel/framework/pull/46049))
- Fixes memory leak on anonymous migrations ([№46073](https://github.com/laravel/framework/pull/46073))
- Fixed race condition in locks issued by the file cache driver ([#46011](https://github.com/laravel/framework/pull/46011))
### Changed
- Allow choosing tables to truncate in `Illuminate/Foundation/Testing/DatabaseTruncation::truncateTablesForConnection()` ([#46025](https://github.com/laravel/framework/pull/46025))
- Update afterPromptingForMissingArguments method ([#46052](https://github.com/laravel/framework/pull/46052))
- Accept closure in bus assertion helpers ([#46075](https://github.com/laravel/framework/pull/46075))
- Avoid mutating the $expectedLitener between loops on Event::assertListening ([#46095](https://github.com/laravel/framework/pull/46095))
## [v9.51.0](https://github.com/laravel/framework/compare/v9.50.2...v9.51.0) - 2023-02-07
### Added
- Added `Illuminate/Foundation/Testing/Concerns/InteractsWithDatabase::expectsDatabaseQueryCount()` ([#45932](https://github.com/laravel/framework/pull/45932))
- Added pending has-many-through and has-one-through builder ([#45894](https://github.com/laravel/framework/pull/45894))
- Added `Illuminate/Http/Client/PendingRequest::withUrlParameters()` ([#45982](https://github.com/laravel/framework/pull/45982))
### Fixed
- Fix: prevent duplicated content-type on HTTP client ([#45960](https://github.com/laravel/framework/pull/45960))
- Add missing php extensions in composer ([#45941](https://github.com/laravel/framework/pull/45941))
### Changed
- Command schedule:work minor features: schedule:run output file & environment specific verbosity ([#45949](https://github.com/laravel/framework/pull/45949))
- Added missing self reserved word to reservedNames array in `Illuminate/Console/GeneratorCommand.php` ([#46001](https://github.com/laravel/framework/pull/46001))
- pass value along to ttl callback in `Illuminate/Cache/Repository::remember()` ([#46006](https://github.com/laravel/framework/pull/46006))
- Make sure the lock_connection is used for schedule's withoutOverlapping() ([#45963](https://github.com/laravel/framework/pull/45963))
## [v9.50.2](https://github.com/laravel/framework/compare/v9.50.1...v9.50.2) - 2023-02-02
### Fixed
- Fixed missing_with and missing_with_all validation ([#45913](https://github.com/laravel/framework/pull/45913))
- Fixes blade escaped tags issue ([#45928](https://github.com/laravel/framework/pull/45928))
### Changed
- Trims numeric validation values / parameters ([#45912](https://github.com/laravel/framework/pull/45912))
- Random function doesn't generate evenly distributed random chars ([#45916](https://github.com/laravel/framework/pull/45916))
## [v9.50.1](https://github.com/laravel/framework/compare/v9.50.0...v9.50.1) - 2023-02-01
### Reverted
- Reverted ["Optimize destroy method"](https://github.com/laravel/framework/pull/45709) ([#45903](https://github.com/laravel/framework/pull/45903))
### Changed
- Allow scheme to be specified in `Illuminate/Mail/MailManager::createSmtpTransport()` ([68a8bfc](https://github.com/laravel/framework/commit/68a8bfc3ab758962c8f050160ec32833dc12e467))
- Accept optional mode in `Illuminate/Filesystem/Filesystem::replace()` ([2664e7f](https://github.com/laravel/framework/commit/2664e7fcdfe3a290462ae8e326ba79a17c747c1e))
## [v9.50.0](https://github.com/laravel/framework/compare/v9.49.0...v9.50.0) - 2023-02-01
### Added
- Added `Illuminate/Translation/Translator::stringable()` ([#45874](https://github.com/laravel/framework/pull/45874))
- Added `Illuminate/Foundation/Testing/DatabaseTruncation` ([#45726](https://github.com/laravel/framework/pull/45726))
- Added @style Blade directive ([#45887](https://github.com/laravel/framework/pull/45887))
### Reverted
- Reverted: ["Fix Illuminate Filesystem replace() leaves file executable"](https://github.com/laravel/framework/pull/45856) ([5ea388d](https://github.com/laravel/framework/commit/5ea388d7fe6f786b6dbcb34e0b52341c0b38ad7e))
### Fixed
- Fixed LazyCollection::makeIterator() to accept non Generator Function ([#45881](https://github.com/laravel/framework/pull/45881))
### Changed
- Solve data to be dumped for separate schemes ([#45805](https://github.com/laravel/framework/pull/45805))
## [v9.49.0](https://github.com/laravel/framework/compare/v9.48.0...v9.49.0) - 2023-01-31

View File

@ -13,7 +13,7 @@ trait GuardHelpers
/**
* The currently authenticated user.
*
* @var \Illuminate\Contracts\Auth\Authenticatable
* @var \Illuminate\Contracts\Auth\Authenticatable|null
*/
protected $user;

View File

@ -0,0 +1,16 @@
<?php
namespace Illuminate\Cache;
class FileLock extends CacheLock
{
/**
* Attempt to acquire the lock.
*
* @return bool
*/
public function acquire()
{
return $this->store->add($this->name, $this->owner, $this->seconds);
}
}

View File

@ -12,7 +12,7 @@ use Illuminate\Support\InteractsWithTime;
class FileStore implements Store, LockProvider
{
use InteractsWithTime, HasCacheLock, RetrievesMultipleKeys;
use InteractsWithTime, RetrievesMultipleKeys;
/**
* The Illuminate Filesystem instance.
@ -200,6 +200,31 @@ class FileStore implements Store, LockProvider
return $this->put($key, $value, 0);
}
/**
* Get a lock instance.
*
* @param string $name
* @param int $seconds
* @param string|null $owner
* @return \Illuminate\Contracts\Cache\Lock
*/
public function lock($name, $seconds = 0, $owner = null)
{
return new FileLock($this, $name, $seconds, $owner);
}
/**
* Restore a lock instance using the owner identifier.
*
* @param string $name
* @param string $owner
* @return \Illuminate\Contracts\Cache\Lock
*/
public function restoreLock($name, $owner)
{
return $this->lock($name, 0, $owner);
}
/**
* Remove an item from the cache.
*

View File

@ -838,9 +838,7 @@ class Arr
*/
public static function whereNotNull($array)
{
return static::where($array, function ($value) {
return ! is_null($value);
});
return static::where($array, fn ($value) => ! is_null($value));
}
/**

View File

@ -84,11 +84,9 @@ class Collection implements ArrayAccess, CanBeEscapedWhenCastToString, Enumerabl
{
$callback = $this->valueRetriever($callback);
$items = $this->map(function ($value) use ($callback) {
return $callback($value);
})->filter(function ($value) {
return ! is_null($value);
});
$items = $this
->map(fn ($value) => $callback($value))
->filter(fn ($value) => ! is_null($value));
if ($count = $items->count()) {
return $items->sum() / $count;
@ -349,14 +347,10 @@ class Collection implements ArrayAccess, CanBeEscapedWhenCastToString, Enumerabl
protected function duplicateComparator($strict)
{
if ($strict) {
return function ($a, $b) {
return $a === $b;
};
return fn ($a, $b) => $a === $b;
}
return function ($a, $b) {
return $a == $b;
};
return fn ($a, $b) => $a == $b;
}
/**
@ -1633,13 +1627,9 @@ class Collection implements ArrayAccess, CanBeEscapedWhenCastToString, Enumerabl
*/
public function zip($items)
{
$arrayableItems = array_map(function ($items) {
return $this->getArrayableItems($items);
}, func_get_args());
$arrayableItems = array_map(fn ($items) => $this->getArrayableItems($items), func_get_args());
$params = array_merge([function () {
return new static(func_get_args());
}, $this->items], $arrayableItems);
$params = array_merge([fn () => new static(func_get_args()), $this->items], $arrayableItems);
return new static(array_map(...$params));
}

View File

@ -430,9 +430,7 @@ class LazyCollection implements CanBeEscapedWhenCastToString, Enumerable
public function filter(callable $callback = null)
{
if (is_null($callback)) {
$callback = function ($value) {
return (bool) $value;
};
$callback = fn ($value) => (bool) $value;
}
return new static(function () use ($callback) {
@ -1500,9 +1498,7 @@ class LazyCollection implements CanBeEscapedWhenCastToString, Enumerable
/** @var callable(TValue, TKey): bool $callback */
$callback = $this->useAsCallable($value) ? $value : $this->equality($value);
return $this->takeUntil(function ($item, $key) use ($callback) {
return ! $callback($item, $key);
});
return $this->takeUntil(fn ($item, $key) => ! $callback($item, $key));
}
/**

View File

@ -80,7 +80,7 @@ class Event
public $onOneServer = false;
/**
* The amount of time the mutex should be valid.
* The number of minutes the mutex should be valid.
*
* @var int
*/

View File

@ -7,7 +7,7 @@ interface QueueingFactory extends Factory
/**
* Queue a cookie to send with the next response.
*
* @param array ...$parameters
* @param mixed ...$parameters
* @return void
*/
public function queue(...$parameters);

View File

@ -290,7 +290,11 @@ trait ManagesTransactions
protected function performRollBack($toLevel)
{
if ($toLevel == 0) {
$this->getPdo()->rollBack();
$pdo = $this->getPdo();
if ($pdo->inTransaction()) {
$pdo->rollBack();
}
} elseif ($this->queryGrammar->supportsSavepoints()) {
$this->getPdo()->exec(
$this->queryGrammar->compileSavepointRollBack('trans'.($toLevel + 1))

View File

@ -65,7 +65,11 @@ class StatusCommand extends BaseCommand
$this->components->twoColumnDetail('<fg=gray>Migration name</>', '<fg=gray>Batch / Status</>');
$migrations->each(
$migrations
->when($this->option('pending'), fn ($collection) => $collection->filter(function ($migration) {
return str($migration[1])->contains('Pending');
}))
->each(
fn ($migration) => $this->components->twoColumnDetail($migration[0], $migration[1])
);
@ -120,9 +124,8 @@ class StatusCommand extends BaseCommand
{
return [
['database', null, InputOption::VALUE_OPTIONAL, 'The database connection to use'],
['pending', null, InputOption::VALUE_NONE, 'Only list pending migrations'],
['path', null, InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'The path(s) to the migrations files to use'],
['realpath', null, InputOption::VALUE_NONE, 'Indicate any provided migration file paths are pre-resolved absolute paths'],
];
}

View File

@ -525,7 +525,7 @@ abstract class Factory
/**
* Add a new sequenced state transformation to the model definition.
*
* @param array ...$sequence
* @param mixed ...$sequence
* @return static
*/
public function sequence(...$sequence)

View File

@ -30,7 +30,7 @@ class Sequence implements Countable
/**
* Create a new sequence instance.
*
* @param array ...$sequence
* @param mixed ...$sequence
* @return void
*/
public function __construct(...$sequence)

View File

@ -1083,6 +1083,16 @@ abstract class Model implements Arrayable, ArrayAccess, CanBeEscapedWhenCastToSt
return true;
}
/**
* Save the model and all of its relationships without raising any events to the parent model.
*
* @return bool
*/
public function pushQuietly()
{
return static::withoutEvents(fn () => $this->push());
}
/**
* Save the model to the database without raising any events.
*

View File

@ -364,6 +364,17 @@ abstract class HasOneOrMany extends Relation
return $instances;
}
/**
* Create a Collection of new instances of the related model without raising any events to the parent model.
*
* @param iterable $records
* @return \Illuminate\Database\Eloquent\Collection
*/
public function createManyQuietly(iterable $records)
{
return Model::withoutEvents(fn () => $this->createMany($records));
}
/**
* Set the foreign ID for creating a related model.
*

View File

@ -66,6 +66,13 @@ class Migrator
*/
protected $paths = [];
/**
* The paths that have already been required.
*
* @var array<string, \Illuminate\Database\Migrations\Migration|null>
*/
protected static $requiredPathCache = [];
/**
* The output interface implementation.
*
@ -511,9 +518,15 @@ class Migrator
return new $class;
}
$migration = $this->files->getRequire($path);
$migration = static::$requiredPathCache[$path] ??= $this->files->getRequire($path);
return is_object($migration) ? $migration : new $class;
if (is_object($migration)) {
return method_exists($migration, '__construct')
? $this->files->getRequire($path)
: clone $migration;
}
return new $class;
}
/**

View File

@ -100,6 +100,13 @@ class Builder implements BuilderContract
*/
public $from;
/**
* The index hint for the query.
*
* @var \Illuminate\Database\Query\IndexHint
*/
public $indexHint;
/**
* The table joins for the query.
*
@ -411,6 +418,10 @@ class Builder implements BuilderContract
$this->selectSub($column, $as);
} else {
if (is_array($this->columns) && in_array($column, $this->columns, true)) {
continue;
}
$this->columns[] = $column;
}
}
@ -454,6 +465,45 @@ class Builder implements BuilderContract
return $this;
}
/**
* Add an index hint to suggest a query index.
*
* @param string $index
* @return $this
*/
public function useIndex($index)
{
$this->indexHint = new IndexHint('hint', $index);
return $this;
}
/**
* Add an index hint to force a query index.
*
* @param string $index
* @return $this
*/
public function forceIndex($index)
{
$this->indexHint = new IndexHint('force', $index);
return $this;
}
/**
* Add an index hint to ignore a query index.
*
* @param string $index
* @return $this
*/
public function ignoreIndex($index)
{
$this->indexHint = new IndexHint('ignore', $index);
return $this;
}
/**
* Add a join clause to the query.
*

View File

@ -36,6 +36,7 @@ class Grammar extends BaseGrammar
'aggregate',
'columns',
'from',
'indexHint',
'joins',
'wheres',
'groups',

View File

@ -74,6 +74,22 @@ class MySqlGrammar extends Grammar
return "match ({$columns}) against (".$value."{$mode}{$expanded})";
}
/**
* Compile the index hints for the query.
*
* @param \Illuminate\Database\Query\Builder $query
* @param \Illuminate\Database\Query\IndexHint $indexHint
* @return string
*/
protected function compileIndexHint(Builder $query, $indexHint)
{
return match ($indexHint->type) {
'hint' => "use index ({$indexHint->index})",
'force' => "force index ({$indexHint->index})",
default => "ignore index ({$indexHint->index})",
};
}
/**
* Compile an insert ignore statement into SQL.
*

View File

@ -117,6 +117,20 @@ class SQLiteGrammar extends Grammar
return "strftime('{$type}', {$this->wrap($where['column'])}) {$where['operator']} cast({$value} as text)";
}
/**
* Compile the index hints for the query.
*
* @param \Illuminate\Database\Query\Builder $query
* @param \Illuminate\Database\Query\IndexHint $indexHint
* @return string
*/
protected function compileIndexHint(Builder $query, $indexHint)
{
return $indexHint->type === 'force'
? "indexed by {$indexHint->index}"
: '';
}
/**
* Compile a "JSON length" statement into SQL.
*

View File

@ -96,6 +96,20 @@ class SqlServerGrammar extends Grammar
return $from;
}
/**
* Compile the index hints for the query.
*
* @param \Illuminate\Database\Query\Builder $query
* @param \Illuminate\Database\Query\IndexHint $indexHint
* @return string
*/
protected function compileIndexHint(Builder $query, $indexHint)
{
return $indexHint->type === 'force'
? "with (index({$indexHint->index}))"
: '';
}
/**
* {@inheritdoc}
*

View File

@ -0,0 +1,33 @@
<?php
namespace Illuminate\Database\Query;
class IndexHint
{
/**
* The type of query hint.
*
* @var string
*/
public $type;
/**
* The name of the index.
*
* @var string
*/
public $index;
/**
* Create a new index hint instance.
*
* @param string $type
* @param string $index
* @return void
*/
public function __construct($type, $index)
{
$this->type = $type;
$this->index = $index;
}
}

View File

@ -86,7 +86,7 @@ abstract class SchemaState
/**
* Create a new process instance.
*
* @param array ...$arguments
* @param mixed ...$arguments
* @return \Symfony\Component\Process\Process
*/
public function makeProcess(...$arguments)

View File

@ -95,6 +95,40 @@ class AwsS3V3Adapter extends FilesystemAdapter
return (string) $uri;
}
/**
* Get a temporary upload URL for the file at the given path.
*
* @param string $path
* @param \DateTimeInterface $expiration
* @param array $options
* @return array
*/
public function temporaryUploadUrl($path, $expiration, array $options = [])
{
$command = $this->client->getCommand('PutObject', array_merge([
'Bucket' => $this->config['bucket'],
'Key' => $this->prefixer->prefixPath($path),
], $options));
$signedRequest = $this->client->createPresignedRequest(
$command, $expiration, $options
);
$uri = $signedRequest->getUri();
// If an explicit base URL has been set on the disk configuration then we will use
// it as the base URL instead of the default path. This allows the developer to
// have full control over the base path for this filesystem's generated URLs.
if (isset($this->config['temporary_url'])) {
$uri = $this->replaceBaseUrl($uri, $this->config['temporary_url']);
}
return [
'url' => (string) $uri,
'headers' => $signedRequest->getHeaders(),
];
}
/**
* Get the underlying S3 client.
*

View File

@ -733,6 +733,25 @@ class FilesystemAdapter implements CloudFilesystemContract
throw new RuntimeException('This driver does not support creating temporary URLs.');
}
/**
* Get a temporary upload URL for the file at the given path.
*
* @param string $path
* @param \DateTimeInterface $expiration
* @param array $options
* @return array
*
* @throws \RuntimeException
*/
public function temporaryUploadUrl($path, $expiration, array $options = [])
{
if (method_exists($this->adapter, 'temporaryUploadUrl')) {
return $this->adapter->temporaryUploadUrl($path, $expiration, $options);
}
throw new RuntimeException('This driver does not support creating temporary upload URLs.');
}
/**
* Concatenate a path to a URL.
*

View File

@ -38,7 +38,7 @@ class Application extends Container implements ApplicationContract, CachesConfig
*
* @var string
*/
const VERSION = '9.51.0';
const VERSION = '9.52.4';
/**
* The base path for the Laravel installation.

View File

@ -137,7 +137,7 @@ class ListenerMakeCommand extends GeneratorCommand
*/
protected function afterPromptingForMissingArguments(InputInterface $input, OutputInterface $output)
{
if ($this->didReceiveOptions($input)) {
if ($this->isReservedName($this->getNameInput()) || $this->didReceiveOptions($input)) {
return;
}

View File

@ -245,7 +245,7 @@ class ModelMakeCommand extends GeneratorCommand
*/
protected function afterPromptingForMissingArguments(InputInterface $input, OutputInterface $output)
{
if ($this->didReceiveOptions($input)) {
if ($this->isReservedName($this->getNameInput()) || $this->didReceiveOptions($input)) {
return;
}

View File

@ -162,7 +162,7 @@ class ObserverMakeCommand extends GeneratorCommand
*/
protected function afterPromptingForMissingArguments(InputInterface $input, OutputInterface $output)
{
if ($this->didReceiveOptions($input)) {
if ($this->isReservedName($this->getNameInput()) || $this->didReceiveOptions($input)) {
return;
}

View File

@ -221,7 +221,7 @@ class PolicyMakeCommand extends GeneratorCommand
*/
protected function afterPromptingForMissingArguments(InputInterface $input, OutputInterface $output)
{
if ($this->didReceiveOptions($input)) {
if ($this->isReservedName($this->getNameInput()) || $this->didReceiveOptions($input)) {
return;
}

View File

@ -132,7 +132,7 @@ class TestMakeCommand extends GeneratorCommand
*/
protected function afterPromptingForMissingArguments(InputInterface $input, OutputInterface $output)
{
if ($this->didReceiveOptions($input)) {
if ($this->isReservedName($this->getNameInput()) || $this->didReceiveOptions($input)) {
return;
}

View File

@ -80,7 +80,11 @@ trait DatabaseTruncation
$connection->unsetEventDispatcher();
collect(static::$allTables[$name] ??= $connection->getDoctrineSchemaManager()->listTableNames())
->diff($this->exceptTables($name))
->when(
property_exists($this, 'tablesToTruncate'),
fn ($tables) => $tables->intersect($this->tablesToTruncate),
fn ($tables) => $tables->diff($this->exceptTables($name))
)
->filter(fn ($table) => $connection->table($table)->exists())
->each(fn ($table) => $connection->table($table)->truncate());

View File

@ -3,12 +3,14 @@
namespace Illuminate\Mail;
use Aws\Ses\SesClient;
use Aws\SesV2\SesV2Client;
use Closure;
use Illuminate\Contracts\Mail\Factory as FactoryContract;
use Illuminate\Log\LogManager;
use Illuminate\Mail\Transport\ArrayTransport;
use Illuminate\Mail\Transport\LogTransport;
use Illuminate\Mail\Transport\SesTransport;
use Illuminate\Mail\Transport\SesV2Transport;
use Illuminate\Support\Arr;
use Illuminate\Support\Str;
use InvalidArgumentException;
@ -154,7 +156,8 @@ class MailManager implements FactoryContract
return call_user_func($this->customCreators[$transport], $config);
}
if (trim($transport ?? '') === '' || ! method_exists($this, $method = 'create'.ucfirst($transport).'Transport')) {
if (trim($transport ?? '') === '' ||
! method_exists($this, $method = 'create'.ucfirst(Str::camel($transport)).'Transport')) {
throw new InvalidArgumentException("Unsupported mail transport [{$transport}].");
}
@ -250,6 +253,28 @@ class MailManager implements FactoryContract
);
}
/**
* Create an instance of the Symfony Amazon SES V2 Transport driver.
*
* @param array $config
* @return \Illuminate\Mail\Transport\Se2VwTransport
*/
protected function createSesV2Transport(array $config)
{
$config = array_merge(
$this->app['config']->get('services.ses', []),
['version' => 'latest'],
$config
);
$config = Arr::except($config, ['transport']);
return new SesV2Transport(
new SesV2Client($this->addSesCredentials($config)),
$config['options'] ?? []
);
}
/**
* Add the SES credentials to the configuration array.
*

View File

@ -253,6 +253,8 @@ class Mailer implements MailerContract, MailQueueContract
return $this->sendMailable($view);
}
$data['mailer'] = $this->name;
// First we need to parse the view, which could either be a string or an array
// containing both an HTML and plain text versions of the view which should
// be used when sending an e-mail. We will extract both of them out here.

View File

@ -315,7 +315,7 @@ class Message
/**
* Attach in-memory data as an attachment.
*
* @param string $data
* @param string|resource $data
* @param string $name
* @param array $options
* @return $this
@ -366,7 +366,7 @@ class Message
/**
* Embed in-memory data in the message and get the CID.
*
* @param string $data
* @param string|resource $data
* @param string $name
* @param string|null $contentType
* @return string

View File

@ -88,16 +88,6 @@ class SesTransport extends AbstractTransport
$message->getOriginalMessage()->getHeaders()->addHeader('X-SES-Message-ID', $messageId);
}
/**
* Get the string representation of the transport.
*
* @return string
*/
public function __toString(): string
{
return 'ses';
}
/**
* Get the Amazon SES client for the SesTransport instance.
*
@ -128,4 +118,14 @@ class SesTransport extends AbstractTransport
{
return $this->options = $options;
}
/**
* Get the string representation of the transport.
*
* @return string
*/
public function __toString(): string
{
return 'ses';
}
}

View File

@ -0,0 +1,135 @@
<?php
namespace Illuminate\Mail\Transport;
use Aws\Exception\AwsException;
use Aws\SesV2\SesV2Client;
use Exception;
use Symfony\Component\Mailer\Header\MetadataHeader;
use Symfony\Component\Mailer\SentMessage;
use Symfony\Component\Mailer\Transport\AbstractTransport;
use Symfony\Component\Mime\Message;
class SesV2Transport extends AbstractTransport
{
/**
* The Amazon SES V2 instance.
*
* @var \Aws\SesV2\SesV2Client
*/
protected $ses;
/**
* The Amazon SES transmission options.
*
* @var array
*/
protected $options = [];
/**
* Create a new SES V2 transport instance.
*
* @param \Aws\SesV2\SesV2Client $ses
* @param array $options
* @return void
*/
public function __construct(SesV2Client $ses, $options = [])
{
$this->ses = $ses;
$this->options = $options;
parent::__construct();
}
/**
* {@inheritDoc}
*/
protected function doSend(SentMessage $message): void
{
$options = $this->options;
if ($message->getOriginalMessage() instanceof Message) {
foreach ($message->getOriginalMessage()->getHeaders()->all() as $header) {
if ($header instanceof MetadataHeader) {
$options['Tags'][] = ['Name' => $header->getKey(), 'Value' => $header->getValue()];
}
}
}
try {
$result = $this->ses->sendEmail(
array_merge(
$options, [
'ReplyToAddresses' => [$message->getEnvelope()->getSender()->toString()],
'Destination' => [
'ToAddresses' => collect($message->getEnvelope()->getRecipients())
->map
->toString()
->values()
->all(),
],
'Content' => [
'Raw' => [
'Data' => $message->toString(),
],
],
]
)
);
} catch (AwsException $e) {
$reason = $e->getAwsErrorMessage() ?? $e->getMessage();
throw new Exception(
sprintf('Request to AWS SES V2 API failed. Reason: %s.', $reason),
is_int($e->getCode()) ? $e->getCode() : 0,
$e
);
}
$messageId = $result->get('MessageId');
$message->getOriginalMessage()->getHeaders()->addHeader('X-Message-ID', $messageId);
$message->getOriginalMessage()->getHeaders()->addHeader('X-SES-Message-ID', $messageId);
}
/**
* Get the Amazon SES V2 client for the SesV2Transport instance.
*
* @return \Aws\SesV2\SesV2Client
*/
public function ses()
{
return $this->ses;
}
/**
* Get the transmission options being used by the transport.
*
* @return array
*/
public function getOptions()
{
return $this->options;
}
/**
* Set the transmission options being used by the transport.
*
* @param array $options
* @return array
*/
public function setOptions(array $options)
{
return $this->options = $options;
}
/**
* Get the string representation of the transport.
*
* @return string
*/
public function __toString(): string
{
return 'ses-v2';
}
}

View File

@ -27,7 +27,7 @@ class ViewController extends Controller
/**
* Invoke the controller method.
*
* @param array ...$args
* @param mixed ...$args
* @return \Illuminate\Http\Response
*/
public function __invoke(...$args)

View File

@ -13,7 +13,7 @@ namespace Illuminate\Support\Facades;
* @method static void extend(callable $compiler)
* @method static array getExtensions()
* @method static void if(string $name, callable $callback)
* @method static bool check(string $name, array ...$parameters)
* @method static bool check(string $name, mixed ...$parameters)
* @method static void component(string $class, string|null $alias = null, string $prefix = '')
* @method static void components(array $components, string $prefix = '')
* @method static array getClassComponentAliases()

View File

@ -22,14 +22,14 @@ use Illuminate\Support\Testing\Fakes\BusFake;
* @method static \Illuminate\Bus\Dispatcher map(array $map)
* @method static void except(array|string $jobsToDispatch)
* @method static void assertDispatched(string|\Closure $command, callable|int|null $callback = null)
* @method static void assertDispatchedTimes(string $command, int $times = 1)
* @method static void assertDispatchedTimes(string|\Closure $command, int $times = 1)
* @method static void assertNotDispatched(string|\Closure $command, callable|null $callback = null)
* @method static void assertNothingDispatched()
* @method static void assertDispatchedSync(string|\Closure $command, callable|int|null $callback = null)
* @method static void assertDispatchedSyncTimes(string $command, int $times = 1)
* @method static void assertDispatchedSyncTimes(string|\Closure $command, int $times = 1)
* @method static void assertNotDispatchedSync(string|\Closure $command, callable|null $callback = null)
* @method static void assertDispatchedAfterResponse(string|\Closure $command, callable|int|null $callback = null)
* @method static void assertDispatchedAfterResponseTimes(string $command, int $times = 1)
* @method static void assertDispatchedAfterResponseTimes(string|\Closure $command, int $times = 1)
* @method static void assertNotDispatchedAfterResponse(string|\Closure $command, callable|null $callback = null)
* @method static void assertChained(array $expectedChain)
* @method static void assertDispatchedWithoutChain(string|\Closure $command, callable|null $callback = null)

View File

@ -59,6 +59,7 @@ use Illuminate\Filesystem\Filesystem;
* @method static string url(string $path)
* @method static bool providesTemporaryUrls()
* @method static string temporaryUrl(string $path, \DateTimeInterface $expiration, array $options = [])
* @method static array temporaryUploadUrl(string $path, \DateTimeInterface $expiration, array $options = [])
* @method static \League\Flysystem\FilesystemOperator getDriver()
* @method static \League\Flysystem\FilesystemAdapter getAdapter()
* @method static array getConfig()

View File

@ -127,15 +127,21 @@ class BusFake implements QueueingDispatcher
/**
* Assert if a job was pushed a number of times.
*
* @param string $command
* @param string|\Closure $command
* @param int $times
* @return void
*/
public function assertDispatchedTimes($command, $times = 1)
{
$count = $this->dispatched($command)->count() +
$this->dispatchedAfterResponse($command)->count() +
$this->dispatchedSync($command)->count();
$callback = null;
if ($command instanceof Closure) {
[$command, $callback] = [$this->firstClosureParameterType($command), $command];
}
$count = $this->dispatched($command, $callback)->count() +
$this->dispatchedAfterResponse($command, $callback)->count() +
$this->dispatchedSync($command, $callback)->count();
PHPUnit::assertSame(
$times, $count,
@ -200,13 +206,19 @@ class BusFake implements QueueingDispatcher
/**
* Assert if a job was pushed synchronously a number of times.
*
* @param string $command
* @param string|\Closure $command
* @param int $times
* @return void
*/
public function assertDispatchedSyncTimes($command, $times = 1)
{
$count = $this->dispatchedSync($command)->count();
$callback = null;
if ($command instanceof Closure) {
[$command, $callback] = [$this->firstClosureParameterType($command), $command];
}
$count = $this->dispatchedSync($command, $callback)->count();
PHPUnit::assertSame(
$times, $count,
@ -259,13 +271,19 @@ class BusFake implements QueueingDispatcher
/**
* Assert if a job was pushed after the response was sent a number of times.
*
* @param string $command
* @param string|\Closure $command
* @param int $times
* @return void
*/
public function assertDispatchedAfterResponseTimes($command, $times = 1)
{
$count = $this->dispatchedAfterResponse($command)->count();
$callback = null;
if ($command instanceof Closure) {
[$command, $callback] = [$this->firstClosureParameterType($command), $command];
}
$count = $this->dispatchedAfterResponse($command, $callback)->count();
PHPUnit::assertSame(
$times, $count,

View File

@ -85,21 +85,23 @@ class EventFake implements Dispatcher
$actualListener = (new ReflectionFunction($listenerClosure))
->getStaticVariables()['listener'];
$normalizedListener = $expectedListener;
if (is_string($actualListener) && Str::contains($actualListener, '@')) {
$actualListener = Str::parseCallback($actualListener);
if (is_string($expectedListener)) {
if (Str::contains($expectedListener, '@')) {
$expectedListener = Str::parseCallback($expectedListener);
$normalizedListener = Str::parseCallback($expectedListener);
} else {
$expectedListener = [$expectedListener, 'handle'];
$normalizedListener = [$expectedListener, 'handle'];
}
}
}
if ($actualListener === $expectedListener ||
if ($actualListener === $normalizedListener ||
($actualListener instanceof Closure &&
$expectedListener === Closure::class)) {
$normalizedListener === Closure::class)) {
PHPUnit::assertTrue(true);
return;

View File

@ -1682,7 +1682,7 @@ class TestResponse implements ArrayAccess
* Proxy isset() checks to the underlying base response.
*
* @param string $key
* @return mixed
* @return bool
*/
public function __isset($key)
{

View File

@ -89,9 +89,9 @@ class MessageSelector
*/
private function stripConditions($segments)
{
return collect($segments)->map(function ($part) {
return preg_replace('/^[\{\[]([^\[\]\{\}]*)[\}\]]/', '', $part);
})->all();
return collect($segments)
->map(fn ($part) => preg_replace('/^[\{\[]([^\[\]\{\}]*)[\}\]]/', '', $part))
->all();
}
/**

View File

@ -721,7 +721,7 @@ class BladeCompiler extends Compiler implements CompilerInterface
* Check the result of a condition.
*
* @param string $name
* @param array ...$parameters
* @param mixed ...$parameters
* @return bool
*/
public function check($name, ...$parameters)

View File

@ -131,6 +131,10 @@ class TinkerCommand extends Command
$casters['Illuminate\Database\Eloquent\Model'] = 'Laravel\Tinker\TinkerCaster::castModel';
}
if (class_exists('Illuminate\Process\ProcessResult')) {
$casters['Illuminate\Process\ProcessResult'] = 'Laravel\Tinker\TinkerCaster::castProcessResult';
}
if (class_exists('Illuminate\Foundation\Application')) {
$casters['Illuminate\Foundation\Application'] = 'Laravel\Tinker\TinkerCaster::castApplication';
}

View File

@ -94,6 +94,22 @@ class TinkerCaster
];
}
/**
* Get an array representing the properties of a process result.
*
* @param \Illuminate\Process\ProcessResult $result
* @return array
*/
public static function castProcessResult($result)
{
return [
Caster::PREFIX_VIRTUAL.'output' => $result->output(),
Caster::PREFIX_VIRTUAL.'errorOutput' => $result->errorOutput(),
Caster::PREFIX_VIRTUAL.'exitCode' => $result->exitCode(),
Caster::PREFIX_VIRTUAL.'successful' => $result->successful(),
];
}
/**
* Get an array representing the properties of a model.
*

View File

@ -6,6 +6,12 @@ Updates should follow the [Keep a CHANGELOG](https://keepachangelog.com/) princi
## [Unreleased][unreleased]
## [2.3.9] - 2023-02-15
### Fixed
- Fixed autolink extension not detecting some URIs with underscores (#956)
## [2.3.8] - 2022-12-10
### Fixed
@ -512,7 +518,8 @@ No changes were introduced since the previous release.
- Alternative 1: Use `CommonMarkConverter` or `GithubFlavoredMarkdownConverter` if you don't need to customize the environment
- Alternative 2: Instantiate a new `Environment` and add the necessary extensions yourself
[unreleased]: https://github.com/thephpleague/commonmark/compare/2.3.8...main
[unreleased]: https://github.com/thephpleague/commonmark/compare/2.3.9...main
[2.3.9]: https://github.com/thephpleague/commonmark/compare/2.3.8...2.3.9
[2.3.8]: https://github.com/thephpleague/commonmark/compare/2.3.7...2.3.8
[2.3.7]: https://github.com/thephpleague/commonmark/compare/2.3.6...2.3.7
[2.3.6]: https://github.com/thephpleague/commonmark/compare/2.3.5...2.3.6

View File

@ -72,6 +72,7 @@ final class AttributesHelper
continue;
}
/** @psalm-suppress PossiblyUndefinedArrayOffset */
[$name, $value] = \explode('=', $attribute, 2);
$first = $value[0];

View File

@ -22,16 +22,22 @@ final class UrlAutolinkParser implements InlineParserInterface
{
private const ALLOWED_AFTER = [null, ' ', "\t", "\n", "\x0b", "\x0c", "\x0d", '*', '_', '~', '('];
// RegEx adapted from https://github.com/symfony/symfony/blob/4.2/src/Symfony/Component/Validator/Constraints/UrlValidator.php
// RegEx adapted from https://github.com/symfony/symfony/blob/6.3/src/Symfony/Component/Validator/Constraints/UrlValidator.php
private const REGEX = '~
(
# Must start with a supported scheme + auth, or "www"
(?:
(?:%s):// # protocol
(?:([\.\pL\pN-]+:)?([\.\pL\pN-]+)@)? # basic auth
(?:(?:(?:[\_\.\pL\pN-]|%%[0-9A-Fa-f]{2})+:)?((?:[\_\.\pL\pN-]|%%[0-9A-Fa-f]{2})+)@)? # basic auth
|www\.)
(?:
(?:[\pL\pN\pS\-\.])+(?:\.?(?:[\pL\pN]|xn\-\-[\pL\pN-]+)+\.?) # a domain name
(?:
(?:xn--[a-z0-9-]++\.)*+xn--[a-z0-9-]++ # a domain name using punycode
|
(?:[\pL\pN\pS\pM\-\_]++\.)+[\pL\pN\pM]++ # a multi-level domain name
|
[a-z0-9\-\_]++ # a single-level domain name
)\.?
| # or
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} # an IP address
| # or
@ -41,7 +47,7 @@ final class UrlAutolinkParser implements InlineParserInterface
)
(?::[0-9]+)? # a port (optional)
(?:/ (?:[\pL\pN\-._\~!$&\'()*+,;=:@]|%%[0-9A-Fa-f]{2})* )* # a path
(?:\? (?:[\pL\pN\-._\~!$&\'()*+,;=:@/?]|%%[0-9A-Fa-f]{2})* )? # a query (optional)
(?:\? (?:[\pL\pN\-._\~!$&\'\[\]()*+,;=:@/?]|%%[0-9A-Fa-f]{2})* )? # a query (optional)
(?:\# (?:[\pL\pN\-._\~!$&\'()*+,;=:@/?]|%%[0-9A-Fa-f]{2})* )? # a fragment (optional)
)~ixu';

View File

@ -31,7 +31,7 @@ final class AndExpr implements ExpressionInterface
*/
public function __construct(callable ...$expressions)
{
$this->conditions = $expressions;
$this->conditions = \array_values($expressions);
}
/**

View File

@ -31,7 +31,7 @@ final class OrExpr implements ExpressionInterface
*/
public function __construct(callable ...$expressions)
{
$this->conditions = $expressions;
$this->conditions = \array_values($expressions);
}
/**

View File

@ -19,8 +19,8 @@
"php": "^7.2.5 || ^8.0"
},
"require-dev": {
"bamarni/composer-bin-plugin": "^1.8",
"phpunit/phpunit": "^8.5.28 || ^9.5.21"
"bamarni/composer-bin-plugin": "^1.8.2",
"phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12"
},
"autoload": {
"psr-4": {

View File

@ -2,6 +2,12 @@
All notable changes are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles.
## [9.2.25] - 2023-02-25
### Fixed
* [#981](https://github.com/sebastianbergmann/php-code-coverage/issues/981): `CodeUnitFindingVisitor` does not support DNF types
## [9.2.24] - 2023-01-26
### Changed
@ -464,6 +470,7 @@ All notable changes are documented in this file using the [Keep a CHANGELOG](htt
* This component is no longer supported on PHP 7.1
[9.2.25]: https://github.com/sebastianbergmann/php-code-coverage/compare/9.2.24...9.2.25
[9.2.24]: https://github.com/sebastianbergmann/php-code-coverage/compare/9.2.23...9.2.24
[9.2.23]: https://github.com/sebastianbergmann/php-code-coverage/compare/9.2.22...9.2.23
[9.2.22]: https://github.com/sebastianbergmann/php-code-coverage/compare/9.2.21...9.2.22

View File

@ -32,7 +32,7 @@
"ext-dom": "*",
"ext-libxml": "*",
"ext-xmlwriter": "*",
"nikic/php-parser": "^4.14",
"nikic/php-parser": "^4.15",
"phpunit/php-file-iterator": "^3.0.3",
"phpunit/php-text-template": "^2.0.2",
"sebastian/code-unit-reverse-lookup": "^2.0.2",

View File

@ -26,6 +26,7 @@ use PhpParser\Node\Stmt\Function_;
use PhpParser\Node\Stmt\Interface_;
use PhpParser\Node\Stmt\Trait_;
use PhpParser\Node\UnionType;
use PhpParser\NodeAbstract;
use PhpParser\NodeTraverser;
use PhpParser\NodeVisitorAbstract;
use SebastianBergmann\Complexity\CyclomaticComplexityCalculatingVisitor;
@ -180,8 +181,12 @@ final class CodeUnitFindingVisitor extends NodeVisitorAbstract
return '?' . $type->type;
}
if ($type instanceof UnionType || $type instanceof IntersectionType) {
return $this->unionOrIntersectionAsString($type);
if ($type instanceof UnionType) {
return $this->unionTypeAsString($type);
}
if ($type instanceof IntersectionType) {
return $this->intersectionTypeAsString($type);
}
return $type->toString();
@ -298,29 +303,43 @@ final class CodeUnitFindingVisitor extends NodeVisitorAbstract
return trim(rtrim($namespacedName, $name), '\\');
}
/**
* @psalm-param UnionType|IntersectionType $type
*/
private function unionOrIntersectionAsString(ComplexType $type): string
private function unionTypeAsString(UnionType $node): string
{
if ($type instanceof UnionType) {
$separator = '|';
} else {
$separator = '&';
}
$types = [];
foreach ($type->types as $_type) {
if ($_type instanceof Name) {
$types[] = $_type->toCodeString();
} else {
assert($_type instanceof Identifier);
foreach ($node->types as $type) {
if ($type instanceof IntersectionType) {
$types[] = '(' . $this->intersectionTypeAsString($type) . ')';
$types[] = $_type->toString();
}
continue;
}
return implode($separator, $types);
$types[] = $this->typeAsString($type);
}
return implode('|', $types);
}
private function intersectionTypeAsString(IntersectionType $node): string
{
$types = [];
foreach ($node->types as $type) {
$types[] = $this->typeAsString($type);
}
return implode('&', $types);
}
/**
* @psalm-param Identifier|Name $node $node
*/
private function typeAsString(NodeAbstract $node): string
{
if ($node instanceof Name) {
return $node->toCodeString();
}
return $node->toString();
}
}

View File

@ -22,7 +22,7 @@ final class Version
public static function id(): string
{
if (self::$version === null) {
self::$version = (new VersionId('9.2.24', dirname(__DIR__)))->getVersion();
self::$version = (new VersionId('9.2.25', dirname(__DIR__)))->getVersion();
}
return self::$version;

View File

@ -2,6 +2,12 @@
All notable changes of the PHPUnit 8.5 release series are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles.
## [8.5.33] - 2023-02-27
### Fixed
* [#5186](https://github.com/sebastianbergmann/phpunit/issues/5186): SBOM does not validate
## [8.5.32] - 2023-01-26
### Fixed
@ -262,6 +268,7 @@ All notable changes of the PHPUnit 8.5 release series are documented in this fil
* [#3967](https://github.com/sebastianbergmann/phpunit/issues/3967): Cannot double interface that extends interface that extends `\Throwable`
* [#3968](https://github.com/sebastianbergmann/phpunit/pull/3968): Test class run in a separate PHP process are passing when `exit` called inside
[8.5.33]: https://github.com/sebastianbergmann/phpunit/compare/8.5.32...8.5.33
[8.5.32]: https://github.com/sebastianbergmann/phpunit/compare/8.5.31...8.5.32
[8.5.31]: https://github.com/sebastianbergmann/phpunit/compare/8.5.30...8.5.31
[8.5.30]: https://github.com/sebastianbergmann/phpunit/compare/8.5.29...8.5.30

View File

@ -2,6 +2,12 @@
All notable changes of the PHPUnit 9.6 release series are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles.
## [9.6.4] - 2023-02-27
### Fixed
* [#5186](https://github.com/sebastianbergmann/phpunit/issues/5186): SBOM does not validate
## [9.6.3] - 2023-02-04
### Fixed
@ -19,7 +25,7 @@ All notable changes of the PHPUnit 9.6 release series are documented in this fil
### Fixed
* [#5073](https://github.com/sebastianbergmann/phpunit/issues/5073): `--no-extensions` CLI option only prevents extension PHARs from being loaded
* [#5160](https://github.com/sebastianbergmann/phpunit/issues/5160): PHPUnit 9.6 misses deprecations for assertions and constraints removed in PHPUnit 10
* [#5160](https://github.com/sebastianbergmann/phpunit/issues/5160): Deprecate `assertClassHasAttribute()`, `assertClassNotHasAttribute()`, `assertClassHasStaticAttribute()`, `assertClassNotHasStaticAttribute()`, `assertObjectHasAttribute()`, `assertObjectNotHasAttribute()`, `classHasAttribute()`, `classHasStaticAttribute()`, and `objectHasAttribute()`
## [9.6.0] - 2023-02-03
@ -30,6 +36,7 @@ All notable changes of the PHPUnit 9.6 release series are documented in this fil
* [#5064](https://github.com/sebastianbergmann/phpunit/issues/5064): Deprecate `PHPUnit\Framework\TestCase::getMockClass()`
* [#5132](https://github.com/sebastianbergmann/phpunit/issues/5132): Deprecate `Test` suffix for abstract test case classes
[9.6.4]: https://github.com/sebastianbergmann/phpunit/compare/9.6.3...9.6.4
[9.6.3]: https://github.com/sebastianbergmann/phpunit/compare/9.6.2...9.6.3
[9.6.2]: https://github.com/sebastianbergmann/phpunit/compare/9.6.1...9.6.2
[9.6.1]: https://github.com/sebastianbergmann/phpunit/compare/9.6.0...9.6.1

View File

@ -1,11 +1,33 @@
# Security Policy
PHPUnit is a framework for writing as well as a commandline tool for running tests. Writing and running tests is a development-time activity. There is no reason why PHPUnit should be installed on a webserver.
If you believe you have found a security vulnerability in PHPUnit, please report it to us through coordinated disclosure.
**Please do not report security vulnerabilities through public GitHub issues, discussions, or pull requests.**
Instead, please email `sebastian@phpunit.de`.
Please include as much of the information listed below as you can to help us better understand and resolve the issue:
* The type of issue
* Full paths of source file(s) related to the manifestation of the issue
* The location of the affected source code (tag/branch/commit or direct URL)
* Any special configuration required to reproduce the issue
* Step-by-step instructions to reproduce the issue
* Proof-of-concept or exploit code (if possible)
* Impact of the issue, including how an attacker might exploit the issue
This information will help us triage your report more quickly.
## Web Context
PHPUnit is a framework for writing as well as a command-line tool for running tests. Writing and running tests is a development-time activity. There is no reason why PHPUnit should be installed on a webserver and/or in a production environment.
**If you upload PHPUnit to a webserver then your deployment process is broken. On a more general note, if your `vendor` directory is publicly accessible on your webserver then your deployment process is also broken.**
Please note that if you upload PHPUnit to a webserver "bad things" may happen. [You have been warned.](https://thephp.cc/articles/phpunit-a-security-risk)
## Security Contact Information
PHPUnit is developed with a focus on development environments and the command-line. No specific testing or hardening with regard to using PHPUnit in an HTTP or web context or with untrusted input data is performed. PHPUnit might also contain functionality that intentionally exposes internal application data for debugging purposes.
After the above, if you still would like to report a security vulnerability, please email `sebastian@phpunit.de`.
If PHPUnit is used in a web application, the application developer is responsible for filtering inputs or escaping outputs as necessary and for verifying that the used functionality is safe for use within the intended context.
Vulnerabilities specific to the use outside a development context will be fixed as applicable, provided that the fix does not have an averse effect on the primary use case for development purposes.

View File

@ -41,7 +41,7 @@ final class Version
}
if (self::$version === '') {
self::$version = (new VersionId('9.6.3', dirname(__DIR__, 2)))->getVersion();
self::$version = (new VersionId('9.6.4', dirname(__DIR__, 2)))->getVersion();
}
return self::$version;

View File

@ -19,7 +19,7 @@
},
"extra": {
"branch-alias": {
"dev-master": "2.0.x-dev"
"dev-master": "3.0.x-dev"
}
}
}

View File

@ -15,7 +15,7 @@ interface CacheInterface
* @throws \Psr\SimpleCache\InvalidArgumentException
* MUST be thrown if the $key string is not a legal value.
*/
public function get(string $key, mixed $default = null);
public function get(string $key, mixed $default = null): mixed;
/**
* Persists data in the cache, uniquely referenced by a key with an optional expiration TTL time.
@ -31,7 +31,7 @@ interface CacheInterface
* @throws \Psr\SimpleCache\InvalidArgumentException
* MUST be thrown if the $key string is not a legal value.
*/
public function set(string $key, mixed $value, null|int|\DateInterval $ttl = null);
public function set(string $key, mixed $value, null|int|\DateInterval $ttl = null): bool;
/**
* Delete an item from the cache by its unique key.
@ -43,14 +43,14 @@ interface CacheInterface
* @throws \Psr\SimpleCache\InvalidArgumentException
* MUST be thrown if the $key string is not a legal value.
*/
public function delete(string $key);
public function delete(string $key): bool;
/**
* Wipes clean the entire cache's keys.
*
* @return bool True on success and false on failure.
*/
public function clear();
public function clear(): bool;
/**
* Obtains multiple cache items by their unique keys.
@ -64,7 +64,7 @@ interface CacheInterface
* MUST be thrown if $keys is neither an array nor a Traversable,
* or if any of the $keys are not a legal value.
*/
public function getMultiple(iterable $keys, mixed $default = null);
public function getMultiple(iterable $keys, mixed $default = null): iterable;
/**
* Persists a set of key => value pairs in the cache, with an optional TTL.
@ -80,7 +80,7 @@ interface CacheInterface
* MUST be thrown if $values is neither an array nor a Traversable,
* or if any of the $values are not a legal value.
*/
public function setMultiple(iterable $values, null|int|\DateInterval $ttl = null);
public function setMultiple(iterable $values, null|int|\DateInterval $ttl = null): bool;
/**
* Deletes multiple cache items in a single operation.
@ -93,7 +93,7 @@ interface CacheInterface
* MUST be thrown if $keys is neither an array nor a Traversable,
* or if any of the $keys are not a legal value.
*/
public function deleteMultiple(iterable $keys);
public function deleteMultiple(iterable $keys): bool;
/**
* Determines whether an item is present in the cache.
@ -110,5 +110,5 @@ interface CacheInterface
* @throws \Psr\SimpleCache\InvalidArgumentException
* MUST be thrown if the $key string is not a legal value.
*/
public function has(string $key);
public function has(string $key): bool;
}

View File

@ -1,40 +0,0 @@
<?php
$finder = Symfony\Component\Finder\Finder::create()
->in([
__DIR__ . '/src',
__DIR__ . '/tests',
])
->name('*.php')
->notName('*.blade.php')
->ignoreDotFiles(true)
->ignoreVCS(true);
return (new PhpCsFixer\Config())
->setRules([
'@PSR2' => true,
'array_syntax' => ['syntax' => 'short'],
'ordered_imports' => ['sort_algorithm' => 'alpha'],
'no_unused_imports' => true,
'not_operator_with_successor_space' => true,
'trailing_comma_in_multiline' => true,
'phpdoc_scalar' => true,
'unary_operator_spaces' => true,
'binary_operator_spaces' => true,
'blank_line_before_statement' => [
'statements' => ['break', 'continue', 'declare', 'return', 'throw', 'try'],
],
'phpdoc_single_line_var_spacing' => true,
'phpdoc_var_without_name' => true,
'class_attributes_separation' => [
'elements' => [
'method' => 'one',
],
],
'method_argument_space' => [
'on_multiline' => 'ensure_fully_multiline',
'keep_multiple_spaces_after_comma' => true,
],
'single_trait_insert_per_statement' => true,
])
->setFinder($finder);

View File

@ -1,23 +0,0 @@
# Changelog
All notable changes to `backtrace` will be documented in this file
## 1.2.1 - 2021-11-09
- Add a return typehint (#4)
## 1.2.0 - 2021-05-19
- add `firstApplicationFrameIndex`
## 1.1.0 - 2021-01-29
- add `snippetProperties`
## 1.0.1 - 2021-01-27
- add support for PHP 7.3
## 1.0.0 - 2020-11-24
- initial release

View File

@ -1,3 +1,6 @@
[<img src="https://github-ads.s3.eu-central-1.amazonaws.com/support-ukraine.svg?t=1" />](https://supportukrainenow.org)
# A better PHP backtrace
[![Latest Version on Packagist](https://img.shields.io/packagist/v/spatie/backtrace.svg?style=flat-square)](https://packagist.org/packages/spatie/backtrace)
@ -101,7 +104,7 @@ $frames = Backtrace::create()
With this code, all frames before the frame that concerns `MyClass` will have been filtered out.
Alternatively, you can use the `offSet` method, which will skip the given number of frames. In this example the first 2 frames will not end up in `$frames`.
Alternatively, you can use the `offset` method, which will skip the given number of frames. In this example the first 2 frames will not end up in `$frames`.
```php
$frames = Spatie\Backtrace\Backtrace::create()
@ -141,7 +144,7 @@ Please see [CHANGELOG](CHANGELOG.md) for more information on what has changed re
## Contributing
Please see [CONTRIBUTING](.github/CONTRIBUTING.md) for details.
Please see [CONTRIBUTING](https://github.com/spatie/.github/blob/main/CONTRIBUTING.md) for details.
## Security Vulnerabilities

View File

@ -61,7 +61,7 @@ class Backtrace
public function applicationPath(string $applicationPath): self
{
$this->applicationPath = $applicationPath;
$this->applicationPath = rtrim($applicationPath, '/');
return $this;
}

View File

@ -31,9 +31,9 @@
"psr/container": "^1.1|^2.0"
},
"require-dev": {
"phpunit/phpunit": "^9.5.20",
"mockery/mockery": "^1.5",
"vimeo/psalm": "^4.27"
"phpunit/phpunit": "^9.5.20",
"vimeo/psalm": "^5.6"
},
"autoload": {
"psr-4": {
@ -47,7 +47,7 @@
},
"extra": {
"branch-alias": {
"dev-master": "3.5.x-dev"
"dev-master": "3.7.x-dev"
}
},
"config": {

View File

@ -3,7 +3,6 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="https://getpsalm.org/schema/config"
xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"
errorLevel="4"
hoistConstants="true"
resolveFromConfigFile="true"
@ -11,6 +10,8 @@
findUnusedVariablesAndParams="true"
ensureArrayStringOffsetsExist="true"
addParamDefaultToDocblockType="true"
findUnusedBaselineEntry="true"
findUnusedCode="false"
>
<projectFiles>
<directory name="src" />

View File

@ -0,0 +1,19 @@
<?php
declare(strict_types=1);
namespace Spiral\Core\Attribute;
/**
* Define a finalize method for the class.
*
* @internal We are testing this feature, it may be changed in the future.
*/
#[\Attribute(\Attribute::TARGET_CLASS)]
final class Finalize
{
public function __construct(
public string $method,
) {
}
}

View File

@ -0,0 +1,19 @@
<?php
declare(strict_types=1);
namespace Spiral\Core\Attribute;
/**
* Set a scope in which the dependency can be resolved.
*
* @internal We are testing this feature, it may be changed in the future.
*/
#[\Attribute(\Attribute::TARGET_CLASS)]
final class Scope
{
public function __construct(
public string $name,
) {
}
}

View File

@ -0,0 +1,13 @@
<?php
declare(strict_types=1);
namespace Spiral\Core\Attribute;
/**
* Mark class as singleton.
*/
#[\Attribute(\Attribute::TARGET_CLASS)]
final class Singleton
{
}

View File

@ -18,7 +18,7 @@ interface BinderInterface
* every method call), function array or Closure (executed every call). Only object resolvers
* supported by this method.
*
* @psalm-param TResolver $resolver
* @param TResolver $resolver
*/
public function bind(string $alias, string|array|callable|object $resolver): void;
@ -41,17 +41,22 @@ interface BinderInterface
/**
* Bind class or class interface to the injector source (InjectorInterface).
*
* @template TClass
* @template TClass of object
*
* @param class-string<TClass> $class
* @param class-string<InjectorInterface<TClass>> $injector
*/
public function bindInjector(string $class, string $injector): void;
/**
* @param class-string $class
*/
public function removeInjector(string $class): void;
/**
* Check if class points to injector.
*
* @param class-string $class
*/
public function hasInjector(string $class): bool;
}

View File

@ -7,22 +7,32 @@ namespace Spiral\Core;
use IteratorAggregate;
use Psr\Container\ContainerInterface;
use Spiral\Core\Internal\Binder;
use Spiral\Core\Internal\Container;
use Spiral\Core\Internal\Factory;
use Spiral\Core\Internal\Invoker;
use Spiral\Core\Internal\Resolver;
use Spiral\Core\Internal\Scope;
use Spiral\Core\Internal\State;
use Spiral\Core\Internal\Container;
use Spiral\Core\Internal\Tracer;
use Traversable;
/**
* Container configuration that will be used not only in the root container but also in all child containers.
* The {@see self::$scopedBindings} property is internal and common for all containers.
* By the reason you can access to bindings for any scope from any container.
*
* @implements IteratorAggregate<
* non-empty-string,
* class-string<State>|class-string<ResolverInterface>|class-string<FactoryInterface>|class-string<ContainerInterface>|class-string<BinderInterface>|class-string<InvokerInterface>|class-string<Tracer>
* class-string<State>|class-string<ResolverInterface>|class-string<FactoryInterface>|class-string<ContainerInterface>|class-string<BinderInterface>|class-string<InvokerInterface>|class-string<Tracer>|class-string<Scope>
* >
*/
class Config implements IteratorAggregate
{
/** @var class-string<Scope> */
public readonly string $scope;
public readonly Internal\Config\StateStorage $scopedBindings;
private bool $rootLocked = true;
/**
* @param class-string<State> $state
* @param class-string<ResolverInterface> $resolver
@ -41,6 +51,8 @@ class Config implements IteratorAggregate
public readonly string $invoker = Invoker::class,
public readonly string $tracer = Tracer::class,
) {
$this->scope = Scope::class;
$this->scopedBindings = new Internal\Config\StateStorage();
}
public function getIterator(): Traversable
@ -52,5 +64,20 @@ class Config implements IteratorAggregate
yield 'binder' => $this->binder;
yield 'invoker' => $this->invoker;
yield 'tracer' => $this->tracer;
yield 'scope' => $this->scope;
}
/**
* Mutex lock for root container.
* First run of the method will return {@see true}, all subsequent calls will return {@see false}.
* The parent container must call the method once and before any child container.
*/
public function lockRoot(): bool
{
try {
return $this->rootLocked;
} finally {
$this->rootLocked = false;
}
}
}

View File

@ -10,6 +10,9 @@ use Spiral\Core\Exception\ConfiguratorException;
/**
* Provides array based configuration for specified config section. In addition configurator
* interface is responsible for contextual config injections.
*
* @template TClass of object
* @extends InjectorInterface<TClass>
*/
interface ConfigsInterface extends InjectorInterface
{

View File

@ -11,7 +11,10 @@ use Spiral\Core\Container\InjectableInterface;
use Spiral\Core\Container\SingletonInterface;
use Spiral\Core\Exception\Container\ContainerException;
use Spiral\Core\Exception\LogicException;
use Spiral\Core\Internal\DestructorTrait;
use Spiral\Core\Exception\Scope\FinalizersException;
use Spiral\Core\Exception\Scope\ScopeContainerLeakedException;
use Spiral\Core\Internal\Common\DestructorTrait;
use Spiral\Core\Internal\Config\StateBinder;
/**
* Auto-wiring container: declarative singletons, contextual injections, parent container
@ -24,8 +27,6 @@ use Spiral\Core\Internal\DestructorTrait;
*
* You can use injectors to delegate class resolution to external container.
*
* @see \Spiral\Core\Container::registerInstance() to add your own behaviours.
*
* @see InjectableInterface
* @see SingletonInterface
*
@ -43,29 +44,28 @@ final class Container implements
{
use DestructorTrait;
public const DEFAULT_ROOT_SCOPE_NAME = 'root';
private Internal\State $state;
private ResolverInterface|Internal\Resolver $resolver;
private FactoryInterface|Internal\Factory $factory;
private ContainerInterface|Internal\Container $container;
private BinderInterface|Internal\Binder $binder;
private InvokerInterface|Internal\Invoker $invoker;
private Internal\Scope $scope;
/**
* Container constructor.
*/
public function __construct(Config $config = new Config())
{
$constructor = new Internal\Registry($config, [
'state' => new Internal\State(),
]);
foreach ($config as $property => $class) {
if (\property_exists($this, $property)) {
$this->$property = $constructor->get($property, $class);
}
}
public function __construct(
private Config $config = new Config(),
?string $scopeName = self::DEFAULT_ROOT_SCOPE_NAME,
) {
$this->initServices($this, $scopeName);
// Bind himself
/** @psalm-suppress PossiblyNullPropertyAssignment */
$this->state->bindings = [
$this->state->bindings = \array_merge($this->state->bindings, [
self::class => \WeakReference::create($this),
ContainerInterface::class => self::class,
BinderInterface::class => self::class,
@ -73,12 +73,12 @@ final class Container implements
ScopeInterface::class => self::class,
ResolverInterface::class => self::class,
InvokerInterface::class => self::class,
];
]);
}
public function __destruct()
{
$this->destruct();
$this->closeScope();
}
/**
@ -123,13 +123,12 @@ final class Container implements
* @param class-string<T>|string|Autowire $id
* @param string|null $context Call context.
*
* @return T
* @psalm-return ($id is class-string ? T : mixed)
* @return ($id is class-string ? T : mixed)
*
* @throws ContainerException
* @throws \Throwable
*
* @psalm-suppress PossiblyInvalidArgument, PossiblyInvalidCast
* @psalm-suppress InvalidArgument, InvalidCast
*/
public function get(string|Autowire $id, string $context = null): mixed
{
@ -141,6 +140,20 @@ final class Container implements
return $this->container->has($id);
}
/**
* Make a Binder proxy to configure default bindings for a specific scope.
* Default bindings won't affect already created Container instances except the case with the root one.
*
* @internal We are testing this feature, it may be changed in the future.
*/
public function getBinder(string $scope): BinderInterface
{
return new StateBinder($this->config->scopedBindings->getState($scope));
}
/**
* @deprecated use {@see scope()} instead.
*/
public function runScope(array $bindings, callable $scope): mixed
{
$binds = &$this->state->bindings;
@ -170,6 +183,56 @@ final class Container implements
}
}
/**
* @template TReturn
*
* @param callable(mixed ...$params): TReturn $closure
* @param array<non-empty-string, TResolver> $bindings Custom bindings for the new scope.
* @param null|string $name Scope name. Named scopes can have individual bindings and constrains.
* @param bool $autowire If {@see false}, closure will be invoked with just only the passed Container as an
* argument. Otherwise, {@see InvokerInterface::invoke()} will be used to invoke the closure.
*
* @return TReturn
* @throws \Throwable
*
* @internal We are testing this feature, it may be changed in the future.
*/
public function scope(callable $closure, array $bindings = [], ?string $name = null, bool $autowire = true): mixed
{
// Open scope
$container = new self($this->config, $name);
try {
// Configure scope
$container->scope->setParent($this, $this->scope);
// Add specific bindings
foreach ($bindings as $alias => $resolver) {
$container->binder->bind($alias, $resolver);
}
return ContainerScope::runScope(
$container,
static function (self $container) use ($autowire, $closure): mixed {
try {
return $autowire
? $container->invoke($closure)
: $closure($container);
} finally {
$container->closeScope();
}
}
);
} finally {
// Check the container has not been leaked
$link = \WeakReference::create($container);
unset($container);
if ($link->get() !== null) {
throw new ScopeContainerLeakedException($name, $this->scope->getParentScopeNames());
}
}
}
/**
* Bind value resolver to container alias. Resolver can be class name (will be constructed
* for each method call), function array or Closure (executed every call). Only object resolvers
@ -214,6 +277,9 @@ final class Container implements
/**
* Bind class or class interface to the injector source (InjectorInterface).
*
* Todo: remove suppression after {@link https://github.com/vimeo/psalm/issues/8298} fixing.
* @psalm-suppress InvalidArgument,InvalidCast
*/
public function bindInjector(string $class, string $injector): void
{
@ -229,4 +295,68 @@ final class Container implements
{
return $this->binder->hasInjector($class);
}
/**
* Init internal container services.
*/
private function initServices(
self $container,
?string $scopeName,
): void {
$isRoot = $container->config->lockRoot();
// Get named scope or create anonymous one
$state = match (true) {
$scopeName === null => new Internal\State(),
// Only root container can make default bindings directly
$isRoot => $container->config->scopedBindings->getState($scopeName),
default => clone $container->config->scopedBindings->getState($scopeName),
};
$constructor = new Internal\Common\Registry($container->config, [
'state' => $state,
'scope' => new Internal\Scope($scopeName),
]);
// Create container services
foreach ($container->config as $property => $class) {
if (\property_exists($container, $property)) {
$container->$property = $constructor->get($property, $class);
}
}
}
/**
* Execute finalizers and destruct the container.
*
* @throws FinalizersException
*/
private function closeScope(): void
{
/** @psalm-suppress RedundantPropertyInitializationCheck */
if (!isset($this->scope)) {
$this->destruct();
return;
}
$scopeName = $this->scope->getScopeName();
// Run finalizers
$errors = [];
foreach ($this->state->finalizers as $finalizer) {
try {
$this->invoker->invoke($finalizer);
} catch (\Throwable $e) {
$errors[] = $e;
}
}
// Destroy the container
$this->destruct();
// Throw collected errors
if ($errors !== []) {
throw new FinalizersException($scopeName, $errors);
}
}
}

View File

@ -8,7 +8,7 @@ namespace Spiral\Core\Container;
* Must define constant INJECTOR pointing to associated injector class or binding.
*
* Attention, this abstraction is currently under re-thinking process in order to replace it with
* binded context-specific factory (non breaking change).
* bound context-specific factory (non breaking change).
*/
interface InjectableInterface
{

View File

@ -4,6 +4,7 @@ declare(strict_types=1);
namespace Spiral\Core;
use Fiber;
use Psr\Container\ContainerInterface;
use Throwable;
@ -34,7 +35,20 @@ final class ContainerScope
[$previous, self::$container] = [self::$container, $container];
try {
if (Fiber::getCurrent() === null) {
return $scope(self::$container);
}
// Wrap scope into fiber
$fiber = new Fiber(static fn () => $scope(self::$container));
$value = $fiber->start();
while (!$fiber->isTerminated()) {
self::$container = $previous;
$resume = Fiber::suspend($value);
self::$container = $container;
$value = $fiber->resume($resume);
}
return $fiber->getReturn();
} finally {
self::$container = $previous;
}

View File

@ -0,0 +1,21 @@
<?php
declare(strict_types=1);
namespace Spiral\Core\Exception\Scope;
/**
* @method string getScope()
*/
final class BadScopeException extends ScopeException
{
public function __construct(
string $scope,
protected string $className,
) {
parent::__construct(
$scope,
\sprintf('Class `%s` can be resolved only in `%s` scope.', $className, $scope),
);
}
}

View File

@ -0,0 +1,45 @@
<?php
declare(strict_types=1);
namespace Spiral\Core\Exception\Scope;
use Exception;
use Throwable;
final class FinalizersException extends ScopeException
{
/**
* @param Throwable[] $exceptions
*/
public function __construct(
?string $scope,
protected array $exceptions,
) {
$count = \count($exceptions);
parent::__construct(
$scope,
\sprintf(
"%s thrown during finalization of %s:\n%s",
$count === 1 ? 'An exception has been' : "$count exceptions have been",
$scope === null ? 'an unnamed scope' : "the scope `$scope`",
\implode("\n\n", \array_map(
static fn (Exception $e): string => \sprintf(
"# %s\n%s",
$e::class,
$e->getMessage(),
),
$exceptions,
)),
),
);
}
/**
* @return Throwable[]
*/
public function getExceptions(): array
{
return $this->exceptions;
}
}

View File

@ -0,0 +1,20 @@
<?php
declare(strict_types=1);
namespace Spiral\Core\Exception\Scope;
/**
* @method string getScope()
*/
final class NamedScopeDuplicationException extends ScopeException
{
public function __construct(
string $scope,
) {
parent::__construct(
$scope,
"Error on a scope allocation with the name `{$scope}`. A scope with the same name already exists.",
);
}
}

View File

@ -0,0 +1,25 @@
<?php
declare(strict_types=1);
namespace Spiral\Core\Exception\Scope;
final class ScopeContainerLeakedException extends ScopeException
{
/**
* @param array<int<0, max>, string|null> $parents
*/
public function __construct(
?string $scope,
array $parents,
) {
$scopes = \implode('->', \array_map(
static fn (?string $scope): string => $scope === null ? 'null' : "\"$scope\"",
[...\array_reverse($parents), $scope],
));
parent::__construct(
$scope,
\sprintf('Scoped container has been leaked. Scope: %s.', $scopes),
);
}
}

View File

@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
namespace Spiral\Core\Exception\Scope;
use Spiral\Core\Exception\Container\ContainerException;
/**
* @internal
*/
abstract class ScopeException extends ContainerException
{
public function __construct(
protected ?string $scope,
string $message = '',
int $code = 0,
?\Throwable $previous = null,
) {
parent::__construct(
$message,
$code,
$previous,
);
}
public function getScope(): ?string
{
return $this->scope;
}
}

View File

@ -9,11 +9,14 @@ use Spiral\Core\Exception\ConfigException;
/**
* Generic implementation of array based configuration.
*
* @implements \IteratorAggregate<array-key, mixed>
* @implements \ArrayAccess<array-key, mixed>
*/
abstract class InjectableConfig implements InjectableInterface, \IteratorAggregate, \ArrayAccess
{
/**
* @var class-string<\Spiral\Core\ConfigsInterface>
* @var class-string<ConfigsInterface>
*/
public const INJECTOR = ConfigsInterface::class;

View File

@ -5,152 +5,37 @@ declare(strict_types=1);
namespace Spiral\Core\Internal;
use Psr\Container\ContainerInterface;
use Spiral\Core\BinderInterface;
use Spiral\Core\Container\Autowire;
use Spiral\Core\Container\InjectableInterface;
use Spiral\Core\Container\InjectorInterface;
use Spiral\Core\Exception\Container\ContainerException;
use Spiral\Core\Internal\Common\DestructorTrait;
use Spiral\Core\Internal\Common\Registry;
use Spiral\Core\Internal\Config\StateBinder;
/**
* @psalm-type TResolver = class-string|non-empty-string|callable|array{class-string, non-empty-string}
*
* @internal
*/
final class Binder implements BinderInterface
final class Binder extends StateBinder
{
use DestructorTrait;
private State $state;
private ContainerInterface $container;
public function __construct(Registry $constructor)
{
$constructor->set('binder', $this);
$this->state = $constructor->get('state', State::class);
$this->container = $constructor->get('container', ContainerInterface::class);
parent::__construct($constructor->get('state', State::class));
}
/**
* Bind value resolver to container alias. Resolver can be class name (will be constructed
* for each method call), function array or Closure (executed every call). Only object resolvers
* supported by this method.
*
* @psalm-param TResolver|object $resolver
*/
public function bind(string $alias, string|array|callable|object $resolver): void
{
if (\is_array($resolver) || $resolver instanceof \Closure || $resolver instanceof Autowire) {
// array means = execute me, false = not singleton
$this->state->bindings[$alias] = [$resolver, false];
return;
}
$this->state->bindings[$alias] = $resolver;
}
/**
* Bind value resolver to container alias to be executed as cached. Resolver can be class name
* (will be constructed only once), function array or Closure (executed only once call).
*
* @psalm-param TResolver|object $resolver
*/
public function bindSingleton(string $alias, string|array|callable|object $resolver): void
{
if (\is_object($resolver) && !$resolver instanceof \Closure && !$resolver instanceof Autowire) {
// direct binding to an instance
$this->state->bindings[$alias] = $resolver;
return;
}
$this->state->bindings[$alias] = [$resolver, true];
}
/**
* Check if alias points to constructed instance (singleton).
*/
public function hasInstance(string $alias): bool
{
if (!$this->container->has($alias)) {
return false;
}
$bindings = &$this->state->bindings;
while (isset($bindings[$alias]) && \is_string($bindings[$alias])) {
//Checking alias tree
$alias = $bindings[$alias];
return parent::hasInstance($alias);
}
return isset($bindings[$alias]) && \is_object($bindings[$alias]);
}
public function removeBinding(string $alias): void
public function destruct(): void
{
unset($this->state->bindings[$alias]);
}
/**
* Bind class or class interface to the injector source (InjectorInterface).
*
* @template TClass
*
* @param class-string<TClass> $class
* @param class-string<InjectorInterface<TClass>> $injector
*/
public function bindInjector(string $class, string $injector): void
{
$this->state->injectors[$class] = $injector;
}
public function removeInjector(string $class): void
{
unset($this->state->injectors[$class]);
}
public function hasInjector(string $class): bool
{
try {
$reflection = new \ReflectionClass($class);
} catch (\ReflectionException $e) {
throw new ContainerException($e->getMessage(), $e->getCode(), $e);
}
if (\array_key_exists($class, $this->state->injectors)) {
return $this->state->injectors[$class] !== null;
}
if (
$reflection->implementsInterface(InjectableInterface::class)
&& $reflection->hasConstant('INJECTOR')
) {
$this->state->injectors[$class] = $reflection->getConstant('INJECTOR');
return true;
}
// check interfaces
foreach ($this->state->injectors as $target => $injector) {
if (
\class_exists($target, true)
&& $reflection->isSubclassOf($target)
) {
$this->state->injectors[$class] = $injector;
return true;
}
if (
\interface_exists($target, true)
&& $reflection->implementsInterface($target)
) {
$this->state->injectors[$class] = $injector;
return true;
}
}
return false;
unset($this->container);
}
}

View File

@ -2,7 +2,7 @@
declare(strict_types=1);
namespace Spiral\Core\Internal;
namespace Spiral\Core\Internal\Common;
/**
* @internal

Some files were not shown because too many files have changed in this diff Show More