Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/develop' into 4.6
Browse files Browse the repository at this point in the history
  • Loading branch information
kenjis committed Sep 13, 2024
2 parents c05260c + d49d700 commit 904e4f2
Show file tree
Hide file tree
Showing 24 changed files with 54 additions and 36 deletions.
2 changes: 2 additions & 0 deletions rector.php
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
use Rector\TypeDeclaration\Rector\ClassMethod\AddMethodCallBasedStrictParamTypeRector;
use Rector\TypeDeclaration\Rector\ClassMethod\ReturnNeverTypeRector;
use Rector\TypeDeclaration\Rector\Closure\AddClosureVoidReturnTypeWhereNoReturnRector;
use Rector\TypeDeclaration\Rector\Closure\ClosureReturnTypeRector;
use Rector\TypeDeclaration\Rector\Empty_\EmptyOnNullableObjectToInstanceOfRector;
use Rector\TypeDeclaration\Rector\Function_\AddFunctionVoidReturnTypeWhereNoReturnRector;
use Rector\TypeDeclaration\Rector\Property\TypedPropertyFromAssignsRector;
Expand Down Expand Up @@ -217,6 +218,7 @@
AddFunctionVoidReturnTypeWhereNoReturnRector::class,
AddMethodCallBasedStrictParamTypeRector::class,
TypedPropertyFromAssignsRector::class,
ClosureReturnTypeRector::class,
])
->withConfiguredRule(StringClassNameToClassConstantRector::class, [
// keep '\\' prefix string on string '\Foo\Bar'
Expand Down
6 changes: 3 additions & 3 deletions system/Database/OCI8/Builder.php
Original file line number Diff line number Diff line change
Expand Up @@ -109,12 +109,12 @@ protected function _replace(string $table, array $keys, array $values): string
{
$fieldNames = array_map(static fn ($columnName) => trim($columnName, '"'), $keys);

$uniqueIndexes = array_filter($this->db->getIndexData($table), static function ($index) use ($fieldNames) {
$uniqueIndexes = array_filter($this->db->getIndexData($table), static function ($index) use ($fieldNames): bool {
$hasAllFields = count(array_intersect($index->fields, $fieldNames)) === count($index->fields);

return ($index->type === 'PRIMARY') && $hasAllFields;
});
$replaceableFields = array_filter($keys, static function ($columnName) use ($uniqueIndexes) {
$replaceableFields = array_filter($keys, static function ($columnName) use ($uniqueIndexes): bool {
foreach ($uniqueIndexes as $index) {
if (in_array(trim($columnName, '"'), $index->fields, true)) {
return false;
Expand Down Expand Up @@ -344,7 +344,7 @@ protected function _upsertBatch(string $table, array $keys, array $values): stri
if (empty($constraints)) {
$fieldNames = array_map(static fn ($columnName) => trim($columnName, '"'), $keys);

$uniqueIndexes = array_filter($this->db->getIndexData($table), static function ($index) use ($fieldNames) {
$uniqueIndexes = array_filter($this->db->getIndexData($table), static function ($index) use ($fieldNames): bool {
$hasAllFields = count(array_intersect($index->fields, $fieldNames)) === count($index->fields);

return ($index->type === 'PRIMARY' || $index->type === 'UNIQUE') && $hasAllFields;
Expand Down
2 changes: 1 addition & 1 deletion system/Database/OCI8/PreparedQuery.php
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ public function parameterize(string $sql): string
// Track our current value
$count = 0;

return preg_replace_callback('/\?/', static function ($matches) use (&$count) {
return preg_replace_callback('/\?/', static function ($matches) use (&$count): string {
return ':' . ($count++);
}, $sql);
}
Expand Down
6 changes: 3 additions & 3 deletions system/Database/Postgre/Builder.php
Original file line number Diff line number Diff line change
Expand Up @@ -368,7 +368,7 @@ protected function _updateBatch(string $table, array $keys, array $values): stri
$sql .= 'WHERE ' . implode(
' AND ',
array_map(
static function ($key, $value) use ($table, $alias, $that) {
static function ($key, $value) use ($table, $alias, $that): string|RawSql {
if ($value instanceof RawSql && is_string($key)) {
return $table . '.' . $key . ' = ' . $value;
}
Expand Down Expand Up @@ -463,7 +463,7 @@ protected function _upsertBatch(string $table, array $keys, array $values): stri
$constraints = $this->QBOptions['constraints'] ?? [];

if (empty($constraints)) {
$allIndexes = array_filter($this->db->getIndexData($table), static function ($index) use ($fieldNames) {
$allIndexes = array_filter($this->db->getIndexData($table), static function ($index) use ($fieldNames): bool {
$hasAllFields = count(array_intersect($index->fields, $fieldNames)) === count($index->fields);

return ($index->type === 'UNIQUE' || $index->type === 'PRIMARY') && $hasAllFields;
Expand Down Expand Up @@ -575,7 +575,7 @@ protected function _deleteBatch(string $table, array $keys, array $values): stri
$sql .= 'WHERE ' . implode(
' AND ',
array_map(
static function ($key, $value) use ($table, $alias, $that) {
static function ($key, $value) use ($table, $alias, $that): RawSql|string {
if ($value instanceof RawSql) {
return $value;
}
Expand Down
2 changes: 1 addition & 1 deletion system/Database/Postgre/PreparedQuery.php
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ public function parameterize(string $sql): string
// Track our current value
$count = 0;

return preg_replace_callback('/\?/', static function () use (&$count) {
return preg_replace_callback('/\?/', static function () use (&$count): string {
$count++;

return "\${$count}";
Expand Down
4 changes: 2 additions & 2 deletions system/Database/SQLSRV/Builder.php
Original file line number Diff line number Diff line change
Expand Up @@ -699,15 +699,15 @@ protected function _upsertBatch(string $table, array $keys, array $values): stri
if (empty($constraints)) {
$tableIndexes = $this->db->getIndexData($table);

$uniqueIndexes = array_filter($tableIndexes, static function ($index) use ($fieldNames) {
$uniqueIndexes = array_filter($tableIndexes, static function ($index) use ($fieldNames): bool {
$hasAllFields = count(array_intersect($index->fields, $fieldNames)) === count($index->fields);

return $index->type === 'PRIMARY' && $hasAllFields;
});

// if no primary found then look for unique - since indexes have no order
if ($uniqueIndexes === []) {
$uniqueIndexes = array_filter($tableIndexes, static function ($index) use ($fieldNames) {
$uniqueIndexes = array_filter($tableIndexes, static function ($index) use ($fieldNames): bool {
$hasAllFields = count(array_intersect($index->fields, $fieldNames)) === count($index->fields);

return $index->type === 'UNIQUE' && $hasAllFields;
Expand Down
2 changes: 1 addition & 1 deletion system/Database/SQLite3/Builder.php
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ protected function _upsertBatch(string $table, array $keys, array $values): stri
if (empty($constraints)) {
$fieldNames = array_map(static fn ($columnName) => trim($columnName, '`'), $keys);

$allIndexes = array_filter($this->db->getIndexData($table), static function ($index) use ($fieldNames) {
$allIndexes = array_filter($this->db->getIndexData($table), static function ($index) use ($fieldNames): bool {
$hasAllFields = count(array_intersect($index->fields, $fieldNames)) === count($index->fields);

return ($index->type === 'PRIMARY' || $index->type === 'UNIQUE') && $hasAllFields;
Expand Down
2 changes: 1 addition & 1 deletion system/Debug/Toolbar/Collectors/Database.php
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ protected function formatTimelineData(): array
public function display(): array
{
$data = [];
$data['queries'] = array_map(static function (array $query) {
$data['queries'] = array_map(static function (array $query): array {
$isDuplicate = $query['duplicate'] === true;

$firstNonSystemLine = '';
Expand Down
2 changes: 1 addition & 1 deletion system/Events/Events.php
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ public static function initialize()
$files = service('locator')->search('Config/Events.php');
}

$files = array_filter(array_map(static function (string $file) {
$files = array_filter(array_map(static function (string $file): false|string {
if (is_file($file)) {
return realpath($file) ?: $file;
}
Expand Down
2 changes: 1 addition & 1 deletion system/HTTP/ContentSecurityPolicy.php
Original file line number Diff line number Diff line change
Expand Up @@ -713,7 +713,7 @@ protected function generateNonces(ResponseInterface $response)
$pattern = '/(' . preg_quote($this->styleNonceTag, '/')
. '|' . preg_quote($this->scriptNonceTag, '/') . ')/';

$body = preg_replace_callback($pattern, function ($match) {
$body = preg_replace_callback($pattern, function ($match): string {
$nonce = $match[0] === $this->styleNonceTag ? $this->getStyleNonce() : $this->getScriptNonce();

return "nonce=\"{$nonce}\"";
Expand Down
2 changes: 1 addition & 1 deletion system/HTTP/Negotiate.php
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,7 @@ public function parseHeader(string $header): array
}

// Sort to get the highest results first
usort($results, static function ($a, $b) {
usort($results, static function ($a, $b): int {
if ($a['q'] === $b['q']) {
$aAst = substr_count($a['value'], '*');
$bAst = substr_count($b['value'], '*');
Expand Down
2 changes: 1 addition & 1 deletion system/Helpers/Array/ArrayHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -307,7 +307,7 @@ public static function recursiveCount(array $array, int $counter = 0): int
*/
public static function sortValuesByNatural(array &$array, $sortByIndex = null): bool
{
return usort($array, static function ($currentValue, $nextValue) use ($sortByIndex) {
return usort($array, static function ($currentValue, $nextValue) use ($sortByIndex): int {
if ($sortByIndex !== null) {
return strnatcmp((string) $currentValue[$sortByIndex], (string) $nextValue[$sortByIndex]);
}
Expand Down
20 changes: 18 additions & 2 deletions system/Helpers/url_helper.php
Original file line number Diff line number Diff line change
Expand Up @@ -351,7 +351,15 @@ function safe_mailto(string $email, string $title = '', $attributes = ''): strin
function auto_link(string $str, string $type = 'both', bool $popup = false): string
{
// Find and replace any URLs.
if ($type !== 'email' && preg_match_all('#(\w*://|www\.)[a-z0-9]+(-+[a-z0-9]+)*(\.[a-z0-9]+(-+[a-z0-9]+)*)+(/([^\s()<>;]+\w)?/?)?#i', $str, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) {
if (
$type !== 'email'
&& preg_match_all(
'#([a-z][a-z0-9+\-.]*://|www\.)[a-z0-9]+(-+[a-z0-9]+)*(\.[a-z0-9]+(-+[a-z0-9]+)*)+(/([^\s()<>;]+\w)?/?)?#i',
$str,
$matches,
PREG_OFFSET_CAPTURE | PREG_SET_ORDER
)
) {
// Set our target HTML if using popup links.
$target = ($popup) ? ' target="_blank"' : '';

Expand All @@ -370,7 +378,15 @@ function auto_link(string $str, string $type = 'both', bool $popup = false): str
}

// Find and replace any emails.
if ($type !== 'url' && preg_match_all('#([\w\.\-\+]+@[a-z0-9\-]+\.[a-z0-9\-\.]+[^[:punct:]\s])#i', $str, $matches, PREG_OFFSET_CAPTURE)) {
if (
$type !== 'url'
&& preg_match_all(
'#([\w\.\-\+]+@[a-z0-9\-]+\.[a-z0-9\-\.]+[^[:punct:]\s])#i',
$str,
$matches,
PREG_OFFSET_CAPTURE
)
) {
foreach (array_reverse($matches[0]) as $match) {
if (filter_var($match[0], FILTER_VALIDATE_EMAIL) !== false) {
$str = substr_replace($str, safe_mailto($match[0]), $match[1], strlen($match[0]));
Expand Down
2 changes: 1 addition & 1 deletion system/Router/Router.php
Original file line number Diff line number Diff line change
Expand Up @@ -434,7 +434,7 @@ protected function checkRoutes(string $uri): bool
// Is this route supposed to redirect to another?
if ($this->collection->isRedirect($routeKey)) {
// replacing matched route groups with references: post/([0-9]+) -> post/$1
$redirectTo = preg_replace_callback('/(\([^\(]+\))/', static function () {
$redirectTo = preg_replace_callback('/(\([^\(]+\))/', static function (): string {
static $i = 1;
return '$' . $i++;
Expand Down
2 changes: 1 addition & 1 deletion system/View/Parser.php
Original file line number Diff line number Diff line change
Expand Up @@ -534,7 +534,7 @@ protected function replaceSingle($pattern, $content, $template, bool $escape = f
$content = (string) $content;

// Replace the content in the template
return preg_replace_callback($pattern, function ($matches) use ($content, $escape) {
return preg_replace_callback($pattern, function ($matches) use ($content, $escape): string {
// Check for {! !} syntax to not escape this one.
if (
str_starts_with($matches[0], $this->leftDelimiter . '!')
Expand Down
2 changes: 1 addition & 1 deletion tests/system/Commands/Utilities/NamespacesTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ protected function tearDown(): void
*/
protected function getBuffer()
{
return preg_replace_callback('/(\|\s*[^|]+\s*\|\s*)(.*?)(\s*\|\s*[^|]+\s*\|)/', static function (array $matches) {
return preg_replace_callback('/(\|\s*[^|]+\s*\|\s*)(.*?)(\s*\|\s*[^|]+\s*\|)/', static function (array $matches): string {
$matches[2] = str_replace(DIRECTORY_SEPARATOR, '/', $matches[2]);

return $matches[1] . $matches[2] . $matches[3];
Expand Down
4 changes: 2 additions & 2 deletions tests/system/DataConverter/DataConverterTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -606,7 +606,7 @@ public function testReconstructObjectWithClosure(): void
'created_at' => 'datetime',
'updated_at' => 'datetime',
];
$reconstructor = static function ($array) {
$reconstructor = static function ($array): User {
$user = new User();
$user->fill($array);

Expand Down Expand Up @@ -703,7 +703,7 @@ public function testExtractWithClosure(): void
'created_at' => 'datetime',
'updated_at' => 'datetime',
];
$extractor = static function ($obj) {
$extractor = static function ($obj): array {
$array['id'] = $obj->id;
$array['name'] = $obj->name;
$array['created_at'] = $obj->created_at;
Expand Down
2 changes: 1 addition & 1 deletion tests/system/Debug/TimerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ public function testRecordFunctionNoReturn(): void
public function testRecordFunctionWithReturn(): void
{
$timer = new Timer();
$returnValue = $timer->record('longjohn', static function () {
$returnValue = $timer->record('longjohn', static function (): string {
usleep(100000);

return 'test';
Expand Down
6 changes: 3 additions & 3 deletions tests/system/Events/EventsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ public function testCancelEvent(): void

// This should cancel the flow of events, and leave
// $result = 1.
Events::on('foo', static function ($arg) use (&$result) {
Events::on('foo', static function ($arg) use (&$result): bool {
$result = 1;

return false;
Expand All @@ -138,14 +138,14 @@ public function testPriority(): void
{
$result = 0;

Events::on('foo', static function () use (&$result) {
Events::on('foo', static function () use (&$result): bool {
$result = 1;

return false;
}, EVENT_PRIORITY_NORMAL);
// Since this has a higher priority, it will
// run first.
Events::on('foo', static function () use (&$result) {
Events::on('foo', static function () use (&$result): bool {
$result = 2;

return false;
Expand Down
6 changes: 3 additions & 3 deletions tests/system/Helpers/URLHelper/MiscUrlTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -523,7 +523,7 @@ public static function provideAutoLinkUrl(): iterable
],
'test06' => [
'This one: ://codeigniter.com must not break this one: http://codeigniter.com',
'This one: <a href="://codeigniter.com">://codeigniter.com</a> must not break this one: <a href="http://codeigniter.com">http://codeigniter.com</a>',
'This one: ://codeigniter.com must not break this one: <a href="http://codeigniter.com">http://codeigniter.com</a>',
],
'test07' => [
'Visit example.com or email [email protected]',
Expand Down Expand Up @@ -623,7 +623,7 @@ public static function provideAutolinkBoth(): iterable
],
'test06' => [
'This one: ://codeigniter.com must not break this one: http://codeigniter.com',
'This one: <a href="://codeigniter.com">://codeigniter.com</a> must not break this one: <a href="http://codeigniter.com">http://codeigniter.com</a>',
'This one: ://codeigniter.com must not break this one: <a href="http://codeigniter.com">http://codeigniter.com</a>',
],
'test07' => [
'Visit example.com or email [email protected]',
Expand Down Expand Up @@ -675,7 +675,7 @@ public static function provideAutoLinkPopup(): iterable
],
'test06' => [
'This one: ://codeigniter.com must not break this one: http://codeigniter.com',
'This one: <a href="://codeigniter.com" target="_blank">://codeigniter.com</a> must not break this one: <a href="http://codeigniter.com" target="_blank">http://codeigniter.com</a>',
'This one: ://codeigniter.com must not break this one: <a href="http://codeigniter.com" target="_blank">http://codeigniter.com</a>',
],
'test07' => [
'Visit example.com or email [email protected]',
Expand Down
2 changes: 1 addition & 1 deletion tests/system/Test/FeatureTestTraitTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ public function testCallValidationTwice(): void
[
'POST',
'section/create',
static function () {
static function (): string {
$validation = Services::validation();
$validation->setRule('title', 'title', 'required|min_length[3]');

Expand Down
2 changes: 1 addition & 1 deletion tests/system/Validation/ValidationTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -311,7 +311,7 @@ public function testClosureRuleWithParamError(): void
$this->validation->setRules([
'foo' => [
'required',
static function ($value, $data, &$error, $field) {
static function ($value, $data, &$error, $field): bool {
if ($value !== 'abc') {
$error = 'The ' . $field . ' value is not "abc"';

Expand Down
6 changes: 3 additions & 3 deletions tests/system/View/ParserTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -806,7 +806,7 @@ public function testParserPluginClosure(): void

public function testParserPluginParams(): void
{
$this->parser->addPlugin('growth', static function ($str, array $params) {
$this->parser->addPlugin('growth', static function ($str, array $params): string {
$step = $params['step'] ?? 1;
$count = $params['count'] ?? 2;

Expand Down Expand Up @@ -853,7 +853,7 @@ public function testParserSingleTagWithSingleParams(): void

public function testParserSingleTagWithQuotedParams(): void
{
$this->parser->addPlugin('count', static function (array $params = []) {
$this->parser->addPlugin('count', static function (array $params = []): string {
$out = '';

foreach ($params as $index => $param) {
Expand All @@ -870,7 +870,7 @@ public function testParserSingleTagWithQuotedParams(): void

public function testParserSingleTagWithNamedParams(): void
{
$this->parser->addPlugin('read_params', static function (array $params = []) {
$this->parser->addPlugin('read_params', static function (array $params = []): string {
$out = '';

foreach ($params as $index => $param) {
Expand Down
2 changes: 1 addition & 1 deletion user_guide_src/source/general/ajax.rst
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ React
htmx
====

You can use `ajax-header <https://htmx.org/extensions/ajax-header/>`_ extension.
You can use `ajax-header <https://github.com/bigskysoftware/htmx-extensions/blob/main/src/ajax-header/README.md>`_ extension.

.. code-block:: html

Expand Down

0 comments on commit 904e4f2

Please sign in to comment.