feat: set min PHP version to 8.5 + upgrade CI4 to 4.7

update all dependencies to latest
This commit is contained in:
Yassine Doghri 2026-02-19 16:23:20 +00:00
commit ed57e13b40
No known key found for this signature in database
GPG key ID: 1F41CB39A01C099A
109 changed files with 577 additions and 381 deletions

View file

@ -4,7 +4,7 @@
# ⚠️ NOT optimized for production
# should be used only for development purposes
#---------------------------------------------------
FROM php:8.4-fpm
FROM php:8.5-fpm
LABEL maintainer="Yassine Doghri <yassine@doghri.fr>"

View file

@ -1,4 +1,4 @@
image: code.castopod.org:5050/adaures/castopod:ci-php8.4
image: code.castopod.org:5050/adaures/castopod:ci-php8.5
stages:
- prepare

View file

@ -8,6 +8,19 @@ use CodeIgniter\Config\BaseConfig;
class CURLRequest extends BaseConfig
{
/**
* --------------------------------------------------------------------------
* CURLRequest Share Connection Options
* --------------------------------------------------------------------------
*
* Share connection options between requests.
*
* @var list<int>
*
* @see https://www.php.net/manual/en/curl.constants.php#constant.curl-lock-data-connect
*/
public array $shareConnectionOptions = [CURL_LOCK_DATA_CONNECT, CURL_LOCK_DATA_DNS];
/**
* --------------------------------------------------------------------------
* CURLRequest Share Options

View file

@ -5,6 +5,7 @@ declare(strict_types=1);
namespace Config;
use CodeIgniter\Cache\CacheInterface;
use CodeIgniter\Cache\Handlers\ApcuHandler;
use CodeIgniter\Cache\Handlers\DummyHandler;
use CodeIgniter\Cache\Handlers\FileHandler;
use CodeIgniter\Cache\Handlers\MemcachedHandler;
@ -113,14 +114,24 @@ class Cache extends BaseConfig
* Your Redis server can be specified below, if you are using
* the Redis or Predis drivers.
*
* @var array{host?: string, password?: string|null, port?: int, timeout?: int, database?: int}
* @var array{
* host?: string,
* password?: string|null,
* port?: int,
* timeout?: int,
* async?: bool,
* persistent?: bool,
* database?: int
* }
*/
public array $redis = [
'host' => '127.0.0.1',
'password' => null,
'port' => 6379,
'timeout' => 0,
'database' => 0,
'host' => '127.0.0.1',
'password' => null,
'port' => 6379,
'timeout' => 0,
'async' => false, // specific to Predis and ignored by the native Redis extension
'persistent' => false,
'database' => 0,
];
/**
@ -134,6 +145,7 @@ class Cache extends BaseConfig
* @var array<string, class-string<CacheInterface>>
*/
public array $validHandlers = [
'apcu' => ApcuHandler::class,
'dummy' => DummyHandler::class,
'file' => FileHandler::class,
'memcached' => MemcachedHandler::class,
@ -160,4 +172,28 @@ class Cache extends BaseConfig
* @var bool|list<string>
*/
public $cacheQueryString = false;
/**
* --------------------------------------------------------------------------
* Web Page Caching: Cache Status Codes
* --------------------------------------------------------------------------
*
* HTTP status codes that are allowed to be cached. Only responses with
* these status codes will be cached by the PageCache filter.
*
* Default: [] - Cache all status codes (backward compatible)
*
* Recommended: [200] - Only cache successful responses
*
* You can also use status codes like:
* [200, 404, 410] - Cache successful responses and specific error codes
* [200, 201, 202, 203, 204] - All 2xx successful responses
*
* WARNING: Using [] may cache temporary error pages (404, 500, etc).
* Consider restricting to [200] for production applications to avoid
* caching errors that should be temporary.
*
* @var list<int>
*/
public array $cacheStatusCodes = [];
}

View file

@ -26,14 +26,24 @@ class ContentSecurityPolicy extends BaseConfig
*/
public ?string $reportURI = null;
/**
* Specifies a reporting endpoint to which violation reports ought to be sent.
*/
public ?string $reportTo = null;
/**
* Instructs user agents to rewrite URL schemes, changing HTTP to HTTPS. This directive is for websites with large
* numbers of old URLs that need to be rewritten.
*/
public bool $upgradeInsecureRequests = false;
// -------------------------------------------------------------------------
// CSP DIRECTIVES SETTINGS
// NOTE: once you set a policy to 'none', it cannot be further restricted
// -------------------------------------------------------------------------
/**
* Will default to self if not overridden
* Will default to `'self'` if not overridden
*
* @var list<string>|string|null
*/
@ -46,6 +56,21 @@ class ContentSecurityPolicy extends BaseConfig
*/
public string | array $scriptSrc = 'self';
/**
* Specifies valid sources for JavaScript <script> elements.
*
* @var list<string>|string
*/
public array|string $scriptSrcElem = 'self';
/**
* Specifies valid sources for JavaScript inline event
* handlers and JavaScript URLs.
*
* @var list<string>|string
*/
public array|string $scriptSrcAttr = 'self';
/**
* Lists allowed stylesheets' URLs.
*
@ -53,6 +78,21 @@ class ContentSecurityPolicy extends BaseConfig
*/
public string | array $styleSrc = 'self';
/**
* Specifies valid sources for stylesheets <link> elements.
*
* @var list<string>|string
*/
public array|string $styleSrcElem = 'self';
/**
* Specifies valid sources for stylesheets inline
* style attributes and `<style>` elements.
*
* @var list<string>|string
*/
public array|string $styleSrcAttr = 'self';
/**
* Defines the origins from which images can be loaded.
*
@ -132,6 +172,11 @@ class ContentSecurityPolicy extends BaseConfig
*/
public string | array | null $manifestSrc = null;
/**
* @var list<string>|string
*/
public array|string $workerSrc = [];
/**
* Limits the kinds of plugins a page may invoke.
*
@ -147,17 +192,17 @@ class ContentSecurityPolicy extends BaseConfig
public string | array | null $sandbox = null;
/**
* Nonce tag for style
* Nonce placeholder for style tags.
*/
public string $styleNonceTag = '{csp-style-nonce}';
/**
* Nonce tag for script
* Nonce placeholder for script tags.
*/
public string $scriptNonceTag = '{csp-script-nonce}';
/**
* Replace nonce tag automatically
* Replace nonce tag automatically?
*/
public bool $autoNonce = true;
}

View file

@ -34,6 +34,11 @@ class Email extends BaseConfig
*/
public string $SMTPHost = '';
/**
* Which SMTP authentication method to use: login, plain
*/
public string $SMTPAuthMethod = 'login';
/**
* SMTP Username
*/

View file

@ -25,6 +25,23 @@ class Encryption extends BaseConfig
*/
public string $key = '';
/**
* --------------------------------------------------------------------------
* Previous Encryption Keys
* --------------------------------------------------------------------------
*
* When rotating encryption keys, add old keys here to maintain ability
* to decrypt data encrypted with previous keys. Encryption always uses
* the current $key. Decryption tries current key first, then falls back
* to previous keys if decryption fails.
*
* In .env file, use comma-separated string:
* encryption.previousKeys = hex2bin:9be8c64fcea509867...,hex2bin:3f5a1d8e9c2b7a4f6...
*
* @var list<string>|string
*/
public array|string $previousKeys = '';
/**
* --------------------------------------------------------------------------
* Encryption Driver to Use

View file

@ -63,4 +63,13 @@ class Format extends BaseConfig
'application/xml' => 0,
'text/xml' => 0,
];
/**
* --------------------------------------------------------------------------
* Maximum depth for JSON encoding.
* --------------------------------------------------------------------------
*
* This value determines how deep the JSON encoder will traverse nested structures.
*/
public int $jsonEncodeDepth = 512;
}

42
app/Config/Hostnames.php Normal file
View file

@ -0,0 +1,42 @@
<?php
declare(strict_types=1);
namespace Config;
class Hostnames
{
// List of known two-part TLDs for subdomain extraction
public const TWO_PART_TLDS = [
'co.uk', 'org.uk', 'gov.uk', 'ac.uk', 'sch.uk', 'ltd.uk', 'plc.uk',
'com.au', 'net.au', 'org.au', 'edu.au', 'gov.au', 'asn.au', 'id.au',
'co.jp', 'ac.jp', 'go.jp', 'or.jp', 'ne.jp', 'gr.jp',
'co.nz', 'org.nz', 'govt.nz', 'ac.nz', 'net.nz', 'geek.nz', 'maori.nz', 'school.nz',
'co.in', 'net.in', 'org.in', 'ind.in', 'ac.in', 'gov.in', 'res.in',
'com.cn', 'net.cn', 'org.cn', 'gov.cn', 'edu.cn',
'com.sg', 'net.sg', 'org.sg', 'gov.sg', 'edu.sg', 'per.sg',
'co.za', 'org.za', 'gov.za', 'ac.za', 'net.za',
'co.kr', 'or.kr', 'go.kr', 'ac.kr', 'ne.kr', 'pe.kr',
'co.th', 'or.th', 'go.th', 'ac.th', 'net.th', 'in.th',
'com.my', 'net.my', 'org.my', 'edu.my', 'gov.my', 'mil.my', 'name.my',
'com.mx', 'org.mx', 'net.mx', 'edu.mx', 'gob.mx',
'com.br', 'net.br', 'org.br', 'gov.br', 'edu.br', 'art.br', 'eng.br',
'co.il', 'org.il', 'ac.il', 'gov.il', 'net.il', 'muni.il',
'co.id', 'or.id', 'ac.id', 'go.id', 'net.id', 'web.id', 'my.id',
'com.hk', 'edu.hk', 'gov.hk', 'idv.hk', 'net.hk', 'org.hk',
'com.tw', 'net.tw', 'org.tw', 'edu.tw', 'gov.tw', 'idv.tw',
'com.sa', 'net.sa', 'org.sa', 'gov.sa', 'edu.sa', 'sch.sa', 'med.sa',
'co.ae', 'net.ae', 'org.ae', 'gov.ae', 'ac.ae', 'sch.ae',
'com.tr', 'net.tr', 'org.tr', 'gov.tr', 'edu.tr', 'av.tr', 'gen.tr',
'co.ke', 'or.ke', 'go.ke', 'ac.ke', 'sc.ke', 'me.ke', 'mobi.ke', 'info.ke',
'com.ng', 'org.ng', 'gov.ng', 'edu.ng', 'net.ng', 'sch.ng', 'name.ng',
'com.pk', 'net.pk', 'org.pk', 'gov.pk', 'edu.pk', 'fam.pk',
'com.eg', 'edu.eg', 'gov.eg', 'org.eg', 'net.eg',
'com.cy', 'net.cy', 'org.cy', 'gov.cy', 'ac.cy',
'com.lk', 'org.lk', 'edu.lk', 'gov.lk', 'net.lk', 'int.lk',
'com.bd', 'net.bd', 'org.bd', 'ac.bd', 'gov.bd', 'mil.bd',
'com.ar', 'net.ar', 'org.ar', 'gov.ar', 'edu.ar', 'mil.ar',
'gob.cl', 'com.pl', 'net.pl', 'org.pl', 'gov.pl', 'edu.pl',
'co.ir', 'ac.ir', 'org.ir', 'id.ir', 'gov.ir', 'sch.ir', 'net.ir',
];
}

View file

@ -17,6 +17,8 @@ class Images extends BaseConfig
/**
* The path to the image library. Required for ImageMagick, GraphicsMagick, or NetPBM.
*
* @deprecated 4.7.0 No longer used.
*/
public string $libraryPath = '/usr/local/bin/convert';

View file

@ -46,4 +46,19 @@ class Migrations extends BaseConfig
* - Y_m_d_His_
*/
public string $timestampFormat = 'Y-m-d-His_';
/**
* --------------------------------------------------------------------------
* Enable/Disable Migration Lock
* --------------------------------------------------------------------------
*
* Locking is disabled by default.
*
* When enabled, it will prevent multiple migration processes
* from running at the same time by using a lock mechanism.
*
* This is useful in production environments to avoid conflicts
* or race conditions during concurrent deployments.
*/
public bool $lock = false;
}

View file

@ -9,6 +9,8 @@ namespace Config;
*
* NOTE: This class does not extend BaseConfig for performance reasons.
* So you cannot replace the property values with Environment Variables.
*
* WARNING: Do not use these options when running the app in the Worker Mode.
*/
class Optimize
{

View file

@ -98,6 +98,15 @@ class Routing extends BaseRouting
*/
public bool $autoRoute = false;
/**
* If TRUE, the system will look for attributes on controller
* class and methods that can run before and after the
* controller/method.
*
* If FALSE, will ignore any attributes.
*/
public bool $useControllerAttributes = true;
/**
* For Defined Routes.
* If TRUE, will enable the use of the 'prioritize' option

View file

@ -16,6 +16,7 @@ class Session extends BaseConfig
* --------------------------------------------------------------------------
*
* The session storage driver to use:
* - `CodeIgniter\Session\Handlers\ArrayHandler` (for testing)
* - `CodeIgniter\Session\Handlers\FileHandler`
* - `CodeIgniter\Session\Handlers\DatabaseHandler`
* - `CodeIgniter\Session\Handlers\MemcachedHandler`

View file

@ -117,4 +117,29 @@ class Toolbar extends BaseConfig
* @var list<string>
*/
public array $watchedExtensions = ['php', 'css', 'js', 'html', 'svg', 'json', 'env'];
/**
* --------------------------------------------------------------------------
* Ignored HTTP Headers
* --------------------------------------------------------------------------
*
* CodeIgniter Debug Toolbar normally injects HTML and JavaScript into every
* HTML response. This is correct for full page loads, but it breaks requests
* that expect only a clean HTML fragment.
*
* Libraries like HTMX, Unpoly, and Hotwire (Turbo) update parts of the page or
* manage navigation on the client side. Injecting the Debug Toolbar into their
* responses can cause invalid HTML, duplicated scripts, or JavaScript errors
* (such as infinite loops or "Maximum call stack size exceeded").
*
* Any request containing one of the following headers is treated as a
* client-managed or partial request, and the Debug Toolbar injection is skipped.
*
* @var array<string, string|null>
*/
public array $disableOnHeaders = [
'X-Requested-With' => 'xmlhttprequest', // AJAX requests
'HX-Request' => 'true', // HTMX requests
'X-Up-Version' => null, // Unpoly partial requests
];
}

View file

@ -232,9 +232,13 @@ class UserAgents extends BaseConfig
*/
public array $robots = [
'googlebot' => 'Googlebot',
'google-pagerenderer' => 'Google Page Renderer',
'google-read-aloud' => 'Google Read Aloud',
'google-safety' => 'Google Safety Bot',
'msnbot' => 'MSNBot',
'baiduspider' => 'Baiduspider',
'bingbot' => 'Bing',
'bingpreview' => 'BingPreview',
'slurp' => 'Inktomi Slurp',
'yahoo' => 'Yahoo',
'ask jeeves' => 'Ask Jeeves',
@ -250,5 +254,11 @@ class UserAgents extends BaseConfig
'ia_archiver' => 'Alexa Crawler',
'MJ12bot' => 'Majestic-12',
'Uptimebot' => 'Uptimebot',
'duckduckbot' => 'DuckDuckBot',
'sogou' => 'Sogou Spider',
'exabot' => 'Exabot',
'bot' => 'Generic Bot',
'crawler' => 'Generic Crawler',
'spider' => 'Generic Spider',
];
}

View file

@ -54,4 +54,21 @@ class View extends BaseView
* @var list<class-string<ViewDecoratorInterface>>
*/
public array $decorators = [Decorator::class];
/**
* Subdirectory within app/Views for namespaced view overrides.
*
* Namespaced views will be searched in:
*
* app/Views/{$appOverridesFolder}/{Namespace}/{view_path}.{php|html...}
*
* This allows application-level overrides for package or module views
* without modifying vendor source files.
*
* Examples:
* 'overrides' -> app/Views/overrides/Example/Blog/post/card.php
* 'vendor' -> app/Views/vendor/Example/Blog/post/card.php
* '' -> app/Views/Example/Blog/post/card.php (direct mapping)
*/
public string $appOverridesFolder = 'overrides';
}

52
app/Config/WorkerMode.php Normal file
View file

@ -0,0 +1,52 @@
<?php
declare(strict_types=1);
namespace Config;
/**
* This configuration controls how CodeIgniter behaves when running
* in worker mode (with FrankenPHP).
*/
class WorkerMode
{
/**
* Persistent Services
*
* List of service names that should persist across requests.
* These services will NOT be reset between requests.
*
* Services not in this list will be reset for each request to prevent
* state leakage.
*
* Recommended persistent services:
* - `autoloader`: PSR-4 autoloading configuration
* - `locator`: File locator
* - `exceptions`: Exception handler
* - `commands`: CLI commands registry
* - `codeigniter`: Main application instance
* - `superglobals`: Superglobals wrapper
* - `routes`: Router configuration
* - `cache`: Cache instance
*
* @var list<string>
*/
public array $persistentServices = [
'autoloader',
'locator',
'exceptions',
'commands',
'codeigniter',
'superglobals',
'routes',
'cache',
];
/**
* Force Garbage Collection
*
* Whether to force garbage collection after each request.
* Helps prevent memory leaks at a small performance cost.
*/
public bool $forceGarbageCollection = true;
}

View file

@ -145,11 +145,9 @@ class EpisodeCommentController extends BaseController
$pager = $commentReplies->pager;
$orderedItems = [];
if ($paginatedReplies !== null) {
foreach ($paginatedReplies as $reply) {
$replyObject = new CommentObject($reply);
$orderedItems[] = $replyObject;
}
foreach ($paginatedReplies as $reply) {
$replyObject = new CommentObject($reply);
$orderedItems[] = $replyObject;
}
$collection = new OrderedCollectionPage($pager, $orderedItems);

View file

@ -403,10 +403,8 @@ class EpisodeController extends BaseController
$pager = $episodeComments->pager;
$orderedItems = [];
if ($paginatedComments !== null) {
foreach ($paginatedComments as $comment) {
$orderedItems[] = new NoteObject($comment)->toArray();
}
foreach ($paginatedComments as $comment) {
$orderedItems[] = new NoteObject($comment)->toArray();
}
// @phpstan-ignore-next-line

View file

@ -285,10 +285,8 @@ class PodcastController extends BaseController
$pager = $episodes->pager;
$orderedItems = [];
if ($paginatedEpisodes !== null) {
foreach ($paginatedEpisodes as $episode) {
$orderedItems[] = new PodcastEpisode($episode)->toArray();
}
foreach ($paginatedEpisodes as $episode) {
$orderedItems[] = new PodcastEpisode($episode)->toArray();
}
// @phpstan-ignore-next-line

View file

@ -102,7 +102,7 @@ class RssFeed extends SimpleXMLElement
foreach ($nodes as $element) {
$namespaces = $element->getNamespaces();
$namespace = $namespaces[array_key_first($namespaces)] ?? null;
$namespace = array_first($namespaces) ?? null;
if (trim((string) $element) === '') {
$simpleRSS = $this->addChild($element->getName(), null, $namespace);

View file

@ -17,7 +17,7 @@ use Override;
class ActorModel extends FediverseActorModel
{
/**
* @var string
* @var class-string<Actor>
*/
protected $returnType = Actor::class;

View file

@ -31,7 +31,7 @@ class CategoryModel extends Model
protected $allowedFields = ['parent_id', 'code', 'apple_category', 'google_category'];
/**
* @var string
* @var class-string<Category>
*/
protected $returnType = Category::class;

View file

@ -21,7 +21,7 @@ class CreditModel extends Model
protected $table = 'credits';
/**
* @var string
* @var class-string<Credit>
*/
protected $returnType = Credit::class;
}

View file

@ -25,7 +25,7 @@ use Modules\Fediverse\Objects\TombstoneObject;
class EpisodeCommentModel extends UuidModel
{
/**
* @var string
* @var class-string<EpisodeComment>
*/
protected $returnType = EpisodeComment::class;

View file

@ -98,7 +98,7 @@ class EpisodeModel extends UuidModel
];
/**
* @var string
* @var class-string<Episode>
*/
protected $returnType = Episode::class;

View file

@ -31,7 +31,7 @@ class LanguageModel extends Model
protected $allowedFields = ['code', 'native_name'];
/**
* @var string
* @var class-string<Language>
*/
protected $returnType = Language::class;

View file

@ -36,7 +36,7 @@ class LikeModel extends UuidModel
protected $allowedFields = ['actor_id', 'comment_id'];
/**
* @var string
* @var class-string<Like>
*/
protected $returnType = Like::class;

View file

@ -31,7 +31,7 @@ class PageModel extends Model
protected $allowedFields = ['id', 'title', 'slug', 'content_markdown', 'content_html'];
/**
* @var string
* @var class-string<Page>
*/
protected $returnType = Page::class;

View file

@ -39,7 +39,7 @@ class PersonModel extends Model
];
/**
* @var string
* @var class-string<Person>
*/
protected $returnType = Person::class;

View file

@ -64,7 +64,7 @@ class PodcastModel extends Model
];
/**
* @var string
* @var class-string<Podcast>
*/
protected $returnType = Podcast::class;

View file

@ -16,7 +16,7 @@ use Modules\Fediverse\Models\PostModel as FediversePostModel;
class PostModel extends FediversePostModel
{
/**
* @var string
* @var class-string<Post>
*/
protected $returnType = Post::class;

View file

@ -6,14 +6,14 @@
"homepage": "https://castopod.org",
"license": "AGPL-3.0-or-later",
"require": {
"php": "^8.4",
"php": "^8.5",
"adaures/castopod-plugins-manager": "dev-main",
"adaures/ipcat-php": "^v1.0.0",
"adaures/podcast-persons-taxonomy": "^v1.0.1",
"aws/aws-sdk-php": "^3.369.35",
"aws/aws-sdk-php": "^3.369.37",
"chrisjean/php-ico": "^1.0.4",
"cocur/slugify": "4.7.1",
"codeigniter4/framework": "4.6.5",
"codeigniter4/framework": "4.7.0",
"codeigniter4/settings": "v2.2.0",
"codeigniter4/shield": "1.2.0",
"codeigniter4/tasks": "dev-develop",
@ -38,7 +38,7 @@
"mikey179/vfsstream": "^v1.6.12",
"phpstan/extension-installer": "^1.4.3",
"phpstan/phpstan": "^2.1.39",
"phpunit/phpunit": "^13.0.3",
"phpunit/phpunit": "^13.0.5",
"rector/rector": "^2.3.6",
"symplify/coding-standard": "^13.0.0",
"symplify/easy-coding-standard": "^13.0.4"

55
composer.lock generated
View file

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "469f61ba87e9ecee8c664a7c48999320",
"content-hash": "de1c665976cbb37fec3de326336d83f5",
"packages": [
{
"name": "adaures/castopod-plugins-manager",
@ -261,16 +261,16 @@
},
{
"name": "aws/aws-sdk-php",
"version": "3.369.35",
"version": "3.369.37",
"source": {
"type": "git",
"url": "https://github.com/aws/aws-sdk-php.git",
"reference": "0f3e296342fe965271b5dd0bded4a18bdab8aba5"
"reference": "bc599ce989b101ee630d5e1a1aeda387632df47b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/0f3e296342fe965271b5dd0bded4a18bdab8aba5",
"reference": "0f3e296342fe965271b5dd0bded4a18bdab8aba5",
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/bc599ce989b101ee630d5e1a1aeda387632df47b",
"reference": "bc599ce989b101ee630d5e1a1aeda387632df47b",
"shasum": ""
},
"require": {
@ -352,9 +352,9 @@
"support": {
"forum": "https://github.com/aws/aws-sdk-php/discussions",
"issues": "https://github.com/aws/aws-sdk-php/issues",
"source": "https://github.com/aws/aws-sdk-php/tree/3.369.35"
"source": "https://github.com/aws/aws-sdk-php/tree/3.369.37"
},
"time": "2026-02-16T19:15:41+00:00"
"time": "2026-02-18T19:16:34+00:00"
},
{
"name": "brick/math",
@ -539,23 +539,23 @@
},
{
"name": "codeigniter4/framework",
"version": "v4.6.5",
"version": "v4.7.0",
"source": {
"type": "git",
"url": "https://github.com/codeigniter4/framework.git",
"reference": "116e0919590a412c09d2b9e4f6b8addda18224d8"
"reference": "e7753bc03f8b74af428f46b5e2bb74925487c930"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/codeigniter4/framework/zipball/116e0919590a412c09d2b9e4f6b8addda18224d8",
"reference": "116e0919590a412c09d2b9e4f6b8addda18224d8",
"url": "https://api.github.com/repos/codeigniter4/framework/zipball/e7753bc03f8b74af428f46b5e2bb74925487c930",
"reference": "e7753bc03f8b74af428f46b5e2bb74925487c930",
"shasum": ""
},
"require": {
"ext-intl": "*",
"ext-mbstring": "*",
"laminas/laminas-escaper": "^2.17",
"php": "^8.1",
"laminas/laminas-escaper": "^2.18",
"php": "^8.2",
"psr/log": "^3.0"
},
"require-dev": {
@ -569,6 +569,7 @@
"predis/predis": "^3.0"
},
"suggest": {
"ext-apcu": "If you use Cache class ApcuHandler",
"ext-curl": "If you use CURLRequest class",
"ext-dom": "If you use TestResponse",
"ext-exif": "If you run Image class tests",
@ -580,7 +581,9 @@
"ext-memcached": "If you use Cache class MemcachedHandler with Memcached",
"ext-mysqli": "If you use MySQL",
"ext-oci8": "If you use Oracle Database",
"ext-pcntl": "If you use Signals",
"ext-pgsql": "If you use PostgreSQL",
"ext-posix": "If you use Signals",
"ext-readline": "Improves CLI::input() usability",
"ext-redis": "If you use Cache class RedisHandler",
"ext-simplexml": "If you format XML",
@ -609,7 +612,7 @@
"slack": "https://codeigniterchat.slack.com",
"source": "https://github.com/codeigniter4/CodeIgniter4"
},
"time": "2026-02-01T17:59:34+00:00"
"time": "2026-02-01T20:39:35+00:00"
},
{
"name": "codeigniter4/queue",
@ -4556,16 +4559,16 @@
},
{
"name": "friendsofphp/php-cs-fixer",
"version": "v3.94.0",
"version": "v3.94.1",
"source": {
"type": "git",
"url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
"reference": "883b20fb38c7866de9844ab6d0a205c423bde2d4"
"reference": "d1a3634e29916367b885250e1fc4dfd5ffe3b091"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/883b20fb38c7866de9844ab6d0a205c423bde2d4",
"reference": "883b20fb38c7866de9844ab6d0a205c423bde2d4",
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/d1a3634e29916367b885250e1fc4dfd5ffe3b091",
"reference": "d1a3634e29916367b885250e1fc4dfd5ffe3b091",
"shasum": ""
},
"require": {
@ -4648,7 +4651,7 @@
],
"support": {
"issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
"source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.94.0"
"source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.94.1"
},
"funding": [
{
@ -4656,7 +4659,7 @@
"type": "github"
}
],
"time": "2026-02-11T16:44:33+00:00"
"time": "2026-02-18T12:24:42+00:00"
},
{
"name": "mikey179/vfsstream",
@ -5431,16 +5434,16 @@
},
{
"name": "phpunit/phpunit",
"version": "13.0.3",
"version": "13.0.5",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
"reference": "a9c20642ffd2098c0f9e687c00849afbce2f23c7"
"reference": "d57826e8921a534680c613924bfd921ded8047f4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a9c20642ffd2098c0f9e687c00849afbce2f23c7",
"reference": "a9c20642ffd2098c0f9e687c00849afbce2f23c7",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d57826e8921a534680c613924bfd921ded8047f4",
"reference": "d57826e8921a534680c613924bfd921ded8047f4",
"shasum": ""
},
"require": {
@ -5509,7 +5512,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
"security": "https://github.com/sebastianbergmann/phpunit/security/policy",
"source": "https://github.com/sebastianbergmann/phpunit/tree/13.0.3"
"source": "https://github.com/sebastianbergmann/phpunit/tree/13.0.5"
},
"funding": [
{
@ -5533,7 +5536,7 @@
"type": "tidelift"
}
],
"time": "2026-02-16T08:38:33+00:00"
"time": "2026-02-18T12:40:03+00:00"
},
{
"name": "psr/container",

View file

@ -4,7 +4,7 @@
# ⚠️ NOT optimized for production
# should be used only for continuous integration
#---------------------------------------------------
FROM php:8.4-fpm-alpine3.21
FROM php:8.5-fpm-alpine3.23
LABEL maintainer="Yassine Doghri <yassine@doghri.fr>"

View file

@ -7,7 +7,7 @@
# 2. BUILD the FrankenPHP/debian based prod image
#---------------------------------------------------
ARG PHP_VERSION="8.4"
ARG PHP_VERSION="8.5"
####################################################
# BUNDLE STAGE

View file

@ -1,44 +0,0 @@
FROM docker.io/golang:1.25-bookworm AS CRON_BUILDER
ARG SUPERCRONIC_VERSION=v0.2.34
RUN apt-get update && \
apt-get install -y git && \
git clone https://github.com/aptible/supercronic.git && \
cd supercronic && \
git checkout $SUPERCRONIC_VERSION && \
go build && \
mv supercronic /usr/local/bin
FROM docker.io/php:8.4-fpm
COPY --from=CRON_BUILDER /usr/local/bin/supercronic /usr/local/bin/supercronic
COPY docker/production/common/prepare_environment.sh /prepare_environment.sh
COPY docker/production/app/entrypoint.sh /entrypoint.sh
COPY docker/production/common/uploads.template.ini /uploads.template.ini
COPY docker/production/common/crontab.txt /crontab.txt
COPY docker/production/app/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
COPY castopod /var/www/castopod
RUN apt-get update && \
apt-get install -y supervisor ffmpeg curl gettext-base libfreetype6-dev libjpeg62-turbo-dev libpng-dev libwebp-dev libxpm-dev libpcre2-8-0 libicu-dev && \
rm -rf /var/lib/apt/lists/* && \
pecl install -o -f redis && \
rm -rf /tmp/pear && \
docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp --with-xpm && \
docker-php-ext-install mysqli gd intl exif && \
docker-php-ext-enable mysqli gd intl exif redis && \
chmod +x /entrypoint.sh && \
chmod -R 750 /var/www/castopod && \
chown -R root:www-data /var/www/castopod && \
chown -R www-data:www-data /var/www/castopod/writable /var/www/castopod/public/media
WORKDIR /var/www/castopod
VOLUME /var/www/castopod/public/media
EXPOSE 9000
ENTRYPOINT [ "sh", "-c" ]
CMD [ "/entrypoint.sh" ]

View file

@ -1,57 +0,0 @@
FROM docker.io/golang:1.25-bookworm AS CRON_BUILDER
ARG SUPERCRONIC_VERSION=v0.2.34
RUN apt-get update && \
apt-get install -y git && \
git clone https://github.com/aptible/supercronic.git && \
cd supercronic && \
git checkout $SUPERCRONIC_VERSION && \
go build && \
mv supercronic /usr/local/bin
FROM docker.io/php:8.4-cli
ARG UNIT_VERSION=1.34.2
COPY --from=CRON_BUILDER /usr/local/bin/supercronic /usr/local/bin/supercronic
COPY docker/production/common/prepare_environment.sh /prepare_environment.sh
COPY docker/production/castopod/entrypoint.sh /entrypoint.sh
COPY castopod /var/www/castopod
COPY docker/production/castopod/config.template.json /config.template.json
COPY docker/production/common/uploads.template.ini /uploads.template.ini
COPY docker/production/common/crontab.txt /crontab.txt
COPY docker/production/castopod/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
RUN apt-get update && \
apt-get install -y supervisor ffmpeg curl gettext-base libfreetype6-dev libjpeg62-turbo-dev libpng-dev libwebp-dev libxpm-dev libpcre2-dev libicu-dev git && \
rm -rf /var/lib/apt/lists/* && \
git clone https://github.com/nginx/unit.git && \
cd unit && \
git checkout $UNIT_VERSION && \
./configure --user=www-data --group=www-data && \
./configure php && \
make && \
make install && \
cd .. && \
rm -rf unit && \
pecl install -o -f redis && \
rm -rf /tmp/pear && \
docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp --with-xpm && \
docker-php-ext-install mysqli gd intl exif && \
docker-php-ext-enable mysqli gd intl exif redis && \
ln -s /dev/stdout /var/log/unit.log && \
mkdir -p /usr/local/var/lib/unit /usr/local/var/run/unit /usr/local/var/log/unit && \
chmod 544 /entrypoint.sh && \
chmod -R 750 /var/www/castopod && \
chown -R root:www-data /var/www/castopod && \
chown -R www-data:www-data /var/www/castopod/writable /var/www/castopod/public/media
WORKDIR /var/www/castopod
VOLUME /var/www/castopod/public/media
EXPOSE 8000
ENTRYPOINT [ "sh", "-c" ]
CMD [ "/entrypoint.sh" ]

View file

@ -9,15 +9,15 @@ shared hosting, you can install it on most PHP-MySQL compatible web servers.
## Requirements
- PHP v8.4 or higher
- PHP v8.5 or higher
- MySQL version 8.4 or higher or MariaDB version 11.4 or higher
- HTTPS support
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.4 or higher
### PHP v8.5 or higher
PHP version 8.4 or higher is required, with the following extensions installed:
PHP version 8.5 or higher is required, with the following extensions installed:
- [intl](https://php.net/manual/en/intl.requirements.php)
- [libcurl](https://php.net/manual/en/curl.requirements.php)

View file

@ -9,15 +9,15 @@ shared hosting, you can install it on most PHP-MySQL compatible web servers.
## Requirements
- PHP v8.4 or higher
- PHP v8.5 or higher
- MySQL version 8.4 or higher or MariaDB version 11.4 or higher
- HTTPS support
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.4 or higher
### PHP v8.5 or higher
PHP version 8.4 or higher is required, with the following extensions installed:
PHP version 8.5 or higher is required, with the following extensions installed:
- [intl](https://php.net/manual/en/intl.requirements.php)
- [libcurl](https://php.net/manual/en/curl.requirements.php)

View file

@ -9,15 +9,15 @@ shared hosting, you can install it on most PHP-MySQL compatible web servers.
## Requirements
- PHP v8.4 or higher
- PHP v8.5 or higher
- MySQL version 8.4 or higher or MariaDB version 11.4 or higher
- HTTPS support
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.4 or higher
### PHP v8.5 or higher
PHP version 8.4 or higher is required, with the following extensions installed:
PHP version 8.5 or higher is required, with the following extensions installed:
- [intl](https://php.net/manual/en/intl.requirements.php)
- [libcurl](https://php.net/manual/en/curl.requirements.php)

View file

@ -9,15 +9,15 @@ shared hosting, you can install it on most PHP-MySQL compatible web servers.
## Requirements
- PHP v8.4 or higher
- PHP v8.5 or higher
- MySQL version 8.4 or higher or MariaDB version 11.4 or higher
- HTTPS support
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.4 or higher
### PHP v8.5 or higher
PHP version 8.4 or higher is required, with the following extensions installed:
PHP version 8.5 or higher is required, with the following extensions installed:
- [intl](https://php.net/manual/en/intl.requirements.php)
- [libcurl](https://php.net/manual/en/curl.requirements.php)

View file

@ -10,15 +10,15 @@ installieren.
## Voraussetzungen
- PHP v8.4 oder höher
- PHP v8.5 oder höher
- MySQL Version 8.4 oder höher oder MariaDB Version 11.4 oder höher
- HTTPS-Unterstützung
- Eine [ntp-synchronisierte Uhr](https://wiki.debian.org/NTP) um die eingehenden
Anfragen zu überprüfen
### PHP v8.4 oder höher
### PHP v8.5 oder höher
PHP version 8.4 oder höher ist erforderlich, mit folgenden Erweiterungen
PHP version 8.5 oder höher ist erforderlich, mit folgenden Erweiterungen
installiert:
- [intl](https://php.net/manual/en/intl.requirements.php)

View file

@ -9,15 +9,15 @@ shared hosting, you can install it on most PHP-MySQL compatible web servers.
## Requirements
- PHP v8.4 or higher
- PHP v8.5 or higher
- MySQL version 8.4 or higher or MariaDB version 11.4 or higher
- HTTPS support
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.4 or higher
### PHP v8.5 or higher
PHP version 8.4 or higher is required, with the following extensions installed:
PHP version 8.5 or higher is required, with the following extensions installed:
- [intl](https://php.net/manual/en/intl.requirements.php)
- [libcurl](https://php.net/manual/en/curl.requirements.php)

View file

@ -9,15 +9,15 @@ shared hosting, you can install it on most PHP-MySQL compatible web servers.
## Requirements
- PHP v8.4 or higher
- PHP v8.5 or higher
- MySQL version 8.4 or higher or MariaDB version 11.4 or higher
- HTTPS support
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.4 or higher
### PHP v8.5 or higher
PHP version 8.4 or higher is required, with the following extensions installed:
PHP version 8.5 or higher is required, with the following extensions installed:
- [intl](https://php.net/manual/en/intl.requirements.php)
- [libcurl](https://php.net/manual/en/curl.requirements.php)

View file

@ -10,15 +10,15 @@ compatibles con PHP-MySQL.
## Requisitos
- PHP v8.4 or higher
- PHP v8.5 or higher
- MySQL versión 8.4 o superior o MariaDB versión 11.4 o superior
- Soporte HTTPS
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.4 or higher
### PHP v8.5 or higher
PHP version 8.4 or higher is required, with the following extensions installed:
PHP version 8.5 or higher is required, with the following extensions installed:
- [intl](https://php.net/manual/en/intl.requirements.php)
- [libcurl](https://php.net/manual/en/curl.requirements.php)

View file

@ -9,15 +9,15 @@ shared hosting, you can install it on most PHP-MySQL compatible web servers.
## Requirements
- PHP v8.4 or higher
- PHP v8.5 or higher
- MySQL version 8.4 or higher or MariaDB version 11.4 or higher
- HTTPS support
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.4 or higher
### PHP v8.5 or higher
PHP version 8.4 or higher is required, with the following extensions installed:
PHP version 8.5 or higher is required, with the following extensions installed:
- [intl](https://php.net/manual/en/intl.requirements.php)
- [libcurl](https://php.net/manual/en/curl.requirements.php)

View file

@ -9,15 +9,15 @@ shared hosting, you can install it on most PHP-MySQL compatible web servers.
## Requirements
- PHP v8.4 or higher
- PHP v8.5 or higher
- MySQL version 8.4 or higher or MariaDB version 11.4 or higher
- HTTPS support
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.4 or higher
### PHP v8.5 or higher
PHP version 8.4 or higher is required, with the following extensions installed:
PHP version 8.5 or higher is required, with the following extensions installed:
- [intl](https://php.net/manual/en/intl.requirements.php)
- [libcurl](https://php.net/manual/en/curl.requirements.php)

View file

@ -9,15 +9,15 @@ shared hosting, you can install it on most PHP-MySQL compatible web servers.
## Requirements
- PHP v8.4 or higher
- PHP v8.5 or higher
- MySQL version 8.4 or higher or MariaDB version 11.4 or higher
- HTTPS support
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.4 or higher
### PHP v8.5 or higher
PHP version 8.4 or higher is required, with the following extensions installed:
PHP version 8.5 or higher is required, with the following extensions installed:
- [intl](https://php.net/manual/en/intl.requirements.php)
- [libcurl](https://php.net/manual/en/curl.requirements.php)

View file

@ -10,15 +10,15 @@ serveurs web compatibles avec PHP-MySQL.
## Prérequis
- PHP v8.4 ou supérieure
- PHP v8.5 ou supérieure
- MySQL version 8.4 ou supérieure ou MariaDB version 11.4 ou supérieure
- Prise en charge HTTPS
- Une horloge [synchronisée ntp](https://wiki.debian.org/NTP) pour valider les
requêtes fédérés entrantes
### PHP v8.4 ou supérieure
### PHP v8.5 ou supérieure
PHP version 8.4 ou supérieure est requise, avec les extensions suivantes
PHP version 8.5 ou supérieure est requise, avec les extensions suivantes
installées :
- [intl](https://www.php.net/manual/fr/intl.requirements.php)

View file

@ -10,15 +10,15 @@ serveurs web compatibles avec PHP-MySQL.
## Prérequis
- PHP v8.4 or higher
- PHP v8.5 or higher
- MySQL version 8.4 ou supérieure ou MariaDB version 11.4 ou supérieure
- Prise en charge HTTPS
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.4 or higher
### PHP v8.5 or higher
PHP version 8.4 or higher is required, with the following extensions installed:
PHP version 8.5 or higher is required, with the following extensions installed:
- [intl](https://www.php.net/manual/fr/intl.requirements.php)
- [libcurl](https://www.php.net/manual/fr/curl.requirements.php)

View file

@ -9,15 +9,15 @@ shared hosting, you can install it on most PHP-MySQL compatible web servers.
## Requirements
- PHP v8.4 or higher
- PHP v8.5 or higher
- MySQL version 8.4 or higher or MariaDB version 11.4 or higher
- HTTPS support
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.4 or higher
### PHP v8.5 or higher
PHP version 8.4 or higher is required, with the following extensions installed:
PHP version 8.5 or higher is required, with the following extensions installed:
- [intl](https://php.net/manual/en/intl.requirements.php)
- [libcurl](https://php.net/manual/en/curl.requirements.php)

View file

@ -9,15 +9,15 @@ shared hosting, you can install it on most PHP-MySQL compatible web servers.
## Requirements
- PHP v8.4 or higher
- PHP v8.5 or higher
- MySQL version 8.4 or higher or MariaDB version 11.4 or higher
- HTTPS support
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.4 or higher
### PHP v8.5 or higher
PHP version 8.4 or higher is required, with the following extensions installed:
PHP version 8.5 or higher is required, with the following extensions installed:
- [intl](https://php.net/manual/en/intl.requirements.php)
- [libcurl](https://php.net/manual/en/curl.requirements.php)

View file

@ -9,15 +9,15 @@ shared hosting, you can install it on most PHP-MySQL compatible web servers.
## Requirements
- PHP v8.4 or higher
- PHP v8.5 or higher
- MySQL version 8.4 or higher or MariaDB version 11.4 or higher
- HTTPS support
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.4 or higher
### PHP v8.5 or higher
PHP version 8.4 or higher is required, with the following extensions installed:
PHP version 8.5 or higher is required, with the following extensions installed:
- [intl](https://php.net/manual/en/intl.requirements.php)
- [libcurl](https://php.net/manual/en/curl.requirements.php)

View file

@ -9,15 +9,15 @@ shared hosting, you can install it on most PHP-MySQL compatible web servers.
## Requirements
- PHP v8.4 or higher
- PHP v8.5 or higher
- MySQL version 8.4 or higher or MariaDB version 11.4 or higher
- HTTPS support
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.4 or higher
### PHP v8.5 or higher
PHP version 8.4 or higher is required, with the following extensions installed:
PHP version 8.5 or higher is required, with the following extensions installed:
- [intl](https://php.net/manual/en/intl.requirements.php)
- [libcurl](https://php.net/manual/en/curl.requirements.php)

View file

@ -9,15 +9,15 @@ shared hosting, you can install it on most PHP-MySQL compatible web servers.
## Requirements
- PHP v8.4 or higher
- PHP v8.5 or higher
- MySQL version 8.4 or higher or MariaDB version 11.4 or higher
- HTTPS support
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.4 or higher
### PHP v8.5 or higher
PHP version 8.4 or higher is required, with the following extensions installed:
PHP version 8.5 or higher is required, with the following extensions installed:
- [intl](https://php.net/manual/en/intl.requirements.php)
- [libcurl](https://php.net/manual/en/curl.requirements.php)

View file

@ -9,15 +9,15 @@ shared hosting, you can install it on most PHP-MySQL compatible web servers.
## Requirements
- PHP v8.4 or higher
- PHP v8.5 or higher
- MySQL version 8.4 or higher or MariaDB version 11.4 or higher
- HTTPS support
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.4 or higher
### PHP v8.5 or higher
PHP version 8.4 or higher is required, with the following extensions installed:
PHP version 8.5 or higher is required, with the following extensions installed:
- [intl](https://php.net/manual/en/intl.requirements.php)
- [libcurl](https://php.net/manual/en/curl.requirements.php)

View file

@ -9,15 +9,15 @@ shared hosting, you can install it on most PHP-MySQL compatible web servers.
## Requirements
- PHP v8.4 or higher
- PHP v8.5 or higher
- MySQL version 8.4 or higher or MariaDB version 11.4 or higher
- HTTPS support
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.4 or higher
### PHP v8.5 or higher
PHP version 8.4 or higher is required, with the following extensions installed:
PHP version 8.5 or higher is required, with the following extensions installed:
- [intl](https://php.net/manual/en/intl.requirements.php)
- [libcurl](https://php.net/manual/en/curl.requirements.php)

View file

@ -9,15 +9,15 @@ shared hosting, you can install it on most PHP-MySQL compatible web servers.
## Requirements
- PHP v8.4 or higher
- PHP v8.5 or higher
- MySQL version 8.4 or higher or MariaDB version 11.4 or higher
- HTTPS support
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.4 or higher
### PHP v8.5 or higher
PHP version 8.4 or higher is required, with the following extensions installed:
PHP version 8.5 or higher is required, with the following extensions installed:
- [intl](https://php.net/manual/en/intl.requirements.php)
- [libcurl](https://php.net/manual/en/curl.requirements.php)

View file

@ -9,15 +9,15 @@ shared hosting, you can install it on most PHP-MySQL compatible web servers.
## Requirements
- PHP v8.4 or higher
- PHP v8.5 or higher
- MySQL version 8.4 or higher or MariaDB version 11.4 or higher
- HTTPS support
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.4 or higher
### PHP v8.5 or higher
PHP version 8.4 or higher is required, with the following extensions installed:
PHP version 8.5 or higher is required, with the following extensions installed:
- [intl](https://php.net/manual/en/intl.requirements.php)
- [libcurl](https://php.net/manual/en/curl.requirements.php)

View file

@ -9,15 +9,15 @@ shared hosting, you can install it on most PHP-MySQL compatible web servers.
## Requirements
- PHP v8.4 or higher
- PHP v8.5 or higher
- MySQL version 8.4 or higher or MariaDB version 11.4 or higher
- HTTPS support
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.4 or higher
### PHP v8.5 or higher
PHP version 8.4 or higher is required, with the following extensions installed:
PHP version 8.5 or higher is required, with the following extensions installed:
- [intl](https://php.net/manual/en/intl.requirements.php)
- [libcurl](https://php.net/manual/en/curl.requirements.php)

View file

@ -9,15 +9,15 @@ shared hosting, you can install it on most PHP-MySQL compatible web servers.
## Requirements
- PHP v8.4 or higher
- PHP v8.5 or higher
- MySQL version 8.4 or higher or MariaDB version 11.4 or higher
- HTTPS support
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.4 or higher
### PHP v8.5 or higher
PHP version 8.4 or higher is required, with the following extensions installed:
PHP version 8.5 or higher is required, with the following extensions installed:
- [intl](https://php.net/manual/en/intl.requirements.php)
- [libcurl](https://php.net/manual/en/curl.requirements.php)

View file

@ -10,15 +10,15 @@ com PHP-MySQL.
## Requisitos
- PHP v8.4 or higher
- PHP v8.5 or higher
- MySQL versão 8.4 ou superior ou MariaDB versão 11.4 ou superior
- Suporte a HTTPS
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.4 or higher
### PHP v8.5 or higher
PHP version 8.4 or higher is required, with the following extensions installed:
PHP version 8.5 or higher is required, with the following extensions installed:
- [intl](https://php.net/manual/en/intl.requirements.php)
- [libcurl](https://php.net/manual/en/curl.requirements.php)

View file

@ -9,15 +9,15 @@ shared hosting, you can install it on most PHP-MySQL compatible web servers.
## Requirements
- PHP v8.4 or higher
- PHP v8.5 or higher
- MySQL version 8.4 or higher or MariaDB version 11.4 or higher
- HTTPS support
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.4 or higher
### PHP v8.5 or higher
PHP version 8.4 or higher is required, with the following extensions installed:
PHP version 8.5 or higher is required, with the following extensions installed:
- [intl](https://php.net/manual/en/intl.requirements.php)
- [libcurl](https://php.net/manual/en/curl.requirements.php)

View file

@ -9,15 +9,15 @@ shared hosting, you can install it on most PHP-MySQL compatible web servers.
## Requirements
- PHP v8.4 or higher
- PHP v8.5 or higher
- MySQL version 8.4 or higher or MariaDB version 11.4 or higher
- HTTPS support
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.4 or higher
### PHP v8.5 or higher
PHP version 8.4 or higher is required, with the following extensions installed:
PHP version 8.5 or higher is required, with the following extensions installed:
- [intl](https://php.net/manual/en/intl.requirements.php)
- [libcurl](https://php.net/manual/en/curl.requirements.php)

View file

@ -9,15 +9,15 @@ shared hosting, you can install it on most PHP-MySQL compatible web servers.
## Requirements
- PHP v8.4 or higher
- PHP v8.5 or higher
- MySQL version 8.4 or higher or MariaDB version 11.4 or higher
- HTTPS support
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.4 or higher
### PHP v8.5 or higher
PHP version 8.4 or higher is required, with the following extensions installed:
PHP version 8.5 or higher is required, with the following extensions installed:
- [intl](https://php.net/manual/en/intl.requirements.php)
- [libcurl](https://php.net/manual/en/curl.requirements.php)

View file

@ -9,15 +9,15 @@ shared hosting, you can install it on most PHP-MySQL compatible web servers.
## Requirements
- PHP v8.4 or higher
- PHP v8.5 or higher
- MySQL version 8.4 or higher or MariaDB version 11.4 or higher
- HTTPS support
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.4 or higher
### PHP v8.5 or higher
PHP version 8.4 or higher is required, with the following extensions installed:
PHP version 8.5 or higher is required, with the following extensions installed:
- [intl](https://php.net/manual/en/intl.requirements.php)
- [libcurl](https://php.net/manual/en/curl.requirements.php)

View file

@ -9,15 +9,15 @@ shared hosting, you can install it on most PHP-MySQL compatible web servers.
## Requirements
- PHP v8.4 or higher
- PHP v8.5 or higher
- MySQL version 8.4 or higher or MariaDB version 11.4 or higher
- HTTPS support
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.4 or higher
### PHP v8.5 or higher
PHP version 8.4 or higher is required, with the following extensions installed:
PHP version 8.5 or higher is required, with the following extensions installed:
- [intl](https://php.net/manual/en/intl.requirements.php)
- [libcurl](https://php.net/manual/en/curl.requirements.php)

View file

@ -9,15 +9,15 @@ shared hosting, you can install it on most PHP-MySQL compatible web servers.
## Requirements
- PHP v8.4 or higher
- PHP v8.5 or higher
- MySQL version 8.4 or higher or MariaDB version 11.4 or higher
- HTTPS support
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.4 or higher
### PHP v8.5 or higher
PHP version 8.4 or higher is required, with the following extensions installed:
PHP version 8.5 or higher is required, with the following extensions installed:
- [intl](https://php.net/manual/en/intl.requirements.php)
- [libcurl](https://php.net/manual/en/curl.requirements.php)

View file

@ -9,15 +9,15 @@ shared hosting, you can install it on most PHP-MySQL compatible web servers.
## Requirements
- PHP v8.4 or higher
- PHP v8.5 or higher
- MySQL version 8.4 or higher or MariaDB version 11.4 or higher
- HTTPS support
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.4 or higher
### PHP v8.5 or higher
PHP version 8.4 or higher is required, with the following extensions installed:
PHP version 8.5 or higher is required, with the following extensions installed:
- [intl](https://php.net/manual/en/intl.requirements.php)
- [libcurl](https://php.net/manual/en/curl.requirements.php)

View file

@ -9,14 +9,14 @@ shared hosting, you can install it on most PHP-MySQL compatible web servers.
## 要求
- PHP v8.4 or higher
- PHP v8.5 or higher
- MySQL 8.4 或更高版本与 MariaDB 11.4 或更高版本
- HTTPS 支持
- 用于验证的 [NTP 同步时钟](https://wiki.debian.org/NTP) 传入请求
### PHP v8.4 or higher
### PHP v8.5 or higher
PHP version 8.4 or higher is required, with the following extensions installed:
PHP version 8.5 or higher is required, with the following extensions installed:
- [intl](https://php.net/manual/en/intl.requirements.php)
- [libcurl](https://php.net/manual/en/curl.requirements.php)

View file

@ -9,15 +9,15 @@ shared hosting, you can install it on most PHP-MySQL compatible web servers.
## Requirements
- PHP v8.4 or higher
- PHP v8.5 or higher
- MySQL version 8.4 or higher or MariaDB version 11.4 or higher
- HTTPS support
- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's
incoming requests
### PHP v8.4 or higher
### PHP v8.5 or higher
PHP version 8.4 or higher is required, with the following extensions installed:
PHP version 8.5 or higher is required, with the following extensions installed:
- [intl](https://php.net/manual/en/intl.requirements.php)
- [libcurl](https://php.net/manual/en/curl.requirements.php)

View file

@ -10,6 +10,7 @@ declare(strict_types=1);
namespace Modules\Admin\Controllers;
use App\Entities\Clip\BaseClip;
use App\Entities\Clip\VideoClip;
use App\Entities\Episode;
use App\Entities\Podcast;
@ -59,6 +60,7 @@ class VideoClipsController extends BaseController
])
->orderBy('created_at', 'desc');
/** @var BaseClip[] $clips */
$clips = $videoClipsBuilder->paginate(10);
$videoClips = [];

View file

@ -23,7 +23,7 @@ class AnalyticsPodcastByCountryModel extends Model
protected $table = 'analytics_podcasts_by_country';
/**
* @var string
* @var class-string<AnalyticsPodcastsByCountry>
*/
protected $returnType = AnalyticsPodcastsByCountry::class;

View file

@ -23,7 +23,7 @@ class AnalyticsPodcastByEpisodeModel extends Model
protected $table = 'analytics_podcasts_by_episode';
/**
* @var string
* @var class-string<AnalyticsPodcastsByEpisode>
*/
protected $returnType = AnalyticsPodcastsByEpisode::class;

View file

@ -23,7 +23,7 @@ class AnalyticsPodcastByHourModel extends Model
protected $table = 'analytics_podcasts_by_hour';
/**
* @var string
* @var class-string<AnalyticsPodcastsByHour>
*/
protected $returnType = AnalyticsPodcastsByHour::class;

View file

@ -23,7 +23,7 @@ class AnalyticsPodcastByPlayerModel extends Model
protected $table = 'analytics_podcasts_by_player';
/**
* @var string
* @var class-string<AnalyticsPodcastsByPlayer>
*/
protected $returnType = AnalyticsPodcastsByPlayer::class;

View file

@ -23,7 +23,7 @@ class AnalyticsPodcastByRegionModel extends Model
protected $table = 'analytics_podcasts_by_region';
/**
* @var string
* @var class-string<AnalyticsPodcastsByRegion>
*/
protected $returnType = AnalyticsPodcastsByRegion::class;

View file

@ -23,7 +23,7 @@ class AnalyticsPodcastByServiceModel extends Model
protected $table = 'analytics_podcasts_by_player';
/**
* @var string
* @var class-string<AnalyticsPodcastsByService>
*/
protected $returnType = AnalyticsPodcastsByService::class;

View file

@ -21,7 +21,7 @@ class AnalyticsPodcastBySubscriptionModel extends Model
protected $table = 'analytics_podcasts_by_subscription';
/**
* @var string
* @var class-string<AnalyticsPodcastsBySubscription>
*/
protected $returnType = AnalyticsPodcastsBySubscription::class;

View file

@ -24,7 +24,7 @@ class AnalyticsPodcastModel extends Model
protected $table = 'analytics_podcasts';
/**
* @var string
* @var class-string<AnalyticsPodcasts>
*/
protected $returnType = AnalyticsPodcasts::class;

View file

@ -23,7 +23,7 @@ class AnalyticsUnknownUserAgentsModel extends Model
protected $table = 'analytics_unknown_useragents';
/**
* @var string
* @var class-string<AnalyticsUnknownUserAgent>
*/
protected $returnType = AnalyticsUnknownUserAgent::class;

View file

@ -23,7 +23,7 @@ class AnalyticsWebsiteByBrowserModel extends Model
protected $table = 'analytics_website_by_browser';
/**
* @var string
* @var class-string<AnalyticsWebsiteByBrowser>
*/
protected $returnType = AnalyticsWebsiteByBrowser::class;

View file

@ -23,7 +23,7 @@ class AnalyticsWebsiteByEntryPageModel extends Model
protected $table = 'analytics_website_by_entry_page';
/**
* @var string
* @var class-string<AnalyticsWebsiteByEntryPage>
*/
protected $returnType = AnalyticsWebsiteByEntryPage::class;

View file

@ -23,7 +23,7 @@ class AnalyticsWebsiteByRefererModel extends Model
protected $table = 'analytics_website_by_referer';
/**
* @var string
* @var class-string<AnalyticsWebsiteByReferer>
*/
protected $returnType = AnalyticsWebsiteByReferer::class;

View file

@ -20,6 +20,8 @@ use Modules\Fediverse\Config\Fediverse;
use Modules\Fediverse\Entities\Activity;
use Modules\Fediverse\Entities\Actor;
use Modules\Fediverse\Entities\Post;
use Modules\Fediverse\Models\ActivityModel;
use Modules\Fediverse\Models\ActorModel;
use Modules\Fediverse\Objects\OrderedCollectionObject;
use Modules\Fediverse\Objects\OrderedCollectionPage;
@ -262,6 +264,7 @@ class ActorController extends Controller
public function outbox(): ResponseInterface
{
// get published activities by publication date
/** @var ActivityModel $actorActivity */
$actorActivity = model('ActivityModel', false)
->where('actor_id', $this->actor->id)
->where('`created_at` <= UTC_TIMESTAMP()', null, false)
@ -274,6 +277,7 @@ class ActorController extends Controller
$pager = $actorActivity->pager;
$collection = new OrderedCollectionObject(null, $pager);
} else {
/** @var Activity[] $paginatedActivity */
$paginatedActivity = $actorActivity->paginate(12, 'default', $pageNumber);
$pager = $actorActivity->pager;
$orderedItems = [];
@ -292,6 +296,7 @@ class ActorController extends Controller
public function followers(): ResponseInterface
{
// get followers for a specific actor
/** @var ActorModel $followers */
$followers = model('ActorModel', false)
->join('fediverse_follows', 'fediverse_follows.actor_id = id', 'inner')
->where('fediverse_follows.target_actor_id', $this->actor->id)
@ -304,6 +309,7 @@ class ActorController extends Controller
$pager = $followers->pager;
$followersCollection = new OrderedCollectionObject(null, $pager);
} else {
/** @var Actor[] $paginatedFollowers */
$paginatedFollowers = $followers->paginate(12, 'default', $pageNumber);
$pager = $followers->pager;

View file

@ -97,11 +97,9 @@ class PostController extends Controller
$orderedItems = [];
$noteObjectClass = $this->config->noteObject;
if ($paginatedReplies !== null) {
foreach ($paginatedReplies as $reply) {
$replyObject = new $noteObjectClass($reply);
$orderedItems[] = $replyObject->toArray();
}
foreach ($paginatedReplies as $reply) {
$replyObject = new $noteObjectClass($reply);
$orderedItems[] = $replyObject->toArray();
}
$collection = new OrderedCollectionPage($pager, $orderedItems);

View file

@ -163,7 +163,7 @@ if (! function_exists('create_preview_card_from_url')) {
if ($mediaData !== []) {
$mediaUrl = array_key_first($mediaData);
$media = array_values($mediaData)[0];
$media = array_first($mediaData);
if (array_key_exists('title', $media)) {
$typeMapping = [

View file

@ -58,7 +58,7 @@ class ActivityModel extends UuidModel
];
/**
* @var string
* @var class-string<Activity>
*/
protected $returnType = Activity::class;

View file

@ -46,7 +46,7 @@ class ActorModel extends Model
];
/**
* @var string
* @var class-string<Actor>
*/
protected $returnType = Actor::class;

View file

@ -33,7 +33,7 @@ class BlockedDomainModel extends Model
protected $allowedFields = ['name'];
/**
* @var string
* @var class-string<BlockedDomain>
*/
protected $returnType = BlockedDomain::class;

View file

@ -36,7 +36,7 @@ class FavouriteModel extends UuidModel
protected $allowedFields = ['actor_id', 'post_id'];
/**
* @var string
* @var class-string<Favourite>
*/
protected $returnType = Favourite::class;

View file

@ -32,7 +32,7 @@ class FollowModel extends Model
protected $allowedFields = ['actor_id', 'target_actor_id'];
/**
* @var string
* @var class-string<Follow>
*/
protected $returnType = Follow::class;

View file

@ -26,7 +26,7 @@ class NotificationModel extends UuidModel
protected $primaryKey = 'id';
/**
* @var string
* @var class-string<Notification>
*/
protected $returnType = Notification::class;

View file

@ -60,7 +60,7 @@ class PostModel extends UuidModel
];
/**
* @var string
* @var class-string<Post>
*/
protected $returnType = Post::class;

View file

@ -39,7 +39,7 @@ class PreviewCardModel extends Model
];
/**
* @var string
* @var class-string<PreviewCard>
*/
protected $returnType = PreviewCard::class;

View file

@ -28,7 +28,7 @@ class OrderedCollectionObject extends ObjectType
protected ?string $last = null;
/**
* @param ObjectType[]|null $orderedItems
* @param ObjectType[]|list<string>|null $orderedItems
*/
public function __construct(
protected ?array $orderedItems = null,

View file

@ -38,7 +38,6 @@ if (! function_exists('download_file')) {
curl_setopt($ch, CURLOPT_MAXREDIRS, 20);
curl_exec($ch);
curl_close($ch);
fclose($file);

View file

@ -133,7 +133,7 @@ class TranscriptParser
$lines = explode(PHP_EOL, $this->transcriptContent);
// add a newline as last item, if it isn't already a newline
if ($lines[array_key_last($lines)] !== '') {
if (array_last($lines) !== '') {
$lines[] = PHP_EOL;
}

View file

@ -564,7 +564,6 @@ class VideoClipper
imagefill($img, 0, 0, $alphacolor);
imagecopyresampled($img, $src, 0, 0, 0, 0, $ns, $ns, $s, $s);
imagedestroy($src);
imagearc($img, $radius - 1, $radius - 1, $radius * 2, $radius * 2, 180, 270, $alphacolor);
imagefilltoborder($img, 0, 0, $alphacolor, $alphacolor);
@ -586,7 +585,6 @@ class VideoClipper
imagealphablending($dest, false);
imagefilledrectangle($dest, 0, 0, $s, $s, $alphacolor);
imagecopyresampled($dest, $img, 0, 0, 0, 0, $s, $s, $ns, $ns);
imagedestroy($img);
# output image
imagealphablending($source, false);
@ -595,7 +593,6 @@ class VideoClipper
imagecopy($source, $dest, $ws - $corner, $hs - $corner, $corner, $corner, $corner, $corner);
imagecopy($source, $dest, 0, $hs - $corner, 0, $corner, $corner, $corner);
imagealphablending($source, true);
imagedestroy($dest);
return $source;
}

View file

@ -33,7 +33,7 @@ class PlatformModel extends Model
protected $allowedFields = ['podcast_id', 'type', 'slug', 'link_url', 'account_id', 'is_visible'];
/**
* @var string
* @var class-string<Platform>
*/
protected $returnType = Platform::class;

View file

@ -52,13 +52,13 @@
"leaflet": "^1.9.4",
"leaflet.markercluster": "^1.5.3",
"lit": "^3.3.2",
"marked": "^17.0.2",
"marked": "^17.0.3",
"wavesurfer.js": "^7.12.1",
"xml-formatter": "^3.6.7"
},
"devDependencies": {
"@commitlint/cli": "^20.4.1",
"@commitlint/config-conventional": "^20.4.1",
"@commitlint/cli": "^20.4.2",
"@commitlint/config-conventional": "^20.4.2",
"@csstools/css-tokenizer": "^4.0.0",
"@eslint/eslintrc": "^3.3.3",
"@eslint/js": "^10.0.1",

View file

@ -49,6 +49,5 @@ parameters:
- Modules\PremiumPodcasts\Config\Services
- Modules\Api\Rest\V1\Config\Services
ignoreErrors:
- '#^Call to an undefined method CodeIgniter\\Cache\\CacheInterface\:\:deleteMatching\(\)#'
- identifier: missingType.generics
- '#\$callback of static method CodeIgniter\\Events\\Events\:\:on\(\) expects callable\(mixed\)\: mixed, Closure\(mixed, mixed\)\: void given.#'

133
pnpm-lock.yaml generated
View file

@ -74,8 +74,8 @@ importers:
specifier: ^3.3.2
version: 3.3.2
marked:
specifier: ^17.0.2
version: 17.0.2
specifier: ^17.0.3
version: 17.0.3
wavesurfer.js:
specifier: ^7.12.1
version: 7.12.1
@ -84,11 +84,11 @@ importers:
version: 3.6.7
devDependencies:
"@commitlint/cli":
specifier: ^20.4.1
version: 20.4.1(@types/node@24.7.0)(typescript@5.9.3)
specifier: ^20.4.2
version: 20.4.2(@types/node@24.7.0)(typescript@5.9.3)
"@commitlint/config-conventional":
specifier: ^20.4.1
version: 20.4.1
specifier: ^20.4.2
version: 20.4.2
"@csstools/css-tokenizer":
specifier: ^4.0.0
version: 4.0.0
@ -1137,18 +1137,18 @@ packages:
}
engines: { node: ">=0.1.90" }
"@commitlint/cli@20.4.1":
"@commitlint/cli@20.4.2":
resolution:
{
integrity: sha512-uuFKKpc7OtQM+6SRqT+a4kV818o1pS+uvv/gsRhyX7g4x495jg+Q7P0+O9VNGyLXBYP0syksS7gMRDJKcekr6A==,
integrity: sha512-YjYSX2yj/WsVoxh9mNiymfFS2ADbg2EK4+1WAsMuckwKMCqJ5PDG0CJU/8GvmHWcv4VRB2V02KqSiecRksWqZQ==,
}
engines: { node: ">=v18" }
hasBin: true
"@commitlint/config-conventional@20.4.1":
"@commitlint/config-conventional@20.4.2":
resolution:
{
integrity: sha512-0YUvIeBtpi86XriqrR+TCULVFiyYTIOEPjK7tTRMxjcBm1qlzb+kz7IF2WxL6Fq5DaundG8VO37BNgMkMTBwqA==,
integrity: sha512-rwkTF55q7Q+6dpSKUmJoScV0f3EpDlWKw2UPzklkLS4o5krMN1tPWAVOgHRtyUTMneIapLeQwaCjn44Td6OzBQ==,
}
engines: { node: ">=v18" }
@ -1187,10 +1187,10 @@ packages:
}
engines: { node: ">=v18" }
"@commitlint/lint@20.4.1":
"@commitlint/lint@20.4.2":
resolution:
{
integrity: sha512-g94LrGl/c6UhuhDQqNqU232aslLEN2vzc7MPfQTHzwzM4GHNnEAwVWWnh0zX8S5YXecuLXDwbCsoGwmpAgPWKA==,
integrity: sha512-buquzNRtFng6xjXvBU1abY/WPEEjCgUipNQrNmIWe8QuJ6LWLtei/LDBAzEe5ASm45+Q9L2Xi3/GVvlj50GAug==,
}
engines: { node: ">=v18" }
@ -1229,10 +1229,10 @@ packages:
}
engines: { node: ">=v18" }
"@commitlint/rules@20.4.1":
"@commitlint/rules@20.4.2":
resolution:
{
integrity: sha512-WtqypKEPbQEuJwJS4aKs0OoJRBKz1HXPBC9wRtzVNH68FLhPWzxXlF09hpUXM9zdYTpm4vAdoTGkWiBgQ/vL0g==,
integrity: sha512-oz83pnp5Yq6uwwTAabuVQPNlPfeD2Y5ZjMb7Wx8FSUlu4sLYJjbBWt8031Z0osCFPfHzAwSYrjnfDFKtuSMdKg==,
}
engines: { node: ">=v18" }
@ -2520,10 +2520,10 @@ packages:
}
engines: { node: ">= 20" }
"@octokit/endpoint@11.0.2":
"@octokit/endpoint@11.0.3":
resolution:
{
integrity: sha512-4zCpzP1fWc7QlqunZ5bSEjxc6yLAlRTnDwKtgXfcI/FxxGoqedDG8V2+xJ60bV2kODqcGB+nATdtap/XYq2NZQ==,
integrity: sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag==,
}
engines: { node: ">= 20" }
@ -2549,10 +2549,10 @@ packages:
peerDependencies:
"@octokit/core": ">=6"
"@octokit/plugin-retry@8.0.3":
"@octokit/plugin-retry@8.1.0":
resolution:
{
integrity: sha512-vKGx1i3MC0za53IzYBSBXcrhmd+daQDzuZfYDd52X5S0M2otf3kVZTVP8bLA3EkU0lTvd1WEC2OlNNa4G+dohA==,
integrity: sha512-O1FZgXeiGb2sowEr/hYTr6YunGdSAFWnr2fyW39Ah85H8O33ELASQxcvOFF5LE6Tjekcyu2ms4qAzJVhSaJxTw==,
}
engines: { node: ">= 20" }
peerDependencies:
@ -3487,10 +3487,10 @@ packages:
}
engines: { node: ">= 16" }
balanced-match@4.0.2:
balanced-match@4.0.3:
resolution:
{
integrity: sha512-x0K50QvKQ97fdEz2kPehIerj+YTeptKF9hyYkKf6egnwmMWAkADiO0QCzSp0R5xN8FTZgYaBfSaue46Ej62nMg==,
integrity: sha512-1pHv8LX9CpKut1Zp4EXey7Z8OfH11ONNH6Dhi2WDUt31VVZFXZzKwXcysBgqSumFCmR+0dqjMK5v5JiFHzi0+g==,
}
engines: { node: 20 || >=22 }
@ -3506,11 +3506,12 @@ packages:
integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==,
}
baseline-browser-mapping@2.9.19:
baseline-browser-mapping@2.10.0:
resolution:
{
integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==,
integrity: sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==,
}
engines: { node: ">=6.0.0" }
hasBin: true
before-after-hook@4.0.0:
@ -5161,10 +5162,10 @@ packages:
}
engines: { node: 6.* || 8.* || >= 10.* }
get-east-asian-width@1.4.0:
get-east-asian-width@1.5.0:
resolution:
{
integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==,
integrity: sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==,
}
engines: { node: ">=18" }
@ -5337,10 +5338,10 @@ packages:
}
engines: { node: ">=18" }
globby@16.1.0:
globby@16.1.1:
resolution:
{
integrity: sha512-+A4Hq7m7Ze592k9gZRy4gJ27DrXRNnC1vPjxTt1qQxEY8RxagBkBxivkCwg7FxSTG0iLLEMaUx13oOr0R2/qcQ==,
integrity: sha512-dW7vl+yiAJSp6aCekaVnVJxurRv7DCOLyXqEG3RYMYUg7AuJ2jCqPkZTA8ooqC2vtnkaMcV5WfFBMuEnTu1OQg==,
}
engines: { node: ">=20" }
@ -5439,10 +5440,10 @@ packages:
}
engines: { node: ">= 0.4" }
hashery@1.4.0:
hashery@1.5.0:
resolution:
{
integrity: sha512-Wn2i1In6XFxl8Az55kkgnFRiAlIAushzh26PTjL2AKtQcEfXrcLa7Hn5QOWGZEf3LU057P9TwwZjFyxfS1VuvQ==,
integrity: sha512-nhQ6ExaOIqti2FDWoEMWARUqIKyjr2VcZzXShrI+A3zpeiuPWzx6iPftt44LhP74E5sW36B75N6VHbvRtpvO6Q==,
}
engines: { node: ">=20" }
@ -6543,10 +6544,10 @@ packages:
engines: { node: ">= 18" }
hasBin: true
marked@17.0.2:
marked@17.0.3:
resolution:
{
integrity: sha512-s5HZGFQea7Huv5zZcAGhJLT3qLpAfnY7v7GWkICUr0+Wd5TFEtdlRR2XUL5Gg+RH7u2Df595ifrxR03mBaw7gA==,
integrity: sha512-jt1v2ObpyOKR8p4XaUJVk3YWRJ5n+i4+rjQopxvV32rSndTJXvIzuUdWWIy/1pFQMkQmvTXawzDNqOH/CUmx6A==,
}
engines: { node: ">= 20" }
hasBin: true
@ -6705,10 +6706,10 @@ packages:
integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==,
}
minipass@7.1.2:
minipass@7.1.3:
resolution:
{
integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==,
integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==,
}
engines: { node: ">=16 || 14 >=14.17" }
@ -8737,10 +8738,10 @@ packages:
}
engines: { node: ">=18" }
string-width@8.1.1:
string-width@8.2.0:
resolution:
{
integrity: sha512-KpqHIdDL9KwYk22wEOg/VIqYbrnLeSApsKT/bSj6Ez7pn3CftUiLAv2Lccpq1ALcpLV9UX1Ppn92npZWu2w/aw==,
integrity: sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==,
}
engines: { node: ">=20" }
@ -10646,7 +10647,7 @@ snapshots:
"@cacheable/utils@2.3.4":
dependencies:
hashery: 1.4.0
hashery: 1.5.0
keyv: 5.6.0
"@codemirror/autocomplete@6.20.0":
@ -10737,10 +10738,10 @@ snapshots:
"@colors/colors@1.5.0":
optional: true
"@commitlint/cli@20.4.1(@types/node@24.7.0)(typescript@5.9.3)":
"@commitlint/cli@20.4.2(@types/node@24.7.0)(typescript@5.9.3)":
dependencies:
"@commitlint/format": 20.4.0
"@commitlint/lint": 20.4.1
"@commitlint/lint": 20.4.2
"@commitlint/load": 20.4.0(@types/node@24.7.0)(typescript@5.9.3)
"@commitlint/read": 20.4.0
"@commitlint/types": 20.4.0
@ -10750,7 +10751,7 @@ snapshots:
- "@types/node"
- typescript
"@commitlint/config-conventional@20.4.1":
"@commitlint/config-conventional@20.4.2":
dependencies:
"@commitlint/types": 20.4.0
conventional-changelog-conventionalcommits: 9.1.0
@ -10781,11 +10782,11 @@ snapshots:
"@commitlint/types": 20.4.0
semver: 7.7.4
"@commitlint/lint@20.4.1":
"@commitlint/lint@20.4.2":
dependencies:
"@commitlint/is-ignored": 20.4.1
"@commitlint/parse": 20.4.1
"@commitlint/rules": 20.4.1
"@commitlint/rules": 20.4.2
"@commitlint/types": 20.4.0
"@commitlint/load@20.4.0(@types/node@24.7.0)(typescript@5.9.3)":
@ -10828,7 +10829,7 @@ snapshots:
lodash.mergewith: 4.6.2
resolve-from: 5.0.0
"@commitlint/rules@20.4.1":
"@commitlint/rules@20.4.2":
dependencies:
"@commitlint/ensure": 20.4.1
"@commitlint/message": 20.4.0
@ -11476,7 +11477,7 @@ snapshots:
"@keyv/bigmap@1.3.1(keyv@5.6.0)":
dependencies:
hashery: 1.4.0
hashery: 1.5.0
hookified: 1.15.1
keyv: 5.6.0
@ -11552,7 +11553,7 @@ snapshots:
before-after-hook: 4.0.0
universal-user-agent: 7.0.3
"@octokit/endpoint@11.0.2":
"@octokit/endpoint@11.0.3":
dependencies:
"@octokit/types": 16.0.0
universal-user-agent: 7.0.3
@ -11570,7 +11571,7 @@ snapshots:
"@octokit/core": 7.0.6
"@octokit/types": 16.0.0
"@octokit/plugin-retry@8.0.3(@octokit/core@7.0.6)":
"@octokit/plugin-retry@8.1.0(@octokit/core@7.0.6)":
dependencies:
"@octokit/core": 7.0.6
"@octokit/request-error": 7.1.0
@ -11589,7 +11590,7 @@ snapshots:
"@octokit/request@10.0.7":
dependencies:
"@octokit/endpoint": 11.0.2
"@octokit/endpoint": 11.0.3
"@octokit/request-error": 7.1.0
"@octokit/types": 16.0.0
fast-content-type-parse: 3.0.0
@ -11811,7 +11812,7 @@ snapshots:
dependencies:
"@octokit/core": 7.0.6
"@octokit/plugin-paginate-rest": 14.0.0(@octokit/core@7.0.6)
"@octokit/plugin-retry": 8.0.3(@octokit/core@7.0.6)
"@octokit/plugin-retry": 8.1.0(@octokit/core@7.0.6)
"@octokit/plugin-throttling": 11.0.3(@octokit/core@7.0.6)
"@semantic-release/error": 4.0.0
aggregate-error: 5.0.0
@ -12196,15 +12197,13 @@ snapshots:
balanced-match@3.0.1: {}
balanced-match@4.0.2:
dependencies:
jackspeak: 4.2.3
balanced-match@4.0.3: {}
base64-js@1.3.1: {}
base64-js@1.5.1: {}
baseline-browser-mapping@2.9.19: {}
baseline-browser-mapping@2.10.0: {}
before-after-hook@4.0.0: {}
@ -12233,7 +12232,7 @@ snapshots:
brace-expansion@5.0.2:
dependencies:
balanced-match: 4.0.2
balanced-match: 4.0.3
braces@3.0.3:
dependencies:
@ -12245,7 +12244,7 @@ snapshots:
browserslist@4.28.1:
dependencies:
baseline-browser-mapping: 2.9.19
baseline-browser-mapping: 2.10.0
caniuse-lite: 1.0.30001770
electron-to-chromium: 1.5.286
node-releases: 2.0.27
@ -12387,7 +12386,7 @@ snapshots:
cli-truncate@5.1.1:
dependencies:
slice-ansi: 7.1.2
string-width: 8.1.1
string-width: 8.2.0
cli-width@3.0.0: {}
@ -13290,7 +13289,7 @@ snapshots:
get-caller-file@2.0.5: {}
get-east-asian-width@1.4.0: {}
get-east-asian-width@1.5.0: {}
get-intrinsic@1.3.0:
dependencies:
@ -13357,14 +13356,14 @@ snapshots:
foreground-child: 3.3.1
jackspeak: 4.2.3
minimatch: 10.2.1
minipass: 7.1.2
minipass: 7.1.3
package-json-from-dist: 1.0.1
path-scurry: 2.0.1
glob@13.0.5:
dependencies:
minimatch: 10.2.1
minipass: 7.1.2
minipass: 7.1.3
path-scurry: 2.0.1
glob@7.2.3:
@ -13422,7 +13421,7 @@ snapshots:
slash: 5.1.0
unicorn-magic: 0.3.0
globby@16.1.0:
globby@16.1.1:
dependencies:
"@sindresorhus/merge-streams": 4.0.0
fast-glob: 3.3.3
@ -13485,7 +13484,7 @@ snapshots:
dependencies:
has-symbols: 1.1.0
hashery@1.4.0:
hashery@1.5.0:
dependencies:
hookified: 1.15.1
@ -13709,7 +13708,7 @@ snapshots:
is-fullwidth-code-point@5.1.0:
dependencies:
get-east-asian-width: 1.4.0
get-east-asian-width: 1.5.0
is-generator-function@1.1.2:
dependencies:
@ -14053,7 +14052,7 @@ snapshots:
marked@15.0.12: {}
marked@17.0.2: {}
marked@17.0.3: {}
math-intrinsics@1.1.0: {}
@ -14112,7 +14111,7 @@ snapshots:
minimist@1.2.8: {}
minipass@7.1.2: {}
minipass@7.1.3: {}
mitt@3.0.1: {}
@ -14373,7 +14372,7 @@ snapshots:
path-scurry@2.0.1:
dependencies:
lru-cache: 11.2.6
minipass: 7.1.2
minipass: 7.1.3
path-type@4.0.0: {}
@ -15363,12 +15362,12 @@ snapshots:
string-width@7.2.0:
dependencies:
emoji-regex: 10.6.0
get-east-asian-width: 1.4.0
get-east-asian-width: 1.5.0
strip-ansi: 7.1.2
string-width@8.1.1:
string-width@8.2.0:
dependencies:
get-east-asian-width: 1.4.0
get-east-asian-width: 1.5.0
strip-ansi: 7.1.2
string.prototype.matchall@4.0.12:
@ -15484,7 +15483,7 @@ snapshots:
fastest-levenshtein: 1.0.16
file-entry-cache: 11.1.2
global-modules: 2.0.0
globby: 16.1.0
globby: 16.1.1
globjoin: 0.1.4
html-tags: 5.1.0
ignore: 7.0.5
@ -15501,7 +15500,7 @@ snapshots:
postcss-safe-parser: 7.0.1(postcss@8.5.6)
postcss-selector-parser: 7.1.1
postcss-value-parser: 4.2.0
string-width: 8.1.1
string-width: 8.2.0
supports-hyperlinks: 4.4.0
svg-tags: 1.0.0
table: 6.9.0

View file

@ -11,7 +11,7 @@ use Config\Paths;
*---------------------------------------------------------------
*/
$minPhpVersion = '8.4'; // If you update this, don't forget to update `spark`.
$minPhpVersion = '8.5'; // If you update this, don't forget to update `spark`.
if (version_compare(PHP_VERSION, $minPhpVersion, '<')) {
$message = sprintf(
'Your PHP version must be %s or higher to run CodeIgniter. Current version: %s',

View file

@ -17,8 +17,8 @@ use Rector\ValueObject\PhpVersion;
return RectorConfig::configure()
->withPaths([__DIR__ . '/app', __DIR__ . '/modules', __DIR__ . '/tests', __DIR__ . '/public'])
->withBootstrapFiles([__DIR__ . '/vendor/codeigniter4/framework/system/Test/bootstrap.php'])
->withPhpVersion(PhpVersion::PHP_84)
->withPhpSets(php84: true)
->withPhpVersion(PhpVersion::PHP_85)
->withPhpSets(php85: true)
->withPreparedSets(
typeDeclarations: true,
codeQuality: true,

2
spark
View file

@ -40,7 +40,7 @@ if (str_starts_with(PHP_SAPI, 'cgi')) {
*---------------------------------------------------------------
*/
$minPhpVersion = '8.4'; // If you update this, don't forget to update `public/index.php`.
$minPhpVersion = '8.5'; // If you update this, don't forget to update `public/index.php`.
if (version_compare(PHP_VERSION, $minPhpVersion, '<')) {
$message = sprintf(
'Your PHP version must be %s or higher to run CodeIgniter. Current version: %s',

View file

@ -19,7 +19,7 @@ class ExampleModel extends Model
protected $primaryKey = 'id';
/**
* @var string
* @var 'object'
*/
protected $returnType = 'object';