From d388388dbe5e99560e164172ce11b9e5d8cc2f32 Mon Sep 17 00:00:00 2001 From: ping-yee <611077101@mail.nknu.edu.tw> Date: Fri, 1 Sep 2023 03:31:50 +0800 Subject: [PATCH 001/209] fix: The close function not only delete the lock from redis but also need to clear the variable value. --- system/Session/Handlers/RedisHandler.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/Session/Handlers/RedisHandler.php b/system/Session/Handlers/RedisHandler.php index a85a16c68ca5..815e3644984b 100644 --- a/system/Session/Handlers/RedisHandler.php +++ b/system/Session/Handlers/RedisHandler.php @@ -223,7 +223,7 @@ public function close(): bool if (($pingReply === true) || ($pingReply === '+PONG')) { if (isset($this->lockKey)) { - $this->redis->del($this->lockKey); + $this->releaseLock(); } if (! $this->redis->close()) { From 2b33a11b13c1ad95691f17719812f8054dbfe74a Mon Sep 17 00:00:00 2001 From: ping-yee <611077101@mail.nknu.edu.tw> Date: Fri, 1 Sep 2023 12:42:44 +0800 Subject: [PATCH 002/209] test: Add the testcase for the case. --- .../Handlers/Database/RedisHandlerTest.php | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tests/system/Session/Handlers/Database/RedisHandlerTest.php b/tests/system/Session/Handlers/Database/RedisHandlerTest.php index d7acb0dbf56d..94d17461d243 100644 --- a/tests/system/Session/Handlers/Database/RedisHandlerTest.php +++ b/tests/system/Session/Handlers/Database/RedisHandlerTest.php @@ -168,4 +168,26 @@ public function testGC(): void $handler = $this->getInstance(); $this->assertSame(1, $handler->gc(3600)); } + + /** + * See https://github.com/codeigniter4/CodeIgniter4/issues/7695 + */ + public function testSecondaryReadAfterClose(): void + { + $handler = $this->getInstance(); + $handler->open($this->sessionSavePath, $this->sessionName); + + $expected = <<<'DATA' + __ci_last_regenerate|i:1664607454;_ci_previous_url|s:32:"http://localhost:8080/index.php/";key|s:5:"value"; + DATA; + $this->assertSame($expected, $handler->read('555556b43phsnnf8if6bo33b635e4447')); + + $handler->close(); + + $handler->open($this->sessionSavePath, $this->sessionName); + + $this->assertSame($expected, $handler->read('555556b43phsnnf8if6bo33b635e4447')); + + $handler->close(); + } } From 036a0a815537df0c1c9bee2f0315daa98529d1f5 Mon Sep 17 00:00:00 2001 From: kenjis Date: Sun, 27 Aug 2023 16:03:13 +0900 Subject: [PATCH 003/209] docs: replace type mixed in DB Utils --- system/Database/BaseUtils.php | 4 ++-- system/Database/MySQLi/Utils.php | 2 +- system/Database/OCI8/Utils.php | 2 +- system/Database/Postgre/Utils.php | 2 +- system/Database/SQLSRV/Utils.php | 2 +- system/Database/SQLite3/Utils.php | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/system/Database/BaseUtils.php b/system/Database/BaseUtils.php index b75a3b540003..d26bde154e02 100644 --- a/system/Database/BaseUtils.php +++ b/system/Database/BaseUtils.php @@ -260,7 +260,7 @@ public function getXMLFromResult(ResultInterface $query, array $params = []): st * * @param array|string $params * - * @return mixed + * @return false|never|string * * @throws DatabaseException */ @@ -316,7 +316,7 @@ public function backup($params = []) /** * Platform dependent version of the backup function. * - * @return mixed + * @return false|never|string */ abstract public function _backup(?array $prefs = null); } diff --git a/system/Database/MySQLi/Utils.php b/system/Database/MySQLi/Utils.php index 3fea64a0ebaf..08989f75dda8 100644 --- a/system/Database/MySQLi/Utils.php +++ b/system/Database/MySQLi/Utils.php @@ -36,7 +36,7 @@ class Utils extends BaseUtils /** * Platform dependent version of the backup function. * - * @return mixed + * @return never */ public function _backup(?array $prefs = null) { diff --git a/system/Database/OCI8/Utils.php b/system/Database/OCI8/Utils.php index 870306d8b8b1..2f3a3304ea3e 100644 --- a/system/Database/OCI8/Utils.php +++ b/system/Database/OCI8/Utils.php @@ -29,7 +29,7 @@ class Utils extends BaseUtils /** * Platform dependent version of the backup function. * - * @return mixed + * @return never */ public function _backup(?array $prefs = null) { diff --git a/system/Database/Postgre/Utils.php b/system/Database/Postgre/Utils.php index ba1df5d3b52a..516104ec951d 100644 --- a/system/Database/Postgre/Utils.php +++ b/system/Database/Postgre/Utils.php @@ -36,7 +36,7 @@ class Utils extends BaseUtils /** * Platform dependent version of the backup function. * - * @return mixed + * @return never */ public function _backup(?array $prefs = null) { diff --git a/system/Database/SQLSRV/Utils.php b/system/Database/SQLSRV/Utils.php index 22a12bcdf02a..ae52ae40a76b 100755 --- a/system/Database/SQLSRV/Utils.php +++ b/system/Database/SQLSRV/Utils.php @@ -44,7 +44,7 @@ public function __construct(ConnectionInterface $db) /** * Platform dependent version of the backup function. * - * @return mixed + * @return never */ public function _backup(?array $prefs = null) { diff --git a/system/Database/SQLite3/Utils.php b/system/Database/SQLite3/Utils.php index f0cc5dfcf2dc..b8f45dd54196 100644 --- a/system/Database/SQLite3/Utils.php +++ b/system/Database/SQLite3/Utils.php @@ -29,7 +29,7 @@ class Utils extends BaseUtils /** * Platform dependent version of the backup function. * - * @return mixed + * @return never */ public function _backup(?array $prefs = null) { From ca5d39ebfc7625088a69c1e6c8a982e0f9d31bec Mon Sep 17 00:00:00 2001 From: kenjis Date: Tue, 5 Sep 2023 10:10:12 +0900 Subject: [PATCH 004/209] docs: add changelog and upgrade for v4.4.2 --- user_guide_src/source/changelogs/index.rst | 1 + user_guide_src/source/changelogs/v4.4.2.rst | 29 +++++++++++ .../source/installation/upgrade_442.rst | 50 +++++++++++++++++++ .../source/installation/upgrading.rst | 1 + 4 files changed, 81 insertions(+) create mode 100644 user_guide_src/source/changelogs/v4.4.2.rst create mode 100644 user_guide_src/source/installation/upgrade_442.rst diff --git a/user_guide_src/source/changelogs/index.rst b/user_guide_src/source/changelogs/index.rst index dd0ac6db1034..73eab706433f 100644 --- a/user_guide_src/source/changelogs/index.rst +++ b/user_guide_src/source/changelogs/index.rst @@ -12,6 +12,7 @@ See all the changes. .. toctree:: :titlesonly: + v4.4.2 v4.4.1 v4.4.0 v4.3.8 diff --git a/user_guide_src/source/changelogs/v4.4.2.rst b/user_guide_src/source/changelogs/v4.4.2.rst new file mode 100644 index 000000000000..dae668909711 --- /dev/null +++ b/user_guide_src/source/changelogs/v4.4.2.rst @@ -0,0 +1,29 @@ +Version 4.4.2 +############# + +Release Date: Unreleased + +**4.4.2 release of CodeIgniter4** + +.. contents:: + :local: + :depth: 3 + +BREAKING +******** + +Message Changes +*************** + +Changes +******* + +Deprecations +************ + +Bugs Fixed +********** + +See the repo's +`CHANGELOG.md `_ +for a complete list of bugs fixed. diff --git a/user_guide_src/source/installation/upgrade_442.rst b/user_guide_src/source/installation/upgrade_442.rst new file mode 100644 index 000000000000..aefce9c51f2f --- /dev/null +++ b/user_guide_src/source/installation/upgrade_442.rst @@ -0,0 +1,50 @@ +############################# +Upgrading from 4.4.1 to 4.4.2 +############################# + +Please refer to the upgrade instructions corresponding to your installation method. + +- :ref:`Composer Installation App Starter Upgrading ` +- :ref:`Composer Installation Adding CodeIgniter4 to an Existing Project Upgrading ` +- :ref:`Manual Installation Upgrading ` + +.. contents:: + :local: + :depth: 2 + +Mandatory File Changes +********************** + +Breaking Changes +**************** + +Breaking Enhancements +********************* + +Project Files +************* + +Some files in the **project space** (root, app, public, writable) received updates. Due to +these files being outside of the **system** scope they will not be changed without your intervention. + +There are some third-party CodeIgniter modules available to assist with merging changes to +the project space: `Explore on Packagist `_. + +Content Changes +=============== + +The following files received significant changes (including deprecations or visual adjustments) +and it is recommended that you merge the updated versions with your application: + +Config +------ + +- @TODO + +All Changes +=========== + +This is a list of all files in the **project space** that received changes; +many will be simple comments or formatting that have no effect on the runtime: + +- @TODO diff --git a/user_guide_src/source/installation/upgrading.rst b/user_guide_src/source/installation/upgrading.rst index 210b1499c8bb..9f9e17528052 100644 --- a/user_guide_src/source/installation/upgrading.rst +++ b/user_guide_src/source/installation/upgrading.rst @@ -16,6 +16,7 @@ See also :doc:`./backward_compatibility_notes`. backward_compatibility_notes + upgrade_442 upgrade_441 upgrade_440 upgrade_438 From 630819f99deaf84646fb2b6b8f6a634a468d3eca Mon Sep 17 00:00:00 2001 From: kenjis Date: Tue, 5 Sep 2023 10:13:16 +0900 Subject: [PATCH 005/209] docs: update RELEASE.md --- admin/RELEASE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin/RELEASE.md b/admin/RELEASE.md index 226f0ad3397c..776c1f70a941 100644 --- a/admin/RELEASE.md +++ b/admin/RELEASE.md @@ -79,7 +79,7 @@ the existing content. * fill in the "All Changes" section, and add it to **upgrading.rst** * git diff --name-status origin/master -- . ':!system' * Remove the section titles that have no items - * Update the "from" version in the title. E.g., `from 4.3.x` → `from 4.3.8` + * [Minor version only] Update the "from" version in the title. E.g., `from 4.3.x` → `from 4.3.8` * Commit the changes with `Prep for 4.x.x release` and push to origin * Create a new PR from `release-4.x.x` to `develop`: * Title: `Prep for 4.x.x release` From 4b3f577cff03bb0ac45775a47eaa0b2fb7980296 Mon Sep 17 00:00:00 2001 From: kenjis Date: Mon, 4 Sep 2023 15:39:03 +0900 Subject: [PATCH 006/209] docs: add empty lines --- user_guide_src/source/dbmgmt/migration.rst | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/user_guide_src/source/dbmgmt/migration.rst b/user_guide_src/source/dbmgmt/migration.rst index 874d276632e1..93dacf93529e 100644 --- a/user_guide_src/source/dbmgmt/migration.rst +++ b/user_guide_src/source/dbmgmt/migration.rst @@ -67,9 +67,13 @@ Database Groups A migration will only be run against a single database group. If you have multiple groups defined in **app/Config/Database.php**, then it will run against the ``$defaultGroup`` as specified -in that same configuration file. There may be times when you need different schemas for different +in that same configuration file. + +There may be times when you need different schemas for different database groups. Perhaps you have one database that is used for all general site information, while -another database is used for mission critical data. You can ensure that migrations are run only +another database is used for mission critical data. + +You can ensure that migrations are run only against the proper group by setting the ``$DBGroup`` property on your migration. This name must match the name of the database group exactly: From 2c59aa9782af7e4df224edd2780c0f58d6faad66 Mon Sep 17 00:00:00 2001 From: kenjis Date: Mon, 4 Sep 2023 15:39:39 +0900 Subject: [PATCH 007/209] docs: fix text decration --- user_guide_src/source/dbmgmt/migration.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user_guide_src/source/dbmgmt/migration.rst b/user_guide_src/source/dbmgmt/migration.rst index 93dacf93529e..5f90d41815cf 100644 --- a/user_guide_src/source/dbmgmt/migration.rst +++ b/user_guide_src/source/dbmgmt/migration.rst @@ -120,7 +120,7 @@ Migrates a database group with all available migrations: You can use (migrate) with the following options: - ``-g`` - to chose database group, otherwise default database group will be used. -- ``-n`` - to choose namespace, otherwise (App) namespace will be used. +- ``-n`` - to choose namespace, otherwise ``App`` namespace will be used. - ``--all`` - to migrate all namespaces to the latest migration. This example will migrate ``Acme\Blog`` namespace with any new migrations on the test database group: @@ -168,7 +168,7 @@ Refreshes the database state by first rolling back all migrations, and then migr You can use (refresh) with the following options: - ``-g`` - to choose database group, otherwise default database group will be used. -- ``-n`` - to choose namespace, otherwise (App) namespace will be used. +- ``-n`` - to choose namespace, otherwise ``App`` namespace will be used. - ``--all`` - to refresh all namespaces. - ``-f`` - to force a bypass confirmation question, it is only asked in a production environment. From 6cc94db4fa8c677babc405eda1faaaff9c92b58a Mon Sep 17 00:00:00 2001 From: kenjis Date: Mon, 4 Sep 2023 15:40:12 +0900 Subject: [PATCH 008/209] docs: fix descripton for -g option in `spark migrate` --- user_guide_src/source/dbmgmt/migration.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/dbmgmt/migration.rst b/user_guide_src/source/dbmgmt/migration.rst index 5f90d41815cf..70f4f4cbe4ea 100644 --- a/user_guide_src/source/dbmgmt/migration.rst +++ b/user_guide_src/source/dbmgmt/migration.rst @@ -119,7 +119,7 @@ Migrates a database group with all available migrations: You can use (migrate) with the following options: -- ``-g`` - to chose database group, otherwise default database group will be used. +- ``-g`` - to specify database group. If specified, only migrations for the specified database group will be run. If not specified, all migrations will be run. - ``-n`` - to choose namespace, otherwise ``App`` namespace will be used. - ``--all`` - to migrate all namespaces to the latest migration. From 710649f57f3f46ae68ce3e4274d87bfad01a62cb Mon Sep 17 00:00:00 2001 From: kenjis Date: Mon, 4 Sep 2023 16:00:25 +0900 Subject: [PATCH 009/209] fix: remove `-g` option in `migrate:rollback` Rollback specifies a batch number and returns the database to that state. It is not possible to specify a specific group to return to a state. --- system/Commands/Database/MigrateRollback.php | 6 ------ system/Database/MigrationRunner.php | 10 +++------- user_guide_src/source/dbmgmt/migration.rst | 3 +-- 3 files changed, 4 insertions(+), 15 deletions(-) diff --git a/system/Commands/Database/MigrateRollback.php b/system/Commands/Database/MigrateRollback.php index c29ce84be443..c104a81fd9fa 100644 --- a/system/Commands/Database/MigrateRollback.php +++ b/system/Commands/Database/MigrateRollback.php @@ -58,7 +58,6 @@ class MigrateRollback extends BaseCommand */ protected $options = [ '-b' => 'Specify a batch to roll back to; e.g. "3" to return to batch #3', - '-g' => 'Set database group', '-f' => 'Force command - this option allows you to bypass the confirmation question when running this command in a production environment', ]; @@ -79,11 +78,6 @@ public function run(array $params) } $runner = Services::migrations(); - $group = $params['g'] ?? CLI::getOption('g'); - - if (is_string($group)) { - $runner->setGroup($group); - } try { $batch = $params['b'] ?? CLI::getOption('b') ?? $runner->getLastBatch() - 1; diff --git a/system/Database/MigrationRunner.php b/system/Database/MigrationRunner.php index eda6bb582e80..241a9e6da5fa 100644 --- a/system/Database/MigrationRunner.php +++ b/system/Database/MigrationRunner.php @@ -220,9 +220,10 @@ public function latest(?string $group = null) * * Calls each migration step required to get to the provided batch * - * @param int $targetBatch Target batch number, or negative for a relative batch, 0 for all + * @param int $targetBatch Target batch number, or negative for a relative batch, 0 for all + * @param string|null $group Deprecated. The designation has no effect. * - * @return mixed Current batch number on success, FALSE on failure or no migrations are found + * @return bool True on success, FALSE on failure or no migrations are found * * @throws ConfigException * @throws RuntimeException @@ -233,11 +234,6 @@ public function regress(int $targetBatch = 0, ?string $group = null) throw ConfigException::forDisabledMigrations(); } - // Set database group if not null - if ($group !== null) { - $this->setGroup($group); - } - $this->ensureTable(); $batches = $this->getBatches(); diff --git a/user_guide_src/source/dbmgmt/migration.rst b/user_guide_src/source/dbmgmt/migration.rst index 70f4f4cbe4ea..10492b94d7ce 100644 --- a/user_guide_src/source/dbmgmt/migration.rst +++ b/user_guide_src/source/dbmgmt/migration.rst @@ -144,7 +144,7 @@ to minimize any potential conflicts between the main application and any modules rollback ======== -Rolls back all migrations, taking the database group to a blank slate, effectively migration 0: +Rolls back all migrations to a blank slate, effectively migration 0: .. code-block:: console @@ -152,7 +152,6 @@ Rolls back all migrations, taking the database group to a blank slate, effective You can use (rollback) with the following options: -- ``-g`` - to choose database group, otherwise default database group will be used. - ``-b`` - to choose a batch: natural numbers specify the batch. - ``-f`` - to force a bypass confirmation question, it is only asked in a production environment. From ec9d7531a5a4eee8020bd12a278e442c1e1b4603 Mon Sep 17 00:00:00 2001 From: kenjis Date: Mon, 4 Sep 2023 16:06:16 +0900 Subject: [PATCH 010/209] docs: fix descriptions for `-g` option --- user_guide_src/source/dbmgmt/migration.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user_guide_src/source/dbmgmt/migration.rst b/user_guide_src/source/dbmgmt/migration.rst index 10492b94d7ce..175c85fe9da0 100644 --- a/user_guide_src/source/dbmgmt/migration.rst +++ b/user_guide_src/source/dbmgmt/migration.rst @@ -166,7 +166,7 @@ Refreshes the database state by first rolling back all migrations, and then migr You can use (refresh) with the following options: -- ``-g`` - to choose database group, otherwise default database group will be used. +- ``-g`` - to specify database group. If specified, only migrations for the specified database group will be run. If not specified, all migrations will be run. - ``-n`` - to choose namespace, otherwise ``App`` namespace will be used. - ``--all`` - to refresh all namespaces. - ``-f`` - to force a bypass confirmation question, it is only asked in a production environment. @@ -192,7 +192,7 @@ Displays a list of all migrations and the date and time they ran, or '--' if the You can use (status) with the following options: -- ``-g`` - to choose database group, otherwise default database group will be used. +- ``-g`` - to specify database group. If specified, only migrations for the specified database group will be checked. If not specified, all migrations will be checked. make:migration ============== From 6d94e2ec143cedb03bb09545b83ea5d7338704f4 Mon Sep 17 00:00:00 2001 From: kenjis Date: Mon, 4 Sep 2023 16:28:56 +0900 Subject: [PATCH 011/209] docs: fix out-of-dated explanation --- app/Config/Migrations.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/Config/Migrations.php b/app/Config/Migrations.php index 3c825667cf69..1dec8b9b3a40 100644 --- a/app/Config/Migrations.php +++ b/app/Config/Migrations.php @@ -25,9 +25,7 @@ class Migrations extends BaseConfig * * This is the name of the table that will store the current migrations state. * When migrations runs it will store in a database table which migration - * level the system is at. It then compares the migration level in this - * table to the $config['migration_version'] if they are not the same it - * will migrate up. This must be set. + * files have already been run. */ public string $table = 'migrations'; From f4c831537e3346895ee1a8bd076bdaf134e5f4b9 Mon Sep 17 00:00:00 2001 From: kenjis Date: Mon, 4 Sep 2023 16:33:12 +0900 Subject: [PATCH 012/209] docs: add description for migration table --- user_guide_src/source/dbmgmt/migration.rst | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/user_guide_src/source/dbmgmt/migration.rst b/user_guide_src/source/dbmgmt/migration.rst index 175c85fe9da0..4af207164b73 100644 --- a/user_guide_src/source/dbmgmt/migration.rst +++ b/user_guide_src/source/dbmgmt/migration.rst @@ -223,13 +223,15 @@ Migration Preferences The following is a table of all the config options for migrations, available in **app/Config/Migrations.php**. -========================== ====================== ========================== ============================================================= -Preference Default Options Description -========================== ====================== ========================== ============================================================= -**enabled** true true / false Enable or disable migrations. -**table** migrations None The table name for storing the schema version number. -**timestampFormat** Y-m-d-His\_ The format to use for timestamps when creating a migration. -========================== ====================== ========================== ============================================================= +==================== ============ ============= ============================================================= +Preference Default Options Description +==================== ============ ============= ============================================================= +**enabled** true true / false Enable or disable migrations. +**table** migrations None The table name for storing the schema version number. This + table is always created in the default database group + (``$defaultGroup``). +**timestampFormat** Y-m-d-His\_ The format to use for timestamps when creating a migration. +==================== ============ ============= ============================================================= *************** Class Reference From a58258f73b34bec4d66e7cd521384465b9918d5e Mon Sep 17 00:00:00 2001 From: kenjis Date: Tue, 5 Sep 2023 10:30:17 +0900 Subject: [PATCH 013/209] doc: add changelog --- user_guide_src/source/changelogs/v4.4.2.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/user_guide_src/source/changelogs/v4.4.2.rst b/user_guide_src/source/changelogs/v4.4.2.rst index dae668909711..3866a7664ee6 100644 --- a/user_guide_src/source/changelogs/v4.4.2.rst +++ b/user_guide_src/source/changelogs/v4.4.2.rst @@ -18,6 +18,11 @@ Message Changes Changes ******* +- **Database Migrations:** The ``-g`` option for the ``spark migrate:rollback`` + command was removed. It did not work from the beginning. Also, the rollback + command returns the database(s) state to a specified batch number and cannot + specify only a specific database group. + Deprecations ************ From ea425e29862f89bba90e265e1986eaf1bf9517e1 Mon Sep 17 00:00:00 2001 From: "John Paul E. Balandan, CPA" Date: Thu, 31 Aug 2023 13:37:45 +0800 Subject: [PATCH 014/209] fix: add types to View $filters and $plugins --- app/Config/View.php | 10 ++++-- phpstan-baseline.php | 35 -------------------- psalm-baseline.xml | 74 +++++++++++++++++++++++++++++++++++++++++- system/Config/View.php | 19 +++++++---- system/View/Parser.php | 8 +++-- 5 files changed, 100 insertions(+), 46 deletions(-) diff --git a/app/Config/View.php b/app/Config/View.php index 78cd547e3b8f..cf00863fb70b 100644 --- a/app/Config/View.php +++ b/app/Config/View.php @@ -5,6 +5,10 @@ use CodeIgniter\Config\View as BaseView; use CodeIgniter\View\ViewDecoratorInterface; +/** + * @phpstan-type ParserCallable (callable(mixed): mixed) + * @phpstan-type ParserCallableString (callable(mixed): mixed)&string + */ class View extends BaseView { /** @@ -30,7 +34,8 @@ class View extends BaseView * { title|esc(js) } * { created_on|date(Y-m-d)|esc(attr) } * - * @var array + * @var array + * @phpstan-var array */ public $filters = []; @@ -39,7 +44,8 @@ class View extends BaseView * by the core Parser by creating aliases that will be replaced with * any callable. Can be single or tag pair. * - * @var array + * @var array|callable|string> + * @phpstan-var array|ParserCallableString|ParserCallable> */ public $plugins = []; diff --git a/phpstan-baseline.php b/phpstan-baseline.php index ec5d6987990e..e3267ecafdca 100644 --- a/phpstan-baseline.php +++ b/phpstan-baseline.php @@ -1,16 +1,6 @@ '#^PHPDoc type array of property Config\\\\View\\:\\:\\$filters is not covariant with PHPDoc type array\\ of overridden property CodeIgniter\\\\Config\\\\View\\:\\:\\$filters\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/app/Config/View.php', -]; -$ignoreErrors[] = [ - 'message' => '#^PHPDoc type array of property Config\\\\View\\:\\:\\$plugins is not covariant with PHPDoc type array\\ of overridden property CodeIgniter\\\\Config\\\\View\\:\\:\\$plugins\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/app/Config/View.php', -]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\BaseModel\\:\\:chunk\\(\\) has parameter \\$userFunc with no signature specified for Closure\\.$#', 'count' => 1, @@ -256,26 +246,6 @@ 'count' => 1, 'path' => __DIR__ . '/system/ComposerScripts.php', ]; -$ignoreErrors[] = [ - 'message' => '#^Property CodeIgniter\\\\Config\\\\View\\:\\:\\$coreFilters type has no signature specified for callable\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/Config/View.php', -]; -$ignoreErrors[] = [ - 'message' => '#^Property CodeIgniter\\\\Config\\\\View\\:\\:\\$corePlugins type has no signature specified for callable\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/Config/View.php', -]; -$ignoreErrors[] = [ - 'message' => '#^Property CodeIgniter\\\\Config\\\\View\\:\\:\\$filters type has no signature specified for callable\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/Config/View.php', -]; -$ignoreErrors[] = [ - 'message' => '#^Property CodeIgniter\\\\Config\\\\View\\:\\:\\$plugins type has no signature specified for callable\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/Config/View.php', -]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Database\\\\BaseBuilder\\:\\:_whereIn\\(\\) has parameter \\$values with no signature specified for Closure\\.$#', 'count' => 1, @@ -1706,11 +1676,6 @@ 'count' => 1, 'path' => __DIR__ . '/system/View/Parser.php', ]; -$ignoreErrors[] = [ - 'message' => '#^Property Config\\\\View\\:\\:\\$plugins \\(array\\) on left side of \\?\\? is not nullable\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/View/Parser.php', -]; $ignoreErrors[] = [ 'message' => '#^Property CodeIgniter\\\\View\\\\Table\\:\\:\\$function type has no signature specified for callable\\.$#', 'count' => 1, diff --git a/psalm-baseline.xml b/psalm-baseline.xml index 3ede420d002c..379314e5093a 100644 --- a/psalm-baseline.xml +++ b/psalm-baseline.xml @@ -1,5 +1,15 @@ - + + + + ]]> + |ParserCallableString|ParserCallable>]]> + |ParserCallableString|ParserCallable>]]> + public $filters = []; + public $plugins = []; + public $plugins = []; + + $val @@ -27,6 +37,60 @@ $routeWithoutController + + + ]]> + |ParserCallableString|ParserCallable>]]> + |ParserCallableString|ParserCallable>]]> + '\abs', + 'capitalize' => '\CodeIgniter\View\Filters::capitalize', + 'date' => '\CodeIgniter\View\Filters::date', + 'date_modify' => '\CodeIgniter\View\Filters::date_modify', + 'default' => '\CodeIgniter\View\Filters::default', + 'esc' => '\CodeIgniter\View\Filters::esc', + 'excerpt' => '\CodeIgniter\View\Filters::excerpt', + 'highlight' => '\CodeIgniter\View\Filters::highlight', + 'highlight_code' => '\CodeIgniter\View\Filters::highlight_code', + 'limit_words' => '\CodeIgniter\View\Filters::limit_words', + 'limit_chars' => '\CodeIgniter\View\Filters::limit_chars', + 'local_currency' => '\CodeIgniter\View\Filters::local_currency', + 'local_number' => '\CodeIgniter\View\Filters::local_number', + 'lower' => '\strtolower', + 'nl2br' => '\CodeIgniter\View\Filters::nl2br', + 'number_format' => '\number_format', + 'prose' => '\CodeIgniter\View\Filters::prose', + 'round' => '\CodeIgniter\View\Filters::round', + 'strip_tags' => '\strip_tags', + 'title' => '\CodeIgniter\View\Filters::title', + 'upper' => '\strtoupper', + ];]]> + '\CodeIgniter\View\Plugins::cspScriptNonce', + 'csp_style_nonce' => '\CodeIgniter\View\Plugins::cspStyleNonce', + 'current_url' => '\CodeIgniter\View\Plugins::currentURL', + 'previous_url' => '\CodeIgniter\View\Plugins::previousURL', + 'mailto' => '\CodeIgniter\View\Plugins::mailto', + 'safe_mailto' => '\CodeIgniter\View\Plugins::safeMailto', + 'lang' => '\CodeIgniter\View\Plugins::lang', + 'validation_errors' => '\CodeIgniter\View\Plugins::validationErrors', + 'route' => '\CodeIgniter\View\Plugins::route', + 'siteURL' => '\CodeIgniter\View\Plugins::siteURL', + ];]]> + '\CodeIgniter\View\Plugins::cspScriptNonce', + 'csp_style_nonce' => '\CodeIgniter\View\Plugins::cspStyleNonce', + 'current_url' => '\CodeIgniter\View\Plugins::currentURL', + 'previous_url' => '\CodeIgniter\View\Plugins::previousURL', + 'mailto' => '\CodeIgniter\View\Plugins::mailto', + 'safe_mailto' => '\CodeIgniter\View\Plugins::safeMailto', + 'lang' => '\CodeIgniter\View\Plugins::lang', + 'validation_errors' => '\CodeIgniter\View\Plugins::validationErrors', + 'route' => '\CodeIgniter\View\Plugins::route', + 'siteURL' => '\CodeIgniter\View\Plugins::siteURL', + ];]]> + + db->transStatus]]> @@ -78,6 +142,14 @@ dom = &$this->domParser]]> + + + |ParserCallableString|ParserCallable>]]> + |ParserCallableString|ParserCallable>]]> + protected $plugins = []; + protected $plugins = []; + + $filters diff --git a/system/Config/View.php b/system/Config/View.php index de4ed62b936a..5a6a6404b69e 100644 --- a/system/Config/View.php +++ b/system/Config/View.php @@ -15,6 +15,9 @@ /** * View configuration + * + * @phpstan-type ParserCallable (callable(mixed): mixed) + * @phpstan-type ParserCallableString (callable(mixed): mixed)&string */ class View extends BaseConfig { @@ -34,8 +37,10 @@ class View extends BaseConfig * To prevent potential abuse, all filters MUST be defined here * in order for them to be available for use within the Parser. * + * @psalm-suppress UndefinedDocblockClass + * * @var array - * @phpstan-var array + * @phpstan-var array */ public $filters = []; @@ -44,8 +49,10 @@ class View extends BaseConfig * by the core Parser by creating aliases that will be replaced with * any callable. Can be single or tag pair. * - * @var array - * @phpstan-var array + * @psalm-suppress UndefinedDocblockClass + * + * @var array|callable|string> + * @phpstan-var array|ParserCallableString|ParserCallable> */ public $plugins = []; @@ -53,7 +60,7 @@ class View extends BaseConfig * Built-in View filters. * * @var array - * @phpstan-var array + * @phpstan-var array */ protected $coreFilters = [ 'abs' => '\abs', @@ -82,8 +89,8 @@ class View extends BaseConfig /** * Built-in View plugins. * - * @var array - * @phpstan-var array + * @var array|callable|string> + * @phpstan-var array|ParserCallableString|ParserCallable> */ protected $corePlugins = [ 'csp_script_nonce' => '\CodeIgniter\View\Plugins::cspScriptNonce', diff --git a/system/View/Parser.php b/system/View/Parser.php index b9abf91edb5f..84ff821540cb 100644 --- a/system/View/Parser.php +++ b/system/View/Parser.php @@ -19,6 +19,9 @@ /** * Class for parsing pseudo-vars + * + * @phpstan-type ParserCallable (callable(mixed): mixed) + * @phpstan-type ParserCallableString (callable(mixed): mixed)&string */ class Parser extends View { @@ -58,7 +61,8 @@ class Parser extends View /** * Stores any plugins registered at run-time. * - * @var array + * @var array|callable|string> + * @phpstan-var array|ParserCallableString|ParserCallable> */ protected $plugins = []; @@ -78,7 +82,7 @@ class Parser extends View public function __construct(ViewConfig $config, ?string $viewPath = null, $loader = null, ?bool $debug = null, ?LoggerInterface $logger = null) { // Ensure user plugins override core plugins. - $this->plugins = $config->plugins ?? []; + $this->plugins = $config->plugins; parent::__construct($config, $viewPath, $loader, $debug, $logger); } From 1520f30bb7dc2655ce5decc067875c3e4bfdd1d5 Mon Sep 17 00:00:00 2001 From: kenjis Date: Wed, 6 Sep 2023 09:02:53 +0900 Subject: [PATCH 015/209] test: add tests for site_url() and base_url() on CLI --- .../Helpers/URLHelper/SiteUrlCliTest.php | 333 ++++++++++++++++++ 1 file changed, 333 insertions(+) create mode 100644 tests/system/Helpers/URLHelper/SiteUrlCliTest.php diff --git a/tests/system/Helpers/URLHelper/SiteUrlCliTest.php b/tests/system/Helpers/URLHelper/SiteUrlCliTest.php new file mode 100644 index 000000000000..c675cd326272 --- /dev/null +++ b/tests/system/Helpers/URLHelper/SiteUrlCliTest.php @@ -0,0 +1,333 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Helpers\URLHelper; + +use CodeIgniter\Config\Factories; +use CodeIgniter\Config\Services; +use CodeIgniter\HTTP\CLIRequest; +use CodeIgniter\Test\CIUnitTestCase; +use Config\App; + +/** + * Since base_url() only slightly modifies + * site_url() these functions are tested + * simultaneously. + * + * @backupGlobals enabled + * + * @internal + * + * @group Others + */ +final class SiteUrlCliTest extends CIUnitTestCase +{ + private App $config; + + protected function setUp(): void + { + parent::setUp(); + + Services::reset(true); + + $this->config = new App(); + } + + protected function tearDown(): void + { + parent::tearDown(); + + $_SERVER = []; + } + + private function createRequest(?App $config = null): void + { + $config ??= new App(); + + $request = new CLIRequest($config); + Services::injectMock('request', $request); + + Factories::injectMock('config', 'App', $config); + } + + /** + * Takes a multitude of various config input and verifies + * that base_url() and site_url() return the expected result. + * + * @param string $baseURL + * @param string $indexPage + * @param string|null $scheme + * @param bool $secure + * @param string $path + * @param string $expectedSiteUrl + * @param string $expectedBaseUrl + * + * @dataProvider provideUrls + */ + public function testUrls( + $baseURL, + $indexPage, + $scheme, + $secure, + $path, + $expectedSiteUrl, + $expectedBaseUrl + ): void { + // Set the config + $this->config->baseURL = $baseURL; + $this->config->indexPage = $indexPage; + $this->config->forceGlobalSecureRequests = $secure; + + $this->createRequest($this->config); + + $this->assertSame($expectedSiteUrl, site_url($path, $scheme, $this->config)); + $this->assertSame($expectedBaseUrl, base_url($path, $scheme)); + } + + public static function provideUrls(): iterable + { + // baseURL, indexPage, scheme, secure, path, expectedSiteUrl, expectedBaseUrl + return [ + 'forceGlobalSecure' => [ + 'http://example.com/', + 'index.php', + null, + true, + '', + 'https://example.com/index.php', + 'https://example.com/', + ], + [ + 'http://example.com/', + 'index.php', + null, + false, + '', + 'http://example.com/index.php', + 'http://example.com/', + ], + 'baseURL missing /' => [ + 'http://example.com', + 'index.php', + null, + false, + '', + 'http://example.com/index.php', + 'http://example.com/', + ], + [ + 'http://example.com/', + '', + null, + false, + '', + 'http://example.com/', + 'http://example.com/', + ], + [ + 'http://example.com/', + 'banana.php', + null, + false, + '', + 'http://example.com/banana.php', + 'http://example.com/', + ], + [ + 'http://example.com/', + '', + null, + false, + 'abc', + 'http://example.com/abc', + 'http://example.com/abc', + ], + [ + 'http://example.com/', + '', + null, + false, + '/abc', + 'http://example.com/abc', + 'http://example.com/abc', + ], + [ + 'http://example.com/', + '', + null, + false, + '/abc/', + 'http://example.com/abc/', + 'http://example.com/abc/', + ], + [ + 'http://example.com/', + '', + null, + false, + '/abc/def', + 'http://example.com/abc/def', + 'http://example.com/abc/def', + ], + 'URL decode' => [ + 'http://example.com/', + '', + null, + false, + 'template/meet-%26-greet', + 'http://example.com/template/meet-&-greet', + 'http://example.com/template/meet-&-greet', + ], + 'URL encode' => [ + 'http://example.com/', + '', + null, + false, + 'alert', + 'http://example.com/%3Cs%3Ealert%3C/s%3E', + 'http://example.com/%3Cs%3Ealert%3C/s%3E', + ], + [ + 'http://example.com/public/', + 'index.php', + null, + false, + '', + 'http://example.com/public/index.php', + 'http://example.com/public/', + ], + [ + 'http://example.com/public/', + '', + null, + false, + '', + 'http://example.com/public/', + 'http://example.com/public/', + ], + [ + 'http://example.com/public', + '', + null, + false, + '', + 'http://example.com/public/', + 'http://example.com/public/', + ], + [ + 'http://example.com/public', + 'index.php', + null, + false, + '/', + 'http://example.com/public/index.php/', + 'http://example.com/public/', + ], + [ + 'http://example.com/public/', + 'index.php', + null, + false, + '/', + 'http://example.com/public/index.php/', + 'http://example.com/public/', + ], + [ + 'http://example.com/', + 'index.php', + null, + false, + 'foo', + 'http://example.com/index.php/foo', + 'http://example.com/foo', + ], + [ + 'http://example.com/', + 'index.php', + null, + false, + '0', + 'http://example.com/index.php/0', + 'http://example.com/0', + ], + [ + 'http://example.com/public', + 'index.php', + null, + false, + 'foo', + 'http://example.com/public/index.php/foo', + 'http://example.com/public/foo', + ], + [ + 'http://example.com/', + 'index.php', + null, + false, + 'foo?bar=bam', + 'http://example.com/index.php/foo?bar=bam', + 'http://example.com/foo?bar=bam', + ], + [ + 'http://example.com/', + 'index.php', + null, + false, + 'test#banana', + 'http://example.com/index.php/test#banana', + 'http://example.com/test#banana', + ], + [ + 'http://example.com/', + 'index.php', + 'ftp', + false, + 'foo', + 'ftp://example.com/index.php/foo', + 'ftp://example.com/foo', + ], + [ + 'http://example.com/', + 'index.php', + null, + false, + 'news/local/123', + 'http://example.com/index.php/news/local/123', + 'http://example.com/news/local/123', + ], + [ + 'http://example.com/', + 'index.php', + null, + false, + ['news', 'local', '123'], + 'http://example.com/index.php/news/local/123', + 'http://example.com/news/local/123', + ], + ]; + } + + public function testSiteURLWithEmptyStringScheme(): void + { + $this->config->baseURL = 'http://example.com/'; + $this->config->indexPage = 'index.php'; + $this->config->forceGlobalSecureRequests = false; + + $this->assertSame( + '//example.com/index.php/test', + site_url('test', '', $this->config) + ); + $this->assertSame( + '//example.com/img/test.jpg', + base_url('img/test.jpg', '') + ); + } +} From e0df5f2fcd1034b0790d48dd5c115d7edae96cf0 Mon Sep 17 00:00:00 2001 From: kenjis Date: Wed, 6 Sep 2023 09:04:46 +0900 Subject: [PATCH 016/209] fix: base_url()/site_url() does not work on CLI --- system/HTTP/CLIRequest.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/system/HTTP/CLIRequest.php b/system/HTTP/CLIRequest.php index ef10d101e05b..2605357f0224 100644 --- a/system/HTTP/CLIRequest.php +++ b/system/HTTP/CLIRequest.php @@ -71,6 +71,9 @@ public function __construct(App $config) ignore_user_abort(true); $this->parseCommand(); + + // Set SiteURI for this request + $this->uri = new SiteURI($config, $this->getPath()); } /** From c6830f9e7e427157e6cbace68397516fba43dac8 Mon Sep 17 00:00:00 2001 From: kenjis Date: Wed, 6 Sep 2023 11:17:03 +0900 Subject: [PATCH 017/209] docs: update Backward Compatibility Notes --- .../source/installation/backward_compatibility_notes.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/user_guide_src/source/installation/backward_compatibility_notes.rst b/user_guide_src/source/installation/backward_compatibility_notes.rst index e265d5a34968..9c9ad1ba6600 100644 --- a/user_guide_src/source/installation/backward_compatibility_notes.rst +++ b/user_guide_src/source/installation/backward_compatibility_notes.rst @@ -13,7 +13,8 @@ However, the code is not mature and bug fixes may break compatibility in minor r What are not Breaking Changes ***************************** -- The deprecated Config items are not covered by backwards compatibility (BC) promise. It may be removed in the next - **minor** version or later. +- The deprecated items are not covered by backwards compatibility (BC) promise. It may be removed in the next next + **minor** version or later. For example, if an item has been deprecated since 4.3.x, + it may be removed in 4.5.0. - System messages defined in **system/Language/en/** are strictly for internal framework use and are not covered by backwards compatibility (BC) promise. If developers are relying on language string output they should be checking it against the function call (``lang('...')``), not the content. - `Named arguments `_ are not covered by backwards compatibility (BC) promise. We may choose to rename method/function parameter names when necessary in order to improve the codebase. From be8dd92611dccd5784d6dc5c909dcf939bbf39d1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 6 Sep 2023 15:51:37 +0000 Subject: [PATCH 018/209] build(deps-dev): update rector/rector requirement from 0.18.1 to 0.18.2 Updates the requirements on [rector/rector](https://github.com/rectorphp/rector) to permit the latest version. - [Release notes](https://github.com/rectorphp/rector/releases) - [Commits](https://github.com/rectorphp/rector/compare/0.18.1...0.18.2) --- updated-dependencies: - dependency-name: rector/rector dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 9421a652fb7a..175b2c64d4b5 100644 --- a/composer.json +++ b/composer.json @@ -30,7 +30,7 @@ "phpunit/phpcov": "^8.2", "phpunit/phpunit": "^9.1", "predis/predis": "^1.1 || ^2.0", - "rector/rector": "0.18.1", + "rector/rector": "0.18.2", "vimeo/psalm": "^5.0" }, "suggest": { From f780dff73091162a9a833c34dd5817ef31972956 Mon Sep 17 00:00:00 2001 From: neznaika0 Date: Thu, 7 Sep 2023 09:03:20 +0300 Subject: [PATCH 019/209] docs: Note for destination folder --- user_guide_src/source/libraries/publisher.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/user_guide_src/source/libraries/publisher.rst b/user_guide_src/source/libraries/publisher.rst index bf4b256327c1..99531eacca5b 100644 --- a/user_guide_src/source/libraries/publisher.rst +++ b/user_guide_src/source/libraries/publisher.rst @@ -120,6 +120,8 @@ to keep up with. You can create a publication definition in your project to sync .. literalinclude:: publisher/009.php +.. note:: Directory ``$destination`` must be created before executing the command. + Now add the dependency via Composer and call ``spark publish`` to run the publication: .. code-block:: console From 090d32b181196952702527e427aab7eaea51879b Mon Sep 17 00:00:00 2001 From: neznaika0 Date: Thu, 7 Sep 2023 09:03:32 +0300 Subject: [PATCH 020/209] docs: Fix path for source variable --- user_guide_src/source/libraries/publisher/009.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/libraries/publisher/009.php b/user_guide_src/source/libraries/publisher/009.php index 1e840ce9da2c..f3c2fb21d5f2 100644 --- a/user_guide_src/source/libraries/publisher/009.php +++ b/user_guide_src/source/libraries/publisher/009.php @@ -13,7 +13,7 @@ class BootstrapPublisher extends Publisher * * @var string */ - protected $source = 'vendor/twbs/bootstrap/'; + protected $source = VENDORPATH . 'twbs/bootstrap/'; /** * FCPATH is always the default destination, From 1c4a5e8112a123bcb21e0db0c799bfcc6c2e6d15 Mon Sep 17 00:00:00 2001 From: Denny Septian Panggabean <97607754+ddevsr@users.noreply.github.com> Date: Thu, 7 Sep 2023 15:48:18 +0700 Subject: [PATCH 021/209] fix: dark mode timeline-open color text --- system/Debug/Toolbar/Views/toolbar.css | 3 +++ 1 file changed, 3 insertions(+) diff --git a/system/Debug/Toolbar/Views/toolbar.css b/system/Debug/Toolbar/Views/toolbar.css index 8a302b4019e9..dbcc16ca1492 100644 --- a/system/Debug/Toolbar/Views/toolbar.css +++ b/system/Debug/Toolbar/Views/toolbar.css @@ -532,6 +532,9 @@ #debug-bar .timeline .timer { background-color: #DD8615; } + #debug-bar .timeline .timeline-parent-open td { + color: #252525; + } .debug-view.show-view { border-color: #DD8615; } From ddcc7d831a0632074a62ff8074e08b19ee9ee124 Mon Sep 17 00:00:00 2001 From: Denny Septian Panggabean Date: Thu, 7 Sep 2023 16:05:48 +0700 Subject: [PATCH 022/209] fix: theme dark scss timeline-parent-open --- admin/css/debug-toolbar/_theme-dark.scss | 4 ++++ system/Debug/Toolbar/Views/toolbar.css | 3 +++ 2 files changed, 7 insertions(+) diff --git a/admin/css/debug-toolbar/_theme-dark.scss b/admin/css/debug-toolbar/_theme-dark.scss index ead7d02a58e3..79cf9d7a85ff 100644 --- a/admin/css/debug-toolbar/_theme-dark.scss +++ b/admin/css/debug-toolbar/_theme-dark.scss @@ -150,6 +150,10 @@ .timer { background-color: $g-orange; } + + .timeline-parent-open td { + color: #252525; + } } } diff --git a/system/Debug/Toolbar/Views/toolbar.css b/system/Debug/Toolbar/Views/toolbar.css index dbcc16ca1492..89555b4f7d40 100644 --- a/system/Debug/Toolbar/Views/toolbar.css +++ b/system/Debug/Toolbar/Views/toolbar.css @@ -647,6 +647,9 @@ #toolbarContainer.dark #debug-bar .timeline .timer { background-color: #DD8615; } +#toolbarContainer.dark #debug-bar .timeline .timeline-parent-open td { + color: #252525; +} #toolbarContainer.dark .debug-view.show-view { border-color: #DD8615; } From 7b901c5118efd8323a3546cd293096623c45f4ba Mon Sep 17 00:00:00 2001 From: Denny Septian Panggabean Date: Thu, 7 Sep 2023 16:07:36 +0700 Subject: [PATCH 023/209] fix: color hex to variable --- admin/css/debug-toolbar/_theme-dark.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin/css/debug-toolbar/_theme-dark.scss b/admin/css/debug-toolbar/_theme-dark.scss index 79cf9d7a85ff..5f68f8c20b5f 100644 --- a/admin/css/debug-toolbar/_theme-dark.scss +++ b/admin/css/debug-toolbar/_theme-dark.scss @@ -152,7 +152,7 @@ } .timeline-parent-open td { - color: #252525; + color: $t-dark; } } } From 1d5e56085114b01515563177cd60f1c7d7af551d Mon Sep 17 00:00:00 2001 From: neznaika0 Date: Thu, 7 Sep 2023 12:16:50 +0300 Subject: [PATCH 024/209] docs: Typo code-block --- user_guide_src/source/dbmgmt/db_commands.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/dbmgmt/db_commands.rst b/user_guide_src/source/dbmgmt/db_commands.rst index 53ef1cc52d06..2e5bdb9cd656 100644 --- a/user_guide_src/source/dbmgmt/db_commands.rst +++ b/user_guide_src/source/dbmgmt/db_commands.rst @@ -38,7 +38,7 @@ When you have a table named ``my_table``, you can see the field names and the re .. code-block:: console - .. code-block:: consolephp spark db:table my_table + php spark db:table my_table If the table ``my_table`` is not in the database, CodeIgniter displays a list of available tables to select. From b969769066187801e9de09d7346e7c387dba24e2 Mon Sep 17 00:00:00 2001 From: kenjis Date: Tue, 29 Aug 2023 11:04:10 +0900 Subject: [PATCH 025/209] docs: add sub section titles --- .../source/installation/running.rst | 63 +++++++++++-------- 1 file changed, 38 insertions(+), 25 deletions(-) diff --git a/user_guide_src/source/installation/running.rst b/user_guide_src/source/installation/running.rst index 7092b8f5d68a..7d3171584e79 100644 --- a/user_guide_src/source/installation/running.rst +++ b/user_guide_src/source/installation/running.rst @@ -25,31 +25,44 @@ section of the User Guide to begin learning how to build dynamic PHP application Initial Configuration ********************* -#. Open the **app/Config/App.php** file with a text editor and - set your base URL to ``$baseURL``. If you need more flexibility, the baseURL may - be set within the :ref:`.env ` file as ``app.baseURL = 'http://example.com/'``. - (Always use a trailing slash on your base URL!) - - .. note:: If you don't set the ``baseURL`` correctly, in development mode, - the debug toolbar may not load properly and web pages may take considerably - longer to display. - -#. If you intend to use a database, open the - **app/Config/Database.php** file with a text editor and set your - database settings. Alternately, these could be set in your **.env** file. -#. If it is not on the production server, set ``CI_ENVIRONMENT`` to ``development`` - in **.env** file to take advantage of the debugging tools provided. See - :ref:`setting-development-mode` for the detail. - - .. important:: In production environments, you should disable error display and - any other development-only functionality. In CodeIgniter, this can be done - by setting the environment to "production". By default, the application will - run using the "production" environment. See also :ref:`environment-constant`. - -.. note:: If you will be running your site using a web server (e.g., Apache or Nginx), - you will need to modify the permissions for the **writable** folder inside - your project, so that it is writable by the user or account used by your - web server. +Setting the Base URL of Your Site +================================= + +Open the **app/Config/App.php** file with a text editor and +set your base URL to ``$baseURL``. If you need more flexibility, the baseURL may +be set within the :ref:`.env ` file as ``app.baseURL = 'http://example.com/'``. +(Always use a trailing slash on your base URL!) + +.. note:: If you don't set the ``baseURL`` correctly, in development mode, + the debug toolbar may not load properly and web pages may take considerably + longer to display. + +Configure Database Connection Settings +====================================== + +If you intend to use a database, open the +**app/Config/Database.php** file with a text editor and set your +database settings. Alternately, these could be set in your **.env** file. + +Setting to Development Mode +=========================== + +If it is not on the production server, set ``CI_ENVIRONMENT`` to ``development`` +in **.env** file to take advantage of the debugging tools provided. See +:ref:`setting-development-mode` for the detail. + +.. important:: In production environments, you should disable error display and + any other development-only functionality. In CodeIgniter, this can be done + by setting the environment to "production". By default, the application will + run using the "production" environment. See also :ref:`environment-constant`. + +Setting Writable Folder Permission +================================== + +If you will be running your site using a web server (e.g., Apache or Nginx), +you will need to modify the permissions for the **writable** folder inside +your project, so that it is writable by the user or account used by your +web server. ************************ Local Development Server From 418aca7112dcacdc01707890bec7c5e61db8c439 Mon Sep 17 00:00:00 2001 From: kenjis Date: Tue, 29 Aug 2023 11:13:33 +0900 Subject: [PATCH 026/209] docs: replace Nginx with nginx It seems all lower case is the official. --- user_guide_src/source/general/environments.rst | 6 +++--- user_guide_src/source/general/urls.rst | 4 ++-- user_guide_src/source/installation/running.rst | 6 +++--- user_guide_src/source/tutorial/index.rst | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/user_guide_src/source/general/environments.rst b/user_guide_src/source/general/environments.rst index 3eaf2c5c3587..57e85c67c106 100644 --- a/user_guide_src/source/general/environments.rst +++ b/user_guide_src/source/general/environments.rst @@ -75,10 +75,10 @@ config using `SetEnv .. _environment-nginx: -Nginx +nginx ----- -Under Nginx, you must pass the environment variable through the ``fastcgi_params`` +Under nginx, you must pass the environment variable through the ``fastcgi_params`` in order for it to show up under the ``$_SERVER`` variable. This allows it to work on the virtual-host level, instead of using `env` to set it for the entire server, though that would work fine on a dedicated server. You would then modify your server config to something @@ -97,7 +97,7 @@ like: } } -Alternative methods are available for Nginx and other servers, or you can +Alternative methods are available for nginx and other servers, or you can remove this logic entirely and set the constant based on the server's IP address (for instance). diff --git a/user_guide_src/source/general/urls.rst b/user_guide_src/source/general/urls.rst index 69c3e4869f55..510cf0c59ec9 100644 --- a/user_guide_src/source/general/urls.rst +++ b/user_guide_src/source/general/urls.rst @@ -95,10 +95,10 @@ request for your index.php file. .. _urls-remove-index-php-nginx: -NGINX +nginx ----- -Under NGINX, you can define a location block and use the ``try_files`` directive to get the same effect as we did with +Under nginx, you can define a location block and use the ``try_files`` directive to get the same effect as we did with the above Apache configuration: .. code-block:: nginx diff --git a/user_guide_src/source/installation/running.rst b/user_guide_src/source/installation/running.rst index 7d3171584e79..e32145a0f825 100644 --- a/user_guide_src/source/installation/running.rst +++ b/user_guide_src/source/installation/running.rst @@ -59,7 +59,7 @@ in **.env** file to take advantage of the debugging tools provided. See Setting Writable Folder Permission ================================== -If you will be running your site using a web server (e.g., Apache or Nginx), +If you will be running your site using a web server (e.g., Apache or nginx), you will need to modify the permissions for the **writable** folder inside your project, so that it is writable by the user or account used by your web server. @@ -368,10 +368,10 @@ Setting Environment See :ref:`Handling Multiple Environments `. ****************** -Hosting with Nginx +Hosting with nginx ****************** -Nginx is the second most widely used HTTP server for web hosting. +nginx is the second most widely used HTTP server for web hosting. Here you can find an example configuration using PHP 8.1 FPM (unix sockets) under Ubuntu Server. default.conf diff --git a/user_guide_src/source/tutorial/index.rst b/user_guide_src/source/tutorial/index.rst index ce2ac3299ae7..e818a83f557e 100644 --- a/user_guide_src/source/tutorial/index.rst +++ b/user_guide_src/source/tutorial/index.rst @@ -92,7 +92,7 @@ Running Development Server ========================== With that out of the way it's time to view your application in a browser. You can -serve it through any server of your choice, Apache, Nginx, etc, but CodeIgniter +serve it through any server of your choice, Apache, nginx, etc, but CodeIgniter comes with a simple command that takes advantage of PHP's built-in server to get you up and running fast on your development machines. Type the following on the command line from the root of your project: From feb41e1d8bbe0ff926fd0ed76baac577049a80dd Mon Sep 17 00:00:00 2001 From: kenjis Date: Tue, 29 Aug 2023 11:18:39 +0900 Subject: [PATCH 027/209] docs: make description more accurate --- user_guide_src/source/general/urls.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/general/urls.rst b/user_guide_src/source/general/urls.rst index 510cf0c59ec9..963b7706e9b7 100644 --- a/user_guide_src/source/general/urls.rst +++ b/user_guide_src/source/general/urls.rst @@ -63,7 +63,7 @@ Query page=2 Removing the index.php file =========================== -By default, the **index.php** file will be included in your URLs:: +When you use Apache Web Server, by default, the **index.php** file will be needed in your URLs:: example.com/index.php/news/article/my_article From f9a09c022ae92fafdd40f787adff7ac091d546da Mon Sep 17 00:00:00 2001 From: kenjis Date: Tue, 29 Aug 2023 11:40:11 +0900 Subject: [PATCH 028/209] docs: add about indePage --- .../source/installation/running.rst | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/user_guide_src/source/installation/running.rst b/user_guide_src/source/installation/running.rst index e32145a0f825..fdae7f6d1fc1 100644 --- a/user_guide_src/source/installation/running.rst +++ b/user_guide_src/source/installation/running.rst @@ -28,14 +28,23 @@ Initial Configuration Setting the Base URL of Your Site ================================= -Open the **app/Config/App.php** file with a text editor and -set your base URL to ``$baseURL``. If you need more flexibility, the baseURL may -be set within the :ref:`.env ` file as ``app.baseURL = 'http://example.com/'``. -(Always use a trailing slash on your base URL!) - -.. note:: If you don't set the ``baseURL`` correctly, in development mode, - the debug toolbar may not load properly and web pages may take considerably - longer to display. +Open the **app/Config/App.php** file with a text editor. + +#. $baseURL + Set your base URL to ``$baseURL``. If you need more flexibility, the baseURL may + be set within the :ref:`.env ` file as ``app.baseURL = 'http://example.com/'``. + (Always use a trailing slash on your base URL!) + + .. note:: If you don't set the ``baseURL`` correctly, in development mode, + the debug toolbar may not load properly and web pages may take considerably + longer to display. + +#. $indexPage + If you don't want to include **index.php** in your site URIs, set ``$indexPage`` to ``''``. + The setting will be used when the framework generates your site URIs. + + .. note:: You may need to configure your web server to access your site with a URL + that does not contain **index.php**. See :ref:`CodeIgniter URLs `. Configure Database Connection Settings ====================================== From ee80cdc806ff26a4c406ee734bf6b3cf429ab958 Mon Sep 17 00:00:00 2001 From: kenjis Date: Tue, 29 Aug 2023 11:40:29 +0900 Subject: [PATCH 029/209] docs: change sub section titles --- user_guide_src/source/installation/running.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/user_guide_src/source/installation/running.rst b/user_guide_src/source/installation/running.rst index fdae7f6d1fc1..05348fd85fe8 100644 --- a/user_guide_src/source/installation/running.rst +++ b/user_guide_src/source/installation/running.rst @@ -25,8 +25,8 @@ section of the User Guide to begin learning how to build dynamic PHP application Initial Configuration ********************* -Setting the Base URL of Your Site -================================= +Configure for Your Site URIs +============================ Open the **app/Config/App.php** file with a text editor. @@ -53,8 +53,8 @@ If you intend to use a database, open the **app/Config/Database.php** file with a text editor and set your database settings. Alternately, these could be set in your **.env** file. -Setting to Development Mode -=========================== +Set to Development Mode +======================= If it is not on the production server, set ``CI_ENVIRONMENT`` to ``development`` in **.env** file to take advantage of the debugging tools provided. See @@ -65,8 +65,8 @@ in **.env** file to take advantage of the debugging tools provided. See by setting the environment to "production". By default, the application will run using the "production" environment. See also :ref:`environment-constant`. -Setting Writable Folder Permission -================================== +Set Writable Folder Permission +============================== If you will be running your site using a web server (e.g., Apache or nginx), you will need to modify the permissions for the **writable** folder inside From 559b09dad35f593d00fe85d50b29ea338bba144d Mon Sep 17 00:00:00 2001 From: kenjis Date: Fri, 8 Sep 2023 06:42:51 +0900 Subject: [PATCH 030/209] docs: make sentense bold --- user_guide_src/source/installation/running.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/installation/running.rst b/user_guide_src/source/installation/running.rst index 05348fd85fe8..2538cfee2d9a 100644 --- a/user_guide_src/source/installation/running.rst +++ b/user_guide_src/source/installation/running.rst @@ -33,7 +33,7 @@ Open the **app/Config/App.php** file with a text editor. #. $baseURL Set your base URL to ``$baseURL``. If you need more flexibility, the baseURL may be set within the :ref:`.env ` file as ``app.baseURL = 'http://example.com/'``. - (Always use a trailing slash on your base URL!) + **Always use a trailing slash on your base URL!** .. note:: If you don't set the ``baseURL`` correctly, in development mode, the debug toolbar may not load properly and web pages may take considerably From 5a85152a1f32165cc80142d02eb5b82c55baa926 Mon Sep 17 00:00:00 2001 From: kenjis Date: Fri, 8 Sep 2023 09:30:13 +0900 Subject: [PATCH 031/209] docs: improve description --- user_guide_src/source/incoming/filters.rst | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/user_guide_src/source/incoming/filters.rst b/user_guide_src/source/incoming/filters.rst index 1bde2fabbfb4..108364855d6f 100644 --- a/user_guide_src/source/incoming/filters.rst +++ b/user_guide_src/source/incoming/filters.rst @@ -79,7 +79,14 @@ the final output, or even to filter the final output with a bad words filter. Configuring Filters ******************* -Once you've created your filters, you need to configure when they get run. This is done in **app/Config/Filters.php** or **app/Config/Routes.php**. +There are two ways to configure filters when they get run. One is done in +**app/Config/Filters.php**, the other is done in **app/Config/Routes.php**. + +If you want to specify filter to a specific route, use **app/Config/Routes.php** +and see :ref:`URI Routing `. + +The filters that are specified to a route (in **app/Config/Routes.php**) are +executed before the filters specified in **app/Config/Filters.php**. .. Note:: The safest way to apply filters is to :ref:`disable auto-routing `, and :ref:`set filters to routes `. From 1d7f21c19f65f439241ed89d6d48e11a574ebfbc Mon Sep 17 00:00:00 2001 From: kenjis Date: Fri, 8 Sep 2023 09:33:31 +0900 Subject: [PATCH 032/209] docs: remove duplicated sub title --- user_guide_src/source/incoming/filters.rst | 3 --- 1 file changed, 3 deletions(-) diff --git a/user_guide_src/source/incoming/filters.rst b/user_guide_src/source/incoming/filters.rst index 108364855d6f..3965dce51b0e 100644 --- a/user_guide_src/source/incoming/filters.rst +++ b/user_guide_src/source/incoming/filters.rst @@ -170,9 +170,6 @@ a list of URI path (relative to BaseURL) patterns that filter should apply to: .. _filters-filters-filter-arguments: -Filter Arguments -================ - Filter Arguments ---------------- From 436457338c6640e7e7c8d5a012d3b8c3b0f6c094 Mon Sep 17 00:00:00 2001 From: kenjis Date: Fri, 8 Sep 2023 10:17:23 +0900 Subject: [PATCH 033/209] fix: deprecated code in PHP 8.3 Calling ReflectionProperty::setValue() with a 1st argument which is not null or an object is deprecated --- system/Test/ReflectionHelper.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/system/Test/ReflectionHelper.php b/system/Test/ReflectionHelper.php index 8ada8e76da59..4c25e3decd89 100644 --- a/system/Test/ReflectionHelper.php +++ b/system/Test/ReflectionHelper.php @@ -74,7 +74,12 @@ private static function getAccessibleRefProperty($obj, $property) public static function setPrivateProperty($obj, $property, $value) { $refProperty = self::getAccessibleRefProperty($obj, $property); - $refProperty->setValue($obj, $value); + + if (is_object($obj)) { + $refProperty->setValue($obj, $value); + } else { + $refProperty->setValue(null, $value); + } } /** From ddd2317bd0c7020b07793468e1fafdc96c89f09b Mon Sep 17 00:00:00 2001 From: kenjis Date: Fri, 8 Sep 2023 10:18:18 +0900 Subject: [PATCH 034/209] test: fix deprecated code in PHP 8.3 --- tests/system/CLI/CLITest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/system/CLI/CLITest.php b/tests/system/CLI/CLITest.php index e7a9264c8791..f0f455f8aeb7 100644 --- a/tests/system/CLI/CLITest.php +++ b/tests/system/CLI/CLITest.php @@ -438,13 +438,13 @@ public function testWindow(): void { $height = new ReflectionProperty(CLI::class, 'height'); $height->setAccessible(true); - $height->setValue(null); + $height->setValue(null, null); $this->assertIsInt(CLI::getHeight()); $width = new ReflectionProperty(CLI::class, 'width'); $width->setAccessible(true); - $width->setValue(null); + $width->setValue(null, null); $this->assertIsInt(CLI::getWidth()); } From a412fff274947b14d341e59d593d8ebd9cb8d26e Mon Sep 17 00:00:00 2001 From: kenjis Date: Fri, 8 Sep 2023 10:37:07 +0900 Subject: [PATCH 035/209] test: update expectation for highlight code in PHP 8.3 --- tests/system/Helpers/TextHelperTest.php | 9 ++++++++- tests/system/View/ParserFilterTest.php | 16 ++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/tests/system/Helpers/TextHelperTest.php b/tests/system/Helpers/TextHelperTest.php index 4d0295e11d46..60f3cc823ff7 100755 --- a/tests/system/Helpers/TextHelperTest.php +++ b/tests/system/Helpers/TextHelperTest.php @@ -263,7 +263,14 @@ public function testCensoredWordsNonReplacement(): void public function testHighlightCode(): void { - $expect = "\n<?php var_dump(\$this); ?> \n\n"; + // PHP 8.3 changes the output. + if (version_compare(PHP_VERSION, '8.3', '<')) { + $expect = "\n<?php var_dump(\$this); ?> \n\n"; + } else { + // PHP 8.3 + $expect = '
<?php var_dump($this); ?> ?>
'; + } + $this->assertSame($expect, highlight_code('')); } diff --git a/tests/system/View/ParserFilterTest.php b/tests/system/View/ParserFilterTest.php index 7b41da6060fa..a5b2b25b91dd 100644 --- a/tests/system/View/ParserFilterTest.php +++ b/tests/system/View/ParserFilterTest.php @@ -181,6 +181,22 @@ public function testHighlightCode(): void EOF; + + // PHP 8.3 changes the output. + if (version_compare(PHP_VERSION, '8.3', '<')) { + $expected = <<<'EOF' + + Sincerely  + + + EOF; + } else { + // PHP 8.3 + $expected = <<<'EOF' +
Sincerely ?>
+ EOF; + } + $this->assertSame($expected, $parser->renderString($template)); } From b46f2e0f8399f9c81271b82dfd2229591e334b8b Mon Sep 17 00:00:00 2001 From: kenjis Date: Fri, 8 Sep 2023 12:12:21 +0900 Subject: [PATCH 036/209] test: use PHP_VERSION_ID instead of PHP_VERSION Easier to read. --- tests/system/Helpers/TextHelperTest.php | 7 +++---- tests/system/View/ParserFilterTest.php | 11 +++++------ 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/tests/system/Helpers/TextHelperTest.php b/tests/system/Helpers/TextHelperTest.php index 60f3cc823ff7..2af7f1387529 100755 --- a/tests/system/Helpers/TextHelperTest.php +++ b/tests/system/Helpers/TextHelperTest.php @@ -264,11 +264,10 @@ public function testCensoredWordsNonReplacement(): void public function testHighlightCode(): void { // PHP 8.3 changes the output. - if (version_compare(PHP_VERSION, '8.3', '<')) { - $expect = "\n<?php var_dump(\$this); ?> \n\n"; - } else { - // PHP 8.3 + if (PHP_VERSION_ID >= 80300) { $expect = '
<?php var_dump($this); ?> ?>
'; + } else { + $expect = "\n<?php var_dump(\$this); ?> \n\n"; } $this->assertSame($expect, highlight_code('')); diff --git a/tests/system/View/ParserFilterTest.php b/tests/system/View/ParserFilterTest.php index a5b2b25b91dd..694f3252e539 100644 --- a/tests/system/View/ParserFilterTest.php +++ b/tests/system/View/ParserFilterTest.php @@ -183,18 +183,17 @@ public function testHighlightCode(): void EOF; // PHP 8.3 changes the output. - if (version_compare(PHP_VERSION, '8.3', '<')) { + if (PHP_VERSION_ID >= 80300) { + $expected = <<<'EOF' +
Sincerely ?>
+ EOF; + } else { $expected = <<<'EOF' Sincerely  EOF; - } else { - // PHP 8.3 - $expected = <<<'EOF' -
Sincerely ?>
- EOF; } $this->assertSame($expected, $parser->renderString($template)); From 56d89ecd64cdd29dbfd365ad7669a5947c8f8838 Mon Sep 17 00:00:00 2001 From: kenjis Date: Fri, 8 Sep 2023 12:48:51 +0900 Subject: [PATCH 037/209] test: use PHP_VERSION_ID instead of PHP_VERSION --- tests/system/Debug/TimerTest.php | 2 +- tests/system/Helpers/ArrayHelperTest.php | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/system/Debug/TimerTest.php b/tests/system/Debug/TimerTest.php index d99d877fc84a..54c9fdfccb18 100644 --- a/tests/system/Debug/TimerTest.php +++ b/tests/system/Debug/TimerTest.php @@ -172,7 +172,7 @@ public function testRecordThrowsException(): void public function testRecordThrowsErrorOnCallableWithParams(): void { - if (version_compare(PHP_VERSION, '8.0.0') >= 0) { + if (PHP_VERSION_ID >= 80000) { $this->expectException(ArgumentCountError::class); } else { $this->expectException(ErrorException::class); diff --git a/tests/system/Helpers/ArrayHelperTest.php b/tests/system/Helpers/ArrayHelperTest.php index 9a91c807c4b4..4844fe84188e 100644 --- a/tests/system/Helpers/ArrayHelperTest.php +++ b/tests/system/Helpers/ArrayHelperTest.php @@ -304,10 +304,10 @@ public function testArraySortByMultipleKeysFailsEmptyParameter(array $data, arra public function testArraySortByMultipleKeysFailsInconsistentArraySizes($data): void { // PHP 8 changes this error type - if (version_compare(PHP_VERSION, '8.0', '<')) { - $this->expectException(ErrorException::class); - } else { + if (PHP_VERSION_ID >= 80000) { $this->expectException(ValueError::class); + } else { + $this->expectException(ErrorException::class); } $this->expectExceptionMessage('Array sizes are inconsistent'); From 3312bcaa9fb494bb2fc0f1ef64041a17e44e5ad5 Mon Sep 17 00:00:00 2001 From: kenjis Date: Fri, 8 Sep 2023 14:02:46 +0900 Subject: [PATCH 038/209] docs: directory separator --- system/HTTP/IncomingRequest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/HTTP/IncomingRequest.php b/system/HTTP/IncomingRequest.php index 947f5cc4c668..0ce55f789abc 100755 --- a/system/HTTP/IncomingRequest.php +++ b/system/HTTP/IncomingRequest.php @@ -106,7 +106,7 @@ class IncomingRequest extends Request /** * The current locale of the application. - * Default value is set in Config\App.php + * Default value is set in app/Config/App.php * * @var string */ @@ -522,7 +522,7 @@ public function getLocale(): string } /** - * Returns the default locale as set in Config\App.php + * Returns the default locale as set in app/Config/App.php */ public function getDefaultLocale(): string { From 6329255a8beccb32fddcc0c09dafabb79b840f02 Mon Sep 17 00:00:00 2001 From: kenjis Date: Wed, 6 Sep 2023 18:13:24 +0900 Subject: [PATCH 039/209] docs: add "see test" annotations --- system/Autoloader/Autoloader.php | 2 ++ system/Autoloader/FileLocator.php | 2 ++ system/CLI/CLI.php | 2 ++ system/CLI/Console.php | 2 ++ system/Cache/CacheFactory.php | 2 ++ system/Cache/Handlers/BaseHandler.php | 2 ++ system/Cache/Handlers/DummyHandler.php | 2 ++ system/Cache/Handlers/FileHandler.php | 2 ++ system/Cache/Handlers/MemcachedHandler.php | 2 ++ system/Cache/Handlers/PredisHandler.php | 2 ++ system/Cache/Handlers/RedisHandler.php | 2 ++ system/Cache/ResponseCache.php | 2 ++ system/CodeIgniter.php | 2 ++ system/Commands/Database/MigrateStatus.php | 2 ++ system/Commands/Database/ShowTableInfo.php | 2 ++ system/Commands/Utilities/Namespaces.php | 2 ++ system/Commands/Utilities/Routes/AutoRouteCollector.php | 2 ++ .../Utilities/Routes/AutoRouterImproved/AutoRouteCollector.php | 2 ++ .../Routes/AutoRouterImproved/ControllerMethodReader.php | 2 ++ system/Commands/Utilities/Routes/ControllerFinder.php | 2 ++ system/Commands/Utilities/Routes/ControllerMethodReader.php | 2 ++ system/Commands/Utilities/Routes/FilterCollector.php | 2 ++ system/Commands/Utilities/Routes/FilterFinder.php | 2 ++ system/Commands/Utilities/Routes/SampleURIGenerator.php | 2 ++ system/Config/BaseConfig.php | 1 + system/Config/Config.php | 1 + system/Config/DotEnv.php | 2 ++ system/Config/Factories.php | 1 + system/Config/Services.php | 1 + system/Controller.php | 2 ++ system/Cookie/Cookie.php | 1 + system/Cookie/CookieStore.php | 1 + system/Database/BaseConnection.php | 1 + system/Database/Config.php | 2 ++ system/Database/ModelFactory.php | 1 + system/Database/RawSql.php | 3 +++ system/Debug/ExceptionHandler.php | 3 +++ system/Debug/Exceptions.php | 2 ++ system/Debug/Timer.php | 2 ++ system/Debug/Toolbar/Collectors/Database.php | 2 ++ system/Debug/Toolbar/Collectors/History.php | 2 ++ system/Email/Email.php | 2 ++ system/Encryption/Encryption.php | 2 ++ system/Encryption/Handlers/OpenSSLHandler.php | 2 ++ system/Encryption/Handlers/SodiumHandler.php | 1 + system/Entity/Entity.php | 2 ++ system/Events/Events.php | 2 ++ system/Files/File.php | 2 ++ system/Files/FileCollection.php | 1 + system/Filters/CSRF.php | 1 + system/Filters/DebugToolbar.php | 2 ++ system/Filters/Filters.php | 2 ++ system/Filters/Honeypot.php | 2 ++ system/Filters/InvalidChars.php | 2 ++ system/Filters/SecureHeaders.php | 2 ++ system/Format/Format.php | 2 ++ system/Format/JSONFormatter.php | 2 ++ system/Format/XMLFormatter.php | 2 ++ system/HTTP/CLIRequest.php | 2 ++ system/HTTP/CURLRequest.php | 2 ++ system/HTTP/ContentSecurityPolicy.php | 1 + system/HTTP/DownloadResponse.php | 2 ++ system/HTTP/Files/FileCollection.php | 2 ++ system/HTTP/Header.php | 2 ++ system/HTTP/IncomingRequest.php | 2 ++ system/HTTP/Message.php | 2 ++ system/HTTP/Negotiate.php | 1 + system/HTTP/OutgoingRequest.php | 2 ++ system/HTTP/RedirectResponse.php | 2 ++ system/HTTP/Request.php | 2 ++ system/HTTP/Response.php | 2 ++ system/HTTP/SiteURI.php | 2 ++ system/HTTP/SiteURIFactory.php | 2 ++ system/HTTP/URI.php | 2 ++ system/HTTP/UserAgent.php | 2 ++ system/Honeypot/Honeypot.php | 2 ++ system/HotReloader/DirectoryHasher.php | 1 + system/I18n/Time.php | 1 + system/I18n/TimeDifference.php | 2 ++ system/I18n/TimeLegacy.php | 1 + system/Images/Image.php | 2 ++ system/Language/Language.php | 2 ++ system/Log/Handlers/ChromeLoggerHandler.php | 1 + system/Log/Handlers/ErrorlogHandler.php | 2 ++ system/Log/Handlers/FileHandler.php | 2 ++ system/Log/Logger.php | 2 ++ system/Pager/Pager.php | 2 ++ system/Pager/PagerRenderer.php | 2 ++ system/Publisher/ContentReplacer.php | 2 ++ system/RESTful/ResourceController.php | 2 ++ system/RESTful/ResourcePresenter.php | 2 ++ system/Router/AutoRouterImproved.php | 2 ++ system/Router/DefinedRouteCollector.php | 2 ++ system/Router/RouteCollection.php | 1 + system/Router/Router.php | 2 ++ system/Security/Security.php | 2 ++ system/Session/Handlers/Database/MySQLiHandler.php | 2 ++ system/Session/Handlers/Database/PostgreHandler.php | 2 ++ system/Session/Session.php | 1 + system/Superglobals.php | 1 + system/Test/DOMParser.php | 2 ++ system/Test/Fabricator.php | 2 ++ system/Test/TestLogger.php | 3 +++ system/Test/TestResponse.php | 1 + system/Typography/Typography.php | 2 ++ system/Validation/CreditCardRules.php | 1 + system/Validation/DotArrayFilter.php | 3 +++ system/Validation/FileRules.php | 2 ++ system/Validation/FormatRules.php | 2 ++ system/Validation/Rules.php | 2 ++ system/Validation/StrictRules/CreditCardRules.php | 1 + system/Validation/StrictRules/FileRules.php | 2 ++ system/Validation/StrictRules/FormatRules.php | 2 ++ system/Validation/StrictRules/Rules.php | 2 ++ system/Validation/Validation.php | 2 ++ system/View/Cell.php | 2 ++ system/View/Parser.php | 2 ++ system/View/Table.php | 2 ++ system/View/View.php | 2 ++ 119 files changed, 219 insertions(+) diff --git a/system/Autoloader/Autoloader.php b/system/Autoloader/Autoloader.php index d5c155685e12..dcddec1d2976 100644 --- a/system/Autoloader/Autoloader.php +++ b/system/Autoloader/Autoloader.php @@ -53,6 +53,8 @@ * // register the autoloader * $loader->register(); * ``` + * + * @see \CodeIgniter\Autoloader\AutoloaderTest */ class Autoloader { diff --git a/system/Autoloader/FileLocator.php b/system/Autoloader/FileLocator.php index a4f7c67677d0..bc18bd31b980 100644 --- a/system/Autoloader/FileLocator.php +++ b/system/Autoloader/FileLocator.php @@ -14,6 +14,8 @@ /** * Allows loading non-class files in a namespaced manner. * Works with Helpers, Views, etc. + * + * @see \CodeIgniter\Autoloader\FileLocatorTest */ class FileLocator { diff --git a/system/CLI/CLI.php b/system/CLI/CLI.php index 112a662d35ac..7e0376e6b6f1 100644 --- a/system/CLI/CLI.php +++ b/system/CLI/CLI.php @@ -33,6 +33,8 @@ * The wait() method is mostly testable, as long as you don't give it * an argument of "0". * These have been flagged to ignore for code coverage purposes. + * + * @see \CodeIgniter\CLI\CLITest */ class CLI { diff --git a/system/CLI/Console.php b/system/CLI/Console.php index 01c15eea3fad..0ea7eae22c7f 100644 --- a/system/CLI/Console.php +++ b/system/CLI/Console.php @@ -17,6 +17,8 @@ /** * Console + * + * @see \CodeIgniter\CLI\ConsoleTest */ class Console { diff --git a/system/Cache/CacheFactory.php b/system/Cache/CacheFactory.php index 0810653b7318..95e07ef813c8 100644 --- a/system/Cache/CacheFactory.php +++ b/system/Cache/CacheFactory.php @@ -18,6 +18,8 @@ /** * A factory for loading the desired + * + * @see \CodeIgniter\Cache\CacheFactoryTest */ class CacheFactory { diff --git a/system/Cache/Handlers/BaseHandler.php b/system/Cache/Handlers/BaseHandler.php index 74a4482cd4d9..c12b330bc469 100644 --- a/system/Cache/Handlers/BaseHandler.php +++ b/system/Cache/Handlers/BaseHandler.php @@ -19,6 +19,8 @@ /** * Base class for cache handling + * + * @see \CodeIgniter\Cache\Handlers\BaseHandlerTest */ abstract class BaseHandler implements CacheInterface { diff --git a/system/Cache/Handlers/DummyHandler.php b/system/Cache/Handlers/DummyHandler.php index 4349db4f39a5..d2d4fb068bba 100644 --- a/system/Cache/Handlers/DummyHandler.php +++ b/system/Cache/Handlers/DummyHandler.php @@ -15,6 +15,8 @@ /** * Dummy cache handler + * + * @see \CodeIgniter\Cache\Handlers\DummyHandlerTest */ class DummyHandler extends BaseHandler { diff --git a/system/Cache/Handlers/FileHandler.php b/system/Cache/Handlers/FileHandler.php index aea0a605c47f..e22543d27891 100644 --- a/system/Cache/Handlers/FileHandler.php +++ b/system/Cache/Handlers/FileHandler.php @@ -18,6 +18,8 @@ /** * File system cache handler + * + * @see \CodeIgniter\Cache\Handlers\FileHandlerTest */ class FileHandler extends BaseHandler { diff --git a/system/Cache/Handlers/MemcachedHandler.php b/system/Cache/Handlers/MemcachedHandler.php index a998ad30386f..e8658906392a 100644 --- a/system/Cache/Handlers/MemcachedHandler.php +++ b/system/Cache/Handlers/MemcachedHandler.php @@ -20,6 +20,8 @@ /** * Mamcached cache handler + * + * @see \CodeIgniter\Cache\Handlers\MemcachedHandlerTest */ class MemcachedHandler extends BaseHandler { diff --git a/system/Cache/Handlers/PredisHandler.php b/system/Cache/Handlers/PredisHandler.php index e549a7422c91..4e06b85bc8ce 100644 --- a/system/Cache/Handlers/PredisHandler.php +++ b/system/Cache/Handlers/PredisHandler.php @@ -20,6 +20,8 @@ /** * Predis cache handler + * + * @see \CodeIgniter\Cache\Handlers\PredisHandlerTest */ class PredisHandler extends BaseHandler { diff --git a/system/Cache/Handlers/RedisHandler.php b/system/Cache/Handlers/RedisHandler.php index d86d9f980d41..9d1ddf3c15d4 100644 --- a/system/Cache/Handlers/RedisHandler.php +++ b/system/Cache/Handlers/RedisHandler.php @@ -19,6 +19,8 @@ /** * Redis cache handler + * + * @see \CodeIgniter\Cache\Handlers\RedisHandlerTest */ class RedisHandler extends BaseHandler { diff --git a/system/Cache/ResponseCache.php b/system/Cache/ResponseCache.php index 44da42947633..3f66284a6cf5 100644 --- a/system/Cache/ResponseCache.php +++ b/system/Cache/ResponseCache.php @@ -19,6 +19,8 @@ /** * Web Page Caching + * + * @see \CodeIgniter\Cache\ResponseCacheTest */ final class ResponseCache { diff --git a/system/CodeIgniter.php b/system/CodeIgniter.php index 6ef3ab8261b2..e017d6b9ccc2 100644 --- a/system/CodeIgniter.php +++ b/system/CodeIgniter.php @@ -46,6 +46,8 @@ * This class is the core of the framework, and will analyse the * request, route it to a controller, and send back the response. * Of course, there are variations to that flow, but this is the brains. + * + * @see \CodeIgniter\CodeIgniterTest */ class CodeIgniter { diff --git a/system/Commands/Database/MigrateStatus.php b/system/Commands/Database/MigrateStatus.php index 8b0885a659b1..af3cbacf772c 100644 --- a/system/Commands/Database/MigrateStatus.php +++ b/system/Commands/Database/MigrateStatus.php @@ -17,6 +17,8 @@ /** * Displays a list of all migrations and whether they've been run or not. + * + * @see \CodeIgniter\Commands\Database\MigrateStatusTest */ class MigrateStatus extends BaseCommand { diff --git a/system/Commands/Database/ShowTableInfo.php b/system/Commands/Database/ShowTableInfo.php index 4666a54ca888..07aa60c961ca 100644 --- a/system/Commands/Database/ShowTableInfo.php +++ b/system/Commands/Database/ShowTableInfo.php @@ -18,6 +18,8 @@ /** * Get table data if it exists in the database. + * + * @see \CodeIgniter\Commands\Database\ShowTableInfoTest */ class ShowTableInfo extends BaseCommand { diff --git a/system/Commands/Utilities/Namespaces.php b/system/Commands/Utilities/Namespaces.php index b8193c219572..ef37736c56b8 100644 --- a/system/Commands/Utilities/Namespaces.php +++ b/system/Commands/Utilities/Namespaces.php @@ -20,6 +20,8 @@ * Lists namespaces set in Config\Autoload with their * full server path. Helps you to verify that you have * the namespaces setup correctly. + * + * @see \CodeIgniter\Commands\Utilities\NamespacesTest */ class Namespaces extends BaseCommand { diff --git a/system/Commands/Utilities/Routes/AutoRouteCollector.php b/system/Commands/Utilities/Routes/AutoRouteCollector.php index a2fa46c497e9..ee331332291b 100644 --- a/system/Commands/Utilities/Routes/AutoRouteCollector.php +++ b/system/Commands/Utilities/Routes/AutoRouteCollector.php @@ -13,6 +13,8 @@ /** * Collects data for auto route listing. + * + * @see \CodeIgniter\Commands\Utilities\Routes\AutoRouteCollectorTest */ final class AutoRouteCollector { diff --git a/system/Commands/Utilities/Routes/AutoRouterImproved/AutoRouteCollector.php b/system/Commands/Utilities/Routes/AutoRouterImproved/AutoRouteCollector.php index 2b6096016f7e..0b9089ce2ade 100644 --- a/system/Commands/Utilities/Routes/AutoRouterImproved/AutoRouteCollector.php +++ b/system/Commands/Utilities/Routes/AutoRouterImproved/AutoRouteCollector.php @@ -16,6 +16,8 @@ /** * Collects data for Auto Routing Improved. + * + * @see \CodeIgniter\Commands\Utilities\Routes\AutoRouterImproved\AutoRouteCollectorTest */ final class AutoRouteCollector { diff --git a/system/Commands/Utilities/Routes/AutoRouterImproved/ControllerMethodReader.php b/system/Commands/Utilities/Routes/AutoRouterImproved/ControllerMethodReader.php index c91219c13a8e..74b268befe7d 100644 --- a/system/Commands/Utilities/Routes/AutoRouterImproved/ControllerMethodReader.php +++ b/system/Commands/Utilities/Routes/AutoRouterImproved/ControllerMethodReader.php @@ -16,6 +16,8 @@ /** * Reads a controller and returns a list of auto route listing. + * + * @see \CodeIgniter\Commands\Utilities\Routes\AutoRouterImproved\ControllerMethodReaderTest */ final class ControllerMethodReader { diff --git a/system/Commands/Utilities/Routes/ControllerFinder.php b/system/Commands/Utilities/Routes/ControllerFinder.php index e7d828c0fe57..f801d531fa92 100644 --- a/system/Commands/Utilities/Routes/ControllerFinder.php +++ b/system/Commands/Utilities/Routes/ControllerFinder.php @@ -16,6 +16,8 @@ /** * Finds all controllers in a namespace for auto route listing. + * + * @see \CodeIgniter\Commands\Utilities\Routes\ControllerFinderTest */ final class ControllerFinder { diff --git a/system/Commands/Utilities/Routes/ControllerMethodReader.php b/system/Commands/Utilities/Routes/ControllerMethodReader.php index 27bdad046a99..eb0152dec623 100644 --- a/system/Commands/Utilities/Routes/ControllerMethodReader.php +++ b/system/Commands/Utilities/Routes/ControllerMethodReader.php @@ -16,6 +16,8 @@ /** * Reads a controller and returns a list of auto route listing. + * + * @see \CodeIgniter\Commands\Utilities\Routes\ControllerMethodReaderTest */ final class ControllerMethodReader { diff --git a/system/Commands/Utilities/Routes/FilterCollector.php b/system/Commands/Utilities/Routes/FilterCollector.php index 71bbd1b083b3..fcb9b1512835 100644 --- a/system/Commands/Utilities/Routes/FilterCollector.php +++ b/system/Commands/Utilities/Routes/FilterCollector.php @@ -19,6 +19,8 @@ /** * Collects filters for a route. + * + * @see \CodeIgniter\Commands\Utilities\Routes\FilterCollectorTest */ final class FilterCollector { diff --git a/system/Commands/Utilities/Routes/FilterFinder.php b/system/Commands/Utilities/Routes/FilterFinder.php index 0cdea8c42744..2e5da617e795 100644 --- a/system/Commands/Utilities/Routes/FilterFinder.php +++ b/system/Commands/Utilities/Routes/FilterFinder.php @@ -20,6 +20,8 @@ /** * Finds filters. + * + * @see \CodeIgniter\Commands\Utilities\Routes\FilterFinderTest */ final class FilterFinder { diff --git a/system/Commands/Utilities/Routes/SampleURIGenerator.php b/system/Commands/Utilities/Routes/SampleURIGenerator.php index 984e50abd0e2..38b333fd33c2 100644 --- a/system/Commands/Utilities/Routes/SampleURIGenerator.php +++ b/system/Commands/Utilities/Routes/SampleURIGenerator.php @@ -16,6 +16,8 @@ /** * Generate a sample URI path from route key regex. + * + * @see \CodeIgniter\Commands\Utilities\Routes\SampleURIGeneratorTest */ final class SampleURIGenerator { diff --git a/system/Config/BaseConfig.php b/system/Config/BaseConfig.php index d2c396dc36ba..87166737e746 100644 --- a/system/Config/BaseConfig.php +++ b/system/Config/BaseConfig.php @@ -28,6 +28,7 @@ * These can be set within the .env file. * * @phpstan-consistent-constructor + * @see \CodeIgniter\Config\BaseConfigTest */ class BaseConfig { diff --git a/system/Config/Config.php b/system/Config/Config.php index 3008865b29fa..90a6b7cadef5 100644 --- a/system/Config/Config.php +++ b/system/Config/Config.php @@ -13,6 +13,7 @@ /** * @deprecated Use CodeIgniter\Config\Factories::config() + * @see \CodeIgniter\Config\ConfigTest */ class Config { diff --git a/system/Config/DotEnv.php b/system/Config/DotEnv.php index 0275b5c4b9c3..05ecab900c3e 100644 --- a/system/Config/DotEnv.php +++ b/system/Config/DotEnv.php @@ -15,6 +15,8 @@ /** * Environment-specific configuration + * + * @see \CodeIgniter\Config\DotEnvTest */ class DotEnv { diff --git a/system/Config/Factories.php b/system/Config/Factories.php index 6db25549dca9..b455969049e2 100644 --- a/system/Config/Factories.php +++ b/system/Config/Factories.php @@ -26,6 +26,7 @@ * * @method static BaseConfig|null config(...$arguments) * @method static Model|null models(string $alias, array $options = [], ?ConnectionInterface &$conn = null) + * @see \CodeIgniter\Config\FactoriesTest */ class Factories { diff --git a/system/Config/Services.php b/system/Config/Services.php index 720bb3c487ce..10972bd84ff0 100644 --- a/system/Config/Services.php +++ b/system/Config/Services.php @@ -104,6 +104,7 @@ * * @see http://blog.ircmaxell.com/2015/11/simple-easy-risk-and-change.html * @see http://www.infoq.com/presentations/Simple-Made-Easy + * @see \CodeIgniter\Config\ServicesTest */ class Services extends BaseService { diff --git a/system/Controller.php b/system/Controller.php index 038bc8ee7a78..45fe0e499565 100644 --- a/system/Controller.php +++ b/system/Controller.php @@ -22,6 +22,8 @@ /** * Class Controller + * + * @see \CodeIgniter\ControllerTest */ class Controller { diff --git a/system/Cookie/Cookie.php b/system/Cookie/Cookie.php index 08dfff2c303f..69e40017bb65 100644 --- a/system/Cookie/Cookie.php +++ b/system/Cookie/Cookie.php @@ -39,6 +39,7 @@ * ``` * * @template-implements ArrayAccess + * @see \CodeIgniter\Cookie\CookieTest */ class Cookie implements ArrayAccess, CloneableCookieInterface { diff --git a/system/Cookie/CookieStore.php b/system/Cookie/CookieStore.php index 6bf7f003194e..d893a4add116 100644 --- a/system/Cookie/CookieStore.php +++ b/system/Cookie/CookieStore.php @@ -21,6 +21,7 @@ * The CookieStore object represents an immutable collection of `Cookie` value objects. * * @implements IteratorAggregate + * @see \CodeIgniter\Cookie\CookieStoreTest */ class CookieStore implements Countable, IteratorAggregate { diff --git a/system/Database/BaseConnection.php b/system/Database/BaseConnection.php index 670dd0494984..1116d3966439 100644 --- a/system/Database/BaseConnection.php +++ b/system/Database/BaseConnection.php @@ -50,6 +50,7 @@ * @template TResult * * @implements ConnectionInterface + * @see \CodeIgniter\Database\BaseConnectionTest */ abstract class BaseConnection implements ConnectionInterface { diff --git a/system/Database/Config.php b/system/Database/Config.php index f34d0395bc69..62fa79202d26 100644 --- a/system/Database/Config.php +++ b/system/Database/Config.php @@ -17,6 +17,8 @@ /** * Class Config + * + * @see \CodeIgniter\Database\ConfigTest */ class Config extends BaseConfig { diff --git a/system/Database/ModelFactory.php b/system/Database/ModelFactory.php index ae088124d9f7..76a30e6c1d30 100644 --- a/system/Database/ModelFactory.php +++ b/system/Database/ModelFactory.php @@ -19,6 +19,7 @@ * @deprecated Use CodeIgniter\Config\Factories::models() * * @codeCoverageIgnore + * @see \CodeIgniter\Database\ModelFactoryTest */ class ModelFactory { diff --git a/system/Database/RawSql.php b/system/Database/RawSql.php index 7ecb7fd378ae..efa97d30736c 100644 --- a/system/Database/RawSql.php +++ b/system/Database/RawSql.php @@ -11,6 +11,9 @@ namespace CodeIgniter\Database; +/** + * @see \CodeIgniter\Database\RawSqlTest + */ class RawSql { /** diff --git a/system/Debug/ExceptionHandler.php b/system/Debug/ExceptionHandler.php index 1eaa05aceeaa..33b114e30341 100644 --- a/system/Debug/ExceptionHandler.php +++ b/system/Debug/ExceptionHandler.php @@ -20,6 +20,9 @@ use Config\Paths; use Throwable; +/** + * @see \CodeIgniter\Debug\ExceptionHandlerTest + */ final class ExceptionHandler extends BaseExceptionHandler implements ExceptionHandlerInterface { use ResponseTrait; diff --git a/system/Debug/Exceptions.php b/system/Debug/Exceptions.php index 3c2c7902c687..f3a69c32b29a 100644 --- a/system/Debug/Exceptions.php +++ b/system/Debug/Exceptions.php @@ -27,6 +27,8 @@ /** * Exceptions manager + * + * @see \CodeIgniter\Debug\ExceptionsTest */ class Exceptions { diff --git a/system/Debug/Timer.php b/system/Debug/Timer.php index 216b10bab758..d43bf1c5a32a 100644 --- a/system/Debug/Timer.php +++ b/system/Debug/Timer.php @@ -18,6 +18,8 @@ * * Provides a simple way to measure the amount of time * that elapses between two points. + * + * @see \CodeIgniter\Debug\TimerTest */ class Timer { diff --git a/system/Debug/Toolbar/Collectors/Database.php b/system/Debug/Toolbar/Collectors/Database.php index f487af59cef4..4b2ff96fe8b5 100644 --- a/system/Debug/Toolbar/Collectors/Database.php +++ b/system/Debug/Toolbar/Collectors/Database.php @@ -17,6 +17,8 @@ /** * Collector for the Database tab of the Debug Toolbar. + * + * @see \CodeIgniter\Debug\Toolbar\Collectors\DatabaseTest */ class Database extends BaseCollector { diff --git a/system/Debug/Toolbar/Collectors/History.php b/system/Debug/Toolbar/Collectors/History.php index 9645bd91863a..a639e35a4ebd 100644 --- a/system/Debug/Toolbar/Collectors/History.php +++ b/system/Debug/Toolbar/Collectors/History.php @@ -15,6 +15,8 @@ /** * History collector + * + * @see \CodeIgniter\Debug\Toolbar\Collectors\HistoryTest */ class History extends BaseCollector { diff --git a/system/Email/Email.php b/system/Email/Email.php index b2f6874c32c9..c5b043922938 100644 --- a/system/Email/Email.php +++ b/system/Email/Email.php @@ -20,6 +20,8 @@ * CodeIgniter Email Class * * Permits email to be sent using Mail, Sendmail, or SMTP. + * + * @see \CodeIgniter\Email\EmailTest */ class Email { diff --git a/system/Encryption/Encryption.php b/system/Encryption/Encryption.php index fda9906240cb..6a0517b1d116 100644 --- a/system/Encryption/Encryption.php +++ b/system/Encryption/Encryption.php @@ -20,6 +20,8 @@ * Provides two-way keyed encryption via PHP's Sodium and/or OpenSSL extensions. * This class determines the driver, cipher, and mode to use, and then * initializes the appropriate encryption handler. + * + * @see \CodeIgniter\Encryption\EncryptionTest */ class Encryption { diff --git a/system/Encryption/Handlers/OpenSSLHandler.php b/system/Encryption/Handlers/OpenSSLHandler.php index 8324b36718ea..0d8f10758b3c 100644 --- a/system/Encryption/Handlers/OpenSSLHandler.php +++ b/system/Encryption/Handlers/OpenSSLHandler.php @@ -15,6 +15,8 @@ /** * Encryption handling for OpenSSL library + * + * @see \CodeIgniter\Encryption\Handlers\OpenSSLHandlerTest */ class OpenSSLHandler extends BaseHandler { diff --git a/system/Encryption/Handlers/SodiumHandler.php b/system/Encryption/Handlers/SodiumHandler.php index 95dcdfb6c8b0..c483dfe90c3a 100644 --- a/system/Encryption/Handlers/SodiumHandler.php +++ b/system/Encryption/Handlers/SodiumHandler.php @@ -17,6 +17,7 @@ * SodiumHandler uses libsodium in encryption. * * @see https://github.com/jedisct1/libsodium/issues/392 + * @see \CodeIgniter\Encryption\Handlers\SodiumHandlerTest */ class SodiumHandler extends BaseHandler { diff --git a/system/Entity/Entity.php b/system/Entity/Entity.php index dd4f54c928bf..65898c012dc9 100644 --- a/system/Entity/Entity.php +++ b/system/Entity/Entity.php @@ -33,6 +33,8 @@ /** * Entity encapsulation, for use with CodeIgniter\Model + * + * @see \CodeIgniter\Entity\EntityTest */ class Entity implements JsonSerializable { diff --git a/system/Events/Events.php b/system/Events/Events.php index ff8c92822e52..b240dc29e1ca 100644 --- a/system/Events/Events.php +++ b/system/Events/Events.php @@ -16,6 +16,8 @@ /** * Events + * + * @see \CodeIgniter\Events\EventsTest */ class Events { diff --git a/system/Files/File.php b/system/Files/File.php index 67e098da1a93..4e4ee388047e 100644 --- a/system/Files/File.php +++ b/system/Files/File.php @@ -20,6 +20,8 @@ /** * Wrapper for PHP's built-in SplFileInfo, with goodies. + * + * @see \CodeIgniter\Files\FileTest */ class File extends SplFileInfo { diff --git a/system/Files/FileCollection.php b/system/Files/FileCollection.php index ab0ab357329c..87f987eb8f1e 100644 --- a/system/Files/FileCollection.php +++ b/system/Files/FileCollection.php @@ -25,6 +25,7 @@ * filtering, and ordering them. * * @template-implements IteratorAggregate + * @see \CodeIgniter\Files\FileCollectionTest */ class FileCollection implements Countable, IteratorAggregate { diff --git a/system/Filters/CSRF.php b/system/Filters/CSRF.php index 2548dd026454..23e6e2540eca 100644 --- a/system/Filters/CSRF.php +++ b/system/Filters/CSRF.php @@ -24,6 +24,7 @@ * This filter is not intended to be used from the command line. * * @codeCoverageIgnore + * @see \CodeIgniter\Filters\CSRFTest */ class CSRF implements FilterInterface { diff --git a/system/Filters/DebugToolbar.php b/system/Filters/DebugToolbar.php index ae4c09c8bf9c..75662d841ade 100644 --- a/system/Filters/DebugToolbar.php +++ b/system/Filters/DebugToolbar.php @@ -17,6 +17,8 @@ /** * Debug toolbar filter + * + * @see \CodeIgniter\Filters\DebugToolbarTest */ class DebugToolbar implements FilterInterface { diff --git a/system/Filters/Filters.php b/system/Filters/Filters.php index ccd8283b0121..d0c67845466f 100644 --- a/system/Filters/Filters.php +++ b/system/Filters/Filters.php @@ -21,6 +21,8 @@ /** * Filters + * + * @see \CodeIgniter\Filters\FiltersTest */ class Filters { diff --git a/system/Filters/Honeypot.php b/system/Filters/Honeypot.php index 419c2b47e75a..e30e90f8d9fd 100644 --- a/system/Filters/Honeypot.php +++ b/system/Filters/Honeypot.php @@ -19,6 +19,8 @@ /** * Honeypot filter + * + * @see \CodeIgniter\Filters\HoneypotTest */ class Honeypot implements FilterInterface { diff --git a/system/Filters/InvalidChars.php b/system/Filters/InvalidChars.php index 42aa15b19675..93124fdb4e9f 100644 --- a/system/Filters/InvalidChars.php +++ b/system/Filters/InvalidChars.php @@ -23,6 +23,8 @@ * invalid characters: * - invalid UTF-8 characters * - control characters except line break and tab code + * + * @see \CodeIgniter\Filters\InvalidCharsTest */ class InvalidChars implements FilterInterface { diff --git a/system/Filters/SecureHeaders.php b/system/Filters/SecureHeaders.php index fd656af6a80f..952926b95714 100644 --- a/system/Filters/SecureHeaders.php +++ b/system/Filters/SecureHeaders.php @@ -16,6 +16,8 @@ /** * Add Common Security Headers + * + * @see \CodeIgniter\Filters\SecureHeadersTest */ class SecureHeaders implements FilterInterface { diff --git a/system/Format/Format.php b/system/Format/Format.php index db05aca146d5..6b4eb73f1f3a 100644 --- a/system/Format/Format.php +++ b/system/Format/Format.php @@ -16,6 +16,8 @@ /** * The Format class is a convenient place to create Formatters. + * + * @see \CodeIgniter\Format\FormatTest */ class Format { diff --git a/system/Format/JSONFormatter.php b/system/Format/JSONFormatter.php index b4a80822e8be..146fd5330aa6 100644 --- a/system/Format/JSONFormatter.php +++ b/system/Format/JSONFormatter.php @@ -16,6 +16,8 @@ /** * JSON data formatter + * + * @see \CodeIgniter\Format\JSONFormatterTest */ class JSONFormatter implements FormatterInterface { diff --git a/system/Format/XMLFormatter.php b/system/Format/XMLFormatter.php index 23ed57fadf84..51b3003e974e 100644 --- a/system/Format/XMLFormatter.php +++ b/system/Format/XMLFormatter.php @@ -17,6 +17,8 @@ /** * XML data formatter + * + * @see \CodeIgniter\Format\XMLFormatterTest */ class XMLFormatter implements FormatterInterface { diff --git a/system/HTTP/CLIRequest.php b/system/HTTP/CLIRequest.php index ef10d101e05b..22e55100649a 100644 --- a/system/HTTP/CLIRequest.php +++ b/system/HTTP/CLIRequest.php @@ -25,6 +25,8 @@ * originally made available under. * * http://fuelphp.com + * + * @see \CodeIgniter\HTTP\CLIRequestTest */ class CLIRequest extends Request { diff --git a/system/HTTP/CURLRequest.php b/system/HTTP/CURLRequest.php index 1f02cec983b0..0604c3367b7a 100644 --- a/system/HTTP/CURLRequest.php +++ b/system/HTTP/CURLRequest.php @@ -18,6 +18,8 @@ /** * A lightweight HTTP client for sending synchronous HTTP requests via cURL. + * + * @see \CodeIgniter\HTTP\CURLRequestTest */ class CURLRequest extends OutgoingRequest { diff --git a/system/HTTP/ContentSecurityPolicy.php b/system/HTTP/ContentSecurityPolicy.php index 2a90c3c6473b..37b0ce650ff7 100644 --- a/system/HTTP/ContentSecurityPolicy.php +++ b/system/HTTP/ContentSecurityPolicy.php @@ -22,6 +22,7 @@ * @see http://www.html5rocks.com/en/tutorials/security/content-security-policy/ * @see http://content-security-policy.com/ * @see https://www.owasp.org/index.php/Content_Security_Policy + * @see \CodeIgniter\HTTP\ContentSecurityPolicyTest */ class ContentSecurityPolicy { diff --git a/system/HTTP/DownloadResponse.php b/system/HTTP/DownloadResponse.php index c2fdcff0799f..14dc3fec1421 100644 --- a/system/HTTP/DownloadResponse.php +++ b/system/HTTP/DownloadResponse.php @@ -18,6 +18,8 @@ /** * HTTP response when a download is requested. + * + * @see \CodeIgniter\HTTP\DownloadResponseTest */ class DownloadResponse extends Response { diff --git a/system/HTTP/Files/FileCollection.php b/system/HTTP/Files/FileCollection.php index 605d3a134aea..f01cc69f5902 100644 --- a/system/HTTP/Files/FileCollection.php +++ b/system/HTTP/Files/FileCollection.php @@ -18,6 +18,8 @@ * Class FileCollection * * Provides easy access to uploaded files for a request. + * + * @see \CodeIgniter\HTTP\Files\FileCollectionTest */ class FileCollection { diff --git a/system/HTTP/Header.php b/system/HTTP/Header.php index e9bebe960097..67c6cb0636d3 100644 --- a/system/HTTP/Header.php +++ b/system/HTTP/Header.php @@ -15,6 +15,8 @@ * Class Header * * Represents a single HTTP header. + * + * @see \CodeIgniter\HTTP\HeaderTest */ class Header { diff --git a/system/HTTP/IncomingRequest.php b/system/HTTP/IncomingRequest.php index 0ce55f789abc..458e8ef88043 100755 --- a/system/HTTP/IncomingRequest.php +++ b/system/HTTP/IncomingRequest.php @@ -42,6 +42,8 @@ * - Query string arguments (generally via $_GET, or as parsed via parse_str()) * - Upload files, if any (as represented by $_FILES) * - Deserialized body binds (generally from $_POST) + * + * @see \CodeIgniter\HTTP\IncomingRequestTest */ class IncomingRequest extends Request { diff --git a/system/HTTP/Message.php b/system/HTTP/Message.php index 01496d780c1a..9d0b517778a4 100644 --- a/system/HTTP/Message.php +++ b/system/HTTP/Message.php @@ -13,6 +13,8 @@ /** * An HTTP message + * + * @see \CodeIgniter\HTTP\MessageTest */ class Message implements MessageInterface { diff --git a/system/HTTP/Negotiate.php b/system/HTTP/Negotiate.php index dcaf41d1dbbb..b1d5fdfa93a3 100644 --- a/system/HTTP/Negotiate.php +++ b/system/HTTP/Negotiate.php @@ -21,6 +21,7 @@ * server wants. * * @see http://tools.ietf.org/html/rfc7231#section-5.3 + * @see \CodeIgniter\HTTP\NegotiateTest */ class Negotiate { diff --git a/system/HTTP/OutgoingRequest.php b/system/HTTP/OutgoingRequest.php index 6a339038ea0c..698cde263bc1 100644 --- a/system/HTTP/OutgoingRequest.php +++ b/system/HTTP/OutgoingRequest.php @@ -13,6 +13,8 @@ /** * Representation of an outgoing, client-side request. + * + * @see \CodeIgniter\HTTP\OutgoingRequestTest */ class OutgoingRequest extends Message implements OutgoingRequestInterface { diff --git a/system/HTTP/RedirectResponse.php b/system/HTTP/RedirectResponse.php index 1c0e354bb1d9..d6f234ca9f68 100644 --- a/system/HTTP/RedirectResponse.php +++ b/system/HTTP/RedirectResponse.php @@ -17,6 +17,8 @@ /** * Handle a redirect response + * + * @see \CodeIgniter\HTTP\RedirectResponseTest */ class RedirectResponse extends Response { diff --git a/system/HTTP/Request.php b/system/HTTP/Request.php index 26b7b8f460c8..afb0b22ad5d0 100644 --- a/system/HTTP/Request.php +++ b/system/HTTP/Request.php @@ -16,6 +16,8 @@ /** * Representation of an incoming, server-side HTTP request. + * + * @see \CodeIgniter\HTTP\RequestTest */ class Request extends OutgoingRequest implements RequestInterface { diff --git a/system/HTTP/Response.php b/system/HTTP/Response.php index a0d5658fd8a9..bc37e7418632 100644 --- a/system/HTTP/Response.php +++ b/system/HTTP/Response.php @@ -28,6 +28,8 @@ * - Status code and reason phrase * - Headers * - Message body + * + * @see \CodeIgniter\HTTP\ResponseTest */ class Response extends Message implements ResponseInterface { diff --git a/system/HTTP/SiteURI.php b/system/HTTP/SiteURI.php index 362c8ee32362..3a163bdac428 100644 --- a/system/HTTP/SiteURI.php +++ b/system/HTTP/SiteURI.php @@ -18,6 +18,8 @@ /** * URI for the application site + * + * @see \CodeIgniter\HTTP\SiteURITest */ class SiteURI extends URI { diff --git a/system/HTTP/SiteURIFactory.php b/system/HTTP/SiteURIFactory.php index e250c559058c..36b9d705b28c 100644 --- a/system/HTTP/SiteURIFactory.php +++ b/system/HTTP/SiteURIFactory.php @@ -19,6 +19,8 @@ * Creates SiteURI using superglobals. * * This class also updates superglobal $_SERVER and $_GET. + * + * @see \CodeIgniter\HTTP\SiteURIFactoryTest */ final class SiteURIFactory { diff --git a/system/HTTP/URI.php b/system/HTTP/URI.php index a149c4102f34..c6fd64ae4418 100644 --- a/system/HTTP/URI.php +++ b/system/HTTP/URI.php @@ -18,6 +18,8 @@ /** * Abstraction for a uniform resource identifier (URI). + * + * @see \CodeIgniter\HTTP\URITest */ class URI { diff --git a/system/HTTP/UserAgent.php b/system/HTTP/UserAgent.php index 02797b2d20c3..77e7cb4392fc 100644 --- a/system/HTTP/UserAgent.php +++ b/system/HTTP/UserAgent.php @@ -15,6 +15,8 @@ /** * Abstraction for an HTTP user agent + * + * @see \CodeIgniter\HTTP\UserAgentTest */ class UserAgent { diff --git a/system/Honeypot/Honeypot.php b/system/Honeypot/Honeypot.php index 6e08c9df8bfe..c2f3cf67cc7b 100644 --- a/system/Honeypot/Honeypot.php +++ b/system/Honeypot/Honeypot.php @@ -19,6 +19,8 @@ /** * class Honeypot + * + * @see \CodeIgniter\Honeypot\HoneypotTest */ class Honeypot { diff --git a/system/HotReloader/DirectoryHasher.php b/system/HotReloader/DirectoryHasher.php index 3d9914d8c8f8..ba8d2bfbb891 100644 --- a/system/HotReloader/DirectoryHasher.php +++ b/system/HotReloader/DirectoryHasher.php @@ -19,6 +19,7 @@ /** * @internal + * @see \CodeIgniter\HotReloader\DirectoryHasherTest */ final class DirectoryHasher { diff --git a/system/I18n/Time.php b/system/I18n/Time.php index aedd00e71616..520f38eb90d1 100644 --- a/system/I18n/Time.php +++ b/system/I18n/Time.php @@ -20,6 +20,7 @@ * Requires the intl PHP extension. * * @property string $date + * @see \CodeIgniter\I18n\TimeTest */ class Time extends DateTimeImmutable { diff --git a/system/I18n/TimeDifference.php b/system/I18n/TimeDifference.php index 4b0e1aa595c1..c797a422d8c7 100644 --- a/system/I18n/TimeDifference.php +++ b/system/I18n/TimeDifference.php @@ -16,6 +16,8 @@ /** * Class TimeDifference + * + * @see \CodeIgniter\I18n\TimeDifferenceTest */ class TimeDifference { diff --git a/system/I18n/TimeLegacy.php b/system/I18n/TimeLegacy.php index 87d16fcd527d..7be9f80fac20 100644 --- a/system/I18n/TimeLegacy.php +++ b/system/I18n/TimeLegacy.php @@ -23,6 +23,7 @@ * @property string $date * * @deprecated Use Time instead. + * @see \CodeIgniter\I18n\TimeLegacyTest */ class TimeLegacy extends DateTime { diff --git a/system/Images/Image.php b/system/Images/Image.php index bb348a7ca1b8..291ad002a6f2 100644 --- a/system/Images/Image.php +++ b/system/Images/Image.php @@ -16,6 +16,8 @@ /** * Encapsulation of an Image file + * + * @see \CodeIgniter\Images\ImageTest */ class Image extends File { diff --git a/system/Language/Language.php b/system/Language/Language.php index d5781b8c6e37..70d109e2319b 100644 --- a/system/Language/Language.php +++ b/system/Language/Language.php @@ -18,6 +18,8 @@ * Handle system messages and localization. * * Locale-based, built on top of PHP internationalization. + * + * @see \CodeIgniter\Language\LanguageTest */ class Language { diff --git a/system/Log/Handlers/ChromeLoggerHandler.php b/system/Log/Handlers/ChromeLoggerHandler.php index 3354e5fb2db8..b04d6f69238c 100644 --- a/system/Log/Handlers/ChromeLoggerHandler.php +++ b/system/Log/Handlers/ChromeLoggerHandler.php @@ -21,6 +21,7 @@ * Requires the ChromeLogger extension installed in your browser. * * @see https://craig.is/writing/chrome-logger + * @see \CodeIgniter\Log\Handlers\ChromeLoggerHandlerTest */ class ChromeLoggerHandler extends BaseHandler { diff --git a/system/Log/Handlers/ErrorlogHandler.php b/system/Log/Handlers/ErrorlogHandler.php index a3c9dfabb6e8..d9f3fc4e0a20 100644 --- a/system/Log/Handlers/ErrorlogHandler.php +++ b/system/Log/Handlers/ErrorlogHandler.php @@ -15,6 +15,8 @@ /** * Log handler that writes to PHP's `error_log()` + * + * @see \CodeIgniter\Log\Handlers\ErrorlogHandlerTest */ class ErrorlogHandler extends BaseHandler { diff --git a/system/Log/Handlers/FileHandler.php b/system/Log/Handlers/FileHandler.php index e80a6121c676..88e384781a70 100644 --- a/system/Log/Handlers/FileHandler.php +++ b/system/Log/Handlers/FileHandler.php @@ -16,6 +16,8 @@ /** * Log error messages to file system + * + * @see \CodeIgniter\Log\Handlers\FileHandlerTest */ class FileHandler extends BaseHandler { diff --git a/system/Log/Logger.php b/system/Log/Logger.php index 9643a82191c6..b1583f5d789c 100644 --- a/system/Log/Logger.php +++ b/system/Log/Logger.php @@ -28,6 +28,8 @@ * The context array can contain arbitrary data, the only assumption that * can be made by implementors is that if an Exception instance is given * to produce a stack trace, it MUST be in a key named "exception". + * + * @see \CodeIgniter\Log\LoggerTest */ class Logger implements LoggerInterface { diff --git a/system/Pager/Pager.php b/system/Pager/Pager.php index 3a9f5a772f0a..648bb1e5e4de 100644 --- a/system/Pager/Pager.php +++ b/system/Pager/Pager.php @@ -24,6 +24,8 @@ * pagination links and reading the current url's query variable, "page" * to determine the current page. This class can support multiple * paginations on a single page. + * + * @see \CodeIgniter\Pager\PagerTest */ class Pager implements PagerInterface { diff --git a/system/Pager/PagerRenderer.php b/system/Pager/PagerRenderer.php index 024ffd095673..454ac9f1cd93 100644 --- a/system/Pager/PagerRenderer.php +++ b/system/Pager/PagerRenderer.php @@ -19,6 +19,8 @@ * This class is passed to the view that describes the pagination, * and is used to get the link information and provide utility * methods needed to work with pagination. + * + * @see \CodeIgniter\Pager\PagerRendererTest */ class PagerRenderer { diff --git a/system/Publisher/ContentReplacer.php b/system/Publisher/ContentReplacer.php index 76cef11336f1..accfdd716695 100644 --- a/system/Publisher/ContentReplacer.php +++ b/system/Publisher/ContentReplacer.php @@ -15,6 +15,8 @@ /** * Replace Text Content + * + * @see \CodeIgniter\Publisher\ContentReplacerTest */ class ContentReplacer { diff --git a/system/RESTful/ResourceController.php b/system/RESTful/ResourceController.php index 5c55bf5abac7..03ba4d314613 100644 --- a/system/RESTful/ResourceController.php +++ b/system/RESTful/ResourceController.php @@ -16,6 +16,8 @@ /** * An extendable controller to provide a RESTful API for a resource. + * + * @see \CodeIgniter\RESTful\ResourceControllerTest */ class ResourceController extends BaseResource { diff --git a/system/RESTful/ResourcePresenter.php b/system/RESTful/ResourcePresenter.php index 5aedb28d4ad8..8c39bd8a0050 100644 --- a/system/RESTful/ResourcePresenter.php +++ b/system/RESTful/ResourcePresenter.php @@ -15,6 +15,8 @@ /** * An extendable controller to help provide a UI for a resource. + * + * @see \CodeIgniter\RESTful\ResourcePresenterTest */ class ResourcePresenter extends BaseResource { diff --git a/system/Router/AutoRouterImproved.php b/system/Router/AutoRouterImproved.php index b6b81c70f2ef..0a26fc12f865 100644 --- a/system/Router/AutoRouterImproved.php +++ b/system/Router/AutoRouterImproved.php @@ -19,6 +19,8 @@ /** * New Secure Router for Auto-Routing + * + * @see \CodeIgniter\Router\AutoRouterImprovedTest */ final class AutoRouterImproved implements AutoRouterInterface { diff --git a/system/Router/DefinedRouteCollector.php b/system/Router/DefinedRouteCollector.php index 9d211415a8a0..2b317d4cbc2a 100644 --- a/system/Router/DefinedRouteCollector.php +++ b/system/Router/DefinedRouteCollector.php @@ -16,6 +16,8 @@ /** * Collect all defined routes for display. + * + * @see \CodeIgniter\Router\DefinedRouteCollectorTest */ final class DefinedRouteCollector { diff --git a/system/Router/RouteCollection.php b/system/Router/RouteCollection.php index 8383280114b5..63b7397dbc4c 100644 --- a/system/Router/RouteCollection.php +++ b/system/Router/RouteCollection.php @@ -23,6 +23,7 @@ /** * @todo Implement nested resource routing (See CakePHP) + * @see \CodeIgniter\Router\RouteCollectionTest */ class RouteCollection implements RouteCollectionInterface { diff --git a/system/Router/Router.php b/system/Router/Router.php index bd57435f8020..0013d7cdf920 100644 --- a/system/Router/Router.php +++ b/system/Router/Router.php @@ -21,6 +21,8 @@ /** * Request router. + * + * @see \CodeIgniter\Router\RouterTest */ class Router implements RouterInterface { diff --git a/system/Security/Security.php b/system/Security/Security.php index c67c13ce0c1c..648856321363 100644 --- a/system/Security/Security.php +++ b/system/Security/Security.php @@ -30,6 +30,8 @@ * * Provides methods that help protect your site against * Cross-Site Request Forgery attacks. + * + * @see \CodeIgniter\Security\SecurityTest */ class Security implements SecurityInterface { diff --git a/system/Session/Handlers/Database/MySQLiHandler.php b/system/Session/Handlers/Database/MySQLiHandler.php index fabaae451e6a..380041aab67b 100644 --- a/system/Session/Handlers/Database/MySQLiHandler.php +++ b/system/Session/Handlers/Database/MySQLiHandler.php @@ -15,6 +15,8 @@ /** * Session handler for MySQLi + * + * @see \CodeIgniter\Session\Handlers\Database\MySQLiHandlerTest */ class MySQLiHandler extends DatabaseHandler { diff --git a/system/Session/Handlers/Database/PostgreHandler.php b/system/Session/Handlers/Database/PostgreHandler.php index 963aa27cdb35..0c140fea70c3 100644 --- a/system/Session/Handlers/Database/PostgreHandler.php +++ b/system/Session/Handlers/Database/PostgreHandler.php @@ -17,6 +17,8 @@ /** * Session handler for Postgre + * + * @see \CodeIgniter\Session\Handlers\Database\PostgreHandlerTest */ class PostgreHandler extends DatabaseHandler { diff --git a/system/Session/Session.php b/system/Session/Session.php index fcdaee1ebce8..ba4388472c3e 100644 --- a/system/Session/Session.php +++ b/system/Session/Session.php @@ -27,6 +27,7 @@ * variables in app/config/App.php * * @property string $session_id + * @see \CodeIgniter\Session\SessionTest */ class Session implements SessionInterface { diff --git a/system/Superglobals.php b/system/Superglobals.php index b126af130f34..c4386353315b 100644 --- a/system/Superglobals.php +++ b/system/Superglobals.php @@ -15,6 +15,7 @@ * Superglobals manipulation. * * @internal + * @see \CodeIgniter\SuperglobalsTest */ final class Superglobals { diff --git a/system/Test/DOMParser.php b/system/Test/DOMParser.php index 54762643e38d..100b14b72dff 100644 --- a/system/Test/DOMParser.php +++ b/system/Test/DOMParser.php @@ -19,6 +19,8 @@ /** * Load a response into a DOMDocument for testing assertions based on that + * + * @see \CodeIgniter\Test\DOMParserTest */ class DOMParser { diff --git a/system/Test/Fabricator.php b/system/Test/Fabricator.php index 6c9e82ff5c00..3a28f281d127 100644 --- a/system/Test/Fabricator.php +++ b/system/Test/Fabricator.php @@ -25,6 +25,8 @@ * * Bridge class for using Faker to create example data based on * model specifications. + * + * @see \CodeIgniter\Test\FabricatorTest */ class Fabricator { diff --git a/system/Test/TestLogger.php b/system/Test/TestLogger.php index 989fb6ef5c13..240f5c6d95b5 100644 --- a/system/Test/TestLogger.php +++ b/system/Test/TestLogger.php @@ -13,6 +13,9 @@ use CodeIgniter\Log\Logger; +/** + * @see \CodeIgniter\Test\TestLoggerTest + */ class TestLogger extends Logger { protected static $op_logs = []; diff --git a/system/Test/TestResponse.php b/system/Test/TestResponse.php index d66728c5d0db..956b32188ac8 100644 --- a/system/Test/TestResponse.php +++ b/system/Test/TestResponse.php @@ -31,6 +31,7 @@ * @internal * * @mixin DOMParser + * @see \CodeIgniter\Test\TestResponseTest */ class TestResponse extends TestCase { diff --git a/system/Typography/Typography.php b/system/Typography/Typography.php index fb05b68faefe..fd763cd52e86 100644 --- a/system/Typography/Typography.php +++ b/system/Typography/Typography.php @@ -15,6 +15,8 @@ /** * Typography Class + * + * @see \CodeIgniter\Typography\TypographyTest */ class Typography { diff --git a/system/Validation/CreditCardRules.php b/system/Validation/CreditCardRules.php index 8b0e3842a128..61f59d7bfe86 100644 --- a/system/Validation/CreditCardRules.php +++ b/system/Validation/CreditCardRules.php @@ -17,6 +17,7 @@ * Provides validation methods for common credit-card inputs. * * @see http://en.wikipedia.org/wiki/Credit_card_number + * @see \CodeIgniter\Validation\CreditCardRulesTest */ class CreditCardRules { diff --git a/system/Validation/DotArrayFilter.php b/system/Validation/DotArrayFilter.php index cead4f6bb414..43cb19370784 100644 --- a/system/Validation/DotArrayFilter.php +++ b/system/Validation/DotArrayFilter.php @@ -11,6 +11,9 @@ namespace CodeIgniter\Validation; +/** + * @see \CodeIgniter\Validation\DotArrayFilterTest + */ final class DotArrayFilter { /** diff --git a/system/Validation/FileRules.php b/system/Validation/FileRules.php index ba054d134b6b..756c7c7536b6 100644 --- a/system/Validation/FileRules.php +++ b/system/Validation/FileRules.php @@ -21,6 +21,8 @@ /** * File validation rules + * + * @see \CodeIgniter\Validation\FileRulesTest */ class FileRules { diff --git a/system/Validation/FormatRules.php b/system/Validation/FormatRules.php index 485b9efec2df..5089f5a0961f 100644 --- a/system/Validation/FormatRules.php +++ b/system/Validation/FormatRules.php @@ -15,6 +15,8 @@ /** * Format validation Rules. + * + * @see \CodeIgniter\Validation\FormatRulesTest */ class FormatRules { diff --git a/system/Validation/Rules.php b/system/Validation/Rules.php index e85b7443088e..b7c585f56c30 100644 --- a/system/Validation/Rules.php +++ b/system/Validation/Rules.php @@ -16,6 +16,8 @@ /** * Validation Rules. + * + * @see \CodeIgniter\Validation\RulesTest */ class Rules { diff --git a/system/Validation/StrictRules/CreditCardRules.php b/system/Validation/StrictRules/CreditCardRules.php index 2cbc1438cf17..2ceacdc6fc37 100644 --- a/system/Validation/StrictRules/CreditCardRules.php +++ b/system/Validation/StrictRules/CreditCardRules.php @@ -21,6 +21,7 @@ * Provides validation methods for common credit-card inputs. * * @see http://en.wikipedia.org/wiki/Credit_card_number + * @see \CodeIgniter\Validation\StrictRules\CreditCardRulesTest */ class CreditCardRules { diff --git a/system/Validation/StrictRules/FileRules.php b/system/Validation/StrictRules/FileRules.php index 401771cf6cfa..e86b84e99bfe 100644 --- a/system/Validation/StrictRules/FileRules.php +++ b/system/Validation/StrictRules/FileRules.php @@ -17,6 +17,8 @@ /** * File validation rules + * + * @see \CodeIgniter\Validation\StrictRules\FileRulesTest */ class FileRules extends NonStrictFileRules { diff --git a/system/Validation/StrictRules/FormatRules.php b/system/Validation/StrictRules/FormatRules.php index facb28664b2a..c186a75b2694 100644 --- a/system/Validation/StrictRules/FormatRules.php +++ b/system/Validation/StrictRules/FormatRules.php @@ -17,6 +17,8 @@ /** * Format validation Rules. + * + * @see \CodeIgniter\Validation\StrictRules\FormatRulesTest */ class FormatRules { diff --git a/system/Validation/StrictRules/Rules.php b/system/Validation/StrictRules/Rules.php index cdc20f5e2e4e..7043646c1f58 100644 --- a/system/Validation/StrictRules/Rules.php +++ b/system/Validation/StrictRules/Rules.php @@ -18,6 +18,8 @@ /** * Validation Rules. + * + * @see \CodeIgniter\Validation\StrictRules\RulesTest */ class Rules { diff --git a/system/Validation/Validation.php b/system/Validation/Validation.php index bfb89cef5649..b40bc91048bc 100644 --- a/system/Validation/Validation.php +++ b/system/Validation/Validation.php @@ -24,6 +24,8 @@ /** * Validator + * + * @see \CodeIgniter\Validation\ValidationTest */ class Validation implements ValidationInterface { diff --git a/system/View/Cell.php b/system/View/Cell.php index 223d694f6308..f654e97a376d 100644 --- a/system/View/Cell.php +++ b/system/View/Cell.php @@ -43,6 +43,8 @@ * class Class { * function method(array $params=null) * } + * + * @see \CodeIgniter\View\CellTest */ class Cell { diff --git a/system/View/Parser.php b/system/View/Parser.php index 84ff821540cb..120570079d2b 100644 --- a/system/View/Parser.php +++ b/system/View/Parser.php @@ -22,6 +22,8 @@ * * @phpstan-type ParserCallable (callable(mixed): mixed) * @phpstan-type ParserCallableString (callable(mixed): mixed)&string + * + * @see \CodeIgniter\View\ParserTest */ class Parser extends View { diff --git a/system/View/Table.php b/system/View/Table.php index e2bacac17938..df0fbebd2bc5 100644 --- a/system/View/Table.php +++ b/system/View/Table.php @@ -17,6 +17,8 @@ * HTML Table Generating Class * * Lets you create tables manually or from database result objects, or arrays. + * + * @see \CodeIgniter\View\TableTest */ class Table { diff --git a/system/View/View.php b/system/View/View.php index 6c633482fcce..e8fdf5f18f7e 100644 --- a/system/View/View.php +++ b/system/View/View.php @@ -23,6 +23,8 @@ /** * Class View + * + * @see \CodeIgniter\View\ViewTest */ class View implements RendererInterface { From ef15d933e5cdced5623fd83c9401094fc44f88b8 Mon Sep 17 00:00:00 2001 From: kenjis Date: Wed, 6 Sep 2023 18:22:17 +0900 Subject: [PATCH 040/209] chore: replace deprecated sets --- rector.php | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/rector.php b/rector.php index fc00f27e0c4e..e653fade902f 100644 --- a/rector.php +++ b/rector.php @@ -38,6 +38,8 @@ use Rector\Php71\Rector\FuncCall\CountOnNullRector; use Rector\Php73\Rector\FuncCall\JsonThrowOnErrorRector; use Rector\Php73\Rector\FuncCall\StringifyStrNeedlesRector; +use Rector\PHPUnit\CodeQuality\Rector\Class_\ConstructClassMethodToSetUpTestCaseRector; +use Rector\PHPUnit\CodeQuality\Rector\Class_\YieldDataProviderRector; use Rector\PHPUnit\Set\PHPUnitSetList; use Rector\Privatization\Rector\Property\PrivatizeFinalClassPropertyRector; use Rector\Set\ValueObject\LevelSetList; @@ -51,9 +53,8 @@ $rectorConfig->sets([ SetList::DEAD_CODE, LevelSetList::UP_TO_PHP_74, - PHPUnitSetList::PHPUNIT_SPECIFIC_METHOD, + PHPUnitSetList::PHPUNIT_CODE_QUALITY, PHPUnitSetList::PHPUNIT_80, - PHPUnitSetList::REMOVE_MOCKS, ]); $rectorConfig->parallel(240, 8, 1); @@ -77,12 +78,18 @@ __DIR__ . '/tests/_support', JsonThrowOnErrorRector::class, StringifyStrNeedlesRector::class, + YieldDataProviderRector::class, RemoveUnusedPrivateMethodRector::class => [ // private method called via getPrivateMethodInvoker __DIR__ . '/tests/system/Test/ReflectionHelperTest.php', ], + ConstructClassMethodToSetUpTestCaseRector::class => [ + // breaks the constructor + __DIR__ . '/system/Test/TestResponse.php', + ], + RemoveUnusedConstructorParamRector::class => [ // there are deprecated parameters __DIR__ . '/system/Debug/Exceptions.php', From d669efa9b8d71e5c53fd70bc300a1efcb53d312c Mon Sep 17 00:00:00 2001 From: kenjis Date: Wed, 6 Sep 2023 19:32:55 +0900 Subject: [PATCH 041/209] chore: use PPHPUnitLevelSetList::UP_TO_PHPUNIT_100 instead of PHPUnitSetList::PHPUNIT_80 --- rector.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rector.php b/rector.php index e653fade902f..030a2df10962 100644 --- a/rector.php +++ b/rector.php @@ -40,6 +40,7 @@ use Rector\Php73\Rector\FuncCall\StringifyStrNeedlesRector; use Rector\PHPUnit\CodeQuality\Rector\Class_\ConstructClassMethodToSetUpTestCaseRector; use Rector\PHPUnit\CodeQuality\Rector\Class_\YieldDataProviderRector; +use Rector\PHPUnit\Set\PHPUnitLevelSetList; use Rector\PHPUnit\Set\PHPUnitSetList; use Rector\Privatization\Rector\Property\PrivatizeFinalClassPropertyRector; use Rector\Set\ValueObject\LevelSetList; @@ -53,8 +54,8 @@ $rectorConfig->sets([ SetList::DEAD_CODE, LevelSetList::UP_TO_PHP_74, + PHPUnitLevelSetList::UP_TO_PHPUNIT_100, PHPUnitSetList::PHPUNIT_CODE_QUALITY, - PHPUnitSetList::PHPUNIT_80, ]); $rectorConfig->parallel(240, 8, 1); From 94d546b9a8fcaae46fa100a44e2735242c4758df Mon Sep 17 00:00:00 2001 From: kenjis Date: Thu, 7 Sep 2023 15:49:48 +0900 Subject: [PATCH 042/209] chore: add system/Test/ControllerResponse.php to skip list It caused an error. Warning: Undefined array key 1852 in /home/runner/work/CodeIgniter4/CodeIgniter4/vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php on line 209 Error: ] Could not process "/home/runner/work/CodeIgniter4/CodeIgniter4/system/Test/ControllerResp onse.php" file, due to: "System error: "PhpParser\Internal\TokenStream::getIndentationBefore(): Return value must be of type int, null returned" Run Rector with "--debug" option and post the report here: https://github.com/rectorphp/rector/issues/new". On line: 209 Error: Process completed with exit code 1. --- rector.php | 1 + 1 file changed, 1 insertion(+) diff --git a/rector.php b/rector.php index 030a2df10962..536cecfe1fc8 100644 --- a/rector.php +++ b/rector.php @@ -73,6 +73,7 @@ // is there a file you need to skip? $rectorConfig->skip([ __DIR__ . '/system/Debug/Toolbar/Views/toolbar.tpl.php', + __DIR__ . '/system/Test/ControllerResponse.php', __DIR__ . '/system/ThirdParty', __DIR__ . '/tests/system/Config/fixtures', __DIR__ . '/tests/system/Filters/fixtures', From f75e33d57b6e4742e909cc207aa7af6177ddfc8d Mon Sep 17 00:00:00 2001 From: kenjis Date: Thu, 7 Sep 2023 15:51:15 +0900 Subject: [PATCH 043/209] chore: change PHPUnitLevelSetList::UP_TO_PHPUNIT_100 to PHPUnitSetList::PHPUNIT_100 It does not work for us. See https://github.com/codeigniter4/CodeIgniter4/pull/7904#discussion_r1318145952 --- rector.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rector.php b/rector.php index 536cecfe1fc8..aba0f41e9c67 100644 --- a/rector.php +++ b/rector.php @@ -40,7 +40,6 @@ use Rector\Php73\Rector\FuncCall\StringifyStrNeedlesRector; use Rector\PHPUnit\CodeQuality\Rector\Class_\ConstructClassMethodToSetUpTestCaseRector; use Rector\PHPUnit\CodeQuality\Rector\Class_\YieldDataProviderRector; -use Rector\PHPUnit\Set\PHPUnitLevelSetList; use Rector\PHPUnit\Set\PHPUnitSetList; use Rector\Privatization\Rector\Property\PrivatizeFinalClassPropertyRector; use Rector\Set\ValueObject\LevelSetList; @@ -54,8 +53,8 @@ $rectorConfig->sets([ SetList::DEAD_CODE, LevelSetList::UP_TO_PHP_74, - PHPUnitLevelSetList::UP_TO_PHPUNIT_100, PHPUnitSetList::PHPUNIT_CODE_QUALITY, + PHPUnitSetList::PHPUNIT_100, ]); $rectorConfig->parallel(240, 8, 1); From 0276d89290fa8f578bba88d1e2cef74bde3ff833 Mon Sep 17 00:00:00 2001 From: kenjis Date: Fri, 8 Sep 2023 17:39:55 +0900 Subject: [PATCH 044/209] chore: skip the specific rule See https://github.com/codeigniter4/CodeIgniter4/pull/7904#discussion_r1318507172 --- rector.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rector.php b/rector.php index aba0f41e9c67..61ca28b47045 100644 --- a/rector.php +++ b/rector.php @@ -72,7 +72,6 @@ // is there a file you need to skip? $rectorConfig->skip([ __DIR__ . '/system/Debug/Toolbar/Views/toolbar.tpl.php', - __DIR__ . '/system/Test/ControllerResponse.php', __DIR__ . '/system/ThirdParty', __DIR__ . '/tests/system/Config/fixtures', __DIR__ . '/tests/system/Filters/fixtures', @@ -89,6 +88,8 @@ ConstructClassMethodToSetUpTestCaseRector::class => [ // breaks the constructor __DIR__ . '/system/Test/TestResponse.php', + // See https://github.com/rectorphp/rector/issues/8188 + __DIR__ . '/system/Test/ControllerResponse.php', ], RemoveUnusedConstructorParamRector::class => [ From 9f2bac3d249cecdda3babc664d925c0e15465feb Mon Sep 17 00:00:00 2001 From: kenjis Date: Thu, 31 Aug 2023 18:45:13 +0900 Subject: [PATCH 045/209] chore: add PHP 8.3 to test-phpunit.yml --- .github/workflows/test-phpunit.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/.github/workflows/test-phpunit.yml b/.github/workflows/test-phpunit.yml index 7a728a965108..9ca4ed8e15e4 100644 --- a/.github/workflows/test-phpunit.yml +++ b/.github/workflows/test-phpunit.yml @@ -59,6 +59,10 @@ jobs: - '8.0' - '8.1' - '8.2' + - '8.3' + include: + - php-version: '8.3' + composer-option: '--ignore-platform-req=php' uses: ./.github/workflows/reusable-phpunit-test.yml # @TODO Extract to codeigniter4/.github repo with: @@ -70,6 +74,7 @@ jobs: enable-coverage: ${{ matrix.php-version == needs.coverage-php-version.outputs.version }} enable-profiling: ${{ matrix.php-version == needs.coverage-php-version.outputs.version }} extra-extensions: imagick, redis, memcached + extra-composer-options: ${{ matrix.composer-option }} database-live-tests: needs: @@ -84,6 +89,7 @@ jobs: - '8.0' - '8.1' - '8.2' + - '8.3' db-platform: - MySQLi - OCI8 @@ -96,6 +102,8 @@ jobs: - php-version: '7.4' db-platform: MySQLi mysql-version: '8.0' + - php-version: '8.3' + composer-option: '--ignore-platform-req=php' uses: ./.github/workflows/reusable-phpunit-test.yml # @TODO Extract to codeigniter4/.github repo with: @@ -109,6 +117,7 @@ jobs: enable-coverage: ${{ matrix.php-version == needs.coverage-php-version.outputs.version }} enable-profiling: ${{ matrix.php-version == needs.coverage-php-version.outputs.version }} extra-extensions: mysqli, oci8, pgsql, sqlsrv-5.10.1, sqlite3 + extra-composer-options: ${{ matrix.composer-option }} separate-process-tests: needs: @@ -122,6 +131,10 @@ jobs: - '8.0' - '8.1' - '8.2' + - '8.3' + include: + - php-version: '8.3' + composer-option: '--ignore-platform-req=php' uses: ./.github/workflows/reusable-phpunit-test.yml # @TODO Extract to codeigniter4/.github repo with: @@ -133,6 +146,7 @@ jobs: enable-coverage: true # needs xdebug for assertHeaderEmitted() tests enable-profiling: ${{ matrix.php-version == needs.coverage-php-version.outputs.version }} extra-extensions: mysqli, oci8, pgsql, sqlsrv-5.10.1, sqlite3 + extra-composer-options: ${{ matrix.composer-option }} cache-live-tests: needs: @@ -146,6 +160,10 @@ jobs: - '8.0' - '8.1' - '8.2' + - '8.3' + include: + - php-version: '8.3' + composer-option: '--ignore-platform-req=php' uses: ./.github/workflows/reusable-phpunit-test.yml # @TODO Extract to codeigniter4/.github repo with: @@ -157,6 +175,7 @@ jobs: enable-coverage: ${{ matrix.php-version == needs.coverage-php-version.outputs.version }} enable-profiling: ${{ matrix.php-version == needs.coverage-php-version.outputs.version }} extra-extensions: redis, memcached + extra-composer-options: ${{ matrix.composer-option }} coveralls: name: Upload coverage results to Coveralls From f094a28f372dd3bfdd4d1a086dc8af675d55ce36 Mon Sep 17 00:00:00 2001 From: kenjis Date: Sat, 9 Sep 2023 17:45:01 +0900 Subject: [PATCH 046/209] chore: composer require --dev phpstan/phpstan-strict-rules --- composer.json | 1 + 1 file changed, 1 insertion(+) diff --git a/composer.json b/composer.json index 175b2c64d4b5..05c3a5f389d0 100644 --- a/composer.json +++ b/composer.json @@ -27,6 +27,7 @@ "nexusphp/tachycardia": "^1.0", "php-coveralls/php-coveralls": "^2.5", "phpstan/phpstan": "^1.10.2", + "phpstan/phpstan-strict-rules": "^1.5", "phpunit/phpcov": "^8.2", "phpunit/phpunit": "^9.1", "predis/predis": "^1.1 || ^2.0", From 92cf3bbfd2456207b545f5c4e90278a51b940d44 Mon Sep 17 00:00:00 2001 From: kenjis Date: Sat, 9 Sep 2023 17:48:01 +0900 Subject: [PATCH 047/209] chore: enable disallowedConstructs --- phpstan.neon.dist | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 671b0133aaea..77470c3c0613 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -10,6 +10,7 @@ services: includes: - phpstan-baseline.php + - vendor/phpstan/phpstan-strict-rules/rules.neon parameters: phpVersion: 80100 @@ -41,3 +42,6 @@ parameters: checkGenericClassInNonGenericObjectType: false checkMissingCallableSignature: true treatPhpDocTypesAsCertain: false + strictRules: + allRules: false + disallowedConstructs: true From a3507c8a0040289a153bcff27ce97594b04a16f9 Mon Sep 17 00:00:00 2001 From: kenjis Date: Sat, 9 Sep 2023 18:10:16 +0900 Subject: [PATCH 048/209] chore: update baseline vendor/bin/phpstan analyze --generate-baseline phpstan-baseline.php --- phpstan-baseline.php | 1722 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 1656 insertions(+), 66 deletions(-) diff --git a/phpstan-baseline.php b/phpstan-baseline.php index e3267ecafdca..471a422ea745 100644 --- a/phpstan-baseline.php +++ b/phpstan-baseline.php @@ -1,11 +1,91 @@ '#^PHPDoc type array\\ of property Config\\\\Modules\\:\\:\\$aliases is not the same as PHPDoc type array of overridden property CodeIgniter\\\\Modules\\\\Modules\\:\\:\\$aliases\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/app/Config/Modules.php', +]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type CodeIgniter\\\\HTTP\\\\CLIRequest\\|CodeIgniter\\\\HTTP\\\\IncomingRequest of property App\\\\Controllers\\\\BaseController\\:\\:\\$request is not the same as PHPDoc type CodeIgniter\\\\HTTP\\\\RequestInterface of overridden property CodeIgniter\\\\Controller\\:\\:\\$request\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/app/Controllers/BaseController.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Call to function method_exists\\(\\) with \'Composer\\\\\\\\InstalledVersions\' and \'getAllRawData\' will always evaluate to true\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Autoloader/Autoloader.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 13, + 'path' => __DIR__ . '/system/Autoloader/FileLocator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 6, + 'path' => __DIR__ . '/system/Autoloader/FileLocator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 16, + 'path' => __DIR__ . '/system/BaseModel.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\BaseModel\\:\\:chunk\\(\\) has parameter \\$userFunc with no signature specified for Closure\\.$#', 'count' => 1, 'path' => __DIR__ . '/system/BaseModel.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Strict comparison using \\!\\=\\= between mixed and null will always evaluate to true\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/BaseModel.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 5, + 'path' => __DIR__ . '/system/CLI/BaseCommand.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 6, + 'path' => __DIR__ . '/system/CLI/CLI.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 5, + 'path' => __DIR__ . '/system/CLI/CLI.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Cache/CacheFactory.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Call to function property_exists\\(\\) with Config\\\\Cache and \'file\' will always evaluate to true\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Cache/Handlers/FileHandler.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Cache/Handlers/FileHandler.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Cache/Handlers/FileHandler.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Variable \\$result might not be defined\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Cache/Handlers/FileHandler.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 6, + 'path' => __DIR__ . '/system/CodeIgniter.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\CodeIgniter\\:\\:bootstrapEnvironment\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -76,6 +156,46 @@ 'count' => 1, 'path' => __DIR__ . '/system/CodeIgniter.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Database/CreateDatabase.php', +]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type array\\ of property CodeIgniter\\\\Commands\\\\Database\\\\CreateDatabase\\:\\:\\$arguments is not the same as PHPDoc type array of overridden property CodeIgniter\\\\CLI\\\\BaseCommand\\:\\:\\$arguments\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Database/CreateDatabase.php', +]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type array\\ of property CodeIgniter\\\\Commands\\\\Database\\\\CreateDatabase\\:\\:\\$options is not the same as PHPDoc type array of overridden property CodeIgniter\\\\CLI\\\\BaseCommand\\:\\:\\$options\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Database/CreateDatabase.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Database/MigrateStatus.php', +]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type array\\ of property CodeIgniter\\\\Commands\\\\Database\\\\MigrateStatus\\:\\:\\$options is not the same as PHPDoc type array of overridden property CodeIgniter\\\\CLI\\\\BaseCommand\\:\\:\\$options\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Database/MigrateStatus.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Parameter \\#1 \\$params \\(array\\\\) of method CodeIgniter\\\\Commands\\\\Database\\\\MigrateStatus\\:\\:run\\(\\) should be contravariant with parameter \\$params \\(array\\\\) of method CodeIgniter\\\\CLI\\\\BaseCommand\\:\\:run\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Database/MigrateStatus.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Database/Seed.php', +]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type array\\ of property CodeIgniter\\\\Commands\\\\Database\\\\Seed\\:\\:\\$arguments is not the same as PHPDoc type array of overridden property CodeIgniter\\\\CLI\\\\BaseCommand\\:\\:\\$arguments\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Database/Seed.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Commands\\\\Database\\\\ShowTableInfo\\:\\:showAllTables\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -86,6 +206,21 @@ 'count' => 1, 'path' => __DIR__ . '/system/Commands/Database/ShowTableInfo.php', ]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type array\\ of property CodeIgniter\\\\Commands\\\\Database\\\\ShowTableInfo\\:\\:\\$arguments is not the same as PHPDoc type array of overridden property CodeIgniter\\\\CLI\\\\BaseCommand\\:\\:\\$arguments\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Database/ShowTableInfo.php', +]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type array\\ of property CodeIgniter\\\\Commands\\\\Database\\\\ShowTableInfo\\:\\:\\$options is not the same as PHPDoc type array of overridden property CodeIgniter\\\\CLI\\\\BaseCommand\\:\\:\\$options\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Database/ShowTableInfo.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Commands/Generators/CellGenerator.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Commands\\\\Generators\\\\CellGenerator\\:\\:generateClass\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -96,6 +231,16 @@ 'count' => 1, 'path' => __DIR__ . '/system/Commands/Generators/CellGenerator.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Commands/Generators/CellGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Commands/Generators/CommandGenerator.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Commands\\\\Generators\\\\CommandGenerator\\:\\:generateClass\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -106,6 +251,16 @@ 'count' => 1, 'path' => __DIR__ . '/system/Commands/Generators/CommandGenerator.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Commands/Generators/CommandGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Commands/Generators/ConfigGenerator.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Commands\\\\Generators\\\\ConfigGenerator\\:\\:generateClass\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -116,6 +271,16 @@ 'count' => 1, 'path' => __DIR__ . '/system/Commands/Generators/ConfigGenerator.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Commands/Generators/ConfigGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Commands/Generators/ControllerGenerator.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Commands\\\\Generators\\\\ControllerGenerator\\:\\:generateClass\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -126,6 +291,16 @@ 'count' => 1, 'path' => __DIR__ . '/system/Commands/Generators/ControllerGenerator.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Commands/Generators/ControllerGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Commands/Generators/EntityGenerator.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Commands\\\\Generators\\\\EntityGenerator\\:\\:generateClass\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -136,6 +311,16 @@ 'count' => 1, 'path' => __DIR__ . '/system/Commands/Generators/EntityGenerator.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Commands/Generators/EntityGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Commands/Generators/FilterGenerator.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Commands\\\\Generators\\\\FilterGenerator\\:\\:generateClass\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -146,6 +331,16 @@ 'count' => 1, 'path' => __DIR__ . '/system/Commands/Generators/FilterGenerator.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Commands/Generators/FilterGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Commands/Generators/MigrationGenerator.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Commands\\\\Generators\\\\MigrationGenerator\\:\\:generateClass\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -156,6 +351,16 @@ 'count' => 1, 'path' => __DIR__ . '/system/Commands/Generators/MigrationGenerator.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Commands/Generators/MigrationGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Commands/Generators/ModelGenerator.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Commands\\\\Generators\\\\ModelGenerator\\:\\:generateClass\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -166,6 +371,16 @@ 'count' => 1, 'path' => __DIR__ . '/system/Commands/Generators/ModelGenerator.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Commands/Generators/ModelGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Commands/Generators/ScaffoldGenerator.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Commands\\\\Generators\\\\ScaffoldGenerator\\:\\:generateClass\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -176,6 +391,16 @@ 'count' => 1, 'path' => __DIR__ . '/system/Commands/Generators/ScaffoldGenerator.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Commands/Generators/ScaffoldGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Commands/Generators/SeederGenerator.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Commands\\\\Generators\\\\SeederGenerator\\:\\:generateClass\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -186,6 +411,16 @@ 'count' => 1, 'path' => __DIR__ . '/system/Commands/Generators/SeederGenerator.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Commands/Generators/SeederGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Commands/Generators/SessionMigrationGenerator.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Commands\\\\Generators\\\\SessionMigrationGenerator\\:\\:generateClass\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -196,6 +431,16 @@ 'count' => 1, 'path' => __DIR__ . '/system/Commands/Generators/SessionMigrationGenerator.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Commands/Generators/SessionMigrationGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Commands/Generators/ValidationGenerator.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Commands\\\\Generators\\\\ValidationGenerator\\:\\:generateClass\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -206,6 +451,11 @@ 'count' => 1, 'path' => __DIR__ . '/system/Commands/Generators/ValidationGenerator.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Commands/Generators/ValidationGenerator.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Commands\\\\ListCommands\\:\\:listFull\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -216,6 +466,36 @@ 'count' => 1, 'path' => __DIR__ . '/system/Commands/ListCommands.php', ]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type array\\ of property CodeIgniter\\\\Commands\\\\Utilities\\\\Environment\\:\\:\\$arguments is not the same as PHPDoc type array of overridden property CodeIgniter\\\\CLI\\\\BaseCommand\\:\\:\\$arguments\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Utilities/Environment.php', +]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type array\\ of property CodeIgniter\\\\Commands\\\\Utilities\\\\FilterCheck\\:\\:\\$arguments is not the same as PHPDoc type array of overridden property CodeIgniter\\\\CLI\\\\BaseCommand\\:\\:\\$arguments\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Utilities/FilterCheck.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Utilities/Namespaces.php', +]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type array\\ of property CodeIgniter\\\\Commands\\\\Utilities\\\\Publish\\:\\:\\$arguments is not the same as PHPDoc type array of overridden property CodeIgniter\\\\CLI\\\\BaseCommand\\:\\:\\$arguments\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Utilities/Publish.php', +]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type array\\ of property CodeIgniter\\\\Commands\\\\Utilities\\\\Routes\\:\\:\\$options is not the same as PHPDoc type array of overridden property CodeIgniter\\\\CLI\\\\BaseCommand\\:\\:\\$options\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Utilities/Routes.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Implicit array creation is not allowed \\- variable \\$filters might not exist\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Utilities/Routes/AutoRouterImproved/AutoRouteCollector.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Commands\\\\Utilities\\\\Routes\\\\AutoRouterImproved\\\\AutoRouteCollector\\:\\:addFilters\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -226,6 +506,21 @@ 'count' => 1, 'path' => __DIR__ . '/system/Commands/Utilities/Routes/AutoRouterImproved/AutoRouteCollector.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Utilities/Routes/AutoRouterImproved/ControllerMethodReader.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Utilities/Routes/ControllerMethodReader.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 8, + 'path' => __DIR__ . '/system/Common.php', +]; $ignoreErrors[] = [ 'message' => '#^Function force_https\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -241,11 +536,61 @@ 'count' => 1, 'path' => __DIR__ . '/system/Common.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Common.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\ComposerScripts\\:\\:postUpdate\\(\\) has no return type specified\\.$#', 'count' => 1, 'path' => __DIR__ . '/system/ComposerScripts.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 3, + 'path' => __DIR__ . '/system/Config/BaseService.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Config/DotEnv.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Config/Services.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 4, + 'path' => __DIR__ . '/system/Config/Services.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Controller.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Parameter \\#1 \\$offset \\(string\\) of method CodeIgniter\\\\Cookie\\\\Cookie\\:\\:offsetSet\\(\\) should be contravariant with parameter \\$offset \\(string\\|null\\) of method ArrayAccess\\\\:\\:offsetSet\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Cookie/Cookie.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 5, + 'path' => __DIR__ . '/system/Cookie/Cookie.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Call to function is_string\\(\\) with non\\-falsy\\-string will always evaluate to true\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/BaseBuilder.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 40, + 'path' => __DIR__ . '/system/Database/BaseBuilder.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Database\\\\BaseBuilder\\:\\:_whereIn\\(\\) has parameter \\$values with no signature specified for Closure\\.$#', 'count' => 1, @@ -336,6 +681,11 @@ 'count' => 1, 'path' => __DIR__ . '/system/Database/BaseConnection.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 13, + 'path' => __DIR__ . '/system/Database/BaseConnection.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Database\\\\BaseConnection\\:\\:close\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -351,11 +701,41 @@ 'count' => 1, 'path' => __DIR__ . '/system/Database/BaseConnection.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(array\\{code\\: int\\|string\\|null, message\\: string\\|null\\}\\) of method CodeIgniter\\\\Database\\\\BaseConnection\\:\\:error\\(\\) should be covariant with return type \\(array\\\\) of method CodeIgniter\\\\Database\\\\ConnectionInterface\\\\:\\:error\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/BaseConnection.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/BaseConnection.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 3, + 'path' => __DIR__ . '/system/Database/BasePreparedQuery.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Database\\\\BasePreparedQuery\\:\\:execute\\(\\) has parameter \\$data with no type specified\\.$#', 'count' => 1, 'path' => __DIR__ . '/system/Database/BasePreparedQuery.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 10, + 'path' => __DIR__ . '/system/Database/BaseResult.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Parameter \\#1 \\$className \\(class\\-string\\) of method CodeIgniter\\\\Database\\\\BaseResult\\:\\:getCustomResultObject\\(\\) should be contravariant with parameter \\$className \\(string\\) of method CodeIgniter\\\\Database\\\\ResultInterface\\\\:\\:getCustomResultObject\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/BaseResult.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 4, + 'path' => __DIR__ . '/system/Database/BaseUtils.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Database\\\\Config\\:\\:ensureFactory\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -371,6 +751,11 @@ 'count' => 2, 'path' => __DIR__ . '/system/Database/Database.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 3, + 'path' => __DIR__ . '/system/Database/Database.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Database\\\\Exceptions\\\\DataException\\:\\:forEmptyInputGiven\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -391,6 +776,11 @@ 'count' => 1, 'path' => __DIR__ . '/system/Database/Exceptions/DataException.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 16, + 'path' => __DIR__ . '/system/Database/Forge.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Database\\\\Forge\\:\\:_attributeAutoIncrement\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -436,6 +826,11 @@ 'count' => 1, 'path' => __DIR__ . '/system/Database/Migration.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 8, + 'path' => __DIR__ . '/system/Database/MigrationRunner.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Database\\\\MigrationRunner\\:\\:addHistory\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -471,16 +866,101 @@ 'count' => 1, 'path' => __DIR__ . '/system/Database/ModelFactory.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/MySQLi/Builder.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 12, + 'path' => __DIR__ . '/system/Database/MySQLi/Connection.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Method CodeIgniter\\\\Database\\\\MySQLi\\\\Connection\\:\\:_close\\(\\) should return mixed but return statement is missing\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/MySQLi/Connection.php', +]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type string of property CodeIgniter\\\\Database\\\\MySQLi\\\\Connection\\:\\:\\$escapeChar is not the same as PHPDoc type array\\|string of overridden property CodeIgniter\\\\Database\\\\BaseConnection\\\\:\\:\\$escapeChar\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/MySQLi/Connection.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(array\\\\) of method CodeIgniter\\\\Database\\\\MySQLi\\\\Connection\\:\\:error\\(\\) should be covariant with return type \\(array\\{code\\: int\\|string\\|null, message\\: string\\|null\\}\\) of method CodeIgniter\\\\Database\\\\BaseConnection\\\\:\\:error\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/MySQLi/Connection.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 6, + 'path' => __DIR__ . '/system/Database/MySQLi/Forge.php', +]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type string of property CodeIgniter\\\\Database\\\\MySQLi\\\\Forge\\:\\:\\$createDatabaseStr is not the same as PHPDoc type string\\|false of overridden property CodeIgniter\\\\Database\\\\Forge\\:\\:\\$createDatabaseStr\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/MySQLi/Forge.php', +]; $ignoreErrors[] = [ 'message' => '#^Access to an undefined property CodeIgniter\\\\Database\\\\BaseConnection\\\\:\\:\\$mysqli\\.$#', 'count' => 3, 'path' => __DIR__ . '/system/Database/MySQLi/PreparedQuery.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(CodeIgniter\\\\Database\\\\MySQLi\\\\PreparedQuery\\) of method CodeIgniter\\\\Database\\\\MySQLi\\\\PreparedQuery\\:\\:_prepare\\(\\) should be covariant with return type \\(\\$this\\(CodeIgniter\\\\Database\\\\BasePreparedQuery\\\\)\\) of method CodeIgniter\\\\Database\\\\BasePreparedQuery\\\\:\\:_prepare\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/MySQLi/PreparedQuery.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(mysqli_result\\|false\\) of method CodeIgniter\\\\Database\\\\MySQLi\\\\PreparedQuery\\:\\:_getResult\\(\\) should be covariant with return type \\(object\\|resource\\|null\\) of method CodeIgniter\\\\Database\\\\BasePreparedQuery\\\\:\\:_getResult\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/MySQLi/PreparedQuery.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/MySQLi/Result.php', +]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type string of property CodeIgniter\\\\Database\\\\MySQLi\\\\Utils\\:\\:\\$listDatabases is not the same as PHPDoc type bool\\|string of overridden property CodeIgniter\\\\Database\\\\BaseUtils\\:\\:\\$listDatabases\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/MySQLi/Utils.php', +]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type string of property CodeIgniter\\\\Database\\\\MySQLi\\\\Utils\\:\\:\\$optimizeTable is not the same as PHPDoc type bool\\|string of overridden property CodeIgniter\\\\Database\\\\BaseUtils\\:\\:\\$optimizeTable\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/MySQLi/Utils.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 4, + 'path' => __DIR__ . '/system/Database/OCI8/Builder.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Database\\\\OCI8\\\\Builder\\:\\:resetSelect\\(\\) has no return type specified\\.$#', 'count' => 1, 'path' => __DIR__ . '/system/Database/OCI8/Builder.php', ]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type CodeIgniter\\\\Database\\\\OCI8\\\\Connection of property CodeIgniter\\\\Database\\\\OCI8\\\\Builder\\:\\:\\$db is not the same as PHPDoc type CodeIgniter\\\\Database\\\\BaseConnection of overridden property CodeIgniter\\\\Database\\\\BaseBuilder\\:\\:\\$db\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/OCI8/Builder.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(mixed\\) of method CodeIgniter\\\\Database\\\\OCI8\\\\Builder\\:\\:delete\\(\\) should be covariant with return type \\(bool\\|string\\) of method CodeIgniter\\\\Database\\\\BaseBuilder\\:\\:delete\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/OCI8/Builder.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 5, + 'path' => __DIR__ . '/system/Database/OCI8/Connection.php', +]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type string of property CodeIgniter\\\\Database\\\\OCI8\\\\Connection\\:\\:\\$escapeChar is not the same as PHPDoc type array\\|string of overridden property CodeIgniter\\\\Database\\\\BaseConnection\\\\:\\:\\$escapeChar\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/OCI8/Connection.php', +]; $ignoreErrors[] = [ 'message' => '#^Property CodeIgniter\\\\Database\\\\OCI8\\\\Connection\\:\\:\\$resetStmtId has no type specified\\.$#', 'count' => 1, @@ -491,6 +971,101 @@ 'count' => 1, 'path' => __DIR__ . '/system/Database/OCI8/Connection.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(array\\{code\\: int\\|string\\|null, message\\: string\\|null\\}\\) of method CodeIgniter\\\\Database\\\\OCI8\\\\Connection\\:\\:error\\(\\) should be covariant with return type \\(array\\\\) of method CodeIgniter\\\\Database\\\\ConnectionInterface\\\\:\\:error\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/OCI8/Connection.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 3, + 'path' => __DIR__ . '/system/Database/OCI8/Forge.php', +]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type false of property CodeIgniter\\\\Database\\\\OCI8\\\\Forge\\:\\:\\$createDatabaseStr is not the same as PHPDoc type string\\|false of overridden property CodeIgniter\\\\Database\\\\Forge\\:\\:\\$createDatabaseStr\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/OCI8/Forge.php', +]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type false of property CodeIgniter\\\\Database\\\\OCI8\\\\Forge\\:\\:\\$createTableIfStr is not the same as PHPDoc type bool\\|string of overridden property CodeIgniter\\\\Database\\\\Forge\\:\\:\\$createTableIfStr\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/OCI8/Forge.php', +]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type false of property CodeIgniter\\\\Database\\\\OCI8\\\\Forge\\:\\:\\$dropDatabaseStr is not the same as PHPDoc type string\\|false of overridden property CodeIgniter\\\\Database\\\\Forge\\:\\:\\$dropDatabaseStr\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/OCI8/Forge.php', +]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type false of property CodeIgniter\\\\Database\\\\OCI8\\\\Forge\\:\\:\\$dropTableIfStr is not the same as PHPDoc type bool\\|string of overridden property CodeIgniter\\\\Database\\\\Forge\\:\\:\\$dropTableIfStr\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/OCI8/Forge.php', +]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type string of property CodeIgniter\\\\Database\\\\OCI8\\\\Forge\\:\\:\\$renameTableStr is not the same as PHPDoc type string\\|false of overridden property CodeIgniter\\\\Database\\\\Forge\\:\\:\\$renameTableStr\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/OCI8/Forge.php', +]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type CodeIgniter\\\\Database\\\\OCI8\\\\Connection of property CodeIgniter\\\\Database\\\\OCI8\\\\PreparedQuery\\:\\:\\$db is not the same as PHPDoc type CodeIgniter\\\\Database\\\\BaseConnection\\ of overridden property CodeIgniter\\\\Database\\\\BasePreparedQuery\\\\:\\:\\$db\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/OCI8/PreparedQuery.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(CodeIgniter\\\\Database\\\\OCI8\\\\PreparedQuery\\) of method CodeIgniter\\\\Database\\\\OCI8\\\\PreparedQuery\\:\\:_prepare\\(\\) should be covariant with return type \\(\\$this\\(CodeIgniter\\\\Database\\\\BasePreparedQuery\\\\)\\) of method CodeIgniter\\\\Database\\\\BasePreparedQuery\\\\:\\:_prepare\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/OCI8/PreparedQuery.php', +]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type string of property CodeIgniter\\\\Database\\\\OCI8\\\\Utils\\:\\:\\$listDatabases is not the same as PHPDoc type bool\\|string of overridden property CodeIgniter\\\\Database\\\\BaseUtils\\:\\:\\$listDatabases\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/OCI8/Utils.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 8, + 'path' => __DIR__ . '/system/Database/Postgre/Builder.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(CodeIgniter\\\\Database\\\\BaseBuilder\\) of method CodeIgniter\\\\Database\\\\Postgre\\\\Builder\\:\\:join\\(\\) should be covariant with return type \\(\\$this\\(CodeIgniter\\\\Database\\\\BaseBuilder\\)\\) of method CodeIgniter\\\\Database\\\\BaseBuilder\\:\\:join\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/Postgre/Builder.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(CodeIgniter\\\\Database\\\\BaseBuilder\\) of method CodeIgniter\\\\Database\\\\Postgre\\\\Builder\\:\\:orderBy\\(\\) should be covariant with return type \\(\\$this\\(CodeIgniter\\\\Database\\\\BaseBuilder\\)\\) of method CodeIgniter\\\\Database\\\\BaseBuilder\\:\\:orderBy\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/Postgre/Builder.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(mixed\\) of method CodeIgniter\\\\Database\\\\Postgre\\\\Builder\\:\\:decrement\\(\\) should be covariant with return type \\(bool\\) of method CodeIgniter\\\\Database\\\\BaseBuilder\\:\\:decrement\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/Postgre/Builder.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(mixed\\) of method CodeIgniter\\\\Database\\\\Postgre\\\\Builder\\:\\:delete\\(\\) should be covariant with return type \\(bool\\|string\\) of method CodeIgniter\\\\Database\\\\BaseBuilder\\:\\:delete\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/Postgre/Builder.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(mixed\\) of method CodeIgniter\\\\Database\\\\Postgre\\\\Builder\\:\\:increment\\(\\) should be covariant with return type \\(bool\\) of method CodeIgniter\\\\Database\\\\BaseBuilder\\:\\:increment\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/Postgre/Builder.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(mixed\\) of method CodeIgniter\\\\Database\\\\Postgre\\\\Builder\\:\\:replace\\(\\) should be covariant with return type \\(CodeIgniter\\\\Database\\\\BaseResult\\|CodeIgniter\\\\Database\\\\Query\\|string\\|false\\) of method CodeIgniter\\\\Database\\\\BaseBuilder\\:\\:replace\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/Postgre/Builder.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Database/Postgre/Connection.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Method CodeIgniter\\\\Database\\\\Postgre\\\\Connection\\:\\:_close\\(\\) should return mixed but return statement is missing\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/Postgre/Connection.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Database\\\\Postgre\\\\Connection\\:\\:buildDSN\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -501,6 +1076,11 @@ 'count' => 1, 'path' => __DIR__ . '/system/Database/Postgre/Connection.php', ]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type string of property CodeIgniter\\\\Database\\\\Postgre\\\\Connection\\:\\:\\$escapeChar is not the same as PHPDoc type array\\|string of overridden property CodeIgniter\\\\Database\\\\BaseConnection\\\\:\\:\\$escapeChar\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/Postgre/Connection.php', +]; $ignoreErrors[] = [ 'message' => '#^Property CodeIgniter\\\\Database\\\\Postgre\\\\Connection\\:\\:\\$connect_timeout has no type specified\\.$#', 'count' => 1, @@ -521,6 +1101,21 @@ 'count' => 1, 'path' => __DIR__ . '/system/Database/Postgre/Connection.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(array\\\\) of method CodeIgniter\\\\Database\\\\Postgre\\\\Connection\\:\\:error\\(\\) should be covariant with return type \\(array\\{code\\: int\\|string\\|null, message\\: string\\|null\\}\\) of method CodeIgniter\\\\Database\\\\BaseConnection\\\\:\\:error\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/Postgre/Connection.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/Postgre/Connection.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 4, + 'path' => __DIR__ . '/system/Database/Postgre/Forge.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Database\\\\Postgre\\\\Forge\\:\\:_attributeAutoIncrement\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -531,11 +1126,46 @@ 'count' => 1, 'path' => __DIR__ . '/system/Database/Postgre/Forge.php', ]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type CodeIgniter\\\\Database\\\\Postgre\\\\Connection of property CodeIgniter\\\\Database\\\\Postgre\\\\Forge\\:\\:\\$db is not the same as PHPDoc type CodeIgniter\\\\Database\\\\BaseConnection of overridden property CodeIgniter\\\\Database\\\\Forge\\:\\:\\$db\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/Postgre/Forge.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(array\\|bool\\|string\\) of method CodeIgniter\\\\Database\\\\Postgre\\\\Forge\\:\\:_alterTable\\(\\) should be covariant with return type \\(array\\\\|string\\|false\\) of method CodeIgniter\\\\Database\\\\Forge\\:\\:_alterTable\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/Postgre/Forge.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(CodeIgniter\\\\Database\\\\Postgre\\\\PreparedQuery\\) of method CodeIgniter\\\\Database\\\\Postgre\\\\PreparedQuery\\:\\:_prepare\\(\\) should be covariant with return type \\(\\$this\\(CodeIgniter\\\\Database\\\\BasePreparedQuery\\\\)\\) of method CodeIgniter\\\\Database\\\\BasePreparedQuery\\\\:\\:_prepare\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/Postgre/PreparedQuery.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/Postgre/Result.php', +]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type string of property CodeIgniter\\\\Database\\\\Postgre\\\\Utils\\:\\:\\$listDatabases is not the same as PHPDoc type bool\\|string of overridden property CodeIgniter\\\\Database\\\\BaseUtils\\:\\:\\$listDatabases\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/Postgre/Utils.php', +]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type string of property CodeIgniter\\\\Database\\\\Postgre\\\\Utils\\:\\:\\$optimizeTable is not the same as PHPDoc type bool\\|string of overridden property CodeIgniter\\\\Database\\\\BaseUtils\\:\\:\\$optimizeTable\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/Postgre/Utils.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Database\\\\PreparedQueryInterface\\:\\:execute\\(\\) has parameter \\$data with no type specified\\.$#', 'count' => 1, 'path' => __DIR__ . '/system/Database/PreparedQueryInterface.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 3, + 'path' => __DIR__ . '/system/Database/Query.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Database\\\\Query\\:\\:compileBinds\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -556,11 +1186,61 @@ 'count' => 2, 'path' => __DIR__ . '/system/Database/SQLSRV/Builder.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 15, + 'path' => __DIR__ . '/system/Database/SQLSRV/Builder.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Parameter \\#1 \\$selectOverride \\(bool\\) of method CodeIgniter\\\\Database\\\\SQLSRV\\\\Builder\\:\\:compileSelect\\(\\) should be contravariant with parameter \\$selectOverride \\(mixed\\) of method CodeIgniter\\\\Database\\\\BaseBuilder\\:\\:compileSelect\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/SQLSRV/Builder.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(CodeIgniter\\\\Database\\\\BaseBuilder\\) of method CodeIgniter\\\\Database\\\\SQLSRV\\\\Builder\\:\\:maxMinAvgSum\\(\\) should be covariant with return type \\(\\$this\\(CodeIgniter\\\\Database\\\\BaseBuilder\\)\\) of method CodeIgniter\\\\Database\\\\BaseBuilder\\:\\:maxMinAvgSum\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/SQLSRV/Builder.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(mixed\\) of method CodeIgniter\\\\Database\\\\SQLSRV\\\\Builder\\:\\:delete\\(\\) should be covariant with return type \\(bool\\|string\\) of method CodeIgniter\\\\Database\\\\BaseBuilder\\:\\:delete\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/SQLSRV/Builder.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(mixed\\) of method CodeIgniter\\\\Database\\\\SQLSRV\\\\Builder\\:\\:replace\\(\\) should be covariant with return type \\(CodeIgniter\\\\Database\\\\BaseResult\\|CodeIgniter\\\\Database\\\\Query\\|string\\|false\\) of method CodeIgniter\\\\Database\\\\BaseBuilder\\:\\:replace\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/SQLSRV/Builder.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 8, + 'path' => __DIR__ . '/system/Database/SQLSRV/Connection.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Method CodeIgniter\\\\Database\\\\SQLSRV\\\\Connection\\:\\:_close\\(\\) should return mixed but return statement is missing\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/SQLSRV/Connection.php', +]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type string of property CodeIgniter\\\\Database\\\\SQLSRV\\\\Connection\\:\\:\\$escapeChar is not the same as PHPDoc type array\\|string of overridden property CodeIgniter\\\\Database\\\\BaseConnection\\\\:\\:\\$escapeChar\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/SQLSRV/Connection.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(array\\\\) of method CodeIgniter\\\\Database\\\\SQLSRV\\\\Connection\\:\\:error\\(\\) should be covariant with return type \\(array\\{code\\: int\\|string\\|null, message\\: string\\|null\\}\\) of method CodeIgniter\\\\Database\\\\BaseConnection\\\\:\\:error\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/SQLSRV/Connection.php', +]; $ignoreErrors[] = [ 'message' => '#^Access to an undefined property CodeIgniter\\\\Database\\\\BaseConnection\\:\\:\\$schema\\.$#', 'count' => 13, 'path' => __DIR__ . '/system/Database/SQLSRV/Forge.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 6, + 'path' => __DIR__ . '/system/Database/SQLSRV/Forge.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Database\\\\SQLSRV\\\\Forge\\:\\:_attributeAutoIncrement\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -572,160 +1252,795 @@ 'path' => __DIR__ . '/system/Database/SQLSRV/Forge.php', ]; $ignoreErrors[] = [ - 'message' => '#^Method CodeIgniter\\\\Database\\\\SQLite3\\\\Forge\\:\\:_attributeAutoIncrement\\(\\) has no return type specified\\.$#', + 'message' => '#^PHPDoc type array of property CodeIgniter\\\\Database\\\\SQLSRV\\\\Forge\\:\\:\\$unsigned is not the same as PHPDoc type array\\|bool of overridden property CodeIgniter\\\\Database\\\\Forge\\:\\:\\$unsigned\\.$#', 'count' => 1, - 'path' => __DIR__ . '/system/Database/SQLite3/Forge.php', + 'path' => __DIR__ . '/system/Database/SQLSRV/Forge.php', ]; $ignoreErrors[] = [ - 'message' => '#^Method CodeIgniter\\\\Database\\\\SQLite3\\\\Forge\\:\\:_attributeType\\(\\) has no return type specified\\.$#', + 'message' => '#^PHPDoc type string of property CodeIgniter\\\\Database\\\\SQLSRV\\\\Forge\\:\\:\\$createDatabaseStr is not the same as PHPDoc type string\\|false of overridden property CodeIgniter\\\\Database\\\\Forge\\:\\:\\$createDatabaseStr\\.$#', 'count' => 1, - 'path' => __DIR__ . '/system/Database/SQLite3/Forge.php', + 'path' => __DIR__ . '/system/Database/SQLSRV/Forge.php', ]; $ignoreErrors[] = [ - 'message' => '#^Method CodeIgniter\\\\Database\\\\SQLite3\\\\Table\\:\\:copyData\\(\\) has no return type specified\\.$#', + 'message' => '#^PHPDoc type string of property CodeIgniter\\\\Database\\\\SQLSRV\\\\Forge\\:\\:\\$createTableIfStr is not the same as PHPDoc type bool\\|string of overridden property CodeIgniter\\\\Database\\\\Forge\\:\\:\\$createTableIfStr\\.$#', 'count' => 1, - 'path' => __DIR__ . '/system/Database/SQLite3/Table.php', + 'path' => __DIR__ . '/system/Database/SQLSRV/Forge.php', ]; $ignoreErrors[] = [ - 'message' => '#^Method CodeIgniter\\\\Database\\\\SQLite3\\\\Table\\:\\:dropIndexes\\(\\) has no return type specified\\.$#', + 'message' => '#^PHPDoc type string of property CodeIgniter\\\\Database\\\\SQLSRV\\\\Forge\\:\\:\\$renameTableStr is not the same as PHPDoc type string\\|false of overridden property CodeIgniter\\\\Database\\\\Forge\\:\\:\\$renameTableStr\\.$#', 'count' => 1, - 'path' => __DIR__ . '/system/Database/SQLite3/Table.php', + 'path' => __DIR__ . '/system/Database/SQLSRV/Forge.php', ]; $ignoreErrors[] = [ - 'message' => '#^Method CodeIgniter\\\\Database\\\\Seeder\\:\\:call\\(\\) has no return type specified\\.$#', + 'message' => '#^PHPDoc type CodeIgniter\\\\Database\\\\SQLSRV\\\\Connection of property CodeIgniter\\\\Database\\\\SQLSRV\\\\PreparedQuery\\:\\:\\$db is not the same as PHPDoc type CodeIgniter\\\\Database\\\\BaseConnection\\ of overridden property CodeIgniter\\\\Database\\\\BasePreparedQuery\\\\:\\:\\$db\\.$#', 'count' => 1, - 'path' => __DIR__ . '/system/Database/Seeder.php', + 'path' => __DIR__ . '/system/Database/SQLSRV/PreparedQuery.php', ]; $ignoreErrors[] = [ - 'message' => '#^Property CodeIgniter\\\\Log\\\\Logger\\:\\:\\$logCache \\(array\\) on left side of \\?\\? is not nullable\\.$#', + 'message' => '#^Return type \\(CodeIgniter\\\\Database\\\\SQLSRV\\\\PreparedQuery\\) of method CodeIgniter\\\\Database\\\\SQLSRV\\\\PreparedQuery\\:\\:_prepare\\(\\) should be covariant with return type \\(\\$this\\(CodeIgniter\\\\Database\\\\BasePreparedQuery\\\\)\\) of method CodeIgniter\\\\Database\\\\BasePreparedQuery\\\\:\\:_prepare\\(\\)$#', 'count' => 1, - 'path' => __DIR__ . '/system/Debug/Toolbar/Collectors/Logs.php', + 'path' => __DIR__ . '/system/Database/SQLSRV/PreparedQuery.php', ]; $ignoreErrors[] = [ - 'message' => '#^Call to an undefined method CodeIgniter\\\\View\\\\RendererInterface\\:\\:getData\\(\\)\\.$#', + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 1, - 'path' => __DIR__ . '/system/Debug/Toolbar/Collectors/Views.php', + 'path' => __DIR__ . '/system/Database/SQLSRV/Result.php', ]; $ignoreErrors[] = [ - 'message' => '#^Call to an undefined method CodeIgniter\\\\View\\\\RendererInterface\\:\\:getPerformanceData\\(\\)\\.$#', + 'message' => '#^PHPDoc type string of property CodeIgniter\\\\Database\\\\SQLSRV\\\\Utils\\:\\:\\$listDatabases is not the same as PHPDoc type bool\\|string of overridden property CodeIgniter\\\\Database\\\\BaseUtils\\:\\:\\$listDatabases\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/SQLSRV/Utils.php', +]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type string of property CodeIgniter\\\\Database\\\\SQLSRV\\\\Utils\\:\\:\\$optimizeTable is not the same as PHPDoc type bool\\|string of overridden property CodeIgniter\\\\Database\\\\BaseUtils\\:\\:\\$optimizeTable\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/SQLSRV/Utils.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 2, - 'path' => __DIR__ . '/system/Debug/Toolbar/Collectors/Views.php', + 'path' => __DIR__ . '/system/Database/SQLite3/Builder.php', ]; $ignoreErrors[] = [ - 'message' => '#^Static property CodeIgniter\\\\Email\\\\Email\\:\\:\\$func_overload \\(bool\\) in isset\\(\\) is not nullable\\.$#', + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 1, - 'path' => __DIR__ . '/system/Email/Email.php', + 'path' => __DIR__ . '/system/Database/SQLite3/Connection.php', ]; $ignoreErrors[] = [ - 'message' => '#^Method CodeIgniter\\\\Events\\\\Events\\:\\:on\\(\\) has parameter \\$callback with no signature specified for callable\\.$#', + 'message' => '#^Method CodeIgniter\\\\Database\\\\SQLite3\\\\Connection\\:\\:_close\\(\\) should return mixed but return statement is missing\\.$#', 'count' => 1, - 'path' => __DIR__ . '/system/Events/Events.php', + 'path' => __DIR__ . '/system/Database/SQLite3/Connection.php', ]; $ignoreErrors[] = [ - 'message' => '#^Method CodeIgniter\\\\Events\\\\Events\\:\\:removeListener\\(\\) has parameter \\$listener with no signature specified for callable\\.$#', + 'message' => '#^PHPDoc type string of property CodeIgniter\\\\Database\\\\SQLite3\\\\Connection\\:\\:\\$escapeChar is not the same as PHPDoc type array\\|string of overridden property CodeIgniter\\\\Database\\\\BaseConnection\\\\:\\:\\$escapeChar\\.$#', 'count' => 1, - 'path' => __DIR__ . '/system/Events/Events.php', + 'path' => __DIR__ . '/system/Database/SQLite3/Connection.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(array\\\\) of method CodeIgniter\\\\Database\\\\SQLite3\\\\Connection\\:\\:error\\(\\) should be covariant with return type \\(array\\{code\\: int\\|string\\|null, message\\: string\\|null\\}\\) of method CodeIgniter\\\\Database\\\\BaseConnection\\\\:\\:error\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/SQLite3/Connection.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Database/SQLite3/Forge.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Method CodeIgniter\\\\Database\\\\SQLite3\\\\Forge\\:\\:_attributeAutoIncrement\\(\\) has no return type specified\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/SQLite3/Forge.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Method CodeIgniter\\\\Database\\\\SQLite3\\\\Forge\\:\\:_attributeType\\(\\) has no return type specified\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/SQLite3/Forge.php', +]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type CodeIgniter\\\\Database\\\\SQLite3\\\\Connection of property CodeIgniter\\\\Database\\\\SQLite3\\\\Forge\\:\\:\\$db is not the same as PHPDoc type CodeIgniter\\\\Database\\\\BaseConnection of overridden property CodeIgniter\\\\Database\\\\Forge\\:\\:\\$db\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/SQLite3/Forge.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(array\\|string\\|null\\) of method CodeIgniter\\\\Database\\\\SQLite3\\\\Forge\\:\\:_alterTable\\(\\) should be covariant with return type \\(array\\\\|string\\|false\\) of method CodeIgniter\\\\Database\\\\Forge\\:\\:_alterTable\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/SQLite3/Forge.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(CodeIgniter\\\\Database\\\\SQLite3\\\\PreparedQuery\\) of method CodeIgniter\\\\Database\\\\SQLite3\\\\PreparedQuery\\:\\:_prepare\\(\\) should be covariant with return type \\(\\$this\\(CodeIgniter\\\\Database\\\\BasePreparedQuery\\\\)\\) of method CodeIgniter\\\\Database\\\\BasePreparedQuery\\\\:\\:_prepare\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/SQLite3/PreparedQuery.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(SQLite3Result\\|false\\) of method CodeIgniter\\\\Database\\\\SQLite3\\\\PreparedQuery\\:\\:_getResult\\(\\) should be covariant with return type \\(object\\|resource\\|null\\) of method CodeIgniter\\\\Database\\\\BasePreparedQuery\\\\:\\:_getResult\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/SQLite3/PreparedQuery.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Class stdClass referenced with incorrect case\\: stdclass\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Database/SQLite3/Table.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 3, + 'path' => __DIR__ . '/system/Database/SQLite3/Table.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Method CodeIgniter\\\\Database\\\\SQLite3\\\\Table\\:\\:copyData\\(\\) has no return type specified\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/SQLite3/Table.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Method CodeIgniter\\\\Database\\\\SQLite3\\\\Table\\:\\:dropIndexes\\(\\) has no return type specified\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/SQLite3/Table.php', +]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type string of property CodeIgniter\\\\Database\\\\SQLite3\\\\Utils\\:\\:\\$optimizeTable is not the same as PHPDoc type bool\\|string of overridden property CodeIgniter\\\\Database\\\\BaseUtils\\:\\:\\$optimizeTable\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/SQLite3/Utils.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/Seeder.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Method CodeIgniter\\\\Database\\\\Seeder\\:\\:call\\(\\) has no return type specified\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/Seeder.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Method CodeIgniter\\\\Database\\\\Seeder\\:\\:run\\(\\) should return mixed but return statement is missing\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/Seeder.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Debug/BaseExceptionHandler.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Debug/ExceptionHandler.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 3, + 'path' => __DIR__ . '/system/Debug/Exceptions.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Debug/Iterator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 5, + 'path' => __DIR__ . '/system/Debug/Timer.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 5, + 'path' => __DIR__ . '/system/Debug/Toolbar.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Debug/Toolbar/Collectors/Database.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Debug/Toolbar/Collectors/Database.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Debug/Toolbar/Collectors/History.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Debug/Toolbar/Collectors/Logs.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Property CodeIgniter\\\\Log\\\\Logger\\:\\:\\$logCache \\(array\\) on left side of \\?\\? is not nullable\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Debug/Toolbar/Collectors/Logs.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Call to an undefined method CodeIgniter\\\\View\\\\RendererInterface\\:\\:getData\\(\\)\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Debug/Toolbar/Collectors/Views.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Call to an undefined method CodeIgniter\\\\View\\\\RendererInterface\\:\\:getPerformanceData\\(\\)\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Debug/Toolbar/Collectors/Views.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 14, + 'path' => __DIR__ . '/system/Email/Email.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Static property CodeIgniter\\\\Email\\\\Email\\:\\:\\$func_overload \\(bool\\) in isset\\(\\) is not nullable\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Email/Email.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Encryption/Encryption.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Encryption/Handlers/OpenSSLHandler.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Encryption/Handlers/SodiumHandler.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Parameter \\#1 \\$value \\(bool\\|int\\|string\\) of method CodeIgniter\\\\Entity\\\\Cast\\\\IntBoolCast\\:\\:set\\(\\) should be contravariant with parameter \\$value \\(array\\|bool\\|float\\|int\\|object\\|string\\|null\\) of method CodeIgniter\\\\Entity\\\\Cast\\\\BaseCast\\:\\:set\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Entity/Cast/IntBoolCast.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Parameter \\#1 \\$value \\(bool\\|int\\|string\\) of method CodeIgniter\\\\Entity\\\\Cast\\\\IntBoolCast\\:\\:set\\(\\) should be contravariant with parameter \\$value \\(array\\|bool\\|float\\|int\\|object\\|string\\|null\\) of method CodeIgniter\\\\Entity\\\\Cast\\\\CastInterface\\:\\:set\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Entity/Cast/IntBoolCast.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Parameter \\#1 \\$value \\(int\\) of method CodeIgniter\\\\Entity\\\\Cast\\\\IntBoolCast\\:\\:get\\(\\) should be contravariant with parameter \\$value \\(array\\|bool\\|float\\|int\\|object\\|string\\|null\\) of method CodeIgniter\\\\Entity\\\\Cast\\\\BaseCast\\:\\:get\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Entity/Cast/IntBoolCast.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Parameter \\#1 \\$value \\(int\\) of method CodeIgniter\\\\Entity\\\\Cast\\\\IntBoolCast\\:\\:get\\(\\) should be contravariant with parameter \\$value \\(array\\|bool\\|float\\|int\\|object\\|string\\|null\\) of method CodeIgniter\\\\Entity\\\\Cast\\\\CastInterface\\:\\:get\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Entity/Cast/IntBoolCast.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 4, + 'path' => __DIR__ . '/system/Entity/Entity.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Method CodeIgniter\\\\Events\\\\Events\\:\\:on\\(\\) has parameter \\$callback with no signature specified for callable\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Events/Events.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Method CodeIgniter\\\\Events\\\\Events\\:\\:removeListener\\(\\) has parameter \\$listener with no signature specified for callable\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Events/Events.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Events/Events.php', +]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type int of property CodeIgniter\\\\Exceptions\\\\PageNotFoundException\\:\\:\\$code is not the same as PHPDoc type mixed of overridden property Exception\\:\\:\\$code\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Exceptions/PageNotFoundException.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Call to method SplFileInfo\\:\\:getBasename\\(\\) with incorrect case\\: getBaseName$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Files/File.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Files/File.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Property CodeIgniter\\\\Files\\\\File\\:\\:\\$size \\(int\\) on left side of \\?\\? is not nullable\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Files/File.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 3, + 'path' => __DIR__ . '/system/Files/File.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Filters/Filters.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Expression on left side of \\?\\? is not nullable\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Filters/Filters.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/HTTP/CLIRequest.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 10, + 'path' => __DIR__ . '/system/HTTP/CURLRequest.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Constructor of class CodeIgniter\\\\HTTP\\\\CURLRequest has an unused parameter \\$config\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/CURLRequest.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/CURLRequest.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 9, + 'path' => __DIR__ . '/system/HTTP/ContentSecurityPolicy.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(CodeIgniter\\\\HTTP\\\\DownloadResponse\\) of method CodeIgniter\\\\HTTP\\\\DownloadResponse\\:\\:noCache\\(\\) should be covariant with return type \\(\\$this\\(CodeIgniter\\\\HTTP\\\\Response\\)\\) of method CodeIgniter\\\\HTTP\\\\Response\\:\\:noCache\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/DownloadResponse.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(CodeIgniter\\\\HTTP\\\\DownloadResponse\\) of method CodeIgniter\\\\HTTP\\\\DownloadResponse\\:\\:noCache\\(\\) should be covariant with return type \\(\\$this\\(CodeIgniter\\\\HTTP\\\\ResponseInterface\\)\\) of method CodeIgniter\\\\HTTP\\\\ResponseInterface\\:\\:noCache\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/DownloadResponse.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(CodeIgniter\\\\HTTP\\\\DownloadResponse\\) of method CodeIgniter\\\\HTTP\\\\DownloadResponse\\:\\:sendBody\\(\\) should be covariant with return type \\(\\$this\\(CodeIgniter\\\\HTTP\\\\Response\\)\\) of method CodeIgniter\\\\HTTP\\\\Response\\:\\:sendBody\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/DownloadResponse.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(CodeIgniter\\\\HTTP\\\\DownloadResponse\\) of method CodeIgniter\\\\HTTP\\\\DownloadResponse\\:\\:sendBody\\(\\) should be covariant with return type \\(\\$this\\(CodeIgniter\\\\HTTP\\\\ResponseInterface\\)\\) of method CodeIgniter\\\\HTTP\\\\ResponseInterface\\:\\:sendBody\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/DownloadResponse.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(CodeIgniter\\\\HTTP\\\\ResponseInterface\\) of method CodeIgniter\\\\HTTP\\\\DownloadResponse\\:\\:setContentType\\(\\) should be covariant with return type \\(\\$this\\(CodeIgniter\\\\HTTP\\\\Response\\)\\) of method CodeIgniter\\\\HTTP\\\\Response\\:\\:setContentType\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/DownloadResponse.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(CodeIgniter\\\\HTTP\\\\ResponseInterface\\) of method CodeIgniter\\\\HTTP\\\\DownloadResponse\\:\\:setContentType\\(\\) should be covariant with return type \\(\\$this\\(CodeIgniter\\\\HTTP\\\\ResponseInterface\\)\\) of method CodeIgniter\\\\HTTP\\\\ResponseInterface\\:\\:setContentType\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/DownloadResponse.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(CodeIgniter\\\\HTTP\\\\Exceptions\\\\HTTPException\\) of method CodeIgniter\\\\HTTP\\\\Exceptions\\\\HTTPException\\:\\:forInvalidFile\\(\\) should be covariant with return type \\(static\\(CodeIgniter\\\\Exceptions\\\\FrameworkException\\)\\) of method CodeIgniter\\\\Exceptions\\\\FrameworkException\\:\\:forInvalidFile\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/Exceptions/HTTPException.php', +]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type int of property CodeIgniter\\\\HTTP\\\\Exceptions\\\\RedirectException\\:\\:\\$code is not the same as PHPDoc type mixed of overridden property Exception\\:\\:\\$code\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/Exceptions/RedirectException.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/Exceptions/RedirectException.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Call to function is_array\\(\\) with array will always evaluate to true\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/Files/FileCollection.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/Files/FileCollection.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Expression on left side of \\?\\? is not nullable\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/Files/UploadedFile.php', +]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type string of property CodeIgniter\\\\HTTP\\\\Files\\\\UploadedFile\\:\\:\\$originalMimeType is not the same as PHPDoc type string\\|null of overridden property CodeIgniter\\\\Files\\\\File\\:\\:\\$originalMimeType\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/Files/UploadedFile.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Property CodeIgniter\\\\HTTP\\\\Files\\\\UploadedFile\\:\\:\\$error \\(int\\) on left side of \\?\\? is not nullable\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/HTTP/Files/UploadedFile.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(bool\\) of method CodeIgniter\\\\HTTP\\\\Files\\\\UploadedFile\\:\\:move\\(\\) should be compatible with return type \\(CodeIgniter\\\\Files\\\\File\\) of method CodeIgniter\\\\Files\\\\File\\:\\:move\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/Files/UploadedFile.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/Files/UploadedFile.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 7, + 'path' => __DIR__ . '/system/HTTP/IncomingRequest.php', +]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type CodeIgniter\\\\HTTP\\\\URI of property CodeIgniter\\\\HTTP\\\\IncomingRequest\\:\\:\\$uri is not the same as PHPDoc type CodeIgniter\\\\HTTP\\\\URI\\|null of overridden property CodeIgniter\\\\HTTP\\\\OutgoingRequest\\:\\:\\$uri\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/IncomingRequest.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/HTTP/Message.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Property CodeIgniter\\\\HTTP\\\\Message\\:\\:\\$protocolVersion \\(string\\) on left side of \\?\\? is not nullable\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/Message.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Call to function is_array\\(\\) with array will always evaluate to true\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/Negotiate.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 3, + 'path' => __DIR__ . '/system/HTTP/Negotiate.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(CodeIgniter\\\\HTTP\\\\URI\\|null\\) of method CodeIgniter\\\\HTTP\\\\OutgoingRequest\\:\\:getUri\\(\\) should be covariant with return type \\(CodeIgniter\\\\HTTP\\\\URI\\) of method CodeIgniter\\\\HTTP\\\\OutgoingRequestInterface\\:\\:getUri\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/OutgoingRequest.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Variable \\$_GET on left side of \\?\\? always exists and is not nullable\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/RedirectResponse.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Variable \\$_POST on left side of \\?\\? always exists and is not nullable\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/RedirectResponse.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 3, + 'path' => __DIR__ . '/system/HTTP/Request.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 6, + 'path' => __DIR__ . '/system/HTTP/Response.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 5, + 'path' => __DIR__ . '/system/HTTP/Response.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 4, + 'path' => __DIR__ . '/system/HTTP/SiteURI.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Strict comparison using \\!\\=\\= between mixed and null will always evaluate to true\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/SiteURI.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 15, + 'path' => __DIR__ . '/system/HTTP/URI.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Property CodeIgniter\\\\HTTP\\\\URI\\:\\:\\$fragment \\(string\\) on left side of \\?\\? is not nullable\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/URI.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Property CodeIgniter\\\\HTTP\\\\URI\\:\\:\\$host \\(string\\) on left side of \\?\\? is not nullable\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/URI.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Property CodeIgniter\\\\HTTP\\\\URI\\:\\:\\$path \\(string\\) on left side of \\?\\? is not nullable\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/URI.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Strict comparison using \\!\\=\\= between mixed and null will always evaluate to true\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/URI.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 3, + 'path' => __DIR__ . '/system/HTTP/UserAgent.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 3, + 'path' => __DIR__ . '/system/Helpers/array_helper.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Helpers/date_helper.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Right side of && is always true\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Helpers/filesystem_helper.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Helpers/filesystem_helper.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Variable \\$result might not be defined\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Helpers/filesystem_helper.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Call to function is_array\\(\\) with array will always evaluate to true\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Helpers/form_helper.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 4, + 'path' => __DIR__ . '/system/Helpers/form_helper.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 6, + 'path' => __DIR__ . '/system/Helpers/html_helper.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Helpers/number_helper.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Helpers/test_helper.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 3, + 'path' => __DIR__ . '/system/Helpers/text_helper.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Helpers/url_helper.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Implicit array creation is not allowed \\- variable \\$atts might not exist\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Helpers/url_helper.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Variable \\$atts might not be defined\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Helpers/url_helper.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Honeypot/Honeypot.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 3, + 'path' => __DIR__ . '/system/I18n/Time.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(CodeIgniter\\\\I18n\\\\Time\\) of method CodeIgniter\\\\I18n\\\\Time\\:\\:setTimestamp\\(\\) should be covariant with return type \\(static\\(DateTimeImmutable\\)\\) of method DateTimeImmutable\\:\\:setTimestamp\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/I18n/Time.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(CodeIgniter\\\\I18n\\\\Time\\) of method CodeIgniter\\\\I18n\\\\Time\\:\\:setTimezone\\(\\) should be covariant with return type \\(static\\(DateTimeImmutable\\)\\) of method DateTimeImmutable\\:\\:setTimezone\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/I18n/Time.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 4, + 'path' => __DIR__ . '/system/I18n/Time.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 3, + 'path' => __DIR__ . '/system/I18n/TimeLegacy.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(CodeIgniter\\\\I18n\\\\TimeLegacy\\) of method CodeIgniter\\\\I18n\\\\TimeLegacy\\:\\:setTimestamp\\(\\) should be covariant with return type \\(static\\(DateTime\\)\\) of method DateTime\\:\\:setTimestamp\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/I18n/TimeLegacy.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(CodeIgniter\\\\I18n\\\\TimeLegacy\\) of method CodeIgniter\\\\I18n\\\\TimeLegacy\\:\\:setTimezone\\(\\) should be covariant with return type \\(static\\(DateTime\\)\\) of method DateTime\\:\\:setTimezone\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/I18n/TimeLegacy.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 4, + 'path' => __DIR__ . '/system/I18n/TimeLegacy.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 3, + 'path' => __DIR__ . '/system/Images/Handlers/BaseHandler.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Method CodeIgniter\\\\Images\\\\Handlers\\\\BaseHandler\\:\\:__call\\(\\) should return mixed but return statement is missing\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Images/Handlers/BaseHandler.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Property CodeIgniter\\\\Images\\\\Handlers\\\\BaseHandler\\:\\:\\$image \\(CodeIgniter\\\\Images\\\\Image\\) in empty\\(\\) is not falsy\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Images/Handlers/BaseHandler.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(CodeIgniter\\\\Images\\\\Handlers\\\\BaseHandler\\) of method CodeIgniter\\\\Images\\\\Handlers\\\\BaseHandler\\:\\:fit\\(\\) should be covariant with return type \\(\\$this\\(CodeIgniter\\\\Images\\\\ImageHandlerInterface\\)\\) of method CodeIgniter\\\\Images\\\\ImageHandlerInterface\\:\\:fit\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Images/Handlers/BaseHandler.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(CodeIgniter\\\\Images\\\\Handlers\\\\BaseHandler\\) of method CodeIgniter\\\\Images\\\\Handlers\\\\BaseHandler\\:\\:resize\\(\\) should be covariant with return type \\(\\$this\\(CodeIgniter\\\\Images\\\\ImageHandlerInterface\\)\\) of method CodeIgniter\\\\Images\\\\ImageHandlerInterface\\:\\:resize\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Images/Handlers/BaseHandler.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Comparison operation "\\>\\=" between \\(array\\|float\\|int\\) and 0 results in an error\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Images/Handlers/ImageMagickHandler.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 10, + 'path' => __DIR__ . '/system/Images/Handlers/ImageMagickHandler.php', +]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type string\\|null of property CodeIgniter\\\\Images\\\\Handlers\\\\ImageMagickHandler\\:\\:\\$resource is not the same as PHPDoc type resource\\|null of overridden property CodeIgniter\\\\Images\\\\Handlers\\\\BaseHandler\\:\\:\\$resource\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Images/Handlers/ImageMagickHandler.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Property CodeIgniter\\\\Images\\\\Handlers\\\\BaseHandler\\:\\:\\$height \\(int\\) on left side of \\?\\? is not nullable\\.$#', + 'count' => 4, + 'path' => __DIR__ . '/system/Images/Handlers/ImageMagickHandler.php', ]; $ignoreErrors[] = [ - 'message' => '#^Property CodeIgniter\\\\Files\\\\File\\:\\:\\$size \\(int\\) on left side of \\?\\? is not nullable\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/Files/File.php', + 'message' => '#^Property CodeIgniter\\\\Images\\\\Handlers\\\\BaseHandler\\:\\:\\$width \\(int\\) on left side of \\?\\? is not nullable\\.$#', + 'count' => 4, + 'path' => __DIR__ . '/system/Images/Handlers/ImageMagickHandler.php', ]; $ignoreErrors[] = [ - 'message' => '#^Expression on left side of \\?\\? is not nullable\\.$#', + 'message' => '#^Return type \\(CodeIgniter\\\\Images\\\\Handlers\\\\ImageMagickHandler\\) of method CodeIgniter\\\\Images\\\\Handlers\\\\ImageMagickHandler\\:\\:_resize\\(\\) should be covariant with return type \\(\\$this\\(CodeIgniter\\\\Images\\\\Handlers\\\\BaseHandler\\)\\) of method CodeIgniter\\\\Images\\\\Handlers\\\\BaseHandler\\:\\:_resize\\(\\)$#', 'count' => 1, - 'path' => __DIR__ . '/system/Filters/Filters.php', + 'path' => __DIR__ . '/system/Images/Handlers/ImageMagickHandler.php', ]; $ignoreErrors[] = [ - 'message' => '#^Constructor of class CodeIgniter\\\\HTTP\\\\CURLRequest has an unused parameter \\$config\\.$#', + 'message' => '#^Return type \\(bool\\|CodeIgniter\\\\Images\\\\Handlers\\\\ImageMagickHandler\\) of method CodeIgniter\\\\Images\\\\Handlers\\\\ImageMagickHandler\\:\\:_crop\\(\\) should be covariant with return type \\(\\$this\\(CodeIgniter\\\\Images\\\\Handlers\\\\BaseHandler\\)\\) of method CodeIgniter\\\\Images\\\\Handlers\\\\BaseHandler\\:\\:_crop\\(\\)$#', 'count' => 1, - 'path' => __DIR__ . '/system/HTTP/CURLRequest.php', + 'path' => __DIR__ . '/system/Images/Handlers/ImageMagickHandler.php', ]; $ignoreErrors[] = [ - 'message' => '#^Expression on left side of \\?\\? is not nullable\\.$#', + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 1, - 'path' => __DIR__ . '/system/HTTP/Files/UploadedFile.php', + 'path' => __DIR__ . '/system/Images/Image.php', ]; $ignoreErrors[] = [ - 'message' => '#^Property CodeIgniter\\\\HTTP\\\\Files\\\\UploadedFile\\:\\:\\$error \\(int\\) on left side of \\?\\? is not nullable\\.$#', + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 2, - 'path' => __DIR__ . '/system/HTTP/Files/UploadedFile.php', + 'path' => __DIR__ . '/system/Log/Handlers/FileHandler.php', ]; $ignoreErrors[] = [ - 'message' => '#^Return type \\(bool\\) of method CodeIgniter\\\\HTTP\\\\Files\\\\UploadedFile\\:\\:move\\(\\) should be compatible with return type \\(CodeIgniter\\\\Files\\\\File\\) of method CodeIgniter\\\\Files\\\\File\\:\\:move\\(\\)$#', + 'message' => '#^Strict comparison using \\=\\=\\= between true and true will always evaluate to true\\.$#', 'count' => 1, - 'path' => __DIR__ . '/system/HTTP/Files/UploadedFile.php', + 'path' => __DIR__ . '/system/Log/Handlers/FileHandler.php', ]; $ignoreErrors[] = [ - 'message' => '#^Property CodeIgniter\\\\HTTP\\\\Message\\:\\:\\$protocolVersion \\(string\\) on left side of \\?\\? is not nullable\\.$#', + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 1, - 'path' => __DIR__ . '/system/HTTP/Message.php', + 'path' => __DIR__ . '/system/Log/Logger.php', ]; $ignoreErrors[] = [ - 'message' => '#^Variable \\$_GET on left side of \\?\\? always exists and is not nullable\\.$#', + 'message' => '#^Parameter \\#1 \\$level \\(string\\) of method CodeIgniter\\\\Log\\\\Logger\\:\\:log\\(\\) should be contravariant with parameter \\$level \\(mixed\\) of method Psr\\\\Log\\\\LoggerInterface\\:\\:log\\(\\)$#', 'count' => 1, - 'path' => __DIR__ . '/system/HTTP/RedirectResponse.php', + 'path' => __DIR__ . '/system/Log/Logger.php', ]; $ignoreErrors[] = [ - 'message' => '#^Variable \\$_POST on left side of \\?\\? always exists and is not nullable\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/HTTP/RedirectResponse.php', + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 21, + 'path' => __DIR__ . '/system/Model.php', ]; $ignoreErrors[] = [ - 'message' => '#^Property CodeIgniter\\\\HTTP\\\\URI\\:\\:\\$fragment \\(string\\) on left side of \\?\\? is not nullable\\.$#', + 'message' => '#^Method CodeIgniter\\\\Model\\:\\:chunk\\(\\) has parameter \\$userFunc with no signature specified for Closure\\.$#', 'count' => 1, - 'path' => __DIR__ . '/system/HTTP/URI.php', + 'path' => __DIR__ . '/system/Model.php', ]; $ignoreErrors[] = [ - 'message' => '#^Property CodeIgniter\\\\HTTP\\\\URI\\:\\:\\$host \\(string\\) on left side of \\?\\? is not nullable\\.$#', + 'message' => '#^Return type \\(array\\|bool\\|float\\|int\\|object\\|string\\|null\\) of method CodeIgniter\\\\Model\\:\\:__call\\(\\) should be covariant with return type \\(\\$this\\(CodeIgniter\\\\BaseModel\\)\\|null\\) of method CodeIgniter\\\\BaseModel\\:\\:__call\\(\\)$#', 'count' => 1, - 'path' => __DIR__ . '/system/HTTP/URI.php', + 'path' => __DIR__ . '/system/Model.php', ]; $ignoreErrors[] = [ - 'message' => '#^Property CodeIgniter\\\\HTTP\\\\URI\\:\\:\\$path \\(string\\) on left side of \\?\\? is not nullable\\.$#', + 'message' => '#^Return type \\(int\\|object\\|string\\|false\\) of method CodeIgniter\\\\Model\\:\\:insert\\(\\) should be covariant with return type \\(bool\\|int\\|string\\) of method CodeIgniter\\\\BaseModel\\:\\:insert\\(\\)$#', 'count' => 1, - 'path' => __DIR__ . '/system/HTTP/URI.php', + 'path' => __DIR__ . '/system/Model.php', ]; $ignoreErrors[] = [ - 'message' => '#^Right side of && is always true\\.$#', + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 4, + 'path' => __DIR__ . '/system/Pager/Pager.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', 'count' => 1, - 'path' => __DIR__ . '/system/Helpers/filesystem_helper.php', + 'path' => __DIR__ . '/system/Pager/Pager.php', ]; $ignoreErrors[] = [ - 'message' => '#^Property CodeIgniter\\\\Images\\\\Handlers\\\\BaseHandler\\:\\:\\$image \\(CodeIgniter\\\\Images\\\\Image\\) in empty\\(\\) is not falsy\\.$#', + 'message' => '#^Call to method CodeIgniter\\\\Pager\\\\PagerRenderer\\:\\:getNext\\(\\) with incorrect case\\: getnext$#', 'count' => 1, - 'path' => __DIR__ . '/system/Images/Handlers/BaseHandler.php', + 'path' => __DIR__ . '/system/Pager/Views/default_simple.php', ]; $ignoreErrors[] = [ - 'message' => '#^Comparison operation "\\>\\=" between \\(array\\|float\\|int\\) and 0 results in an error\\.$#', - 'count' => 2, - 'path' => __DIR__ . '/system/Images/Handlers/ImageMagickHandler.php', + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 4, + 'path' => __DIR__ . '/system/RESTful/BaseResource.php', ]; $ignoreErrors[] = [ - 'message' => '#^PHPDoc type string\\|null of property CodeIgniter\\\\Images\\\\Handlers\\\\ImageMagickHandler\\:\\:\\$resource is not covariant with PHPDoc type resource\\|null of overridden property CodeIgniter\\\\Images\\\\Handlers\\\\BaseHandler\\:\\:\\$resource\\.$#', + 'message' => '#^PHPDoc type CodeIgniter\\\\HTTP\\\\CLIRequest\\|CodeIgniter\\\\HTTP\\\\IncomingRequest of property CodeIgniter\\\\RESTful\\\\BaseResource\\:\\:\\$request is not the same as PHPDoc type CodeIgniter\\\\HTTP\\\\RequestInterface of overridden property CodeIgniter\\\\Controller\\:\\:\\$request\\.$#', 'count' => 1, - 'path' => __DIR__ . '/system/Images/Handlers/ImageMagickHandler.php', + 'path' => __DIR__ . '/system/RESTful/BaseResource.php', ]; $ignoreErrors[] = [ - 'message' => '#^Property CodeIgniter\\\\Images\\\\Handlers\\\\BaseHandler\\:\\:\\$height \\(int\\) on left side of \\?\\? is not nullable\\.$#', - 'count' => 4, - 'path' => __DIR__ . '/system/Images/Handlers/ImageMagickHandler.php', + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/RESTful/ResourceController.php', ]; $ignoreErrors[] = [ - 'message' => '#^Property CodeIgniter\\\\Images\\\\Handlers\\\\BaseHandler\\:\\:\\$width \\(int\\) on left side of \\?\\? is not nullable\\.$#', - 'count' => 4, - 'path' => __DIR__ . '/system/Images/Handlers/ImageMagickHandler.php', + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 6, + 'path' => __DIR__ . '/system/Router/AutoRouter.php', ]; $ignoreErrors[] = [ - 'message' => '#^Method CodeIgniter\\\\Model\\:\\:chunk\\(\\) has parameter \\$userFunc with no signature specified for Closure\\.$#', + 'message' => '#^Property CodeIgniter\\\\Router\\\\AutoRouter\\:\\:\\$cliRoutes type has no signature specified for Closure\\.$#', 'count' => 1, - 'path' => __DIR__ . '/system/Model.php', + 'path' => __DIR__ . '/system/Router/AutoRouter.php', ]; $ignoreErrors[] = [ - 'message' => '#^Property CodeIgniter\\\\Router\\\\AutoRouter\\:\\:\\$cliRoutes type has no signature specified for Closure\\.$#', + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', 'count' => 1, 'path' => __DIR__ . '/system/Router/AutoRouter.php', ]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type int of property CodeIgniter\\\\Router\\\\Exceptions\\\\RedirectException\\:\\:\\$code is not the same as PHPDoc type mixed of overridden property Exception\\:\\:\\$code\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Router/Exceptions/RedirectException.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 8, + 'path' => __DIR__ . '/system/Router/RouteCollection.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Router\\\\RouteCollection\\:\\:add\\(\\) has parameter \\$to with no signature specified for Closure\\.$#', 'count' => 1, @@ -811,6 +2126,11 @@ 'count' => 1, 'path' => __DIR__ . '/system/Router/RouteCollection.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Router/RouteCollection.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Router\\\\RouteCollectionInterface\\:\\:add\\(\\) has parameter \\$to with no signature specified for Closure\\.$#', 'count' => 1, @@ -861,6 +2181,11 @@ 'count' => 1, 'path' => __DIR__ . '/system/Router/Router.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 5, + 'path' => __DIR__ . '/system/Router/Router.php', +]; $ignoreErrors[] = [ 'message' => '#^Expression on left side of \\?\\? is not nullable\\.$#', 'count' => 1, @@ -901,6 +2226,11 @@ 'count' => 1, 'path' => __DIR__ . '/system/Router/RouterInterface.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Security/Security.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Session\\\\Exceptions\\\\SessionException\\:\\:forEmptySavepath\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -941,16 +2271,51 @@ 'count' => 1, 'path' => __DIR__ . '/system/Session/Handlers/Database/PostgreHandler.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Session/Handlers/DatabaseHandler.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Session\\\\Handlers\\\\DatabaseHandler\\:\\:setSelect\\(\\) has no return type specified\\.$#', 'count' => 1, 'path' => __DIR__ . '/system/Session/Handlers/DatabaseHandler.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Session/Handlers/FileHandler.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Session\\\\Handlers\\\\FileHandler\\:\\:configureSessionIDRegex\\(\\) has no return type specified\\.$#', 'count' => 1, 'path' => __DIR__ . '/system/Session/Handlers/FileHandler.php', ]; +$ignoreErrors[] = [ + 'message' => '#^PHPDoc type string of property CodeIgniter\\\\Session\\\\Handlers\\\\FileHandler\\:\\:\\$savePath is not the same as PHPDoc type array\\|string of overridden property CodeIgniter\\\\Session\\\\Handlers\\\\BaseHandler\\:\\:\\$savePath\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Session/Handlers/FileHandler.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Variable \\$written might not be defined\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Session/Handlers/FileHandler.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 3, + 'path' => __DIR__ . '/system/Session/Handlers/MemcachedHandler.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 5, + 'path' => __DIR__ . '/system/Session/Handlers/RedisHandler.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 13, + 'path' => __DIR__ . '/system/Session/Session.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Session\\\\Session\\:\\:configure\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -1041,6 +2406,16 @@ 'count' => 1, 'path' => __DIR__ . '/system/Session/Session.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(bool\\) of method CodeIgniter\\\\Session\\\\Session\\:\\:markAsFlashdata\\(\\) should be covariant with return type \\(false\\) of method CodeIgniter\\\\Session\\\\SessionInterface\\:\\:markAsFlashdata\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Session/Session.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Session/Session.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Session\\\\SessionInterface\\:\\:destroy\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -1091,6 +2466,11 @@ 'count' => 1, 'path' => __DIR__ . '/system/Session/SessionInterface.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 4, + 'path' => __DIR__ . '/system/Test/CIDatabaseTestCase.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Test\\\\CIDatabaseTestCase\\:\\:clearInsertCache\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -1201,6 +2581,21 @@ 'count' => 1, 'path' => __DIR__ . '/system/Test/CIUnitTestCase.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Test/CIUnitTestCase.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Call to function is_array\\(\\) with non\\-empty\\-array will always evaluate to true\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Test/DOMParser.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 7, + 'path' => __DIR__ . '/system/Test/DOMParser.php', +]; $ignoreErrors[] = [ 'message' => '#^Access to an undefined property object\\:\\:\\$createdField\\.$#', 'count' => 1, @@ -1216,11 +2611,21 @@ 'count' => 1, 'path' => __DIR__ . '/system/Test/Fabricator.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 5, + 'path' => __DIR__ . '/system/Test/Fabricator.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Test\\\\Fabricator\\:\\:resetCounts\\(\\) has no return type specified\\.$#', 'count' => 1, 'path' => __DIR__ . '/system/Test/Fabricator.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 10, + 'path' => __DIR__ . '/system/Test/FeatureTestCase.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Test\\\\FeatureTestCase\\:\\:clearInsertCache\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -1341,6 +2746,11 @@ 'count' => 1, 'path' => __DIR__ . '/system/Test/Mock/MockCURLRequest.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 3, + 'path' => __DIR__ . '/system/Test/Mock/MockCache.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Test\\\\Mock\\\\MockCache\\:\\:assertHas\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -1356,6 +2766,21 @@ 'count' => 1, 'path' => __DIR__ . '/system/Test/Mock/MockCache.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(mixed\\) of method CodeIgniter\\\\Test\\\\Mock\\\\MockCache\\:\\:get\\(\\) should be covariant with return type \\(array\\|bool\\|float\\|int\\|object\\|string\\|null\\) of method CodeIgniter\\\\Cache\\\\CacheInterface\\:\\:get\\(\\)$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Test/Mock/MockCache.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(mixed\\) of method CodeIgniter\\\\Test\\\\Mock\\\\MockCache\\:\\:remember\\(\\) should be covariant with return type \\(array\\|bool\\|float\\|int\\|object\\|string\\|null\\) of method CodeIgniter\\\\Cache\\\\Handlers\\\\BaseHandler\\:\\:remember\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Test/Mock/MockCache.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Test/Mock/MockCache.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Test\\\\Mock\\\\MockCodeIgniter\\:\\:callExit\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -1366,6 +2791,16 @@ 'count' => 1, 'path' => __DIR__ . '/system/Test/Mock/MockConnection.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Test/Mock/MockConnection.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Method CodeIgniter\\\\Test\\\\Mock\\\\MockConnection\\:\\:_close\\(\\) should return mixed but return statement is missing\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Test/Mock/MockConnection.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Test\\\\Mock\\\\MockConnection\\:\\:shouldReturn\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -1381,6 +2816,36 @@ 'count' => 1, 'path' => __DIR__ . '/system/Test/Mock/MockConnection.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(array\\{code\\: int\\|string\\|null, message\\: string\\|null\\}\\) of method CodeIgniter\\\\Test\\\\Mock\\\\MockConnection\\:\\:error\\(\\) should be covariant with return type \\(array\\\\) of method CodeIgniter\\\\Database\\\\ConnectionInterface\\\\:\\:error\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Test/Mock/MockConnection.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(bool\\|CodeIgniter\\\\Database\\\\BaseResult\\|CodeIgniter\\\\Database\\\\Query\\) of method CodeIgniter\\\\Test\\\\Mock\\\\MockConnection\\:\\:query\\(\\) should be covariant with return type \\(bool\\|CodeIgniter\\\\Database\\\\BaseResult\\\\|CodeIgniter\\\\Database\\\\Query\\) of method CodeIgniter\\\\Database\\\\BaseConnection\\\\:\\:query\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Test/Mock/MockConnection.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(bool\\|CodeIgniter\\\\Database\\\\BaseResult\\|CodeIgniter\\\\Database\\\\Query\\) of method CodeIgniter\\\\Test\\\\Mock\\\\MockConnection\\:\\:query\\(\\) should be covariant with return type \\(bool\\|CodeIgniter\\\\Database\\\\BaseResult\\\\|CodeIgniter\\\\Database\\\\Query\\) of method CodeIgniter\\\\Database\\\\ConnectionInterface\\\\:\\:query\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Test/Mock/MockConnection.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(bool\\|object\\) of method CodeIgniter\\\\Test\\\\Mock\\\\MockConnection\\:\\:execute\\(\\) should be covariant with return type \\(object\\|resource\\|false\\) of method CodeIgniter\\\\Database\\\\BaseConnection\\\\:\\:execute\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Test/Mock/MockConnection.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(mixed\\) of method CodeIgniter\\\\Test\\\\Mock\\\\MockConnection\\:\\:connect\\(\\) should be covariant with return type \\(object\\|resource\\|false\\) of method CodeIgniter\\\\Database\\\\ConnectionInterface\\\\:\\:connect\\(\\)$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Test/Mock/MockConnection.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(mixed\\) of method CodeIgniter\\\\Test\\\\Mock\\\\MockConnection\\:\\:setDatabase\\(\\) should be covariant with return type \\(bool\\) of method CodeIgniter\\\\Database\\\\ConnectionInterface\\\\:\\:setDatabase\\(\\)$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Test/Mock/MockConnection.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Test\\\\Mock\\\\MockEvents\\:\\:getEventsFile\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -1441,6 +2906,11 @@ 'count' => 1, 'path' => __DIR__ . '/system/Test/Mock/MockResourceController.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Test/Mock/MockResourcePresenter.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Test\\\\Mock\\\\MockResourcePresenter\\:\\:getFormat\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -1466,6 +2936,16 @@ 'count' => 1, 'path' => __DIR__ . '/system/Test/Mock/MockResponse.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Method CodeIgniter\\\\Test\\\\Mock\\\\MockResult\\:\\:fetchAssoc\\(\\) should return mixed but return statement is missing\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Test/Mock/MockResult.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Return type \\(mixed\\) of method CodeIgniter\\\\Test\\\\Mock\\\\MockResult\\:\\:fetchAssoc\\(\\) should be covariant with return type \\(array\\|false\\|null\\) of method CodeIgniter\\\\Database\\\\BaseResult\\\\:\\:fetchAssoc\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Test/Mock/MockResult.php', +]; $ignoreErrors[] = [ 'message' => '#^Property CodeIgniter\\\\Test\\\\Mock\\\\MockSecurityConfig\\:\\:\\$excludeURIs has no type specified\\.$#', 'count' => 1, @@ -1541,11 +3021,26 @@ 'count' => 1, 'path' => __DIR__ . '/system/Test/TestLogger.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Parameter \\#1 \\$level \\(string\\) of method CodeIgniter\\\\Test\\\\TestLogger\\:\\:log\\(\\) should be contravariant with parameter \\$level \\(mixed\\) of method Psr\\\\Log\\\\LoggerInterface\\:\\:log\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Test/TestLogger.php', +]; $ignoreErrors[] = [ 'message' => '#^Property CodeIgniter\\\\Test\\\\TestLogger\\:\\:\\$op_logs has no type specified\\.$#', 'count' => 1, 'path' => __DIR__ . '/system/Test/TestLogger.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Test/TestResponse.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Method CodeIgniter\\\\Test\\\\TestResponse\\:\\:__call\\(\\) should return mixed but return statement is missing\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Test/TestResponse.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Test\\\\TestResponse\\:\\:assertCookie\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -1656,30 +3151,125 @@ 'count' => 1, 'path' => __DIR__ . '/system/Throttle/Throttler.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Validation/CreditCardRules.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Validation/DotArrayFilter.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 4, + 'path' => __DIR__ . '/system/Validation/FormatRules.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 11, + 'path' => __DIR__ . '/system/Validation/Rules.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 4, + 'path' => __DIR__ . '/system/Validation/StrictRules/Rules.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 5, + 'path' => __DIR__ . '/system/Validation/Validation.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Validation\\\\Validation\\:\\:isClosure\\(\\) has parameter \\$rule with no signature specified for Closure\\.$#', 'count' => 1, 'path' => __DIR__ . '/system/Validation/Validation.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Validation/Validation.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Validation/Views/list.php', +]; $ignoreErrors[] = [ 'message' => '#^Call to an undefined static method CodeIgniter\\\\Config\\\\Factories\\:\\:cells\\(\\)\\.$#', 'count' => 1, 'path' => __DIR__ . '/system/View/Cell.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 8, + 'path' => __DIR__ . '/system/View/Cell.php', +]; $ignoreErrors[] = [ 'message' => '#^Property CodeIgniter\\\\View\\\\Cell\\:\\:\\$cache \\(CodeIgniter\\\\Cache\\\\CacheInterface\\) in empty\\(\\) is not falsy\\.$#', 'count' => 2, 'path' => __DIR__ . '/system/View/Cell.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/View/Filters.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 9, + 'path' => __DIR__ . '/system/View/Parser.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\View\\\\Parser\\:\\:addPlugin\\(\\) has parameter \\$callback with no signature specified for callable\\.$#', 'count' => 1, 'path' => __DIR__ . '/system/View/Parser.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/View/Plugins.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 9, + 'path' => __DIR__ . '/system/View/Table.php', +]; $ignoreErrors[] = [ 'message' => '#^Property CodeIgniter\\\\View\\\\Table\\:\\:\\$function type has no signature specified for callable\\.$#', 'count' => 1, 'path' => __DIR__ . '/system/View/Table.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 3, + 'path' => __DIR__ . '/system/View/View.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Parameter \\#2 \\$context \\(\'attr\'\\|\'css\'\\|\'html\'\\|\'js\'\\|\'raw\'\\|\'url\'\\|null\\) of method CodeIgniter\\\\View\\\\View\\:\\:setData\\(\\) should be contravariant with parameter \\$context \\(string\\|null\\) of method CodeIgniter\\\\View\\\\RendererInterface\\:\\:setData\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/View/View.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Parameter \\#3 \\$context \\(\'attr\'\\|\'css\'\\|\'html\'\\|\'js\'\\|\'raw\'\\|\'url\'\\|null\\) of method CodeIgniter\\\\View\\\\View\\:\\:setVar\\(\\) should be contravariant with parameter \\$context \\(string\\|null\\) of method CodeIgniter\\\\View\\\\RendererInterface\\:\\:setVar\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/system/View/View.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/View/View.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Parameter \\#1 \\$node \\(PhpParser\\\\Node\\\\Expr\\\\New_\\) of method Utils\\\\PHPStan\\\\CheckFrameworkExceptionInstantiationViaNamedConstructorRule\\:\\:processNode\\(\\) should be contravariant with parameter \\$node \\(PhpParser\\\\Node\\) of method PHPStan\\\\Rules\\\\Rule\\\\:\\:processNode\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/utils/PHPStan/CheckFrameworkExceptionInstantiationViaNamedConstructorRule.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Parameter \\#1 \\$node \\(PhpParser\\\\Node\\\\Stmt\\) of method Utils\\\\PHPStan\\\\CheckUseStatementsAfterLicenseRule\\:\\:processNode\\(\\) should be contravariant with parameter \\$node \\(PhpParser\\\\Node\\) of method PHPStan\\\\Rules\\\\Rule\\\\:\\:processNode\\(\\)$#', + 'count' => 1, + 'path' => __DIR__ . '/utils/PHPStan/CheckUseStatementsAfterLicenseRule.php', +]; return ['parameters' => ['ignoreErrors' => $ignoreErrors]]; From 7d3db2ce5095850fcf4f3d83b21d038fccb76ef4 Mon Sep 17 00:00:00 2001 From: "John Paul E. Balandan, CPA" Date: Sun, 10 Sep 2023 15:03:23 +0800 Subject: [PATCH 049/209] fix: types for common functions --- phpstan-baseline.php | 15 --------------- system/Common.php | 6 ++++-- 2 files changed, 4 insertions(+), 17 deletions(-) diff --git a/phpstan-baseline.php b/phpstan-baseline.php index 471a422ea745..4d1cde2372b4 100644 --- a/phpstan-baseline.php +++ b/phpstan-baseline.php @@ -521,21 +521,6 @@ 'count' => 8, 'path' => __DIR__ . '/system/Common.php', ]; -$ignoreErrors[] = [ - 'message' => '#^Function force_https\\(\\) has no return type specified\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/Common.php', -]; -$ignoreErrors[] = [ - 'message' => '#^Function helper\\(\\) has no return type specified\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/Common.php', -]; -$ignoreErrors[] = [ - 'message' => '#^Function timer\\(\\) has parameter \\$callable with no signature specified for callable\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/Common.php', -]; $ignoreErrors[] = [ 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', 'count' => 2, diff --git a/system/Common.php b/system/Common.php index c964e10ea899..49c0f05af251 100644 --- a/system/Common.php +++ b/system/Common.php @@ -481,7 +481,7 @@ function force_https( int $duration = 31_536_000, ?RequestInterface $request = null, ?ResponseInterface $response = null - ) { + ): void { $request ??= Services::request(); if (! $request instanceof IncomingRequest) { @@ -590,7 +590,7 @@ function function_usable(string $functionName): bool * * @throws FileNotFoundException */ - function helper($filenames) + function helper($filenames): void { static $loaded = []; @@ -1139,6 +1139,8 @@ function stringify_attributes($attributes, bool $js = false): string * returns its return value if any. * Otherwise will start or stop the timer intelligently. * + * @phpstan-param (callable(): mixed)|null $callable + * * @return Timer */ function timer(?string $name = null, ?callable $callable = null) From a6eceb000c2917c347fa59dcf17021f4741add32 Mon Sep 17 00:00:00 2001 From: "John Paul E. Balandan, CPA" Date: Mon, 11 Sep 2023 10:22:59 +0800 Subject: [PATCH 050/209] refactor: remove unneeded arguments to session --- system/Common.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/Common.php b/system/Common.php index c964e10ea899..e95b0616d8eb 100644 --- a/system/Common.php +++ b/system/Common.php @@ -499,7 +499,7 @@ function force_https( // If the session status is active, we should regenerate // the session ID for safety sake. if (ENVIRONMENT !== 'testing' && session_status() === PHP_SESSION_ACTIVE) { - Services::session(null, true)->regenerate(); // @codeCoverageIgnore + Services::session()->regenerate(); // @codeCoverageIgnore } $baseURL = config(App::class)->baseURL; From 15787fdd8a3e90c92a7ae2c6ec58807fddf1936c Mon Sep 17 00:00:00 2001 From: Denny Septian Panggabean <97607754+ddevsr@users.noreply.github.com> Date: Mon, 11 Sep 2023 10:55:27 +0700 Subject: [PATCH 051/209] GH: auto label conflict PR --- .github/label-conflict.yml | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 .github/label-conflict.yml diff --git a/.github/label-conflict.yml b/.github/label-conflict.yml new file mode 100644 index 000000000000..fa9fe4a4408a --- /dev/null +++ b/.github/label-conflict.yml @@ -0,0 +1,38 @@ +name: Auto Label Conflicts +on: + push: + branches: + - 'develop' + - '4.*' + pull_request: + branches: + - 'develop' + - '4.*' + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + auto-label: + runs-on: ubuntu-latest + steps: + - uses: prince-chrismc/label-merge-conflicts-action@v3 + with: + conflict_label_name: "stale" + github_token: ${{ github.token }} + + # --- Optional Inputs --- + # To make sure the merge commit exactly matches the branch + detect_merge_changes: true # or true to handle as conflicts + # By default a comment will be left, adding `conflict_comment: ''` will disable comments + # The optional `${author}` will be replaced with the username of the pull request + conflict_comment: | + :wave: Hi, @${author}, + We detected conflicts against the base branch :speak_no_evil: + You'll want to sync :arrows_counterclockwise: your branch with upstream! + + Ref: https://github.com/codeigniter4/CodeIgniter4/blob/develop/contributing/workflow.md#pushing-your-branch From 4ac597b99e4576d70585ed5127ad0d7c9669d464 Mon Sep 17 00:00:00 2001 From: Denny Septian Panggabean <97607754+ddevsr@users.noreply.github.com> Date: Mon, 11 Sep 2023 11:01:29 +0700 Subject: [PATCH 052/209] Update label-conflict.yml --- .github/label-conflict.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/label-conflict.yml b/.github/label-conflict.yml index fa9fe4a4408a..88292a261ec2 100644 --- a/.github/label-conflict.yml +++ b/.github/label-conflict.yml @@ -15,6 +15,8 @@ concurrency: permissions: contents: read + issues: write + pull-requests: write jobs: auto-label: From 6f99752f6f368e221f3c60bec0308aa6dd8bd90a Mon Sep 17 00:00:00 2001 From: kenjis Date: Mon, 11 Sep 2023 13:04:10 +0900 Subject: [PATCH 053/209] test: change DBDebug to true --- tests/system/Database/BaseConnectionTest.php | 4 ++-- tests/system/Database/ConfigTest.php | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/system/Database/BaseConnectionTest.php b/tests/system/Database/BaseConnectionTest.php index 1d629832bf6c..4fb68358066b 100644 --- a/tests/system/Database/BaseConnectionTest.php +++ b/tests/system/Database/BaseConnectionTest.php @@ -32,7 +32,7 @@ final class BaseConnectionTest extends CIUnitTestCase 'DBDriver' => 'MockDriver', 'DBPrefix' => 'test_', 'pConnect' => true, - 'DBDebug' => (ENVIRONMENT !== 'production'), + 'DBDebug' => true, 'charset' => 'utf8', 'DBCollat' => 'utf8_general_ci', 'swapPre' => '', @@ -50,7 +50,7 @@ final class BaseConnectionTest extends CIUnitTestCase 'DBDriver' => 'MockDriver', 'DBPrefix' => 'test_', 'pConnect' => true, - 'DBDebug' => (ENVIRONMENT !== 'production'), + 'DBDebug' => true, 'charset' => 'utf8', 'DBCollat' => 'utf8_general_ci', 'swapPre' => '', diff --git a/tests/system/Database/ConfigTest.php b/tests/system/Database/ConfigTest.php index 37ecfeb6f5e2..e5fb383bc543 100644 --- a/tests/system/Database/ConfigTest.php +++ b/tests/system/Database/ConfigTest.php @@ -32,7 +32,7 @@ final class ConfigTest extends CIUnitTestCase 'DBDriver' => 'MySQLi', 'DBPrefix' => 'test_', 'pConnect' => true, - 'DBDebug' => (ENVIRONMENT !== 'production'), + 'DBDebug' => true, 'charset' => 'utf8', 'DBCollat' => 'utf8_general_ci', 'swapPre' => '', @@ -51,7 +51,7 @@ final class ConfigTest extends CIUnitTestCase 'DBDriver' => 'SQLite3', 'DBPrefix' => 't_', 'pConnect' => false, - 'DBDebug' => (ENVIRONMENT !== 'production'), + 'DBDebug' => true, 'charset' => 'utf8', 'DBCollat' => 'utf8_general_ci', 'swapPre' => '', @@ -70,7 +70,7 @@ final class ConfigTest extends CIUnitTestCase 'DBDriver' => 'SQLite3', 'DBPrefix' => 't_', 'pConnect' => false, - 'DBDebug' => (ENVIRONMENT !== 'production'), + 'DBDebug' => true, 'charset' => 'utf8', 'DBCollat' => 'utf8_general_ci', 'swapPre' => '', @@ -89,7 +89,7 @@ final class ConfigTest extends CIUnitTestCase 'DBDriver' => 'Postgre', 'DBPrefix' => 't_', 'pConnect' => false, - 'DBDebug' => (ENVIRONMENT !== 'production'), + 'DBDebug' => true, 'charset' => 'utf8', 'DBCollat' => 'utf8_general_ci', 'swapPre' => '', From c3ccb20efea1105f0d3a1e65e93244be7b2c04e7 Mon Sep 17 00:00:00 2001 From: Denny Septian Panggabean <97607754+ddevsr@users.noreply.github.com> Date: Mon, 11 Sep 2023 11:28:56 +0700 Subject: [PATCH 054/209] remove uneeded trigger push --- .github/label-conflict.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/label-conflict.yml b/.github/label-conflict.yml index 88292a261ec2..3e4850ea250f 100644 --- a/.github/label-conflict.yml +++ b/.github/label-conflict.yml @@ -1,9 +1,5 @@ name: Auto Label Conflicts on: - push: - branches: - - 'develop' - - '4.*' pull_request: branches: - 'develop' From 042eaaaffb531af2177f7d189ad78ff00c0b7d46 Mon Sep 17 00:00:00 2001 From: "John Paul E. Balandan, CPA" Date: Mon, 11 Sep 2023 15:24:28 +0800 Subject: [PATCH 055/209] Use phpstan-codeigniter --- composer.json | 5 +- phpstan-baseline.php | 250 +++++++++++++++++- phpstan.neon.dist | 9 - rector.php | 6 +- ...onInstantiationViaNamedConstructorRule.php | 48 ---- 5 files changed, 254 insertions(+), 64 deletions(-) delete mode 100644 utils/PHPStan/CheckFrameworkExceptionInstantiationViaNamedConstructorRule.php diff --git a/composer.json b/composer.json index 05c3a5f389d0..5070e672c9ba 100644 --- a/composer.json +++ b/composer.json @@ -19,6 +19,7 @@ }, "require-dev": { "codeigniter/coding-standard": "^1.5", + "codeigniter/phpstan-codeigniter": "^v1.1", "ergebnis/composer-normalize": "^2.28", "fakerphp/faker": "^1.9", "kint-php/kint": "^5.0.4", @@ -26,6 +27,7 @@ "nexusphp/cs-config": "^3.6", "nexusphp/tachycardia": "^1.0", "php-coveralls/php-coveralls": "^2.5", + "phpstan/extension-installer": "^1.3", "phpstan/phpstan": "^1.10.2", "phpstan/phpstan-strict-rules": "^1.5", "phpunit/phpcov": "^8.2", @@ -70,7 +72,8 @@ }, "config": { "allow-plugins": { - "ergebnis/composer-normalize": true + "ergebnis/composer-normalize": true, + "phpstan/extension-installer": true }, "optimize-autoloader": true, "preferred-install": "dist", diff --git a/phpstan-baseline.php b/phpstan-baseline.php index 471a422ea745..18b1fa1371be 100644 --- a/phpstan-baseline.php +++ b/phpstan-baseline.php @@ -46,6 +46,21 @@ 'count' => 5, 'path' => __DIR__ . '/system/CLI/BaseCommand.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Accessing offset \'ANSICON\' directly on \\$_SERVER is discouraged\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/CLI/CLI.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Accessing offset \'NO_COLOR\' directly on \\$_SERVER is discouraged\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/CLI/CLI.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Accessing offset \'argv\' directly on \\$_SERVER is discouraged\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/CLI/CLI.php', +]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 6, @@ -216,6 +231,11 @@ 'count' => 1, 'path' => __DIR__ . '/system/Commands/Database/ShowTableInfo.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Accessing offset \'encryption\\.key\' directly on \\$_SERVER is discouraged\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Encryption/GenerateKey.php', +]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 2, @@ -466,6 +486,26 @@ 'count' => 1, 'path' => __DIR__ . '/system/Commands/ListCommands.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Accessing offset \'DOCUMENT_ROOT\' directly on \\$_SERVER is discouraged\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Commands/Server/rewrite.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Accessing offset \'REQUEST_URI\' directly on \\$_SERVER is discouraged\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Server/rewrite.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Assigning \'/index\\.php\' directly on offset \'SCRIPT_NAME\' of \\$_SERVER is discouraged\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Server/rewrite.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Accessing offset \'CI_ENVIRONMENT\' directly on \\$_SERVER is discouraged\\.$#', + 'count' => 3, + 'path' => __DIR__ . '/system/Commands/Utilities/Environment.php', +]; $ignoreErrors[] = [ 'message' => '#^PHPDoc type array\\ of property CodeIgniter\\\\Commands\\\\Utilities\\\\Environment\\:\\:\\$arguments is not the same as PHPDoc type array of overridden property CodeIgniter\\\\CLI\\\\BaseCommand\\:\\:\\$arguments\\.$#', 'count' => 1, @@ -486,6 +526,16 @@ 'count' => 1, 'path' => __DIR__ . '/system/Commands/Utilities/Publish.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Accessing offset \'HTTP_HOST\' directly on \\$_SERVER is discouraged\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Utilities/Routes.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Assigning non\\-falsy\\-string directly on offset \'HTTP_HOST\' of \\$_SERVER is discouraged\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Utilities/Routes.php', +]; $ignoreErrors[] = [ 'message' => '#^PHPDoc type array\\ of property CodeIgniter\\\\Commands\\\\Utilities\\\\Routes\\:\\:\\$options is not the same as PHPDoc type array of overridden property CodeIgniter\\\\CLI\\\\BaseCommand\\:\\:\\$options\\.$#', 'count' => 1, @@ -516,6 +566,21 @@ 'count' => 1, 'path' => __DIR__ . '/system/Commands/Utilities/Routes/ControllerMethodReader.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Accessing offset \'REMOTE_ADDR\' directly on \\$_SERVER is discouraged\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Common.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Accessing offset \'REQUEST_METHOD\' directly on \\$_SERVER is discouraged\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Common.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Accessing offset string directly on \\$_SERVER is discouraged\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Common.php', +]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 8, @@ -546,16 +611,56 @@ 'count' => 1, 'path' => __DIR__ . '/system/ComposerScripts.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Accessing offset \'CI_ENVIRONMENT\' directly on \\$_SERVER is discouraged\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Config/AutoloadConfig.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Accessing offset non\\-falsy\\-string directly on \\$_SERVER is discouraged\\.$#', + 'count' => 4, + 'path' => __DIR__ . '/system/Config/BaseConfig.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Argument \\#1 \\$name \\(\'Config\\\\\\\\Modules\'\\) passed to function config does not extend CodeIgniter\\\\\\\\Config\\\\\\\\BaseConfig\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Config/BaseConfig.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Argument \\#1 \\$name \\(\'Config\\\\\\\\Modules\'\\) passed to function config does not extend CodeIgniter\\\\\\\\Config\\\\\\\\BaseConfig\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Config/BaseService.php', +]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 3, 'path' => __DIR__ . '/system/Config/BaseService.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Accessing offset string directly on \\$_SERVER is discouraged\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Config/DotEnv.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Assigning string directly on offset string of \\$_SERVER is discouraged\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Config/DotEnv.php', +]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 2, 'path' => __DIR__ . '/system/Config/DotEnv.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Accessing offset \'SERVER_PROTOCOL\' directly on \\$_SERVER is discouraged\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Config/Services.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Argument \\#1 \\$name \\(\'Config\\\\\\\\Modules\'\\) passed to function config does not extend CodeIgniter\\\\\\\\Config\\\\\\\\BaseConfig\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Config/Services.php', +]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 1, @@ -1461,6 +1566,16 @@ 'count' => 2, 'path' => __DIR__ . '/system/Debug/Toolbar/Collectors/Views.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Accessing offset \'SERVER_ADDR\' directly on \\$_SERVER is discouraged\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Email/Email.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Accessing offset \'SERVER_NAME\' directly on \\$_SERVER is discouraged\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Email/Email.php', +]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 14, @@ -1511,6 +1626,11 @@ 'count' => 4, 'path' => __DIR__ . '/system/Entity/Entity.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Argument \\#1 \\$name \\(\'Config\\\\\\\\Modules\'\\) passed to function config does not extend CodeIgniter\\\\\\\\Config\\\\\\\\BaseConfig\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Events/Events.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Events\\\\Events\\:\\:on\\(\\) has parameter \\$callback with no signature specified for callable\\.$#', 'count' => 1, @@ -1551,6 +1671,11 @@ 'count' => 3, 'path' => __DIR__ . '/system/Files/File.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Argument \\#1 \\$name \\(\'Config\\\\\\\\Modules\'\\) passed to function config does not extend CodeIgniter\\\\\\\\Config\\\\\\\\BaseConfig\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Filters/Filters.php', +]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 2, @@ -1586,6 +1711,11 @@ 'count' => 9, 'path' => __DIR__ . '/system/HTTP/ContentSecurityPolicy.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Accessing offset \'HTTP_USER_AGENT\' directly on \\$_SERVER is discouraged\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/HTTP/DownloadResponse.php', +]; $ignoreErrors[] = [ 'message' => '#^Return type \\(CodeIgniter\\\\HTTP\\\\DownloadResponse\\) of method CodeIgniter\\\\HTTP\\\\DownloadResponse\\:\\:noCache\\(\\) should be covariant with return type \\(\\$this\\(CodeIgniter\\\\HTTP\\\\Response\\)\\) of method CodeIgniter\\\\HTTP\\\\Response\\:\\:noCache\\(\\)$#', 'count' => 1, @@ -1666,6 +1796,36 @@ 'count' => 1, 'path' => __DIR__ . '/system/HTTP/Files/UploadedFile.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Accessing offset \'HTTPS\' directly on \\$_SERVER is discouraged\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/HTTP/IncomingRequest.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Accessing offset \'QUERY_STRING\' directly on \\$_SERVER is discouraged\\.$#', + 'count' => 3, + 'path' => __DIR__ . '/system/HTTP/IncomingRequest.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Accessing offset \'REQUEST_URI\' directly on \\$_SERVER is discouraged\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/HTTP/IncomingRequest.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Accessing offset \'SCRIPT_NAME\' directly on \\$_SERVER is discouraged\\.$#', + 'count' => 4, + 'path' => __DIR__ . '/system/HTTP/IncomingRequest.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Accessing offset array\\|string directly on \\$_GET is discouraged\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/HTTP/IncomingRequest.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Assigning string directly on offset \'QUERY_STRING\' of \\$_SERVER is discouraged\\.$#', + 'count' => 3, + 'path' => __DIR__ . '/system/HTTP/IncomingRequest.php', +]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 7, @@ -1676,6 +1836,16 @@ 'count' => 1, 'path' => __DIR__ . '/system/HTTP/IncomingRequest.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Accessing offset \'CONTENT_TYPE\' directly on \\$_SERVER is discouraged\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/Message.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Accessing offset \\(int\\|string\\) directly on \\$_SERVER is discouraged\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/Message.php', +]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 2, @@ -1716,6 +1886,21 @@ 'count' => 3, 'path' => __DIR__ . '/system/HTTP/Request.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Accessing offset \'REQUEST_METHOD\' directly on \\$_SERVER is discouraged\\.$#', + 'count' => 3, + 'path' => __DIR__ . '/system/HTTP/Response.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Accessing offset \'SERVER_PROTOCOL\' directly on \\$_SERVER is discouraged\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/Response.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Accessing offset \'SERVER_SOFTWARE\' directly on \\$_SERVER is discouraged\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/HTTP/Response.php', +]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 6, @@ -1761,6 +1946,16 @@ 'count' => 1, 'path' => __DIR__ . '/system/HTTP/URI.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Accessing offset \'HTTP_REFERER\' directly on \\$_SERVER is discouraged\\.$#', + 'count' => 4, + 'path' => __DIR__ . '/system/HTTP/UserAgent.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Accessing offset \'HTTP_USER_AGENT\' directly on \\$_SERVER is discouraged\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/HTTP/UserAgent.php', +]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 3, @@ -1986,6 +2181,11 @@ 'count' => 1, 'path' => __DIR__ . '/system/Model.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Accessing offset mixed directly on \\$_GET is discouraged\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Pager/Pager.php', +]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 4, @@ -2001,6 +2201,11 @@ 'count' => 1, 'path' => __DIR__ . '/system/Pager/Views/default_simple.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Argument \\#1 \\$name \\(class\\-string\\) passed to function model does not extend CodeIgniter\\\\\\\\Model\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/RESTful/BaseResource.php', +]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 4, @@ -2146,6 +2351,11 @@ 'count' => 1, 'path' => __DIR__ . '/system/Router/RouteCollectionInterface.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Accessing offset \'REQUEST_METHOD\' directly on \\$_SERVER is discouraged\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Router/Router.php', +]; $ignoreErrors[] = [ 'message' => '#^Call to an undefined method CodeIgniter\\\\Router\\\\RouteCollectionInterface\\:\\:getDefaultNamespace\\(\\)\\.$#', 'count' => 2, @@ -2311,6 +2521,11 @@ 'count' => 5, 'path' => __DIR__ . '/system/Session/Handlers/RedisHandler.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Accessing offset \'HTTP_X_REQUESTED_WITH\' directly on \\$_SERVER is discouraged\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Session/Session.php', +]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 13, @@ -2621,6 +2836,21 @@ 'count' => 1, 'path' => __DIR__ . '/system/Test/Fabricator.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Parameter \\#1 \\$name of function model expects a valid class string, string given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Test/Fabricator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Assigning \'test\' directly on offset \'HTTPS\' of \\$_SERVER is discouraged\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Test/FeatureTestCase.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Assigning string directly on offset \'REQUEST_METHOD\' of \\$_SERVER is discouraged\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Test/FeatureTestCase.php', +]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 10, @@ -3146,6 +3376,21 @@ 'count' => 1, 'path' => __DIR__ . '/system/Test/TestResponse.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Accessing offset \'app\\.baseURL\' directly on \\$_SERVER is discouraged\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Test/bootstrap.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Assigning \'http\\://example\\.com/\' directly on offset \'app\\.baseURL\' of \\$_SERVER is discouraged\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Test/bootstrap.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Assigning \'testing\' directly on offset \'CI_ENVIRONMENT\' of \\$_SERVER is discouraged\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Test/bootstrap.php', +]; $ignoreErrors[] = [ 'message' => '#^Property CodeIgniter\\\\Throttle\\\\Throttler\\:\\:\\$testTime \\(int\\) on left side of \\?\\? is not nullable\\.$#', 'count' => 1, @@ -3261,11 +3506,6 @@ 'count' => 2, 'path' => __DIR__ . '/system/View/View.php', ]; -$ignoreErrors[] = [ - 'message' => '#^Parameter \\#1 \\$node \\(PhpParser\\\\Node\\\\Expr\\\\New_\\) of method Utils\\\\PHPStan\\\\CheckFrameworkExceptionInstantiationViaNamedConstructorRule\\:\\:processNode\\(\\) should be contravariant with parameter \\$node \\(PhpParser\\\\Node\\) of method PHPStan\\\\Rules\\\\Rule\\\\:\\:processNode\\(\\)$#', - 'count' => 1, - 'path' => __DIR__ . '/utils/PHPStan/CheckFrameworkExceptionInstantiationViaNamedConstructorRule.php', -]; $ignoreErrors[] = [ 'message' => '#^Parameter \\#1 \\$node \\(PhpParser\\\\Node\\\\Stmt\\) of method Utils\\\\PHPStan\\\\CheckUseStatementsAfterLicenseRule\\:\\:processNode\\(\\) should be contravariant with parameter \\$node \\(PhpParser\\\\Node\\) of method PHPStan\\\\Rules\\\\Rule\\\\:\\:processNode\\(\\)$#', 'count' => 1, diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 77470c3c0613..cb04b9ee9be5 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -3,14 +3,9 @@ services: class: Utils\PHPStan\CheckUseStatementsAfterLicenseRule tags: - phpstan.rules.rule - - - class: Utils\PHPStan\CheckFrameworkExceptionInstantiationViaNamedConstructorRule - tags: - - phpstan.rules.rule includes: - phpstan-baseline.php - - vendor/phpstan/phpstan-strict-rules/rules.neon parameters: phpVersion: 80100 @@ -34,10 +29,6 @@ parameters: - system/Validation/Views/single.php scanDirectories: - system/Helpers - dynamicConstantNames: - - APP_NAMESPACE - - CI_DEBUG - - ENVIRONMENT checkMissingIterableValueType: false checkGenericClassInNonGenericObjectType: false checkMissingCallableSignature: true diff --git a/rector.php b/rector.php index 61ca28b47045..9f6a214e6bad 100644 --- a/rector.php +++ b/rector.php @@ -67,7 +67,11 @@ __DIR__ . '/system/Test/bootstrap.php', ]); - $rectorConfig->phpstanConfig(__DIR__ . '/phpstan.neon.dist'); + $rectorConfig->phpstanConfigs([ + __DIR__ . '/phpstan.neon.dist', + __DIR__ . '/vendor/codeigniter/phpstan-codeigniter/extension.neon', + __DIR__ . '/vendor/phpstan/phpstan-strict-rules/rules.neon', + ]); // is there a file you need to skip? $rectorConfig->skip([ diff --git a/utils/PHPStan/CheckFrameworkExceptionInstantiationViaNamedConstructorRule.php b/utils/PHPStan/CheckFrameworkExceptionInstantiationViaNamedConstructorRule.php deleted file mode 100644 index 5cca5ec8f4d4..000000000000 --- a/utils/PHPStan/CheckFrameworkExceptionInstantiationViaNamedConstructorRule.php +++ /dev/null @@ -1,48 +0,0 @@ - - * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. - */ - -namespace Utils\PHPStan; - -use CodeIgniter\Exceptions\FrameworkException; -use PhpParser\Node; -use PhpParser\Node\Expr\New_; -use PhpParser\Node\Name\FullyQualified; -use PHPStan\Analyser\Scope; -use PHPStan\Rules\Rule; - -final class CheckFrameworkExceptionInstantiationViaNamedConstructorRule implements Rule -{ - private const ERROR_MESSAGE = 'FrameworkException instance creation via new expression is not allowed, use its named constructor instead'; - - public function getNodeType(): string - { - return New_::class; - } - - /** - * @param New_ $node - */ - public function processNode(Node $node, Scope $scope): array - { - $class = $node->class; - if (! $class instanceof FullyQualified) { - return []; - } - - if (! is_a((string) $class, FrameworkException::class, true)) { - return []; - } - - return [self::ERROR_MESSAGE]; - } -} From 664aceb94b5a03a0ffbd31bcf21b15d2209bfeed Mon Sep 17 00:00:00 2001 From: Denny Septian Panggabean <97607754+ddevsr@users.noreply.github.com> Date: Mon, 11 Sep 2023 15:49:02 +0700 Subject: [PATCH 056/209] fix: message issue comment --- .github/label-conflict.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/label-conflict.yml b/.github/label-conflict.yml index 3e4850ea250f..0030dd06bede 100644 --- a/.github/label-conflict.yml +++ b/.github/label-conflict.yml @@ -20,7 +20,7 @@ jobs: steps: - uses: prince-chrismc/label-merge-conflicts-action@v3 with: - conflict_label_name: "stale" + conflict_label_name: 'stale' github_token: ${{ github.token }} # --- Optional Inputs --- @@ -30,7 +30,8 @@ jobs: # The optional `${author}` will be replaced with the username of the pull request conflict_comment: | :wave: Hi, @${author}, - We detected conflicts against the base branch :speak_no_evil: - You'll want to sync :arrows_counterclockwise: your branch with upstream! + + We detected conflicts in your PR against the base branch :speak_no_evil: + You may want to sync :arrows_counterclockwise: your branch with upstream! Ref: https://github.com/codeigniter4/CodeIgniter4/blob/develop/contributing/workflow.md#pushing-your-branch From 3f77632fe6aa2f442ac35e85bdc62675ce03032c Mon Sep 17 00:00:00 2001 From: kenjis Date: Tue, 12 Sep 2023 08:30:42 +0900 Subject: [PATCH 057/209] chore: add matchingInheritedMethodNames rule --- phpstan.neon.dist | 1 + 1 file changed, 1 insertion(+) diff --git a/phpstan.neon.dist b/phpstan.neon.dist index cb04b9ee9be5..399deda1238c 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -36,3 +36,4 @@ parameters: strictRules: allRules: false disallowedConstructs: true + matchingInheritedMethodNames: true From b702cf6417c42daf56cb93520b673bd2d0112644 Mon Sep 17 00:00:00 2001 From: Denny Septian Panggabean Date: Tue, 12 Sep 2023 08:31:41 +0700 Subject: [PATCH 058/209] fix: move labeler conflict PR --- .github/{ => workflows}/label-conflict.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/{ => workflows}/label-conflict.yml (100%) diff --git a/.github/label-conflict.yml b/.github/workflows/label-conflict.yml similarity index 100% rename from .github/label-conflict.yml rename to .github/workflows/label-conflict.yml From d06f9cf2b1ece8c8ca642de7e79a324eed745642 Mon Sep 17 00:00:00 2001 From: kenjis Date: Tue, 12 Sep 2023 20:53:05 +0900 Subject: [PATCH 059/209] docs: add warning on PHP 7.4 EOL --- README.md | 5 +++++ admin/framework/README.md | 5 +++++ admin/starter/README.md | 5 +++++ user_guide_src/source/intro/requirements.rst | 4 ++++ 4 files changed, 19 insertions(+) diff --git a/README.md b/README.md index 7d2940a21246..1a47301b82cc 100644 --- a/README.md +++ b/README.md @@ -91,6 +91,11 @@ PHP version 7.4 or higher is required, with the following extensions installed: - [intl](http://php.net/manual/en/intl.requirements.php) - [mbstring](http://php.net/manual/en/mbstring.installation.php) +> **Warning** +> The end of life date for PHP 7.4 was November 28, 2022. If you are +> still using PHP 7.4, you should upgrade immediately. The end of life date +> for PHP 8.0 will be November 26, 2023. + Additionally, make sure that the following extensions are enabled in your PHP: - json (enabled by default - don't turn it off) diff --git a/admin/framework/README.md b/admin/framework/README.md index 870e5f96adff..00cdf704c2f4 100644 --- a/admin/framework/README.md +++ b/admin/framework/README.md @@ -47,6 +47,11 @@ PHP version 7.4 or higher is required, with the following extensions installed: - [intl](http://php.net/manual/en/intl.requirements.php) - [mbstring](http://php.net/manual/en/mbstring.installation.php) +> **Warning** +> The end of life date for PHP 7.4 was November 28, 2022. If you are +> still using PHP 7.4, you should upgrade immediately. The end of life date +> for PHP 8.0 will be November 26, 2023. + Additionally, make sure that the following extensions are enabled in your PHP: - json (enabled by default - don't turn it off) diff --git a/admin/starter/README.md b/admin/starter/README.md index 461e949f2f26..11d1cf13eec4 100644 --- a/admin/starter/README.md +++ b/admin/starter/README.md @@ -55,6 +55,11 @@ PHP version 7.4 or higher is required, with the following extensions installed: - [intl](http://php.net/manual/en/intl.requirements.php) - [mbstring](http://php.net/manual/en/mbstring.installation.php) +> **Warning** +> The end of life date for PHP 7.4 was November 28, 2022. If you are +> still using PHP 7.4, you should upgrade immediately. The end of life date +> for PHP 8.0 will be November 26, 2023. + Additionally, make sure that the following extensions are enabled in your PHP: - json (enabled by default - don't turn it off) diff --git a/user_guide_src/source/intro/requirements.rst b/user_guide_src/source/intro/requirements.rst index 8e5ac2428675..e025198a8cc0 100644 --- a/user_guide_src/source/intro/requirements.rst +++ b/user_guide_src/source/intro/requirements.rst @@ -16,6 +16,10 @@ PHP and Required Extensions - `mbstring `_ - `json `_ +.. warning:: The end of life date for PHP 7.4 was November 28, 2022. If you are + still using PHP 7.4, you should upgrade immediately. The end of life date + for PHP 8.0 will be November 26, 2023. + *********************** Optional PHP Extensions *********************** From 4905fe9436735375d8464bbecb8b01f151817898 Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Tue, 12 Sep 2023 23:58:09 +0330 Subject: [PATCH 060/209] chore: update phpstan exclude list --- phpstan.neon.dist | 1 - 1 file changed, 1 deletion(-) diff --git a/phpstan.neon.dist b/phpstan.neon.dist index cb04b9ee9be5..a3bcdbfb60fb 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -21,7 +21,6 @@ parameters: - app/Views/errors/cli/* - app/Views/errors/html/* - system/Commands/Generators/Views/* - - system/Config/Routes.php - system/Debug/Toolbar/Views/toolbar.tpl.php - system/Images/Handlers/GDHandler.php - system/Test/Filters/CITestStreamFilter.php From 89758d7e16a7c343a48875712eec7a04a50e3d77 Mon Sep 17 00:00:00 2001 From: kenjis Date: Wed, 13 Sep 2023 11:34:14 +0900 Subject: [PATCH 061/209] docs: add description of incompatible behavior --- user_guide_src/source/installation/upgrade_validations.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/user_guide_src/source/installation/upgrade_validations.rst b/user_guide_src/source/installation/upgrade_validations.rst index acc093a94580..8343b989a699 100644 --- a/user_guide_src/source/installation/upgrade_validations.rst +++ b/user_guide_src/source/installation/upgrade_validations.rst @@ -18,6 +18,8 @@ What has been changed Use :ref:`Rule Classes ` or :ref:`Closure Rule ` instead. +- In CI3, Callbacks/Callable rules were prioritized, but in CI4, Closure Rules are + not prioritized, and are checked in the order in which they are listed. - CI4 validation format rules do not permit empty string. - CI4 validation never changes your data. - Since v4.3.0, :php:func:`validation_errors()` has been introduced, but the API is different from CI3's. From 79716a22dcc28125a8f02f20ba6f0a8baf0e65f5 Mon Sep 17 00:00:00 2001 From: totoprayogo1916 Date: Wed, 13 Sep 2023 16:11:38 +0700 Subject: [PATCH 062/209] dont ignore `.gitkeep` --- admin/framework/.gitignore | 1 + admin/starter/.gitignore | 1 + 2 files changed, 2 insertions(+) diff --git a/admin/framework/.gitignore b/admin/framework/.gitignore index 11abea699408..696da9cb0a91 100644 --- a/admin/framework/.gitignore +++ b/admin/framework/.gitignore @@ -61,6 +61,7 @@ writable/uploads/* !writable/uploads/index.html writable/debugbar/* +!writable/debugbar/.gitkeep php_errors.log diff --git a/admin/starter/.gitignore b/admin/starter/.gitignore index 11abea699408..696da9cb0a91 100644 --- a/admin/starter/.gitignore +++ b/admin/starter/.gitignore @@ -61,6 +61,7 @@ writable/uploads/* !writable/uploads/index.html writable/debugbar/* +!writable/debugbar/.gitkeep php_errors.log From 3230a721a7dbc1e90bd6d02ef7ee5c07727ae63b Mon Sep 17 00:00:00 2001 From: Denny Septian Panggabean Date: Wed, 13 Sep 2023 16:13:47 +0700 Subject: [PATCH 063/209] gh: auto labeling unsigned PR --- .github/workflows/label-signing.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .github/workflows/label-signing.yml diff --git a/.github/workflows/label-signing.yml b/.github/workflows/label-signing.yml new file mode 100644 index 000000000000..9b12e4c34793 --- /dev/null +++ b/.github/workflows/label-signing.yml @@ -0,0 +1,20 @@ +name: Check Signed PR +on: pull_request + +jobs: + build: + name: Check Signed Commit + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Check signed commits in PR + uses: 1Password/check-signed-commits-action@v1 + with: + comment: | + You must GPG-sign your work, certifying that you either wrote the work or otherwise have the right to pass it on to an open-source project. See Developer's Certificate of Origin. See [signing][1]. + + **Note that all your commits must be signed.** If you have an unsigned commit, you can sign the previous commits by referring to [gpg-signing-old-commits][2]. + [1]: https://github.com/codeigniter4/CodeIgniter4/blob/develop/contributing/pull_request.md#signing + [2]: https://github.com/codeigniter4/CodeIgniter4/blob/develop/contributing/workflow.md#gpg-signing-old-commits From 49852f0d93ab1f9bfa31843d2835e2c6dfe1eada Mon Sep 17 00:00:00 2001 From: Denny Septian Panggabean Date: Wed, 13 Sep 2023 16:20:47 +0700 Subject: [PATCH 064/209] add permission --- .github/workflows/label-signing.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/workflows/label-signing.yml b/.github/workflows/label-signing.yml index 9b12e4c34793..44d29cbcdcb9 100644 --- a/.github/workflows/label-signing.yml +++ b/.github/workflows/label-signing.yml @@ -1,6 +1,15 @@ name: Check Signed PR on: pull_request +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +permissions: + contents: read + issues: write + pull-requests: write + jobs: build: name: Check Signed Commit From 5401c1a0961f2fee5f83af51045978ade0e8bf42 Mon Sep 17 00:00:00 2001 From: Denny Septian Panggabean Date: Wed, 13 Sep 2023 16:23:59 +0700 Subject: [PATCH 065/209] added specified branch --- .github/workflows/label-signing.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/label-signing.yml b/.github/workflows/label-signing.yml index 44d29cbcdcb9..dde8c1160fe3 100644 --- a/.github/workflows/label-signing.yml +++ b/.github/workflows/label-signing.yml @@ -1,5 +1,11 @@ name: Check Signed PR -on: pull_request +on: + pull_request: + branches: + - 'dev' + push: + branches: + - 'dev' concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} From b3fb4391de9e959b3138f7709258cbfc7059d164 Mon Sep 17 00:00:00 2001 From: Denny Septian Panggabean Date: Wed, 13 Sep 2023 16:25:17 +0700 Subject: [PATCH 066/209] fix wrong branch --- .github/workflows/label-signing.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/label-signing.yml b/.github/workflows/label-signing.yml index dde8c1160fe3..8bee779fb276 100644 --- a/.github/workflows/label-signing.yml +++ b/.github/workflows/label-signing.yml @@ -2,10 +2,8 @@ name: Check Signed PR on: pull_request: branches: - - 'dev' - push: - branches: - - 'dev' + - 'develop' + - '4.*' concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} From 7eabbb5d7c96cca9cacd5bd6b8f1d02c737f8144 Mon Sep 17 00:00:00 2001 From: Denny Septian Panggabean <97607754+ddevsr@users.noreply.github.com> Date: Wed, 13 Sep 2023 19:35:17 +0700 Subject: [PATCH 067/209] Update .github/workflows/label-signing.yml Co-authored-by: MGatner --- .github/workflows/label-signing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/label-signing.yml b/.github/workflows/label-signing.yml index 8bee779fb276..3061d341f40e 100644 --- a/.github/workflows/label-signing.yml +++ b/.github/workflows/label-signing.yml @@ -20,7 +20,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Check signed commits in PR uses: 1Password/check-signed-commits-action@v1 From 52fb912a0a3d63c274ccbda314df8eaccdbb43f1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Sep 2023 15:32:40 +0000 Subject: [PATCH 068/209] build(deps-dev): update rector/rector requirement from 0.18.2 to 0.18.3 Updates the requirements on [rector/rector](https://github.com/rectorphp/rector) to permit the latest version. - [Release notes](https://github.com/rectorphp/rector/releases) - [Commits](https://github.com/rectorphp/rector/compare/0.18.2...0.18.3) --- updated-dependencies: - dependency-name: rector/rector dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 5070e672c9ba..2258eca9ac4d 100644 --- a/composer.json +++ b/composer.json @@ -33,7 +33,7 @@ "phpunit/phpcov": "^8.2", "phpunit/phpunit": "^9.1", "predis/predis": "^1.1 || ^2.0", - "rector/rector": "0.18.2", + "rector/rector": "0.18.3", "vimeo/psalm": "^5.0" }, "suggest": { From a4ec34a50d180282d06fc4aeaca421b2cc3e6385 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Wed, 13 Sep 2023 22:35:47 +0700 Subject: [PATCH 069/209] update parallel and skip config --- rector.php | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/rector.php b/rector.php index 9f6a214e6bad..580b8b38295c 100644 --- a/rector.php +++ b/rector.php @@ -38,7 +38,6 @@ use Rector\Php71\Rector\FuncCall\CountOnNullRector; use Rector\Php73\Rector\FuncCall\JsonThrowOnErrorRector; use Rector\Php73\Rector\FuncCall\StringifyStrNeedlesRector; -use Rector\PHPUnit\CodeQuality\Rector\Class_\ConstructClassMethodToSetUpTestCaseRector; use Rector\PHPUnit\CodeQuality\Rector\Class_\YieldDataProviderRector; use Rector\PHPUnit\Set\PHPUnitSetList; use Rector\Privatization\Rector\Property\PrivatizeFinalClassPropertyRector; @@ -57,7 +56,7 @@ PHPUnitSetList::PHPUNIT_100, ]); - $rectorConfig->parallel(240, 8, 1); + $rectorConfig->parallel(); // paths to refactor; solid alternative to CLI arguments $rectorConfig->paths([__DIR__ . '/app', __DIR__ . '/system', __DIR__ . '/tests', __DIR__ . '/utils']); @@ -89,13 +88,6 @@ __DIR__ . '/tests/system/Test/ReflectionHelperTest.php', ], - ConstructClassMethodToSetUpTestCaseRector::class => [ - // breaks the constructor - __DIR__ . '/system/Test/TestResponse.php', - // See https://github.com/rectorphp/rector/issues/8188 - __DIR__ . '/system/Test/ControllerResponse.php', - ], - RemoveUnusedConstructorParamRector::class => [ // there are deprecated parameters __DIR__ . '/system/Debug/Exceptions.php', From ab30253a75b4e0215c7b665320181b50075f5172 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Wed, 13 Sep 2023 23:35:01 +0700 Subject: [PATCH 070/209] [PHPStan] Add @var string[] on array of string with enable StringifyStrNeedlesRector --- rector.php | 2 -- .../ControllerMethodReader.php | 3 +++ system/Email/Email.php | 4 ++-- system/Router/RouteCollection.php | 24 ++++++++++++++----- 4 files changed, 23 insertions(+), 10 deletions(-) diff --git a/rector.php b/rector.php index 580b8b38295c..0cbfa41114b1 100644 --- a/rector.php +++ b/rector.php @@ -37,7 +37,6 @@ use Rector\Php70\Rector\FuncCall\RandomFunctionRector; use Rector\Php71\Rector\FuncCall\CountOnNullRector; use Rector\Php73\Rector\FuncCall\JsonThrowOnErrorRector; -use Rector\Php73\Rector\FuncCall\StringifyStrNeedlesRector; use Rector\PHPUnit\CodeQuality\Rector\Class_\YieldDataProviderRector; use Rector\PHPUnit\Set\PHPUnitSetList; use Rector\Privatization\Rector\Property\PrivatizeFinalClassPropertyRector; @@ -80,7 +79,6 @@ __DIR__ . '/tests/system/Filters/fixtures', __DIR__ . '/tests/_support', JsonThrowOnErrorRector::class, - StringifyStrNeedlesRector::class, YieldDataProviderRector::class, RemoveUnusedPrivateMethodRector::class => [ diff --git a/system/Commands/Utilities/Routes/AutoRouterImproved/ControllerMethodReader.php b/system/Commands/Utilities/Routes/AutoRouterImproved/ControllerMethodReader.php index 74b268befe7d..4947fbc60410 100644 --- a/system/Commands/Utilities/Routes/AutoRouterImproved/ControllerMethodReader.php +++ b/system/Commands/Utilities/Routes/AutoRouterImproved/ControllerMethodReader.php @@ -26,6 +26,9 @@ final class ControllerMethodReader */ private string $namespace; + /** + * @var string[] + */ private array $httpMethods; /** diff --git a/system/Email/Email.php b/system/Email/Email.php index c5b043922938..0ee5540d95f9 100644 --- a/system/Email/Email.php +++ b/system/Email/Email.php @@ -352,7 +352,7 @@ class Email * Character sets valid for 7-bit encoding, * excluding language suffix. * - * @var array + * @var string[] */ protected $baseCharsets = [ 'us-ascii', @@ -862,7 +862,7 @@ protected function getEncoding() } foreach ($this->baseCharsets as $charset) { - if (strpos($this->charset, $charset) === 0) { + if (strpos($this->charset, (string) $charset) === 0) { $this->encoding = '7bit'; break; diff --git a/system/Router/RouteCollection.php b/system/Router/RouteCollection.php index 63b7397dbc4c..25305e3b70e4 100644 --- a/system/Router/RouteCollection.php +++ b/system/Router/RouteCollection.php @@ -1293,9 +1293,15 @@ protected function fillRouteParams(string $from, ?array $params = null): string return '/' . ltrim($from, '/'); } - // Build our resulting string, inserting the $params in - // the appropriate places. - foreach ($matches[0] as $index => $pattern) { + /** + * Build our resulting string, inserting the $params in + * the appropriate places. + * + * @var string[] $patterns + */ + $patterns = $matches[0]; + + foreach ($patterns as $index => $pattern) { if (! preg_match('#^' . $pattern . '$#u', $params[$index])) { throw RouterException::forInvalidParameterType(); } @@ -1338,9 +1344,15 @@ protected function buildReverseRoute(string $from, array $params): string $locale = $params[$placeholderCount]; } - // Build our resulting string, inserting the $params in - // the appropriate places. - foreach ($matches[0] as $index => $placeholder) { + /** + * Build our resulting string, inserting the $params in + * the appropriate places. + * + * @var string[] $placeholders + */ + $placeholders = $matches[0]; + + foreach ($placeholders as $index => $placeholder) { if (! isset($params[$index])) { throw new InvalidArgumentException( 'Missing argument for "' . $placeholder . '" in route "' . $from . '".' From c1d21a5f693706c580027653317348775bda6bd1 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Wed, 13 Sep 2023 23:37:29 +0700 Subject: [PATCH 071/209] remove unused cast --- system/Email/Email.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/Email/Email.php b/system/Email/Email.php index 0ee5540d95f9..844033df4c26 100644 --- a/system/Email/Email.php +++ b/system/Email/Email.php @@ -862,7 +862,7 @@ protected function getEncoding() } foreach ($this->baseCharsets as $charset) { - if (strpos($this->charset, (string) $charset) === 0) { + if (strpos($this->charset, $charset) === 0) { $this->encoding = '7bit'; break; From a5420240ffc054c139b40da0d9b0026d1fcc493f Mon Sep 17 00:00:00 2001 From: Denny Septian Panggabean <97607754+ddevsr@users.noreply.github.com> Date: Thu, 14 Sep 2023 10:11:11 +0700 Subject: [PATCH 072/209] remove permission issue --- .github/workflows/label-signing.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/label-signing.yml b/.github/workflows/label-signing.yml index 3061d341f40e..389ad8844411 100644 --- a/.github/workflows/label-signing.yml +++ b/.github/workflows/label-signing.yml @@ -11,7 +11,6 @@ concurrency: permissions: contents: read - issues: write pull-requests: write jobs: From 4549a7c96cbaa5a47f764114b9f4ae300491614c Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Thu, 14 Sep 2023 12:30:26 +0700 Subject: [PATCH 073/209] Update system/Commands/Utilities/Routes/AutoRouterImproved/ControllerMethodReader.php Co-authored-by: kenjis --- .../Routes/AutoRouterImproved/ControllerMethodReader.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/system/Commands/Utilities/Routes/AutoRouterImproved/ControllerMethodReader.php b/system/Commands/Utilities/Routes/AutoRouterImproved/ControllerMethodReader.php index 4947fbc60410..a5383df6cde5 100644 --- a/system/Commands/Utilities/Routes/AutoRouterImproved/ControllerMethodReader.php +++ b/system/Commands/Utilities/Routes/AutoRouterImproved/ControllerMethodReader.php @@ -27,7 +27,8 @@ final class ControllerMethodReader private string $namespace; /** - * @var string[] + * @var arrray + * @phpstan-var list */ private array $httpMethods; From 02bcc0476367b1f8dfc0768e2c6c3a8921e8930c Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Thu, 14 Sep 2023 12:30:32 +0700 Subject: [PATCH 074/209] Update system/Email/Email.php Co-authored-by: kenjis --- system/Email/Email.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/system/Email/Email.php b/system/Email/Email.php index 844033df4c26..eb92a6b9ef7a 100644 --- a/system/Email/Email.php +++ b/system/Email/Email.php @@ -352,7 +352,8 @@ class Email * Character sets valid for 7-bit encoding, * excluding language suffix. * - * @var string[] + * @var arrray + * @phpstan-var list */ protected $baseCharsets = [ 'us-ascii', From aa5dd51e8c8f679c0e718b97c55fd5d6460d6195 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Thu, 14 Sep 2023 12:30:40 +0700 Subject: [PATCH 075/209] Update system/Router/RouteCollection.php Co-authored-by: kenjis --- system/Router/RouteCollection.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/system/Router/RouteCollection.php b/system/Router/RouteCollection.php index 25305e3b70e4..64d038fc4d04 100644 --- a/system/Router/RouteCollection.php +++ b/system/Router/RouteCollection.php @@ -1297,7 +1297,8 @@ protected function fillRouteParams(string $from, ?array $params = null): string * Build our resulting string, inserting the $params in * the appropriate places. * - * @var string[] $patterns + * @var arrray $patterns + * @phpstan-var list $patterns */ $patterns = $matches[0]; From 8d9afe0ae610e3c48dfde8a654d7fce016f834da Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Thu, 14 Sep 2023 12:30:49 +0700 Subject: [PATCH 076/209] Update system/Router/RouteCollection.php Co-authored-by: kenjis --- system/Router/RouteCollection.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/system/Router/RouteCollection.php b/system/Router/RouteCollection.php index 64d038fc4d04..31961fb61328 100644 --- a/system/Router/RouteCollection.php +++ b/system/Router/RouteCollection.php @@ -1349,7 +1349,8 @@ protected function buildReverseRoute(string $from, array $params): string * Build our resulting string, inserting the $params in * the appropriate places. * - * @var string[] $placeholders + * @var arrray $patterns + * @phpstan-var list $patterns */ $placeholders = $matches[0]; From 2ba4576249db868b92f601b7acb21c6ff762727f Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Thu, 14 Sep 2023 12:47:09 +0700 Subject: [PATCH 077/209] Update system/Router/RouteCollection.php Co-authored-by: Pooya Parsa --- system/Router/RouteCollection.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/Router/RouteCollection.php b/system/Router/RouteCollection.php index 31961fb61328..9e2cc43a1eeb 100644 --- a/system/Router/RouteCollection.php +++ b/system/Router/RouteCollection.php @@ -1349,8 +1349,8 @@ protected function buildReverseRoute(string $from, array $params): string * Build our resulting string, inserting the $params in * the appropriate places. * - * @var arrray $patterns - * @phpstan-var list $patterns + * @var arrray $placeholders + * @phpstan-var list $placeholders */ $placeholders = $matches[0]; From 29e3186f6c9fab8e5ae35ddf1c6471c94530d1d7 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Thu, 14 Sep 2023 13:21:37 +0700 Subject: [PATCH 078/209] typo fix: arrray to array --- .../Routes/AutoRouterImproved/ControllerMethodReader.php | 2 +- system/Email/Email.php | 2 +- system/Router/RouteCollection.php | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/system/Commands/Utilities/Routes/AutoRouterImproved/ControllerMethodReader.php b/system/Commands/Utilities/Routes/AutoRouterImproved/ControllerMethodReader.php index a5383df6cde5..a8b6912d4bf7 100644 --- a/system/Commands/Utilities/Routes/AutoRouterImproved/ControllerMethodReader.php +++ b/system/Commands/Utilities/Routes/AutoRouterImproved/ControllerMethodReader.php @@ -27,7 +27,7 @@ final class ControllerMethodReader private string $namespace; /** - * @var arrray + * @var array * @phpstan-var list */ private array $httpMethods; diff --git a/system/Email/Email.php b/system/Email/Email.php index eb92a6b9ef7a..a6ad2d993204 100644 --- a/system/Email/Email.php +++ b/system/Email/Email.php @@ -352,7 +352,7 @@ class Email * Character sets valid for 7-bit encoding, * excluding language suffix. * - * @var arrray + * @var array * @phpstan-var list */ protected $baseCharsets = [ diff --git a/system/Router/RouteCollection.php b/system/Router/RouteCollection.php index 9e2cc43a1eeb..4a052699196c 100644 --- a/system/Router/RouteCollection.php +++ b/system/Router/RouteCollection.php @@ -1297,7 +1297,7 @@ protected function fillRouteParams(string $from, ?array $params = null): string * Build our resulting string, inserting the $params in * the appropriate places. * - * @var arrray $patterns + * @var array $patterns * @phpstan-var list $patterns */ $patterns = $matches[0]; @@ -1349,7 +1349,7 @@ protected function buildReverseRoute(string $from, array $params): string * Build our resulting string, inserting the $params in * the appropriate places. * - * @var arrray $placeholders + * @var array $placeholders * @phpstan-var list $placeholders */ $placeholders = $matches[0]; From dcd8634993f07bee19c644980b5cc49d1be0736b Mon Sep 17 00:00:00 2001 From: Paulo Esteves Date: Thu, 14 Sep 2023 09:53:28 +0100 Subject: [PATCH 079/209] Fix: Routing::loadRoutes() in windows do not validate correctly $routesFiles --- system/Router/RouteCollection.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/system/Router/RouteCollection.php b/system/Router/RouteCollection.php index 4a052699196c..34629920cc1c 100644 --- a/system/Router/RouteCollection.php +++ b/system/Router/RouteCollection.php @@ -319,6 +319,10 @@ public function loadRoutes(string $routesFile = APPPATH . 'Config/Routes.php') return $this; } + // Normalize the path string in routesFile + $realpath = realpath($routesFile); + $routesFile = ($realpath === false) ? $routesFile : $realpath; + // Include the passed in routesFile if it doesn't exist. // Only keeping that around for BC purposes for now. $routeFiles = $this->routeFiles; From d4e0d9e4d86d5e6eb7bfff449c8b5dadd857e01d Mon Sep 17 00:00:00 2001 From: kenjis Date: Fri, 15 Sep 2023 08:45:54 +0900 Subject: [PATCH 080/209] chore: enable disallowedLooseComparison --- phpstan.neon.dist | 1 + 1 file changed, 1 insertion(+) diff --git a/phpstan.neon.dist b/phpstan.neon.dist index b0cf5aaaac9e..a9ace4e3b26e 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -34,5 +34,6 @@ parameters: treatPhpDocTypesAsCertain: false strictRules: allRules: false + disallowedLooseComparison: true disallowedConstructs: true matchingInheritedMethodNames: true From 1767200120172b0b224b4b2c4ffd49a2f9039cbd Mon Sep 17 00:00:00 2001 From: Denny Septian Panggabean Date: Wed, 13 Sep 2023 15:07:18 +0700 Subject: [PATCH 081/209] fix: event trigger label conflict --- .github/workflows/label-conflict.yml | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/.github/workflows/label-conflict.yml b/.github/workflows/label-conflict.yml index 0030dd06bede..6aa2e3d14e95 100644 --- a/.github/workflows/label-conflict.yml +++ b/.github/workflows/label-conflict.yml @@ -1,9 +1,5 @@ name: Auto Label Conflicts -on: - pull_request: - branches: - - 'develop' - - '4.*' +on: pull_request_target concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} @@ -15,13 +11,13 @@ permissions: pull-requests: write jobs: - auto-label: + auto-label-conflict: runs-on: ubuntu-latest steps: - uses: prince-chrismc/label-merge-conflicts-action@v3 with: conflict_label_name: 'stale' - github_token: ${{ github.token }} + github_token: ${{ secrets.GITHUB_TOKEN }} # --- Optional Inputs --- # To make sure the merge commit exactly matches the branch From 933047354285c338216b3ac2fe2fadad95cdc6ea Mon Sep 17 00:00:00 2001 From: Denny Septian Panggabean Date: Wed, 13 Sep 2023 16:34:23 +0700 Subject: [PATCH 082/209] fix: labeling manually but commenting with automation --- .github/workflows/label-conflict.yml | 30 ++++++++++++---------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/.github/workflows/label-conflict.yml b/.github/workflows/label-conflict.yml index 6aa2e3d14e95..4c8168e7566f 100644 --- a/.github/workflows/label-conflict.yml +++ b/.github/workflows/label-conflict.yml @@ -1,31 +1,27 @@ name: Auto Label Conflicts -on: pull_request_target +on: + pull_request: + branches: + - 'develop' + - '4.*' concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} cancel-in-progress: true -permissions: - contents: read - issues: write - pull-requests: write - jobs: auto-label-conflict: + if: github.event.label.name == 'stale' runs-on: ubuntu-latest + permissions: + pull-requests: write steps: - - uses: prince-chrismc/label-merge-conflicts-action@v3 + - name: Add comment for PR with conflict + uses: peter-evans/create-or-update-comment@v3 with: - conflict_label_name: 'stale' - github_token: ${{ secrets.GITHUB_TOKEN }} - - # --- Optional Inputs --- - # To make sure the merge commit exactly matches the branch - detect_merge_changes: true # or true to handle as conflicts - # By default a comment will be left, adding `conflict_comment: ''` will disable comments - # The optional `${author}` will be replaced with the username of the pull request - conflict_comment: | - :wave: Hi, @${author}, + issue-number: ${{ github.event.pull_request.number }} + body: | + :wave: Hi, We detected conflicts in your PR against the base branch :speak_no_evil: You may want to sync :arrows_counterclockwise: your branch with upstream! From 6403574209f4aefad0f7fcc007bb568a52153e81 Mon Sep 17 00:00:00 2001 From: Denny Septian Panggabean Date: Wed, 13 Sep 2023 16:35:00 +0700 Subject: [PATCH 083/209] fix: labeling manually but commenting with automation --- .github/workflows/label-conflict.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/label-conflict.yml b/.github/workflows/label-conflict.yml index 4c8168e7566f..b4349123039e 100644 --- a/.github/workflows/label-conflict.yml +++ b/.github/workflows/label-conflict.yml @@ -4,6 +4,8 @@ on: branches: - 'develop' - '4.*' + types: + - labeled concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} From 209e4bbc2256012bc0f81d20c6bbc6f1bd9c455d Mon Sep 17 00:00:00 2001 From: Denny Septian Panggabean Date: Fri, 15 Sep 2023 10:53:28 +0700 Subject: [PATCH 084/209] added user login to message --- .github/workflows/label-conflict.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/label-conflict.yml b/.github/workflows/label-conflict.yml index b4349123039e..e93280eaef5f 100644 --- a/.github/workflows/label-conflict.yml +++ b/.github/workflows/label-conflict.yml @@ -1,4 +1,4 @@ -name: Auto Label Conflicts +name: Auto Comment Conflicts on: pull_request: branches: @@ -12,7 +12,7 @@ concurrency: cancel-in-progress: true jobs: - auto-label-conflict: + auto-comment-conflict: if: github.event.label.name == 'stale' runs-on: ubuntu-latest permissions: @@ -23,7 +23,7 @@ jobs: with: issue-number: ${{ github.event.pull_request.number }} body: | - :wave: Hi, + :wave: Hi, @${{ github.event.pull_request.user.login }}! We detected conflicts in your PR against the base branch :speak_no_evil: You may want to sync :arrows_counterclockwise: your branch with upstream! From 0f563a3d58f87b65e7d02bb276bf11e2b7e7ed9c Mon Sep 17 00:00:00 2001 From: Denny Septian Panggabean Date: Fri, 15 Sep 2023 11:10:27 +0700 Subject: [PATCH 085/209] add token --- .github/workflows/label-conflict.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/label-conflict.yml b/.github/workflows/label-conflict.yml index e93280eaef5f..5d3d7c5513f2 100644 --- a/.github/workflows/label-conflict.yml +++ b/.github/workflows/label-conflict.yml @@ -21,6 +21,7 @@ jobs: - name: Add comment for PR with conflict uses: peter-evans/create-or-update-comment@v3 with: + token: ${{ secrets.GITHUB_TOKEN }} issue-number: ${{ github.event.pull_request.number }} body: | :wave: Hi, @${{ github.event.pull_request.user.login }}! From fbe374ac167b43ef7408c089302d714a23c1a129 Mon Sep 17 00:00:00 2001 From: Denny Septian Panggabean Date: Fri, 15 Sep 2023 11:29:35 +0700 Subject: [PATCH 086/209] permission jobs --- .github/workflows/label-conflict.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/label-conflict.yml b/.github/workflows/label-conflict.yml index 5d3d7c5513f2..03e68e77d099 100644 --- a/.github/workflows/label-conflict.yml +++ b/.github/workflows/label-conflict.yml @@ -16,6 +16,7 @@ jobs: if: github.event.label.name == 'stale' runs-on: ubuntu-latest permissions: + contents: read pull-requests: write steps: - name: Add comment for PR with conflict From 521c50a041bcc3502995fd11b093b0e97e93f4e4 Mon Sep 17 00:00:00 2001 From: Denny Septian Panggabean Date: Fri, 15 Sep 2023 11:47:42 +0700 Subject: [PATCH 087/209] ordering permission --- .github/workflows/label-conflict.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/label-conflict.yml b/.github/workflows/label-conflict.yml index 03e68e77d099..363cb967d274 100644 --- a/.github/workflows/label-conflict.yml +++ b/.github/workflows/label-conflict.yml @@ -13,11 +13,11 @@ concurrency: jobs: auto-comment-conflict: - if: github.event.label.name == 'stale' - runs-on: ubuntu-latest permissions: contents: read pull-requests: write + if: github.event.label.name == 'stale' + runs-on: ubuntu-latest steps: - name: Add comment for PR with conflict uses: peter-evans/create-or-update-comment@v3 From 843098aad3ff883b35fecb95d4883e1703a99a41 Mon Sep 17 00:00:00 2001 From: kenjis Date: Fri, 15 Sep 2023 08:51:56 +0900 Subject: [PATCH 088/209] chore: enable booleansInConditions --- phpstan.neon.dist | 1 + 1 file changed, 1 insertion(+) diff --git a/phpstan.neon.dist b/phpstan.neon.dist index a9ace4e3b26e..4041710fb703 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -35,5 +35,6 @@ parameters: strictRules: allRules: false disallowedLooseComparison: true + booleansInConditions: true disallowedConstructs: true matchingInheritedMethodNames: true From 09062ec9b22bd5022840fa122eea0b48b3fa6e0a Mon Sep 17 00:00:00 2001 From: kenjis Date: Fri, 15 Sep 2023 08:53:43 +0900 Subject: [PATCH 089/209] chore: update baseline vendor/bin/phpstan analyze --generate-baseline phpstan-baseline.php --- phpstan-baseline.php | 857 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 851 insertions(+), 6 deletions(-) diff --git a/phpstan-baseline.php b/phpstan-baseline.php index 106de3723ef0..2f9d1e447344 100644 --- a/phpstan-baseline.php +++ b/phpstan-baseline.php @@ -21,6 +21,16 @@ 'count' => 13, 'path' => __DIR__ . '/system/Autoloader/FileLocator.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a ternary operator condition, int\\|string given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Autoloader/FileLocator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, string given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Autoloader/FileLocator.php', +]; $ignoreErrors[] = [ 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', 'count' => 6, @@ -36,6 +46,41 @@ 'count' => 1, 'path' => __DIR__ . '/system/BaseModel.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, array\\ given on the right side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/BaseModel.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, array\\|int\\|string\\|null given on the left side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/BaseModel.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, array\\|null given on the left side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/BaseModel.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, string given on the right side\\.$#', + 'count' => 7, + 'path' => __DIR__ . '/system/BaseModel.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a ternary operator condition, array\\|null given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/BaseModel.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, array\\|null given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/BaseModel.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, int given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/BaseModel.php', +]; $ignoreErrors[] = [ 'message' => '#^Strict comparison using \\!\\=\\= between mixed and null will always evaluate to true\\.$#', 'count' => 1, @@ -66,16 +111,81 @@ 'count' => 6, 'path' => __DIR__ . '/system/CLI/CLI.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, array given on the right side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/CLI/CLI.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, array\\ given on the right side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/CLI/CLI.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, array\\|string\\|null given on the left side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/CLI/CLI.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a negated boolean, array given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/CLI/CLI.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a ternary operator condition, string given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/CLI/CLI.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a ternary operator condition, string\\|null given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/CLI/CLI.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, array given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/CLI/CLI.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, int given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/CLI/CLI.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in \\|\\|, string given on the left side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/CLI/CLI.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in \\|\\|, string\\|null given on the left side\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/CLI/CLI.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in \\|\\|, string\\|null given on the right side\\.$#', + 'count' => 3, + 'path' => __DIR__ . '/system/CLI/CLI.php', +]; $ignoreErrors[] = [ 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', 'count' => 5, 'path' => __DIR__ . '/system/CLI/CLI.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, array given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/CLI/Commands.php', +]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 2, 'path' => __DIR__ . '/system/Cache/CacheFactory.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, string given on the left side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Cache/Handlers/BaseHandler.php', +]; $ignoreErrors[] = [ 'message' => '#^Call to function property_exists\\(\\) with Config\\\\Cache and \'file\' will always evaluate to true\\.$#', 'count' => 1, @@ -96,6 +206,21 @@ 'count' => 1, 'path' => __DIR__ . '/system/Cache/Handlers/FileHandler.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a negated boolean, mixed given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Cache/Handlers/PredisHandler.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, int given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Cache/Handlers/PredisHandler.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, int given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Cache/Handlers/RedisHandler.php', +]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 6, @@ -166,6 +291,11 @@ 'count' => 1, 'path' => __DIR__ . '/system/CodeIgniter.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, CodeIgniter\\\\HTTP\\\\ResponseInterface\\|null given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/CodeIgniter.php', +]; $ignoreErrors[] = [ 'message' => '#^Property CodeIgniter\\\\CodeIgniter\\:\\:\\$controller type has no signature specified for Closure\\.$#', 'count' => 1, @@ -191,6 +321,11 @@ 'count' => 1, 'path' => __DIR__ . '/system/Commands/Database/MigrateStatus.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a negated boolean, array\\, array\\\\> given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Database/MigrateStatus.php', +]; $ignoreErrors[] = [ 'message' => '#^PHPDoc type array\\ of property CodeIgniter\\\\Commands\\\\Database\\\\MigrateStatus\\:\\:\\$options is not the same as PHPDoc type array of overridden property CodeIgniter\\\\CLI\\\\BaseCommand\\:\\:\\$options\\.$#', 'count' => 1, @@ -251,6 +386,21 @@ 'count' => 1, 'path' => __DIR__ . '/system/Commands/Generators/CellGenerator.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, mixed given on the left side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/CellGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, mixed given on the right side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/CellGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a negated boolean, mixed given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/CellGenerator.php', +]; $ignoreErrors[] = [ 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', 'count' => 2, @@ -271,6 +421,21 @@ 'count' => 1, 'path' => __DIR__ . '/system/Commands/Generators/CommandGenerator.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, mixed given on the left side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/CommandGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, mixed given on the right side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/CommandGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a negated boolean, mixed given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/CommandGenerator.php', +]; $ignoreErrors[] = [ 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', 'count' => 2, @@ -291,6 +456,21 @@ 'count' => 1, 'path' => __DIR__ . '/system/Commands/Generators/ConfigGenerator.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, mixed given on the left side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/ConfigGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, mixed given on the right side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/ConfigGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a negated boolean, mixed given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/ConfigGenerator.php', +]; $ignoreErrors[] = [ 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', 'count' => 2, @@ -311,6 +491,41 @@ 'count' => 1, 'path' => __DIR__ . '/system/Commands/Generators/ControllerGenerator.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, mixed given on the left side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/ControllerGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, mixed given on the right side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/ControllerGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a negated boolean, mixed given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/ControllerGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an elseif condition, mixed given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/ControllerGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, mixed given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/ControllerGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in \\|\\|, mixed given on the left side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/ControllerGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in \\|\\|, mixed given on the right side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/ControllerGenerator.php', +]; $ignoreErrors[] = [ 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', 'count' => 2, @@ -331,6 +546,21 @@ 'count' => 1, 'path' => __DIR__ . '/system/Commands/Generators/EntityGenerator.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, mixed given on the left side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/EntityGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, mixed given on the right side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/EntityGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a negated boolean, mixed given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/EntityGenerator.php', +]; $ignoreErrors[] = [ 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', 'count' => 2, @@ -351,6 +581,21 @@ 'count' => 1, 'path' => __DIR__ . '/system/Commands/Generators/FilterGenerator.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, mixed given on the left side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/FilterGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, mixed given on the right side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/FilterGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a negated boolean, mixed given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/FilterGenerator.php', +]; $ignoreErrors[] = [ 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', 'count' => 2, @@ -371,6 +616,26 @@ 'count' => 1, 'path' => __DIR__ . '/system/Commands/Generators/MigrationGenerator.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, mixed given on the left side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/MigrationGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, mixed given on the right side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/MigrationGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a negated boolean, mixed given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/MigrationGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, mixed given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/MigrationGenerator.php', +]; $ignoreErrors[] = [ 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', 'count' => 2, @@ -391,6 +656,26 @@ 'count' => 1, 'path' => __DIR__ . '/system/Commands/Generators/ModelGenerator.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, mixed given on the left side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/ModelGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, mixed given on the right side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/ModelGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a negated boolean, mixed given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/ModelGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, mixed given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/ModelGenerator.php', +]; $ignoreErrors[] = [ 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', 'count' => 2, @@ -411,6 +696,31 @@ 'count' => 1, 'path' => __DIR__ . '/system/Commands/Generators/ScaffoldGenerator.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, mixed given on the left side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/ScaffoldGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, mixed given on the right side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/ScaffoldGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a negated boolean, mixed given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/ScaffoldGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an elseif condition, mixed given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/ScaffoldGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, mixed given\\.$#', + 'count' => 4, + 'path' => __DIR__ . '/system/Commands/Generators/ScaffoldGenerator.php', +]; $ignoreErrors[] = [ 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', 'count' => 2, @@ -431,6 +741,21 @@ 'count' => 1, 'path' => __DIR__ . '/system/Commands/Generators/SeederGenerator.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, mixed given on the left side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/SeederGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, mixed given on the right side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/SeederGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a negated boolean, mixed given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/SeederGenerator.php', +]; $ignoreErrors[] = [ 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', 'count' => 2, @@ -451,6 +776,21 @@ 'count' => 1, 'path' => __DIR__ . '/system/Commands/Generators/SessionMigrationGenerator.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, mixed given on the left side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/SessionMigrationGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, mixed given on the right side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/SessionMigrationGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a negated boolean, mixed given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/SessionMigrationGenerator.php', +]; $ignoreErrors[] = [ 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', 'count' => 2, @@ -471,6 +811,21 @@ 'count' => 1, 'path' => __DIR__ . '/system/Commands/Generators/ValidationGenerator.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, mixed given on the left side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/ValidationGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, mixed given on the right side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/ValidationGenerator.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a negated boolean, mixed given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Generators/ValidationGenerator.php', +]; $ignoreErrors[] = [ 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', 'count' => 2, @@ -486,6 +841,11 @@ 'count' => 1, 'path' => __DIR__ . '/system/Commands/ListCommands.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, int given on the left side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Server/Serve.php', +]; $ignoreErrors[] = [ 'message' => '#^Accessing offset \'DOCUMENT_ROOT\' directly on \\$_SERVER is discouraged\\.$#', 'count' => 2, @@ -536,6 +896,16 @@ 'count' => 1, 'path' => __DIR__ . '/system/Commands/Utilities/Routes.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, Config\\\\Routing given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Commands/Utilities/Routes.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, string\\|null given\\.$#', + 'count' => 3, + 'path' => __DIR__ . '/system/Commands/Utilities/Routes.php', +]; $ignoreErrors[] = [ 'message' => '#^PHPDoc type array\\ of property CodeIgniter\\\\Commands\\\\Utilities\\\\Routes\\:\\:\\$options is not the same as PHPDoc type array of overridden property CodeIgniter\\\\CLI\\\\BaseCommand\\:\\:\\$options\\.$#', 'count' => 1, @@ -586,6 +956,11 @@ 'count' => 8, 'path' => __DIR__ . '/system/Common.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, string\\|null given on the left side\\.$#', + 'count' => 3, + 'path' => __DIR__ . '/system/Common.php', +]; $ignoreErrors[] = [ 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', 'count' => 2, @@ -621,6 +996,11 @@ 'count' => 3, 'path' => __DIR__ . '/system/Config/BaseService.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a negated boolean, array given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Config/BaseService.php', +]; $ignoreErrors[] = [ 'message' => '#^Accessing offset string directly on \\$_SERVER is discouraged\\.$#', 'count' => 2, @@ -636,6 +1016,31 @@ 'count' => 2, 'path' => __DIR__ . '/system/Config/DotEnv.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a negated boolean, string given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Config/DotEnv.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, string given on the left side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Config/Factories.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a negated boolean, array given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Config/Factories.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a negated boolean, string\\|null given\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Config/Factories.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, string\\|null given\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Config/Factories.php', +]; $ignoreErrors[] = [ 'message' => '#^Accessing offset \'SERVER_PROTOCOL\' directly on \\$_SERVER is discouraged\\.$#', 'count' => 1, @@ -661,6 +1066,11 @@ 'count' => 1, 'path' => __DIR__ . '/system/Controller.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a negated boolean, array given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Controller.php', +]; $ignoreErrors[] = [ 'message' => '#^Parameter \\#1 \\$offset \\(string\\) of method CodeIgniter\\\\Cookie\\\\Cookie\\:\\:offsetSet\\(\\) should be contravariant with parameter \\$offset \\(string\\|null\\) of method ArrayAccess\\\\:\\:offsetSet\\(\\)$#', 'count' => 1, @@ -761,6 +1171,21 @@ 'count' => 1, 'path' => __DIR__ . '/system/Database/BaseBuilder.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a negated boolean, TWhenNot given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/BaseBuilder.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an elseif condition, \\(callable\\)\\|null given\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Database/BaseBuilder.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, TWhen given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/BaseBuilder.php', +]; $ignoreErrors[] = [ 'message' => '#^Property CodeIgniter\\\\Database\\\\BaseBuilder\\:\\:\\$db \\(CodeIgniter\\\\Database\\\\BaseConnection\\) in empty\\(\\) is not falsy\\.$#', 'count' => 1, @@ -816,6 +1241,16 @@ 'count' => 10, 'path' => __DIR__ . '/system/Database/BaseResult.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, array\\ given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/BaseResult.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, array\\ given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/BaseResult.php', +]; $ignoreErrors[] = [ 'message' => '#^Parameter \\#1 \\$className \\(class\\-string\\) of method CodeIgniter\\\\Database\\\\BaseResult\\:\\:getCustomResultObject\\(\\) should be contravariant with parameter \\$className \\(string\\) of method CodeIgniter\\\\Database\\\\ResultInterface\\\\:\\:getCustomResultObject\\(\\)$#', 'count' => 1, @@ -901,6 +1336,11 @@ 'count' => 1, 'path' => __DIR__ . '/system/Database/Forge.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, string given on the left side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/Forge.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Database\\\\Migration\\:\\:down\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -946,6 +1386,26 @@ 'count' => 1, 'path' => __DIR__ . '/system/Database/MigrationRunner.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, int\\<0, max\\> given on the right side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/MigrationRunner.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a ternary operator condition, int\\<0, max\\> given\\.$#', + 'count' => 4, + 'path' => __DIR__ . '/system/Database/MigrationRunner.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a ternary operator condition, string\\|null given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/MigrationRunner.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, string\\|null given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/MigrationRunner.php', +]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Database\\\\ModelFactory\\:\\:injectMock\\(\\) has no return type specified\\.$#', 'count' => 1, @@ -971,6 +1431,16 @@ 'count' => 1, 'path' => __DIR__ . '/system/Database/MySQLi/Connection.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, int given on the left side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/MySQLi/Connection.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a negated boolean, array given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/MySQLi/Connection.php', +]; $ignoreErrors[] = [ 'message' => '#^PHPDoc type string of property CodeIgniter\\\\Database\\\\MySQLi\\\\Connection\\:\\:\\$escapeChar is not the same as PHPDoc type array\\|string of overridden property CodeIgniter\\\\Database\\\\BaseConnection\\\\:\\:\\$escapeChar\\.$#', 'count' => 1, @@ -1031,6 +1501,11 @@ 'count' => 1, 'path' => __DIR__ . '/system/Database/OCI8/Builder.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a ternary operator condition, int given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/OCI8/Builder.php', +]; $ignoreErrors[] = [ 'message' => '#^PHPDoc type CodeIgniter\\\\Database\\\\OCI8\\\\Connection of property CodeIgniter\\\\Database\\\\OCI8\\\\Builder\\:\\:\\$db is not the same as PHPDoc type CodeIgniter\\\\Database\\\\BaseConnection of overridden property CodeIgniter\\\\Database\\\\BaseBuilder\\:\\:\\$db\\.$#', 'count' => 1, @@ -1046,6 +1521,21 @@ 'count' => 5, 'path' => __DIR__ . '/system/Database/OCI8/Connection.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a negated boolean, array given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/OCI8/Connection.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a negated boolean, array\\ given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/OCI8/Connection.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a negated boolean, array\\|string given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/OCI8/Connection.php', +]; $ignoreErrors[] = [ 'message' => '#^PHPDoc type string of property CodeIgniter\\\\Database\\\\OCI8\\\\Connection\\:\\:\\$escapeChar is not the same as PHPDoc type array\\|string of overridden property CodeIgniter\\\\Database\\\\BaseConnection\\\\:\\:\\$escapeChar\\.$#', 'count' => 1, @@ -1116,6 +1606,11 @@ 'count' => 8, 'path' => __DIR__ . '/system/Database/Postgre/Builder.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a negated boolean, array\\\\|string\\> given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/Postgre/Builder.php', +]; $ignoreErrors[] = [ 'message' => '#^Return type \\(CodeIgniter\\\\Database\\\\BaseBuilder\\) of method CodeIgniter\\\\Database\\\\Postgre\\\\Builder\\:\\:join\\(\\) should be covariant with return type \\(\\$this\\(CodeIgniter\\\\Database\\\\BaseBuilder\\)\\) of method CodeIgniter\\\\Database\\\\BaseBuilder\\:\\:join\\(\\)$#', 'count' => 1, @@ -1401,6 +1896,11 @@ 'count' => 1, 'path' => __DIR__ . '/system/Database/SQLite3/Connection.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a negated boolean, string given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Database/SQLite3/Connection.php', +]; $ignoreErrors[] = [ 'message' => '#^PHPDoc type string of property CodeIgniter\\\\Database\\\\SQLite3\\\\Connection\\:\\:\\$escapeChar is not the same as PHPDoc type array\\|string of overridden property CodeIgniter\\\\Database\\\\BaseConnection\\\\:\\:\\$escapeChar\\.$#', 'count' => 1, @@ -1496,11 +1996,31 @@ 'count' => 2, 'path' => __DIR__ . '/system/Debug/ExceptionHandler.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, string given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Debug/ExceptionHandler.php', +]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 3, 'path' => __DIR__ . '/system/Debug/Exceptions.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, Throwable\\|null given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Debug/Exceptions.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, int given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Debug/Exceptions.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, string given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Debug/Exceptions.php', +]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 1, @@ -1552,18 +2072,33 @@ 'path' => __DIR__ . '/system/Debug/Toolbar/Collectors/Views.php', ]; $ignoreErrors[] = [ - 'message' => '#^Accessing offset \'SERVER_ADDR\' directly on \\$_SERVER is discouraged\\.$#', - 'count' => 2, + 'message' => '#^Accessing offset \'SERVER_ADDR\' directly on \\$_SERVER is discouraged\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Email/Email.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Accessing offset \'SERVER_NAME\' directly on \\$_SERVER is discouraged\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Email/Email.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', + 'count' => 14, + 'path' => __DIR__ . '/system/Email/Email.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, int given on the left side\\.$#', + 'count' => 1, 'path' => __DIR__ . '/system/Email/Email.php', ]; $ignoreErrors[] = [ - 'message' => '#^Accessing offset \'SERVER_NAME\' directly on \\$_SERVER is discouraged\\.$#', - 'count' => 2, + 'message' => '#^Only booleans are allowed in &&, string given on the right side\\.$#', + 'count' => 1, 'path' => __DIR__ . '/system/Email/Email.php', ]; $ignoreErrors[] = [ - 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', - 'count' => 14, + 'message' => '#^Only booleans are allowed in an if condition, string\\|null given\\.$#', + 'count' => 1, 'path' => __DIR__ . '/system/Email/Email.php', ]; $ignoreErrors[] = [ @@ -1576,11 +2111,21 @@ 'count' => 2, 'path' => __DIR__ . '/system/Encryption/Encryption.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, Config\\\\Encryption\\|null given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Encryption/Encryption.php', +]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 2, 'path' => __DIR__ . '/system/Encryption/Handlers/OpenSSLHandler.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, array\\|string\\|null given\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Encryption/Handlers/OpenSSLHandler.php', +]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 2, @@ -1671,6 +2216,11 @@ 'count' => 1, 'path' => __DIR__ . '/system/Filters/Filters.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a negated boolean, array given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Filters/Filters.php', +]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 2, @@ -1686,6 +2236,11 @@ 'count' => 1, 'path' => __DIR__ . '/system/HTTP/CURLRequest.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, string given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/CURLRequest.php', +]; $ignoreErrors[] = [ 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', 'count' => 1, @@ -1701,6 +2256,11 @@ 'count' => 2, 'path' => __DIR__ . '/system/HTTP/DownloadResponse.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, string given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/DownloadResponse.php', +]; $ignoreErrors[] = [ 'message' => '#^Return type \\(CodeIgniter\\\\HTTP\\\\DownloadResponse\\) of method CodeIgniter\\\\HTTP\\\\DownloadResponse\\:\\:noCache\\(\\) should be covariant with return type \\(\\$this\\(CodeIgniter\\\\HTTP\\\\Response\\)\\) of method CodeIgniter\\\\HTTP\\\\Response\\:\\:noCache\\(\\)$#', 'count' => 1, @@ -1756,6 +2316,11 @@ 'count' => 1, 'path' => __DIR__ . '/system/HTTP/Files/FileCollection.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, array given on the right side\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/HTTP/Files/FileCollection.php', +]; $ignoreErrors[] = [ 'message' => '#^Expression on left side of \\?\\? is not nullable\\.$#', 'count' => 1, @@ -1851,11 +2416,21 @@ 'count' => 3, 'path' => __DIR__ . '/system/HTTP/Negotiate.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a ternary operator condition, int\\|null given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/OutgoingRequest.php', +]; $ignoreErrors[] = [ 'message' => '#^Return type \\(CodeIgniter\\\\HTTP\\\\URI\\|null\\) of method CodeIgniter\\\\HTTP\\\\OutgoingRequest\\:\\:getUri\\(\\) should be covariant with return type \\(CodeIgniter\\\\HTTP\\\\URI\\) of method CodeIgniter\\\\HTTP\\\\OutgoingRequestInterface\\:\\:getUri\\(\\)$#', 'count' => 1, 'path' => __DIR__ . '/system/HTTP/OutgoingRequest.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, array\\ given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/RedirectResponse.php', +]; $ignoreErrors[] = [ 'message' => '#^Variable \\$_GET on left side of \\?\\? always exists and is not nullable\\.$#', 'count' => 1, @@ -1871,6 +2446,11 @@ 'count' => 3, 'path' => __DIR__ . '/system/HTTP/Request.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, string given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/Request.php', +]; $ignoreErrors[] = [ 'message' => '#^Accessing offset \'REQUEST_METHOD\' directly on \\$_SERVER is discouraged\\.$#', 'count' => 3, @@ -1891,6 +2471,21 @@ 'count' => 6, 'path' => __DIR__ . '/system/HTTP/Response.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, string\\|null given on the left side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/Response.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, string\\|null given on the right side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/Response.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, string\\|null given\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/HTTP/Response.php', +]; $ignoreErrors[] = [ 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', 'count' => 5, @@ -1901,6 +2496,11 @@ 'count' => 4, 'path' => __DIR__ . '/system/HTTP/SiteURI.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, string given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/SiteURI.php', +]; $ignoreErrors[] = [ 'message' => '#^Strict comparison using \\!\\=\\= between mixed and null will always evaluate to true\\.$#', 'count' => 1, @@ -1911,6 +2511,16 @@ 'count' => 15, 'path' => __DIR__ . '/system/HTTP/URI.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, string given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HTTP/URI.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, string\\|null given\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/HTTP/URI.php', +]; $ignoreErrors[] = [ 'message' => '#^Property CodeIgniter\\\\HTTP\\\\URI\\:\\:\\$fragment \\(string\\) on left side of \\?\\? is not nullable\\.$#', 'count' => 1, @@ -1946,6 +2556,11 @@ 'count' => 3, 'path' => __DIR__ . '/system/HTTP/UserAgent.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, array\\ given on the right side\\.$#', + 'count' => 4, + 'path' => __DIR__ . '/system/HTTP/UserAgent.php', +]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 3, @@ -1956,6 +2571,66 @@ 'count' => 1, 'path' => __DIR__ . '/system/Helpers/date_helper.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a ternary operator condition, int\\<0, 1024\\> given\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Helpers/filesystem_helper.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a ternary operator condition, int\\<0, 128\\> given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Helpers/filesystem_helper.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a ternary operator condition, int\\<0, 16\\> given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Helpers/filesystem_helper.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a ternary operator condition, int\\<0, 1\\> given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Helpers/filesystem_helper.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a ternary operator condition, int\\<0, 2048\\> given\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Helpers/filesystem_helper.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a ternary operator condition, int\\<0, 256\\> given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Helpers/filesystem_helper.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a ternary operator condition, int\\<0, 2\\> given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Helpers/filesystem_helper.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a ternary operator condition, int\\<0, 32\\> given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Helpers/filesystem_helper.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a ternary operator condition, int\\<0, 4\\> given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Helpers/filesystem_helper.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a ternary operator condition, int\\<0, 512\\> given\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Helpers/filesystem_helper.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a ternary operator condition, int\\<0, 64\\> given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Helpers/filesystem_helper.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a ternary operator condition, int\\<0, 8\\> given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Helpers/filesystem_helper.php', +]; $ignoreErrors[] = [ 'message' => '#^Right side of && is always true\\.$#', 'count' => 1, @@ -1981,11 +2656,31 @@ 'count' => 4, 'path' => __DIR__ . '/system/Helpers/form_helper.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, array given on the right side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Helpers/form_helper.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a negated boolean, int\\<0, max\\> given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Helpers/form_helper.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a negated boolean, string given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Helpers/form_helper.php', +]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 6, 'path' => __DIR__ . '/system/Helpers/html_helper.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a ternary operator condition, string given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Helpers/html_helper.php', +]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 2, @@ -1996,11 +2691,21 @@ 'count' => 2, 'path' => __DIR__ . '/system/Helpers/test_helper.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, array\\|null given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Helpers/test_helper.php', +]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 3, 'path' => __DIR__ . '/system/Helpers/text_helper.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a ternary operator condition, string\\|null given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Helpers/text_helper.php', +]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 2, @@ -2011,6 +2716,11 @@ 'count' => 1, 'path' => __DIR__ . '/system/Helpers/url_helper.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a ternary operator condition, string given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Helpers/url_helper.php', +]; $ignoreErrors[] = [ 'message' => '#^Variable \\$atts might not be defined\\.$#', 'count' => 1, @@ -2021,6 +2731,11 @@ 'count' => 2, 'path' => __DIR__ . '/system/Honeypot/Honeypot.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in \\|\\|, int given on the right side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/HotReloader/HotReloader.php', +]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 3, @@ -2141,6 +2856,11 @@ 'count' => 1, 'path' => __DIR__ . '/system/Log/Logger.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, array given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Log/Logger.php', +]; $ignoreErrors[] = [ 'message' => '#^Parameter \\#1 \\$level \\(string\\) of method CodeIgniter\\\\Log\\\\Logger\\:\\:log\\(\\) should be contravariant with parameter \\$level \\(mixed\\) of method Psr\\\\Log\\\\LoggerInterface\\:\\:log\\(\\)$#', 'count' => 1, @@ -2156,6 +2876,26 @@ 'count' => 1, 'path' => __DIR__ . '/system/Model.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, array given on the left side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Model.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, string given on the right side\\.$#', + 'count' => 3, + 'path' => __DIR__ . '/system/Model.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, string\\|null given on the left side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Model.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, array\\|int\\|string\\|null given\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Model.php', +]; $ignoreErrors[] = [ 'message' => '#^Return type \\(array\\|bool\\|float\\|int\\|object\\|string\\|null\\) of method CodeIgniter\\\\Model\\:\\:__call\\(\\) should be covariant with return type \\(\\$this\\(CodeIgniter\\\\BaseModel\\)\\|null\\) of method CodeIgniter\\\\BaseModel\\:\\:__call\\(\\)$#', 'count' => 1, @@ -2176,6 +2916,16 @@ 'count' => 4, 'path' => __DIR__ . '/system/Pager/Pager.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, array given\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Pager/Pager.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, int given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Pager/Pager.php', +]; $ignoreErrors[] = [ 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', 'count' => 1, @@ -2196,6 +2946,11 @@ 'count' => 4, 'path' => __DIR__ . '/system/RESTful/BaseResource.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, object\\|string\\|null given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/RESTful/BaseResource.php', +]; $ignoreErrors[] = [ 'message' => '#^PHPDoc type CodeIgniter\\\\HTTP\\\\CLIRequest\\|CodeIgniter\\\\HTTP\\\\IncomingRequest of property CodeIgniter\\\\RESTful\\\\BaseResource\\:\\:\\$request is not the same as PHPDoc type CodeIgniter\\\\HTTP\\\\RequestInterface of overridden property CodeIgniter\\\\Controller\\:\\:\\$request\\.$#', 'count' => 1, @@ -2211,6 +2966,11 @@ 'count' => 6, 'path' => __DIR__ . '/system/Router/AutoRouter.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a ternary operator condition, string\\|null given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Router/AutoRouter.php', +]; $ignoreErrors[] = [ 'message' => '#^Property CodeIgniter\\\\Router\\\\AutoRouter\\:\\:\\$cliRoutes type has no signature specified for Closure\\.$#', 'count' => 1, @@ -2221,6 +2981,11 @@ 'count' => 1, 'path' => __DIR__ . '/system/Router/AutoRouter.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, Config\\\\Routing given on the right side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Router/AutoRouterImproved.php', +]; $ignoreErrors[] = [ 'message' => '#^PHPDoc type int of property CodeIgniter\\\\Router\\\\Exceptions\\\\RedirectException\\:\\:\\$code is not the same as PHPDoc type mixed of overridden property Exception\\:\\:\\$code\\.$#', 'count' => 1, @@ -2311,6 +3076,21 @@ 'count' => 1, 'path' => __DIR__ . '/system/Router/RouteCollection.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, array\\ given on the left side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Router/RouteCollection.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a ternary operator condition, string given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Router/RouteCollection.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a ternary operator condition, string\\|null given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Router/RouteCollection.php', +]; $ignoreErrors[] = [ 'message' => '#^Property CodeIgniter\\\\Router\\\\RouteCollection\\:\\:\\$override404 type has no signature specified for Closure\\.$#', 'count' => 1, @@ -2466,6 +3246,11 @@ 'count' => 1, 'path' => __DIR__ . '/system/Session/Handlers/Database/PostgreHandler.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, mixed given\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Session/Handlers/Database/PostgreHandler.php', +]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 2, @@ -2486,6 +3271,11 @@ 'count' => 1, 'path' => __DIR__ . '/system/Session/Handlers/FileHandler.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a negated boolean, string given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Session/Handlers/FileHandler.php', +]; $ignoreErrors[] = [ 'message' => '#^PHPDoc type string of property CodeIgniter\\\\Session\\\\Handlers\\\\FileHandler\\:\\:\\$savePath is not the same as PHPDoc type array\\|string of overridden property CodeIgniter\\\\Session\\\\Handlers\\\\BaseHandler\\:\\:\\$savePath\\.$#', 'count' => 1, @@ -2501,11 +3291,26 @@ 'count' => 3, 'path' => __DIR__ . '/system/Session/Handlers/MemcachedHandler.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, mixed given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Session/Handlers/MemcachedHandler.php', +]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 5, 'path' => __DIR__ . '/system/Session/Handlers/RedisHandler.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in &&, string given on the right side\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Session/Handlers/RedisHandler.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a negated boolean, int given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Session/Handlers/RedisHandler.php', +]; $ignoreErrors[] = [ 'message' => '#^Accessing offset \'HTTP_X_REQUESTED_WITH\' directly on \\$_SERVER is discouraged\\.$#', 'count' => 2, @@ -2781,6 +3586,11 @@ 'count' => 1, 'path' => __DIR__ . '/system/Test/CIUnitTestCase.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a negated boolean, CodeIgniter\\\\CodeIgniter given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Test/CIUnitTestCase.php', +]; $ignoreErrors[] = [ 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', 'count' => 1, @@ -2911,6 +3721,16 @@ 'count' => 1, 'path' => __DIR__ . '/system/Test/FeatureTestCase.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a negated boolean, CodeIgniter\\\\Router\\\\RouteCollection\\|null given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Test/FeatureTestCase.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, array\\|null given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/Test/FeatureTestCase.php', +]; $ignoreErrors[] = [ 'message' => '#^Property CodeIgniter\\\\Test\\\\CIUnitTestCase\\:\\:\\$bodyFormat \\(string\\) in isset\\(\\) is not nullable\\.$#', 'count' => 1, @@ -3391,6 +4211,11 @@ 'count' => 1, 'path' => __DIR__ . '/system/Validation/DotArrayFilter.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a negated boolean, array\\|null given\\.$#', + 'count' => 6, + 'path' => __DIR__ . '/system/Validation/FileRules.php', +]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 4, @@ -3416,6 +4241,11 @@ 'count' => 1, 'path' => __DIR__ . '/system/Validation/Validation.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, array given\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/Validation/Validation.php', +]; $ignoreErrors[] = [ 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', 'count' => 2, @@ -3466,6 +4296,16 @@ 'count' => 9, 'path' => __DIR__ . '/system/View/Table.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in a ternary operator condition, float given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/View/Table.php', +]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, string\\|null given\\.$#', + 'count' => 1, + 'path' => __DIR__ . '/system/View/Table.php', +]; $ignoreErrors[] = [ 'message' => '#^Property CodeIgniter\\\\View\\\\Table\\:\\:\\$function type has no signature specified for callable\\.$#', 'count' => 1, @@ -3476,6 +4316,11 @@ 'count' => 3, 'path' => __DIR__ . '/system/View/View.php', ]; +$ignoreErrors[] = [ + 'message' => '#^Only booleans are allowed in an if condition, string\\|null given\\.$#', + 'count' => 2, + 'path' => __DIR__ . '/system/View/View.php', +]; $ignoreErrors[] = [ 'message' => '#^Parameter \\#2 \\$context \\(\'attr\'\\|\'css\'\\|\'html\'\\|\'js\'\\|\'raw\'\\|\'url\'\\|null\\) of method CodeIgniter\\\\View\\\\View\\:\\:setData\\(\\) should be contravariant with parameter \\$context \\(string\\|null\\) of method CodeIgniter\\\\View\\\\RendererInterface\\:\\:setData\\(\\)$#', 'count' => 1, From 72a1d16ad780092c2070711d40e18d192037f96a Mon Sep 17 00:00:00 2001 From: kenjis Date: Fri, 15 Sep 2023 16:22:28 +0900 Subject: [PATCH 090/209] docs: add note for feature to replace Config property --- user_guide_src/source/general/configuration.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/user_guide_src/source/general/configuration.rst b/user_guide_src/source/general/configuration.rst index e51ab1e8fa40..4e8c2940d996 100644 --- a/user_guide_src/source/general/configuration.rst +++ b/user_guide_src/source/general/configuration.rst @@ -183,6 +183,10 @@ are considered for merging into the configuration object's properties. .. important:: You cannot add a new property by setting environment variables, nor change a scalar value to an array. See :ref:`env-var-replacements-for-data`. +.. note:: This feature is implemented in the ``CodeIgniter\Config\BaseConfig`` + class. So it will not work with a few files in the **app/Config** folder + that do not extends the class. + If the prefix of a namespaced variable exactly matches the namespace of the configuration class, then the trailing part of the setting (after the dot) is treated as a configuration property. If it matches an existing configuration property, the environment variable's From b63b6253f24f363ff742c3a7497dd2012324feda Mon Sep 17 00:00:00 2001 From: kenjis Date: Fri, 15 Sep 2023 16:24:57 +0900 Subject: [PATCH 091/209] docs: add link to how-to page --- user_guide_src/source/database/configuration.rst | 2 ++ user_guide_src/source/general/configuration.rst | 2 ++ 2 files changed, 4 insertions(+) diff --git a/user_guide_src/source/database/configuration.rst b/user_guide_src/source/database/configuration.rst index b80c10ede526..128e28d9eeef 100644 --- a/user_guide_src/source/database/configuration.rst +++ b/user_guide_src/source/database/configuration.rst @@ -105,6 +105,8 @@ within the class' constructor: .. literalinclude:: configuration/008.php +.. _database-config-with-env-file: + ************************** Configuring with .env File ************************** diff --git a/user_guide_src/source/general/configuration.rst b/user_guide_src/source/general/configuration.rst index 4e8c2940d996..45ecce84108d 100644 --- a/user_guide_src/source/general/configuration.rst +++ b/user_guide_src/source/general/configuration.rst @@ -237,6 +237,8 @@ expect your ``Config\App`` to magically have that property and value at run time When you have the property ``$default = ['encrypt' => false]`` in your ``Config\Database``, you cannot change the ``encrypt`` value to an array even if you put ``database.default.encrypt.ssl_verify = true`` in your **.env**. +If you want to do like that, see +:ref:`Database Configuration `. Treating Environment Variables as Arrays ======================================== From c48f34b5237eec2ed643722950ada833893ca4c4 Mon Sep 17 00:00:00 2001 From: michalsn Date: Sat, 9 Sep 2023 09:06:15 +0200 Subject: [PATCH 092/209] fix: check for CSRF token in the raw body --- system/Security/Security.php | 31 ++++++++----- .../SecurityCSRFSessionRandomizeTokenTest.php | 13 ++++++ .../Security/SecurityCSRFSessionTest.php | 13 ++++++ tests/system/Security/SecurityTest.php | 44 +++++++++++++++++++ user_guide_src/source/changelogs/v4.4.2.rst | 2 + 5 files changed, 93 insertions(+), 10 deletions(-) diff --git a/system/Security/Security.php b/system/Security/Security.php index 648856321363..b8bed67dfe11 100644 --- a/system/Security/Security.php +++ b/system/Security/Security.php @@ -318,16 +318,22 @@ private function removeTokenInRequest(RequestInterface $request): void { assert($request instanceof Request); - $json = json_decode($request->getBody() ?? ''); - if (isset($_POST[$this->config->tokenName])) { // We kill this since we're done and we don't want to pollute the POST array. unset($_POST[$this->config->tokenName]); $request->setGlobal('post', $_POST); - } elseif (isset($json->{$this->config->tokenName})) { - // We kill this since we're done and we don't want to pollute the JSON data. - unset($json->{$this->config->tokenName}); - $request->setBody(json_encode($json)); + } else { + $body = $request->getBody() ?? ''; + if (! empty($json = json_decode($body)) && json_last_error() === JSON_ERROR_NONE) { + // We kill this since we're done and we don't want to pollute the JSON data. + unset($json->{$this->config->tokenName}); + $request->setBody(json_encode($json)); + } else { + parse_str($body, $parsed); + // We kill this since we're done and we don't want to pollute the BODY data. + unset($parsed[$this->config->tokenName]); + $request->setBody(http_build_query($parsed)); + } } } @@ -335,7 +341,7 @@ private function getPostedToken(RequestInterface $request): ?string { assert($request instanceof IncomingRequest); - // Does the token exist in POST, HEADER or optionally php:://input - json data. + // Does the token exist in POST, HEADER or optionally php:://input - json data or PUT, DELETE, PATCH - raw data. if ($tokenValue = $request->getPost($this->config->tokenName)) { return $tokenValue; @@ -346,10 +352,15 @@ private function getPostedToken(RequestInterface $request): ?string } $body = (string) $request->getBody(); - $json = json_decode($body); - if ($body !== '' && ! empty($json) && json_last_error() === JSON_ERROR_NONE) { - return $json->{$this->config->tokenName} ?? null; + if ($body !== '') { + if (! empty($json = json_decode($body)) && json_last_error() === JSON_ERROR_NONE) { + return $json->{$this->config->tokenName} ?? null; + } + + parse_str($body, $parsed); + + return $parsed[$this->config->tokenName] ?? null; } return null; diff --git a/tests/system/Security/SecurityCSRFSessionRandomizeTokenTest.php b/tests/system/Security/SecurityCSRFSessionRandomizeTokenTest.php index 2a148c902e0f..7c8af63040f4 100644 --- a/tests/system/Security/SecurityCSRFSessionRandomizeTokenTest.php +++ b/tests/system/Security/SecurityCSRFSessionRandomizeTokenTest.php @@ -246,6 +246,19 @@ public function testCSRFVerifyPUTHeaderReturnsSelfOnMatch(): void $this->assertLogged('info', 'CSRF token verified.'); } + public function testCSRFVerifyPUTBodyReturnsSelfOnMatch(): void + { + $_SERVER['REQUEST_METHOD'] = 'PUT'; + + $request = new IncomingRequest(new MockAppConfig(), new URI('http://badurl.com'), null, new UserAgent()); + $request->setBody("csrf_test_name={$this->randomizedToken}&foo=bar"); + + $security = $this->createSecurity(); + + $this->assertInstanceOf(Security::class, $security->verify($request)); + $this->assertLogged('info', 'CSRF token verified.'); + } + public function testCSRFVerifyJsonThrowsExceptionOnNoMatch(): void { $this->expectException(SecurityException::class); diff --git a/tests/system/Security/SecurityCSRFSessionTest.php b/tests/system/Security/SecurityCSRFSessionTest.php index a8f784a5464b..1d701520488c 100644 --- a/tests/system/Security/SecurityCSRFSessionTest.php +++ b/tests/system/Security/SecurityCSRFSessionTest.php @@ -201,6 +201,19 @@ public function testCSRFVerifyPUTHeaderReturnsSelfOnMatch(): void $this->assertLogged('info', 'CSRF token verified.'); } + public function testCSRFVerifyPUTBodyReturnsSelfOnMatch(): void + { + $_SERVER['REQUEST_METHOD'] = 'PUT'; + + $request = new IncomingRequest(new MockAppConfig(), new URI('http://badurl.com'), null, new UserAgent()); + $request->setBody('csrf_test_name=8b9218a55906f9dcc1dc263dce7f005a&foo=bar'); + + $security = $this->createSecurity(); + + $this->assertInstanceOf(Security::class, $security->verify($request)); + $this->assertLogged('info', 'CSRF token verified.'); + } + public function testCSRFVerifyJsonThrowsExceptionOnNoMatch(): void { $this->expectException(SecurityException::class); diff --git a/tests/system/Security/SecurityTest.php b/tests/system/Security/SecurityTest.php index 972115de6a7b..ae4953607662 100644 --- a/tests/system/Security/SecurityTest.php +++ b/tests/system/Security/SecurityTest.php @@ -218,6 +218,50 @@ public function testCSRFVerifyJsonReturnsSelfOnMatch(): void $this->assertSame('{"foo":"bar"}', $request->getBody()); } + public function testCSRFVerifyPutBodyThrowsExceptionOnNoMatch(): void + { + $_SERVER['REQUEST_METHOD'] = 'PUT'; + $_COOKIE['csrf_cookie_name'] = '8b9218a55906f9dcc1dc263dce7f005b'; + + $security = $this->createMockSecurity(); + $request = new IncomingRequest( + new MockAppConfig(), + new URI('http://badurl.com'), + null, + new UserAgent() + ); + + $request->setBody( + 'csrf_test_name=8b9218a55906f9dcc1dc263dce7f005a' + ); + + $this->expectException(SecurityException::class); + $security->verify($request); + } + + public function testCSRFVerifyPutBodyReturnsSelfOnMatch(): void + { + $_SERVER['REQUEST_METHOD'] = 'PUT'; + $_COOKIE['csrf_cookie_name'] = '8b9218a55906f9dcc1dc263dce7f005a'; + + $security = $this->createMockSecurity(); + $request = new IncomingRequest( + new MockAppConfig(), + new URI('http://badurl.com'), + null, + new UserAgent() + ); + + $request->setBody( + 'csrf_test_name=8b9218a55906f9dcc1dc263dce7f005a&foo=bar' + ); + + $this->assertInstanceOf(Security::class, $security->verify($request)); + $this->assertLogged('info', 'CSRF token verified.'); + + $this->assertSame('foo=bar', $request->getBody()); + } + public function testSanitizeFilename(): void { $security = $this->createMockSecurity(); diff --git a/user_guide_src/source/changelogs/v4.4.2.rst b/user_guide_src/source/changelogs/v4.4.2.rst index 3866a7664ee6..0b288350797a 100644 --- a/user_guide_src/source/changelogs/v4.4.2.rst +++ b/user_guide_src/source/changelogs/v4.4.2.rst @@ -29,6 +29,8 @@ Deprecations Bugs Fixed ********** +- **Security:** Fixed a bug where the CSRF token wasn't checked if we sent it in the raw body (not JSON format) for PUT, PATCH, and DELETE requests. + See the repo's `CHANGELOG.md `_ for a complete list of bugs fixed. From ca6c800d5cf9a9290d1c2f41297337b41926b92f Mon Sep 17 00:00:00 2001 From: michalsn Date: Sat, 9 Sep 2023 14:59:41 +0200 Subject: [PATCH 093/209] implement changes from code review --- system/Security/Security.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/system/Security/Security.php b/system/Security/Security.php index b8bed67dfe11..1ab893aeff8f 100644 --- a/system/Security/Security.php +++ b/system/Security/Security.php @@ -354,7 +354,8 @@ private function getPostedToken(RequestInterface $request): ?string $body = (string) $request->getBody(); if ($body !== '') { - if (! empty($json = json_decode($body)) && json_last_error() === JSON_ERROR_NONE) { + $json = json_decode($body); + if (! empty($json) && json_last_error() === JSON_ERROR_NONE) { return $json->{$this->config->tokenName} ?? null; } From 1528d0ea3bd653dc91b594d761a8d5bac65f334d Mon Sep 17 00:00:00 2001 From: michalsn Date: Sat, 9 Sep 2023 15:00:04 +0200 Subject: [PATCH 094/209] update changelog and user guide --- user_guide_src/source/changelogs/v4.4.2.rst | 3 +-- user_guide_src/source/libraries/security.rst | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/user_guide_src/source/changelogs/v4.4.2.rst b/user_guide_src/source/changelogs/v4.4.2.rst index 0b288350797a..19f2a4f1782c 100644 --- a/user_guide_src/source/changelogs/v4.4.2.rst +++ b/user_guide_src/source/changelogs/v4.4.2.rst @@ -22,6 +22,7 @@ Changes command was removed. It did not work from the beginning. Also, the rollback command returns the database(s) state to a specified batch number and cannot specify only a specific database group. +- **Security:** The presence of the CSRF token is now also checked in the raw body (not JSON format) for PUT, PATCH, and DELETE type of requests. Deprecations ************ @@ -29,8 +30,6 @@ Deprecations Bugs Fixed ********** -- **Security:** Fixed a bug where the CSRF token wasn't checked if we sent it in the raw body (not JSON format) for PUT, PATCH, and DELETE requests. - See the repo's `CHANGELOG.md `_ for a complete list of bugs fixed. diff --git a/user_guide_src/source/libraries/security.rst b/user_guide_src/source/libraries/security.rst index bc5777f759fa..f78c1106e861 100644 --- a/user_guide_src/source/libraries/security.rst +++ b/user_guide_src/source/libraries/security.rst @@ -204,6 +204,7 @@ The order of checking the availability of the CSRF token is as follows: 1. ``$_POST`` array 2. HTTP header 3. ``php://input`` (JSON request) - bear in mind that this approach is the slowest one since we have to decode JSON and then re-encode it +4. ``php://input`` (raw body) - for PUT, PATCH, and DELETE type of requests ********************* Other Helpful Methods From 4335c6be165de5d3de8b76346ec931edf8e15218 Mon Sep 17 00:00:00 2001 From: michalsn Date: Sat, 9 Sep 2023 15:33:43 +0200 Subject: [PATCH 095/209] implement missing changes from the code review --- system/Security/Security.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/system/Security/Security.php b/system/Security/Security.php index 1ab893aeff8f..534487efcc41 100644 --- a/system/Security/Security.php +++ b/system/Security/Security.php @@ -324,7 +324,8 @@ private function removeTokenInRequest(RequestInterface $request): void $request->setGlobal('post', $_POST); } else { $body = $request->getBody() ?? ''; - if (! empty($json = json_decode($body)) && json_last_error() === JSON_ERROR_NONE) { + $json = json_decode($body); + if (! empty($json) && json_last_error() === JSON_ERROR_NONE) { // We kill this since we're done and we don't want to pollute the JSON data. unset($json->{$this->config->tokenName}); $request->setBody(json_encode($json)); From a63457f0695c0c8d292c950c6b87351c4cae4e87 Mon Sep 17 00:00:00 2001 From: michalsn Date: Fri, 15 Sep 2023 10:14:48 +0200 Subject: [PATCH 096/209] apply changes from code review --- system/Security/Security.php | 4 ++-- user_guide_src/source/libraries/security.rst | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/system/Security/Security.php b/system/Security/Security.php index 534487efcc41..aeb8526cfdc0 100644 --- a/system/Security/Security.php +++ b/system/Security/Security.php @@ -325,7 +325,7 @@ private function removeTokenInRequest(RequestInterface $request): void } else { $body = $request->getBody() ?? ''; $json = json_decode($body); - if (! empty($json) && json_last_error() === JSON_ERROR_NONE) { + if ($json !== null && json_last_error() === JSON_ERROR_NONE) { // We kill this since we're done and we don't want to pollute the JSON data. unset($json->{$this->config->tokenName}); $request->setBody(json_encode($json)); @@ -356,7 +356,7 @@ private function getPostedToken(RequestInterface $request): ?string if ($body !== '') { $json = json_decode($body); - if (! empty($json) && json_last_error() === JSON_ERROR_NONE) { + if ($json !== null && json_last_error() === JSON_ERROR_NONE) { return $json->{$this->config->tokenName} ?? null; } diff --git a/user_guide_src/source/libraries/security.rst b/user_guide_src/source/libraries/security.rst index f78c1106e861..6c39cbefdb5e 100644 --- a/user_guide_src/source/libraries/security.rst +++ b/user_guide_src/source/libraries/security.rst @@ -206,6 +206,8 @@ The order of checking the availability of the CSRF token is as follows: 3. ``php://input`` (JSON request) - bear in mind that this approach is the slowest one since we have to decode JSON and then re-encode it 4. ``php://input`` (raw body) - for PUT, PATCH, and DELETE type of requests +.. note:: ``php://input`` (raw body) is checked since v4.4.2. + ********************* Other Helpful Methods ********************* From be07d9c98fff5cf87664495d4e393a4910406378 Mon Sep 17 00:00:00 2001 From: michalsn Date: Fri, 15 Sep 2023 10:29:07 +0200 Subject: [PATCH 097/209] make phpstan happy --- system/Security/Security.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/system/Security/Security.php b/system/Security/Security.php index aeb8526cfdc0..4ba665639f36 100644 --- a/system/Security/Security.php +++ b/system/Security/Security.php @@ -348,7 +348,9 @@ private function getPostedToken(RequestInterface $request): ?string return $tokenValue; } - if ($request->hasHeader($this->config->headerName) && ! empty($request->header($this->config->headerName)->getValue())) { + if ($request->hasHeader($this->config->headerName) + && $request->header($this->config->headerName)->getValue() !== '' + && $request->header($this->config->headerName)->getValue() !== []) { return $request->header($this->config->headerName)->getValue(); } From 46f8d5f7e393ecb886cdc40b1d97d5c2872b31ba Mon Sep 17 00:00:00 2001 From: michalsn Date: Fri, 15 Sep 2023 10:51:57 +0200 Subject: [PATCH 098/209] update phpstan-baseline.php --- phpstan-baseline.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/phpstan-baseline.php b/phpstan-baseline.php index 106de3723ef0..d95d38fb3c6d 100644 --- a/phpstan-baseline.php +++ b/phpstan-baseline.php @@ -2421,11 +2421,6 @@ 'count' => 1, 'path' => __DIR__ . '/system/Router/RouterInterface.php', ]; -$ignoreErrors[] = [ - 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', - 'count' => 2, - 'path' => __DIR__ . '/system/Security/Security.php', -]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Session\\\\Exceptions\\\\SessionException\\:\\:forEmptySavepath\\(\\) has no return type specified\\.$#', 'count' => 1, From 5073e8b4de1163b29b69eba6af4a7db20420daee Mon Sep 17 00:00:00 2001 From: Paulo Esteves Date: Sat, 16 Sep 2023 12:26:33 +0100 Subject: [PATCH 099/209] refactor: Apply PHPStan rule to RouteCollection::__construct() --- system/Router/RouteCollection.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/system/Router/RouteCollection.php b/system/Router/RouteCollection.php index 34629920cc1c..afdbe1611dea 100644 --- a/system/Router/RouteCollection.php +++ b/system/Router/RouteCollection.php @@ -302,7 +302,8 @@ public function __construct(FileLocator $locator, Modules $moduleConfig, Routing // Normalize the path string in routeFiles array. foreach ($this->routeFiles as $routeKey => $routesFile) { - $this->routeFiles[$routeKey] = realpath($routesFile) ?: $routesFile; + $realpath = realpath($routesFile); + $this->routeFiles[$routeKey] = ($realpath === false) ? $routesFile : $realpath; } } From 26c4035244377520dee19647f5f1646933206493 Mon Sep 17 00:00:00 2001 From: Paulo Esteves Date: Sat, 16 Sep 2023 12:28:04 +0100 Subject: [PATCH 100/209] refactor: Apply PHPStan rule to RouteCollection::loadRoutesOptions() --- system/Router/RouteCollection.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/system/Router/RouteCollection.php b/system/Router/RouteCollection.php index afdbe1611dea..b99ca145106e 100644 --- a/system/Router/RouteCollection.php +++ b/system/Router/RouteCollection.php @@ -1700,7 +1700,9 @@ public function resetRoutes() */ protected function loadRoutesOptions(?string $verb = null): array { - $verb = $verb ?: $this->getHTTPVerb(); + if (null === $verb || $verb === '') { + $verb = $this->getHTTPVerb(); + } $options = $this->routesOptions[$verb] ?? []; From 66c356a9dbb9aa6ccf7f3f75725b7f3c6bd40ccb Mon Sep 17 00:00:00 2001 From: Denny Septian Panggabean Date: Sat, 16 Sep 2023 18:58:48 +0700 Subject: [PATCH 101/209] docs: PHPStan Codeigniter no type specified --- phpstan-baseline.php | 70 ------------------------------------------ system/CodeIgniter.php | 26 ++++++++++++++++ 2 files changed, 26 insertions(+), 70 deletions(-) diff --git a/phpstan-baseline.php b/phpstan-baseline.php index 106de3723ef0..483911e92bfc 100644 --- a/phpstan-baseline.php +++ b/phpstan-baseline.php @@ -101,71 +101,6 @@ 'count' => 6, 'path' => __DIR__ . '/system/CodeIgniter.php', ]; -$ignoreErrors[] = [ - 'message' => '#^Method CodeIgniter\\\\CodeIgniter\\:\\:bootstrapEnvironment\\(\\) has no return type specified\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/CodeIgniter.php', -]; -$ignoreErrors[] = [ - 'message' => '#^Method CodeIgniter\\\\CodeIgniter\\:\\:callExit\\(\\) has no return type specified\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/CodeIgniter.php', -]; -$ignoreErrors[] = [ - 'message' => '#^Method CodeIgniter\\\\CodeIgniter\\:\\:detectEnvironment\\(\\) has no return type specified\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/CodeIgniter.php', -]; -$ignoreErrors[] = [ - 'message' => '#^Method CodeIgniter\\\\CodeIgniter\\:\\:forceSecureAccess\\(\\) has no return type specified\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/CodeIgniter.php', -]; -$ignoreErrors[] = [ - 'message' => '#^Method CodeIgniter\\\\CodeIgniter\\:\\:gatherOutput\\(\\) has no return type specified\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/CodeIgniter.php', -]; -$ignoreErrors[] = [ - 'message' => '#^Method CodeIgniter\\\\CodeIgniter\\:\\:getRequestObject\\(\\) has no return type specified\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/CodeIgniter.php', -]; -$ignoreErrors[] = [ - 'message' => '#^Method CodeIgniter\\\\CodeIgniter\\:\\:getResponseObject\\(\\) has no return type specified\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/CodeIgniter.php', -]; -$ignoreErrors[] = [ - 'message' => '#^Method CodeIgniter\\\\CodeIgniter\\:\\:initialize\\(\\) has no return type specified\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/CodeIgniter.php', -]; -$ignoreErrors[] = [ - 'message' => '#^Method CodeIgniter\\\\CodeIgniter\\:\\:initializeKint\\(\\) has no return type specified\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/CodeIgniter.php', -]; -$ignoreErrors[] = [ - 'message' => '#^Method CodeIgniter\\\\CodeIgniter\\:\\:resolvePlatformExtensions\\(\\) has no return type specified\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/CodeIgniter.php', -]; -$ignoreErrors[] = [ - 'message' => '#^Method CodeIgniter\\\\CodeIgniter\\:\\:spoofRequestMethod\\(\\) has no return type specified\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/CodeIgniter.php', -]; -$ignoreErrors[] = [ - 'message' => '#^Method CodeIgniter\\\\CodeIgniter\\:\\:startBenchmark\\(\\) has no return type specified\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/CodeIgniter.php', -]; -$ignoreErrors[] = [ - 'message' => '#^Method CodeIgniter\\\\CodeIgniter\\:\\:storePreviousURL\\(\\) has no return type specified\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/CodeIgniter.php', -]; $ignoreErrors[] = [ 'message' => '#^Property CodeIgniter\\\\CodeIgniter\\:\\:\\$controller type has no signature specified for Closure\\.$#', 'count' => 1, @@ -2996,11 +2931,6 @@ 'count' => 2, 'path' => __DIR__ . '/system/Test/Mock/MockCache.php', ]; -$ignoreErrors[] = [ - 'message' => '#^Method CodeIgniter\\\\Test\\\\Mock\\\\MockCodeIgniter\\:\\:callExit\\(\\) has no return type specified\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/Test/Mock/MockCodeIgniter.php', -]; $ignoreErrors[] = [ 'message' => '#^Cannot access property \\$insert_id on object\\|resource\\|false\\.$#', 'count' => 1, diff --git a/system/CodeIgniter.php b/system/CodeIgniter.php index e017d6b9ccc2..4bde1c042b6d 100644 --- a/system/CodeIgniter.php +++ b/system/CodeIgniter.php @@ -198,6 +198,8 @@ public function __construct(App $config) /** * Handles some basic app and environment setup. + * + * @return void */ public function initialize() { @@ -224,6 +226,8 @@ public function initialize() /** * Checks system for missing required PHP extensions. * + * @return void + * * @throws FrameworkException * * @codeCoverageIgnore @@ -251,6 +255,8 @@ protected function resolvePlatformExtensions() /** * Initializes Kint + * + * @return void */ protected function initializeKint() { @@ -564,6 +570,8 @@ protected function handleRequest(?RouteCollectionInterface $routes, Cache $cache * * @codeCoverageIgnore * + * @return void + * * @deprecated 4.4.0 No longer used. Moved to index.php and spark. */ protected function detectEnvironment() @@ -579,6 +587,8 @@ protected function detectEnvironment() * * If no boot file exists, we shouldn't continue because something * is wrong. At the very least, they should have error reporting setup. + * + * @return void */ protected function bootstrapEnvironment() { @@ -599,6 +609,8 @@ protected function bootstrapEnvironment() * * The timer is used to display total script execution both in the * debug toolbar, and potentially on the displayed page. + * + * @return void */ protected function startBenchmark() { @@ -628,6 +640,8 @@ public function setRequest($request) /** * Get our Request object, (either IncomingRequest or CLIRequest). + * + * @return void */ protected function getRequestObject() { @@ -647,6 +661,8 @@ protected function getRequestObject() /** * Get our Response object, and set some default values, including * the HTTP protocol version and a default successful response. + * + * @return void */ protected function getResponseObject() { @@ -669,6 +685,8 @@ protected function getResponseObject() * * @param int $duration How long the Strict Transport Security * should be enforced for this URL. + * + * @return void */ protected function forceSecureAccess($duration = 31_536_000) { @@ -978,6 +996,8 @@ protected function display404errors(PageNotFoundException $e) * @param ResponseInterface|string|null $returned * * @deprecated $cacheConfig is deprecated. + * + * @return void */ protected function gatherOutput(?Cache $cacheConfig = null, $returned = null) { @@ -1014,6 +1034,8 @@ protected function gatherOutput(?Cache $cacheConfig = null, $returned = null) * This helps provider safer, more reliable previous_url() detection. * * @param string|URI $uri + * + * @return void */ public function storePreviousURL($uri) { @@ -1055,6 +1077,8 @@ public function storePreviousURL($uri) /** * Modifies the Request Object to use a different method if a POST * variable called _method is found. + * + * @return void */ public function spoofRequestMethod() { @@ -1096,6 +1120,8 @@ protected function sendResponse() * @param int $code * * @deprecated 4.4.0 No longer Used. Moved to index.php. + * + * @return void */ protected function callExit($code) { From d736bcff1ad528e5c5cbc34927fb1574e0cfd73c Mon Sep 17 00:00:00 2001 From: Paulo Esteves Date: Sat, 16 Sep 2023 12:45:09 +0100 Subject: [PATCH 102/209] remove exception line from phpstan-baseline for RouteCollection --- phpstan-baseline.php | 5 ----- system/Router/RouteCollection.php | 4 +--- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/phpstan-baseline.php b/phpstan-baseline.php index 106de3723ef0..fc2f43d3005f 100644 --- a/phpstan-baseline.php +++ b/phpstan-baseline.php @@ -2316,11 +2316,6 @@ 'count' => 1, 'path' => __DIR__ . '/system/Router/RouteCollection.php', ]; -$ignoreErrors[] = [ - 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', - 'count' => 2, - 'path' => __DIR__ . '/system/Router/RouteCollection.php', -]; $ignoreErrors[] = [ 'message' => '#^Method CodeIgniter\\\\Router\\\\RouteCollectionInterface\\:\\:add\\(\\) has parameter \\$to with no signature specified for Closure\\.$#', 'count' => 1, diff --git a/system/Router/RouteCollection.php b/system/Router/RouteCollection.php index b99ca145106e..8a23264058cb 100644 --- a/system/Router/RouteCollection.php +++ b/system/Router/RouteCollection.php @@ -1700,9 +1700,7 @@ public function resetRoutes() */ protected function loadRoutesOptions(?string $verb = null): array { - if (null === $verb || $verb === '') { - $verb = $this->getHTTPVerb(); - } + $verb ??= $this->getHTTPVerb(); $options = $this->routesOptions[$verb] ?? []; From f188a750dda0c2458592f9e7f7543c58acdfa2b5 Mon Sep 17 00:00:00 2001 From: totoprayogo1916 Date: Tue, 19 Sep 2023 08:13:12 +0700 Subject: [PATCH 103/209] update GA label --- .github/workflows/label-add-conflict.yml | 53 +++++++++++++++++++++ .github/workflows/label-conflict.yml | 33 ------------- .github/workflows/label-remove-conflict.yml | 36 ++++++++++++++ 3 files changed, 89 insertions(+), 33 deletions(-) create mode 100644 .github/workflows/label-add-conflict.yml delete mode 100644 .github/workflows/label-conflict.yml create mode 100644 .github/workflows/label-remove-conflict.yml diff --git a/.github/workflows/label-add-conflict.yml b/.github/workflows/label-add-conflict.yml new file mode 100644 index 000000000000..43c291b4e889 --- /dev/null +++ b/.github/workflows/label-add-conflict.yml @@ -0,0 +1,53 @@ +name: Auto Add Label "stale" & Comment Conflicts + +on: + push: + branches: + - develop + - '4.*' + pull_request: + branches: + - develop + - '4.*' + +jobs: + auto-label-comment-conflict: + + permissions: + contents: read + pull-requests: write + + runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Get PR List + id: PR-list + run: echo "pr_list=$(gh pr list -L 100 --json mergeable,url,labels,author)" >> $GITHUB_OUTPUT + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: 'Add label "stale" and comment' + env: + PR_LIST: ${{ steps.PR-list.outputs.pr_list }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + + IFS=$'\n' # Set Internal Field Separator to newline to handle array elements + + # Iterate through the PRs in PR_LIST + for pr in $(echo "$PR_LIST" | jq -c '.[]'); do + mergeable=$(echo "$pr" | jq -r '.mergeable') + author=$(echo "$pr" | jq -r '.author.login') + labels=$(echo "$pr" | jq -c '.labels[].name' | tr -d '[]"') + url=$(echo "$pr" | jq -r '.url') + + if [ "$mergeable" != "MERGEABLE" ] && [[ ! "$labels" == *"stale"* ]]; then + # Add "stale" label + gh pr edit $url --add-label "stale" + + # Add a comment + gh pr comment $url --body ":wave: Hi, @$author!

We detected conflicts in your PR against the base branch :speak_no_evil:
You may want to sync :arrows_counterclockwise: your branch with upstream!

Ref: [Syncing Your Branch](https://github.com/codeigniter4/CodeIgniter4/blob/develop/contributing/workflow.md#pushing-your-branch)" + fi + done diff --git a/.github/workflows/label-conflict.yml b/.github/workflows/label-conflict.yml deleted file mode 100644 index 363cb967d274..000000000000 --- a/.github/workflows/label-conflict.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: Auto Comment Conflicts -on: - pull_request: - branches: - - 'develop' - - '4.*' - types: - - labeled - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - -jobs: - auto-comment-conflict: - permissions: - contents: read - pull-requests: write - if: github.event.label.name == 'stale' - runs-on: ubuntu-latest - steps: - - name: Add comment for PR with conflict - uses: peter-evans/create-or-update-comment@v3 - with: - token: ${{ secrets.GITHUB_TOKEN }} - issue-number: ${{ github.event.pull_request.number }} - body: | - :wave: Hi, @${{ github.event.pull_request.user.login }}! - - We detected conflicts in your PR against the base branch :speak_no_evil: - You may want to sync :arrows_counterclockwise: your branch with upstream! - - Ref: https://github.com/codeigniter4/CodeIgniter4/blob/develop/contributing/workflow.md#pushing-your-branch diff --git a/.github/workflows/label-remove-conflict.yml b/.github/workflows/label-remove-conflict.yml new file mode 100644 index 000000000000..d1b6c665322d --- /dev/null +++ b/.github/workflows/label-remove-conflict.yml @@ -0,0 +1,36 @@ +name: Auto Remove "stale" label + +on: + pull_request: + branches: + - develop + - '4.*' + +jobs: + check-conflict: + runs-on: ubuntu-22.04 + permissions: + contents: read + pull-requests: write + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Get PR Detail + id: PR-detail + run: echo "detail=$(gh pr view $PR_URL --json mergeable,url,labels,author)" >> $GITHUB_OUTPUT + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_URL: ${{ github.event.pull_request.html_url }} + + - name: 'Remove label "stale"' + env: + PR_DETAIL: ${{ steps.PR-detail.outputs.detail }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_URL: ${{ github.event.pull_request.html_url }} + run: | + if [ "$(echo $PR_DETAIL | jq -r '.mergeable')" == "MERGEABLE" ] && \ + [ "$(echo $PR_DETAIL | jq -r '.labels[] | select(.name == "stale")')" != "" ]; then + gh pr edit $PR_URL --remove-label "stale" + fi From 188b1857f11fefb43b196ae010812ae2ec0abd5b Mon Sep 17 00:00:00 2001 From: Denny Septian Panggabean Date: Tue, 19 Sep 2023 11:34:15 +0700 Subject: [PATCH 104/209] run cs-fix after rules shorthand operator --- system/BaseModel.php | 6 +++--- system/CLI/CLI.php | 4 ++-- system/Format/JSONFormatter.php | 2 +- system/Images/Handlers/GDHandler.php | 4 ++-- system/Images/Handlers/ImageMagickHandler.php | 4 ++-- system/Throttle/Throttler.php | 2 +- tests/_support/View/Cells/MultiplierCell.php | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/system/BaseModel.php b/system/BaseModel.php index 43dcf1c5abe4..0cf63ac9f3ec 100644 --- a/system/BaseModel.php +++ b/system/BaseModel.php @@ -1439,8 +1439,8 @@ public function setValidationRule(string $field, $fieldRules) if (is_string($rules)) { [$rules, $customErrors] = $this->validation->loadRuleGroup($rules); - $this->validationRules = $rules; - $this->validationMessages = $this->validationMessages + $customErrors; + $this->validationRules = $rules; + $this->validationMessages += $customErrors; } $this->validationRules[$field] = $fieldRules; @@ -1510,7 +1510,7 @@ public function getValidationRules(array $options = []): array if (is_string($rules)) { [$rules, $customErrors] = $this->validation->loadRuleGroup($rules); - $this->validationMessages = $this->validationMessages + $customErrors; + $this->validationMessages += $customErrors; } if (isset($options['except'])) { diff --git a/system/CLI/CLI.php b/system/CLI/CLI.php index 7e0376e6b6f1..29f424d1ec53 100644 --- a/system/CLI/CLI.php +++ b/system/CLI/CLI.php @@ -851,7 +851,7 @@ public static function wrap(?string $string = null, int $max = 0, int $padLeft = $max = self::getWidth(); } - $max = $max - $padLeft; + $max -= $padLeft; $lines = wordwrap($string, $max, PHP_EOL); @@ -1079,7 +1079,7 @@ public static function table(array $tbody, array $thead = []) $diff = $maxColsLengths[$column] - static::strlen($col); if ($diff) { - $tableRows[$row][$column] = $tableRows[$row][$column] . str_repeat(' ', $diff); + $tableRows[$row][$column] .= str_repeat(' ', $diff); } $column++; diff --git a/system/Format/JSONFormatter.php b/system/Format/JSONFormatter.php index 146fd5330aa6..3e708e9fa6b7 100644 --- a/system/Format/JSONFormatter.php +++ b/system/Format/JSONFormatter.php @@ -33,7 +33,7 @@ public function format($data) $config = new Format(); $options = $config->formatterOptions['application/json'] ?? JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES; - $options = $options | JSON_PARTIAL_OUTPUT_ON_ERROR; + $options |= JSON_PARTIAL_OUTPUT_ON_ERROR; $options = ENVIRONMENT === 'production' ? $options : $options | JSON_PRETTY_PRINT; diff --git a/system/Images/Handlers/GDHandler.php b/system/Images/Handlers/GDHandler.php index 99403a164137..15bb97b6b839 100644 --- a/system/Images/Handlers/GDHandler.php +++ b/system/Images/Handlers/GDHandler.php @@ -381,11 +381,11 @@ protected function _text(string $text, array $options = []) // offset flips itself automatically if ($options['vAlign'] === 'bottom') { - $options['vOffset'] = $options['vOffset'] * -1; + $options['vOffset'] *= -1; } if ($options['hAlign'] === 'right') { - $options['hOffset'] = $options['hOffset'] * -1; + $options['hOffset'] *= -1; } // Set font width and height diff --git a/system/Images/Handlers/ImageMagickHandler.php b/system/Images/Handlers/ImageMagickHandler.php index 3d7eea0504e6..857a273d5372 100644 --- a/system/Images/Handlers/ImageMagickHandler.php +++ b/system/Images/Handlers/ImageMagickHandler.php @@ -340,11 +340,11 @@ protected function _text(string $text, array $options = []) // invert the offset. Note: The horizontal // offset flips itself automatically if ($options['vAlign'] === 'bottom') { - $options['vOffset'] = $options['vOffset'] * -1; + $options['vOffset'] *= -1; } if ($options['hAlign'] === 'right') { - $options['hOffset'] = $options['hOffset'] * -1; + $options['hOffset'] *= -1; } // Font diff --git a/system/Throttle/Throttler.php b/system/Throttle/Throttler.php index dc0844fa4cb8..0a10c02335f2 100644 --- a/system/Throttle/Throttler.php +++ b/system/Throttle/Throttler.php @@ -127,7 +127,7 @@ public function check(string $key, int $capacity, int $seconds, int $cost = 1): // If $tokens >= 1, then we are safe to perform the action, but // we need to decrement the number of available tokens. if ($tokens >= 1) { - $tokens = $tokens - $cost; + $tokens -= $cost; $this->cache->save($tokenName, $tokens, $seconds); $this->cache->save($tokenName . 'Time', $this->time(), $seconds); diff --git a/tests/_support/View/Cells/MultiplierCell.php b/tests/_support/View/Cells/MultiplierCell.php index 59bf7d3d96c5..81f6b4908e7a 100644 --- a/tests/_support/View/Cells/MultiplierCell.php +++ b/tests/_support/View/Cells/MultiplierCell.php @@ -20,6 +20,6 @@ class MultiplierCell extends Cell public function mount(): void { - $this->value = $this->value * $this->multiplier; + $this->value *= $this->multiplier; } } From 01ba3092dbe5c1b23b1328dd953c467be96d801f Mon Sep 17 00:00:00 2001 From: kenjis Date: Wed, 20 Sep 2023 14:05:47 +0900 Subject: [PATCH 105/209] Revert "GitHub Actions to add/remove label "stale" and comment" --- .github/workflows/label-add-conflict.yml | 53 --------------------- .github/workflows/label-conflict.yml | 33 +++++++++++++ .github/workflows/label-remove-conflict.yml | 36 -------------- 3 files changed, 33 insertions(+), 89 deletions(-) delete mode 100644 .github/workflows/label-add-conflict.yml create mode 100644 .github/workflows/label-conflict.yml delete mode 100644 .github/workflows/label-remove-conflict.yml diff --git a/.github/workflows/label-add-conflict.yml b/.github/workflows/label-add-conflict.yml deleted file mode 100644 index 43c291b4e889..000000000000 --- a/.github/workflows/label-add-conflict.yml +++ /dev/null @@ -1,53 +0,0 @@ -name: Auto Add Label "stale" & Comment Conflicts - -on: - push: - branches: - - develop - - '4.*' - pull_request: - branches: - - develop - - '4.*' - -jobs: - auto-label-comment-conflict: - - permissions: - contents: read - pull-requests: write - - runs-on: ubuntu-22.04 - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Get PR List - id: PR-list - run: echo "pr_list=$(gh pr list -L 100 --json mergeable,url,labels,author)" >> $GITHUB_OUTPUT - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: 'Add label "stale" and comment' - env: - PR_LIST: ${{ steps.PR-list.outputs.pr_list }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - - IFS=$'\n' # Set Internal Field Separator to newline to handle array elements - - # Iterate through the PRs in PR_LIST - for pr in $(echo "$PR_LIST" | jq -c '.[]'); do - mergeable=$(echo "$pr" | jq -r '.mergeable') - author=$(echo "$pr" | jq -r '.author.login') - labels=$(echo "$pr" | jq -c '.labels[].name' | tr -d '[]"') - url=$(echo "$pr" | jq -r '.url') - - if [ "$mergeable" != "MERGEABLE" ] && [[ ! "$labels" == *"stale"* ]]; then - # Add "stale" label - gh pr edit $url --add-label "stale" - - # Add a comment - gh pr comment $url --body ":wave: Hi, @$author!

We detected conflicts in your PR against the base branch :speak_no_evil:
You may want to sync :arrows_counterclockwise: your branch with upstream!

Ref: [Syncing Your Branch](https://github.com/codeigniter4/CodeIgniter4/blob/develop/contributing/workflow.md#pushing-your-branch)" - fi - done diff --git a/.github/workflows/label-conflict.yml b/.github/workflows/label-conflict.yml new file mode 100644 index 000000000000..363cb967d274 --- /dev/null +++ b/.github/workflows/label-conflict.yml @@ -0,0 +1,33 @@ +name: Auto Comment Conflicts +on: + pull_request: + branches: + - 'develop' + - '4.*' + types: + - labeled + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + auto-comment-conflict: + permissions: + contents: read + pull-requests: write + if: github.event.label.name == 'stale' + runs-on: ubuntu-latest + steps: + - name: Add comment for PR with conflict + uses: peter-evans/create-or-update-comment@v3 + with: + token: ${{ secrets.GITHUB_TOKEN }} + issue-number: ${{ github.event.pull_request.number }} + body: | + :wave: Hi, @${{ github.event.pull_request.user.login }}! + + We detected conflicts in your PR against the base branch :speak_no_evil: + You may want to sync :arrows_counterclockwise: your branch with upstream! + + Ref: https://github.com/codeigniter4/CodeIgniter4/blob/develop/contributing/workflow.md#pushing-your-branch diff --git a/.github/workflows/label-remove-conflict.yml b/.github/workflows/label-remove-conflict.yml deleted file mode 100644 index d1b6c665322d..000000000000 --- a/.github/workflows/label-remove-conflict.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: Auto Remove "stale" label - -on: - pull_request: - branches: - - develop - - '4.*' - -jobs: - check-conflict: - runs-on: ubuntu-22.04 - permissions: - contents: read - pull-requests: write - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Get PR Detail - id: PR-detail - run: echo "detail=$(gh pr view $PR_URL --json mergeable,url,labels,author)" >> $GITHUB_OUTPUT - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - PR_URL: ${{ github.event.pull_request.html_url }} - - - name: 'Remove label "stale"' - env: - PR_DETAIL: ${{ steps.PR-detail.outputs.detail }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - PR_URL: ${{ github.event.pull_request.html_url }} - run: | - if [ "$(echo $PR_DETAIL | jq -r '.mergeable')" == "MERGEABLE" ] && \ - [ "$(echo $PR_DETAIL | jq -r '.labels[] | select(.name == "stale")')" != "" ]; then - gh pr edit $PR_URL --remove-label "stale" - fi From 4ee20ad02f316efab869361bf3fec818bc5565f4 Mon Sep 17 00:00:00 2001 From: kenjis Date: Thu, 21 Sep 2023 06:13:06 +0900 Subject: [PATCH 106/209] chore: add hack to autoload.psr-4 --- .github/workflows/reusable-coveralls.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/reusable-coveralls.yml b/.github/workflows/reusable-coveralls.yml index f545d79bb5ec..a5dfc83996cb 100644 --- a/.github/workflows/reusable-coveralls.yml +++ b/.github/workflows/reusable-coveralls.yml @@ -57,7 +57,10 @@ jobs: run: composer update --ansi - name: Merge coverage files - run: vendor/bin/phpcov merge --clover build/logs/clover.xml build/cov + run: | + jq '.autoload."psr-4" += {"Config\\": "app/Config/"}' composer.json > temp.json && mv temp.json composer.json + composer dump-autoload + vendor/bin/phpcov merge --clover build/logs/clover.xml build/cov - name: Upload coverage to Coveralls run: vendor/bin/php-coveralls --verbose --exclude-no-stmt --ansi From 34f1bfdaf3753c5bc2969bfe0ee9b96fb546925d Mon Sep 17 00:00:00 2001 From: totoprayogo1916 Date: Thu, 21 Sep 2023 08:43:06 +0700 Subject: [PATCH 107/209] add or remove 'stale' label --- .github/workflows/label-add-conflict.yml | 54 +++++++++++++++++++++ .github/workflows/label-conflict.yml | 33 ------------- .github/workflows/label-remove-conflict.yml | 39 +++++++++++++++ 3 files changed, 93 insertions(+), 33 deletions(-) create mode 100644 .github/workflows/label-add-conflict.yml delete mode 100644 .github/workflows/label-conflict.yml create mode 100644 .github/workflows/label-remove-conflict.yml diff --git a/.github/workflows/label-add-conflict.yml b/.github/workflows/label-add-conflict.yml new file mode 100644 index 000000000000..9cd02ca1e658 --- /dev/null +++ b/.github/workflows/label-add-conflict.yml @@ -0,0 +1,54 @@ +name: Auto Add Label "stale" & Comment Conflicts + +on: + push: + branches: + - develop + - '4.*' + pull_request: + branches: + - develop + - '4.*' + +jobs: + auto-label-comment-conflict: + + permissions: + contents: read + pull-requests: write + + runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Get PR List + id: PR-list + run: echo "pr_list=$(gh pr list -L 100 --json mergeable,url,labels,author)" >> $GITHUB_OUTPUT + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: 'Add label "stale" and comment' + env: + PR_LIST: ${{ steps.PR-list.outputs.pr_list }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + + IFS=$'\n' # Set Internal Field Separator to newline to handle array elements + + # Iterate through the PRs in PR_LIST + for pr in $(echo "$PR_LIST" | jq -c '.[]'); do + mergeable=$(echo "$pr" | jq -r '.mergeable') + author=$(echo "$pr" | jq -r '.author.login') + labels=$(echo "$pr" | jq -c '.labels[].name' | tr -d '[]"') + url=$(echo "$pr" | jq -r '.url') + + # CONFLICTING and no 'stale' label + if [ "$mergeable" == "CONFLICTING" ] && [[ ! "$labels" == *"stale"* ]]; then + # Add "stale" label + gh pr edit $url --add-label "stale" + + # Add a comment + gh pr comment $url --body ":wave: Hi, @$author!

We detected conflicts in your PR against the base branch :speak_no_evil:
You may want to sync :arrows_counterclockwise: your branch with upstream!

Ref: [Syncing Your Branch](https://github.com/codeigniter4/CodeIgniter4/blob/develop/contributing/workflow.md#pushing-your-branch)" + fi + done diff --git a/.github/workflows/label-conflict.yml b/.github/workflows/label-conflict.yml deleted file mode 100644 index 363cb967d274..000000000000 --- a/.github/workflows/label-conflict.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: Auto Comment Conflicts -on: - pull_request: - branches: - - 'develop' - - '4.*' - types: - - labeled - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - -jobs: - auto-comment-conflict: - permissions: - contents: read - pull-requests: write - if: github.event.label.name == 'stale' - runs-on: ubuntu-latest - steps: - - name: Add comment for PR with conflict - uses: peter-evans/create-or-update-comment@v3 - with: - token: ${{ secrets.GITHUB_TOKEN }} - issue-number: ${{ github.event.pull_request.number }} - body: | - :wave: Hi, @${{ github.event.pull_request.user.login }}! - - We detected conflicts in your PR against the base branch :speak_no_evil: - You may want to sync :arrows_counterclockwise: your branch with upstream! - - Ref: https://github.com/codeigniter4/CodeIgniter4/blob/develop/contributing/workflow.md#pushing-your-branch diff --git a/.github/workflows/label-remove-conflict.yml b/.github/workflows/label-remove-conflict.yml new file mode 100644 index 000000000000..3d40b537ae59 --- /dev/null +++ b/.github/workflows/label-remove-conflict.yml @@ -0,0 +1,39 @@ +name: Auto Remove "stale" label + +on: + pull_request: + branches: + - develop + - '4.*' + +jobs: + check-conflict: + runs-on: ubuntu-22.04 + permissions: + contents: read + pull-requests: write + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Get PR Detail + id: PR-detail + run: echo "detail=$(gh pr view $PR_URL --json mergeable,url,labels,author)" >> $GITHUB_OUTPUT + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_URL: ${{ github.event.pull_request.html_url }} + + - name: 'Remove label "stale"' + env: + PR_DETAIL: ${{ steps.PR-detail.outputs.detail }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_URL: ${{ github.event.pull_request.html_url }} + run: | + + # MERGEABLE with 'stale' label + if [ "$(echo $PR_DETAIL | jq -r '.mergeable')" == "MERGEABLE" ] && \ + [ "$(echo $PR_DETAIL | jq -r '.labels[] | select(.name == "stale")')" != "" ]; then + # remove 'stale' label + gh pr edit $PR_URL --remove-label "stale" + fi From 7f6dd21399aa788695b117398313b69b1490dc73 Mon Sep 17 00:00:00 2001 From: totoprayogo1916 Date: Thu, 21 Sep 2023 10:25:22 +0700 Subject: [PATCH 108/209] Separate workflow --- ...lict.yml => label-add-conflict-all-pr.yml} | 6 +- .../label-add-remove-conflict-single-pr.yml | 56 +++++++++++++++++++ .github/workflows/label-remove-conflict.yml | 39 ------------- 3 files changed, 57 insertions(+), 44 deletions(-) rename .github/workflows/{label-add-conflict.yml => label-add-conflict-all-pr.yml} (94%) create mode 100644 .github/workflows/label-add-remove-conflict-single-pr.yml delete mode 100644 .github/workflows/label-remove-conflict.yml diff --git a/.github/workflows/label-add-conflict.yml b/.github/workflows/label-add-conflict-all-pr.yml similarity index 94% rename from .github/workflows/label-add-conflict.yml rename to .github/workflows/label-add-conflict-all-pr.yml index 9cd02ca1e658..36d21ff5be72 100644 --- a/.github/workflows/label-add-conflict.yml +++ b/.github/workflows/label-add-conflict-all-pr.yml @@ -1,14 +1,10 @@ -name: Auto Add Label "stale" & Comment Conflicts +name: Auto Add Label "stale" & Comment Conflicts for All PR on: push: branches: - develop - '4.*' - pull_request: - branches: - - develop - - '4.*' jobs: auto-label-comment-conflict: diff --git a/.github/workflows/label-add-remove-conflict-single-pr.yml b/.github/workflows/label-add-remove-conflict-single-pr.yml new file mode 100644 index 000000000000..5d2631bb30e6 --- /dev/null +++ b/.github/workflows/label-add-remove-conflict-single-pr.yml @@ -0,0 +1,56 @@ +name: Auto Add/Remove "stale" label in single PR + +on: + pull_request: + branches: + - develop + - '4.*' + +jobs: + check-conflict: + runs-on: ubuntu-22.04 + permissions: + contents: read + pull-requests: write + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Get PR Detail + id: PR-detail + run: echo "detail=$(gh pr view $PR_URL --json mergeable,url,labels)" >> $GITHUB_OUTPUT + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_URL: ${{ github.event.pull_request.html_url }} + + - name: 'Remove label "stale"' + env: + PR_DETAIL: ${{ steps.PR-detail.outputs.detail }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_URL: ${{ github.event.pull_request.html_url }} + run: | + + # MERGEABLE with 'stale' label + if [ "$(echo $PR_DETAIL | jq -r '.mergeable')" == "MERGEABLE" ] && \ + [ "$(echo $PR_DETAIL | jq -r '.labels[] | select(.name == "stale")')" != "" ]; then + # remove 'stale' label + gh pr edit $PR_URL --remove-label "stale" + fi + + - name: 'Check for conflicts and add label/comment' + env: + PR_DETAIL: ${{ steps.PR-detail.outputs.detail }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_URL: ${{ github.event.pull_request.html_url }} + AUTHOR: ${{ github.event.pull_request.user.login }} + run: | + + # CONFLICTING with no "stale" label, + if [ "$(echo $PR_DETAIL | jq -r '.mergeable')" == "CONFLICTING" ] && \ + [ "$(echo $PR_DETAIL | jq -r '.labels[] | select(.name == "stale")')" == "" ]; then + # add label + gh pr edit $PR_URL --add-label "stale" + # add comment + gh pr comment $PR_URL --body ":wave: Hi, @$AUTHOR!

We detected conflicts in your PR against the base branch :speak_no_evil:
You may want to sync :arrows_counterclockwise: your branch with upstream!

Ref: [Syncing Your Branch](https://github.com/codeigniter4/CodeIgniter4/blob/develop/contributing/workflow.md#pushing-your-branch)" + fi diff --git a/.github/workflows/label-remove-conflict.yml b/.github/workflows/label-remove-conflict.yml deleted file mode 100644 index 3d40b537ae59..000000000000 --- a/.github/workflows/label-remove-conflict.yml +++ /dev/null @@ -1,39 +0,0 @@ -name: Auto Remove "stale" label - -on: - pull_request: - branches: - - develop - - '4.*' - -jobs: - check-conflict: - runs-on: ubuntu-22.04 - permissions: - contents: read - pull-requests: write - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Get PR Detail - id: PR-detail - run: echo "detail=$(gh pr view $PR_URL --json mergeable,url,labels,author)" >> $GITHUB_OUTPUT - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - PR_URL: ${{ github.event.pull_request.html_url }} - - - name: 'Remove label "stale"' - env: - PR_DETAIL: ${{ steps.PR-detail.outputs.detail }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - PR_URL: ${{ github.event.pull_request.html_url }} - run: | - - # MERGEABLE with 'stale' label - if [ "$(echo $PR_DETAIL | jq -r '.mergeable')" == "MERGEABLE" ] && \ - [ "$(echo $PR_DETAIL | jq -r '.labels[] | select(.name == "stale")')" != "" ]; then - # remove 'stale' label - gh pr edit $PR_URL --remove-label "stale" - fi From 58acfec09a8f1c039ee55a3fdeb8b18e9bf7a06c Mon Sep 17 00:00:00 2001 From: Toto Date: Thu, 21 Sep 2023 12:06:09 +0700 Subject: [PATCH 109/209] Apply suggestions from code review by @kenjis Co-authored-by: kenjis --- .github/workflows/label-add-conflict-all-pr.yml | 5 +++-- .github/workflows/label-add-remove-conflict-single-pr.yml | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/label-add-conflict-all-pr.yml b/.github/workflows/label-add-conflict-all-pr.yml index 36d21ff5be72..5147d678f86c 100644 --- a/.github/workflows/label-add-conflict-all-pr.yml +++ b/.github/workflows/label-add-conflict-all-pr.yml @@ -1,4 +1,4 @@ -name: Auto Add Label "stale" & Comment Conflicts for All PR +name: Auto Label "stale" for All PRs on: push: @@ -7,7 +7,8 @@ on: - '4.*' jobs: - auto-label-comment-conflict: + build: + name: Check Conflicts permissions: contents: read diff --git a/.github/workflows/label-add-remove-conflict-single-pr.yml b/.github/workflows/label-add-remove-conflict-single-pr.yml index 5d2631bb30e6..8565c8975cca 100644 --- a/.github/workflows/label-add-remove-conflict-single-pr.yml +++ b/.github/workflows/label-add-remove-conflict-single-pr.yml @@ -1,4 +1,4 @@ -name: Auto Add/Remove "stale" label in single PR +name: Auto Label "stale" on: pull_request: @@ -7,7 +7,8 @@ on: - '4.*' jobs: - check-conflict: + build: + name: Check Conflicts runs-on: ubuntu-22.04 permissions: contents: read From 7948535e592e57d412a24aa6955338cf84eb2093 Mon Sep 17 00:00:00 2001 From: Samuel Asor <8720569+sammyskills@users.noreply.github.com> Date: Thu, 21 Sep 2023 22:22:49 +0100 Subject: [PATCH 110/209] fixed installation docs console typo --- user_guide_src/source/installation/installing_composer.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/installation/installing_composer.rst b/user_guide_src/source/installation/installing_composer.rst index 9af6a0f0fa71..d1b4cebf33a7 100644 --- a/user_guide_src/source/installation/installing_composer.rst +++ b/user_guide_src/source/installation/installing_composer.rst @@ -208,7 +208,7 @@ See :ref:`initial-configuration` for the details. Upgrading --------- -Whenever there is a new release, then from the command line in your project root:: +Whenever there is a new release, then from the command line in your project root: .. code-block:: console From dd2a4b1023ce52af0645dc448b5ff065506b381b Mon Sep 17 00:00:00 2001 From: Samuel Asor <8720569+sammyskills@users.noreply.github.com> Date: Thu, 21 Sep 2023 22:23:54 +0100 Subject: [PATCH 111/209] updated debugbar image to use CodeIgniter 4.4.1 --- user_guide_src/source/images/debugbar.png | Bin 81068 -> 28329 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/user_guide_src/source/images/debugbar.png b/user_guide_src/source/images/debugbar.png index aa32df81ac3d880cbdd16724cbb0be16e3481cfe..b2955d94902db50e7a31e3f27a48646b3c1b4dfb 100644 GIT binary patch literal 28329 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%0AC|OiCQw>-TI4w^)G!9F9Q9(XF0l5 zm2qFVpp&9F?_<1P0Vgo&R(H^PZV}UQAvHyXp^Fq)uw(s!>g>+O3k*)iEvB-*tYwjmFa-V*rcn2ir5C@|j8C zk$Ctkn@>CqKB%edt4y>MvpC|7ENWf4upM(O!ePQ12BNl0(wmm1|te6 zIT@bt@$2!*51zilA9f-M&OVgpj)m}<^+p7EK0b3Ja}X>}2Ul4p4?!Urb>=q8)RKY} z0QuoS;D?8(uW|HRp;z;ayXk>Cqhl=CSGK}6cnnhoVuPa=eLoB=36k>_U+jLpzgJ=e z3l^MXp$f{G3h2LE{qFnT;wcu@lNeLFw?6V&`7msWoMZpBb;D{`&Q+uvt6unqZ$0HQ!!s#qpaSH%LSS8 zK17_U)aYncKSwk6A6A;Hw2LtS*NRrWy1U^5!l^}5#R8_7hlcxQK^k^@lVZk^N%Nk_ z3#)>udQ@I%dYx~PZ{@rr1@&|hh+SO-MSVM$Q1!@SysI1JL{<;KM001dm|#=qBwwzq z?c2nVnqe51=jFnQXo!K8r7Jr(3&2Q-1+Q;CyYA z_rp^%8DgsH@gXgW*GkJ$l8Q37^rvSU3qbV?)>QqWj^)*z`cHCQ`#4=*RqdeA7r10^ zALi`Lm47V3i(^G1PZ&L~w-fZxF|=jk>5F3950uSRZ{~?2qYC*0iCzpb0lC-ZQRf@4)CTFsJb2!On{RrD)7Z z?-wO7XgB=AOsgh|yXa_nxLkTTCZi}6dHa6+B5h9n2vMFu`;oTj7b=47#Pf*7wqLo2 zFM}?_+ahGsNYqN*q`nKyHeZ7*F_BK9?syH{txV0=AIlx{b`XGnp!bgO1P+)jXys-G zp30?WOKV8Wi59VMG=G>ks9hPjA!fFxm@3swv79O@xJGTY%4wa`8rFF*m*7W^m0Ke| zF>rPH%6q2P(fUvNQ%9m5=AG7^mC(|z+ww_CDYCA`jH@fFejh;amObW)qy5N6H26VN zjm;d!q}SHfcHbuDasK8YjdUDZ$@_1I=kr?K>s@1SN_=Zu&Q&|~E$w4E-|_(EH9E{V zQ6HN4$=WbVuXw+?9z|yb3#X3}tfogIG7DObRx+hjc7P#eQe#JZ#svDPn4tZymee^B!kyQmxJo1;QjN(3gebiQKrqoho@U)R)WAG<(6X7 zqsC>7QzBIW905mG_xJ4#=I$V#Kw(dGvw3Tp*JK}Ggr$(-J8@nIY_5kBJR zuM3S%U^p=D^{=>s^ znnGth|5{K&fx4?^s=WYh23Qc<=Y~;VLqamFSt;~VB0#V1u7k#7IZs&$XFE=8zM)ie zf@%-D0Ne9Mj%0pxEKIaZaLhcsmTd6tUe$w|$#PLCEE+n|n}dsq0tI@Lx@4;Gz+uXu zhf0v4!Sz>vC9&JN9|?n((o~?Jy5tJ0sq6cJy%#`kA!+ADL3sQ$0X~z~P^Gh$?y=~G z$>ytogb7j8e#+GBMm~3(o$bZzRPtV|j723kYiF=s{8{<&DwqwuEFGxlv1nei5!5dT zb7v;`v_0Brd3Sr$r>R2s(E6#tj;tN5Rr0(1%}}?8Th!H+3%9eH-Y~B1xOh@tgM>Zo z`AYV8;L>xO{kW|%O|QAPO=vP|O7gIoHiRl^xxh?2vVY~(Q-|UN+ga`$u42y&(GG-s z8cPzxwJ?J!#rPM|{-DA>Wex`@NwsX(OXg9g;LJdtamS6OzGr`Jn$=f6<_1NiGFTgw zvaC?PF0U7&T?0ZS(bCT-EtbWOY)P{yf#7MWJbVd%efDUhNQHJIJ07b4{RK0P%Fk>{u;+Gcb!iSZbAc z%D`pEYI{MZCubdq~X!km;dZ*{Q4BzUSk7~&2&#gr7CC7Lj$KGn=~-c zSRXa=oqXzhTz+SI)qY#)+A4=hdT)S$$aYb6MnY#NG2bgJ#1S5n z>P5tzwj&jMT}ZJdUK?A9%Ul{I>4w+tm?8$@nDVk`MFHx)VA*9VZ0gI; z?9SCci-31Tif?;^IW_6P`vo285VurR)So>H?~RE$O>1e4(`yjPi$k1W*@V(j^(0&jgwMEX`WZ8( zoLZ5vn~EnQE!Py|`qcNmr-0dB%7v8RF7DWF65WIH>9WDh< zsjhq#D>tMo-2?DHW2oeadQy?6G)RQ=_=v~(r(i}m;GN=adOy)1LPqIya8P$P|ahwZL0gtn%k&0zhp+3NF;fy#?b>PG0Dpv%b?SqKJNM~fO-Ds=F3hO zs#T(mHIsSRTDo-@y6&eHbJ$TJ^-8!^qyxTCU!%TDu4NZZjXiD3F)YHhGnhpCX_3?y)z*ulmS)!V)NuH?d_-#pe>^tud6K4A@C~LS+9op1}70~hU z6z1lB&hRxG%jh28LyQXEWuxv@Dk6<%xLxVH+Q`Rq<%|lm6;^De1~jpgh7tLr4gM4B zwS&sF=pt13L^w=pv8QWT-6~fKf&sK2OW7^vLzD6$low?x2{zN!^Rk>Sc!`3f0tf|0Vd9lPyNtuIrP9N_K8R zvH0?B*jP@0nsVWwS9Yf^%H z+E{kUQ%R_u?h$7!ydRq!X++KuXFCMp-KtAE7MY_zyjMwmJDIuFD{MfX@#Zy5HO+OF z1bPGBS7+)Nbe5nZ^6&{DDw5o!KF?ob9*{ktT%c0@F;uq;P1IZPbjx^U>O$D#YoY{h zl+$=vGFuk=U3ne%YNCJx2fO9sS0MRl{Yx#TC(QLQdM65CU& z1OuouiMCm6u_zSbH6I%<+`~rE35m~m9lNKc3x@1YgKzoG@k|>(0J7H6`(W2 zFN1i-&O^>s%Pc?A4$I(dVB^SMlQ{;9W>xy2GPoD@`np2ap}T|TNOFHn*av&!=obOW z*N2^tFbdofcc#n52v|&V3nDV8w;UZdhsZS(iW8i{3(;K7lY{trwK+i9z5_%dIT}Fm zl;|?1*z4H45yazP0%aoh-gsmCOFc2@T$l|nh{q}SY?t%ZtKwAw7yES5SB z)m>ewPnzh|GVfmr1#*>is3BU&Zu<&Tc++*MhbR^g^~hBRma-wSk8_cGo~#q zGy{B@R6}uIFE%i69Ke{y8@1>lx1n|Rnj;@z!zwgUJtl6nzY12y0$^FxL&q5v^9^P) zJ(pT`|MBj!34F}+RHH(-S*dvt(wewdh__s)L})H) zIyz2N-jl(21{D$+lUlYawqGa1GxJ%U+Er?=xIW$U9P~v?62p(;2wd;bam%XEiG2XT z9Zt|vOy`gW!$`t|p^v z3Za%eK0L1f*&CjeOe^y#o)J_mK%gPj;5@vN?*J^TTv(t#uXjzvqt-oBy0qSF&H=vK zV(L{hd1M?RrWDC_3_!G(YG7pm2~C0$BL8n5MRpAOL=P%YO`$}o0Vi8d5AMeIeH z^7#tdtz)X8%5FOKH61g8cov9^lMDzF4j#%!30>vYK+yn5R9KwVVEnCko^*n9?lx^jY1nP3CpEp+`ty;aQtt8>$d4PKCLwsI;Ed&SV~IC^ya9Zy%7Y3B4oBtJIZ{%f zBzjGY;8%)zp1qjwPZ4hQdTRntycFce64k7a0OQ4$^Jdm&?H87BQ3-WdCtHU+qvrqLfAYqBtmzaJy66KXdzPzKG1E4i3uH ze}tp-Lh(D%`;gCp+&*6djd8laW@dkdLVK3IZEO!_wfDnYml|BdleV|FliVQrE=^6v z^Bi+*1)4TM9u^BP4#Vj!U97=~F{05dr_2@7(z>ATRInfTrq*K)hV zg}=D(NP;S|uT%Z4P^+%ksyCTuH+8`}R3*2++As`>&y**V2a4Hevcu$r^oB6;Sp{&r zur%ftcD|yhxG)iEU07=x2hZKEhsY9pN!1lkm8$fHU+HEWYKFR=8km($%%Cm~D`@5+ z%zx;+kkBg!_qw0$Y-&4ysG!8j-$Kr9rQ00^Xl=Sa?(kxm(gnQaMH-wKx3{)y| z@4<`D_a2c(=0B3YxtdvNgvw5w8UlGc92~ngRx7>APf;PYZL`Q*+T^xt*w2D~+C88u z?heR6g1>(e8&SB1lxS3aQDL**EyZxwtdOrV?E=_4+ZY^K@k;I3^}0P>)k@T+u5#X~ z8RDFK;ySq<^JYNxeHgTA`;e2iHN*941?MATUf#*;3MY*v*xwk{Q`$+1cZ5HjY;x;9 z+iV6{HI};fX9qM5t>NhoSKRpV-O@@+yTC31ho5xcUTtN7%?k9D&9tSV9g*l)w-Ob4 z;1Ah}EGh+ZH5~6U2nT6lom&}R(bG0EYle4rRaRb(;4yLer>b-OR`w~H3D$)!5YWuW zMdVa{H!4(ilaMW})D)z#xA+2w&SYxfWBo9Pb~6;5y0F^jH4if$2-=i7(^BJ`fr0}eF+aej$o?1TP@EVWG`sM zy8Q4d(r=lFda?c^&bAMRZQWM@hz{eCW*&}!?2VC6HWCN7RVYc5sRp~;23boiR7 zN2F87qT9)y)fVl`{8scU9_KxM{N`d6OSVv<6u6Qcq( zj5E$B_qDM1R*Kr>8v46zRC35dOPP3ZG`GQd@S!Vgd>xm3rXK>k^=C)7%MM zvb$zX{Rfo@bi&!Q8K+Usb78OE8qB|o@Am;%69dKE=f4HZgh8=US#4#^Kqm)Jb>QWL=NT<&yvn^ z)BJgXs9!z`1{J;E$jYj}yD#_b^a41J-4YMvy+(Hq+6vG~n5#wGmm=|L~u+c8&Y4|+addPRKv*&`;dLGy6zHl5c%=Q_<3kesl|!!$;gX25#AR*-)aAd z_gP5zfeCg#o`GT54*OpFL&7bd&RyFU3m^d{{jK7dLmPQrvJ`k#{INu5%RlNw=iX1O zE-7y%saU)v5)iaWL_)h#--p;~QmNjy)4%>BY+!7u6#t>mmq~Rc-4Wh{79;4*dCJXE zFUx{;joeKUz?pBp;=$T^4z8^Lx6PSy%R}8ix+=t|2ybvDhUq-g_1HFntonSYcPLAP zFFK4?A`b@ zYtq7C#Csq}e>;|8cF=lGAAe#OeM(h1JYB8)UD-rrYFt4kUgHW4H~3>#CM1t|R*`+g z?d@NuuTVdkVs;$b@zJgQ4qFP3Q}M?#t*P@li0y)LjP%uXJHUTvj=hp*&AV6G%5HCZ z^BP>M)OPg~pwej^07&ijN4SS+)k^i7_v=%piaydw)B}YJy#luzDkYjZ{(=$pxR}CJ z8|W8vy~XMkc!PH{dfsyZB%am){a!7LsU(gj&80Ae+hJ>7UC$E?05ePA$`$GC z=87vo_6eWP)>B>J`WJZ$^Uv3ML)i!3l^6Lf2Q#nX%@uJB+C2aTR{hQO;AlSl;|MYA z22-HY)@-DDVj+F=BH&~fA#k(jp#5uK=AwBf9WoDW{x{CO@ngraT(-*|Dc8#owK6Ss zmvI03qn_7WeaL>Z49&b?T=?f6a}$tLS=8)-DXsozbmIWO2) z0h>!jGMoX5Kv;3Q-zBhHe^a1mD5cjt4rvZ>0Z+(r*7WT2(8V&5IKwo&cJ}iO{esmh zfGo4a;ik4NvPtl`kKBGkrk2@dnNPd+7o@icP`omwdVEJqgN2@_3Ei!(0dlXV;ik>8 z$oqD4G~-~Dd)V%BCTU#VIXIxH&T6X(gR)ekszc!NkbFzN=Eu%-5q#ZoFYbW#4ce7O z|L8fqVP$?Fo$&Gk0W4vqg5b>%p66YwLktgTF9at%NbmOSVuhodztj7=YLa-OtA5$N zEudLG{W#*9a|}A=)K6{YkLjmd`+3gS6`b?S;w=#@_z&?$RP8O)`7b z`x*%}DG^LszE}Y@XVo*dge=%X)8MK#`AqxdGtPZr>lu)Xl&VMDMf~CCJFJ;04ABVC z33>@$QDO8~>mIoB!^rN^Jp8)W<^b>JmF;H~olep$v71@0Z!7g$BCSZbr7j?@M%j{L7K;S z&|8bvcsNtzP&|{~{-EnlQGu*?Gyn~{lE1$3eY~J;+iEf@coCXruceLbcIu&cN93(j zY9ye)x^&)m`0~7Aml~DkV{vSq&CVU56_#GWEoIzSd&x#ezja+TJa4 zzlxT3-y99^^7>@7cSjxua_^^f?uI4w90$Z1?`ol;OsQPhEbZ;pj64ZI!g#UY&Eu-; zm^ANIm+&J`6N!+ucHjN*Ats%DFFTEpliyn!U2Id}I818Tc?6kCwd)IX#pv z`t&1&sl{02jmHmN_cgZ?*gBr5$&c0V9QGU3yt_lJWfB+VW1zN9uVuF_ZODbdjMIU8 zOYY&U2J-k!U^tEx|G5>Gdn?lUktnI8I%!X2Ay9`Nr$=EpMfr5tK=ATA5bbV6nS3AowlTyb!TQnI$`L zdfMDJkhx>=t8<<=&852|EHa3^uDkOgneVQ?^;Rji4HT|sWv`E& z0@Y6sdwo%yB4zkB&N=?R%h^GSEhU}#EYOxiX(H^!GGtW9?Cp>C%_jM6hf(M%F9q?U z8wnu`wFJS+x0iQJX}H~CoH_>*ODoQ4xxG4OKLK*ZPioJn;G5buH7fEpM!m!ip*QEq zgY&K!qrEtF-J>lxcwB-*Y+e#kJ{P6vZj8J=GYv+~yiJ$-cZS|j0xSNC1B=(Zl)Xp2 z#3?@$RXNhVEJJr^yZQ9?$H^vwve^RAbua|Pr zB0Me{KidP?*Q5C7?=lwW&#h`RYUVGy(%sIvU-LSbssxr+YeQC2cgM?}2I88^9VSl@ zyVq^+(mlp&;LAVVImerue_rOHf7@lm&$Us9z@}#4N4+Es$bINa#H38t%Un_?2CHXb z$MSA>H#*XON4C(PA*$~?GQ6**Xl?6ExcnM6A}PgVsLXoC^A$1-67=lyYIQoF&3-7oC2;B^EqVm*tH!K^jCUw!QPrdXQ^!lZ%bWhsl>X;X<;us zCql4Zx7Egxd;mG8T<{8FKlJJ~Kf6_JC3)yRU&r-L%z7qf-;?P5r%b7Sdw}S+ z)i0dh`He$x5M=Q=hBmk{u8toJ=f%Ys*!ARr*Q&rjU6i}*+NEt@x%afDL=STef{(BV zXiH&D^FCi%%+`{l!JTNwp?=jdpv`WrUKjXs=M7b8P0gslAl-TKzQ&YhVyhMAbHa5m zL7ut5wFuXe{7;NDJbIskGw4#kXvAw(%l}|?zI%wNF=NAjZ5vq%dGW_-jof}DovXYy zHKXf5TpW!|{XyWfuYes5sUb9zY%UgnjU+BG(_9L`8y-3iT)*|U^B~8@qmETb_c2eqWbnc=< zW#hSo*Vv;nr6~3_d&1k0V#rR|~vCg}uwrA59haw`!>{X1VkdQ4hbqs!N z?b`z5IRhm8#@RyvTta@EyL)IAt4o%UvkP(LoVs8g<=Ykiu~H?1sX6$=tna5_Ylb?= zDXwVQSI1)wr9OkzQxLi5a8r1`ThWH4q8M1SNQGFmYbJ&ajjg?yK-w$T#rcD{sqb3rIUQE7HL+Rd6AC4EAfWdhN8dGQVOkKVreyFV?PPNL@SjHgE`iKyj7ays= zLb!UINH=^1C!DCi{0^BN=zdC131*vU!L|V-K zzXmKyngQq-hrM}|1dt(`U!_Rf6pNiYYRg&BJO7PY$Na0jQg0dP z+2^$yY(Tb~#N)w6ZsSkiZSaJ}GP-cdM6N|V523*krgE~6;9GxU+jcw5$tq%RJ(qtb zRdrTrzwV9q1Rb;&lBxIviBlp(tbK(W{UpH>7wJCA@{YMZ(bV6==~n$6J2# zI_?5wrd<9!*pKvToZrYkC`vm-hhtsL^am<8=j*UJvD{hDqbY(MYvLLi)XWQTbrsa7R@&{p4%kWW=tD8Y4y-& zb?<9Hj??p0UdIR4#il9yi{qmCG~jfXfshoObwK73x#68wGG1-seOXVw@l1w4 z!CoS&`PqX%5x8m}p&(US^Ha_!b7RH(KRYCwk3IGum`f!$j^v0ZtlvpDdNzL>S##VX zi^?E!>so8e`Q$nJdhf%Q``f!!(w##Nu)R>Z(AV!RJR8pjX?fL-?vr7o+>8Apl-=(6 zLG|_nD*K?pmx_^?p<^iEuW_#3A)$%rYl+#q(gs*eJD<0CaxU^l5*}30+%rlVH@SWb zq$5KFCwqwl6-t$A{1uAfvG0$vo2Jco(9D9cDB_v~E(Isfqz>dUx@Wb^PpDnOAL>Nb zZ|-{ueELp(wkTPvvyfy>G`gg;D92|3dbkGa)DW?F?O*E2hT z*S@ASlc@uYV*NkJg#I%=15vb09{n$FkULut!nP&Y9yMtk%uwy0Fp> zo!6*}K9r&25w}p5?2^&XY?7jwCpk9vrgdU)aMr{(_y7D}n%i!j0{?q!)WN+s)5nUv zo`DTSb2E*7)Z#t%1vo*EQDf(tcWS(Dmasti3Jc(wI_bnwP=RQT+@t>8<&ImXw(D_C z>ClU`$+WcBVr24fZLh1}?=!RweX+J(GbEvit~)3cM`FW=)A9+Fj-%U;>68_(fBeM- zFq6e;M)0;R8gWGg*wf7jgmNni_hsg$Kz*zXWb?$*QVUkasW(^qNh2&b4CUUVWjkBnK zUOs6wAFLu(>L-g~ch5Xrdf^RoJ#LQ2B5o#Wdfr}S-kK;DzGJbF4e z{m+}XocND<`Cy(a%|*ltJXglr2&D4DlBR`@$C#hmM3SBDTE6)tTUe`Y<5b(FZ7m-x z2B*WPI-Tnz)uDx;k!Pou#3hx4d77P8ae0sly8gggK<9~>w2o-8ljo`r>TC^TWUe>` zjHx_IWBAG2vA~Pz5#^1thTi7OXXtX@uW(?kNzaO3iIzW6wzg9>JQ@RE>K^GdpywP;5qtr(v6z*AIVXeRB2C%9R-RLs^lF2OvLX6nNtVQZFtEu* zaxQaDo5yAERj}N*MaP<9?EHk-F4g54N1M(8aEr6_a=u&&PeSdY4QR~$>9mTpN;Ajm z$nCNruq1jH&}T6#Db_#JunzZqE@mUY16aD;Y?DfiKTENSZ(5?27tC&* zI7`$_8dv;s`(}}E0}<1A*9N)RU9^6rzy&=xv6kSxF)$cRd-!;^Vq|JfoYToTG3>2- zI8dA~&dE93Wa=8JhlrARlk|xrY-W)yQ;eo)y3VxfN39PbY+CXJh;Ej`vQT>&>-v3A z5mDQWX%%+22ofIFa|E|3=tpeSr~tB5&OzkZjLz6Gl8>Fp-7w{ge{xYIRSk08%JWd-mtrfCRK<~1 zstK0l=J2|HgdbX)pHg3wJW58Hl#e%Q{RWk%#zpRg1Hw4Sv2IfkCo1gvc0*lVD}j@tUKwDejs&UmyHw4`&Mf3Uobee0dl=4FDf?y8BIx zw7Noh)%^`+FMH%5@3_e$G}-c71oI>-sHU21_P(439W*nRf64!S-4Np5wQJT{?~51WqGpp~iLaX6Xa3cOTs$p;?TrtX zOTHpyRBGIX*ai*I@7H1qUiLX%s!{O4bMNw?Bd2JYQfx(0jp7g1<88AH1i@UE1Nro^-c)g9xxknNUWN(fkC2G#5Hho*kFjiWLJ~-wl|duQKfR z7q0|pE?s&L^j6?N8Xh4(B+3akQ8h02HmXR;k$UY2YTJpP(V;kVbzAReJ|E^>>3N60 z<6P`i7XJA`N$Y_ry6dRZB}VY0l?jwLj*2P=Jgn_WYP_*uqB(LTq?D2Z9B6dOyR?fOZT zsIa?+GvHe8x12DNl#u6^9oW0zKUZXANml02wfR<+P$tjuN$mRj)xV6iaevrFD9X7A zi5JC89BpOM7gIb@He~4fq`7~btH~r#g$9ovWNJVS5ZE*GRBE(`5U{ugqJKj!>l8$> zZ1r}BlsT8BIl#&9|4Bg@llg?Yc>hqf!Q|)a8kX};22I{#@s^s%@V1MM0rMA_q~5~W z;w}3el5Ec+$bGR_vs8M|R(k>H9uvaY)+cd3ow{|v>u~w9Jf?b(u^F)qJEkL_@_hHL zU4Mt~?AxuoAVbbj1@5DxFwW&q`3S2$MHdCzrZaQ~)aFbl!Zq)Xq(~+^;uR50?%C1k zw}Or+!YzkiPWI9v2XxhgIvGvz86Ft|o}M~>@po5a0ng&<+Ly~aucA|W+kmd>+z%LN zBV?CI9B(HI>iH*loOkxbzoj6QY=+&l%w%gMi1zc*TI(GO6paUDhFR?80x+fvZ1tL9 z@e6zYyO7eF(zC{f7PJ}J$Mz_MJ3LzdN*}-%d2og*sW;H@>FrjRTzK0Gv_tS1bm*fP z_R^kWTOV)qt98?0@3)%ihff68cwCaWZ78Ye^ABHVV-(X%;e4&JtlROz3vX(@<3b%KymXkRpmFQ&MGS8b=g5G` zdY22hxW=A)UXFxNr@$U3eZ6PSEX|^#1ySq-pY9ZJW_?lk29Fm%9f(PDKMrZ38xPrU zWRR7D@yq0)4;~Qk_I0yG(TxF}n>@80`o1%?z&cP#yf$>ydluZb(yV+Rqst@eBLsFN zQ?_uV9-=OT3sRk%yyLB==I6SlF8iud%|r0-%=w#~>ZEb$5G*hjyDuqf7exgb_2&uY zpT4_CRKe?4mbFq-*y zUcFiIY}&oo0E9W4KnreZN@wij=R>SUWsrznxDWE+!gQQgBu%!F($T?TuGfX77W#hU z-b@k!->>_&aqrzve=gtY)$pgTehGHknf-osu&ni}K=Xj5e%A0A`l>#c8)j_H%ZwbfViQ7S%GhVU21U^=gEb8cf@kD8l&^~Joo}E zdEnzfxR<95ryPiTPBZ=ar~7!g?{bn;+Ek_=C2+e?PN|bcJ=iR3Sg!8bPYS!3Qa5w= zPAI<_NRT{t2@ZrDyfM$oa2-#F+@ib|F#PI`THNGt(Q?bf%a1veDQZF)LnYQz8Sv(~ ziX+{9hvrVUkeKI3cfhOLzD|z5q&<8;oYQ~rk%`!F%tlSkCP(<@3MUN~h4Kqb_f@Y7 z^TVeomj}_#_{bt-Jr~v)J}$>X7ZW93?FE#>mYZp9kIZRvJ0LF9-@4+YLoB#C-@>R{ z^mZ^)YlL!t%s}KBrN6?d#~-NFJs(F(#Q`y41$)B=$5y{DdI{ppoQ&!tIQn!S$JmVH zXl)FG3H4Hs16ar6aD|*^lBj7Z#SIoC9>fpZg%&qP89UwMh{X{H71+bkaMX*GyNT`- ztI!ls5Rso8+QT>)RcpMKE)uI07S8w~^ZX-NYn381BORHq$ONwsec>CXf>LUyBlLQ= z1s0BtTwFJ9+Rk5*W`-)b5=-}zY5grHWBEg1Od{9(C9b-waCo!Ks( z9};dA(%@`Eld{=VuZlJ4HJkx$FPszH|xNzWlk)1O9*h<1bl_-veS0=rk@8{>exD z1q{lh{*7^xZi+?!hZueOfEX;_>>Jtt#9jYnu9dKaiWFlVX`!9;&n$wY0Zsisw_qkS zrJ6C{8+!j6g^(($K59|E-z}`PmZ$SiRhnW^1F6h7P>p+CnQqPek^zlKV`LKUFzBDE zMGN^H`_$B`)Ujw>%^6nwv3{NgFIOirQ{(W}<^KYL`>!3~!}Y)l7j1+-%h7@k2E4PB)5bM!+ow$m>CLCbnC1D#0IpK8dMBjB?;l5H zE;?{jTBzXa{6W|L*;bkV=Z1}cZU2oi1KN3woLEkmY8nlw5LE-s#*w=f(BPk{spMi0 zyswWW+D2u9yYssZ+@}FTgm}D}4zb^7FSX4B%axZ;jCp;kx6v}?QaGGP`7dTMc=uj3 zi+W~azTuk%8rNaTObm$OgN)U6?EK(Wy>F^cfxZ~yzX4PeMnQLFEmxZ<=K!i}R*rMY zc*XM~4QLj-urpbNJy;Km*VaOw!;KdHg(rUUs3+{T8Hwj<6u53mt={9xo(?GW1-ZfE ze&c+Q^Z-Pu0R7ebcIh};lN4}$(#`pTZ9NbjoC|uF{_CP-xbbXS8xHt>XktC_(Cgz6 z5CA*jaNg6%a30~_x-^=yKmtLeGGKI@oXQ+l9J^uHlM>aU=r|gc9-wq&XB2y0xX#yM zYou-@jTd>n1_k)`0CWi4`ec~10qAeLke^~h=zIkOW@v>@$X4l8*U57Mu(Dh;XLuY3 z!GYwY7YJSy&Okfn>3O*p(1y_^{@X2^m3o(k!)p@phJPA_trsOu5H_> zAV^3Gh>CQ#B7!tXcM8(2bSd2+jes=L4bt79bV+x2cQ@a4`z&40_xk>~XV2_E_AF-2 zng#s0^SaI>&g1M)5lqP2pbakq$2-Y$d$qW^9{8ficbfl|#Xy=UD9d}_g06Pw0nk>x zHElb4ya@u@s#eKPmb;=V(D2#MtiTLdeA-oTG8G_EbqqM3v>jMJGF)pIs)kD7p9dOV z%zo(QdavnvUFPb2bmjj8$mXFLN?rQ;urSth`PCaV;9=0%vU&2-NYCe~m550!4k9*- zJMbHgfq+ZB%s4B5e48=t`ZL49jB$BsE`8v_`+N=DLN*5-l#}^2J1S$D8JvjWh_Hq^ z3Q(_r648|1;^%XZI9Bt7?Yh&M6L4czWoXutfV9=9n5U+%-x=8<+Y098?DBl)Uw}b) zI){U$9ZL>YWOo6$AvT2?tLx*@HXG?g?&+QCO@^A231dn8saW&+@g8t}p8AVXi==mR z9`*5GTgowa$FaQ-CfK$EBI$l$?_Y434u#{q2ooL3^YQHC4*U8{vMYK|^&hdahgb8k^%Na`+K&k?0~#@lqJ)5%cYR&VA9 zP~)Vj$tXWDy`NGpNxCk(nOn$6cT7xAi|B_9AgN0=yqCwo5iuz(t+IUk1HP1?5^i5T z`sDs250T<+3%*XeZ?&0;mJSj{SafX2Rt)&0Lf`IE%acJ98!H6Z7JNx18eYP0H`nep z-mgl)9o}`h++K~4zuc)Q;OV^>`ogGn_nOt^>g*}u_)DXqXU+zcq3(APE^L=Q(Yf~; z8lF7s+pTd4SY{^%i6=enB(j}M!#+1sT*nHxQsgvYrCVfshrK+G@S04v1*=k#FXR?F zQ`R>n@tKCyZb4@BUvJtgYWQU!Fc1AB=JA$V3r32EOAiMq- z)amZIEcsO{PiCt)F4j`(0{pxE^u0)B+oa5>iXCJTEEbym_63XLm*MoXiB3nrqWsh0 zWXsTY%F@S{R_v4Dh<@AC4}sI*4$r(1?E(`_RT^BbYbVFvCpxd74}PGeWmKMyvuH%3 zsGx*{b>}^@<+R&TX(romiqRs8b%fSAbROazUX$R$r27wH@3A<^9fs zs|~7{52n7H4hf6GAJSjRfZ&~Gl0t=U)N7WmV!jj@H!ZHLx8$IUI$JtQU(zZ54F4)> z7!JEjNKDzfR&Ra)Okm#ih(zoR;@DZslP{AV$#K|ee32uoMg4$WZY%pPW&h!0wP7dN zTRtKfm}@ETu~*s^6Fe=EqGUgqB$1K1qU7F+>xp8~q3Ls_{y=J(`O;3#Xym?)b&d{e zC`M#DO$f_)UP!az?!i}P&`&~kna+)P+)sbV;^!29`~~af{+sX5;Ts2p_s?uw+cb1s zzq{V9w(CcrQ_Q6uOuI{n$AnR zbAnRr2cY$tx+2B>aSQbq9ZCBX&ZB*NfnH~s?^H?IGxx0@<-EyRnYKN;BE~?31BM5D z#cQjAx)Xop>ZP%HmK1*_YOL3n*-jH^so$+^AH6gR2k&_I(E0t9o&Dt^RCiw9?YN1W zECbcfZ2=P6e4>lbif+q9^A(ySHgX2k8q#1~Vr|znD3YEQ7k%PY!4h#4hwl&L$q^cJ zx!P}gB;oAVzQJ4H`J|&SQG()S4!^?Dk38QsE5ne-YJDg|hrc8+qQ|fo7$VG)OIXsJ z^XQ`nhf$g?F*#Ya8IIvOpM=Qu@X4{J?Y_K;xY|C>eDtCpeLC(U=Umhwpn`ZP%QqukB)%J z)ZE%GXDk=5gFw2zoATM_q;l1iLOLCaf3^amNQZR?dDPjeRPSzTF!xun=TE}~;f_=v z+{PyHd99gC(7bxWYPJ=D>_C8{Nntb}EoT4puKNOs3`sb$2eJ5Fct#|WTU~g8eng?O zFgDBR4ceu_Vi5faY@#BQHj}0w0>cIVbFH-0;jpu$cVJ{?`_jP=oRgg|Zr&w|HurHl zm>mv8-M1Q&6&@F7tXonqeehYWZ8g{|CyY^FpmdOC*^ArTGeCg3VFU+JEF)Y_FO6h> z+k!?PyXE0Xn%CqcZ3h!josVxkmZxmKBV(m^FJrY!5e!f;qRVg#p zzEG8MQx0)msd!O0EK~WWD!v1m!UzfLguG65z!Ho({ zQ>~OrvGWM5>CCwbKH22ir_^#3LLqP=V=P- z93*m2=&E%o8F};Yl2~R6POJ*O^JR;(Tn}U!AW}!llF#m$s}|T%@>?MKv^X>#;UO>9 zney;+NR}@Cu_@!mhlkeZ9V1QE`TRVV_V8tDqeWg-nh(k46h-#c2lUjfiCe8+1h$F- zJw7maxUhcN(y4=_F#o-jZ7QZtnX}jN)H<8u(^v^3VR6Mg^Rpbul`8R%5k|9z@+*|= z6b;N=qjFYQY0r7Yw!~Rs$y?=!r@vcrfhxlW>uppqFX7$IPWiWRsW3$MbGjv{g;Rw# z7Z)|(K1DwCEGf*-F6_iyY}^?0GEULO6)EfvaD%1yj(K{}DIfBYtBunZo>*vxH>q&a z)@AUnawNGQub*GGOlXo--X8$`hw(Ha0$c!|QH0xrynyj! z8Dcs`{EJ?pf`u5*J2Zm--G2F>KUeGycs!FV{T^lbaTIU{3U$-{g%-t_hM`$_lmWR8+?lUF{#YAEg{8hMgE+r;;@K<34?3ouD#Sj#cT_( ze~f{-5qTfi2g*UO-Q>qX$vl_qi;*H-;Ym<_-cMHnSl@`T;i@>^VIy1AIq)H~YqA=d z7dSmbK3@D$7SoC5e8FwGQY=Tn8bsfKhFxPES_Oe@4AM8uw2({*pk!D5&4n>Q#Xlvs zOI%o`Ud?}Ul798R=V=XqGTVS{DF^8o=d+P#cSAd{Tu~;Wo8}+uhK+o9uR<_JW@?U2 za|9zK#cVu~TFP*AyBl2JB49%AZw-8`Ydd3~i3&)ZcfASmtETIf1Y8bdmTmYI8ukaA z(fGd(`->YLcA*rN&|DmiF<2i5FTIx}iSigrN<9iHya&I)~gy4>qLrtK5csafYxHVr5Z8;}t*2@E-g07jPq8%tAE z>McX{8c8gZzCVP1(0Hya2JL5@Pp8LR6v1@~73WP|-mN=LXn-k02lPgz5_c9V`|Z`C zq-o&5(7WspmtePEs#GphHX?mJxqp2++jc@}WUj+eVz3P8oDxu9cd*;6t>Lg$TPqiL z9B4u4IPBAezH;^Q`=22a2^O%!gK45+TLa>ZFUxL0bTVs|uE=;=xq1VAe>qpdY?KUv zIP|8#6B9)tfZ~^m0Jhfr`~w4~m>0OWque)Vx{fE~@3+qugM+8Pl$8}ii zOa8^se6K;60P}MWx(hyVvtP+h>IBeV`J{0hB-$+?#d6vgTd(!~(2VNNxIDgWu%R^> z%~KuC9L<(*GppSfiUlc>4fk$<93{r!PUw2oe{-?P=z7sEXbJY<}!YlL;m&D;DXrsGVQ`*lAF=ogP-@`?O6O z^r|uV)0-@rACwRyS-*&JVqA4P;|MAKt6`1SbpV69G}C?!wgyoNdRQ_wWX3dpbdgJq z+&@>chZTxrcC#s zgS|N3eGhST=84NTBwnA@h=$&^b-BUZb&?1KwA~L{|HV^dju=kRTH`#_KjSY2&3C9$ zq7&&S9=GbEuWM9kpauBcG@*f!`^D`ag~t7X81z~{X$dQH!$y3<7iyRj4s$`IS*+)m z2l^FV!x2u9SF-wZz&s(l^u}D}lG;$>tx-ATPtRx`Nsd-~ye4oy>YrIH2b`gXGI5w< z`YNSAI{}WfNKYcqEYv+m7@@YQy~MN>CPz#oN4MqxVit%>5ZiZoL;&w%3aFM7WUr8N zh!XX8RXqC%dT2&yU+HV(2v|O;KVQMSFXnZ2Lb23Uo<7k9a^fZdR@yRG7kdvs0OGOG z^FR^LW)TQFwH`94t>y7pZTXszg;9obm8;}Al#N{|s+#J5>m?%2Ds;(_yLLv>FM{@c z3~Amk>yNoUXEw6H`Fp#~u#%a>o}We@a_7H2X;0_ffx9pW=P4#}?h008S!^tsv*GIg8ais|*?u@2YY#z-St_R?iC&9-?H zNx+w!bU9c)F#$$&tX5C+dET=Ze+fU~1ej9Y=ZrHBn|W`w+Vl>VXvWB~)41i%okc%N z4M01ruUkenKUn=1h@lr_wX|Hpx8X?Zc_ElCe)~MzRGHi$Tr&mTDy9WM?kX2m!ng@n zU>&_My{4pvk9jOCxGWffP9yC~BaJz|9GP^-m~Y|G=OevRp4##>6Ci)9qg7i$_k}LF zK{m{>iTCnApm`Cqx{?b_tIlI(;0|PpbYpKp7IR#QdEdGt8>s@nUfGJ)Jr@DEd%k}+d8=}Wqa?LduzZf(@_0OUgY=js@o;zR=(oQC(yc>TD zeMm=PhJ9FKu|R(Xj=nk{!OMtf_EU&9!FO0oc4=@j)_=a&x@mq^iTagE?o#g_t!xY! zmJl3M(z<#Yvv5NzUmgg_1Bvote#)~w2SxY`#r8Z#f~e@D$3GAVoAYV88Nu$(Yl9&Z zoBoOk#K9dRirK8LS@se&6$Z z9`0k9IwgmOql9&5{sW4Tkw|1Y*fnVqeRo(|qiV+UJTd0kN{gc?b1p)@5Oa5w`Tg@n`{KfG`j^)X(00&U*Hy!i1ntK6~&3~{u;m%!xDOMSXumXS95MGXymjgAWI z!F2CHy0~e{PZsggE?2jFjj{q!mP1{<*mI;@{sn*U|zkc$ZBw-ZuT@^Ocd1v{`3Wl(#jl6d<~>>4DXmL<&Yc6nE4 zT=m47s4pqqyZo&nx2wS#nr4U4*-+o5iBva^4;g)KPmLX}NthrDDDi{MHOkHc-INs0 z^9alXiZIG0eSjDA5Mas($8%+K91&E2(=;h=7RltV?+=)c43JLj3?gmdP6R7RU`29Hl z!VxftOOURO`{2Rvll(8hAmR{U9{6_jdo9|`GyejNBcGJXJ&n8Mrd z{)G_Tcp1PaS`icfYrXt)MDBV};*IwM`~T&v+Xa(M^26z*-jYbnKK}g| z+6iD?8PED$Tv8M16OW7Xl+VqB@EG6Nkme}lB)>5m@90!A4c8^aGe%0wlba6}XDG^+ z&s52lOE&?r_vI}QRmTV%x3od#LK*bvd&#+i`m2-;q&xxl+e+79+X}Qg|BPj=0I{SG zJK3nfA?sbV}Kk=uEBm< z4mOKP(EO4Mgu?O;idZtvMWDJEK#q1L-mD#l+P&8t8(FDNGhp1x1kgaO@PPtxsSISx z59wjQpF7?ajF8vbGjrut;Yjmn>3VNjbp7RDm6mO63#GnA)B*!=b{35!^*Brw(-p=X zck8wn0vJz5nH^6|Y5*sGO*Oa}%%edynjL%#;M90uGXMQ_PGqpbh;hSE<82OQm-OHn z4u6Y)Du0zygQA{VJ*rpkR~z#n3856Ah0&5x^A-?Ak@vng;RFh>05y_Tyu?ETAOjZO zf`x7yYP7dmj!=Tch^t+R{JUz6@VIJP;4&Ysik9-k4jkkJm@Is+`^7BqzI*WYtUX)9 zFr<6hRIZ@t4cn=oUh%s(38iHUz6D_8 zYr{bDD{~Q$+&EbrvidXe%qoA_jO*iSP672V*ZJ~<#boRm9w=X-O7MnMAvJh4-ZsHd zL5wgfnDfAwaC-pp4M%jy>T}e z$iqdPkfJ`$&uiK~{yxzZ;i-ii;j$uL3JYl56|Lv00`>6KMf(?0XI1L~QOf1D%6jk# zGdg0Vt57wnZaw^_ya|oN&dn&yX3Pa4mRq+PD3*@(PRbVgu}(mEE&sSKSF@H9z}W<0 zOj;xHsTM$L;PLk4=#1;Fb6Bjm3;&Vo!?KT}9|?ZdGSGWU_fJ zc_<70m2-$`-SJ4d(K5}fKVbv?*x7P{j*ol>_|n)^RP_r*?pkBb_QF zAOsS(p85J_4B>_m~CGJ-0x z6Gu4NX!u*kkpM|cN%&738U>Nkn(xOB0Kht&`h)w@c57A#6fcd(@r4!-esg40im?07 zu@5-x`3_c;q%yX}jm6=epVkAzM8Y{(BlHXEFTQmwy-np9tpED%#k=l3QU{=`SM`!= zs>G0Lx`4EU43ikAO{2^0ic`XLcQ-Azckqjp;jrjW$Xq` zQtx6rUT8Igg9QuU3uQ^so3ll9b1w2I+A`H*fsmG=!1WikT`iCfaY*oC>p8b;0iNTy ztT3UzrptNyOOvs_%xwIPv7%JX-jQ29K_Y$gS`*;-m}%64B$e&ZVkJc|bhyTpPLj6R z=JMup_d}YYZf7_(i}?&^!Bj`ti%^*mhlmFP4d{GGWJ-aqw?7}l(a169{Mi+f1TaO6 z(;M3eUAJ%$NWP&pOc73i>=hVSVC8_KV{Wwxd^h>!>dR(--Y`%nu34zLbnRhgapIZR z78!mNC-jx0q3US@ee;+cYMnu#aE%tC`4tOCLUigw1lX68Z4sGIH0tq-IJdcFSr-8I zU4y>xWlsZUjcs)q8VrGv+7^|^|&Z;f1K* zV(#-1vgY7E3?+gjp#?#ehb>K0v zBrpEWjehqgN?Iogi||;IEbo?Rk1A=4Yqd>tQ-gp*_i3eBUG=^B^UtSSd%n+Q{pP#&Rnrr;(mkU0W` z?MS}DfqO(pVTw`L)SHy?CmIgx-$>ehnI-{k~e@Os1`VTA^LV15H_B>Mv;Pek;U$xE>#kk{-z&E2r@ zj0z)F=Or_EH_I7;=~FwueQUAxa|zgSr-z99e8&JPj_RIYg8IfnJl(n%hWQkI-ez1O zbLWhc7!Bt~kP_mpJU(9QZ))R_d9QAI?uDzd)^Bi+pzQcQF8$Hg5;tWI`n5)ue1Y;O z$blfQ)kfr>ZgJEvj4PV!DHYFtKF+;#kz_m#%9SmkNup-H`|||eqaf1fi}+APB2o4P z$T4v*vkBrD+NkFu!;$;fTT(_d49E0_F$f8Xm->CR)|t}pbH1<4AeE0{GDb~7e~d+ya)yzKf~#Ji7E{3bLH0lqaN2coDV??yaoZQ}}w@W>t1OD`wZ z1LNv%RB(f%%{U6Gn)z?61;;f;kHV7U&Xy4fowQD; zZ4=APXJ-(u2FiunE>3p|6C+HaB3Kkl=KZT!9Ar^XtH+C({wQs&wAkScktmd@@Rdr!P z8YnbG1_}S|F8@=ovcQtRJMl5ed9?GtfQ=nc|ED>kS~~wZhTqk`J2N>z6q2;wU4MsA zrf~p~WnF_`?SGLAB!R75WYB-U`1b+)3li3)K#^ZPiZS|c8}9EP5|IZ*{y?ctCEedA zSPgl-cV0Fh|Dn77fP{f?07RJc9x>ei8>9Tcacbd`gPSy^T`GWAgEn(W@-QAN)J~3w zHR8jflq!YlDM%cFfCFTo3*x?5QwUgm1#r<%M9%Z2u$$|AjXH;~>dNmldO$pw9^?uH z&dQJRtd$POMzcF3S+ctE_8q^A@H=oUWPhnBHq_~zW_l4uFH1Y=Ih4=8eb!mWvm!T* zK#o$g@{^2b9~O&ZFf|^@-6sq@-W;s}ew_)h#U)~w%(~uALq!1iUd(poVvs0)Nqr1B zLed&QXyhqm%dz=S0Q!9!?AaB7ss0IiCFVHr!I+>5FcZBc9QnVXO61~Oh%P{t)&k1U z2x$8q^U6~9uV4MYkO_Y_2LBr}TF8_MxdC0y<`GoOj3PkRl-UR{0D-VO$p;C$fQl&v zYy1c;k%BF*hFvn0EQoY?0&J$hvx5T_bGeYBb{O)ndg$-}A35e{vIOF4sE0Nr#f8+*@8dyz?o_mziQdk!Q`uxzIe!n2)6PQc>#o(pCqJk_K12WM^y1-x zlr^*7mk^O7%(y71IA$@MdKHdr4?}_vix=`8_zt2L>&*TIDqj}A>1DfN)4Ky};~=~3 z&epg%OdaraZH|{@0#4bQMeDnp8l@`$o3*d!ftinGcoD=?ZFSNX95tW=m}DDt1<6-R z20&=KVH+6#_w8sA7q_9hH1)PvFT~NEn@$s$2O&@J)!G6`9$SgJh#vAu&n03GwY#!xn|$6z03wiX zz+_g4c{KqKUMXQZ`)=*w6@tO53{X?q03GA2uuyYHM2ot zemN|fVjf}A+~Y3S$4aw`LNUO8vz>vB{6M*G{ZwFGHr-=F;@W1)dQ|-cXg6SVd>MfY zqaN{dqai9<`HVpI4?kZ*6(5*R4SdKT($7U>Jb5z=g^+tH!S%*owMfTncC_Bv5!yYh zA|(HCC*zX54Coyq#pj{a#?A-fzPz6y3#&7*0J)^C{}PD`*n2<`P`>;26l|EZ$iQ>B zdfK%;AFUg-Pq<%<)@P8y{RkA%DzoQ1gPFkp5x!oz*4XZvRp*0Tz-e2BC5Gf+ zWxq_r-A)D<{6=PC~Q?0KCI; zlK;qM7TWvmi84uw;|J6*zoa8)Pfm0%DXS9gUwuDje z(KmxqMXBZryfhP#BT^1q)G{aCB`R$yl4%X_7tfSMMF4S5ABGb!@iBfCD1v(omVTWS zzZ;_5wW$6besx4%EhI?kUE) zBe{k;;0(9xg16rCG!}ZrKxb`wkrdeZI5QC>9yMq(Q@2$w2sCRJldE<2V zaT!WMDB_F;AiGfYBP77uII~`I+`1EJvOSSSj^8bm_J?;KLXhQcOOlcK z+LIH+J6rF}|L_vTtY5Dw&=H#n5=P60scg?U#7+@@xAa+_P#_YH88A|y^%df402rlk zJ*qebF~u$9$rlbl>um#_<|Nf@o|I)t8&rJz|B4FFyhz$jqg%KkML4$6wRpmtNm7_OBu-B zCmcJ#tG7W`Bydiv_TbwueSu(UL-6hIYQ~K>-0hv6NGmem z`2ZidL_}D#S~EGX5WafvH)Ba30Xgc?U|XC}EHl3VhTu^T?M1}`gTPOH>p;3Y*h}Js z5utnTYpheQ2hPL7Mnk)A^0A9)+NF;ytLsV9{qh+d%<{yaKgd^F_0=dD!MUA>!ZqX# zX`*AWQT;rk@^+6cIpK&3&0zaaKd4tN52V>JUi28ZA}Mpg{R0&{t%<3^n(DHhqr_jA zePiR;SV-@wd$;TBU*43qLfm3cd)~;RwY-eQUMlIF7swNPI)%J)8W} zE_+Hk!(9HpdP^!H{a=HSdeVDot`}|<beo znNbaEi#f&*+J9H5fH%wnCY3}cCLUvWWojx-&@te1HaKszkk6MYaA7c%=s`_0m%@F3 zEvrhX4RMdpahMm#8T2M>5>pZ8r1>~|3pqiq0oq)c;jGyYnSihIT zsI-HD{4I+KS@kHH6M(Q-F30i;feqdUI~BqT{#=*v@jj1C}EirOrMWQ7g3yot)ipa z%fm)7y2VLS+Ch^;Y!{=ofIz6EX)3ICr=*k_VzC5b5yMeUa_L&4%loC`q*>oajIu@l zpIB4RKDw0cQeh)|GU)%qyE6swf}%6mp{BoFw668x?n07jx^crnx@THhx<|&F!9)QD z#A2z+)dWY0AC+WZ!>%B9kNcY(nL)GI3;d`=5=3%$92{0aKCT1M` z^Lch&*`d0oy80q-XX9Ie)SFu!QlY>?klOr^N(!G2mPE!54yvy=!GiY^K-4`c74P0s zQ1$14CN(fwkyaBKbiT1Pt8|V6U1$|g14e)s?w>Ev%$}R@a{R{r)=c&JHtl4oi~3Yr zX&qOlJiD12-7eK}N+W=n?;!gXP+#mv>Ktt;NxFfz1#(S64!tdai@FgPfW+Uk$3&Ht z74oH->H#K(dmvWQ)T@eFYG|zIH*K8K-kqceW6qSf^s`hb+r9e(o+j3fMf8 z!JkkaJ?B zdE|zy1C&2?-S3X%%z&9kLIpBYF`&4s=fF7dBAC1P-a@U50DM#cj_TRyGbEZAsNYfD zVLjajv^mxk0(5WNh6Yw$Z&bW@zyk4Mb)Wy?t9MhCmNq+8t3oaJo{&Hi7S#3W_Y@Hi zC>_WYY&*Lx0k}1XHbA?3V+X8Q;~he#RPrDln(H(R-kUOLb2lduGhy=>fm2Oi&|G_`zOE( zDG z0(0?)jFy{V`wu>}s$B4=%>@QeGu7H#i~un2*I+f#wH_;gItr7mUALAHBb`$6D>hf$ zRXyMX)NT?%zB7wW_t+XYbbJ5#a<_wfbRZ*_E8vHW&UF;>oFY=6$@>%rr~4tj3K`1H zqBPG0fUasy4Z!%>Q{t{s2$Zd1B(xi?C-A<=fl)%(XP~rEa{xm75>0mC<}}cDbIqo! zZ!kDOm!TRtxDuxy6VM^n1dIKw0c&6W zyxAAvi(ZG5HA6&199qSXDT|=sn08rkJjkZZ16*}J<|I&QE9!Eu+iDRJ?`n|EUF<(| zi%MK$Y1acS&6eF`_qw7q96ErD%^)6qXUk(7a6Hf>1c&Z-iC6T<{6+I!xOu<;j38A( zU~U?qPN4*%w~qXebX-tt$1zy%@jM%oJFYymG^GCXNZTNWV>7~Ar8ReF^XkV6akhpY z137mxukEtn-RG~0$*pZ1Z!Bk6CJTHIARtqu~^t3P+NykbqcmtVUdD2n&E-o4@z>k~#7MDN*$oQbm; z>4?6({g}LSx|LY1V=gNnlHEn^`IX%+Z^AV*Dy>$kRuevGU+?+3-@T_2m9LJ{ZwV?~ z3rixkg`zi+rYBqDBT0OooQNC4Iq$aumg9xAR%(;F1@62PX$JJb7s?<#mXF&5!x$vb zYAG-tK3ef6rg;(WQAOaJxD2HHxf!flTB=pH28rLxJTIKsefI~%G<_uky)u1oGehGI z?wM1}rTpl5PqxqC``&mo_vi4U;HzfDDI;fe;>pga+tDJ=>yEb;B&=}oyWj9QBWGAn z$eB2qD-|7@YWHJj%H}AUJXa6rOR>Rf#SV)SaNym=)oUs9J@(G!j_%(UAYv-eSon-8Q{ngC~3%yWdM`pX?WM!TtP zFevNu4u3l$@>9Ef?eO*57iSLWVeq?v-Pln>QAMg3Pr+RG0hYgizTgnUbKZ)6pnGwbcQLie4fUsWpLLc`F1e? z>&F3c#F;NVMXliBQ@lOpDDIDC{UjWpw z?T44o(0jpR7Bx`IyPhW9_UHJ+onT+8EZb#Aexg0E*sP1rh}_R9s67zt9x95z_SVr>zbHaHeKZ(+iS93USxmT4^WPmZUbk?bD7e#pGgzI%;{ zq8Ty^MvRoGJ0B05F(6PNoMM|SQ13w@;C9EI4PhDY=jI0INi|Dc3M8dr&TYc< zavlcm`|;O{z2H8;`3m)~XGs3skE1ah4a+-X%0x}L*ZsUHjtvoo-v`Y)aaa&hs8GLH zy%!Z7qp=vD{|a2j+;hfbJ=%D?p)amWq^;-sukNEoS#TUB{`(YuLR2sv==mD|V#26= zTV|`pONS>DR#)r35ug(5xPVz8-^cZ)_FM=Z=a3%mXK&BXXtj43=sh%2uj)Msn7KJx z-?!907kY>e_XKvCcFEx7ye_c3;RYi%J`ZB2qk!}I`0ON-$Gn?{+v&{07C*2Ht%s6t z_uVtDn@9A5;Lf4BgXY1Bmm!82i=DxgIGONzK! z!84RzXEzy8DLGjrj=@12o~4bHzV^K}Pb zcDO%y$9dl&_U+MidAz2XP)FA}$WdFW66kFWp#H=zsm|Ktks zwvfDfKO$8H;!U6_SfGEp5rC1XvO{dL1z-*CDxY<6G@hxgx(0ma3Gk4qf?>}0ALvi% z-hxhy$x6#q5Qacy_GlZFPVIE=pw^mU|F{Nu*1AlZ{pl%SI)Oh@bvi;S6e!0PQ4T zq(_4)FkF}b@MHu0O%p(yHvno&2Vxtr`~7^^9jy&Ofra~mBT%chfZk%2(g><72$i*0 zX7Q%3Kt?c-IRUvQ)dkN%R7C{{vnb{@ls=i0DC*pG0?ow50OU*nCq}5I%r>q&ELJp+ zYd!vl?&tk>;K>dbujO10mk(@!I+ngEaXR%unzclYTOjYGTB=WJlMc8sHbB40#4;6Y!+w|p43V+{|L`X@XtAPXhk>T~l@rNzy%h3YO-A>4u)w2W2 zK{ZOKDdT>?ohkqUY6`jCT$MOM4@5ce=v4m%h{MK`7!BINegoSq#JS{<(iayD~s z0Hj%-xb(!a*#H%&n)zgXur2*X_2I3n#m@T#`&NdAE2~MMBB$169W9l7MlP)o;Jm8B zKmc1cGZ;(F9khRs)~j;K6LifO%2{wFCrwCa_GL|P3 zkTwv)jfC7PBayo*_%OdZKUQ9eCg?$!3;r56`K>XOB!LFFgYmF}1xJQzM=6R5@#XQ*m6?FmLOTvkJ*R`6iM zt<`Y7wzlOQ6+kyF&~>PK289VtgYK1}4|Iy$^%fKJKBu2p)uJu+z2RF!9@g?>u(Y!Z zMA7C~Hg1C{R$Xz9O!j>G39YY-M{%Tl0%UIec)by2dY-}EUsQ&in9u;N2w@ZcN{Az# zW^aT&CFS>i_TM-xa6j`3Og2KUNp6$|=y^nF|uH`Xv$X++OdxVxftqPQ8BBx*1S=4)_`M7%10j5-lS1)JT6gR;lmW8?N5$-|Z8N5@fDd+G z$qiVYYxXN4Q|A4Fa#K}GF{lNq$MHKMuEq^mWAnB7dO36*EL+muuYn<|ih!XJi|6wO zco2x4DpfPJJ$zp;vwT@@^VDU-ZS+kna1(o0XWos#=T-mO3wdPSO)6*+n1;7$w((e( zC6FJ#6AadIF+|Ud+N&g7TrUEObj@_3o*hDC7a*m!DcJysOF>WAUr+M;X*p zmmg?gA>Oyk)eaY>jI;2dZKwc=v=z0Wg%ZWmlSe>vh8&P0e~Kx3II+?!nGzw%(Mr_n z<+jdf5Ro;!r?%$-tDW_c3C;FmcTinF!Ssm20ZNNd-z8!=SAbho&QZ)usaYdVU7coa z9{&-z6c^iSMu!gT`mE{BqhDy(f%6&zrGeg#yWuBecJ~0kSj($1&(+gQeHTuQmxWsB z1gNC7_nu98o;$Qa5-sG$&iO=H&0;IF)F5DZs(lqI`W*A4$NqrU+GIrmdg%L@E$j5q zAWq8udzd0$?hr`L0M2Dsph-(vVA1a9#M9t-V9~37Z`+r|cY{&UQ@1VXbtN#g=AM3r zu>9@x9+C#dWOOd;n@O;PZTYn&{=xzp_QyD^;U2_R`?-cC8U5evKHlvkN~N2Y`}Q;Ki6k{os16kKp+w= zme!q$NgxJ6@E1M$@y$*~{Eh_ac>&N6l09WUb&6uT zr+-I$1%+?uFjCCvCVHS;U`=oj^@%>4hJ?IifvS`j?h@uj~*P-L5()&{fk%Rz?g(92AH@`;gC};Benopf9{P(f~5k4c;Jerjz zFOi&N>CxwTjyen?E^s|$Yi51#D3}#V>=8*yh_$LAOGNtJFHFq+@?ojX|5@do z#cx~mXEnnkd2zVNO|NT-yK6xsX@3XnI02_LMSfSJxHu*iGAum_f7KrBK`)PZr(05+ zlx$i~WjvM?3c4;DoOu|fw9T@4SjIkAm(yEd;Ykg)viB*f+gJP?Kl%u(`(5YR23*rN z#FH$9;3iUcB+MB7xMU0ox^{buHdHh} zM1n=v7io87=Rn$#%_u+PQ<6JoCE1U{xR|OIeKASZqzMQxAbUC&pl16S6@b{g7#yP& zRE6`5!dj0CY0;-h?=2=8rg!H{)Vm9h*sRE6h>ldMtu*NhU-7WPvY&umZ9=ygZ6gi(-Pqv|H2VpWZ#$p2R&%!38~~2f@Sw_dAtUfL*M>Gt*4v% zQ7cE?gQQZr`19_5IF{MM7FrL!>wVtqZu-9D<%9`?JMz{W(e09MJ}ZgIg;3ia2^+%l zD;D*7-&cDvgdg$8Z+tRI3-d$VC-}|*vp9t!Jy#O=me2m<##l%F#Rl!Dr+)~nc~8gI z=G*8uK4|z;|A)P|jLNEO*FXgUN$KuJKw7DX?vR#HIs~Lky1PMANdW-`Nhx_ix+Rqm z1RffZZVAs^@BTh@?EU^dW1Ju7mum=4SIjlnysx@X_5xSb7Xtjh;o*jnvhZI3l(e8d z^Ii_jf!qLWxPQ7+m*RS>;iz9iuAzi12)dvGe%^{;)lf2S4q44y zBf~?hCXBYIgA*WPac8)(%5QSgZZo8vK9tKZN-r7_N8hF8sG-J~z^8z0a@=1zG@SEt z+ODg6oe96`ywFfVXvyu>U+YR=;*AdJW$nB{ZvEt4Zqm)1bI-PbWY!W>jC=y|zKF13H?*!Z!%q}Rns?ERk3@r2Ao)Y zEVEq-qFJyyLNWPT!q7#lISq8ZC>E6nvK#2hX!pw>wG7;=3Yoof>dJBsAX)j~2Y;0Q z0NGD2yyuA~MK|9F$stGTLzVlqZ0mT+`$w1**ey56=V-PB&GuzG2iw)(lW`bI)oTtX z=k*uAp<5p~s_tKtD;_C3`#l$w(So&@*;BDslp)O1g(V+NXTOhnRc62Mmewmco4EI@ z)c>p| zgVMbwY4C&mzYN=lj1-M&5cHM}fF!?9`acKxoOns48YHd;Q*3`Kqu=YK0e}nWu{4PP z+K>L;n5Lp46A%wbb8S)l%dm9Nl~^LZEdb!?@5}qoL2!+vWP!9npOsPJf0v^FZg#=o zme7@ONXHP3vRG6dCuM=hix1`5S_|7Rqw+FdAU;lXm{RB3kQQJ1)wRllmJ?H&WeZU*MhXOycW_c-r$)zob4gh_7FMF zP+Tpz079HVpn#vL{CNEoxC8x;cELY(+gG^xH+D|M8yqGE|qW?Mbedk5V zt+B$$*h7$6*!P8lA`UWI^NlaXAI$^w;RN(HHyFtkGfMmhQb*$Ezko0fQ5L{I`B%(0 znfjR-i_h;p$GiaGg`LhkB5tY=pg(i>eXx`+fYr~9T7HCnv-@J@ZCOQ4liRxdX{B+? z*KWC8`b{QK895jD%R-TEGs5fH7EnP71)qXC=cC;6YtrZQO5-xS%s7dV!tQ`6y~?c99(-aQ7qW%j3=2~Q#<8%P0hvkJ$zmy| z9&~vIb|(d=GbD}DNF?H$5%CvGq(xt4 z{#EY{3U_K1cqfBK5s}o6P?AW+ex*P*1TK|nmn4KX0#KunK0!0O`Cx$K9S8}Dn3fcx zmRHPkXVElnpyoby<&dWLP8aQ9) zM0!=T?tcO*=vlvsmD^{(ensJGhW4y`Oc`54g*nuQn8s&=p41$GUOPXb)*FTEkan@& zcei=UrpvtXmKzSBlIwu?xF52XHc*MUm)fBlx%M-2#UK4JJKuK=HosKp4)|QEISDNK zQ;Mv8uQQCFLOH>YOSG5Fx#NR`rcn zT?E^m52=wtB9Qh4pMLJ^-nt!k=?P4VAGTIM*up2y=qh!~^${UOK39f<1<2>l;3b*` zp#j?!{A}Vb+zk1K;N+eG*XaxvHyrO1ErsA5B|0UQFIe_I^f2Y#&ka{^P7hbl2b%v1 z&V6&bJ7+5?>g6DLr5=#uA5dI&>7M#5&-?@{G~6766RR5fWl!N0{S_P@=7c@$HnAIuIM`&4w2wFGj3D;eTY#$VZ1}x)5;q4qA8b zyRE5CDdxXY3(YrK2ym3Z`2sk4^0b*M$ktsEqFe}x0zBh4fxP7dnwZ#20TLlk(2>-T zQ9$!$h>KgmQqh>YI)%K2};j|nGJXa(wXajUCS-DNrMA?Yf6Z^%W;K|o^ zq!)l8w}<#xvHHf`6k}|`CkwMGHyP)}DQ*jV6=s!pTEkbMLQq@*lZa=$FN_!<(TgW3 zPkd5ZUb|fZoY-Ybnb8U?ydIbR+&)dbKH0WaP@ty~rT2iCN+|I%4U5E{dz&KRDTVis ziOpvlAEj9(4Z!ksL3a3l(I;`g8O-Ml~oWUwGqa*;~i(c3s%88&=T?S#k1{i zRFq*B=8^+1fkowmYXOjttC{YtD}e`on3lE*0*&86xhY%?5R@REE9wMuLibKxkdl!+ z3E2aa#1UZW&LL1h>_(UVuFC;fndAp^7WXgJUdPG&STsT$5+Zmunn)5JZ~e9V&_Yl3 z(hQE^O_Pj}q+?&Sl4O1!@jlJ+EH z$%RJiTk#?H?A)H{vwk}gK|2ih=)#djg;8$QDQLV>$TY(<)=_$&7$J&-`DD2S5i}?O zS^gUm+6e4}@L2tz=eMVzv4{2xWP5a1e(1s3Jdp2X+URe4)^*pZ(V_vc7Tz8}7pN2C z7(LzD5@n4w&lr{D1@Gdcc%G`@)kY_7I_E}t-@a<|qq=7Z#R%%D#L@z|l66@ucr+gI zihEw|M^5q)lo99Y=?Eb_0a^lP2 zZ%TXld~UvRA6HrZwP9sBt`L{&obVb+d1P;%`sA7PO>@+FRGpv8-PGc=I5J%~6TShM z#;7xA;BH0zk(%#F(B(K$Tt@UAe557v`0RWY9)u!y?-*r_w^aMPl|vJDTP%gN0q;E# z)5e$)!t^02sZh#7(!isQvEk;>>Je<5wnB!F{!vn0omGS=q4|qiul#N+P0w8h3deku9rN(h>5ZeG)vImLIuCSc!P4Jco1N$+WR;obB}# z%%CvjCs?^ZV7?>8!=tc?;#u>_$Z?x{m7Cu-|u}qE)$<6*2Ai8J(P)v zknO^%+zwZ`!A&Hq2rmTEvRfj#yq;Kyew7GOZ>;&*)H~>z*iK}C4A!R*}BRiC@ zNW3e4x}ToLJi>LDzE?i3-@CUHs{(AFEoY*rH zdp*iZl}ia$bWtJY*(85U>}$=ERM5F59u5A@5S%a0-y47JWiP299mO50^0_dc=A6RX z`Ge88k;C&;llY?6Ck1_?1;_kp#GPzS6!N7?tvY0K@lntk`PvyesWY=P)YX0-gjSC5 zC?L->dol202RD&s_M*z=;IZTR@A=3SB?zW+J?u&4_Y>>I?OeRXmPpA@Vpj?$ z{h#7AxaPrMSk5gAHd&V{EySA}itHy*n0^#I$#tN88U_-iz_%+O+psP_&{Vj-nBieR zKMK2LWcFrm`PoQO?EEDj#uMKX2Fk%pIOcpydJIo|q^Sk{3xV@SVcf&pJQAUK8cB_3 zvMfDCkpgl1<@p^CUK6vl_#7W-7QI(xcDN%)g*oJmMu8@P;%wG)FWY6vE5;NAgm{?9 z(&3iwrQine4ai<(`lUDzwM%v)3Szlj#a>k-EyG3Kl2{Z2i zINO}?=9k+(re}?Wcga0JT~Z22Zdk3VP)k)aj#Yon@JAMS>hfk?{8(&te>i5N*ZNVv zb{I+rKWnIy>XLsD*>^eBB`J8#52B|8DN=kX^{_-+vL@06D>q-A_~T~eJduE?wnz|`kiIJDT+p8#UWe} z!szYpvM@9$=FGm|<9}h?uqbT9glZHOdU0@pqdvSWaf{;i$URL2?uf8tqwK{-Q&)@d z5T?@&ipT(Dr5>w8k0>aK<>x)LyokNyi|uybAT*}sb#g~3A7{_oc@wmxcG2to7_8Zg zJ`aU&BMp??)%9{1gdy!*CrS~DbSloegq9Qf^Cd)bP5IziSjsbDvz55=+k$Tx)+rNZ7M0&_pk9627UTA5JdjK(SdTLS6 z1J+zr)nZ}LaAV51uPYAFz$(p}?Q?kN(PA!ygfs1y`Hjxj1^X{HU|)YPasP!_UeIY2 zM@m>C=Pv;ah|LIP<+~B=K>J(+b`Y$?#vP+>%*OnmS)oCNk@~Vyf=HoJIpq(!@CS5y z0zfBax1H}_|1ZWPOBV})PWTlCB>w_BjjICC$#&StDC=K_wM>RUr;dl8|IE$*o;riZ zOAG)yeQGMRBm9?PISByhB-a@8=+AEC_n9g41JLQUu&0N^zYLos2d<^LyADMQ|k~2==G{2U!F6_7j94uFZX^`}0NrJ-#Ff2H3zN!2Y)$ zf`kBaT*hgxOmz%QQ`=CY70@*|2RXGIr(XdGJsNl180d<%loo*=r2(`^N*}P}NFc5I zFWRL9*uNYo_Y$P-zHCHTe|l*JD!2G%6Vcx%3JzQeOEZ1z&fd{ePyuf?B#4*=!{u=V zLmG1kf4V-*`!x+x8dpy=&9ZqdBB=fL+M7B^+{4|vYQTH?`G- zyU%<9OaMY5zXMRN)<*xT4~7&r3z^G-*v}f;u>xdm9_==j4R8<)xz)r|3PO%{YjC$( zA?nzx(tZ2u7p~Sba}E=6g~xdUw$C9EuI_7PVn$dXWDkH^AbBrM{3XA~3l78}^3@DB z4y5=FDJy6+%{qDs?IF&YSSe5m>WSo{S}cdU1gf_S3tgTDK=}Fs6w9B$^)BEZY#>cE zHGtzGqoLu&dj=pgb47>5`gr&)P>|s>@Vk#o)N(Fa8oIQl(v6Tg^eWzi&|~2fXbpY` zw7iga9Yi;7846R2i+Ue`OZ*C|??u^LVNp;{6J)&>{ZZAKodJbpm4m=p`BrnUHvILi z$`(grc3pIZHy(e@vfy8=8b2Z>-~bteS}W;;?gc-9@F3v{70zX3B+S0ndgNJ4$t$sFGUN#WMF_rSc<2hC=oB;EKOm6KaL4M(PY*bFv6 zs_!Bo4!a9_^bT)0!bu@Vi724Ew*iVZui#HMEmDJ{dR9fHJHN&wgLzA5j$O-Q>+9;5av();%BlO0!TNO5K8jd$0zp z&?97jfVzIn0<=9*UJELh-R{}wtx>{nc@=atCHh)(0?Da zu<`}Z*ic7@gsMI_G$Kvdj38?hH8dapnUV1xF1H$(3^&L)oqGHAfjFM;0&DiJf- zC>jgp<7ZfqKFfIZ7{-?vt?Jtlj~vP0ry5~o^5}Hj7|+X`>n0WmjHZd%6$uP@FxG8x3J%H88uIXJUP5~ zXEZKd_>MFf$UOBK0w&JwsFT1ieyU)VX_o<(U?L}EhuM0M5z#l6((S+^Jr*4bVN=_n zL0E;E@M^}L`cL;~_4%xBu6_e(zA>CzWbjR=%s=48uvVq9*m_GuKII78F1|b4uBiJ4 z9!|ux8(@~@yG;)6N+b)X!R63r0LWY@J-UbJ#L;~GmlBjYN3xojxb%z{<%V9M&yL;a zQUt}((M}Pc2_)59VwtA^nHB<-8%jrxl>voLmlwzSDn67~VM#xn<_o;bP0t;(L_FRS zk^%cU5l-yl9(d8^<-$#UG8N;Lx-$i^ldZt|<$-;PVlk$8Bm-;`)A(&!1CN1pEvGR$ ze=)vi|7D%938P}My=lUW8po*Sc}k|f5C=F10XfZ0FUG~=Rh-J3EHiUJoc&Eh7(ODO zNV6SLwm3sVlyb$(sonn=uI1Qrth<~eOP-)-1c-;wvCW1*-|kdJdXUq%y z0kkrMs3%~3Q&ZA0rQ)E$1S`9@08PMz3Nckh(ohCD86ma%t9bd$C0w79%wSk1%bI2W z)Zk+wF-Uk1#hFL+qS6pHs%i`O@XLVPsNshZmbWT<=Rt|RB9V#hx5(Z}FnP1K4))9~ zjI)X#yj=TAV~F4o8#34jn6rBua+5sU;$*Dqj}P~nQ07Qgtx?+c85->exs=V|s~RB!bv9m{mrh7$1; zxN|&MqAbZM1N~Z`Be)2N$LZf#{9d?X2!qXqH5unoL1>M;*kR+@g+vb(|7Dwc4H*_w zS~u7ze2A{MDdo=+bfcUDAJ7WY*xi(gtr3lo4jvZVPVJ?u(|J!fMrXCPNH35S`~#v_ zATt$^Y<{cbku1)p2gLhj-M~W@_Uhy>QXdv`We=hmfN+ufKht2d-U8)`g#*|yX%Xj7?tkLV>f@jOI(orP7 zyS1KZTK0|%rmc@;=g>P$-4O82-mc^0GPTNY ztx7QY)?>IR0fA+4z$?z$pFwxFOkv}v!YLWI-}uJ0Xyb+bty~r#0DA1W56HQ z$P+dVg(y53d9gk41)ou28pwrl5Wx~oUIF`e%p*GY)96|UIx{@kEY6?HvV5!>Yj83V zlwy*hRpd@Ng_>50-+A;G^BB#n!KKx7CyjQX=VrcN_(4;I&}dMvUC_sl`#er_Rb&4B z9eG&}M>Wh81BlL_%!D!ctvr#AXKr?P0K0r6kD`m?E!*9knpbQSS@CYHS-7h3!3^g; zMJx(z?YpeP5tRaq)a#KCQI?0gb|G%&h@{(>?b{J+7U^bBww*|DAzE$#PQTtuzfCDBu$y`h&GcCG*J!Kwn%4Q6Y{)1rr zzLb9s6k|X&Q^a#8>E8yH%mhE=!GHHJWye4NXMwa-RonB9 zBFTTL=;)Bmzz;iQ-~YuI{rR;dBJjli|Ht|NxyMNi+F)1%g@t>tAg~>LmU?}66x5ss zU%8Z~v}I91pTtM9)|0mXd(P)Oqo;D{4d;~p(-{KDXLVb%sYozywG3;0#n5@H|K`0( zL52GNouB(FvazqiX#I8DMF8H8cCks9xW*Q}q%TM@Upat03W|wL_Cn$d(10+R@ z--2S?DAMl#@3o+h2+5=DNleia80+u%209MrlLs#>`Jl5=#lO4+me3-hnydr+Gev*D zlo~yd&c=egVvzWM4IBJi)^v5nrQY%6=y~c2U)p4h)%T|!)&F-4=9sqccNV^eAVSN} z8J*Hf-L3hmA=wNh-h-6BS@#{3?>uEmfh^HEz#0t7sln8Q2Q1Ff#Kb^BX$R`R>gFC` zgIQqLtH>TYe!?^aV2XDDYj9b91nPbe#4EZJ0GVOfno!ufj?)sCk^>QNMUNIQL%Ep; z-5^~V=(z94V$prPa>4zaP>z2F+|fUPL97P2C%C7CJ4TEvavt5mN9pVID)uyn@qIPU zL`i?(H>C?S-}Ux$gSuO7g_wt*yVnfSF*$V0t3bySfp-EBd4J!1L!%k!6UIfv$E28b zb@ZEDUqj*9J6|E8hBP5D9zUeGgbM2e^jlC)9~1>$td{fC;p_Wq(8;&)=pnFPXwul2 zkh4^Q@V>_%16o{m_ZonH=#&&o36#~4vAX)1?PC&jl*0%RN(H+6tX%5^4FdUHq`sX zP6mOuhx1@w8>9>tK%%A!&P%X^hJ4eLZ?suwL7F(zdlI#0mOnVRCf~Vv;QTUXG{?9_ z-dPq^BYA@!Neb!l;nt~@u1=c_k`w}zo~p5Y4&y+KBKFSWP?U|Mpo26o5HUO(PwF||ZvV0evTjV3I(@E6uCrU<;y`5z-vRK9 zJ>bxwhAX987_&<2OWm;!AcyK7Jm_>GaF>Ek=OsD^A(DEKZ#X7}m^eDB&h%c;8z93N zx=1Je1#D2|7QG42hIo6su$Py)`Ukr!Z`ZzFHm?2h@j-R`psxP;qkHAw?>oFZ2^M=d zjBjmuHSUM{6Ih&_M|k3?QBZT8(pTCc2MkoL`p&D!Fx#(srr2*%j!X|YvCe)_yy-s? z5pV0lrAN>3L6+k9i>HHiU30GK7ta~NcV5rM&`&_bLNyfJj7P$j0g5fxSr9i+=-qh@ z8Bqb;MCuk;v(Ao#SXy;6ThHRYfHJVBpx#g!avGW)-;&sEB0vOr-mzC{R zug^U-Ga{>wt*AUQfis;V7ZY9ju|r*&?+y^zibJ91*=L;>W#y0I>zp(h9Rb&hw?aCg z@Bk3#<-TeKoE=82b!t?5 zyD4Ih;x7L_cfMuF>nU-`!5)BT+!&BMRq?fC$_R-btU&NL&p->y*Umco=r1>fV>3GbnF_lCVe~(M2#yba;6;ic_;i6=sc6!$ z>TS6YFF3!EzC(A#iX5(ZLkf|olGqT>p({7?$YrpjtoJ}wb9 z6?dPvz=;zIea|`dEBAjfpRTDHEI$Hl9_2vl#FcX?4zd?8e|%6xE!6Jn9#&W02MLyq zmv7Gwg=6da zlhc}$EzZaCEMFQyL#oiMm~JPXT_^+sit~dy66Y)uaG1?aL%Ec`w)F4!dM)YSJ#I)q zOY99rBf~*kt7*HN9+?$k1aG>lCUNCnIPL}(aE0X)i9Q)00ZPyaUC+oPZC2GQE(VWV zbI!q5fCgY}2HwdXamd!d%;zEFi8qi*TI7<_!)p|*L|IYHV}Y(V3IP*S%aVx>(~Hdj zcM`oV&<0G3I}~OJXSpUd)SrnezM>;xvYV35bcTl)3f2$w7cW8HjvHe5DsW0MiUziO(X@K|4KVu@^ZY^+4@dike)i5Kag5dbmuhh z{_0&@K6CR0{@srCC4<$bRqw@l3E-71z|mgF7haCzFSr1on-yoGF%OESD4gpSsn;(L z>J<`ccBn~k^xJ6R%_sA|PI@OqJa3C|)$iri<~UtbgT7&ItZ&gMU!}IRVi(IGSJJ^l z`*10w%?{7k4rg~2B+WC;>*G&}ck`j-2a6JRu2p(f!SV%D5VT$DYfZ=QM~&~b&$BsI znP=zjItF9CiH6PN(|l)_ZMLtsN|R3GGhaeOk`qBQG4Zp-o2+L&gw!Dj zte>KV1<3L8hP9fuUgV=PM?mHKL0LzNFh+$V{w+X*$x{UPeJ{4_J;$z(4%O8xLC6pH zTx@g)?<|R*ZG}NCOGZ@E5EZ6sP4Ht!ke%-UK)`-&vn2{Bva^%FP>3>@UPq)9Fr zx^xM6oq`5w*}u%u!bXpV4|(!adzYoSxy(^;1-UZ3gy#U@r)IflE?IsU0McBbPJ!zN z1as=$=&f+oP)K-xlT4O^==W`&4aX^#cP0X%tbR1 zd9`Cm?|+xH-&&~rD0-_v)kOeCw5O=pgRXE!(kY?J;`PYPuk*Pt0e&xkiKdLWi%E6- z{vs?dDpp+eEX<3e`>iZt!ho(Ox!6;$Aj?^yTk8W6y~snhqX_CqJlSg$xt_g%+`Pr> zy}CoypZ$T}ToPAD+Ee-kV_7?4iU>E2c}=y5!CdD?)psRXBQrySx!l|+nyt@0jRnxT z@lX4(23&Hx_2paXMM%RTnrB#sC8a>xg&mhw?d8T<9>qR;`yOV2T4a^;Ui+p?mP-;|TYNN@v>9 zOw3qJC_KJwL2Dr;T2ch%%-wQYroC5t^OszByb7to`B#stwW9P?%3rZVpV~BzW&i0M z(%|@Q$WxKdd>ntK)&Byv>r8P1xjw#u7}{a&9P3!VSx(bRJX1e!c&BAP5}YG6+vW9sM)Y>Fv^ zO2?MP;>M3nU~AAi`>j!+RX9C_#^Vftg;k)9o6s(f&&gHNO~d&O@+&Zr4P|oN&xF~R za@l%r4~J(7#g~C5CG_%9*$;Gn;;Dz6qNf-gL^3ZSsT=E~W0Iw*Q2f$yBp?_21bS|G zvitB*y`^qBt@dd}SDPG$Qd2d}=c&UFF($gYkm-26(S zdhzbtjMC|qKIc|dQ|2bJEx~^ z){XPb&nz0z5^^IV3Z2lHZbhklUG(KNiUb-i&5r>#AB#@;a}OY?Z$1dmAP^H*mECwp zH$;9&Y1bzMTf28+Z~evdsr6RI-5M*}7V9n2%k31ihmY#3UQ&z5AC%SH{k3HAnA*EK zBHqo)Hvu)5F&F3BFCh8$$M~x^WYQfFn**z2TW%?pv_h%m%*AIZDXeJ|OB~}@lSAE~ zm<6e{8z|NkN<;5tyrZ*(c6kO&;)M21P1VqIDI=Wd3M|kc!|brr3OW)=spj?C?c9+p zE=jrbFdliA$?IC=-7NQe&0g;}eyje;TAsIgpKj~^b&;kF?(JQhNkqrRTx=WXom(%g z(eTMf=+fU%NZ(uk064OONWODMu9KS#En9Q6QA=>vQag=nM0XGGP_I-cmP?*>GJ>p? zHOe|y2<&{U_2e1l5qCpRQTO>VNLEqO)aMiX@7KgW_EuED$qh5)UP3y)#Xh4t+1GqS zZI#jOjVU~ZJVXF=df5Wqxl%pfN_a^SN_aiK2M3?^n zyTauCXnNq!R}T6$uqoS`<4YHUc@sc)W%%yk30DFy!|5f$VdxN@!z8_?=<>*;*DyM+ zye-i;cbHa$pk=JhtdymfPv8alR+C`q$LeqE7{^2hWFyhQ%rSFJ1+^x1IsDdJX|>4` zq|dYUHpNYhzn#PQ1W~5D+coI0zr|?ZFUtM+FtV44nM*_cHLN7gG-TaN-n+Ls`&pP^ zM8G~wqbE!h%?5sWed0hhp!)su``uDj%UO8RVmRvfCTe(x(8rIhpPxRuE|q?S98QYO z6ie$3$Cu;LaESE) zm5W!D6(aGlP)a3KK!VXRqI>b+6W;A%mDRa*bq1QF1dSKBDNL^W)V-I#zWH(P<_z1+ z*PtI+BENh=mTG*hmK>vPM#k;J{wZ#z#5G1y)*?inQ>9)LgF&?%4K>XOGbw+}S90D* zMzLTDcR4^RoO!pAl#IQ@U)};^UgvvL0QOki02y}xaC7S1$2Y2I{rPmuLzR2oBLuJ0 z85?uOGERxSQ{Jkqd)dN%Fu2qHu(kqc_t{o;LM%B?eEb|YOq(-wgla^bfjM53A}1_5 zjkG_P01=d-JuSqVVl$RsU_KZdjm9=2sB5~G42B{}^bRFdYhVe@tsD4MU;RNL&*H8; z+?x3NifWIp|I{}I8b(_EV=+;K0 z8O`!bi+5?!JHIA&Or^axYPyXeImNm!@j;JvRD|_tpT+glFXgK+Z5uYmuKgiXm_q6V zq@f=XnhK&6#xaburm049385iid1j?=#s^L-E&Xo!Y9OnAPN#a+BkE>_gCm(T5_|&- z1GtcR_ya4-bLrQy*3k>-90DEt#>+oqE#m!M0)xAxSI(-ks6wDUD{_E9-pP%9jiVSq4)@k<@<&$%(&}jb)y3$eNVIg1e+HA2v~c~1X7OS2t)6ZoGj{l=@pZJ9zB{4-P6nohwhSHc^_vI{nu#1 z#9y5=^?SoRi<*azM;Bi`|3O)xqiYT5DPszIM(la*>Yc(x?@jz;!dpMLL5ih&@6Tgk zOX5l?OjalgM#CGyP2*uVJVGZ96E^V%pSLyQ?}G2WJ&ny(=4rOz1dpyg3m!Urnbh?= ze*MsKZjMAuqU+jcC0EgEruWUkEd`h(wH@M_ z`{kpiRv&4b^ETcaXBO5xut@1?Aq}+UxaVYDADR{3Wsjh|(``{`2i z30{O-hF@LUkXA7Uy_y?#-7@v6~=fNItNMxR2pS4I-l1h^sD3dzP#r^55 z^?`pc)RUL^XH|D|31ON?_1Usn5G7yktyBb=tz1_#NSgR2;;p=VZ@RQ?B6avSRC4aGje~ig z29)CbnBq4lIsCF8rK=)i`<`8Fvbr+2J}RR5T(#g| zf6&Zr|0zyluJvK^K^J95N1onE^;+V}d$-GzMS@qcYU{EznC*L)#oxM*)sbtUoL9bC3<}DgzGOkFS0k2mUIyYt_G@bWD zY{m-0?XtTE{788|{qnLUV8xNxWl-UE8g*m%R9YCR*{Ci2kp)=GJz#evFI%;~GatVzA83!Yb0cNB@>)$C#)tbN6?wb-4?H&xHNd;+gALwP(B@W-0WxJX=X-J*)0}G`VEd4QMyxx# z$&3o}95;t(33HQkl~G2tKJ*;Qdz1OyHc%*ECSRcrs_GL9mi$3E+n>$Nau{`{UAOI+ zjF3^+U(TY5LYH~R&`CT0UT(pkkbfZ4r3?GTrM!@K`q*LUV&}bcW@MaQ@d2-j9FMRu zS?^x)UG`mVsay+~oiiov=DT9v&gbjNKfB`ksw8)bgKtsyT;v$f0ar_6t98qbt^oKl zTxi5+dV{%O?33s_?XJQ2_qU8XIuV^)|MQ{Uo7VrIPp!{QLQ4yn^^v7|w$NBKcWe8` za&h4er0}f-YXM7(2Zs0QmYT>0weD_tIWBIaqAnE$bT&(5mLP_azrXNO8@CN5Q#T41 z(c&XHB%f*Q50EHSINEzETGtS-a$W6##Xv)rY+W^Qzj?YKgE5yT`RA{%O@|KO;4dn$ z<7xJONtpLg-%jlju^Iw_u0JYLL~1KP{sgifO$K(2yfBFotODd&_?U}a4puc<{b%|| zvfnr6OBZ~kf*szhH76rU!Hzu-0YD)%Lw zbT_HrAMbv4FnEam!Le5~V((H@sE5y|`VAE$`{-V{HW1|`g>dQfXptY;kB;QE9Xh6*t&XEj++zApxX1vttZY4F>*!h6 zr^$5__|X9;>p-M_@4opGtR0RJjAuA#t$Lw1SDx@i_&au4{q|11*O1~P(x&G|CA0my zuRjgfuVwV1q$dyfno)4_>^$yiov3;RE6kSkDynW96enlo8o>M!JMyur_3Ed5Bvy4i zO{8-Gnehx6EsKr%!TPxdr%D}H z?POV=#A5sF?=9Zb73br$h*jCCiRaLp26K;v@c8+-IVbO?%Sx zmB!xZ#1}`k>fe%ND#C>(>IyhE$@%zMz!}x_+x_PU@NSv>^(lCc%9zXnhjkR!9Jn5l-L==yFR_S zmL3VPi6_U2egsZmC^+=$YSPMd8ToYm3O;hywP6)|xqRychSw=vHAMzl}S`@sU!{FD{Lb6(H z#=FU21>wZ-@4lD4Yx83g2Rj4bl1!+`pOUNS+@{XMl@`9%lmM>$(nISM3JXeC-4?(xM@ypRd~2LH@jDrB}q#WylO-E z^_~pxX~b7$nOm<@X`I;)XLuZWj0@r<3dff@;#)P2I_Wj+?nqW!&N+tKzD5eA6cKwh zZ`0?@wXktGi&Z0=y@*SkN3McUsCjw`y=-F08pySnbfiT3b1YB%qk7OwSyr4f(a4kS!g71{<%NT7hA-lM@N(7rAC<2U(GF${ z9FM>!*9<+MzdKuUYw(`R83AQWJ;t!@!MA|5Yf(@k1g zMRYHKH0)t=lY=?LNWQ1=m1p@C=eLdI^6DV{({`dt!XPted6uB)#`B#5?frQ{qTfM7o{L^EeJK((W`g zPBld75E;~{IaN9_u?&WyQ4`8*jxDXKEYT#hfy)MlITO5fT#Q%bcs( z=CvO~bGJt$(&)}Ib=LQ1KC6mYVs8ahUqr=ca1v`6&tL9mU3m2|${3P$jAx>sJVhJ9 zQec;F)FK?lEkuvl|AlDWOins%hm_H0HZXHL^ z3jE=R2vFDkT=wC?V^71kzh3(q)~uV^3&zvT)$kgN%$1Q5tILX4WM!xp?>h3O-~(5+lX_U`r`dFQ~IYQEx^XlS|4WCi3FymtgQ zS9_Xc0l2cRV7NHbCYF1UY8{*5Kgy;aHPNg@z-lFmV@&aM?s1o(!&5bxsQwi^ZEsv> zqoX30tp_BD=LfhzsNM{^!aWkGeVQz9kv56Xow9In`xfK3{Uvl`?YAFoGwBB0OfD*a z(M7q&d$Es}B1G=Qx|Eb;WbdKl?_(p;ohgKmQtsLt&fr_J(OxAnkGJm$t?8KZ-5m~& z>Y9^1zvtyQ2QMT4_28wF#0Y0g&5A?>-cW6JDeu~{`3uLU^c|OWx5z*@u}j_(+)e9N zjDf%%z&v^tlXXbr((Q80TL+l8y5~0Rog0i)mSY{3@T#aY5zakl^?G(7ZdqV05==nu zLA3S`LB3O^cj+T7l;Abew^owpgfraSpXu!A&vX}NM|^*9|K+3o{$}0g!?EOZ+xq$s z3P&{uSzj7f^Ad3ta?;ilQ`(T#RR`GTzn~X<1~FD>$N2O2unAj$4`hyyyb|`E3MP|k z4I7!aNz!CpoPQP9S(sco!&Gy5AO@U)dLPhJD~-R@3!S=pYEtTz*L=~wrhcnu)ht$i zzPSGUgXw@rL^0~G(uspP?UC-%Us|NS8$V>QI|t)Wk*w$)R3diHUTOLv4XNipxP1T6 zW(qI&6q!Nhty@o1O34{*&NQq{N-CI*EfSw(S`W}6>v6x*pE$+HGY5yT+f>)1p0XZN z@|23fr`c|JD;0j=L7=UD+nnxIK?@hq=B{)8X|v)Iz%C=Oq>q~$OY`Vjk#_lPCZm*( zC?U@S)5|BsrCMIDSaR(r`BW|j<5lC1^C4r5GtSW@)5JyEk8|%E-gKLFL8xL#hJ<39 zFdLZrUB-E=#&4_E=mI*!XNS`0y>01seIsO#g2`l@bP5Kja-0rJGH<9$7p3fBH=OqcRe0 zEjj|nPm6DM?J(GP^pulmC3}UNfn}8k$Cn*Pz};4IEOUv*8d+#z@RPp3&o|rA#eM)v zI`3_^d5jAhz8S4mV~jA9L04?eKFSNW3gP!r#kdaZ`Zld;{UR>>`@8{P3EHPQW{U%U3a2Yqt--GrvdgWup9L;%wnw=f*0pslZ zXLVQnOD9pRGHSx#k*|LRLZ7~u095^dX7W_xeetUniSx<3+~xq!^eyVuk;=Na;(6fx zCzcQ9EmWRR-OATd0j%zhTl?MiW^dHeo#n2coKx@#cxmIr)yv&lzCZQ8JICSRYL|!= zcYg*%|N3X0SG?4%w|RH)FW+=MCl$A!$75_ca<&{6c(kK_X2tA2vr|^D_HDVY(Oyv| zQFL;H(w=QEZXEcn_u}S^prjz4H?NmJJiMc?;`gCM-azLMC6~)5tgip7D-nC>e(3ES;h$3;wsRg9DM_DTylyW?;+dYeM@1g- zw`sok`AF8^dGaQeu*x8TXP@(|?bDi#)2x(Sosa68_1CP+Tq!Lq!xy|T&#$%Q@S>#; zWApaZkp=w7k7ks;%SlO_NW}amz~Xdp`W5 zqW6yZUh&GPLLL6UrUCmG&vS2{U?t$(v?3why8e^)>qCD$^}maM_xoV^`MO|s=XaHR zRUJZ|&t7zt<}7-y6IQXm_x$I)n4MamWY&G3z34P>eZxgz(M$ZFIQZpUdQx=v*Z7;s zwQ5JQJmaxY))LxM`I+7Pj^ahpKYw2|ytu9uW%qBEqREo%hvfnvA6UA_u5s-a+xhC` z#zR7K>n)!}cx-#~a7GAEp^T!kMUK(b#~-gbXgF$|+mad*qEP5lVES^hr{3J(?>4VD zG&7Yx<}DpA!V~`PPt0xLC~|1v!Q)4HMYkm!KJ%VGkGuVP)k~!bT`LYu{avjR$+h%j z+@o%$`j}hRD|d=Y6yN#t?_$`}x9?6Wd0Wq^Pu#G?NhIgO&)Q7)I3B(^m4*FV_P7Lj zR(1p8EX2*@oojzj{uXrg&5_ zWmuh$+;e-8!94r<%aj+->TNAkP(9+$yj~6j^z1u7g z|CwRjwa|0swly7GJ31ezy-{~LRkFxfc0O=PuCVUzkDehK5%=`#N@wWGexJ4WUvAgu zm;=U*o+l)-W1e?BNq?djp>^uoMeY5wQ@oYuCr15z`{cx$C!cdKx83<%rQ*FfCdI5G zO*{RO(J`j*`>FR+_(OL%DG2D#pPJvwV1G7vg^iDJjG&y@d*J#o72EocCo-xd)f+Z! z$T<{!?aMpyM~i0IzcAXqK5_r=M{O7T4k=F%4P5wP()^jmo*^fA+>a(*Jb${g6@5uD z@HoJyrw_Tl!gd;<1B;PAa4GV$nOaC&_u$KwHH29NL?6}bZ1YjL;ELF=0^hcL;Q!Y0 z<7y0t97G&AceDgsPClH%&|bh@ecd3wurd2HQ}~h{4skyfEtyywtrs3L|G)9V+ExZe zCKe6>1&0O*V@B8mpA`i@)wSa4Fd?YiDkgWQR=ceA^A_}@>+w^tbc&CvUhb7v+ Date: Thu, 21 Sep 2023 22:24:18 +0100 Subject: [PATCH 112/209] updated welcome image to use CodeIgniter 4.4.1 --- user_guide_src/source/images/welcome.png | Bin 176104 -> 146354 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/user_guide_src/source/images/welcome.png b/user_guide_src/source/images/welcome.png index 63b9108d042574b3f4b37ccf556797b18f659ba5..d3a2b3c383771f5d9206e05d5665c74178acf4ff 100644 GIT binary patch literal 146354 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 z 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 U;k&_u==Z1nZ~@BR#v<~X3nxICyK!$UN>Inf6 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 Wls*d^lmAzlCoQ2MUL$H4{J#KkhSq}s literal 176104 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%0AGbbEhT^~60 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 Date: Fri, 22 Sep 2023 09:05:16 +0100 Subject: [PATCH 113/209] updated debugbar image --- user_guide_src/source/images/debugbar.png | Bin 28329 -> 23357 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/user_guide_src/source/images/debugbar.png b/user_guide_src/source/images/debugbar.png index b2955d94902db50e7a31e3f27a48646b3c1b4dfb..1661e893aa3d13270adbb5e85b180b2d070bcb00 100644 GIT binary patch literal 23357 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 literal 28329 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 Date: Sun, 24 Sep 2023 11:35:35 +0900 Subject: [PATCH 114/209] fix: lang() may return false --- system/Language/Language.php | 10 +++++++++- system/Language/en/Language.php | 15 +++++++++++++++ tests/system/Language/LanguageTest.php | 23 +++++++++++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 system/Language/en/Language.php diff --git a/system/Language/Language.php b/system/Language/Language.php index 70d109e2319b..32eee39f2a13 100644 --- a/system/Language/Language.php +++ b/system/Language/Language.php @@ -12,6 +12,7 @@ namespace CodeIgniter\Language; use Config\Services; +use InvalidArgumentException; use MessageFormatter; /** @@ -191,7 +192,14 @@ protected function formatMessage($message, array $args = []) return $message; } - return MessageFormatter::formatMessage($this->locale, $message, $args); + $formatted = MessageFormatter::formatMessage($this->locale, $message, $args); + if ($formatted === false) { + throw new InvalidArgumentException( + lang('Language.invalidMessageFormat', [$message, implode(',', $args)]) + ); + } + + return $formatted; } /** diff --git a/system/Language/en/Language.php b/system/Language/en/Language.php new file mode 100644 index 000000000000..80920b2f16d5 --- /dev/null +++ b/system/Language/en/Language.php @@ -0,0 +1,15 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +// "Language" language settings +return [ + 'invalidMessageFormat' => 'Invalid message format: "{0}", args: "{1}"', +]; diff --git a/tests/system/Language/LanguageTest.php b/tests/system/Language/LanguageTest.php index 34313e8dfac8..5c75a6d9a28f 100644 --- a/tests/system/Language/LanguageTest.php +++ b/tests/system/Language/LanguageTest.php @@ -14,6 +14,7 @@ use CodeIgniter\Test\CIUnitTestCase; use CodeIgniter\Test\Mock\MockLanguage; use Config\Services; +use InvalidArgumentException; use MessageFormatter; use Tests\Support\Language\SecondMockLanguage; @@ -126,6 +127,28 @@ public function testGetLineArrayFormatsMessages(): void $this->assertSame(['45 related books.'], $this->lang->getLine('books.bookList', [91 / 2])); } + /** + * @see https://github.com/codeigniter4/shield/issues/851 + */ + public function testGetLineInvalidFormatMessage(): void + { + // No intl extension? then we can't test this - go away.... + if (! class_exists(MessageFormatter::class)) { + $this->markTestSkipped('No intl support.'); + } + + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage( + 'Invalid message format: "تم الكشف عن كلمة المرور {0} بسبب اختراق البيانات وشوهدت {1 ، عدد} مرة في {2} في كلمات المرور المخترقة.", args: "password,hits,wording"' + ); + + $this->lang->setData('Auth', [ + 'errorPasswordPwned' => 'تم الكشف عن كلمة المرور {0} بسبب اختراق البيانات وشوهدت {1 ، عدد} مرة في {2} في كلمات المرور المخترقة.', + ]); + + $this->lang->getLine('Auth.errorPasswordPwned', ['password', 'hits', 'wording']); + } + /** * @see https://github.com/codeigniter4/CodeIgniter4/issues/891 */ From 2809b1eca643d9fdc6d0b70931c77b29d87853a1 Mon Sep 17 00:00:00 2001 From: Donatas Glodenis Date: Sun, 24 Sep 2023 12:45:54 +0300 Subject: [PATCH 115/209] Make clear in documentation that setRules() overwrites any previously set rules --- user_guide_src/source/libraries/validation.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/user_guide_src/source/libraries/validation.rst b/user_guide_src/source/libraries/validation.rst index 3224961e0821..de7ec194a61c 100644 --- a/user_guide_src/source/libraries/validation.rst +++ b/user_guide_src/source/libraries/validation.rst @@ -311,6 +311,9 @@ To give a labeled error message you can set up as: .. _validation-withrequest: +.. note:: ``setRules()`` will overwrite any rules that were set previously. To add more than one + rule to an existing set of rules, use ``setRule()`` multiple times. + Setting Rules for Array Data ============================ From 1e106b36107ee32733b06c485a0d4ecb236485df Mon Sep 17 00:00:00 2001 From: Toto Date: Sun, 24 Sep 2023 17:42:19 +0700 Subject: [PATCH 116/209] remove duplicate `export-ignore` --- .gitattributes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitattributes b/.gitattributes index 074fc2cccc8a..4b9a73d9d0e7 100644 --- a/.gitattributes +++ b/.gitattributes @@ -12,7 +12,7 @@ admin/ export-ignore contributing/ export-ignore .editorconfig export-ignore -.nojekyll export-ignore export-ignore +.nojekyll export-ignore CODE_OF_CONDUCT.md export-ignore CONTRIBUTING.md export-ignore From 8f34416e796c116447d869525b4388625b0abe77 Mon Sep 17 00:00:00 2001 From: kenjis Date: Mon, 25 Sep 2023 05:39:46 +0900 Subject: [PATCH 117/209] test: set locale to ar --- tests/system/Language/LanguageTest.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/system/Language/LanguageTest.php b/tests/system/Language/LanguageTest.php index 5c75a6d9a28f..b235ebfa6d41 100644 --- a/tests/system/Language/LanguageTest.php +++ b/tests/system/Language/LanguageTest.php @@ -142,6 +142,8 @@ public function testGetLineInvalidFormatMessage(): void 'Invalid message format: "تم الكشف عن كلمة المرور {0} بسبب اختراق البيانات وشوهدت {1 ، عدد} مرة في {2} في كلمات المرور المخترقة.", args: "password,hits,wording"' ); + $this->lang->setLocale('ar'); + $this->lang->setData('Auth', [ 'errorPasswordPwned' => 'تم الكشف عن كلمة المرور {0} بسبب اختراق البيانات وشوهدت {1 ، عدد} مرة في {2} في كلمات المرور المخترقة.', ]); From 1b94c4ce6d679f69e675c035c30185c071d41569 Mon Sep 17 00:00:00 2001 From: kenjis Date: Mon, 25 Sep 2023 05:42:45 +0900 Subject: [PATCH 118/209] docs: add changelog --- user_guide_src/source/changelogs/v4.4.2.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/user_guide_src/source/changelogs/v4.4.2.rst b/user_guide_src/source/changelogs/v4.4.2.rst index 19f2a4f1782c..6da0e5a04953 100644 --- a/user_guide_src/source/changelogs/v4.4.2.rst +++ b/user_guide_src/source/changelogs/v4.4.2.rst @@ -15,6 +15,8 @@ BREAKING Message Changes *************** +- Added ``Language.invalidMessageFormat`` error message. + Changes ******* From 42970f1a9efc6a24ad860c9ff8b316c45031ef99 Mon Sep 17 00:00:00 2001 From: kenjis Date: Mon, 25 Sep 2023 05:45:48 +0900 Subject: [PATCH 119/209] docs: add missing message change to changelog --- user_guide_src/source/changelogs/v4.4.0.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelogs/v4.4.0.rst b/user_guide_src/source/changelogs/v4.4.0.rst index 3b11e6fdfdda..59092ccd9860 100644 --- a/user_guide_src/source/changelogs/v4.4.0.rst +++ b/user_guide_src/source/changelogs/v4.4.0.rst @@ -277,6 +277,7 @@ Others Message Changes *************** +- Added ``Core.invalidDirectory`` error message. - Improved ``HTTP.invalidHTTPProtocol`` error message. Changes From f4af1a971bd53edd818fce2f4ee20e830d273f33 Mon Sep 17 00:00:00 2001 From: obozdag Date: Mon, 25 Sep 2023 14:27:29 +0200 Subject: [PATCH 120/209] Small typo in validation.html Rules given as array do not need separator ('|'). --- user_guide_src/source/libraries/validation/007.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/libraries/validation/007.php b/user_guide_src/source/libraries/validation/007.php index b5f23c355a5c..c545e70c8e9c 100644 --- a/user_guide_src/source/libraries/validation/007.php +++ b/user_guide_src/source/libraries/validation/007.php @@ -7,5 +7,5 @@ // or $validation->setRules([ 'username' => ['label' => 'Username', 'rules' => 'required|max_length[30]'], - 'password' => ['label' => 'Password', 'rules' => ['required', '|max_length[255]', 'min_length[10]']], + 'password' => ['label' => 'Password', 'rules' => ['required', 'max_length[255]', 'min_length[10]']], ]); From f4620bdb7ca2e2fd1ccf3edadaf0928b51dcd607 Mon Sep 17 00:00:00 2001 From: kenjis Date: Tue, 26 Sep 2023 05:42:37 +0900 Subject: [PATCH 121/209] docs: add () after method names For consistency. --- user_guide_src/source/outgoing/response.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/outgoing/response.rst b/user_guide_src/source/outgoing/response.rst index 507e479b5f56..078d9d11042a 100644 --- a/user_guide_src/source/outgoing/response.rst +++ b/user_guide_src/source/outgoing/response.rst @@ -33,7 +33,7 @@ as the second parameter of the ``setStatusCode()`` method: .. literalinclude:: response/002.php You can set format an array into either JSON or XML and set the content type header to the appropriate mime with the -``setJSON`` and ``setXML`` methods. Typically, you will send an array of data to be converted: +``setJSON()`` and ``setXML()`` methods. Typically, you will send an array of data to be converted: .. literalinclude:: response/003.php From 310151c6f31e6f1300289585ac82b1486337f8b9 Mon Sep 17 00:00:00 2001 From: kenjis Date: Mon, 25 Sep 2023 16:30:39 +0900 Subject: [PATCH 122/209] docs: fix typo --- system/CLI/CLI.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/CLI/CLI.php b/system/CLI/CLI.php index 29f424d1ec53..ae1e92d7cf44 100644 --- a/system/CLI/CLI.php +++ b/system/CLI/CLI.php @@ -448,7 +448,7 @@ public static function print(string $text = '', ?string $foreground = null, ?str } /** - * Outputs a string to the cli on it's own line. + * Outputs a string to the cli on its own line. * * @return void */ @@ -834,7 +834,7 @@ public static function showProgress($thisStep = 1, int $totalSteps = 10) * width. * * If an int is passed into $pad_left, then all strings after the first - * will padded with that many spaces to the left. Useful when printing + * will pad with that many spaces to the left. Useful when printing * short descriptions that need to start on an existing line. */ public static function wrap(?string $string = null, int $max = 0, int $padLeft = 0): string From fd6e698ead721a727f1a3e76632586dc81de5d98 Mon Sep 17 00:00:00 2001 From: kenjis Date: Mon, 25 Sep 2023 17:55:55 +0900 Subject: [PATCH 123/209] docs: fix @param --- system/CLI/CLI.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/system/CLI/CLI.php b/system/CLI/CLI.php index ae1e92d7cf44..3fc5f32304f7 100644 --- a/system/CLI/CLI.php +++ b/system/CLI/CLI.php @@ -179,7 +179,7 @@ public static function init() * Named options must be in the following formats: * php index.php user -v --v -name=John --name=John * - * @param string $prefix You may specify a string with which to prompt the user. + * @param string|null $prefix You may specify a string with which to prompt the user. */ public static function input(?string $prefix = null): string { @@ -210,9 +210,9 @@ public static function input(?string $prefix = null): string * // Do not provide options but requires a valid email * $email = CLI::prompt('What is your email?', null, 'required|valid_email'); * - * @param string $field Output "field" question - * @param array|string $options String to a default value, array to a list of options (the first option will be the default value) - * @param array|string $validation Validation rules + * @param string $field Output "field" question + * @param array|string $options String to a default value, array to a list of options (the first option will be the default value) + * @param array|string|null $validation Validation rules * * @return string The user input * @@ -574,10 +574,10 @@ public static function clearScreen() * Returns the given text with the correct color codes for a foreground and * optionally a background color. * - * @param string $text The text to color - * @param string $foreground The foreground color - * @param string $background The background color - * @param string $format Other formatting to apply. Currently only 'underline' is understood + * @param string $text The text to color + * @param string $foreground The foreground color + * @param string|null $background The background color + * @param string|null $format Other formatting to apply. Currently only 'underline' is understood * * @return string The color coded string */ From cbeb86f5b6275e45ca3e0f4bd9a459ebd3dbfa86 Mon Sep 17 00:00:00 2001 From: kenjis Date: Tue, 26 Sep 2023 08:21:47 +0900 Subject: [PATCH 124/209] fix: CLI prompt message --- system/CLI/CLI.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/CLI/CLI.php b/system/CLI/CLI.php index 3fc5f32304f7..7a095b937fe6 100644 --- a/system/CLI/CLI.php +++ b/system/CLI/CLI.php @@ -258,7 +258,7 @@ public static function prompt(string $field, $options = null, $validation = null $input = trim(static::input()) ?: $default; if ($validation) { - while (! static::validate(trim($field), $input, $validation)) { + while (! static::validate('"' . trim($field) . '"', $input, $validation)) { $input = static::prompt($field, $options, $validation); } } From 902adadbe46ba965732bfb832fa7b8f3e704d2b0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Sep 2023 15:20:24 +0000 Subject: [PATCH 125/209] build(deps-dev): update rector/rector requirement from 0.18.3 to 0.18.4 Updates the requirements on [rector/rector](https://github.com/rectorphp/rector) to permit the latest version. - [Release notes](https://github.com/rectorphp/rector/releases) - [Commits](https://github.com/rectorphp/rector/compare/0.18.3...0.18.4) --- updated-dependencies: - dependency-name: rector/rector dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 2258eca9ac4d..27e77b515910 100644 --- a/composer.json +++ b/composer.json @@ -33,7 +33,7 @@ "phpunit/phpcov": "^8.2", "phpunit/phpunit": "^9.1", "predis/predis": "^1.1 || ^2.0", - "rector/rector": "0.18.3", + "rector/rector": "0.18.4", "vimeo/psalm": "^5.0" }, "suggest": { From 8eaba9b0c4532ace584cbc49114ca48d481dc42c Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Tue, 26 Sep 2023 22:40:57 +0700 Subject: [PATCH 126/209] Fix dependency set --- .../Rector/RemoveVarTagFromClassConstantRector.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/utils/Rector/RemoveVarTagFromClassConstantRector.php b/utils/Rector/RemoveVarTagFromClassConstantRector.php index d780c8647cbd..2393516f508b 100644 --- a/utils/Rector/RemoveVarTagFromClassConstantRector.php +++ b/utils/Rector/RemoveVarTagFromClassConstantRector.php @@ -16,12 +16,23 @@ use PhpParser\Node; use PhpParser\Node\Stmt\ClassConst; use PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; +use Rector\Comments\NodeDocBlock\DocBlockUpdater; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; final class RemoveVarTagFromClassConstantRector extends AbstractRector { + private PhpDocInfoFactory $phpDocInfoFactory; + private DocBlockUpdater $docBlockUpdater; + + public function __construct(PhpDocInfoFactory $phpDocInfoFactory, DocBlockUpdater $docBlockUpdater) + { + $this->phpDocInfoFactory = $phpDocInfoFactory; + $this->docBlockUpdater = $docBlockUpdater; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Remove @var tag from class constant', [ @@ -64,6 +75,8 @@ public function refactor(Node $node): ?Node $phpDocInfo->removeByType(VarTagValueNode::class); + $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($node); + return $node; } } From eb1a95225ff3684437655318830550caee1fee71 Mon Sep 17 00:00:00 2001 From: Paulo Esteves Date: Tue, 26 Sep 2023 22:14:43 +0100 Subject: [PATCH 127/209] fix: Services::request() should call AppServices instead static --- system/Config/Services.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/Config/Services.php b/system/Config/Services.php index 10972bd84ff0..5ffb9e049c46 100644 --- a/system/Config/Services.php +++ b/system/Config/Services.php @@ -521,7 +521,7 @@ public static function request(?App $config = null, bool $getShared = true) } // @TODO remove the following code for backward compatibility - return static::incomingrequest($config, $getShared); + return AppServices::incomingrequest($config, $getShared); } /** From c5e62f9ec15f7a044edcfbdf3faefbb85b72093a Mon Sep 17 00:00:00 2001 From: ping-yee <611077101@mail.nknu.edu.tw> Date: Thu, 28 Sep 2023 19:08:48 +0800 Subject: [PATCH 128/209] fix: fix the testcase error on mariaDB. --- tests/system/Database/Live/ForgeTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/system/Database/Live/ForgeTest.php b/tests/system/Database/Live/ForgeTest.php index 64bb83772169..0ca737acf975 100644 --- a/tests/system/Database/Live/ForgeTest.php +++ b/tests/system/Database/Live/ForgeTest.php @@ -941,7 +941,7 @@ public function testAddFields(): void ], ]; - if (version_compare($this->db->getVersion(), '8.0.17', '>=')) { + if (version_compare($this->db->getVersion(), '8.0.17', '>=') && str_contains($this->db->getVersion(), 'MariaDB') === false) { // As of MySQL 8.0.17, the display width attribute for integer data types // is deprecated and is not reported back anymore. // @see https://dev.mysql.com/doc/refman/8.0/en/numeric-type-attributes.html From e79250e03cc9fb5b829dbcadb9f90b719506c4b1 Mon Sep 17 00:00:00 2001 From: obozdag Date: Thu, 28 Sep 2023 18:23:08 +0200 Subject: [PATCH 129/209] Small typo in email.rst Small typo ('your' changed to 'you') in email.rst. --- user_guide_src/source/libraries/email.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/libraries/email.rst b/user_guide_src/source/libraries/email.rst index 1112205ea352..33386bc8b17c 100644 --- a/user_guide_src/source/libraries/email.rst +++ b/user_guide_src/source/libraries/email.rst @@ -367,7 +367,7 @@ Class Reference :returns: Attachment Content-ID or false if not found :rtype: string - Sets and returns an attachment's Content-ID, which enables your to embed an inline + Sets and returns an attachment's Content-ID, which enables you to embed an inline (picture) attachment into HTML. First parameter must be the already attached file name. .. literalinclude:: email/022.php From 72825b23deb3931c70986a689926603243a9ae53 Mon Sep 17 00:00:00 2001 From: ping-yee <611077101@mail.nknu.edu.tw> Date: Fri, 29 Sep 2023 11:25:21 +0800 Subject: [PATCH 130/209] test: change `strpos` function to search the string. --- tests/system/Database/Live/ForgeTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/system/Database/Live/ForgeTest.php b/tests/system/Database/Live/ForgeTest.php index 0ca737acf975..e968ce9f5030 100644 --- a/tests/system/Database/Live/ForgeTest.php +++ b/tests/system/Database/Live/ForgeTest.php @@ -941,7 +941,7 @@ public function testAddFields(): void ], ]; - if (version_compare($this->db->getVersion(), '8.0.17', '>=') && str_contains($this->db->getVersion(), 'MariaDB') === false) { + if (version_compare($this->db->getVersion(), '8.0.17', '>=') && strpos($this->db->getVersion(), 'MariaDB') === false) { // As of MySQL 8.0.17, the display width attribute for integer data types // is deprecated and is not reported back anymore. // @see https://dev.mysql.com/doc/refman/8.0/en/numeric-type-attributes.html From c3c170e644d1812b788a1d9eef61adaf1e9d6371 Mon Sep 17 00:00:00 2001 From: kenjis Date: Sat, 30 Sep 2023 09:28:52 +0900 Subject: [PATCH 131/209] refactor: if condition --- phpstan-baseline.php | 5 ----- system/Database/OCI8/Connection.php | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/phpstan-baseline.php b/phpstan-baseline.php index 8a3e75dfb0ce..50fb6aa285ef 100644 --- a/phpstan-baseline.php +++ b/phpstan-baseline.php @@ -1466,11 +1466,6 @@ 'count' => 1, 'path' => __DIR__ . '/system/Database/OCI8/Connection.php', ]; -$ignoreErrors[] = [ - 'message' => '#^Only booleans are allowed in a negated boolean, array\\|string given\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/Database/OCI8/Connection.php', -]; $ignoreErrors[] = [ 'message' => '#^PHPDoc type string of property CodeIgniter\\\\Database\\\\OCI8\\\\Connection\\:\\:\\$escapeChar is not the same as PHPDoc type array\\|string of overridden property CodeIgniter\\\\Database\\\\BaseConnection\\\\:\\:\\$escapeChar\\.$#', 'count' => 1, diff --git a/system/Database/OCI8/Connection.php b/system/Database/OCI8/Connection.php index dd54bf9d4a11..8cb7e3a4a766 100644 --- a/system/Database/OCI8/Connection.php +++ b/system/Database/OCI8/Connection.php @@ -602,7 +602,7 @@ public function insertID(): int } } - if (! $primaryColumnName) { + if ($primaryColumnName === '') { return 0; } From 87796a09799b0bfa37ec52475c25cbb5c5b46349 Mon Sep 17 00:00:00 2001 From: Paulo Esteves Date: Tue, 26 Sep 2023 10:37:47 +0100 Subject: [PATCH 132/209] remove $_SESSION from methods and functions --- system/CodeIgniter.php | 4 ++-- system/HTTP/IncomingRequest.php | 29 ++++++++++++++++++----------- system/Helpers/form_helper.php | 6 +++--- system/Helpers/url_helper.php | 6 +++++- 4 files changed, 28 insertions(+), 17 deletions(-) diff --git a/system/CodeIgniter.php b/system/CodeIgniter.php index 4bde1c042b6d..dd00746bf567 100644 --- a/system/CodeIgniter.php +++ b/system/CodeIgniter.php @@ -1064,13 +1064,13 @@ public function storePreviousURL($uri) } if (isset($_SESSION)) { - $_SESSION['_ci_previous_url'] = URI::createURIString( + session()->set('_ci_previous_url', URI::createURIString( $uri->getScheme(), $uri->getAuthority(), $uri->getPath(), $uri->getQuery(), $uri->getFragment() - ); + )); } } diff --git a/system/HTTP/IncomingRequest.php b/system/HTTP/IncomingRequest.php index 458e8ef88043..079a3b69d02f 100755 --- a/system/HTTP/IncomingRequest.php +++ b/system/HTTP/IncomingRequest.php @@ -827,35 +827,42 @@ public function getUserAgent() */ public function getOldInput(string $key) { - // If the session hasn't been started, or no - // data was previously saved, we're done. - if (empty($_SESSION['_ci_old_input'])) { + // If the session hasn't been started, we're done. + if (! isset($_SESSION)) { + return null; + } + + // Get previously saved in session + $old = session('_ci_old_input'); + + // If no data was previously saved, we're done. + if ($old === null) { return null; } // Check for the value in the POST array first. - if (isset($_SESSION['_ci_old_input']['post'][$key])) { - return $_SESSION['_ci_old_input']['post'][$key]; + if (isset($old['post'][$key])) { + return $old['post'][$key]; } // Next check in the GET array. - if (isset($_SESSION['_ci_old_input']['get'][$key])) { - return $_SESSION['_ci_old_input']['get'][$key]; + if (isset($old['get'][$key])) { + return $old['get'][$key]; } helper('array'); // Check for an array value in POST. - if (isset($_SESSION['_ci_old_input']['post'])) { - $value = dot_array_search($key, $_SESSION['_ci_old_input']['post']); + if (isset($old['post'])) { + $value = dot_array_search($key, $old['post']); if ($value !== null) { return $value; } } // Check for an array value in GET. - if (isset($_SESSION['_ci_old_input']['get'])) { - $value = dot_array_search($key, $_SESSION['_ci_old_input']['get']); + if (isset($old['get'])) { + $value = dot_array_search($key, $old['get']); if ($value !== null) { return $value; } diff --git a/system/Helpers/form_helper.php b/system/Helpers/form_helper.php index 7f8f191a3a6f..7edb05cf1de3 100644 --- a/system/Helpers/form_helper.php +++ b/system/Helpers/form_helper.php @@ -701,12 +701,12 @@ function set_radio(string $field, string $value = '', bool $default = false): st */ function validation_errors() { - session(); + $errors = session('_ci_validation_errors'); // Check the session to see if any were // passed along from a redirect withErrors() request. - if (isset($_SESSION['_ci_validation_errors']) && (ENVIRONMENT === 'testing' || ! is_cli())) { - return $_SESSION['_ci_validation_errors']; + if ($errors !== null && (ENVIRONMENT === 'testing' || ! is_cli())) { + return $errors; } $validation = Services::validation(); diff --git a/system/Helpers/url_helper.php b/system/Helpers/url_helper.php index a74fe944f148..dce4b26a0b50 100644 --- a/system/Helpers/url_helper.php +++ b/system/Helpers/url_helper.php @@ -88,8 +88,12 @@ function previous_url(bool $returnObject = false) { // Grab from the session first, if we have it, // since it's more reliable and safer. + if (isset($_SESSION)) { + $referer = session('_ci_previous_url'); + } + // Otherwise, grab a sanitized version from $_SERVER. - $referer = $_SESSION['_ci_previous_url'] ?? Services::request()->getServer('HTTP_REFERER', FILTER_SANITIZE_URL); + $referer ??= Services::request()->getServer('HTTP_REFERER', FILTER_SANITIZE_URL); $referer ??= site_url('/'); From 88a842f9ec32f366b042cd91577022082efcee92 Mon Sep 17 00:00:00 2001 From: Paulo Esteves Date: Tue, 26 Sep 2023 10:55:59 +0100 Subject: [PATCH 133/209] update phpstan-baseline.php --- phpstan-baseline.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpstan-baseline.php b/phpstan-baseline.php index 8a3e75dfb0ce..f538808f40c4 100644 --- a/phpstan-baseline.php +++ b/phpstan-baseline.php @@ -2313,7 +2313,7 @@ ]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', - 'count' => 7, + 'count' => 6, 'path' => __DIR__ . '/system/HTTP/IncomingRequest.php', ]; $ignoreErrors[] = [ From b357e471989d9d1f00f14ef7cd0ff7e169ae8700 Mon Sep 17 00:00:00 2001 From: Paulo Esteves Date: Thu, 28 Sep 2023 11:09:10 +0100 Subject: [PATCH 134/209] update tests --- tests/system/CodeIgniterTest.php | 2 ++ tests/system/Helpers/URLHelper/MiscUrlTest.php | 16 ++++++++++++++-- tests/system/View/ParserPluginTest.php | 8 +++++++- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/tests/system/CodeIgniterTest.php b/tests/system/CodeIgniterTest.php index 5fae784b51c5..54ea3d10445c 100644 --- a/tests/system/CodeIgniterTest.php +++ b/tests/system/CodeIgniterTest.php @@ -27,6 +27,8 @@ use Tests\Support\Filters\Customfilter; /** + * @runTestsInSeparateProcesses + * * @backupGlobals enabled * * @internal diff --git a/tests/system/Helpers/URLHelper/MiscUrlTest.php b/tests/system/Helpers/URLHelper/MiscUrlTest.php index 4767dbf0cbfd..73ce680ea757 100644 --- a/tests/system/Helpers/URLHelper/MiscUrlTest.php +++ b/tests/system/Helpers/URLHelper/MiscUrlTest.php @@ -52,13 +52,19 @@ protected function tearDown(): void $_SERVER = []; } + /** + * @runInSeparateProcess + * @preserveGlobalState disabled + * + * @group SeparateProcess + */ public function testPreviousURLUsesSessionFirst(): void { $uri1 = 'http://example.com/one?two'; $uri2 = 'http://example.com/two?foo'; - $_SERVER['HTTP_REFERER'] = $uri1; - $_SESSION['_ci_previous_url'] = $uri2; + $_SERVER['HTTP_REFERER'] = $uri1; + session()->set('_ci_previous_url', $uri2); $this->config->baseURL = 'http://example.com/public'; @@ -80,6 +86,12 @@ private function createRequest(string $uri): void Factories::injectMock('config', 'App', $this->config); } + /** + * @runInSeparateProcess + * @preserveGlobalState disabled + * + * @group SeparateProcess + */ public function testPreviousURLUsesRefererIfNeeded(): void { $uri1 = 'http://example.com/one?two'; diff --git a/tests/system/View/ParserPluginTest.php b/tests/system/View/ParserPluginTest.php index 53caa6389213..b5e4c9047297 100644 --- a/tests/system/View/ParserPluginTest.php +++ b/tests/system/View/ParserPluginTest.php @@ -42,12 +42,18 @@ public function testCurrentURL(): void $this->assertSame(current_url(), $this->parser->renderString($template)); } + /** + * @runInSeparateProcess + * @preserveGlobalState disabled + * + * @group SeparateProcess + */ public function testPreviousURL(): void { $template = '{+ previous_url +}'; // Ensure a previous URL exists to work with. - $_SESSION['_ci_previous_url'] = 'http://example.com/foo'; + session()->set('_ci_previous_url', 'http://example.com/foo'); $this->assertSame(previous_url(), $this->parser->renderString($template)); } From b5d123abbd3eab20ddd17be122bacfca8203654f Mon Sep 17 00:00:00 2001 From: Paulo Esteves Date: Sun, 1 Oct 2023 18:31:04 +0100 Subject: [PATCH 135/209] reduce code as suggested Co-authored-by: Mostafa Khudair <59371810+mostafakhudair@users.noreply.github.com> --- system/Helpers/url_helper.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/system/Helpers/url_helper.php b/system/Helpers/url_helper.php index dce4b26a0b50..27e3ce1d079f 100644 --- a/system/Helpers/url_helper.php +++ b/system/Helpers/url_helper.php @@ -93,9 +93,7 @@ function previous_url(bool $returnObject = false) } // Otherwise, grab a sanitized version from $_SERVER. - $referer ??= Services::request()->getServer('HTTP_REFERER', FILTER_SANITIZE_URL); - - $referer ??= site_url('/'); + $referer ??= request()->getServer('HTTP_REFERER', FILTER_SANITIZE_URL) ?? site_url('/'); return $returnObject ? new URI($referer) : $referer; } From d8777f8e13b940c89993071f484e15bd6f4a9355 Mon Sep 17 00:00:00 2001 From: kenjis Date: Tue, 3 Oct 2023 15:02:16 +0900 Subject: [PATCH 136/209] chore: remove label-add-remove-conflict-single-pr.yml This workflow does not work. --- .../label-add-remove-conflict-single-pr.yml | 57 ------------------- 1 file changed, 57 deletions(-) delete mode 100644 .github/workflows/label-add-remove-conflict-single-pr.yml diff --git a/.github/workflows/label-add-remove-conflict-single-pr.yml b/.github/workflows/label-add-remove-conflict-single-pr.yml deleted file mode 100644 index 8565c8975cca..000000000000 --- a/.github/workflows/label-add-remove-conflict-single-pr.yml +++ /dev/null @@ -1,57 +0,0 @@ -name: Auto Label "stale" - -on: - pull_request: - branches: - - develop - - '4.*' - -jobs: - build: - name: Check Conflicts - runs-on: ubuntu-22.04 - permissions: - contents: read - pull-requests: write - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Get PR Detail - id: PR-detail - run: echo "detail=$(gh pr view $PR_URL --json mergeable,url,labels)" >> $GITHUB_OUTPUT - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - PR_URL: ${{ github.event.pull_request.html_url }} - - - name: 'Remove label "stale"' - env: - PR_DETAIL: ${{ steps.PR-detail.outputs.detail }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - PR_URL: ${{ github.event.pull_request.html_url }} - run: | - - # MERGEABLE with 'stale' label - if [ "$(echo $PR_DETAIL | jq -r '.mergeable')" == "MERGEABLE" ] && \ - [ "$(echo $PR_DETAIL | jq -r '.labels[] | select(.name == "stale")')" != "" ]; then - # remove 'stale' label - gh pr edit $PR_URL --remove-label "stale" - fi - - - name: 'Check for conflicts and add label/comment' - env: - PR_DETAIL: ${{ steps.PR-detail.outputs.detail }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - PR_URL: ${{ github.event.pull_request.html_url }} - AUTHOR: ${{ github.event.pull_request.user.login }} - run: | - - # CONFLICTING with no "stale" label, - if [ "$(echo $PR_DETAIL | jq -r '.mergeable')" == "CONFLICTING" ] && \ - [ "$(echo $PR_DETAIL | jq -r '.labels[] | select(.name == "stale")')" == "" ]; then - # add label - gh pr edit $PR_URL --add-label "stale" - # add comment - gh pr comment $PR_URL --body ":wave: Hi, @$AUTHOR!

We detected conflicts in your PR against the base branch :speak_no_evil:
You may want to sync :arrows_counterclockwise: your branch with upstream!

Ref: [Syncing Your Branch](https://github.com/codeigniter4/CodeIgniter4/blob/develop/contributing/workflow.md#pushing-your-branch)" - fi From 96a822e3cf43906085cd3f00dee56d74ac67a6e5 Mon Sep 17 00:00:00 2001 From: kenjis Date: Mon, 2 Oct 2023 08:42:18 +0900 Subject: [PATCH 137/209] refactor: replace Services::request(config, false) with Services::incommingrequest() The parameter $config and $getShared are deprecated. --- system/Commands/Utilities/Routes/FilterCollector.php | 2 +- system/Test/ControllerTestTrait.php | 2 +- system/Test/ControllerTester.php | 2 +- system/Test/FeatureTestTrait.php | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/system/Commands/Utilities/Routes/FilterCollector.php b/system/Commands/Utilities/Routes/FilterCollector.php index fcb9b1512835..db32e649e32f 100644 --- a/system/Commands/Utilities/Routes/FilterCollector.php +++ b/system/Commands/Utilities/Routes/FilterCollector.php @@ -51,7 +51,7 @@ public function get(string $method, string $uri): array ]; } - $request = Services::request(null, false); + $request = Services::incommingrequest(null, false); $request->setMethod($method); $router = $this->createRouter($request); diff --git a/system/Test/ControllerTestTrait.php b/system/Test/ControllerTestTrait.php index 7e4091be6175..131c1271a9d8 100644 --- a/system/Test/ControllerTestTrait.php +++ b/system/Test/ControllerTestTrait.php @@ -109,7 +109,7 @@ protected function setUpControllerTestTrait(): void $tempUri = Services::uri(); Services::injectMock('uri', $this->uri); - $this->withRequest(Services::request($this->appConfig, false)); + $this->withRequest(Services::incommingrequest($this->appConfig, false)); // Restore the URI service Services::injectMock('uri', $tempUri); diff --git a/system/Test/ControllerTester.php b/system/Test/ControllerTester.php index 2fff82eeceb1..63955130c8e4 100644 --- a/system/Test/ControllerTester.php +++ b/system/Test/ControllerTester.php @@ -108,7 +108,7 @@ protected function setUpControllerTester(): void $tempUri = Services::uri(); Services::injectMock('uri', $this->uri); - $this->withRequest(Services::request($this->appConfig, false)->setBody($this->body)); + $this->withRequest(Services::incommingrequest($this->appConfig, false)->setBody($this->body)); // Restore the URI service Services::injectMock('uri', $tempUri); diff --git a/system/Test/FeatureTestTrait.php b/system/Test/FeatureTestTrait.php index 23e56990b45b..43ff9206ac86 100644 --- a/system/Test/FeatureTestTrait.php +++ b/system/Test/FeatureTestTrait.php @@ -289,7 +289,7 @@ protected function setupRequest(string $method, ?string $path = null): IncomingR Services::injectMock('uri', $uri); - $request = Services::request($config, false); + $request = Services::incommingrequest($config, false); $request->setMethod($method); $request->setProtocolVersion('1.1'); From 262c048b3f4d86fa647b908ee8caddcea128752e Mon Sep 17 00:00:00 2001 From: kenjis Date: Mon, 2 Oct 2023 08:43:47 +0900 Subject: [PATCH 138/209] docs: add "," --- system/Test/ControllerTestTrait.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/Test/ControllerTestTrait.php b/system/Test/ControllerTestTrait.php index 131c1271a9d8..4573e07592cc 100644 --- a/system/Test/ControllerTestTrait.php +++ b/system/Test/ControllerTestTrait.php @@ -105,7 +105,7 @@ protected function setUpControllerTestTrait(): void } if (empty($this->request)) { - // Do some acrobatics so we can use the Request service with our own URI + // Do some acrobatics, so we can use the Request service with our own URI $tempUri = Services::uri(); Services::injectMock('uri', $this->uri); From 93001f101a059e38f8b03a40e41678f861cd2cda Mon Sep 17 00:00:00 2001 From: kenjis Date: Tue, 3 Oct 2023 15:38:39 +0900 Subject: [PATCH 139/209] fix: typo in method name --- system/Commands/Utilities/Routes/FilterCollector.php | 2 +- system/Test/ControllerTestTrait.php | 2 +- system/Test/ControllerTester.php | 2 +- system/Test/FeatureTestTrait.php | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/system/Commands/Utilities/Routes/FilterCollector.php b/system/Commands/Utilities/Routes/FilterCollector.php index db32e649e32f..01d228a41704 100644 --- a/system/Commands/Utilities/Routes/FilterCollector.php +++ b/system/Commands/Utilities/Routes/FilterCollector.php @@ -51,7 +51,7 @@ public function get(string $method, string $uri): array ]; } - $request = Services::incommingrequest(null, false); + $request = Services::incomingrequest(null, false); $request->setMethod($method); $router = $this->createRouter($request); diff --git a/system/Test/ControllerTestTrait.php b/system/Test/ControllerTestTrait.php index 4573e07592cc..2da65d1aa2f7 100644 --- a/system/Test/ControllerTestTrait.php +++ b/system/Test/ControllerTestTrait.php @@ -109,7 +109,7 @@ protected function setUpControllerTestTrait(): void $tempUri = Services::uri(); Services::injectMock('uri', $this->uri); - $this->withRequest(Services::incommingrequest($this->appConfig, false)); + $this->withRequest(Services::incomingrequest($this->appConfig, false)); // Restore the URI service Services::injectMock('uri', $tempUri); diff --git a/system/Test/ControllerTester.php b/system/Test/ControllerTester.php index 63955130c8e4..c01e6a8ba2f3 100644 --- a/system/Test/ControllerTester.php +++ b/system/Test/ControllerTester.php @@ -108,7 +108,7 @@ protected function setUpControllerTester(): void $tempUri = Services::uri(); Services::injectMock('uri', $this->uri); - $this->withRequest(Services::incommingrequest($this->appConfig, false)->setBody($this->body)); + $this->withRequest(Services::incomingrequest($this->appConfig, false)->setBody($this->body)); // Restore the URI service Services::injectMock('uri', $tempUri); diff --git a/system/Test/FeatureTestTrait.php b/system/Test/FeatureTestTrait.php index 43ff9206ac86..43db39f93f47 100644 --- a/system/Test/FeatureTestTrait.php +++ b/system/Test/FeatureTestTrait.php @@ -289,7 +289,7 @@ protected function setupRequest(string $method, ?string $path = null): IncomingR Services::injectMock('uri', $uri); - $request = Services::incommingrequest($config, false); + $request = Services::incomingrequest($config, false); $request->setMethod($method); $request->setProtocolVersion('1.1'); From 7ce08d39fc7c807a5ed0bbf8a07bd5d066f003de Mon Sep 17 00:00:00 2001 From: Samuel Asor <8720569+sammyskills@users.noreply.github.com> Date: Tue, 3 Oct 2023 18:33:04 +0100 Subject: [PATCH 140/209] fixed typo in docs/create_news_items.rst --- user_guide_src/source/tutorial/create_news_items.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/tutorial/create_news_items.rst b/user_guide_src/source/tutorial/create_news_items.rst index 4ed6badbae07..2388841b70b8 100644 --- a/user_guide_src/source/tutorial/create_news_items.rst +++ b/user_guide_src/source/tutorial/create_news_items.rst @@ -172,7 +172,7 @@ Create a News Item ****************** Now point your browser to your local development environment where you -installed CodeIgniter and add **/news/create** to the URL. +installed CodeIgniter and add **/news/new** to the URL. Add some news and check out the different pages you made. .. image:: ../images/tutorial3.png From 6af07c3c55fdbdada0e2426cb0238c97ef2e3c2c Mon Sep 17 00:00:00 2001 From: Samuel Asor <8720569+sammyskills@users.noreply.github.com> Date: Tue, 3 Oct 2023 18:33:41 +0100 Subject: [PATCH 141/209] updated tutorial images --- user_guide_src/source/images/tutorial3.png | Bin 47293 -> 39569 bytes user_guide_src/source/images/tutorial4.png | Bin 30520 -> 25486 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/user_guide_src/source/images/tutorial3.png b/user_guide_src/source/images/tutorial3.png index 325c3f982e496cbb89049a31de9728b5ced758c9..16f557595d04046934562a1d85e2dc0c7ca9264a 100644 GIT binary patch literal 39569 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 literal 47293 zcmeEug3-Hp-bSwQ5qeE00jyP3SCx4QWXjcRuT#dItK{>coLyjlnDHgv6PTd zmX(koQ+BjBv$O$2L4o4m8yjQGGJ*z8OpJ{OzcbLGIJ&8ZhexRz`}KE!CmSQ{%^Ao^ zNYmF}dyTaQtKJLsMWv_78ZCDR4Oe(4~XDaS#L#(wA(LXLfu(3C?x+2r8=}(HuT1g>?yNqoL&y zBeBh(ARw$*A%q(2qGCs4uVWZL^s8o=*}$1VaM)O@pKhL?>lk5S@0k%oyQH3ruOf^%>|LCN zC@6k6^sj$^`U!To{C7)sPJa&z7$D2<6c#pSR+fL&4HOmp{ghwX(j9E0Eoo^BhzDpx zn3scF@UQ&;SIWOz{8LiH3G66gZwnN37XG(<|1SKWiT_*huO@Z=-6SX5e>M3ZDSwv~ zWcfYv|B%EVG5_@xkh3s~Aj`kzOc(_OAIAX&B?=`gDW>iYeVB=ufg?55e}FBm>8Shy zM~tdCT!wWw14@d`L^1ruB?rS!Mt68P3Vl^^P97XAOhO_V{*bI=XxsZP&%0k>S6A-k zWfHG8rAKYE!lJgKdy%>(1GSkM%e)Q9?WF7B&lx%<1?KbH{0f>GasCjvchuF+d+dCt z-LQcXdmKA5PR9ZXE%Go_%AzoqPmY#%VHx5uRHA=fSP9)Ik0nF}5>qGgsmzxlPj+|g z*B}X{t?i>(rL4o1qo6>XT7)dJ00%g;(KKp}Qgtq!Q=<9tE4hOv@z+S~Of%-@Q%v|<)`HA(Cho*NwUguZ%<4Rf191`<{d zzQAlVH8b0%mAK|mAmERH;9!$M|8)g;!@SPk*

HtF2|vRyMFOEYuBV&SU>7O+^Bi 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

=S7w#+g zvp!1wP)xN%7LD&r>5mVndW%&{s;So)Hg%{#dm0AP3b1b(^DN<{TRIRK>756~@L)w7 zyrYq{O2dpkNMl&Th|vaA7rwD1_`Z~Gn2oDEtjSlmmSAG4(8Ph`?;%YJ59t@ltgY|k z8NQ!T97Nk9HK|69wW_S{SuFIUW;c!^b*P7d|@m&M4KvZkWm_~Ulbm1KD~ z;M&*KPnjQSZ};u<+pV2UojJ)i{A3OJZS)}*Lj0ar#RmX0D2q3hs;p$Kkq;RHRqwUH zX|*;DRQ6xPJMu8j4>-8rCXVoR_`ldn?{f!VD3op8{PSrmLir!r568$EKJr;qRV&ec zP=%NhtShN!Ubl(7*9a#Y7n)DfOTOX`Krw1Q(jfmHiU#4^7Q0f+MKNNxfw%)QhQb&< zwO|mzyXXdV06t8|v-b0_(LxDt?uTdWX5`IlSamYSTj2Hqr6jsZ^!QN@lCT^kG0jt$ zce{iAK&{2etMJpe*^bJ$j+KgS6(^T-`Ad86;ioK$35>VvpVT7cKY>@}cYBjk zY$wR`+)}jZL=h2%bD!UG-rG{?IdlFrQ`O8;QDn!TeNab-xol8gP*xDCZrHq=i&fXb^%tJ>f|XB0`_YE`2pL6|Ji4}Pv3GUFBA z9T&T-cVV^GR>{&lE0q!0=l^0`Nt4Fu?&fS)tLf1=BKy8DuBhh;9S;vrnsfzxoc9X5 z1(Iur3XgIDd!&yxY3Yn#h|qgVUz4-in5!Cku<9lyly_&KO{n&~RW%E_SEJs{bU_Ed zq!n7>syol)K~IrVel1*B34?6$BY}OkEra`XiO_g2G}gAq6;sjc`jxUOk`jfY^tDl6 zvfNFxJ+{^lqUVMSy-)Y93eD}H)|25ctGG8Tgmc`|lj_Vf9ZQ8kp56ZdyEI*lfcF%_ zRV5{vjnSw)HFLABC=k&7p$oNMUJ2TY@FU(hvZkA%iQte1CK=6WkEu6{K*5}k5lRjag$ zHelt=j!-*FLc*l?%%_0plRwja?u7@F(;A$5MKItPK#^~=F4k@dHo%QX%p7~XypMmg zEfQ+bMkV^VS&m2RKVox-vykBSdSM1>JKDRuC;)}TM-nfVN7vmkOuKnkoc=0nM-6BQl=r6Y(&24h^mffPhNIm>{?}r4=4;eKb)la7o;T%NVfssq% z;^!)?DI6LxK1&Az<|vxL^+6nSpuzT;fEzlk|Ah)<>`@{jChBa&UK7p83~3ZY-um~i zivV8)&O9L%04)AsGwA23!Vh1Ds5GlJ$XS<~lGe3Zd#t0@YuTz-nJ33*KMclMa|7v4 zVgg@+B7q%K z@6Me)t`Nlo#QhD3=GE)q;u>O{r@y)1J&;0+I+5!pZ=80$I$__=oOEhg?MQeX@N?t3 zJn)-s#Ms9&TkAgt&u|AAq(TfDNbCgV?+W|(ml+T$=&81rk)KfW2ciDo3-Z!?6XecS z>lm<;{%OI$i|-L24Ue-$Z}iW;@#{sP3?Rw0=gGc?{$4!4NJH{az>>9LKF$9#gMQUy z5~jdJigk5cV*8&r`T(4*w4s*o+5h!t!v(ePEw>YA{)PW#=coXi_ra$p?@vws>k)wA z6gT60qkt*Nf8K}~JXsKxnv%@lG|K%)2%os8^G9xKe~+H$_j`)D zbRYfR$@&jUh8p7~c(NsgSj9ic*{|`V<^Ufw(A9l{`#*2Q33x}Gm(>Lc{~5Xe{}ue^ zo&Wz=@V_Pae^~{dy)7d*fMM(cg}mA-}Ia8C5De%h&Inb2i&!GTe4M8;&V~)N+vs zpjdu+Px82b0)No8=3*`Jreo%R8iv327LdECtq`Dz*&+yzrbguH<*rXpdT`&VQ2<}c zi=a0Xy@+mQ8sFT?0BAqleRDd^tf`r_AY*W}B&vC~Hw(qSe9>gBy$U#m&(R|-3o(B$ z46GzUX{3nQXD~GBM#EWNLQ5YB*r3&d0WitGtYXtaVo%NKH}GS7@U#C%Vy+=w&hrKD zTnu0F=rV(~ABj(ZLoxi@9Z>&&7GBA2Ci#0Eg55}-LG=D%!u4`2<{R(HSScqbH&Z{r zRXLt7`mc_@(>OW11P12kM?v?vhP%qEDbE&zFMv|Ci=D=yd|+Y#=*JtrB8_j2?qocD z1~46<3H+SV^<5f{HIN#T-*WwKlj+y!ITC!sv zr=q3F5JcT`1~+;opO0c)l6mY;Nq`&u)-Fv3L{|ND1yk2|_W zCFPx{n4gUi4?GYy`3HONqm8Ze_gihFr(c3l;{$>1r znyL7bdj{LUeS0R8#K}r~2S~q%4vUw|9bsp=40(>SyXA;z?l&i~-|FGK z4{SFEn%~vgnGN$F7>*YuTL8B0miHg)&-3jQ^1%nyzz75l=VGiCs4Pu20E?nv<_VVa zhz1^<5B@nf{D2)<(5Gk(w+kA>G_#{grYJfT;@J$$X5Q_p)tyHVRe5sS$>*~Cr-czq z6yi9hxP{G-hy3MixrX6UiE##Av)H2z%>o1eQm`wJ-HxS_)~SZm<`)mAnN`aIPdFD@ zU!?B9AO5aYf`=vR@?%VWcHI3U@#U++W*_)aKkpVjTPaN(1{nYwR{*vI0PZ+E8-r?< zIeU;}j@_iqfeq4>asMQDa>t%4tZVEol029>fqFt$7`c!nGFEL-!MkKeEg8<8l2)(2Z(uuwQf$3kX7s;7 zX09JV>6~5Fa9D(OpSY9LV6I`l3_AMUNx@9sJfIG za^td$pfYGyEUg`bwTB}?VZ~rlGSl=dX#I!Tk4rGmZ+`Uj^dN7h}`sWyNvAT zV%Vsv7{m|>{P55#Ls+Ezql5|j6n}*^-mojE&AA3=!OJ|weADQ588oCwCVvBNl@Hb} ztOe?Fy_RNGl?Z0)-`pBL2z@VyX+F{}4q;+^d3w=&0R*WRNz9}J{Mke~<&39?$)!aW z)s3n(FG=e;OH3_YtDU&FJ==o*vA^cZl4tlLcyp|iBYEGoAmBVQaK-QBf_LkyO%LZh znzI>}=^MUv?R`;palkPX1jlh;)M-kl*8H3@MFwr6MO(K=d(K}qsT*x=wE9blna%h* z|I;A;>g|dS^KEQSO-O_)044VgR#vu^#98rrndFF@MxWXB<$j=lQ+ts6E$0nu$ts{j zRs_)XTC#Zd1D`(HdEMcdEk%W-Glw2Uke#to{Jb|b5qrxLDT;KO)YSd%#(v$XeBX{o zz1mVsjjHfK&g8g&nl#G}8AZX89cmd;i9BC5UzJ!I(tt63m z$fx?N*>nPWUw`Tg4e?OI`|Jo@5|^MxiddjMna+qzOx&Iiv&$|q`)HHAwBc>`a4cQ{ zIgRhw0(3mv^W#Ea-REb|e1ji3&5;qskid@O_G&=X+oazLQ=S=j7JED zo!5CQ;YolX!UceCdLP~8TCL0r>{bkm;+o&FW{~GyrEGqpmmMlFDi4r{z3~lpfH$!L zbYOIjl{WgruYXl1wxifAR>8Hw2?%a|HkEK(=rWux_C5lNf)9V@JR`I0{UdJxkuhS> zn7EXJ@@K^HELvWRpDkL0qux|ow(mhzsW@fSaa7InrdSExP6)CW!gHy7kXLXv9o-QYSKY(}@9h?Y)^A ztRIPb$P${B z3QHW1G%fy8F{Q3;5Z+lU+qNakcluH0J~;Ot*?wjl-THp};Fgd?rt$XD^AvwZ^vtrDpp;9PpGoaNZp<-h~;$ssCuQ!rTd+_rPObane^a4t&|ks~ z!Ird0L&*jJQBHEFEGryTR3Zh)BwtG=T!07YvB1odCal*&yeAR9+FF5OwaJHC*XEWL z8g8;z2cFN++K9~~Cb*eYUd%ase$QA9G&T@L97n>GSI(~0kByJ(0>&r6lB8PGg8Th2 z;Hf-YFzz{Y|0U8EBeXxahK;A$*Qd2c-?43l+#pjPo@l;;ACBYru$~-1_!t{<;9{3o&H~ zu*O~+*}e28z}I_pc6fw*gjZ1-=RTqujxapDAk?!PA zJ?JV~UU-MS=d^woh-Fj#iRml%uRg)SaXx!CP8nE4KoSN0pvJHJ$*0n~iES~ zp+8iJA7FQu-}b7P(P{ud4g2XD6QhZaP`=M`V}2ZCP?Qv&^kfsJ99 zR=9*Qo%fsz_9!?>Tb&`QhNhKh=Z~34g1Sv?iG!L2QwUY^i+v zGcDX{!S63WVFaRBdo|wOI%Bhsx?TF!#DXIiw1L7K>{A^oe^sK4Av-Bo^Ys*}F$9NRiS zj^4T;nR(PZb=&Ag?*KOtu2<;D{~V?A8^oUFq4cr6c#w!Vi~StWI=iWuxjh$cy{rkz z3Y<%NSUCiC+&F7c zTce%dl2ej8q$kU*+3eDIPN!FTEY@M>x$d1VK=)lO*?xR(&t*@r@{f=@!EVd|n!Rdz zYAED*dd7M$^owTUaBh3r1+3QsH#UN|9-m0zm3dDJ%KMOLv9}VGo!e?ya?qqd(;IBJ zYR8((pEZTsZY1G-YG5(5(dc(o!*R77Hwr6V3*Y7WYRp=m4gEE5;PNQ949im18y1GK zZ>ylcp%^LWHIq2h>IV-o$7Dx9;B=?)Dq~EvZD$tWQZe{Gb=*zt9IIH<&(p$3Gc`LsaZr)@P4+= zz9Sv8D*y4=fK@OLW%4_sWQu_c`Y6AJr?Hs#*Efnl(?0gHKFrE&cp38O=$ixo8|`?-RNpx7R1Matan`x z`gBl9G*N_SF~e8$f#pdnFOF-uxmupw16R(?%umqWOAm^4LEK4A&C^GZeS=4U81<>; zv=w{|ts#;3(=AC_P;`yPi=YHNkx5t)fPDNbL{7u6FPG!Rd|C;{{*@_$rAYwm4Dcz(eDZ zPdtPXLfs-$(U9dlggKh=q2G=UUB~S&#H}t<1PC?hWtC=N6Nz2AChZG{l%zfP&X1=Q zWS6F`AC|e=;rG1v_R(JrJb4=eKvqkM`u6_lp?)DSJHUEk z$c()AAHX#eAHarmcCC}@|2UTJPo@TdSMKUH^ZnwYaHy9iA_mc=JkuPxR?SY7&w`hllhgyzF zT-M^D#9Wl%P>liSfA{sp(HEVLP=ze%_>z-|8X%>=*vc=?G#M{aDA8;VI8pv5EAZFr z+*eJ*!BB;)|@;5lUhQ*;A`I;kDl@e_2P4ouv6{41l#X01JrM zd`=Agd$j*zfppEGQ{dzk{4{dpD9W?4<>Wp=!y+N@_u<4c$uci5^^qp)(Q$P=uLqhJ z#)5!)$D?l07ZH7BOo#`nsQZ|#OsVFP@8Bc% z0G%=e;N_6t@hKkNM?aoyjlS7ms9Dc)!w3dfEOdcX5bUu7*-=jg&VPJ3!5B)6(KMt~ zm!E-+z=Kf#-sxnE2B4l%@oWa&z-ylgN=y)S$F44b6Us7%t8P20Seu2g9YpH1K`~ir z@~%1$^9YTEn|iv+V!R)Ga$SHNo>r2*cfCB0Fe$2eoZ%t>yE|PK3l!V^uN5a7oU4H0 zjnY*8<0?RIqZ(bWka&&Sf^flQIsTH~aHx^JG^X&cdMmszwSzL>dF`>-xnCc?EY8F1 zd7aEn(-B4%rrZbpubn#p&NGKl6cG^-`n52aWtsQ4Nu15v_lV)CQ-iN865M}gg5f*# zMe4~Akx7sy%OcG=pbldJ8L6T<0A!$Ir~C7%Ic}LBL2uvfPv(}BdUw4pFjZ`O114p+ z#kZR*PqKnj<*VZ!=5Gj)Q{aouGWjw<_ES#(%jcJ2-9VR^-yR+9PxX-zUo$7z3ZE0S zIgzU7HEr)@u6)jn*ZY9B-W(4|t>~D=vVlm_ zS7^kXX*b?acx5Fxmz)4(V0Y5$kKO|i%@e}qJ5UY4oDDN2^V_O~qyUU(a#ZvCHBhoT zg}4}yb&8Ur&{UwxXreb<;}@r!IsTiY>!Q^B=t)hpT#A6h4B<6R4CB8}5y2Qs1_;KKgkCMrN-MkS!?OfSkyCi>N<2h8a??d=xU6 zF|My3*IlZ+Nb0@3HJWdBL0bp3QI(CXQ_!($RQ_j$F z5ID_7)Y_V{_4js%Q4W)_Me&Te?3Juv68^HtLsscT4w*T}b&{K=@;60lTmUW+j?{ac z4FxTByf>@bi(KzSi-EfjX4X)yGngBXq;b9NA3|_MJIjZ_0@a(T{$NGF7*%01-q$@w z#j9~Jm4-^WOF$)qp$q+{dj_js(a@h9H@yo#Y$*55lOKNd==|q`-bx-+V?-1dz}{oW zrjuqUh%5@vsE`@36*{nSV65ddAIGY*Q_Ja@jd0mq?qlegKKFD)XdnROLEXoL%1&0< zr#g*=!@IR_RPY&<8}yHzyfu7iK{3WJ^mL0*MCM~@0Ocszw(rNo+$2`lXEejRZ)v~% zt8{6C_soG)JQ&o-pdWi)1PGN4mCpl6$~@k&H-_+<2)j>az;bdgTx=tASb$<`JZM2) zy}jCxrF)Y#F{<@k87?UKq8~8}in0khE5sG3Sx!@=syXH&2ewYxvzjPypQ=stA=^XW zXc}s&V`8C{0lI1Xn5$>PW6+x}SOVCe#x^}-Ax^mvogj*=94_oJy7xjvaHxdT?Nl*_ zNYlU#WV=N=#_9TP!PzX-107$d+UE)^|9M1C6?tS}v!ex;nMPo1Agi^9oCBPa> z(F$4xZ6=W{@zKAYl-w9*XqKE_ZDU8u9WV=DfM!CTNclO87OLz9TzR#4I08ewk=B?| z1{E*gi&>jbMfuN$?@UFg!;Mdt z=^-P*o9{B|jkaMzxEP|DRFz&+^w+Q!<66y1TbJi;v0@?PI~+J@z0Thp&Ym{Y#L=F` zZO81M%=Mr3c=Gq01g9Z}9<Zf86tY$7 z2a7q@+v0YjshNj|LRc`!>WPL`h-=ktnbKO)oIvalbkGu3GUtXZ?B{;ihUeuPqEw)q z{!F?FPMu0uCZd&_v;eP#J3oYoqr1uTq2e8pd3CeJi@+_4S`tcFZB%sO)E7W1Gsv%? z$ec%i-~d8c_-c!g&Z^`;i+j;INH|)p4{~Ul$pn6H@V%|BihCCD!Sh85Y%p6(w2sW9 ztnLsJ9*zj}-hW7FLDOM~Em0-}69#+Qh8T+_OM_4k^(6GJt_rQ5SDDOwZzNpXhn=I)yi7sC16n`E*AC6iEHG-tgZTZ>~~N z9TwhC%0szo9=+R%#d+#GjO)CThB~%L&92o=47qMCoIIpLzQWUTC&Q14z~W^U3w{*x zb|)U)0_P(IFWLsOc)sQwzDLU#VU?=M~?-{9Mu?-tU2Ft=6EM)B>I z30hp!f9}i1sYT3%nmN$;nJZLovi@I^9ZxyvSN8Tkk_)z3&-Fd33*!fj<%CLPpr&8aINoTIqh`{M}5z)ErB5T!I-NX|2k34@+lEpjP{7%UlW78 z2P_4xjNM^G8P0!$J0%TVInA#`7T7wEz3 zE42ov%KPRd;ki-d(}%D3Z-?~;cB1|_{hvMXl-{HuWYhony{!!~luqX6>g+yu^63|C zmrAl1=1II@GqsvFt9k{9P?yTCfarU7xO%P4E8Nk0J0NH z4&nKVr#9W*T&;q<*eK9siHkWX-0{y|lCc{{fk?EOqMVus6Zg?+Yz^WyyyLMB`-H z4f=>1EI60A*@r-Pp+L>SG*x%9sI*2rvH2!DIkvIyXtn1F0GdwKL&24A8lYUa3>=$6~ z%@ki-nthIro#U=P*;jg0c=+Zw_@s*q9p6WO2}Z4rYi6$&}iyCYTgOoS!?;sn=HA3+z=I!R>K1Kym{6(qO7uOGnNv^R$n{eEq(8 z+VZ_kp9d16ovriL1|ZRS22>M9BRLUU4nXw)N8k&&(J=*~Us%%fp4U5EW%*Fr_DfdJ zw7(;eFmT=rK?034h%Z=7@2BA<_z03{Wc*1v=G7m;)YAZETM9{$G9SA6a@9E}kqFs_ z?~39cFUO+Xqu8WJ&H~6|%gkrFZkqk*)+K$~wszjE-&NfR_V zPTwo%b=_=H@kJ!3PxfYc4uC!c7L;swAPd+#h=o}MsyskL0Cc^kX+ZCyGF~qT7fQ-U z$nvHN8WdP>>D~kfOlkw$pkOlLnu?D# z+ARjsCMX?K!wZn%khbb}3D48nrhM;|&jDt2zFScwU)|no8~p`v(ILG9XW-pn*SUxc>lSqDGT5aPLL{d^{eZFbdf3l@!08`quM*jb$yD!#@d)b zcZ;hZ3PDEe&!PV9{b6*Xs@p?iaDysnYSG^oswi&9RhmMvxw6UCJA800DlDx7a+>~p zFw&5pYzmIm?saUDZX>@W*5oFb;mV}u)pu{TFz$l`{C#8b)UISev--8M1Oz$Ul_xI1 z5;6x#I6$=^qeEOGdW%Odt!zMDynR9y#+$LK-&_qz+;mb2b)hakRq1j`|7Hm%56n*| zzB_MQ=<@RjnU&Nlyxmxy7x>_DNC^nss50BkyBviCc}SaF$4D3J%s0AH5sHRe5Riv^ zJFkq4OMMN57!Y|?R{^0~RiZ-(*(x1tz)omy7bt^^3X1FYY9ByGMBY?eRoyaqBmCqj zm`^LSs9yAI0-NbE@v2+oKZa_3><$C~KALEd8x1SR?;V16Q!T=Unk7zh(5P@Tx?}9J76s;(-SL@s=v&yX{@X8 z25f-qw{?d{N7q8*5;sK4Y8bw#xrX4jV9>2@)|{+RV9CzdylH#1?) zJ%j>c%?m!YKx9}14~49V1iG1IIbR4kZtykNMAvtt6LXS-FQDPs?J>ChvmKfMvI_Zm zi1I#HGMawOC^9r+FE#awERgK@)ae#T|FWFKx8_YSAeW9eu1;NNZ}v`Iv_l5;V$~l} zKb{g&ow+<)!p_8J{?!y7(2lb|c<_AWm8j5L@Dms8&bM%wZq2@j+G|trzOLf@^@tEe z<~x?Gf@6Tq1jUn5>C;E(FT#!%j1P+KML?A9`(btE&<3Rv&ME2SvhRVZr*^C1*!89@ zIcz4My(I62mHHr_kNI<-Fk@(k)D8%BDVn6)oTq#7Ica&^X@<=~x8=*gp-#E#lW#!F zMPn#HTx=yO-CFK}r^EXsJ>s~&yJ5wjNaXoZq|;sUb>z{t?=Xq81O-4iEw;=)j2-^9 z&(JXp)u`S@OetTmC@q?O9r8iMUWwIkD|NRNbdy|BwW1;cE5^9PG zvu*%xu&Jbr+U)}e6lDc3-OV)gCr2+s%>f+%Vs=G^R}*BBFVWZlVjg-Qk8&rTT}+5M z(|oxDnQ6=W2k2+pV8ju&zUR9%VLyx#_(uJ=pr z4tW4@=qs1Z6Q9TwPc%@se$p&I7?bT!&Z26QtQ1 zW^$B6zMFfs{S1Kd<31PdMRDH~Q4am)B5I0w_)y17KF#a{PoxEHRzg5PYc7k9HCgLE;C0Q?h zJzz&K}fFP7mROF*W zPt$d-?i=a~>pFMyv-#lE@gw+~`pcIjIurEv!DM^+(KE+KM`uP|A9%pB*}iz5-m?46 zl~({nmW1-xIb2w@Xx=>$ z-q?>(HJ3+^KrCkhm9A{Y2~&(L-R^wkC(@TX)CiBxbY|t-kZ@PMB=IJU&q)MMtpMUA zJz?aBv8HHlAJ_Y7Bxe7MQYJv6G&0xw^XCVwu2FI66h!+#37eK7ahV>O`mLW_>nUEu zrM*!`%BzZ2?p({^x5;LosOBg6hiZsYCCr|wxEWthCl9tuxc=G`wEYFMR77x4cO1H! z-@d5w$pnmzYpRcrFzm+VH}%bl`kL#Q7CS>Jd3nfx>#|qn{^lH51T%U#VKU* zWl{U9U|>t?wRDWQM1MEl-5N$6aeG?8J;uuQv+%3=%NP9SyUKq!BaD;>s2K-p+RyNq zHQmM}+g27_XwAah6Yp5&_`mDN({p@dWYb3b-I9O@6Xnzkef_^1Y7?*)qH3PE{pkDk zz`O{$3AEOv%ew!tp8ldvs3`@#X)&?%|3jpJ>RL?%=d(TG;8!;Q+`n&hsWFFh1ll}j z@%mQ%j0poc#6%ws!vS)`W5}vdw9Ww~RVcbMzFvQdI*^IPYiCRx8G+gYIJ!RJ^!&u~ z_z_lGLr+OUIi+p&=6Oe|8j0|<)*a){yHUU#3{XP;tV&&B=wpnw1sPw8w`IDofD^qE zTwtRLaoVJrY%r->m$<+73GgM=Gj`KvLqN(UdeYF1%^pzt(eR@M!1{gysmm5z;~>5p z_|Iz1ddd+~ci|lXd^Yv#8+~a$Q=)7E9%R!m6YNLBA?|fHn~^B53=*mJt|w4%F~@`j zI>Yn{xovVp2|p3t8Ey%_|AT-Tz4Rc>sL&y)OgU(QD{cX%W8MbgK3TxwXU0xgw3|NL zWE`?C{wa#8%}7PKJPr7fdlg)We7TTC0=C5dEhwG1!9B(4n#K75rxIFN^sJ&~QUG^F ztN=yJyZ)TXUPX{*jLS+ymrV=f#@XA5ydVYTVG;*AJg#-ON{6d{in7BdB#~#mE(MKUiIGO=^FVbUag{b-Q6QBqrBK>;17ny^g3m12UISk!`4xlP=89EI?Fj?N^wSMXmC4)$OwI{V~#2fOU-+ z1;?5D9fD#JVX`qY^_Btwk_eK+HqTYT-4zutqQO@Yq#mu?~&szHT4??M%W&F4TaSYy?@x?c8}Y%suS>M*6t9fU7X~Y*G-4H&Ep82h9qP zf$3%5VNC>}IZ5Uf;MoB8h=cIlbb>`Qs{sadBv{oTgX!TK&8ux7kf*Q&;|5>JS~mv| zIw$@0c)SgdMKVLs9yQfh7+yK=)pWe8VU>o~CyaJWaXp8zBg1|AK-S)qEwUYtyu>t{Wsv)c2p;{#&(AE^#Kr?bvIC_-4>Mh8VD&Lw&M>t={vm(H;!mux4ld1 zOR$2~vlt-c&0k4lgd0pwwA@uOt8#84d2KQf8 zc%FWyTestvJiO!8uLrV~3RN2S-E;U$T}Uo1>>0y+Yk%!T-}#{eS1EjMvulAv$JMA= zD&*+PEFl%dXBLIBUUShG*6(HYisCJRQVgBzl_{DrT7&xmSy4ECKX}Vu<{kW@+k)}X zk9Q{D^nWnR!pL(#DF9yl;0dr7KIWi?Awh_(?`HKy z-rRj<(UWQ42glOHp5;v8xVf&lr#9_z1ZM2()vQsx7K}tZF`>82qJ(VBr-Wud@I@Qn z9xR=07k}G&OS3-3To8S4US%Sa@A|pgpFMt$Cm3njrE{^8QVI??W59L~{HUYo`XPoyNjES{erF?;Iz4VZHvLJ+yVQt*?YD(I1@aWz;(Py3F5H0cu zQeDFTT~c2q7N0o?9B=E2=3O>CwITh5$*Ipa&N`{W5Kz(pN!JPdHIMOA<4>2fYZ}Jr zh&47`4;F;FfVC;S08o?0jqFdi`7;#2Cg!!Z1Z@%ofVJEU*kTYgA zB7>B7S0O|%jO88}Bmypan{ByQs*4LUrNyXojDwwTGqcku#q)ZVo>J_JSAWY5szo1uwDgyD2$J46pY`pHqR;N6kIN zeLdOUW*^^F9I#jliJUE`U_J~t`n`bK1Y(HcwsX5?fhUkv2cZ|+>NXMX)v>k#ABOv1 zUkK#+@HvDqn|`L&Z&}vQqV5J)m1PDGi+GDy2U;(~>mbizuitnUI3BI#zC&7lC4*4( zfC@Q1;f7k^j2SQw^hk-3e&U=*#$mAb0pdmEg{*wC6*=I(4 zAPn4`C}F4xD{$6ta!ohdFV#4HejQbJ_&WF2?b3kccl+eIfh}>Vs()-7knnx6)jxkx zXY5m_=R^4C$E-fB2tqB)GZUVq5hdVWjRNLVm4kk~Q^jT}$1qa9w`f@o&2e5Gh+X+J z1@Z$)dOS%|y%(QaQU|EHas9iv9 zeO&DJ2~VJWObkQJ9Mss{Kaj7Q$;)Er=^O_hV$QQXommFRO5V#R7#4|4?dn6vSpft( z^}LEuB0s2)lp7{uEnplDTOV{piG0L7X=b780!SYh*qbUlqFy-&Xkk#nyx=WxKr7*5 ziM*fi-(uYW8a(J6YygcYe`{GB5r*^1EoWSw!P$jEg+v#C*xWf;MDENt-Y|z=zbPQ{ zWsHDTJ-Kvb>ySgNrWOm4@mtOGDqN@^^&h9?yLw0BA9%rN4%V>Idc@md3;I0EMiI>` z2R+Q8q){4FJ|AUzJUh$OjFdpJl@$Djxv;lt?CD_txm*p96bUW!xLsE>wZ5)#gc?0X z*a;t5Y44W?`y8LSmrX0QJ&c7iXnxjow0QUzws~K2J<3*{`S88rg}4+Y?ri(M-5sM4 zXd(vJ+qaM-P77AX=I}R9kBopsB7Q74;vns{fBrF?|Q{=~edp(dm~gdLl!bNI?V{r3{jpYPG zCh*)95oK%VMF)~+1s^k^e|i(D$`!71v)-RNKPlbcaC}7nnwo{Wwf|f=fqE0m#Q(sA zvtAP*>oN+e`DH``1@fMz*h^f4D!BQs)l^&ial0oz*fW zFuA}5w}p&+wUr$zLsXN+43>Ug04GBVy8*#6=)k+?&-KpJ!_$F*%l`9u_NK zw7niSE~9wWz#}62I4LrbK6Zdz#lKsf5pc9oAG0i|U7t-KVVUzj4``9s`c(`II$_=) zK10abN*j3MaKf7I;OaNRn*EyQemwx`qeioNz4Ln$j`W2ds(^s)&6Cxta)?p3UW>wDv~zzMuE#>ug9A#k7%D+@`Ix%ZUy3_jL-1RA8`Gak zqdv1nmF~e;{*z{t;DRC)r8AH~{L?S|dci75K5W)YhA$w$$vW^uZB6~&IqOwBB$}Y#=o6L}ry%O0nGBTp9jFLzx`9E)` zum8t)b$yphSMNFJJ@4-s_jBL(<44(QmP5jFg5B6>xUy0h@d0GgFc$weEdQAYGU7gv zrvp3Mnnut!P+9qsAbRU?NvM^l?c_mu(HD?`0Uq}n4lIIk|vxw*1f*GQQdH@o3HhPfWcf*fWpJHh7@qEZrc}lF&Dt ztaT9*fxIvs6t{=*yGrS$G|N~G1ecZLV?faP;ns#@TwBNp?SSWh22dy`ab?)#$u=~| zU-T8aiUBMM5RL+&wv~UZoWybRf&&gl6^hWHXz-ln+lIjY8nXn*?o3CNVv(wLm6|CS znFJz=wKqj)Z@VQ4-;sjOiC25a;ZxnF)s!z3A0Nyj9$6)4yL?F$3Q!v$o6RNU+|_?$ z$x)D3`yj>-I(urF&SeW^+16FNk^$(Uf34zq{x)#0*by~zO3Y5dz|_{}Ctif=*W^Py zMnrW%_v!TqZqTYPPE>*Pa=E^!=GTQLVn0gJ%W0Nfv1dxacv>jBfW$71KIhfh>B28F zVoP)-qO#MAe0$i!SmvvAGEm1JlL?gO&@ISGygTWlQ2o+y1-O`60G!Onr-C~$tiq=D z*@9aVik5D3L%c*g#(B(olb_I^>ZG;HU(z(Y9987V2Bgwn-o z7!(dh1KKf#a%Ig9B1&HNkAD|80&P+VTayFWp=G^w%Ef*kN;-MS@|>U+PPLXe7R_jK za=Xm?N{K^c5_Lgl7e5QXZKb>Jy3xSm`>zm#90Qav;<3*N|! z1w7hX>fjA}jcVQ-?NxzN`^Ky6TXg;R`|Ky88v0~3(F^|EVGGGM<%o5w#w5UHrm!i{ zd)s&FH6jc>b>5H;=_SP;XcigTXo1%dEf(@$6sUPs!KW<$2I)MD6#ZA`=d6N~t>Dtf z0n5Nix!>(MqMkn3#{vPx^~8P$378QoWMTCp$5{RVEGM=E7nqAd$HiRBYQe~OaU(D| zxHPP?{1X@ih<+Wp(O+}-7Q1Fa>_u;%zUvQOKl2ry)p6-z>Zq`t;DBS;j~dsc3yB3= zmUj2e3Dy7}V#=c-nV?PA(^x0DbtHto>?N@zI+1kWNo0sju{_l^|93F`r$XfO5-xpo z8kKlNL<^q=B~Yryw1;JbXu@8x*~1}<;5Y4XR<;iwq$eUFj|WolC}Ry1N7xH*UtdBY z&*DSvy{$#lFK!5o$Oa!%fJB6h>8JDXk81xz&*6rN507a@@KlYqa6*2^D+iRq$YMI8 zxsUURs2XN|9jR!mGFMIaV{h}^7oj$~Y6r4Hz5}|&?7PCH2?ar%ZHN9)rOgSJU4MbY z3Ib~z_~ISAm_Yju2PhB-23%izrfT_b&G?6IVF4@<8j7Gu$=%!rR0MDvT4roA`gc7= zSb{zbKyYXpcAtMME4&gCa~e1gLG5D~vvvhlPr`IbPa;)8HZ@36_?!IaRx2Hb*Nv!n zcnRrYu{Wt=C3b2?)MDS@2SO%v@ODeOp3Gs9%VFF}lww!o3k+&B3B0gdY>kG0UZn8> z)+vUc+Z6~`8?+1z49^x}#E-zd{qQv9UP+T0xzL5@1GL2x8j&+@Z#EdP@bK_hOHJkA zFTpRkPsPV#ZKl1%yq6w2m6$^&fCSn>+mfsOG~F;o++7!8UO+$cC|+_Mh9#FkxRnXe z2_2d~3eT_)P-?U!H|=aCB@I(}>WeR@#7LddGEgkr;{ZR}hyb0JA}lhdjb!K!MksUf z=Wg*p%@_Dsy8{nf%QF!u->`rO3|Y*G@USB;)|DRr^Hr^?V5EPU#PD7dXV)%H-BB$* z{rg^G{TNYJ zJZC~1)$_{~9KPR}LFVeuQDw@7y^vEUCK(g8z?eQq{Les&pU3NV>y_T*&5Jgd99vJG z7y9#=H3(D%0)Uyvlyt#SjmZoMV|LIJAKGl3D+@fb$i{e=c1bmDH6$T%my;(E(L zWJ0GL+8mz=lMo$HCUQWujsX$2JRIOIsqvjw4m~^_N+-xO;mnKTF`Y%#DWl&Hz+)2U zLdG?Lc<2We5tbzQIlzWRXPbW5wS`#WBXMM|H-#4l`cXSS8g?R(&g*Fz^mI+SjLwmO zLS@>3<Upq6RHPQWa#UbOiAPEIE?xfpVK}J*f+WjazL=T%IZ6P}p8TB_Xv*7@L@JW}KiuB=-h1B! zs0xehCC~4U9dX8!i%Sh4BKIcps%(*RJ=S3m#bqSDD?+b0sFL%WW1g^#6KPK)BiMHfnzRQOu z8I}c1E=Q1QwHA-jy{}g#`~Bp4y&w!E0`jw7`F@lS-*XkPRKQq zOQ%Ezpy|gph#`y)*a{#Ae3-)6N2`G4IZZVj~taQ~gGh0g@Ta(@-pI zn06hlxRt`CU5wq&(G`DQQ5?>x3ye|(*G{|v4|f-YAcGj6o4`OIn(f2(m0P1#_St2( z-WnEH^noY$GXK0n)!KaLWF2v$jwrIg2lVVr1h$fgPesA*0j&-#VTp%=Cg=V{&Z*0o z9$MjjpR9gaCqg;uv@*#8c*{X+;qOs|=Si~iQTyhn``poF^~LH$`X_xXv?EW4~AwK8q0_5@Zfs|Cq8OPQ&*z8fX?hCN0rElbB;{k$~Y7$US#YzIy@6dW;U-_k@UY8R*Vj!&aU5(^&y@@{=c+3o^g9M%Df>qaB zf=!}7+nv}!vE4DG(y22ObJ>02=+kgv<8D-TyJ@{S^R47@yY;rdu5)~k0(N~rKv){U zT=M49yiDXp&8p0taU@~ab--ZN2OC6@4*a~%nor6gBH7{G*}ioQ;tlvCUF!8oNhrPX z@=)%TX*ZXh?RJm6(tqh?|9+d1q?v7)3vS;692QX{CmL6KP0`1)SWgJnA0 zVFTH{+AUwtByz1+d2BaGlJL8FUsrP_fMD`(4SIjsNu{EQ&c>=U)eUEjSw ze;oN-qxs;3z8-s`I9ut+^*1M5>jBfU@m>N_Pt)@8^46i=@D`@s=b*6x`FQTz8=}y$ z`DZSFpC3C6)hqjr){q#h*E~bD!`D(U5W6BEf*2tC0%Yu%L?WAFNA7Me+Uu<4oga80Ihb7!QD577oRtW^DFmeMc=eF7$}N-u+|mG%^Vfuzi1 z81D)qL!2V-lQ4NJSZ_4jdVFVM-5wU0@SC&+m)MLk*sYX5nFVG_q^QeU$D8uw54CP& z>${ke8Tb%N@`YeFYd#%CQ@*^lwm#5{{xkp^!h5Lb&f6i5WzDpwwc0wO^0V%|KV5RY zr5Ba~ZJYl5HXPz_RtNhQ?Pr={)p82u;SZ*!jbo*E-fQYqS(Vdp>ncsAtQ8)uYR|ix zoje+v>xt&g`PqH$nsq`^eSEf@vjxb7xMA&0G{`wrH}tC=9)KtxjTCxZy6Zke!RwAc zR_=Br+*0np9A`UG^C6+AYxfOIYej<{DZ1e} zz+UT#Ry~JYrMR`ULIvGg=deVWaB(1HO5-0o#YSF@oEin%XOhnP@lE4C52yq;56PL$ z_uN$gY&y##EZr)VTfY*!RNdYY##93xlfTT)R~_^#W(FneK$)Lh6quOGDgi{w~uDd{a+T-`yNNHRcM*@Yxb< z*=nQZHXr75X|G=Em|KG}Z#?_G&evCJ=952Okfm5kumAB;&t)deg99`H*TScpuZ6RQ zD6cw|+qx%xMpHz9wcF_S*7?u<#QflzW*!_A8aixGn=B7(%R#2y;v!@-q5Lz+NC9(Y zq3e$?Z)4w7SQpWg<_CjghAu^ddCJL~rlWGsrbZaCRV?p^!4FO%Z!dfp+oZZ7gRyw- z`oy2z0j$r;f;ODzlp5;`)v|(I1LnGa4D~2}42&t5>(-NR@Ca=Sp<@6OJ;C7*cR4%=JJfw<} z@;tCyXaD}8jZ$RAn+p>+*B8#9-BRyuCacvtlRm@^m02=Tn-(hL5@7=0w0u`xy|BLe zf!pS`Th)~JC3MJCFz=kjPJo4fuFc(v*DN_nDP$5Q2%R~d&xx5M9aKPMqO7cq91BV)*Q?c!$d(eG!Kt-szDb^SKU8 zqRYb8pB`R$dJQFd3J^&$CKk7&wd@uV5<3k`Mg{Q!g#L}hvGK=v7@Y|^l1Odf2`mCZ zw1-_!2BUR@4sVpi{e9Oa8M7Z59cD-ovpCWB>g6bL&s*pB?jPRnc)hy$e@Y3G$+6Ll zQ(~c=tU)ku>^1McpWl?=tx`F2q>g8h)|kKshb%21YZ96xIt4OLTiHXF4l`zkr8NH0IL9kY5Kcdng~ z=^bkKzxqxn>cgR(4jc7&^SdXpa-k>6OPoU_31Uy*y;DwhIZ_-gea87m4*!4NJT{W_ z+u4Bhao(0)?-RK*)zqti?|ww9{Wt#N3vd=FaMeh;TK+Oh@kNn|8~mRCmsq;ruJ0F1 zkShbg1cz6a_J1NdT*)g$1%BV!AUBBHa}c9QOjKB^s9J16uZ&=;ARUha2LB~+sGLo{ z_c82UOE7Uc6kH)l!&?HRedxa)BEkto8LS9#$a``66g$7f)&kS-?gH>-wR9O$#A7E5 zimyNu{=Jw=H6g$q4hJqu>c;y`cz~@`%$?HR}sVK?iAF7jv^s z-upe|x1UoQ1%iMGG)a?Ha52*jf^KaG&LADFY;zmt<3a0#M8K>ud@dlc!( zA^-tjBbv@AAo43C0`v0@3pn*ceVx-P$u~P^_Vz6fq}mrzW?o5v&nPEd$YK~d^5OH- zEq@+`cz$A2xe(ekKP3=&vp`c$KuJ-{3B;EG`4xc6t;m6HBAM*5^&!r!<8(zuJ= z(j8d3LvX9dZ{zq3!t8S_s^78#w!fkYkkjL1XyT;(4{2nOwO)bveKQW!?pKRwYGwD< zM}4eDEuzTB&s=0r7jaMhEGK=w25Zj72|)04=%#2*AsE*W3Tw&OjPR84yI@ZCfLs?QtKX zIy_+*&fC2id7hRHDol-L;-!0ES0-3j=Nex@SDkBgK`)cAldOpv^`h~Tw!~nuvGgeH ztprG3+NcsULZAlI;{q$mm+)^#n~weL@b!cYe1J}R)d8WLTahQEX4 zd_hypO{^I#Z;7b9(Tyaduwex;sHKR7O=4ICMV6$zGRJB>ap;Xc82m3jmU?l{*&R1! z3FD6F!6$m>!g7%I2$&l_AsqSP2}=2o9DgF5FkyrfHuK<^A@1B;w*iiKVS7&R5zjPr#wE7V#ECh0q{w6fn}X$ z+b0q?VhwC6)Y`|}Hs9Xo-A_c0@@*HtJ>`kmOCV-j!@rbME^t$Bx@cbvrRPSp`@Kp{ z-Uq15CCjQ11KrPbX(l5ls0gRvnsk;!PQkc4)H zQ|Fmmoa+O=?k9j+R@;(T`=Ivms69^=nS7(V`7=)3y}D5Ppw{rgw@I*gLZ*f9`P2ic z09)n;e$``Fw^1Q!ki7x)rfE-+kSN)m5daTpydQbK_&GWS#B5|C(GUTxSNEHz`rZ~z zahao|C>OgmDQXGBtxAq~e|8(halx?8wH@%;6<2K$^#%`j0}(-xEG500)0%_%(F`bc zG~U}lLx?^-ezc2vPh?hS{l}cho873r8w3vyV+rb?1W8YRJ5-ZI80VxR^MF&UF!3V; z4f^~cEV7MZgQsaq^7&jY65-e#W9c`+8>9^yqoSr`xNB)r2NZ(3fC%1+Fw;S(9ix`j z^YN~)$8G82eO$K64IbOLmOZBjcaX58OcLsCOw#pZft*r~B4TnRO%FHZR|y%L$R3nS zjA$Q8$T{^rD$vqywlik<>~y_R(y8 zb6J}qt$BNe!$CG|&kLQAnd*9bzx}C(MCUJ+N$SLGK~s4jwk)6P_x9Z0E`_Py>Cm<~ zrkCsXZWC)Xl;K3GK~!pxcK`batBV@hP`ma0-p9loCs`l1JYn{|8=HklFu3Q}1RfIw z_Gn~jzH+qVu|To-qsMk#=O5Bcx_z|L_v_b9uG}9DJ`#3w{^-FD#hwEc=`&Yu{0n{m zNk?9SjHn*k{zvcME&mGrwI1c3JV=d}QDAA^+Vf#8r7*@XPmhW@$&b`4uS|0Oczc|Y zb%-k}Nt!--W#_J9NqSF9T;-Hku^3;(?f~IQs3wnL`GK-ox%2SEkJ)2-`;{U%-L9IC zig{Ef&5O1h)Ky0wKQ|UP>!M5<#(L_H8uf3wl(!~`C7KuXdv!ke&6@J;SU$58qGhkEdF@W>KL!J_#sfO_GNQ8w@RUmW3jQd z+F^?H%vaa%c9YOlem%NEMsz5Iky$CMv`47>*Nz<$YPvzdZK0xH9m1_~2&7?t^pyI>Eb<}K6F_?L7 zAE6SKrfR>yUI-TmOf-Q696CAdRyClFi%1b26LJ-Ev^JU@Bgx?k0; z`~RJ)Q)i~9WxA((_u6Z(iBOc6_<)Fm2mt}{K}u3o83N*+C-{rAG)mN! z)0Y#MqNB5pg|hxmwF@Fosk6ZfDT?T!hM~V)rsZSNMVt8ncoC}$j+U~*r)YS)*Yh9uN|0K>X}>-Omo<&q$;Q&Cr0mK62(#vu*nf) z{wPYToej&(PAM_5FtL0!fC%9dy*6XE*JSyYDIAV@&dj8#0M|RC7OdGS@UFZ576~aA zAD(#z5f*mU5;jzK?>$;1+QvtNr(Wd@Q)_6$OAKbFUoUsBufOTuy?bPU4ebzneSOV( ze0^ObM?xCrz{dKB0R>^OZ6Hso@rnzKD}ueGmJks$VA$YZ;9$Ano_26au77Y zIXnbpm<0qha0UtdaDX51UgAO_;DCQL;3t{`^`E=%M04K#=NuCLEu)Z%h?ErYuVUnA zVq)uLZs&aV8aWG8HEW@&>8vRy%WY(5!(eD^_tk{K-Nyc{2n4S?H*jiW;%rFdZewlh z#O=;U@=p$K;QTF_k%Z`V`yCg5;ThIU3Nc?M<|49YLnIDmt@xSkkA2EjAWdQ<0 zzf4M0NY!2MWCbBZZU-0c%*+(2x7}C@F_BG1l$cmlnp}p8o=Tc5;YvZdRx|FCFlr42 ziSbyR&)TgIVN3OJl-B9%)9PbZDy!RQW)tf!3+wIevvaeV2e|1r%j?uV`?4ME^n?e? zEGi}@lNBql6$`d)! zpS7lskV?kJ3Bh3!SVBq|??{@-hmxzlr?FWTdt^xLZX?y_RjX$ji6%Inh2aaKzBC$j z5qde1kdWkRnhIi|pb(|9z(|K8L2jBsi^PnN+ed_lPxpk!jp3lA3Ms0p<`eD5L`6*t zxz&>Io7#&e@Qxbv-G||8G(klP9AZxs-uU|?IY5yD^?hSxVhVzWF+uD2^(#FFm!s>- zGFRK^LpTbAn7DZVNIEJS0f8;=*KbTvBxZ`x*3o3r1gzr@^@uQ%y-@+Z2~sR3gZaCx z#_-09qN1V+;dELok@}MTE;A-EROFiPa?j3~jGC!AY;`!~>xrmUi@*QYigRJj#Rxe< zyyNjboTlEo{bc#HT7wgy)XOP^3LHIQ%_RbH)F>W7PS&7C#L&|gupR=EF_Y-_hdbSk z+mJPEU%R`NjoZ%+UNk`VCSkhmF+aKi?QxTjE8F8Ne+9$)AJ2HY!5=z!o?eD4OMu5R zMy~$OI*0e;Gf@CkFVauyxNuwKr`5BTZZNWxjQd1ncsP|IQh2|Wy$cQk#yq#E^W*xh zDFwrZ4F>Si(E9wtTVXMoT^ER(pE+HDlzt~5bEGCQX|vPaBQS;+(Cgvco6&I)?SiFfyZ` zIB_MCKIcQ84WPXe)}Lm^odaSuhs%fyE*{As4GInHlB}xG>5if-3?!Q3*#a4O|EH(F zuZP6vkIN4!%0g&Qb(khmmsazK=bW2YaVBBXQ=l#?X(;uzbZ?;R9}}ixvl^ znlUSzzhXbo><@#D!#T+&JP6QUX|2dF6aAw0*`_(q#04?dzyGmHCzFQyiyEH88t()* zV1KpGOs)J^%c9v~t2sC%L~5feWZKa&Bkd^AwSHrHAu6Kp zR)1Vlgf&4AO8PmD-ys=L{2}hQ0mJ!N+`_`hPzqD5%X}ycRXSEJQuHDRX!g-29uMY1 z+H{K#1`GV*KZU2r1q243#^yE&y|q|upCtl6K2f3eDGa7ny)zNH^)k8V;4`@#8T=4gum>uxBJ5Id9FMz{WHT6+ko5C9YT`_t1u(^NHi{o@kXGS z=YZEs8ox-JIw*1ev9BKH^7A2ijc4iVRE^Ej$2N@jM|#%Fs*J$=E+}uh{4{ud6fwsK zbZDx~7)ErTBH3t;ec(H3SoOBzE7$91o>&{IpqdCFjwZZ0b(!7_t!Q%@@Vjm;Cc{ahe;h2+2(pk7_$J-qLZx=~l(I3gD786N2UpC!d(l~{yq-Nu{c20k9ZGW{lgPk7jx9M%mp8M<8vR7#yDRb;VBz)zC|gO%Cb|? zyH%He#wWJD73(FXYCPF1oyqF~YHnSVV_ax)KB(Cq(~u+~iTmsv5*jKU8~Z}}cyppL zL@NH23tF-j8%cAS_HxYp#Hd#)^EYgckjFGb?;_*qvB8P`uDo@rBvOy0%nlAYjHL@S+T@W z>$yOJ(86DXVZ|Hk)J<5Cls;pGZ~x2`W)bY)um?Wa0Vo&n2CFI4tsmdgr}F;T^g48; z36Yg$-zCChbhOk+g|<#yoYCq_jnw1sc&^$bL{J&1uK$kI7vCb%XZqNWNoElK{m(CY zPe!-i#OuhffyDNrT<=oijXIQKvlbg2;+>BcSME^#=)+=?Yz%G>R5`G-bqs>zH~ zjSgD{!uJx>^-6i-M|JZ0-sc6?RVgDK^@={Cnb^}=}UioTevn=jsD0LseAHb+%9vw2bDe9FpYNZ2SU>CI` zR0xpCV1g11O={F7UN+%n3cJlBom_g|ctJ+?^^{(A$)4N(xRQF6ULI&>yvM%boF9jO zMY4`=19iy15B5XWkKGaNk~!GRXORwH{XXv(g_pUdyOC4@QAfCdF+vpz>12kLe5(dz zlS9IIWjQ9}7gCR_d4y|8QPBgD*>bIASh31Zl)*xc0mN{s>&Rwn@4C5n)=?gG|QE$d&x3#&6KEUuX+@7L5FVvWn ztsVv&Z2TVMPu}Pb8=SRCH@>Z0al9$NI#XB7PJhe)2)}R>rEN!<18vJmc-_J z_)M+VoNx}>D$s7Y-5LKWQp&SR4xu<)7Fw^? z_GsEN@VNE(ymE#X$!EriMedcTHv!hHfAl0mzdvW%FxjEK-sV<5qvXZRhBFcdj8&|#69#HihSZZVYxvsCFq-osadMtQe_j8G z<4Cm}LnvXqibj=WOwLK%foy_k_6X5Sz?@iAv!AFYL0j??czas^I-@^zVQR*x>4yxt z!pxy1f&A-vP?n5lqml(O(lmW6dlG{#1-NZa%5l4&n9Y)xA(sE9xLohI{A{@%X`SU< z9A#E9ag)0Ymq-vW3uWXm*aM^4m(tV8@H=sRfGhc5#O@U?aE}W7WzOEeL9Gp?`-|uSM`N1f|Hi3l{5@a%8ee|80=T*?Pd_Q-OMY#HZE@+0@Akq1)R{*^zXf zzH`1C^F;S0OaAl5MR8G4i)1UsZJACKGFqZ8pU}z@Yh`$rGXs9mZuILj5_6UHwJ#eqqpULy(!{g2G_)?vAY7i z4Mm^sWmCMw1 zx%^&QFuP5OhQv@-w?AIuCh&Zodo9ebF+CrP}jXgP?q*A?Y@6i zL<3fXl_GRI8j?^A6v?tPTfVGE1QG&sQbuRUrC;^szaSToPNvP)$TjjUsYl2DYk%p@?Ay^5?`pyB&(lU5^=;edn4OMmOV86R z+dj+pD{Ifn){%0;Y3x2qp&y>LULMC%Ikz@@WG)uVY`!WBr8nE4B`u1n$K0GnlZ>+MKdWKtVbbS{u?@Wj;Jpsn$xP`?U0k*1qNe- zsR!Nd{tclIu6xTHQ^0G#Q!^TM6muC(P+#|>HXAc^Px%QMKG>bcH%~m0d1>ZXGe|y- z!Gs&hus7BG_80vUj&JQp$$J;!WF3{+Z>6!lI%_9oKrm)|qg|#hhs}A0n@9yAg(98k zE%_~(ieM__WJ&0G#y#SzSme;}v38>Ds|QWpa|ZpNtsJsc(Dinp+(Bme@kA&^2$;++S?UEv#QZg9Hz_WRy*iy%VfJ)D3+ztb1-&m=L%>uQfc#o~oQnj+u zbdOCZ(vmK4$18=t&vmq?E^iF(t#-zkrAhni?npXLz&h%6hK6WS=4|iC7_!n0DD2^A=m!(uOr14{*@a z@j#)x2%+WnQ)Vj zJF)rMTo#h%wNX?e+_*78dlYUv`Inu3;;{>1jEAiwoqoHp<*c)-2(MWNVKRd*3k^7N zrlv@^{)O@LT$)zR7-ooVPUwhw<@X2I++4~O1&}ol=wWZijVkwo>7DD$8SGKQA6?G1G&A&1JX{iwUIXM0_0y;3iCft9H2?1uZiL{*~QP|qN=t-A^z zUMQDNtswA>(T4=I)!gk*)iwqB5%ykR*G07J^D#z~r^w3Xtbm5=fNDejcICZ6MomK? zq*A#`k$jnY92}wdpL)#De(hFNlsDH+11X$JjG2g}`4a2x+T(OK?cEy#5*|Lu1Pf3x zz_I-s3+0DKlgxyy=xX;GKEP+}0STY0mBpR+&Tb`u3<$8I+iZ=}Hmhgx;kJZNr}NTp z#jt192dosSFK>|*8$?KQm)>=7Je_8A2nfIeJDq5RfuN`!IzWtJv%*RP#2Vl(uZFJS z`nugc|6KZqkjV`Oo~x>}O@YO9m<#|tUujV%Z2bR2C-pIuz16bSk+jW*%>pf1D4V+7 z8?DIYdfW)4Gc%D~Ks{BSJ$8YS-kLpo+|mT5b?)DL-BzqF8k&NXogod$kurv=ViSSRzNx6$nNp~CnenbQy+>_9I=d!XfSIC``fe(alQ!% zkTe=2BNsiu)()qVLO}`%31I~q%ymY7o!waDU1bQQ@-Y$=l?qHE2I|u9@_P)Q3}KWqEV%nJP=>hpMJ7ff^Z3B zX&BnJ?Ik%lR4+MM--3RwN+SZJul%&(Z90d|v8pq2b})kPKb) zI!yW_0%{!rwbl#5Ba~`Mbg9>PRhG)~stn-PYy8IIa)@-lpLaWRGyQkU-~9Tpj>YiF9TR?oFvl$01_M1R zr^kFWW8sjnxaD+^vO?d69&nXamg35$S~3e%OX8HvT{ zp(hOVBRu3NuG;-PtWN}ZGfF_eERn)pkLRfcUU@+bjZIklGI`0-b1b5(2KN3_{x5(g8>RSIQ2E8NPp z8|1%XP?NwQVti*U8tachr_6Uu9P~WObUImd0igJXQRo_yufnN;S13|IFGkMX-{g6I z_Hup3+f}!0Zhp~(`t{A_Sb--ZQt=qoA^gRL}d>AHY$RxG!_|ymA$eB`xWCj2{8}Pa4#N2MU4I3py=t9W z+JBd-5whwTrSM+#lUm;Y9`h{g+spP7;&$QvU&wmQ~vO_Y#@lZmz@ z9+k!jEHf!@PFCzPD5H%#yTrtQIacW%;bYRMeph(8jX-T}C)?_cj^7YKPF5?^IH;hu zni*76ZkDwe$mD6zLto2Sa58><@j=7Kr}y>s1zaiyj{+B~ffVLE2I7mks{?@cVUCFT zrVMFRcNi;EAdPvg{)1k-Veq0rM$L+eXx(D6w#2~~Q+4Q<<&N}1twsEDtA`2{6x4R- zCi(V)S@wi>CQ3py9Ssj-J#KFXpVAK*96Y-B14M80LyW_@>_wiz~?TkS4AvxwTi$2 zsr9G*hSyaFIw;>(3;=s--*;>S0jOKzXOEh*;ZUX|bnBv|G;tWq5QyS7j`Q0MOn}KW zQ>HNnul#MOKqh%RmfCM0jf6HzaQAGZJFbr^h*s-km`D=6E{R4Jx8IQY`Mui&3Fh{6 zxtdHV??VcrXW06SAX88Uzft9 z_0P|@vTCzSDCMn&@3?+d}a;$(J znRgw@*4|`PMIr`IId<1cWzj$2o$+Qqf~7F+WW~c8W!tpxvYcYBD1wU#T7|y5DD7|s zx94_>Y}yyC-Y9Gi7hyqvL6ngVzp*DC3U_-r4Mo&o*%T(F zN}Z5HZnkz1p|1r%;s`;L?zbTqg1P`u$DP+83~&OEBi>G zZq@m2oEVd?bCO)f_;Q!t@@Wll5vG}cwYzb8-DC`B^2~9%s;F|IH@de$)FC4xS$k0M7M; ziQ=cRPN%76018QG^XvB^d;_8mxa^G`C_5jfipJsy{qQQ2H-%A{wjT|9*V=GBM=~`k zbu1QI!2WX#!=RZ8ZJD|ogRZB{T8Az1`-`D=7W?rAaeGv4xNc8p^s#u#SWqu}!ogfs z)nXDsfuvx5JOvm$oHQgHpnFgfVa+!=CF@D!4Q_H-z(8?4 z4rXOL(}>j{89>QT*-Va!jBI>f=;bNbgP2VaW-= zkR|}&c#yHCN!rt8EUN)v&GP6#jhZ7>T5X_q!i!8gP^~2Wn#!FX<}%TDXlP|D1v6N3e_Q+8 zRotcMGax#u4jG5tm`I~5&Ud=H)A|tpOk6A&`Gbq#XmO@2j$G!`Kq_kyNE{_ez|R+x z6BH60EIIMDXZi`CgQE;=OVR?zGJaei%?^%rhnCv-uiJIqt(lCSu9U(cR;Z&>$SN)Y zZ2ZsO_>Hzdh@@x2inTMEaOoU&NkP3Vy*zS{mkL{KN!UUM9(7|{nNZM!|JQ0Yw6H zAG!y6Gg}(Hd4!zJlI!$XvkNsE%Jm74pc+WM5@hrkdQzD1gi?7Hl-^-bEipx%my2Pj z`U?fa<2}fC7#gu1;<+xCfU7haEv&{}9uyFa@a_RwRhRxO+(bh%$DdiG5iz1qTWZr^ z+H+4nGv8z=sm6E!?cVHE;G#2(aF9daj~;L&l$UtgmZa(u3?6fPBJ)-DMlYrm1WFC| z_a{g%M58HF}L!1{82OgvSjphAxek7GKPR#8vfzu4fH zjW}NTbRI^>7MNSyPqoE~q`35&#nlaO8(FsZ^76=e?|Npy<#tn!(Y{B3&Dx9or){my zN;ZiSn%g{;`CZoGOj#L(*+w9Yc+MA5@#lv!=)1?EsSlYIWt1`5im^?OJXN4nl>HP) zy_@3&RgGp+iI{#ABSMk(M|m}*Ece{P#gFFn!fQrl$6Su34l<^+ldEl`4zjWQI6QYa zLseLi8(!k}T9w`&F2}J1e1-KRY*6ig{s?-^-BmJ~w-}d9(%1_t2F)@+i?l==ATS)Q ze^`09(ZA7s$hke_mVAD@8GOhRPSgyL=`ufsL$-^nGsDqB-;0fPjL+Y-Fc0QEt^l;; zCYQS{D0r33ROWrnG$@FK6|0Mzb&GLuHHLs{e{dTIgP6-78)@Yr36%#~gNl*ImHSoP zE4>@FqHx->=NqPSp7`=MGR0+AR>OL0rzUM|pCo zGm*wp=L7+|ev#Fju-V!5*#T-8sS4EDb~XWjO!G}r-%oaZ%&=c|YRfEJ?3_@N((c>EB#b!I-(y}bjYIui>}m#GQS=O zZF}Tz(1-s|l(MW7CFiup*XOv09$-&r4d4}TTxZYUgJEE*YNxI6=il4h=-%RdyCYu7p3qTJBI{^TveMkYm>(aS zg^5(lOzAy#cGOF8b-tFc{x%)Jq160?MNk{{M{BDNsCg+ZY=_k>16=K})yuNK)aiKf zS8B#GB+7T6Wv@hyR--s4H}8B|L*Gk{yY;z#S*7t8o`9>YOGL|UJ4xws$otRJc?i1q z!>9IG-RLIJcvWrZp*WG#rz0E%>L-+HXU*PCP7t(EmE+@$&vPPC&s$D;AqeBmLAK87 z?pXt}2r*84WPcYngF2}DVhGfxBDVTwyo8CMxg2*@bq~h*;IgYNXDn&vMQ8~L90=*n z7Yb9z3w9xyZ8Z*EJ?)KxeiC^L6% zyULKjTt#N{dBr?P_-*(9uv{LgKUp%q$d{Vz@blB9Ibh;9yRB^0MRWx(kRm5Wd@#@U zI@OwCvzyu-QC_>Vg~O`)jExP1a74v9RScIpAO8xhn_7Lq7#Bhq{ak*F46i5@jDSEg z&K)o3*7BYe3P0*|*T}K#E*6_p25K+zPh9*gGhrHE*7Z*Q3763+L40}>_(CRlOkIHX zt3ZV(HKE3!RhRW4EQ$hu+(BH^)@&Q|5Ql(6#!X}u%$dnGk(tr0)cU<^*EvFKhUJUu5Nc@9 z%f3=J@*D?^w^?bZl`v>jw&FOcw0nCTtURjBJOrI&Mhob{i@wosO~4GKr!gPsdXDBl z#a_xJDao>!S7f(cCR#(j*E@N?u>GC>B-JeA7HqNB9>hCW`~#;0{SyJjhM{5HO!4|w zZ!x^-S=Jtam5$$`UlLYE$G-ecVU3B!4lAm!RMoxDw2yt zhp-txs2}3p_UM5WLWN>8UKK$LKJSRt;Mfz3Bq3_!Sfvcit?9jm-KTK7zc9hf*}&T1 zTX$o2{0omc{neU+8w#Xd2*}GC-2QbQ07OKYg*PUZM=MP&dR?KZP4NsofvE=kB%q`IIr(FWX)w5&$DT z&IoYj-StZj$Rv#_M&Zg&z2*Ldgn_vLOqEsB5+&li%dlQ(KB>~#`0n{AODk5Xr=n(pzy)T8wCwF#{zfd z*JvgWBmSC)ME!yDbcLR;)~DfYM#7srMLq9xv6-%r^aFOQ)#01o@-~4J`o37go3*mnUxNQ;U-Q{vQjv+ei0>6X~O59bmyo*@`3g`I1@ zWl(xi=R&meDQn_o!_NM5bV@a<8R>0b3HJ%+>a;oPqP&PJbgG5F;bxyS?PY5meaA8y z+8tpAzh61kvz`C*{guuSFXM zw$+rG;EvSBp1wesR~$dDzjtnVzd(M+^9U}61$u3i1!_Zu4$b2p?%kN=VIi( zZjA!|i(2O1Bk?;mQ*JvU87P`Db8IILJ7L`qx6ycf+&iq#X)dkXlEtSflWFWWB;fW( zTUjuy{zjrdy!}*#^+L^Gt_kI!$j^+}m~oO@eS3IVK0F&??7mMJTd|hkd7qv6s6o?Q z1Wzx6`>|&~@!_+_*)9K>X?3dAFVGtrR78ABl3Pz zz{zw-`-JB&nI=(gEldEiElNyzO6BKO`=7Q0aemR?Okc>z)g<2o{5Ux>K<>wF1JM-= z7?At-AERlu>EYp!s7eosxl))w;Dwuv!+;53%eQ&{-wE~vvPMcE2K0k*qr*q^02ing zZSJuL;N%P3o*H8RMdWXS!9}*t17#+F7;$xDjr%D*4B+soo;Q8|6(#65s}A{3yx{*< z!QNNsG{qVHJ16Bm7n0|jEE>>i75y5*`!CV||0x>q|F29JPFPpoHOEU03Z|nO)WAAT z5()b_01(PE4^Q`(Lv6RKv|`^dete<_Nj^VZ_l%7x*pTMd?qvJD`~Z09eexo+ED!O) zB>J-Cx8a^FG=>xX`Sa&wkpdw$lYzfp{I5rFhd%$qJ}I!>wgI6t3$Z-$Xke*vc@9`y z?N3Y=%Hg)Xjd%h(IW5t{?V8_CMZ>Bxy|C0wjfsrf4@5-7Nh@y!Ny+eXohD^QE@A^Z zt(ts25^3EyG!%NBMnw`*((5=$fG5ib)mgsDdc&z)q#Ommcw87;%#~cLl`NP?Zih9p0n%!py^n z0Flx}-{*&>5u&*qp?6xpO{2GmQ&p-W*Z``KZ%_Le6n;F5S|A2U#-^O)t=|G=xzod2 zpK^<`Jf&S+ep{}#Ha(s95qeS^u6bWZdjsd50|+a}^>%BO$)c{{ReD?w+i4kj_h{Kv zmH~kBH6Bc$E`0(dThr|MH$Ygc(fM>)E776OY>Ysw*}24ewN*<_B9=gH3->GocpU>W zjBRA((h1`Q=nXbY?AQXnt$?E_3h0qbCMsCXkXxeZ7FQ_5$22Npo-Y%k&ttz?fhW`Xm;WN8#-oLAO5+XUbA;Tt8^xAw7j zeVvz`7{6`BE%^4A)1G|WwrZ&=b%{<>jh^GTn3yDw%iWSS=)tYqpxXovJ3YWL^vajd z|$!Iim695iD@+$=Ps@pI3(<^vPGh&T1}6L(fBu+|nLy4@s|EwOEnZg$}|` zA0QSB(YkaR?S)o8K@7;+kA7m%(M)7sX><^I9syKmbq~CEa+_YodTq_k<6EcCZ*vqU z$e)T?90p%VrFEb<`~WS2$LFE8yV#o(*wYX1ZkFuu0q5QcE0L;grUbAL=X%}6^PKH~ zi|&3jLTxsh5z`+o*#<{RcYCrlSKoSM49yfnt5Lacw#Z6j8e^92GkbIIIwe8qlOL06 z0bXsZ-$6@1#=_K>09X~9A#KV$7H|rWTcz)81rSrp=!W04)*rI%y7dNRKhMY8%ruMV zH$X(iI}A0LE9wu`D*MsZ#SkM;6k^3{e493(Lew{}R!8ygRSmr%PAhfgN)xl%TP%TF z?j{mZSU(%M0XsEp2%UL8xF82^yVc9MWaf%mr(g9od*+j|VTFouUqVYyqSr3WvNC~o ziUIT{OGyp#cOzSN;XLBsKNYp2wsJ-hadd9&G>-w!c8QCt3G)Wq@R$N%D=g9_AW>;% zD=`Cs#eG;oU8IoBf38;qtjqIRElSnaiWowH(_&Cvsg0JKN+OLKUNWQptXKGZ%!XhZ z@zX+JmLKuu>j-`UBA!c*2y(^qE2ThLE+BAc)AAZjp^Bq4AjhD}se5}55Pv;oXU*v} zs>L}_mORuBS)vjWOR(=MA-T&nt4Z{l06TC{;jqxgcyz>|)5tWiXMD0)XS0@E)a-Kf z$u9e7u1aG`nS`jzQTaCLJ=NVuoei&sq;42!g)waC4fv?z`UN>^kBI=lfSw}7LgfOw zjW2p)5J$?3IYL33ZSr5I`hSpK|IS1yUPu&yLBk|>!<4duFcK~cZ@B=RIOnUwnW2dm zH#-R+JZCc$h0g=f2;@*CwG{J-ox!s?z%H=nic6u|YbOTC9c^wSjczu=2uszITu&Ak z2+9DWeZP%tx8jn3ebM!+&WUW4+x|?WKgP<7n%nMm2GKXgW!;7y`-AQfI#!=3t+!0>Q^iUG0@O9Z}^PX5MZ|S z{hsSqW#|;NN0q;Jc{$k}PyiOOwkOZO7>IkF(?I1(#LjA~jD9B;*=&n(5#D*H>$X^L zQ&u@^gx~xz^%#VKLY0%AIJ4OkY4a`|*dve7y6v-(qzVuP@JAiDDYWwGbOvM1KT_QV=vcfwh4L=AtsP;S%gYtJ(s69II=IJ4I-j z74k+lHJL|*%s+Av3t?|ULxf@mG$!pszs<%44M|F8QM!Urb$NA(&0Xlj z4u(@%n}g$ZIa+~DSM){ZGL8;D(nBLq<#GBai!8&f@HE zGX+ehjpZJ$W1Quj5ZI#;Cqf}I2DFrBAjnt5OX1xx%c7*DbjaBVTdL{G7wU329ih_8 zy-}xLsdK>Ty#L+Ork2)7ex9S5X0ugXrbzd*ysYcW>)Ymgaz;gDIhiljDh)wnNKVaf~!dGuT|xej~`#F?XAYV5KNS?>cib@Nt^w`_rkCFUr3ivMU28Frbu znN1ffoexq@3!7q+p?v?Y&Wq zEVWP8yi0m_3MMTcykuLkT#3W zUK+6l;{BH6abx{{qpMY27qB9Ff=_+!7*6J0`2I5gcI0Tc2Kv%0O4l-GBJWD?<65y} z)EhOS{r33~{RP#@4M0y`>(Civ$XJ{zyWu8!c-$ya#Q;??8 z8ixz-^3dkhU{b!H2VPT2janv`llY1P0`@h)S`;_*nyK<$XG~Qa^<6Dj2vM-n8Vejv z6~*d(19u|}sG5`m6uli^@)ts%s~>}{9qf zwT|`Ra61vq*ZYQiP^haFr1PdRz~umNT9THn=poM4I%~?y^R51y zTsN&R@2IW)JO9ccFI8L${#^Nx9I5QBdDNlyhJHP`T!ZkD)D z0H_Wowm1gvMvqm4ei;b0?h(M-la#a5jjgtm6gAYnJ*w&`tpVbV zQNIb|S2XEc9KKefHxCiZHKP*s9DvevRu5T{l@UiyXwbWfTUgEp!ypokt69AP$8E)1lY(m44Q@V~_XsS+Q z6FI+(<4;WZHL| z@e@=IC>IlGqf&rF8TSmUbl$fF)tW0|^Lf^;#x*zAqmXL|udtkeKA;Dt*8w2-2N*Cj zj%_0R>$VqCZ0=_U*zDFRfDm)pRVOaf-yec6nQ0kDfEP=i=qb=cfIV7`dJr7;7mAYF7KyDHao2C17+qwKjuLl%k`(199 zlkj>7voThf=}fDZlgDv&-?WF3aD&Jb!I}9^vjVNNf=;dZk1uwsI#mwHox&}yC#r(k zi<*6)6-4N#H;-aqBg~Y95B!P7&o$8}D(@HWlmQ&(BY>$7$SGA3tC3kDAp#5B)_gQZ z(iJDp$pSM`^5m|3Pq(ooRJ~Q zaZ^`gDu5KFSDIb6kRJLPOZT$;n8@c8Pb{c$Wp#-+^FXAp4 zm;Nh_KmI-}YQL@i^DKa-b(lO_j3(}K$5k+p4Lfo|m;P~r&?<2B@~ail=(Vx&FU$0U z2#nB=$xM(?8{3iRzI3k!pA*i`^(Kt-6(6^EC*X+~LyLNrwf*fy@z~;JZj!mRmT&Ax zpsr3I-CUMBZOc1L?`m`SezW4zG0?_U*3b)lC8S?j0*>##_Oh1?Iz{YT1o2m=BWMqO z-Fy>F=GKmEVW>9do*-h^jJr@W?{iNBn=v3c!5&hkd9OYYM}DnSE)`F4z~yCL*EM5U z>zLy*n3jcoS-E2Wz5cVs_mkkz(80k(+H2)ON4Y&dhfPsnGa8q^2Q3*##v)>KrD zFId_D>nu0M^)vCE#`ubmm8@mb)h03hggwZse86AAM;wXwdfeGUitiZdqnPK4(R`AlUuJQWh|p+0q^7L(_43p z#{-mdqofU6ah=nq%BtEA;orZXBH!vtw4D3&(FqXrv@z@itE0`abar-nT6NizO3xwL zH(pq+%B^8mw!57yvdMeM0>U|^r4w5$F7t7sx)IFE{sy}>e!ctrS`_Sn$W@%|m1wPK z2o+$f`}6YdJjUZ|YW=dqO01I7oc1Q*q3UGR>?Wjv!j&I*t6894-FJouPVY#qe(Gw; zI_-_l6nx$A0$|dyYokXweyw*?lHEjZ2mm1(CWRBmo6K%g$Ge<>wW3SHP%c3mcjRP$ zEcY*0IsdHD12(nR-bjL{Z1OFQd{LhQ5T%LPmvEclj7GN%{hT zBTqRxw|94dQnPgL>&9-}eDZl_f2D5A^c{ITs(mkZFmj{T{(Ht&6v`ufP>H>Mz66Z` z8aRcNTG+9%UVbEtPdmEr&*PV$Jiji0~k zLZLB%*Nk@N)_pc_gahww$qe2F!VT)fa9(mXbczo&-7aRQY zaKxA>2)VTfY{{Re21CcTANZMH_9i3<)wX^PC&}@C<;CR}0R1Q*PYX4&bM(=Vc>dr( z4?cBjir2KF2X>AEM;bcmKz^Txzb(RP(+C>-6VjWdey=a*g9QBEns#y-s3^r{6P1rl zMF61gYtfH#N#pgXS&ffxVJ2>biaA#~1+@<&RPD%r9qR!=e6CE3olj@*T&LOZrO<(5 z(Po=YnJ6WXx)sXR4ph2E8@5_`?Rx78FBzN`2llB#xhd_FkrZaqRi|I0GzDYmWq?<( ze8V;SxScW%GP&i(irgK&I+)r@S#nuHp@&qp4;0$zn*zMgG7d(jCIP|OrH!wh!7XgBZKI$MZeDc57b?BC2zpY%3#(xH_zNwupl;Yt2 zPkUb(73KQwE#0w2KpLcU+_ZFuD4WS+iM1-TzT!j$?N|K{3*;ry`|M^pRphBBW;yL`Z27ZZDFc)Xye8V?6OLp84MY?S zgIXHa-g4v76XlK*?zV)=e!Zzl)FmqFmboME=GV5TYa&-YaY&A1x>>V}jl+HHKFj&_ zH@sK)mJCkRPeG}tucC-+%fC)G`qQzRt&=CEaH&SThexMCDFol|o>}Rh7hb(5S=~x$ zJ<^uZyjCuxOM&?Amx;x*MFH{17Qye8^q4m}UpR>|_3n&UW{h|kkR}8d>;W{qktru_ zAt~YAFMb#9svCxmmmX1cogoA{N2V;z)B8-sI>LgkTX46Q|5oPX6FF}(svBO|FKaI{ zF8O8}alLmxwut{RmfEeO4N{S32z1PGKIa_baus*^S@NZ@E z4U0q21s;ZZ_OPY#m0Sn~;poGOO%HjJ(6H}Q{G%B{WJ%Wy)eOC`AmD!VkveuwH8Bpn zo8ZATMa{EW-`3G+r5}^?-6|w!DUDJ*-uZ+MO%$fuJzten`WS3?iJu;=#fw z#hrdt2Zv2P3ULK)-oK*g)~LeQ&zC*fi?j~DyhFtzkq9(Rk@Yr!uUIDQ@F<4@&7_Z7 znQe7d_s8@AsM<8~DiPqbxpM!*{fBe2&Q3J>gT7WjK{Gr{=nQsH{lkhda_J^5x{l>K zmM8P%3wXVftS*%piv}Ov=ugT|&V_y>VfRr&8OkT%{e$-$9H_2%$U7oLGsry?|nLRIFvLeoTY!83^a=qATR`O77T3iVB|P` z{SWc~={x^7hrs{8=%1DQ-`1%+FWCNQe{<`5%~Tg|9DZI~?L2|5CLtkN5ijZnEX8Jd zu*fgcxduSo1AtI%ppWpQs`CK-=h9Sj^ZoTnbM;tu0f0dVP0vaKa-9lL;B!To!hYUd z8!cBA0D$t3czM92aB!}|{xksyHM1<}MmnNdhJL{LzbIa$1uQ&D#|GzR2Q=gwC=g$a z#4SOCxjdTx)td>-JFr)*l@du=x1ovY9szkBhyxQqf2oI0K(IUfF6StUNo+6xc!r-h zou``2|Idel(jI-y%uRh`u4_CKgj~DNKCgbR(tl*%*H-0FU$8*X!36cAv3+a}lXJ;lt4*dK9saT7^bA zE36$n0Z>N#O8n2aZ2%L|DZe+Khp-cB*a(GsaP?lj&t@*NNbf2!<@xO7nhlW^{$j?(vS82b(8(#~%8i1ig7LoOMcVz_+&Z`?S%%X#Onig@<4Xo^q39T*0hI5lx_$!CaaXQkT{8*M2@5(T zQ4HO)MxFaSkE$gxPWbPawY|`1_=WG*v%=~?fM*=)a9}*soL~z~st{o|X^-)W{8el`N_S*T}QH z$QqTF%{K2(#fCyvQ43?o-#%A4zWm!d5{FOxbOPDQu%lI#%aq0OY3T|;B?xllB^<%# zL2EXfk4Qh2X0U=uYO9^`_WO5{bf|)ItMq@%TVCY9o^Q+w+|?W4iCSjx#Vv?iS{JZoy!nrASYPclqt+t99fjEqM8TX zsu+QN^DC1VDo6@!>~8+7fZXaf_{ybS^q2J1h}3=98iJ4!x^6+vw7e{^jm|Ci&jS8PlEBZ&fAi?Fcyt(=YKz+@OhxQMM(n(0YUbE>iUNfu!C?0hD(-RAuef^?o^{ckR=^{_{s}#r4tag2w zsBU0eJ%G*o&w_J(?aUdb1XXR(O{q8P`* zh))&i^H+V?f%^a~$5o**F$9)6&mEn@8UxOYsxs)Imc*&C;NuwbuTBnY^xs2QsB^wZ zj-I|H;JrGkD-fo;WVj;C)S6(i;(DImwyL)JE%JvN|Xl*%21{MK6^7 zMcCuOgl$8^fVzCJe`9TWKeq?`ExXJQWwN4_K9vU^dR586jzbYIWYbq$%g69uvF}%6 ztAG7kxQcTB@8}lPcbceReR(^m`3_@)4Za@NK%>K^uCune&>*Q;8{ejw4sNJk=^0ae+6^_s$vV^KH$T2sNvO$ zT`WgXp#fQ*D64wpzYfcmyCRAY?H|;kYV~3nh$_{M zr?%m)7U<-t;4A_w3Ae64ae8~^2MiZabT1i{(DGGY!27X69YbH~_~n-T^Zv6BlS^Q$ zFNxx97I1?N# zgM#N`7_=+bjA!K3F7sfTeEpmTE`(1Jn8f$z-t}r<8LxZuIWr+kpibdvLp4cxql_tN zNxV0?1h}vc*_XJUD?p<{-7N1i4aOx$>m0(nw7-!eb-e#xmkgH&10uNa#sy`9Z+0J^ z^TK=uzA*+3C`1MDC&E*>qmPqQB}FjG8*f}|G3ewl%f!W?0fK0*q6X?wcSg98?&edH znEg6~Eeb}#R}1MI?B4OUWARPP?PmgTS%_eyPQBN?UHf^B2P`2%__TzVYV8KVESZZ@YucOick6KF zC0-|3V8jsfeTC$d$mGqPQLBcLM}Kf54Qg>9+GK<8kdzpqL7ZOJcLSs(zSj+(K&2XO zLO0Te(>-qt84fK{>^9DANgIWQqpc^w1`JUTTjX_C`QFeIS&Ilq5E#z85j8qzU>uI# z0kLHJ@v8><9(T4N~hTL~PTg<-hve*Y)=iTP->Jg=DOZEC> zk^JD$X%z~k841TPW!j2+-I6G4=)C)A)09lvHPy($O*>Y=D<%O+s&n+{sDW} zd93clZ123O3o}4mW+jNC&?K+anb`|n_-mCGU#0TYWP4Bn5|G+vGEw&#gc!!k7zIEe ziu{8C0i9@aj%TM?tR+bZ6=sr4O64*cJ|UrghK#44ZBLZz_5NTR{K6grL?vl>94(%C zenJ~_c(y5BwpQX0u3Am|i+wTCEC#aA?|z^;(j>k>pu8`l_?J|~^#scY$+DEmlJ$Xq zDN0RVC%1gAa1WFDq|fR2jJ5^A6k7}(MixWteWzGW#Wi4H*-l|EgoH!K{CmG&weR+w zs$Qq0LzlWYXxb&rOGfIgEwxJ?;xpqst6%PVcsF zS0k2FO3@3TuKdL*B?n%sYgqzZ`{Q>;G(Q1hkuWa$_zYDDlOSUH0->mssDLE2um^IK zJerimsgMDcL8Ex2L)Fu9A7Tots5L0I7W&GF%llHru;n0WzyjlnWLn{LZBcT0B}sQF zI5p}_C+iLMdF>L_(C{49hcdv=ykr-tWeZ!R3vKAbfT9$&lr!-1NP?fb?1xf7&?CauX|T*>7vuiSHmz}9 z78l_%4k4Rj9A;8RYwo-Tfppd6(~)PAE}4FU78GFz@sx8w-k|#0{J2MT=2tmq&U8)7 zV!f>h&royQ>#Vq%abCHC6qsXG$|c}wZ)xzQW>T(2*bxdlFs=JSf*&=vt6RhFu&D!E zf_JcQ%xoQ9hqewj5V#$554fXpyMp<%Sl00l--?)4IV5Q|=vF%!@5%)PWd=yJ?8SJ3 zf(NAiI899zd$ah_t)A_3Ws%#x;eA$oY|6QWiRFCm!4RWVy!)(Y&qd`UU4R6u9j^Z0 zp3zkbCogs6v{rdQlcb33{qgGEwGc%pQV9ox9ZJX3&<5y2GE$!mWn{3KS5>et%{xUq$S_Dwd+X3maV8k$7SIh|} zjpHqaR$1f_>#sVmh(KtjxE4;I4UwqkzS!#j84Rz8C&4}8mXsln>x9y+OUGv8lxdY8 z@9z5jSY_g;OM|7xzVcq5bnD`LUv-CZ=j$6T;dZ|Uq0599Nex`(Hpg*s9+r*f^2apho&x`d%WpAxdkQQAop*Uz=@^qP5p?fH$?v<(cSpoPu^-eyw*`B-0E_Uu}y zcm2(e!PX1w3t9GONw{566U}D6Tg<`h{MMEoYPYe}XQ{INQzur^#v2t4rA}NQ^WQI> z7RzD9IAZ2H7dlpO&D4nd-m&l2*m&!~A58R2{Qeet$Gao9(JMS1XH$)7PiuJU2&fJ* z+t9fdVMXpx;f(?7aSDN7nCb|AbTLDW%MJtafcsHDT#R)Olr(A;7M=H z{^1-hSU~OFe^L+5yQrw(-uRzc1gG!(Z)5g<4=nh9_#%j{l@Bsyg$eM*tqcUXd*i{= zr@8d80H^Cq039A^CIH&pf({ACV%YAjP3VDo3fj`>bI|9fJW5IoyakT7;j-I8V6KhF zCnCQN@{jpcyUYRJ(^Y+M>g=&N6aR&oHW2dcfYZt<%zgnAafRcEpfs*2orHE6r-Ms^ zfW(AKhat^xeOW>{xfFDeIE@^+E7VU${)=1pvkv#xQ$X7I9yV|RY)xE%fH81+pCy1& zT>4y9{2Z7icuo`TBG`Ox2!zCEW!>Jw^juX_D{Qd>=*u1Gi$;mRKoNxs=?0k-9|;YZ zufVL+8b)IK?$ICaJBzvpE(bwqGf*wa{TQ`I6e>UI0~o*tL@)>`8UG)zC|M+KBoS!u zMegkn>T4HaGi1HHf=-V4p{q$OHZ0TJoNc$AeHV%TN5onnCq}9gTLM8bkx@}dy4lCF zBB^DudkOi$q}uGDw}b;lgW*r3Y?FH?)lN7y=P>W8Ii$f534TbEOaUnVx>CfM#;f`L z6AuQhb&@%EM?uLr^jvH&t4^=NMx%;)d8AAT^#4f&B-DlT`KuoN*~$o|=K!(79HU+m zh64&2cq$p-I0I(5>rFMKaaaxvy5i$Ru{9o|w?74NuzRPfUKuI3zE)&V@;u<=cn?iP z^7p|!W2&g_<0uZr$$OR|3qTtif_o~jQ%#&)RHNk*npM{?CFDsnV8MMywq>q4jy;QX+#i_CLEsT#W5;$>*1ynL+`K?I%(2)%|zv*1+3I-*osY;WdUJ}B3;mlmz@$7n05%gHg0EyL30 zVLowP#BCzT)!`Q>zRFIbM#X$3?q-@~kwH#e94#(N1JxlBHK$B0<-L((TIrNy;u<$k zRU!ot&PP-0)TMeHImTW>8=gZ?E@?`ny+^jV{7}&Sy-p2Gij(0!3=~lr3NL`R5XhFE^*mFJ%uhzYVUsmG26EH@AG#kuzRh3A_|xIEgSMck|19O$c|M zy1;nyJo}pq3jI55`q64S(@}`pZ5ovR=;Q~#dt1Mwd~&aF`B)l~8DF_AR6q%C0o*Hb znJfNnL8|_4g8sJz`dzbsuSHU|_NRt4!ut^czU_+FoEsAZe*gT7LlqPe=M)v?x!tXg zoBafre!B{E(dXQ@;?miER9QT}ytV3ECp9BWHr1$mD{$gwOwhhwMMZBx*Wo`AKe|6% zFYj^5{QU9hEXEqd4_;5ZKkax*%Lcp#YE-ArUGM8conNQeDZ>lTB$8xe`c*5fO_7fA zR^=L>^s;!r<1G0^lX)+V_U8{KOuv69+QYY(P@eJf(X_>`QDNW3&J!<52tYO#FrA4g z(P;gBr0Zp{m`X0z8O=P5ec!&>yXJ0x39)s2t`k}L$V38np+-f^zn8xEVBAU9A4U%i z&K*nz8N|jF?QrYaj5>)|U#$E0_l~f<7*wCxOO%rCTFa=La}xM6B_ZZ_a#4YdvTgUW zbbP4!VexRbRdY|GRkJ|9qqS|39{-CZ(paM(5dMDp()4tf2+)wf&_dR*@V9tu_WN{i zdZTIQ-DkzEPnHMt|6TpgT@}+L;a1N-3=e$nvd*>}#^_3`2U`vr}wx712iEJObb@73;V literal 30520 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 From 7b70ee111f7024a4fa739fcee477aaca0fde7fe5 Mon Sep 17 00:00:00 2001 From: kenjis Date: Wed, 4 Oct 2023 18:00:54 +0900 Subject: [PATCH 142/209] refactor: delete duplicate codes for Composer loading --- system/Autoloader/Autoloader.php | 14 +++++++++----- system/bootstrap.php | 14 -------------- 2 files changed, 9 insertions(+), 19 deletions(-) diff --git a/system/Autoloader/Autoloader.php b/system/Autoloader/Autoloader.php index dcddec1d2976..ecfd92b5ef8b 100644 --- a/system/Autoloader/Autoloader.php +++ b/system/Autoloader/Autoloader.php @@ -124,17 +124,21 @@ public function initialize(Autoload $config, Modules $modules) } if (is_file(COMPOSER_PATH)) { - $this->loadComposerInfo($modules); + $this->loadComposerAutoloader($modules); } return $this; } - private function loadComposerInfo(Modules $modules): void + private function loadComposerAutoloader(Modules $modules): void { - /** - * @var ClassLoader $composer - */ + // The path to the vendor directory. + // We do not want to enforce this, so set the constant if Composer was used. + if (! defined('VENDORPATH')) { + define('VENDORPATH', dirname(COMPOSER_PATH) . DIRECTORY_SEPARATOR); + } + + /** @var ClassLoader $composer */ $composer = include COMPOSER_PATH; $this->loadComposerClassmap($composer); diff --git a/system/bootstrap.php b/system/bootstrap.php index 41736590a927..5d2ca0b225c3 100644 --- a/system/bootstrap.php +++ b/system/bootstrap.php @@ -104,17 +104,3 @@ // Initialize and register the loader with the SPL autoloader stack. Services::autoloader()->initialize(new Autoload(), new Modules())->register(); Services::autoloader()->loadHelpers(); - -// Now load Composer's if it's available -if (is_file(COMPOSER_PATH)) { - /* - * The path to the vendor directory. - * - * We do not want to enforce this, so set the constant if Composer was used. - */ - if (! defined('VENDORPATH')) { - define('VENDORPATH', dirname(COMPOSER_PATH) . DIRECTORY_SEPARATOR); - } - - require_once COMPOSER_PATH; -} From 58f06a948991564d3569e8f3a1be4b4ae6955f7b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Oct 2023 15:16:19 +0000 Subject: [PATCH 143/209] build(deps-dev): update rector/rector requirement from 0.18.4 to 0.18.5 Updates the requirements on [rector/rector](https://github.com/rectorphp/rector) to permit the latest version. - [Release notes](https://github.com/rectorphp/rector/releases) - [Commits](https://github.com/rectorphp/rector/compare/0.18.4...0.18.5) --- updated-dependencies: - dependency-name: rector/rector dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 27e77b515910..cd134a93f9bd 100644 --- a/composer.json +++ b/composer.json @@ -33,7 +33,7 @@ "phpunit/phpcov": "^8.2", "phpunit/phpunit": "^9.1", "predis/predis": "^1.1 || ^2.0", - "rector/rector": "0.18.4", + "rector/rector": "0.18.5", "vimeo/psalm": "^5.0" }, "suggest": { From 02e8805693e5529afa147f2e3a1c49423c1b1116 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Fri, 6 Oct 2023 05:08:27 +0700 Subject: [PATCH 144/209] remove CountOnNullRector from skip list as now deprecated --- rector.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/rector.php b/rector.php index 0cbfa41114b1..c2b76343dfff 100644 --- a/rector.php +++ b/rector.php @@ -35,7 +35,6 @@ use Rector\EarlyReturn\Rector\Return_\PreparedValueToEarlyReturnRector; use Rector\Php55\Rector\String_\StringClassNameToClassConstantRector; use Rector\Php70\Rector\FuncCall\RandomFunctionRector; -use Rector\Php71\Rector\FuncCall\CountOnNullRector; use Rector\Php73\Rector\FuncCall\JsonThrowOnErrorRector; use Rector\PHPUnit\CodeQuality\Rector\Class_\YieldDataProviderRector; use Rector\PHPUnit\Set\PHPUnitSetList; @@ -105,9 +104,6 @@ __DIR__ . '/system/Session/Handlers', ], - // sometime too detail - CountOnNullRector::class, - // use mt_rand instead of random_int on purpose on non-cryptographically random RandomFunctionRector::class, From 7f3b27a85c68d962ad9ea7f5ac1348bae54fb2f1 Mon Sep 17 00:00:00 2001 From: kenjis Date: Fri, 6 Oct 2023 11:32:34 +0900 Subject: [PATCH 145/209] fix: CI returns 200 OK to PageNotFound --- system/CodeIgniter.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/system/CodeIgniter.php b/system/CodeIgniter.php index dd00746bf567..95be7771b281 100644 --- a/system/CodeIgniter.php +++ b/system/CodeIgniter.php @@ -979,8 +979,7 @@ protected function display404errors(PageNotFoundException $e) // Display 404 Errors $this->response->setStatusCode($e->getCode()); - echo $this->outputBufferingEnd(); - flush(); + $this->outputBufferingEnd(); // Throws new PageNotFoundException and remove exception message on production. throw PageNotFoundException::forPageNotFound( From 33708a88bb3a7897f24861d74d8172dbdcf49bcc Mon Sep 17 00:00:00 2001 From: kenjis Date: Fri, 6 Oct 2023 11:59:17 +0900 Subject: [PATCH 146/209] docs: add changelog --- user_guide_src/source/changelogs/v4.4.2.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/user_guide_src/source/changelogs/v4.4.2.rst b/user_guide_src/source/changelogs/v4.4.2.rst index 6da0e5a04953..68cba760c549 100644 --- a/user_guide_src/source/changelogs/v4.4.2.rst +++ b/user_guide_src/source/changelogs/v4.4.2.rst @@ -32,6 +32,9 @@ Deprecations Bugs Fixed ********** +- **CodeIgniter:** Fixed a bug that returned "200 OK" response status code when + Page Not Found. + See the repo's `CHANGELOG.md `_ for a complete list of bugs fixed. From b7b69395e0cdd74982b619d789c647f9d0819c9d Mon Sep 17 00:00:00 2001 From: kenjis Date: Fri, 6 Oct 2023 13:38:59 +0900 Subject: [PATCH 147/209] style: remove duplicate () --- system/Debug/Toolbar.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/Debug/Toolbar.php b/system/Debug/Toolbar.php index 19a67b455db3..73c777ba7289 100644 --- a/system/Debug/Toolbar.php +++ b/system/Debug/Toolbar.php @@ -83,7 +83,7 @@ public function run(float $startTime, float $totalTime, RequestInterface $reques $data['isAJAX'] = $request->isAJAX(); $data['startTime'] = $startTime; $data['totalTime'] = $totalTime * 1000; - $data['totalMemory'] = number_format((memory_get_peak_usage()) / 1024 / 1024, 3); + $data['totalMemory'] = number_format(memory_get_peak_usage() / 1024 / 1024, 3); $data['segmentDuration'] = $this->roundTo($data['totalTime'] / 7); $data['segmentCount'] = (int) ceil($data['totalTime'] / $data['segmentDuration']); $data['CI_VERSION'] = CodeIgniter::CI_VERSION; From f8acd58fc30f5aa45579494091d7879b9cba7c7e Mon Sep 17 00:00:00 2001 From: kenjis Date: Fri, 6 Oct 2023 14:15:54 +0900 Subject: [PATCH 148/209] docs: make discoverFilters() deprecated --- system/Filters/Filters.php | 2 ++ user_guide_src/source/general/modules.rst | 7 ++++++ user_guide_src/source/general/modules/015.php | 22 +++++++++++++++++++ 3 files changed, 31 insertions(+) create mode 100644 user_guide_src/source/general/modules/015.php diff --git a/system/Filters/Filters.php b/system/Filters/Filters.php index d0c67845466f..df27e3f6cee3 100644 --- a/system/Filters/Filters.php +++ b/system/Filters/Filters.php @@ -125,6 +125,8 @@ public function __construct($config, RequestInterface $request, ResponseInterfac * * Sample : * $filters->aliases['custom-auth'] = \Acme\Blob\Filters\BlobAuth::class; + * + * @deprecated 4.4.2 Use Registrar instead. */ private function discoverFilters(): void { diff --git a/user_guide_src/source/general/modules.rst b/user_guide_src/source/general/modules.rst index b15e3c47bdf6..aa251c8a087d 100644 --- a/user_guide_src/source/general/modules.rst +++ b/user_guide_src/source/general/modules.rst @@ -163,6 +163,13 @@ In that case, see :ref:`routing-priority`. Filters ======= +.. deprecated:: 4.4.2 + +.. note:: This feature is deprecated. Use :ref:`registrars` instead like the + following: + + .. literalinclude:: modules/015.php + By default, :doc:`filters <../incoming/filters>` are automatically scanned for within modules. It can be turned off in the **Modules** config file, described above. diff --git a/user_guide_src/source/general/modules/015.php b/user_guide_src/source/general/modules/015.php new file mode 100644 index 000000000000..0b1f17508607 --- /dev/null +++ b/user_guide_src/source/general/modules/015.php @@ -0,0 +1,22 @@ + [ + 'session' => SessionAuth::class, + 'tokens' => TokenAuth::class, + ], + ]; + } +} From 8ac382850f3eb2d934b723ffee55e90f4d5f293d Mon Sep 17 00:00:00 2001 From: kenjis Date: Fri, 6 Oct 2023 14:23:23 +0900 Subject: [PATCH 149/209] docs: add changelog --- user_guide_src/source/changelogs/v4.4.2.rst | 4 ++++ user_guide_src/source/general/modules.rst | 2 ++ 2 files changed, 6 insertions(+) diff --git a/user_guide_src/source/changelogs/v4.4.2.rst b/user_guide_src/source/changelogs/v4.4.2.rst index 6da0e5a04953..0d504ad58606 100644 --- a/user_guide_src/source/changelogs/v4.4.2.rst +++ b/user_guide_src/source/changelogs/v4.4.2.rst @@ -29,6 +29,10 @@ Changes Deprecations ************ +- **Filters:** The Auto-Discovery for Filters and ``Filters::discoverFilters()`` + is deprecated. Use :ref:`registrars` instead. See :ref:`modules-filters` for + details. + Bugs Fixed ********** diff --git a/user_guide_src/source/general/modules.rst b/user_guide_src/source/general/modules.rst index aa251c8a087d..2a6df4aa7b2e 100644 --- a/user_guide_src/source/general/modules.rst +++ b/user_guide_src/source/general/modules.rst @@ -160,6 +160,8 @@ the **Modules** config file, described above. When working with modules, it can be a problem if the routes in the application contain wildcards. In that case, see :ref:`routing-priority`. +.. _modules-filters: + Filters ======= From 11647e1ceb3aca3b0dd652a866f2da0e3153b937 Mon Sep 17 00:00:00 2001 From: Mostafa Khudair <59371810+mostafakhudair@users.noreply.github.com> Date: Fri, 6 Oct 2023 09:01:08 +0300 Subject: [PATCH 150/209] docs: fix class name --- user_guide_src/source/extending/core_classes/003.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/extending/core_classes/003.php b/user_guide_src/source/extending/core_classes/003.php index c726b71ea95d..aefc135c62e2 100644 --- a/user_guide_src/source/extending/core_classes/003.php +++ b/user_guide_src/source/extending/core_classes/003.php @@ -4,7 +4,7 @@ use CodeIgniter\Router\RouteCollection; -class RouteCollection extends RouteCollection +class MyRouteCollection extends RouteCollection { // ... } From 749753225a95757f3f32bf67318b9b14f688aa49 Mon Sep 17 00:00:00 2001 From: Mostafa Khudair <59371810+mostafakhudair@users.noreply.github.com> Date: Fri, 6 Oct 2023 12:20:23 +0300 Subject: [PATCH 151/209] apply suggestion --- user_guide_src/source/extending/core_classes/003.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user_guide_src/source/extending/core_classes/003.php b/user_guide_src/source/extending/core_classes/003.php index aefc135c62e2..9e89d87d46df 100644 --- a/user_guide_src/source/extending/core_classes/003.php +++ b/user_guide_src/source/extending/core_classes/003.php @@ -2,9 +2,9 @@ namespace App\Libraries; -use CodeIgniter\Router\RouteCollection; +use CodeIgniter\Router\RouteCollection as BaseRouteCollection; -class MyRouteCollection extends RouteCollection +class RouteCollection extends BaseRouteCollection { // ... } From 6212566806692a9b5086ca9f289cbbf2d034c147 Mon Sep 17 00:00:00 2001 From: kenjis Date: Sat, 23 Sep 2023 13:49:19 +0900 Subject: [PATCH 152/209] fix: bug that spark does not show error message --- system/CLI/Console.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/system/CLI/Console.php b/system/CLI/Console.php index 0ea7eae22c7f..16e5df831efc 100644 --- a/system/CLI/Console.php +++ b/system/CLI/Console.php @@ -12,6 +12,7 @@ namespace CodeIgniter\CLI; use CodeIgniter\CodeIgniter; +use Config\App; use Config\Services; use Exception; @@ -31,6 +32,10 @@ class Console */ public function run() { + // Create CLIRequest + $appConfig = config(App::class); + Services::createRequest($appConfig, true); + $runner = Services::commands(); $params = array_merge(CLI::getSegments(), CLI::getOptions()); $params = $this->parseParamsForHelpOption($params); From b201fafb8373df2e92f1201180b5ed7eadf0ddb1 Mon Sep 17 00:00:00 2001 From: kenjis Date: Mon, 25 Sep 2023 11:24:28 +0900 Subject: [PATCH 153/209] docs: add changelog --- user_guide_src/source/changelogs/v4.4.2.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/user_guide_src/source/changelogs/v4.4.2.rst b/user_guide_src/source/changelogs/v4.4.2.rst index 68cba760c549..270442b9d747 100644 --- a/user_guide_src/source/changelogs/v4.4.2.rst +++ b/user_guide_src/source/changelogs/v4.4.2.rst @@ -34,6 +34,8 @@ Bugs Fixed - **CodeIgniter:** Fixed a bug that returned "200 OK" response status code when Page Not Found. +- **Spark:** Fixed a bug that caused spark to not display exceptions in the + production mode or to display backtrace in json when an exception occurred. See the repo's `CHANGELOG.md `_ From 334bf5079603ee9ceb06ade6130f8d2479a68a70 Mon Sep 17 00:00:00 2001 From: kenjis Date: Tue, 10 Oct 2023 07:59:53 +0900 Subject: [PATCH 154/209] docs: move Routing Settings up It is more intuitive to set up routing first, so that you can check your controller to work. --- .../source/tutorial/create_news_items.rst | 34 ++++---- .../source/tutorial/news_section.rst | 22 ++--- .../source/tutorial/static_pages.rst | 80 ++++++++++--------- 3 files changed, 69 insertions(+), 67 deletions(-) diff --git a/user_guide_src/source/tutorial/create_news_items.rst b/user_guide_src/source/tutorial/create_news_items.rst index 2388841b70b8..6443e674d450 100644 --- a/user_guide_src/source/tutorial/create_news_items.rst +++ b/user_guide_src/source/tutorial/create_news_items.rst @@ -26,6 +26,23 @@ You can read more about the CSRF protection in :doc:`Security <../libraries/secu because :ref:`auto-routing-legacy` permits any HTTP method to access a controller. Accessing the controller with a method you don't expect could bypass the filter. +Adding Routing Rules +******************** + +Before you can start adding news items into your CodeIgniter application +you have to add an extra rule to **app/Config/Routes.php** file. Make sure your +file contains the following: + +.. literalinclude:: create_news_items/004.php + +The route directive for ``'news/new'`` is placed before the directive for ``'news/(:segment)'`` to ensure that the form to create a news item is displayed. + +The ``$routes->post()`` line defines the router for a POST request. It matches +only a POST request to the URI path **/news**, and it maps to the ``create()`` method of +the ``News`` class. + +You can read more about different routing types in :ref:`defined-route-routing`. + Create a Form ************* @@ -151,23 +168,6 @@ never need to do that, since it is an auto-incrementing field in the database. This helps protect against Mass Assignment Vulnerabilities. If your model is handling your timestamps, you would also leave those out. -Adding Routing Rules -******************** - -Before you can start adding news items into your CodeIgniter application -you have to add an extra rule to **app/Config/Routes.php** file. Make sure your -file contains the following: - -.. literalinclude:: create_news_items/004.php - -The route directive for ``'news/new'`` is placed before the directive for ``'news/(:segment)'`` to ensure that the form to create a news item is displayed. - -The ``$routes->post()`` line defines the router for a POST request. It matches -only a POST request to the URI path **/news**, and it maps to the ``create()`` method of -the ``News`` class. - -You can read more about different routing types in :ref:`defined-route-routing`. - Create a News Item ****************** diff --git a/user_guide_src/source/tutorial/news_section.rst b/user_guide_src/source/tutorial/news_section.rst index 183b2f0c8570..935f79476054 100644 --- a/user_guide_src/source/tutorial/news_section.rst +++ b/user_guide_src/source/tutorial/news_section.rst @@ -120,6 +120,17 @@ that are going to display the news items to the user. This could be done in our ``Pages`` controller created earlier, but for the sake of clarity, a new ``News`` controller is defined. +Adding Routing Rules +==================== + +Modify your **app/Config/Routes.php** file, so it looks as follows: + +.. literalinclude:: news_section/008.php + +This makes sure the requests reach the ``News`` controller instead of +going directly to the ``Pages`` controller. The second ``$routes->get()`` line +routes URI's with a slug to the ``show()`` method in the ``News`` controller. + Create News Controller ====================== @@ -200,17 +211,6 @@ The only thing left to do is create the corresponding view at .. literalinclude:: news_section/007.php -Adding Routing Rules -******************** - -Modify your **app/Config/Routes.php** file, so it looks as follows: - -.. literalinclude:: news_section/008.php - -This makes sure the requests reach the ``News`` controller instead of -going directly to the ``Pages`` controller. The second ``$routes->get()`` line -routes URI's with a slug to the ``show()`` method in the ``News`` controller. - Point your browser to your "news" page, i.e., **localhost:8080/news**, you should see a list of the news items, each of which has a link to display just the one article. diff --git a/user_guide_src/source/tutorial/static_pages.rst b/user_guide_src/source/tutorial/static_pages.rst index 9745cbb633de..db3382245195 100644 --- a/user_guide_src/source/tutorial/static_pages.rst +++ b/user_guide_src/source/tutorial/static_pages.rst @@ -9,13 +9,51 @@ Static Pages :doc:`installed the framework <../installation/index>` in your development environment. -The first thing you're going to do is set up a **controller** to handle -static pages. A controller is simply a class that helps delegate work. -It is the glue of your web application. +The first thing you're going to do is set up routing rules to handle static pages. + +Setting Routing Rules +********************* + +Routing associates a URI with a controller's method. A controller is simply a +class that helps delegate work. We will create a controller later. + +Let's set up routing rules. Open the routes file located at **app/Config/Routes.php**. + +The only route directive there to start with should be: + +.. literalinclude:: static_pages/003.php + +This directive says that any incoming request without any content +specified should be handled by the ``index()`` method inside the ``Home`` controller. + +Add the following lines, **after** the route directive for ``'/'``. + +.. literalinclude:: static_pages/004.php + :lines: 2- + +CodeIgniter reads its routing rules from top to bottom and routes the +request to the first matching rule. Each rule is a regular expression +(left-side) mapped to a controller and method name +(right-side). When a request comes in, CodeIgniter looks for the first +match, and calls the appropriate controller and method, possibly with +arguments. + +More information about routing can be found in the :doc:`../incoming/routing`. + +Here, the second rule in the ``$routes`` object matches a GET request +to the URI path **/pages**, and it maps to the ``index()`` method of the ``Pages`` class. + +The third rule in the ``$routes`` object matches a GET request to a URI segment +using the placeholder ``(:segment)``, and passes the parameter to the +``view()`` method of the ``Pages`` class. Let's Make our First Controller ******************************* +The next thing you're going to do is set up a **controller** to handle +static pages. A controller is simply a class that helps delegate work. +It is the glue of your web application. + Create Pages Controller ======================= @@ -141,42 +179,6 @@ view. throw errors on case-sensitive platforms. You can read more about it in :doc:`../outgoing/views`. -Setting Routing Rules -********************* - -We have made the controller. The next thing is to set routing rules. -Routing associates a URI with a controller's method. - -Let's do that. Open the routes file located at **app/Config/Routes.php**. - -The only route directive there to start with should be: - -.. literalinclude:: static_pages/003.php - -This directive says that any incoming request without any content -specified should be handled by the ``index()`` method inside the ``Home`` controller. - -Add the following lines, **after** the route directive for ``'/'``. - -.. literalinclude:: static_pages/004.php - :lines: 2- - -CodeIgniter reads its routing rules from top to bottom and routes the -request to the first matching rule. Each rule is a regular expression -(left-side) mapped to a controller and method name -(right-side). When a request comes in, CodeIgniter looks for the first -match, and calls the appropriate controller and method, possibly with -arguments. - -More information about routing can be found in the :doc:`../incoming/routing`. - -Here, the second rule in the ``$routes`` object matches a GET request -to the URI path **/pages**, and it maps to the ``index()`` method of the ``Pages`` class. - -The third rule in the ``$routes`` object matches a GET request to a URI segment -using the placeholder ``(:segment)``, and passes the parameter to the -``view()`` method of the ``Pages`` class. - Running the App *************** From 6f97e82044c6c3cf74c912a684d78dd8a23a760f Mon Sep 17 00:00:00 2001 From: kenjis Date: Tue, 10 Oct 2023 14:14:40 +0900 Subject: [PATCH 155/209] test: fix incorrect test The routes should be loaded before tests. --- tests/system/Helpers/URLHelper/MiscUrlTest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/system/Helpers/URLHelper/MiscUrlTest.php b/tests/system/Helpers/URLHelper/MiscUrlTest.php index 73ce680ea757..04da4f7352fe 100644 --- a/tests/system/Helpers/URLHelper/MiscUrlTest.php +++ b/tests/system/Helpers/URLHelper/MiscUrlTest.php @@ -38,6 +38,7 @@ protected function setUp(): void parent::setUp(); Services::reset(true); + Services::routes()->loadRoutes(); // Set a common base configuration (overriden by individual tests) $this->config = new App(); From e1e9a7b644b52e35a930361779c77e8d249e338a Mon Sep 17 00:00:00 2001 From: kenjis Date: Tue, 10 Oct 2023 14:24:24 +0900 Subject: [PATCH 156/209] test: add test case for empty string --- .../system/Router/RouteCollectionReverseRouteTest.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/system/Router/RouteCollectionReverseRouteTest.php b/tests/system/Router/RouteCollectionReverseRouteTest.php index d00e48e35b0d..02c8f4ba18f8 100644 --- a/tests/system/Router/RouteCollectionReverseRouteTest.php +++ b/tests/system/Router/RouteCollectionReverseRouteTest.php @@ -52,6 +52,16 @@ protected function getCollector(array $config = [], array $files = [], $moduleCo return (new RouteCollection($loader, $moduleConfig, new Routing()))->setHTTPVerb('get'); } + public function testReverseRoutingEmptyString(): void + { + $routes = $this->getCollector(); + + $routes->add('/', 'Home::index'); + + $match = $routes->reverseRoute(''); + $this->assertFalse($match); + } + public function testReverseRoutingFindsSimpleMatch(): void { $routes = $this->getCollector(); From 61f080e9392e1fb0a98ba451fd570d84507c0f39 Mon Sep 17 00:00:00 2001 From: kenjis Date: Tue, 10 Oct 2023 14:24:59 +0900 Subject: [PATCH 157/209] fix: reverse routing returns invalid route when '' is passed --- system/Router/RouteCollection.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/system/Router/RouteCollection.php b/system/Router/RouteCollection.php index 8a23264058cb..e484129a77b1 100644 --- a/system/Router/RouteCollection.php +++ b/system/Router/RouteCollection.php @@ -1156,6 +1156,10 @@ public function environment(string $env, Closure $callback): RouteCollectionInte */ public function reverseRoute(string $search, ...$params) { + if ($search === '') { + return false; + } + // Named routes get higher priority. foreach ($this->routesNames as $verb => $collection) { if (array_key_exists($search, $collection)) { From a9cd1900435192ad0f9fefd0a6c4c99b370e7fe6 Mon Sep 17 00:00:00 2001 From: kenjis Date: Tue, 10 Oct 2023 16:50:25 +0900 Subject: [PATCH 158/209] test: add test --- tests/system/Honeypot/HoneypotTest.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tests/system/Honeypot/HoneypotTest.php b/tests/system/Honeypot/HoneypotTest.php index 65b27e3e07d6..f3b4a659934f 100644 --- a/tests/system/Honeypot/HoneypotTest.php +++ b/tests/system/Honeypot/HoneypotTest.php @@ -100,6 +100,24 @@ public function testAttachHoneypotAndContainerWithCSP(): void $this->assertMatchesRegularExpression($regex, $this->response->getBody()); } + public function testNotAttachHoneypotWithCSP(): void + { + $this->resetServices(); + + $config = new App(); + $config->CSPEnabled = true; + Factories::injectMock('config', 'App', $config); + $this->response = Services::response($config, false); + + $this->config = new HoneypotConfig(); + $this->honeypot = new Honeypot($this->config); + + $this->response->setBody(''); + $this->honeypot->attachHoneypot($this->response); + + $this->assertSame('', $this->response->getBody()); + } + public function testHasntContent(): void { unset($_POST[$this->config->name]); From 4892849941ef46bd933fb92005ad5b6ec97df12d Mon Sep 17 00:00:00 2001 From: kenjis Date: Tue, 10 Oct 2023 16:34:55 +0900 Subject: [PATCH 159/209] fix: CSP style nonce is added even if honeypot is not attached The tag like this was added in tag in every page. --- system/Honeypot/Honeypot.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/system/Honeypot/Honeypot.php b/system/Honeypot/Honeypot.php index c2f3cf67cc7b..82da90020cac 100644 --- a/system/Honeypot/Honeypot.php +++ b/system/Honeypot/Honeypot.php @@ -89,16 +89,16 @@ public function attachHoneypot(ResponseInterface $response) $prepField = $this->prepareTemplate($this->config->template); - $body = $response->getBody(); - $body = str_ireplace('', $prepField . '', $body); + $bodyBefore = $response->getBody(); + $bodyAfter = str_ireplace('', $prepField . '', $bodyBefore); - if ($response->getCSP()->enabled()) { + if ($response->getCSP()->enabled() && ($bodyBefore !== $bodyAfter)) { // Add style tag for the container tag in the head tag. - $style = ''; - $body = str_ireplace('', $style . '', $body); + $style = ''; + $bodyAfter = str_ireplace('', $style . '', $bodyAfter); } - $response->setBody($body); + $response->setBody($bodyAfter); } /** From 1c5ff8ddcb8a8ba6e5fd73eebb4dbd5b2804a7c1 Mon Sep 17 00:00:00 2001 From: kenjis Date: Tue, 26 Sep 2023 07:00:24 +0900 Subject: [PATCH 160/209] docs: make public properties deprecated No need to be public. --- system/CLI/CLI.php | 4 ++++ user_guide_src/source/changelogs/v4.4.2.rst | 2 ++ 2 files changed, 6 insertions(+) diff --git a/system/CLI/CLI.php b/system/CLI/CLI.php index 29f424d1ec53..4974d0ae48f2 100644 --- a/system/CLI/CLI.php +++ b/system/CLI/CLI.php @@ -42,6 +42,8 @@ class CLI * Is the readline library on the system? * * @var bool + * + * @deprecated 4.4.2 Should be protected. */ public static $readline_support = false; @@ -49,6 +51,8 @@ class CLI * The message displayed at prompts. * * @var string + * + * @deprecated 4.4.2 Should be protected. */ public static $wait_msg = 'Press any key to continue...'; diff --git a/user_guide_src/source/changelogs/v4.4.2.rst b/user_guide_src/source/changelogs/v4.4.2.rst index c956964fa9ea..55cf33b0df25 100644 --- a/user_guide_src/source/changelogs/v4.4.2.rst +++ b/user_guide_src/source/changelogs/v4.4.2.rst @@ -32,6 +32,8 @@ Deprecations - **Filters:** The Auto-Discovery for Filters and ``Filters::discoverFilters()`` is deprecated. Use :ref:`registrars` instead. See :ref:`modules-filters` for details. +- **CLI:** The public property ``CLI::$readline_support`` and ``CLI::$wait_msg`` + are deprecated. These methods will be protected. Bugs Fixed ********** From dc84d18e1e53a6b41d887d773b2a27ade189e89b Mon Sep 17 00:00:00 2001 From: kenjis Date: Wed, 11 Oct 2023 06:09:24 +0900 Subject: [PATCH 161/209] docs: add @TODO to rename --- system/CLI/CLI.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/system/CLI/CLI.php b/system/CLI/CLI.php index 4974d0ae48f2..b93d0eb50f11 100644 --- a/system/CLI/CLI.php +++ b/system/CLI/CLI.php @@ -44,6 +44,7 @@ class CLI * @var bool * * @deprecated 4.4.2 Should be protected. + * @TODO Fix to camelCase in the next major version. */ public static $readline_support = false; @@ -53,6 +54,7 @@ class CLI * @var string * * @deprecated 4.4.2 Should be protected. + * @TODO Fix to camelCase in the next major version. */ public static $wait_msg = 'Press any key to continue...'; @@ -67,6 +69,8 @@ class CLI * Foreground color list * * @var array + * + * @TODO Fix to camelCase in the next major version. */ protected static $foreground_colors = [ 'black' => '0;30', @@ -92,6 +96,8 @@ class CLI * Background color list * * @var array + * + * @TODO Fix to camelCase in the next major version. */ protected static $background_colors = [ 'black' => '40', From aa83cd26e4bbbf36f287b2d170f7944c2fdb407b Mon Sep 17 00:00:00 2001 From: kenjis Date: Wed, 11 Oct 2023 10:47:52 +0900 Subject: [PATCH 162/209] fix: named routes don't work with spark --- system/CLI/Console.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/system/CLI/Console.php b/system/CLI/Console.php index 16e5df831efc..adcf9aaeca8b 100644 --- a/system/CLI/Console.php +++ b/system/CLI/Console.php @@ -35,6 +35,8 @@ public function run() // Create CLIRequest $appConfig = config(App::class); Services::createRequest($appConfig, true); + // Load Routes + Services::routes()->loadRoutes(); $runner = Services::commands(); $params = array_merge(CLI::getSegments(), CLI::getOptions()); From 9e96187c983555cdaae3332b3b184ca44490667d Mon Sep 17 00:00:00 2001 From: kenjis Date: Wed, 11 Oct 2023 13:15:08 +0900 Subject: [PATCH 163/209] docs: deprecate unused param $config --- system/CodeIgniter.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/system/CodeIgniter.php b/system/CodeIgniter.php index 95be7771b281..c2965591d373 100644 --- a/system/CodeIgniter.php +++ b/system/CodeIgniter.php @@ -703,6 +703,8 @@ protected function forceSecureAccess($duration = 31_536_000) * @return false|ResponseInterface * * @throws Exception + * + * @deprecated 4.4.2 The parameter $config is deprecated. No longer used. */ public function displayCache(Cache $config) { From ae7edbdf21d857e2a90678f62b07e1d4ed5d4d69 Mon Sep 17 00:00:00 2001 From: kenjis Date: Wed, 11 Oct 2023 13:15:51 +0900 Subject: [PATCH 164/209] docs: fix typos in comments --- system/CodeIgniter.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/system/CodeIgniter.php b/system/CodeIgniter.php index c2965591d373..a949915c6139 100644 --- a/system/CodeIgniter.php +++ b/system/CodeIgniter.php @@ -334,7 +334,7 @@ private function configureKint(): void * This is "the loop" if you will. The main entry point into the script * that gets the required class instances, fires off the filters, * tries to route the response, loads the controller and generally - * makes all of the pieces work together. + * makes all the pieces work together. * * @return ResponseInterface|void */ @@ -724,7 +724,7 @@ public function displayCache(Cache $config) /** * Tells the app that the final output should be cached. * - * @deprecated 4.4.0 Moved to ResponseCache::setTtl(). to No longer used. + * @deprecated 4.4.0 Moved to ResponseCache::setTtl(). No longer used. * * @return void */ @@ -796,7 +796,7 @@ public function displayPerformanceMetrics(string $output): string * match a route against the current URI. If the route is a * "redirect route", will also handle the redirect. * - * @param RouteCollectionInterface|null $routes An collection interface to use in place + * @param RouteCollectionInterface|null $routes A collection interface to use in place * of the config file. * * @return string|string[]|null Route filters, that is, the filters specified in the routes file From f8015f18b6c0c1e8bfb37f268478a79c6b3808a0 Mon Sep 17 00:00:00 2001 From: kenjis Date: Wed, 11 Oct 2023 13:18:41 +0900 Subject: [PATCH 165/209] docs: add changelog --- user_guide_src/source/changelogs/v4.4.2.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/user_guide_src/source/changelogs/v4.4.2.rst b/user_guide_src/source/changelogs/v4.4.2.rst index 55cf33b0df25..2807579bd0c7 100644 --- a/user_guide_src/source/changelogs/v4.4.2.rst +++ b/user_guide_src/source/changelogs/v4.4.2.rst @@ -34,6 +34,8 @@ Deprecations details. - **CLI:** The public property ``CLI::$readline_support`` and ``CLI::$wait_msg`` are deprecated. These methods will be protected. +- **CodeIgniter:** The parameter ``$config`` for the ``displayCache()`` method is + deprecated. It was not used. Bugs Fixed ********** From 6b23949b3b8164e584b9aafd852f992bd33e06fe Mon Sep 17 00:00:00 2001 From: michalsn Date: Wed, 11 Oct 2023 09:34:30 +0200 Subject: [PATCH 166/209] fix: add a primary key to an existing table --- system/Database/Forge.php | 8 +- tests/system/Database/Live/ForgeTest.php | 81 +++++++++++++++++++++ user_guide_src/source/changelogs/v4.4.2.rst | 2 + 3 files changed, 86 insertions(+), 5 deletions(-) diff --git a/system/Database/Forge.php b/system/Database/Forge.php index f83a9acf94a6..bebf5c63aa7a 100644 --- a/system/Database/Forge.php +++ b/system/Database/Forge.php @@ -1084,12 +1084,10 @@ public function processIndexes(string $table): bool if (! empty($this->keys)) { $sqls = $this->_processIndexes($this->db->DBPrefix . $table, true); + } - $pk = $this->_processPrimaryKeys($table, true); - - if ($pk !== '') { - $sqls[] = $pk; - } + if (! empty($this->primaryKeys)) { + $sqls[] = $this->_processPrimaryKeys($table, true); } $this->foreignKeys = $fk; diff --git a/tests/system/Database/Live/ForgeTest.php b/tests/system/Database/Live/ForgeTest.php index e968ce9f5030..626660ee7246 100644 --- a/tests/system/Database/Live/ForgeTest.php +++ b/tests/system/Database/Live/ForgeTest.php @@ -1657,6 +1657,87 @@ public function testProcessIndexes(): void $this->forge->dropTable('user2', true); } + public function testProcessIndexesWithKeyOnly(): void + { + // make sure tables don't exist + $this->forge->dropTable('actions', true); + + $this->createActionsTable(); + $this->forge->addKey('name', false, false, 'db_actions_name'); + + // create indexes + $this->forge->processIndexes('actions'); + + // get a list of all indexes + $allIndexes = $this->db->getIndexData('actions'); + + // check that db_actions_name key exists + $indexes = array_filter( + $allIndexes, + static fn ($index) => ($index->name === 'db_actions_name') + && ($index->fields === [0 => 'name']) + ); + $this->assertCount(1, $indexes); + + // drop tables to avoid any future conflicts + $this->forge->dropTable('actions', true); + } + + public function testProcessIndexesWithPrimaryKeyOnly(): void + { + // make sure tables don't exist + $this->forge->dropTable('actions', true); + + $this->createActionsTable(); + $this->forge->addPrimaryKey('id'); + + // create indexes + $this->forge->processIndexes('actions'); + + // get a list of all indexes + $allIndexes = $this->db->getIndexData('actions'); + + // check that the primary key exists + $indexes = array_filter( + $allIndexes, + static fn ($index) => $index->type === 'PRIMARY' + ); + $this->assertCount(1, $indexes); + + // drop tables to avoid any future conflicts + $this->forge->dropTable('actions', true); + } + + public function testProcessIndexesWithForeignKeyOnly(): void + { + // make sure tables don't exist + $this->forge->dropTable('actions', true); + $this->forge->dropTable('user2', true); + + $this->createUser2TableWithKeys(); + $this->populateUser2Table(); + $this->createActionsTable(); + + // SQLite does not support custom foreign key name + if ($this->db->DBDriver === 'SQLite3') { + $this->forge->addForeignKey('userid', 'user', 'id'); + $this->forge->addForeignKey('userid2', 'user2', 'id'); + } else { + $this->forge->addForeignKey('userid', 'user', 'id', '', '', 'db_actions_userid_foreign'); + $this->forge->addForeignKey('userid2', 'user2', 'id', '', '', 'db_actions_userid2_foreign'); + } + + // create indexes + $this->forge->processIndexes('actions'); + + // check that the two foreign keys exist + $this->assertCount(2, $this->db->getForeignKeyData('actions')); + + // drop tables to avoid any future conflicts + $this->forge->dropTable('actions', true); + $this->forge->dropTable('user2', true); + } + private function createUser2TableWithKeys(): void { $fields = [ diff --git a/user_guide_src/source/changelogs/v4.4.2.rst b/user_guide_src/source/changelogs/v4.4.2.rst index 55cf33b0df25..2911638c2cae 100644 --- a/user_guide_src/source/changelogs/v4.4.2.rst +++ b/user_guide_src/source/changelogs/v4.4.2.rst @@ -42,6 +42,8 @@ Bugs Fixed Page Not Found. - **Spark:** Fixed a bug that caused spark to not display exceptions in the production mode or to display backtrace in json when an exception occurred. +- **Forge:** Fixed a bug where adding a Primary Key to an existing table was + ignored if there were no other Keys added too. See the repo's `CHANGELOG.md `_ From 7c9c2054d3c76dcf6979803acf3f070aeb123ddc Mon Sep 17 00:00:00 2001 From: michalsn Date: Wed, 11 Oct 2023 10:03:20 +0200 Subject: [PATCH 167/209] replace checks that use empty() --- system/Database/Forge.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/system/Database/Forge.php b/system/Database/Forge.php index bebf5c63aa7a..ae26f6e7457d 100644 --- a/system/Database/Forge.php +++ b/system/Database/Forge.php @@ -1073,7 +1073,7 @@ public function processIndexes(string $table): bool $sqls = []; $fk = $this->foreignKeys; - if (empty($this->fields)) { + if ($this->fields === []) { $this->fields = array_flip(array_map( static fn ($columnName) => $columnName->name, $this->db->getFieldData($this->db->DBPrefix . $table) @@ -1082,18 +1082,18 @@ public function processIndexes(string $table): bool $fields = $this->fields; - if (! empty($this->keys)) { + if ($this->keys !== []) { $sqls = $this->_processIndexes($this->db->DBPrefix . $table, true); } - if (! empty($this->primaryKeys)) { + if ($this->primaryKeys !== []) { $sqls[] = $this->_processPrimaryKeys($table, true); } $this->foreignKeys = $fk; $this->fields = $fields; - if (! empty($this->foreignKeys)) { + if ($this->foreignKeys !== []) { $sqls = array_merge($sqls, $this->_processForeignKeys($table, true)); } From c61d8e7fd4ea99f21d8c2f8388e65aaf50b11d20 Mon Sep 17 00:00:00 2001 From: michalsn Date: Wed, 11 Oct 2023 10:15:25 +0200 Subject: [PATCH 168/209] update phpstan-baseline.php --- phpstan-baseline.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpstan-baseline.php b/phpstan-baseline.php index 87be8ceb2377..a45da9b79c44 100644 --- a/phpstan-baseline.php +++ b/phpstan-baseline.php @@ -1238,7 +1238,7 @@ ]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', - 'count' => 16, + 'count' => 13, 'path' => __DIR__ . '/system/Database/Forge.php', ]; $ignoreErrors[] = [ From b26809f66eac8be9cf6c5acb83ad48fa4b629130 Mon Sep 17 00:00:00 2001 From: kenjis Date: Thu, 12 Oct 2023 11:39:07 +0900 Subject: [PATCH 169/209] chore: update for phpstan-codeigniter v1.4.0 --- phpstan.neon.dist | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 4041710fb703..eb85c8131723 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -38,3 +38,8 @@ parameters: booleansInConditions: true disallowedConstructs: true matchingInheritedMethodNames: true + ignoreErrors: + - '#^Call to function config with Config\\.+\:\:class is discouraged\.$#' + codeigniter: + additionalConfigNamespaces: + - CodeIgniter\Config\ From 65b01f61c94628ddc1af6959d2036a84709af194 Mon Sep 17 00:00:00 2001 From: kenjis Date: Thu, 12 Oct 2023 11:39:35 +0900 Subject: [PATCH 170/209] fix: incorrect class name If we specifies FQCN, Config\Factory is not loaded since CI v4.4.0. --- system/Config/Factories.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/Config/Factories.php b/system/Config/Factories.php index b455969049e2..a32df02725ac 100644 --- a/system/Config/Factories.php +++ b/system/Config/Factories.php @@ -377,7 +377,7 @@ public static function getOptions(string $component): array // Handle Config as a special case to prevent logic loops ? self::$configOptions // Load values from the best Factory configuration (will include Registrars) - : config(Factory::class)->{$component} ?? []; + : config('Factory')->{$component} ?? []; // The setOptions() reset the component. So getOptions() may reset // the component. From 3e239d67e3b9b9c40167bbbd826afbac14403519 Mon Sep 17 00:00:00 2001 From: kenjis Date: Thu, 12 Oct 2023 11:48:53 +0900 Subject: [PATCH 171/209] docs: fix typo --- user_guide_src/source/installation/upgrade_440.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/installation/upgrade_440.rst b/user_guide_src/source/installation/upgrade_440.rst index 76bcc2957a68..c84d72a7e1fe 100644 --- a/user_guide_src/source/installation/upgrade_440.rst +++ b/user_guide_src/source/installation/upgrade_440.rst @@ -91,7 +91,7 @@ When Passing Classname with Namespace to Factories The behavior of passing a classname with a namespace to Factories has been changed. See :ref:`ChangeLog ` for details. -If you have code like ``model('\Myth\Auth\Models\UserModel::class')`` or +If you have code like ``model(\Myth\Auth\Models\UserModel::class)`` or ``model('Myth\Auth\Models\UserModel')`` (the code may be in the third-party packages), and you expect to load your ``App\Models\UserModel``, you need to define the classname to be loaded before the first loading of that class:: From 484cbe5725c91f4717f2523131a832930896d921 Mon Sep 17 00:00:00 2001 From: kenjis Date: Thu, 12 Oct 2023 16:36:52 +0900 Subject: [PATCH 172/209] test: fix incorrect test We cannot change the namespace for Auto Routing Legacy. --- tests/system/Commands/RoutesTest.php | 54 ++++++++++------------------ 1 file changed, 18 insertions(+), 36 deletions(-) diff --git a/tests/system/Commands/RoutesTest.php b/tests/system/Commands/RoutesTest.php index 059ce964d5e0..9cd24cbe0f6b 100644 --- a/tests/system/Commands/RoutesTest.php +++ b/tests/system/Commands/RoutesTest.php @@ -198,46 +198,28 @@ public function testRoutesCommandRouteLegacy(): void $routes->loadRoutes(); $routes->setAutoRoute(true); - $namespace = 'Tests\Support\Controllers'; - $routes->setDefaultNamespace($namespace); command('routes'); $expected = <<<'EOL' - +---------+-------------------------------+---------------+-----------------------------------------------------+----------------+---------------+ - | Method | Route | Name | Handler | Before Filters | After Filters | - +---------+-------------------------------+---------------+-----------------------------------------------------+----------------+---------------+ - | GET | / | » | \App\Controllers\Home::index | | toolbar | - | GET | closure | » | (Closure) | | toolbar | - | GET | testing | testing-index | \App\Controllers\TestController::index | | toolbar | - | HEAD | testing | testing-index | \App\Controllers\TestController::index | | toolbar | - | POST | testing | testing-index | \App\Controllers\TestController::index | | toolbar | - | PUT | testing | testing-index | \App\Controllers\TestController::index | | toolbar | - | DELETE | testing | testing-index | \App\Controllers\TestController::index | | toolbar | - | OPTIONS | testing | testing-index | \App\Controllers\TestController::index | | toolbar | - | TRACE | testing | testing-index | \App\Controllers\TestController::index | | toolbar | - | CONNECT | testing | testing-index | \App\Controllers\TestController::index | | toolbar | - | CLI | testing | testing-index | \App\Controllers\TestController::index | | | - | auto | hello | | \Tests\Support\Controllers\Hello::index | | toolbar | - | auto | hello/index[/...] | | \Tests\Support\Controllers\Hello::index | | toolbar | - | auto | newautorouting/getIndex[/...] | | \Tests\Support\Controllers\Newautorouting::getIndex | | toolbar | - | auto | newautorouting/postSave[/...] | | \Tests\Support\Controllers\Newautorouting::postSave | | toolbar | - | auto | popcorn | | \Tests\Support\Controllers\Popcorn::index | | toolbar | - | auto | popcorn/index[/...] | | \Tests\Support\Controllers\Popcorn::index | | toolbar | - | auto | popcorn/pop[/...] | | \Tests\Support\Controllers\Popcorn::pop | | toolbar | - | auto | popcorn/popper[/...] | | \Tests\Support\Controllers\Popcorn::popper | | toolbar | - | auto | popcorn/weasel[/...] | | \Tests\Support\Controllers\Popcorn::weasel | | toolbar | - | auto | popcorn/oops[/...] | | \Tests\Support\Controllers\Popcorn::oops | | toolbar | - | auto | popcorn/goaway[/...] | | \Tests\Support\Controllers\Popcorn::goaway | | toolbar | - | auto | popcorn/index3[/...] | | \Tests\Support\Controllers\Popcorn::index3 | | toolbar | - | auto | popcorn/canyon[/...] | | \Tests\Support\Controllers\Popcorn::canyon | | toolbar | - | auto | popcorn/cat[/...] | | \Tests\Support\Controllers\Popcorn::cat | | toolbar | - | auto | popcorn/json[/...] | | \Tests\Support\Controllers\Popcorn::json | | toolbar | - | auto | popcorn/xml[/...] | | \Tests\Support\Controllers\Popcorn::xml | | toolbar | - | auto | popcorn/toindex[/...] | | \Tests\Support\Controllers\Popcorn::toindex | | toolbar | - | auto | popcorn/echoJson[/...] | | \Tests\Support\Controllers\Popcorn::echoJson | | toolbar | - | auto | remap[/...] | | \Tests\Support\Controllers\Remap::_remap | | toolbar | - +---------+-------------------------------+---------------+-----------------------------------------------------+----------------+---------------+ + +---------+------------------+---------------+----------------------------------------+----------------+---------------+ + | Method | Route | Name | Handler | Before Filters | After Filters | + +---------+------------------+---------------+----------------------------------------+----------------+---------------+ + | GET | / | » | \App\Controllers\Home::index | | toolbar | + | GET | closure | » | (Closure) | | toolbar | + | GET | testing | testing-index | \App\Controllers\TestController::index | | toolbar | + | HEAD | testing | testing-index | \App\Controllers\TestController::index | | toolbar | + | POST | testing | testing-index | \App\Controllers\TestController::index | | toolbar | + | PUT | testing | testing-index | \App\Controllers\TestController::index | | toolbar | + | DELETE | testing | testing-index | \App\Controllers\TestController::index | | toolbar | + | OPTIONS | testing | testing-index | \App\Controllers\TestController::index | | toolbar | + | TRACE | testing | testing-index | \App\Controllers\TestController::index | | toolbar | + | CONNECT | testing | testing-index | \App\Controllers\TestController::index | | toolbar | + | CLI | testing | testing-index | \App\Controllers\TestController::index | | | + | auto | / | | \App\Controllers\Home::index | | toolbar | + | auto | home | | \App\Controllers\Home::index | | toolbar | + | auto | home/index[/...] | | \App\Controllers\Home::index | | toolbar | + +---------+------------------+---------------+----------------------------------------+----------------+---------------+ EOL; $this->assertStringContainsString($expected, $this->getBuffer()); } From 9221819ab3e92e6083ec0ec2f537c0c612b9f00b Mon Sep 17 00:00:00 2001 From: kenjis Date: Thu, 12 Oct 2023 14:21:51 +0900 Subject: [PATCH 173/209] refactor: make sure $component is all lower case --- system/Config/Factories.php | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/system/Config/Factories.php b/system/Config/Factories.php index a32df02725ac..077c25ca2761 100644 --- a/system/Config/Factories.php +++ b/system/Config/Factories.php @@ -100,6 +100,8 @@ class Factories */ public static function define(string $component, string $alias, string $classname): void { + $component = strtolower($component); + if (isset(self::$aliases[$component][$alias])) { if (self::$aliases[$component][$alias] === $classname) { return; @@ -130,12 +132,14 @@ public static function define(string $component, string $alias, string $classnam */ public static function __callStatic(string $component, array $arguments) { + $component = strtolower($component); + // First argument is the class alias, second is options $alias = trim(array_shift($arguments), '\\ '); $options = array_shift($arguments) ?? []; // Determine the component-specific options - $options = array_merge(self::getOptions(strtolower($component)), $options); + $options = array_merge(self::getOptions($component), $options); if (! $options['getShared']) { if (isset(self::$aliases[$component][$alias])) { @@ -394,6 +398,8 @@ public static function getOptions(string $component): array */ public static function setOptions(string $component, array $values): array { + $component = strtolower($component); + // Allow the config to replace the component name, to support "aliases" $values['component'] = strtolower($values['component'] ?? $component); @@ -452,8 +458,9 @@ public static function reset(?string $component = null) */ public static function injectMock(string $component, string $alias, object $instance) { - // Force a configuration to exist for this component $component = strtolower($component); + + // Force a configuration to exist for this component self::getOptions($component); $class = get_class($instance); From e78a438be738d8245f1071a5febba2d927f3911c Mon Sep 17 00:00:00 2001 From: kenjis Date: Thu, 12 Oct 2023 14:35:23 +0900 Subject: [PATCH 174/209] fix: $options are not saved in cache --- system/Config/Factories.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/system/Config/Factories.php b/system/Config/Factories.php index 077c25ca2761..120278c37e64 100644 --- a/system/Config/Factories.php +++ b/system/Config/Factories.php @@ -502,12 +502,14 @@ public static function getComponentInstances(string $component): array { if (! isset(static::$aliases[$component])) { return [ + 'options' => [], 'aliases' => [], 'instances' => [], ]; } return [ + 'options' => static::$options[$component], 'aliases' => static::$aliases[$component], 'instances' => self::$instances[$component], ]; @@ -520,9 +522,11 @@ public static function getComponentInstances(string $component): array */ public static function setComponentInstances(string $component, array $data): void { - static::$aliases[$component] = $data['aliases']; - self::$instances[$component] = $data['instances']; - unset(self::$updated[$component]); + static::$options[$component] = $data['options']; + static::$aliases[$component] = $data['aliases']; + static::$instances[$component] = $data['instances']; + + unset(static::$updated[$component]); } /** From 34283e46a7b1df32b4a640afdf7f0413dfe85929 Mon Sep 17 00:00:00 2001 From: kenjis Date: Thu, 12 Oct 2023 14:48:40 +0900 Subject: [PATCH 175/209] refactor: replace ::static with ::self For consistency. --- system/Config/Factories.php | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/system/Config/Factories.php b/system/Config/Factories.php index 120278c37e64..d5ba12efabe1 100644 --- a/system/Config/Factories.php +++ b/system/Config/Factories.php @@ -430,19 +430,19 @@ public static function reset(?string $component = null) { if ($component) { unset( - static::$options[$component], - static::$aliases[$component], - static::$instances[$component], - static::$updated[$component] + self::$options[$component], + self::$aliases[$component], + self::$instances[$component], + self::$updated[$component] ); return; } - static::$options = []; - static::$aliases = []; - static::$instances = []; - static::$updated = []; + self::$options = []; + self::$aliases = []; + self::$instances = []; + self::$updated = []; } /** @@ -500,7 +500,7 @@ public static function getBasename(string $alias): string */ public static function getComponentInstances(string $component): array { - if (! isset(static::$aliases[$component])) { + if (! isset(self::$aliases[$component])) { return [ 'options' => [], 'aliases' => [], @@ -509,8 +509,8 @@ public static function getComponentInstances(string $component): array } return [ - 'options' => static::$options[$component], - 'aliases' => static::$aliases[$component], + 'options' => self::$options[$component], + 'aliases' => self::$aliases[$component], 'instances' => self::$instances[$component], ]; } @@ -522,11 +522,11 @@ public static function getComponentInstances(string $component): array */ public static function setComponentInstances(string $component, array $data): void { - static::$options[$component] = $data['options']; - static::$aliases[$component] = $data['aliases']; - static::$instances[$component] = $data['instances']; + self::$options[$component] = $data['options']; + self::$aliases[$component] = $data['aliases']; + self::$instances[$component] = $data['instances']; - unset(static::$updated[$component]); + unset(self::$updated[$component]); } /** From 7664bb689fcf0d52f50555ef2780fa8cddb70a93 Mon Sep 17 00:00:00 2001 From: kenjis Date: Thu, 12 Oct 2023 15:17:19 +0900 Subject: [PATCH 176/209] test: update assertion --- tests/system/Config/FactoriesTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/system/Config/FactoriesTest.php b/tests/system/Config/FactoriesTest.php index b53c1e9133e5..6f74414def4e 100644 --- a/tests/system/Config/FactoriesTest.php +++ b/tests/system/Config/FactoriesTest.php @@ -429,7 +429,7 @@ public function testGetComponentInstances() public function testSetComponentInstances(array $data) { $before = Factories::getComponentInstances('config'); - $this->assertSame(['aliases' => [], 'instances' => []], $before); + $this->assertSame(['options' => [], 'aliases' => [], 'instances' => []], $before); Factories::setComponentInstances('config', $data); From 5af603cb217c233c4fe706239a9310f89c2ceeb5 Mon Sep 17 00:00:00 2001 From: kenjis Date: Fri, 13 Oct 2023 15:46:43 +0900 Subject: [PATCH 177/209] test: add test --- .../Router/DefinedRouteCollectorTest.php | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/tests/system/Router/DefinedRouteCollectorTest.php b/tests/system/Router/DefinedRouteCollectorTest.php index ba74cec1a86a..976d74268a35 100644 --- a/tests/system/Router/DefinedRouteCollectorTest.php +++ b/tests/system/Router/DefinedRouteCollectorTest.php @@ -87,4 +87,45 @@ public function testCollect() ]; $this->assertSame($expected, $definedRoutes); } + + /** + * @see https://github.com/codeigniter4/CodeIgniter4/issues/8039 + */ + public function testCollectSameFromWithDifferentVerb() + { + $routes = $this->createRouteCollection(); + $routes->get('login', 'AuthController::showLogin', ['as' => 'loginShow']); + $routes->post('login', 'AuthController::login', ['as' => 'login']); + $routes->get('logout', 'AuthController::logout', ['as' => 'logout']); + + $collector = new DefinedRouteCollector($routes); + + $definedRoutes = []; + + foreach ($collector->collect() as $route) { + $definedRoutes[] = $route; + } + + $expected = [ + [ + 'method' => 'get', + 'route' => 'login', + 'name' => 'loginShow', + 'handler' => '\\App\\Controllers\\AuthController::showLogin', + ], + [ + 'method' => 'get', + 'route' => 'logout', + 'name' => 'logout', + 'handler' => '\\App\\Controllers\\AuthController::logout', + ], + [ + 'method' => 'post', + 'route' => 'login', + 'name' => 'login', + 'handler' => '\\App\\Controllers\\AuthController::login', + ], + ]; + $this->assertSame($expected, $definedRoutes); + } } From 68f8218b113f9648a43ff5298c6ce73518c54bc8 Mon Sep 17 00:00:00 2001 From: kenjis Date: Fri, 13 Oct 2023 15:47:00 +0900 Subject: [PATCH 178/209] fix: DefinedRouteCollector returns incorrect route data --- system/Router/DefinedRouteCollector.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/Router/DefinedRouteCollector.php b/system/Router/DefinedRouteCollector.php index 2b317d4cbc2a..f8e245d19723 100644 --- a/system/Router/DefinedRouteCollector.php +++ b/system/Router/DefinedRouteCollector.php @@ -57,7 +57,7 @@ public function collect(): Generator $handler = $view ? '(View) ' . $view : '(Closure)'; } - $routeName = $this->routeCollection->getRoutesOptions($route)['as'] ?? $route; + $routeName = $this->routeCollection->getRoutesOptions($route, $method)['as'] ?? $route; yield [ 'method' => $method, From 19cdaf2e4e713a917bcbc311df29d3b25c5dc6d5 Mon Sep 17 00:00:00 2001 From: kenjis Date: Fri, 13 Oct 2023 15:51:29 +0900 Subject: [PATCH 179/209] docs: add changelog --- user_guide_src/source/changelogs/v4.4.2.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/user_guide_src/source/changelogs/v4.4.2.rst b/user_guide_src/source/changelogs/v4.4.2.rst index beb5790fc8c1..bacfdf2a2e97 100644 --- a/user_guide_src/source/changelogs/v4.4.2.rst +++ b/user_guide_src/source/changelogs/v4.4.2.rst @@ -46,6 +46,7 @@ Bugs Fixed production mode or to display backtrace in json when an exception occurred. - **Forge:** Fixed a bug where adding a Primary Key to an existing table was ignored if there were no other Keys added too. +- **Routing:** Fixed a bug that ``spark routes`` may show incorrect route names. See the repo's `CHANGELOG.md `_ From ef37e120291f301721f65872202fb9ca8657b2bc Mon Sep 17 00:00:00 2001 From: kenjis Date: Fri, 13 Oct 2023 16:34:45 +0900 Subject: [PATCH 180/209] docs: add text decoration --- user_guide_src/source/libraries/curlrequest.rst | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/user_guide_src/source/libraries/curlrequest.rst b/user_guide_src/source/libraries/curlrequest.rst index 4da540937cb3..fe21546aa8ed 100644 --- a/user_guide_src/source/libraries/curlrequest.rst +++ b/user_guide_src/source/libraries/curlrequest.rst @@ -214,7 +214,7 @@ cookie ====== This specifies the filename that CURL should use to read cookie values from, and -to save cookie values to. This is done using the CURL_COOKIEJAR and CURL_COOKIEFILE options. +to save cookie values to. This is done using the ``CURL_COOKIEJAR`` and ``CURL_COOKIEFILE`` options. An example: .. literalinclude:: curlrequest/021.php @@ -223,8 +223,10 @@ debug ===== When ``debug`` is passed and set to ``true``, this will enable additional debugging to echo to STDERR during the -script execution. This is done by passing CURLOPT_VERBOSE and echoing the output. So, when you're running a built-in -server via ``spark serve`` you will see the output in the console. Otherwise, the output will be written to +script execution. + +This is done by passing ``CURLOPT_VERBOSE`` and echoing the output. So, when you're running a built-in +server via ``spark serve``, you will see the output in the console. Otherwise, the output will be written to the server's error log. .. literalinclude:: curlrequest/034.php From 8d903a0c8eb39272edbdbff0351fcb64085bc3d6 Mon Sep 17 00:00:00 2001 From: kenjis Date: Fri, 13 Oct 2023 16:37:18 +0900 Subject: [PATCH 181/209] docs: improve explanation --- user_guide_src/source/libraries/curlrequest.rst | 7 +++++-- user_guide_src/source/libraries/curlrequest/026.php | 9 +++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/user_guide_src/source/libraries/curlrequest.rst b/user_guide_src/source/libraries/curlrequest.rst index fe21546aa8ed..f029efc4f883 100644 --- a/user_guide_src/source/libraries/curlrequest.rst +++ b/user_guide_src/source/libraries/curlrequest.rst @@ -272,8 +272,11 @@ further headers arrays or calls to ``setHeader()``. http_errors =========== -By default, CURLRequest will fail if the HTTP code returned is greater than or equal to 400. You can set -``http_errors`` to ``false`` to return the content instead: +By default, CURLRequest will throw ``HTTPException`` if the HTTP code returned is +greater than or equal to 400. + +If you want to see the response body, you can set ``http_errors`` to ``false`` to +return the content instead: .. literalinclude:: curlrequest/026.php diff --git a/user_guide_src/source/libraries/curlrequest/026.php b/user_guide_src/source/libraries/curlrequest/026.php index 36ea74cb9293..6c42894547bd 100644 --- a/user_guide_src/source/libraries/curlrequest/026.php +++ b/user_guide_src/source/libraries/curlrequest/026.php @@ -1,8 +1,9 @@ request('GET', '/status/500'); -// Will fail verbosely +// If the response code is 500, an HTTPException is thrown, +// and a detailed error report is displayed if in development mode. -$res = $client->request('GET', '/status/500', ['http_errors' => false]); -echo $res->getStatusCode(); -// 500 +$response = $client->request('GET', '/status/500', ['http_errors' => false]); +echo $response->getStatusCode(); // 500 +echo $response->getBody(); // You can see the response body. From 60a0fac97fe84152a87a5c814dc8fb486e42ce7a Mon Sep 17 00:00:00 2001 From: kenjis Date: Sat, 14 Oct 2023 13:25:40 +0900 Subject: [PATCH 182/209] docs: fix anchor text --- user_guide_src/source/installation/upgrade_file_upload.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_guide_src/source/installation/upgrade_file_upload.rst b/user_guide_src/source/installation/upgrade_file_upload.rst index d7a38a1f97d8..adb200b9f0f7 100644 --- a/user_guide_src/source/installation/upgrade_file_upload.rst +++ b/user_guide_src/source/installation/upgrade_file_upload.rst @@ -7,7 +7,7 @@ Upgrade Working with Uploaded Files Documentations ============== -- `Output Class Documentation CodeIgniter 3.X `_ +- `File Uploading Class Documentation CodeIgniter 3.X `_ - :doc:`Working with Uploaded Files Documentation CodeIgniter 4.X ` What has been changed From 576dd6853c0d4fae37be4bc63607c6e40d96eaf2 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 16 Oct 2023 06:59:56 +0700 Subject: [PATCH 183/209] [Rector] Enable $rectorConfig->removeUnusedImports() --- rector.php | 1 + system/Router/RouteCollection.php | 1 - system/Session/Session.php | 1 - system/Test/FeatureTestCase.php | 2 -- system/Validation/FileRules.php | 1 - tests/system/Helpers/URLHelper/SiteUrlTest.php | 1 - tests/system/Test/FilterTestTraitTest.php | 1 - 7 files changed, 1 insertion(+), 7 deletions(-) diff --git a/rector.php b/rector.php index c2b76343dfff..c1cd2674548a 100644 --- a/rector.php +++ b/rector.php @@ -112,6 +112,7 @@ // auto import fully qualified class names $rectorConfig->importNames(); + $rectorConfig->removeUnusedImports(); $rectorConfig->rule(UnderscoreToCamelCaseVariableNameRector::class); $rectorConfig->rule(SimplifyUselessVariableRector::class); diff --git a/system/Router/RouteCollection.php b/system/Router/RouteCollection.php index e484129a77b1..b3bb96e9fa2b 100644 --- a/system/Router/RouteCollection.php +++ b/system/Router/RouteCollection.php @@ -19,7 +19,6 @@ use Config\Routing; use Config\Services; use InvalidArgumentException; -use Locale; /** * @todo Implement nested resource routing (See CakePHP) diff --git a/system/Session/Session.php b/system/Session/Session.php index ba4388472c3e..4e4a01581ba2 100644 --- a/system/Session/Session.php +++ b/system/Session/Session.php @@ -13,7 +13,6 @@ use CodeIgniter\Cookie\Cookie; use CodeIgniter\I18n\Time; -use Config\App; use Config\Cookie as CookieConfig; use Config\Services; use Config\Session as SessionConfig; diff --git a/system/Test/FeatureTestCase.php b/system/Test/FeatureTestCase.php index 02835391ca48..3d4cb0f426a0 100644 --- a/system/Test/FeatureTestCase.php +++ b/system/Test/FeatureTestCase.php @@ -15,10 +15,8 @@ use CodeIgniter\HTTP\CLIRequest; use CodeIgniter\HTTP\Exceptions\RedirectException; use CodeIgniter\HTTP\IncomingRequest; -use CodeIgniter\HTTP\Request; use CodeIgniter\HTTP\URI; use CodeIgniter\HTTP\UserAgent; -use CodeIgniter\Router\RouteCollection; use Config\App; use Config\Services; use Exception; diff --git a/system/Validation/FileRules.php b/system/Validation/FileRules.php index 756c7c7536b6..ce0ed8140d42 100644 --- a/system/Validation/FileRules.php +++ b/system/Validation/FileRules.php @@ -13,7 +13,6 @@ use CodeIgniter\HTTP\CLIRequest; use CodeIgniter\HTTP\IncomingRequest; -use CodeIgniter\HTTP\Request; use CodeIgniter\HTTP\RequestInterface; use Config\Mimes; use Config\Services; diff --git a/tests/system/Helpers/URLHelper/SiteUrlTest.php b/tests/system/Helpers/URLHelper/SiteUrlTest.php index 1a03d80f3521..529d1e6872a4 100644 --- a/tests/system/Helpers/URLHelper/SiteUrlTest.php +++ b/tests/system/Helpers/URLHelper/SiteUrlTest.php @@ -15,7 +15,6 @@ use CodeIgniter\Config\Services; use CodeIgniter\HTTP\IncomingRequest; use CodeIgniter\HTTP\SiteURIFactory; -use CodeIgniter\HTTP\URI; use CodeIgniter\HTTP\UserAgent; use CodeIgniter\Superglobals; use CodeIgniter\Test\CIUnitTestCase; diff --git a/tests/system/Test/FilterTestTraitTest.php b/tests/system/Test/FilterTestTraitTest.php index 32ebef106457..e2d5a423637f 100644 --- a/tests/system/Test/FilterTestTraitTest.php +++ b/tests/system/Test/FilterTestTraitTest.php @@ -11,7 +11,6 @@ namespace CodeIgniter\Test; -use CodeIgniter\Filters\Filters; use CodeIgniter\HTTP\RequestInterface; use Tests\Support\Filters\Customfilter; From 83ebb79d20289c1df033f1d9ef6eb13ed7b476b7 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 18 Sep 2023 14:49:59 +0700 Subject: [PATCH 184/209] [Rector] Apply BooleanInIfConditionRuleFixerRector --- rector.php | 2 ++ system/Autoloader/FileLocator.php | 2 +- system/BaseModel.php | 4 ++-- system/CLI/Commands.php | 2 +- system/Cache/Handlers/PredisHandler.php | 2 +- system/Cache/Handlers/RedisHandler.php | 2 +- system/CodeIgniter.php | 2 +- system/Config/Factories.php | 4 ++-- system/Debug/ExceptionHandler.php | 2 +- system/Debug/Exceptions.php | 6 +++--- system/Encryption/Encryption.php | 2 +- system/HTTP/CURLRequest.php | 2 +- system/HTTP/SiteURI.php | 2 +- system/HTTP/URI.php | 6 +++--- system/Helpers/test_helper.php | 2 +- system/Log/Logger.php | 2 +- system/Pager/Pager.php | 4 ++-- system/Test/FeatureTestCase.php | 2 +- system/Test/FeatureTestTrait.php | 2 +- system/Validation/Validation.php | 4 ++-- system/View/View.php | 4 ++-- 21 files changed, 31 insertions(+), 29 deletions(-) diff --git a/rector.php b/rector.php index c1cd2674548a..89b92f15e58d 100644 --- a/rector.php +++ b/rector.php @@ -41,6 +41,7 @@ use Rector\Privatization\Rector\Property\PrivatizeFinalClassPropertyRector; use Rector\Set\ValueObject\LevelSetList; use Rector\Set\ValueObject\SetList; +use Rector\Strict\Rector\If_\BooleanInIfConditionRuleFixerRector; use Utils\Rector\PassStrictParameterToFunctionParameterRector; use Utils\Rector\RemoveErrorSuppressInTryCatchStmtsRector; use Utils\Rector\RemoveVarTagFromClassConstantRector; @@ -140,4 +141,5 @@ $rectorConfig->rule(StringClassNameToClassConstantRector::class); $rectorConfig->rule(PrivatizeFinalClassPropertyRector::class); $rectorConfig->rule(CompleteDynamicPropertiesRector::class); + $rectorConfig->rule(BooleanInIfConditionRuleFixerRector::class); }; diff --git a/system/Autoloader/FileLocator.php b/system/Autoloader/FileLocator.php index bc18bd31b980..744567a3bcc0 100644 --- a/system/Autoloader/FileLocator.php +++ b/system/Autoloader/FileLocator.php @@ -205,7 +205,7 @@ public function search(string $path, string $ext = 'php', bool $prioritizeApp = */ protected function ensureExt(string $path, string $ext): string { - if ($ext) { + if ($ext !== '') { $ext = '.' . $ext; if (substr($path, -strlen($ext)) !== $ext) { diff --git a/system/BaseModel.php b/system/BaseModel.php index 0cf63ac9f3ec..435e73e26693 100644 --- a/system/BaseModel.php +++ b/system/BaseModel.php @@ -1194,7 +1194,7 @@ public function paginate(?int $perPage = null, string $group = 'default', ?int $ // Since multiple models may use the Pager, the Pager must be shared. $pager = Services::pager(); - if ($segment) { + if ($segment !== 0) { $pager->setSegment($segment, $group); } @@ -1657,7 +1657,7 @@ protected function objectToArray($data, bool $onlyChanged = true, bool $recursiv $properties = $this->objectToRawArray($data, $onlyChanged, $recursive); // Convert any Time instances to appropriate $dateFormat - if ($properties) { + if ($properties !== null && $properties !== []) { $properties = array_map(function ($value) { if ($value instanceof Time) { return $this->timeToDate($value); diff --git a/system/CLI/Commands.php b/system/CLI/Commands.php index df28e533a354..df747723d571 100644 --- a/system/CLI/Commands.php +++ b/system/CLI/Commands.php @@ -146,7 +146,7 @@ public function verifyCommand(string $command, array $commands): bool $message = lang('CLI.commandNotFound', [$command]); - if ($alternatives = $this->getCommandAlternatives($command, $commands)) { + if (($alternatives = $this->getCommandAlternatives($command, $commands)) !== []) { if (count($alternatives) === 1) { $message .= "\n\n" . lang('CLI.altCommandSingular') . "\n "; } else { diff --git a/system/Cache/Handlers/PredisHandler.php b/system/Cache/Handlers/PredisHandler.php index 4e06b85bc8ce..986d083ebc69 100644 --- a/system/Cache/Handlers/PredisHandler.php +++ b/system/Cache/Handlers/PredisHandler.php @@ -133,7 +133,7 @@ public function save(string $key, $value, int $ttl = 60) return false; } - if ($ttl) { + if ($ttl !== 0) { $this->redis->expireat($key, Time::now()->getTimestamp() + $ttl); } diff --git a/system/Cache/Handlers/RedisHandler.php b/system/Cache/Handlers/RedisHandler.php index 9d1ddf3c15d4..42b44cd98a96 100644 --- a/system/Cache/Handlers/RedisHandler.php +++ b/system/Cache/Handlers/RedisHandler.php @@ -159,7 +159,7 @@ public function save(string $key, $value, int $ttl = 60) return false; } - if ($ttl) { + if ($ttl !== 0) { $this->redis->expireAt($key, Time::now()->getTimestamp() + $ttl); } diff --git a/system/CodeIgniter.php b/system/CodeIgniter.php index a949915c6139..1d1de71dfaa0 100644 --- a/system/CodeIgniter.php +++ b/system/CodeIgniter.php @@ -708,7 +708,7 @@ protected function forceSecureAccess($duration = 31_536_000) */ public function displayCache(Cache $config) { - if ($cachedResponse = $this->pageCache->get($this->request, $this->response)) { + if (($cachedResponse = $this->pageCache->get($this->request, $this->response)) instanceof ResponseInterface) { $this->response = $cachedResponse; $this->totalTime = $this->benchmark->getElapsedTime('total_execution'); diff --git a/system/Config/Factories.php b/system/Config/Factories.php index a32df02725ac..8e879877e545 100644 --- a/system/Config/Factories.php +++ b/system/Config/Factories.php @@ -145,7 +145,7 @@ public static function __callStatic(string $component, array $arguments) } // Try to locate the class - if ($class = self::locateClass($options, $alias)) { + if (($class = self::locateClass($options, $alias)) !== null && ($class = self::locateClass($options, $alias)) !== '') { return new $class(...$arguments); } @@ -422,7 +422,7 @@ public static function setOptions(string $component, array $values): array */ public static function reset(?string $component = null) { - if ($component) { + if ($component !== null && $component !== '') { unset( static::$options[$component], static::$aliases[$component], diff --git a/system/Debug/ExceptionHandler.php b/system/Debug/ExceptionHandler.php index 33b114e30341..9e12cd2f8aa9 100644 --- a/system/Debug/ExceptionHandler.php +++ b/system/Debug/ExceptionHandler.php @@ -129,7 +129,7 @@ protected function determineView(Throwable $exception, string $templatePath): st // Production environments should have a custom exception file. $view = 'production.php'; - if (str_ireplace(['off', 'none', 'no', 'false', 'null'], '', ini_get('display_errors'))) { + if (str_ireplace(['off', 'none', 'no', 'false', 'null'], '', ini_get('display_errors')) !== '' && str_ireplace(['off', 'none', 'no', 'false', 'null'], '', ini_get('display_errors')) !== []) { $view = 'error_exception.php'; } diff --git a/system/Debug/Exceptions.php b/system/Debug/Exceptions.php index f3a69c32b29a..72e0aef0fdf6 100644 --- a/system/Debug/Exceptions.php +++ b/system/Debug/Exceptions.php @@ -201,7 +201,7 @@ public function errorHandler(int $severity, string $message, ?string $file = nul return $this->handleDeprecationError($message, $file, $line); } - if (error_reporting() & $severity) { + if ((error_reporting() & $severity) !== 0) { throw new ErrorException($message, 0, $severity, $file, $line); } @@ -227,7 +227,7 @@ public function shutdownHandler() ['type' => $type, 'message' => $message, 'file' => $file, 'line' => $line] = $error; - if ($this->exceptionCaughtByExceptionHandler) { + if ($this->exceptionCaughtByExceptionHandler instanceof Throwable) { $message .= "\n【Previous Exception】\n" . get_class($this->exceptionCaughtByExceptionHandler) . "\n" . $this->exceptionCaughtByExceptionHandler->getMessage() . "\n" @@ -253,7 +253,7 @@ protected function determineView(Throwable $exception, string $templatePath): st $view = 'production.php'; $templatePath = rtrim($templatePath, '\\/ ') . DIRECTORY_SEPARATOR; - if (str_ireplace(['off', 'none', 'no', 'false', 'null'], '', ini_get('display_errors'))) { + if (str_ireplace(['off', 'none', 'no', 'false', 'null'], '', ini_get('display_errors')) !== [] && str_ireplace(['off', 'none', 'no', 'false', 'null'], '', ini_get('display_errors')) !== '') { $view = 'error_exception.php'; } diff --git a/system/Encryption/Encryption.php b/system/Encryption/Encryption.php index 6a0517b1d116..55c0cd4d7320 100644 --- a/system/Encryption/Encryption.php +++ b/system/Encryption/Encryption.php @@ -108,7 +108,7 @@ public function __construct(?EncryptionConfig $config = null) */ public function initialize(?EncryptionConfig $config = null) { - if ($config) { + if ($config instanceof \Config\Encryption) { $this->key = $config->key; $this->driver = $config->driver; $this->digest = $config->digest ?? 'SHA512'; diff --git a/system/HTTP/CURLRequest.php b/system/HTTP/CURLRequest.php index 0604c3367b7a..c8b3b9fe9f92 100644 --- a/system/HTTP/CURLRequest.php +++ b/system/HTTP/CURLRequest.php @@ -578,7 +578,7 @@ protected function setCURLOptions(array $curlOptions = [], array $config = []) if (! empty($config['decode_content'])) { $accept = $this->getHeaderLine('Accept-Encoding'); - if ($accept) { + if ($accept !== '') { $curlOptions[CURLOPT_ENCODING] = $accept; } else { $curlOptions[CURLOPT_ENCODING] = ''; diff --git a/system/HTTP/SiteURI.php b/system/HTTP/SiteURI.php index 3a163bdac428..d01f614a1c85 100644 --- a/system/HTTP/SiteURI.php +++ b/system/HTTP/SiteURI.php @@ -213,7 +213,7 @@ private function setBasePath(): void $this->baseSegments = $this->convertToSegments($this->basePathWithoutIndexPage); - if ($this->indexPage) { + if ($this->indexPage !== '') { $this->baseSegments[] = $this->indexPage; } } diff --git a/system/HTTP/URI.php b/system/HTTP/URI.php index c6fd64ae4418..2936876dd539 100644 --- a/system/HTTP/URI.php +++ b/system/HTTP/URI.php @@ -177,11 +177,11 @@ public static function createURIString( : ltrim($path, '/'); } - if ($query) { + if ($query !== null && $query !== '') { $uri .= '?' . $query; } - if ($fragment) { + if ($fragment !== null && $fragment !== '') { $uri .= '#' . $fragment; } @@ -1106,7 +1106,7 @@ public function resolveRelativeURI(string $uri) if ($relative->getPath() === '') { $transformed->setPath($this->getPath()); - if ($relative->getQuery()) { + if ($relative->getQuery() !== '') { $transformed->setQuery($relative->getQuery()); } else { $transformed->setQuery($this->getQuery()); diff --git a/system/Helpers/test_helper.php b/system/Helpers/test_helper.php index 809a7aabe71b..bd468e037227 100644 --- a/system/Helpers/test_helper.php +++ b/system/Helpers/test_helper.php @@ -30,7 +30,7 @@ function fake($model, ?array $overrides = null, $persist = true) { $fabricator = new Fabricator($model); - if ($overrides) { + if ($overrides !== null && $overrides !== []) { $fabricator->setOverrides($overrides); } diff --git a/system/Log/Logger.php b/system/Log/Logger.php index b1583f5d789c..afd703147870 100644 --- a/system/Log/Logger.php +++ b/system/Log/Logger.php @@ -125,7 +125,7 @@ public function __construct($config, bool $debug = CI_DEBUG) // Now convert loggable levels to strings. // We only use numbers to make the threshold setting convenient for users. - if ($this->loggableLevels) { + if ($this->loggableLevels !== []) { $temp = []; foreach ($this->loggableLevels as $level) { diff --git a/system/Pager/Pager.php b/system/Pager/Pager.php index 648bb1e5e4de..b08cb00410fd 100644 --- a/system/Pager/Pager.php +++ b/system/Pager/Pager.php @@ -136,7 +136,7 @@ protected function displayLinks(string $group, string $template): string */ public function store(string $group, int $page, ?int $perPage, int $total, int $segment = 0) { - if ($segment) { + if ($segment !== 0) { $this->setSegment($segment, $group); } @@ -409,7 +409,7 @@ protected function ensureGroup(string $group, ?int $perPage = null) $this->calculateCurrentPage($group); - if ($_GET) { + if ($_GET !== []) { $this->groups[$group]['uri'] = $this->groups[$group]['uri']->setQueryArray($_GET); } } diff --git a/system/Test/FeatureTestCase.php b/system/Test/FeatureTestCase.php index 3d4cb0f426a0..6e9cec0d16d5 100644 --- a/system/Test/FeatureTestCase.php +++ b/system/Test/FeatureTestCase.php @@ -55,7 +55,7 @@ protected function withRoutes(?array $routes = null) { $collection = Services::routes(); - if ($routes) { + if ($routes !== null && $routes !== []) { $collection->resetRoutes(); foreach ($routes as $route) { diff --git a/system/Test/FeatureTestTrait.php b/system/Test/FeatureTestTrait.php index 43db39f93f47..b16e941fef63 100644 --- a/system/Test/FeatureTestTrait.php +++ b/system/Test/FeatureTestTrait.php @@ -47,7 +47,7 @@ protected function withRoutes(?array $routes = null) { $collection = Services::routes(); - if ($routes) { + if ($routes !== null && $routes !== []) { $collection->resetRoutes(); foreach ($routes as $route) { diff --git a/system/Validation/Validation.php b/system/Validation/Validation.php index b40bc91048bc..ad95cde7bc6b 100644 --- a/system/Validation/Validation.php +++ b/system/Validation/Validation.php @@ -525,7 +525,7 @@ public function setRule(string $field, ?string $label, $rules, array $errors = [ ], ]; - if ($errors) { + if ($errors !== []) { $ruleSet[$field]['errors'] = $errors; } @@ -773,7 +773,7 @@ protected function fillPlaceholders(array $rules, array $data): array // Check if the rule does not have placeholders foreach ($placeholderRules as $placeholderRule) { - if ($this->retrievePlaceholders($placeholderRule, $data)) { + if ($this->retrievePlaceholders($placeholderRule, $data) !== []) { throw new LogicException( 'The placeholder field cannot use placeholder: ' . $field ); diff --git a/system/View/View.php b/system/View/View.php index e8fdf5f18f7e..a10d17025a73 100644 --- a/system/View/View.php +++ b/system/View/View.php @@ -336,7 +336,7 @@ public function excerpt(string $string, int $length = 20): string */ public function setData(array $data = [], ?string $context = null): RendererInterface { - if ($context) { + if ($context !== null && $context !== '') { $data = \esc($data, $context); } @@ -356,7 +356,7 @@ public function setData(array $data = [], ?string $context = null): RendererInte */ public function setVar(string $name, $value = null, ?string $context = null): RendererInterface { - if ($context) { + if ($context !== null && $context !== '') { $value = esc($value, $context); } From 8e288d2c6f9ec459c4a0041b0e448ee4c0292a1e Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 18 Sep 2023 15:12:12 +0700 Subject: [PATCH 185/209] use compare string for ini_get('display_errors') Co-authored-by: kenjis --- system/Debug/Exceptions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/Debug/Exceptions.php b/system/Debug/Exceptions.php index 72e0aef0fdf6..885f98ae0b06 100644 --- a/system/Debug/Exceptions.php +++ b/system/Debug/Exceptions.php @@ -253,7 +253,7 @@ protected function determineView(Throwable $exception, string $templatePath): st $view = 'production.php'; $templatePath = rtrim($templatePath, '\\/ ') . DIRECTORY_SEPARATOR; - if (str_ireplace(['off', 'none', 'no', 'false', 'null'], '', ini_get('display_errors')) !== [] && str_ireplace(['off', 'none', 'no', 'false', 'null'], '', ini_get('display_errors')) !== '') { + if (str_ireplace(['off', 'none', 'no', 'false', 'null'], '', ini_get('display_errors')) !== '') { $view = 'error_exception.php'; } From 41ecd8b07a4d1bd06c51c86bbcb3aaf8bedefd9a Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 18 Sep 2023 15:12:30 +0700 Subject: [PATCH 186/209] use compare string for ini_get('display_errors') Co-authored-by: kenjis --- system/Debug/ExceptionHandler.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/Debug/ExceptionHandler.php b/system/Debug/ExceptionHandler.php index 9e12cd2f8aa9..9fe40f33728c 100644 --- a/system/Debug/ExceptionHandler.php +++ b/system/Debug/ExceptionHandler.php @@ -129,7 +129,7 @@ protected function determineView(Throwable $exception, string $templatePath): st // Production environments should have a custom exception file. $view = 'production.php'; - if (str_ireplace(['off', 'none', 'no', 'false', 'null'], '', ini_get('display_errors')) !== '' && str_ireplace(['off', 'none', 'no', 'false', 'null'], '', ini_get('display_errors')) !== []) { + if (str_ireplace(['off', 'none', 'no', 'false', 'null'], '', ini_get('display_errors')) !== '') { $view = 'error_exception.php'; } From 2d3327fdce80c193460d104b46f926c82fb0b8ee Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 18 Sep 2023 15:51:39 +0700 Subject: [PATCH 187/209] Update system/Config/Factories.php Co-authored-by: kenjis --- system/Config/Factories.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/system/Config/Factories.php b/system/Config/Factories.php index 8e879877e545..ea295f865017 100644 --- a/system/Config/Factories.php +++ b/system/Config/Factories.php @@ -145,7 +145,8 @@ public static function __callStatic(string $component, array $arguments) } // Try to locate the class - if (($class = self::locateClass($options, $alias)) !== null && ($class = self::locateClass($options, $alias)) !== '') { + $class = self::locateClass($options, $alias) + if ($class !== null) { return new $class(...$arguments); } From 8be0e018646a1ec59ef8902f93b0f9f5227dbb4e Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 18 Sep 2023 16:45:12 +0700 Subject: [PATCH 188/209] Fix missing semicolon --- system/Config/Factories.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/Config/Factories.php b/system/Config/Factories.php index ea295f865017..82ba73ee8308 100644 --- a/system/Config/Factories.php +++ b/system/Config/Factories.php @@ -145,7 +145,7 @@ public static function __callStatic(string $component, array $arguments) } // Try to locate the class - $class = self::locateClass($options, $alias) + $class = self::locateClass($options, $alias); if ($class !== null) { return new $class(...$arguments); } From eb8d382ccae3da8776558bc3c9259ccb737896d1 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 18 Sep 2023 16:45:54 +0700 Subject: [PATCH 189/209] re-run Rector --- system/Encryption/Encryption.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/Encryption/Encryption.php b/system/Encryption/Encryption.php index 55c0cd4d7320..113703d55649 100644 --- a/system/Encryption/Encryption.php +++ b/system/Encryption/Encryption.php @@ -108,7 +108,7 @@ public function __construct(?EncryptionConfig $config = null) */ public function initialize(?EncryptionConfig $config = null) { - if ($config instanceof \Config\Encryption) { + if ($config instanceof EncryptionConfig) { $this->key = $config->key; $this->driver = $config->driver; $this->digest = $config->digest ?? 'SHA512'; From 594fcc25a2869e762406136db428682eda250941 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Tue, 26 Sep 2023 19:33:54 +0700 Subject: [PATCH 190/209] fix instanceof assign --- system/CodeIgniter.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/system/CodeIgniter.php b/system/CodeIgniter.php index 1d1de71dfaa0..5c3efb78e4e0 100644 --- a/system/CodeIgniter.php +++ b/system/CodeIgniter.php @@ -708,7 +708,8 @@ protected function forceSecureAccess($duration = 31_536_000) */ public function displayCache(Cache $config) { - if (($cachedResponse = $this->pageCache->get($this->request, $this->response)) instanceof ResponseInterface) { + $cachedResponse = $this->pageCache->get($this->request, $this->response); + if ($cachedResponse instanceof ResponseInterface) { $this->response = $cachedResponse; $this->totalTime = $this->benchmark->getElapsedTime('total_execution'); From 11fcb7a3ba50799b084dd55cf3ed0748d22eccdc Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 2 Oct 2023 07:30:01 +0700 Subject: [PATCH 191/209] empty string context is impossible --- system/View/View.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/View/View.php b/system/View/View.php index a10d17025a73..c413bb754dc3 100644 --- a/system/View/View.php +++ b/system/View/View.php @@ -356,7 +356,7 @@ public function setData(array $data = [], ?string $context = null): RendererInte */ public function setVar(string $name, $value = null, ?string $context = null): RendererInterface { - if ($context !== null && $context !== '') { + if ($context !== null) { $value = esc($value, $context); } From 9c497249fac7e1a1c1b3eda4ec068773306723c8 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 2 Oct 2023 16:08:29 +0700 Subject: [PATCH 192/209] add assert array for properties --- system/BaseModel.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/system/BaseModel.php b/system/BaseModel.php index 435e73e26693..c27afd027423 100644 --- a/system/BaseModel.php +++ b/system/BaseModel.php @@ -1656,8 +1656,10 @@ protected function objectToArray($data, bool $onlyChanged = true, bool $recursiv { $properties = $this->objectToRawArray($data, $onlyChanged, $recursive); + assert(is_array($properties)); + // Convert any Time instances to appropriate $dateFormat - if ($properties !== null && $properties !== []) { + if ($properties !== []) { $properties = array_map(function ($value) { if ($value instanceof Time) { return $this->timeToDate($value); From e73893fae426e26cc03b4f5060e00a1d774afb12 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 16 Oct 2023 11:29:55 +0700 Subject: [PATCH 193/209] move alternatives to previous assign --- system/CLI/Commands.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/system/CLI/Commands.php b/system/CLI/Commands.php index df747723d571..1de0df2791d6 100644 --- a/system/CLI/Commands.php +++ b/system/CLI/Commands.php @@ -146,7 +146,8 @@ public function verifyCommand(string $command, array $commands): bool $message = lang('CLI.commandNotFound', [$command]); - if (($alternatives = $this->getCommandAlternatives($command, $commands)) !== []) { + $alternatives = $this->getCommandAlternatives($command, $commands); + if ($alternatives !== []) { if (count($alternatives) === 1) { $message .= "\n\n" . lang('CLI.altCommandSingular') . "\n "; } else { From 534d9175c9455a452854852aa555581a4e3622cd Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 16 Oct 2023 11:31:41 +0700 Subject: [PATCH 194/209] updated to only check not null --- system/Config/Factories.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/Config/Factories.php b/system/Config/Factories.php index 82ba73ee8308..f264c74f070c 100644 --- a/system/Config/Factories.php +++ b/system/Config/Factories.php @@ -423,7 +423,7 @@ public static function setOptions(string $component, array $values): array */ public static function reset(?string $component = null) { - if ($component !== null && $component !== '') { + if ($component !== null) { unset( static::$options[$component], static::$aliases[$component], From 8f015f8f87836ee97c5559b30d858c501064bbaa Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 16 Oct 2023 11:32:59 +0700 Subject: [PATCH 195/209] updated to only check not null --- system/HTTP/URI.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/HTTP/URI.php b/system/HTTP/URI.php index 2936876dd539..196d4f4ab121 100644 --- a/system/HTTP/URI.php +++ b/system/HTTP/URI.php @@ -177,7 +177,7 @@ public static function createURIString( : ltrim($path, '/'); } - if ($query !== null && $query !== '') { + if ($query !== null) { $uri .= '?' . $query; } From 9cb0fba85f70cba3c0d9580df386671a8f5e78ac Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 16 Oct 2023 11:33:39 +0700 Subject: [PATCH 196/209] updated to only check not null --- system/HTTP/URI.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/HTTP/URI.php b/system/HTTP/URI.php index 196d4f4ab121..102808debbfd 100644 --- a/system/HTTP/URI.php +++ b/system/HTTP/URI.php @@ -181,7 +181,7 @@ public static function createURIString( $uri .= '?' . $query; } - if ($fragment !== null && $fragment !== '') { + if ($fragment !== null) { $uri .= '#' . $fragment; } From 201f4a0ae789edb44e1014956d3953b724976226 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 16 Oct 2023 11:34:32 +0700 Subject: [PATCH 197/209] updated to only check not null --- system/Helpers/test_helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/Helpers/test_helper.php b/system/Helpers/test_helper.php index bd468e037227..a542bb1ca73c 100644 --- a/system/Helpers/test_helper.php +++ b/system/Helpers/test_helper.php @@ -30,7 +30,7 @@ function fake($model, ?array $overrides = null, $persist = true) { $fabricator = new Fabricator($model); - if ($overrides !== null && $overrides !== []) { + if ($overrides !== null) { $fabricator->setOverrides($overrides); } From ca30ea6af6c4068052e160509ef04ce0c64f655e Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 16 Oct 2023 11:36:17 +0700 Subject: [PATCH 198/209] updated to only check not null --- system/Test/FeatureTestCase.php | 2 +- system/Test/FeatureTestTrait.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/system/Test/FeatureTestCase.php b/system/Test/FeatureTestCase.php index 6e9cec0d16d5..c94cf926ca89 100644 --- a/system/Test/FeatureTestCase.php +++ b/system/Test/FeatureTestCase.php @@ -55,7 +55,7 @@ protected function withRoutes(?array $routes = null) { $collection = Services::routes(); - if ($routes !== null && $routes !== []) { + if ($routes !== null) { $collection->resetRoutes(); foreach ($routes as $route) { diff --git a/system/Test/FeatureTestTrait.php b/system/Test/FeatureTestTrait.php index b16e941fef63..6acef638f6b3 100644 --- a/system/Test/FeatureTestTrait.php +++ b/system/Test/FeatureTestTrait.php @@ -47,7 +47,7 @@ protected function withRoutes(?array $routes = null) { $collection = Services::routes(); - if ($routes !== null && $routes !== []) { + if ($routes !== null) { $collection->resetRoutes(); foreach ($routes as $route) { From 6f2c5ff14cd69fe07994c16c551d464ce2816779 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 16 Oct 2023 11:37:00 +0700 Subject: [PATCH 199/209] updated to only check not null --- system/View/View.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/View/View.php b/system/View/View.php index c413bb754dc3..9d84e969da5b 100644 --- a/system/View/View.php +++ b/system/View/View.php @@ -336,7 +336,7 @@ public function excerpt(string $string, int $length = 20): string */ public function setData(array $data = [], ?string $context = null): RendererInterface { - if ($context !== null && $context !== '') { + if ($context !== null) { $data = \esc($data, $context); } From 3803fbc5ee85d9bc09c17a7babd62f43030dd47a Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 16 Oct 2023 12:42:08 +0700 Subject: [PATCH 200/209] add empty string check Co-authored-by: kenjis --- system/HTTP/URI.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/HTTP/URI.php b/system/HTTP/URI.php index 102808debbfd..3079455e6f86 100644 --- a/system/HTTP/URI.php +++ b/system/HTTP/URI.php @@ -181,7 +181,7 @@ public static function createURIString( $uri .= '?' . $query; } - if ($fragment !== null) { + if ($fragment !== '' && $fragment !== null) { $uri .= '#' . $fragment; } From faa0c99fe9518d6c2251c0cec3a524a5aacd80ef Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 16 Oct 2023 12:42:31 +0700 Subject: [PATCH 201/209] add empty string check Co-authored-by: kenjis --- system/HTTP/URI.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/HTTP/URI.php b/system/HTTP/URI.php index 3079455e6f86..608f8b75d5ba 100644 --- a/system/HTTP/URI.php +++ b/system/HTTP/URI.php @@ -177,7 +177,7 @@ public static function createURIString( : ltrim($path, '/'); } - if ($query !== null) { + if ($query !== '' && $query !== null) { $uri .= '?' . $query; } From 0317245d4d41dec0a13ec085e2a2d2317b1ca272 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 16 Oct 2023 12:48:20 +0700 Subject: [PATCH 202/209] run rector --- system/CLI/CLI.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/CLI/CLI.php b/system/CLI/CLI.php index f5e3d20e453e..50a846a25e05 100644 --- a/system/CLI/CLI.php +++ b/system/CLI/CLI.php @@ -267,7 +267,7 @@ public static function prompt(string $field, $options = null, $validation = null // Read the input from keyboard. $input = trim(static::input()) ?: $default; - if ($validation) { + if ($validation !== []) { while (! static::validate('"' . trim($field) . '"', $input, $validation)) { $input = static::prompt($field, $options, $validation); } @@ -1088,7 +1088,7 @@ public static function table(array $tbody, array $thead = []) foreach ($tableRows[$row] as $col) { $diff = $maxColsLengths[$column] - static::strlen($col); - if ($diff) { + if ($diff !== 0) { $tableRows[$row][$column] .= str_repeat(' ', $diff); } From 31ed1245517447f49350c96efbded27b317479f6 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 16 Oct 2023 12:48:49 +0700 Subject: [PATCH 203/209] regenerate baseline --- phpstan-baseline.php | 125 ------------------------------------------- 1 file changed, 125 deletions(-) diff --git a/phpstan-baseline.php b/phpstan-baseline.php index a45da9b79c44..d1c574463f58 100644 --- a/phpstan-baseline.php +++ b/phpstan-baseline.php @@ -26,11 +26,6 @@ 'count' => 1, 'path' => __DIR__ . '/system/Autoloader/FileLocator.php', ]; -$ignoreErrors[] = [ - 'message' => '#^Only booleans are allowed in an if condition, string given\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/Autoloader/FileLocator.php', -]; $ignoreErrors[] = [ 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', 'count' => 6, @@ -71,16 +66,6 @@ 'count' => 1, 'path' => __DIR__ . '/system/BaseModel.php', ]; -$ignoreErrors[] = [ - 'message' => '#^Only booleans are allowed in an if condition, array\\|null given\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/BaseModel.php', -]; -$ignoreErrors[] = [ - 'message' => '#^Only booleans are allowed in an if condition, int given\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/BaseModel.php', -]; $ignoreErrors[] = [ 'message' => '#^Strict comparison using \\!\\=\\= between mixed and null will always evaluate to true\\.$#', 'count' => 1, @@ -141,16 +126,6 @@ 'count' => 1, 'path' => __DIR__ . '/system/CLI/CLI.php', ]; -$ignoreErrors[] = [ - 'message' => '#^Only booleans are allowed in an if condition, array given\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/CLI/CLI.php', -]; -$ignoreErrors[] = [ - 'message' => '#^Only booleans are allowed in an if condition, int given\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/CLI/CLI.php', -]; $ignoreErrors[] = [ 'message' => '#^Only booleans are allowed in \\|\\|, string given on the left side\\.$#', 'count' => 1, @@ -171,11 +146,6 @@ 'count' => 5, 'path' => __DIR__ . '/system/CLI/CLI.php', ]; -$ignoreErrors[] = [ - 'message' => '#^Only booleans are allowed in an if condition, array given\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/CLI/Commands.php', -]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 2, @@ -211,26 +181,11 @@ 'count' => 1, 'path' => __DIR__ . '/system/Cache/Handlers/PredisHandler.php', ]; -$ignoreErrors[] = [ - 'message' => '#^Only booleans are allowed in an if condition, int given\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/Cache/Handlers/PredisHandler.php', -]; -$ignoreErrors[] = [ - 'message' => '#^Only booleans are allowed in an if condition, int given\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/Cache/Handlers/RedisHandler.php', -]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 6, 'path' => __DIR__ . '/system/CodeIgniter.php', ]; -$ignoreErrors[] = [ - 'message' => '#^Only booleans are allowed in an if condition, CodeIgniter\\\\HTTP\\\\ResponseInterface\\|null given\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/CodeIgniter.php', -]; $ignoreErrors[] = [ 'message' => '#^Property CodeIgniter\\\\CodeIgniter\\:\\:\\$controller type has no signature specified for Closure\\.$#', 'count' => 1, @@ -971,11 +926,6 @@ 'count' => 2, 'path' => __DIR__ . '/system/Config/Factories.php', ]; -$ignoreErrors[] = [ - 'message' => '#^Only booleans are allowed in an if condition, string\\|null given\\.$#', - 'count' => 2, - 'path' => __DIR__ . '/system/Config/Factories.php', -]; $ignoreErrors[] = [ 'message' => '#^Accessing offset \'SERVER_PROTOCOL\' directly on \\$_SERVER is discouraged\\.$#', 'count' => 1, @@ -1926,31 +1876,11 @@ 'count' => 2, 'path' => __DIR__ . '/system/Debug/ExceptionHandler.php', ]; -$ignoreErrors[] = [ - 'message' => '#^Only booleans are allowed in an if condition, string given\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/Debug/ExceptionHandler.php', -]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 3, 'path' => __DIR__ . '/system/Debug/Exceptions.php', ]; -$ignoreErrors[] = [ - 'message' => '#^Only booleans are allowed in an if condition, Throwable\\|null given\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/Debug/Exceptions.php', -]; -$ignoreErrors[] = [ - 'message' => '#^Only booleans are allowed in an if condition, int given\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/Debug/Exceptions.php', -]; -$ignoreErrors[] = [ - 'message' => '#^Only booleans are allowed in an if condition, string given\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/Debug/Exceptions.php', -]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 1, @@ -2041,11 +1971,6 @@ 'count' => 2, 'path' => __DIR__ . '/system/Encryption/Encryption.php', ]; -$ignoreErrors[] = [ - 'message' => '#^Only booleans are allowed in an if condition, Config\\\\Encryption\\|null given\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/Encryption/Encryption.php', -]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 2, @@ -2166,11 +2091,6 @@ 'count' => 1, 'path' => __DIR__ . '/system/HTTP/CURLRequest.php', ]; -$ignoreErrors[] = [ - 'message' => '#^Only booleans are allowed in an if condition, string given\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/HTTP/CURLRequest.php', -]; $ignoreErrors[] = [ 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', 'count' => 1, @@ -2426,11 +2346,6 @@ 'count' => 4, 'path' => __DIR__ . '/system/HTTP/SiteURI.php', ]; -$ignoreErrors[] = [ - 'message' => '#^Only booleans are allowed in an if condition, string given\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/HTTP/SiteURI.php', -]; $ignoreErrors[] = [ 'message' => '#^Strict comparison using \\!\\=\\= between mixed and null will always evaluate to true\\.$#', 'count' => 1, @@ -2441,16 +2356,6 @@ 'count' => 15, 'path' => __DIR__ . '/system/HTTP/URI.php', ]; -$ignoreErrors[] = [ - 'message' => '#^Only booleans are allowed in an if condition, string given\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/HTTP/URI.php', -]; -$ignoreErrors[] = [ - 'message' => '#^Only booleans are allowed in an if condition, string\\|null given\\.$#', - 'count' => 2, - 'path' => __DIR__ . '/system/HTTP/URI.php', -]; $ignoreErrors[] = [ 'message' => '#^Property CodeIgniter\\\\HTTP\\\\URI\\:\\:\\$fragment \\(string\\) on left side of \\?\\? is not nullable\\.$#', 'count' => 1, @@ -2621,11 +2526,6 @@ 'count' => 2, 'path' => __DIR__ . '/system/Helpers/test_helper.php', ]; -$ignoreErrors[] = [ - 'message' => '#^Only booleans are allowed in an if condition, array\\|null given\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/Helpers/test_helper.php', -]; $ignoreErrors[] = [ 'message' => '#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#', 'count' => 3, @@ -2786,11 +2686,6 @@ 'count' => 1, 'path' => __DIR__ . '/system/Log/Logger.php', ]; -$ignoreErrors[] = [ - 'message' => '#^Only booleans are allowed in an if condition, array given\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/Log/Logger.php', -]; $ignoreErrors[] = [ 'message' => '#^Parameter \\#1 \\$level \\(string\\) of method CodeIgniter\\\\Log\\\\Logger\\:\\:log\\(\\) should be contravariant with parameter \\$level \\(mixed\\) of method Psr\\\\Log\\\\LoggerInterface\\:\\:log\\(\\)$#', 'count' => 1, @@ -2848,11 +2743,6 @@ ]; $ignoreErrors[] = [ 'message' => '#^Only booleans are allowed in an if condition, array given\\.$#', - 'count' => 2, - 'path' => __DIR__ . '/system/Pager/Pager.php', -]; -$ignoreErrors[] = [ - 'message' => '#^Only booleans are allowed in an if condition, int given\\.$#', 'count' => 1, 'path' => __DIR__ . '/system/Pager/Pager.php', ]; @@ -3646,11 +3536,6 @@ 'count' => 1, 'path' => __DIR__ . '/system/Test/FeatureTestCase.php', ]; -$ignoreErrors[] = [ - 'message' => '#^Only booleans are allowed in an if condition, array\\|null given\\.$#', - 'count' => 1, - 'path' => __DIR__ . '/system/Test/FeatureTestCase.php', -]; $ignoreErrors[] = [ 'message' => '#^Property CodeIgniter\\\\Test\\\\CIUnitTestCase\\:\\:\\$bodyFormat \\(string\\) in isset\\(\\) is not nullable\\.$#', 'count' => 1, @@ -4156,11 +4041,6 @@ 'count' => 1, 'path' => __DIR__ . '/system/Validation/Validation.php', ]; -$ignoreErrors[] = [ - 'message' => '#^Only booleans are allowed in an if condition, array given\\.$#', - 'count' => 2, - 'path' => __DIR__ . '/system/Validation/Validation.php', -]; $ignoreErrors[] = [ 'message' => '#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#', 'count' => 2, @@ -4231,11 +4111,6 @@ 'count' => 3, 'path' => __DIR__ . '/system/View/View.php', ]; -$ignoreErrors[] = [ - 'message' => '#^Only booleans are allowed in an if condition, string\\|null given\\.$#', - 'count' => 2, - 'path' => __DIR__ . '/system/View/View.php', -]; $ignoreErrors[] = [ 'message' => '#^Parameter \\#2 \\$context \\(\'attr\'\\|\'css\'\\|\'html\'\\|\'js\'\\|\'raw\'\\|\'url\'\\|null\\) of method CodeIgniter\\\\View\\\\View\\:\\:setData\\(\\) should be contravariant with parameter \\$context \\(string\\|null\\) of method CodeIgniter\\\\View\\\\RendererInterface\\:\\:setData\\(\\)$#', 'count' => 1, From 1f753bcb3a0f5a59e771b14d25d214275e4454ca Mon Sep 17 00:00:00 2001 From: kenjis Date: Mon, 16 Oct 2023 15:50:57 +0900 Subject: [PATCH 204/209] docs: add note for routes after calling resetServices() --- user_guide_src/source/testing/overview.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/user_guide_src/source/testing/overview.rst b/user_guide_src/source/testing/overview.rst index 7622339f8f0c..d969f73cdc41 100644 --- a/user_guide_src/source/testing/overview.rst +++ b/user_guide_src/source/testing/overview.rst @@ -244,6 +244,10 @@ Removes all mocked classes from the Services class, bringing it back to its orig You can also use the ``$this->resetServices()`` method that ``CIUnitTestCase`` provides. +.. note:: This method resets the all states of Services, and the ``RouteCollection`` + will have no routes. If you want to use your routes to be loaded, you need to + call the ``loadRoutes()`` method like ``Services::routes()->loadRoutes()``. + Services::resetSingle(string $name) ----------------------------------- From 87ea6a986b8fead8308a15bd6bc588917a5a6376 Mon Sep 17 00:00:00 2001 From: kenjis Date: Mon, 16 Oct 2023 18:25:17 +0900 Subject: [PATCH 205/209] fix: file sort order Sort by full path. --- system/Debug/Toolbar/Collectors/Files.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/Debug/Toolbar/Collectors/Files.php b/system/Debug/Toolbar/Collectors/Files.php index ea14dcfd1ec3..c281906cdd28 100644 --- a/system/Debug/Toolbar/Collectors/Files.php +++ b/system/Debug/Toolbar/Collectors/Files.php @@ -62,13 +62,13 @@ public function display(): array if (strpos($path, 'SYSTEMPATH') !== false) { $coreFiles[] = [ - 'name' => basename($file), 'path' => $path, + 'name' => basename($file), ]; } else { $userFiles[] = [ - 'name' => basename($file), 'path' => $path, + 'name' => basename($file), ]; } } From 054061aae60768f2a8254db782fcb079805b4794 Mon Sep 17 00:00:00 2001 From: kenjis Date: Tue, 17 Oct 2023 10:52:12 +0900 Subject: [PATCH 206/209] test: fix assertion There was 1 failure: 1) CodeIgniter\Database\BaseConnectionTest::testStoresConnectionTimings Failed asserting that '0.000000' is greater than 0.0. /home/runner/work/CodeIgniter4/CodeIgniter4/tests/system/Database/BaseConnectionTest.php:125 --- tests/system/Database/BaseConnectionTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/system/Database/BaseConnectionTest.php b/tests/system/Database/BaseConnectionTest.php index 4fb68358066b..51f92a747884 100644 --- a/tests/system/Database/BaseConnectionTest.php +++ b/tests/system/Database/BaseConnectionTest.php @@ -122,7 +122,7 @@ public function testStoresConnectionTimings(): void $db->initialize(); $this->assertGreaterThan($start, $db->getConnectStart()); - $this->assertGreaterThan(0.0, $db->getConnectDuration()); + $this->assertGreaterThanOrEqual(0.0, $db->getConnectDuration()); } /** From 14fd67b80f1e7b8259cf73a6270cf5e479cacbf3 Mon Sep 17 00:00:00 2001 From: kenjis Date: Thu, 19 Oct 2023 08:44:36 +0900 Subject: [PATCH 207/209] Prep for 4.4.2 release --- CHANGELOG.md | 44 +++++++++++++++++++ system/CodeIgniter.php | 2 +- user_guide_src/source/changelogs/v4.4.2.rst | 5 +-- user_guide_src/source/conf.py | 2 +- .../source/installation/upgrade_442.rst | 24 ++-------- 5 files changed, 50 insertions(+), 27 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc2b5bc5640c..dc158eebb21d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,49 @@ # Changelog +## [v4.4.2](https://github.com/codeigniter4/CodeIgniter4/tree/v4.4.1) (2023-10-019) +[Full Changelog](https://github.com/codeigniter4/CodeIgniter4/compare/v4.4.1...v4.4.2) + +### Fixed Bugs + +* Fix: [Session] the problem of secondary retrieving values ​​in RedisHandler by @ping-yee in https://github.com/codeigniter4/CodeIgniter4/pull/7887 +* fix: `spark migrate` `-g` option by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7894 +* fix: [DebugBar] dark mode `timeline-color-open` color text on `Debug` by @ddevsr in https://github.com/codeigniter4/CodeIgniter4/pull/7907 +* fix: base_url()/site_url() does not work on CLI by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7901 +* Fix: Routing::loadRoutes() in windows do not validate correctly $routesFiles by @pjsde in https://github.com/codeigniter4/CodeIgniter4/pull/7930 +* fix: Services::request() should call AppServices instead static by @pjsde in https://github.com/codeigniter4/CodeIgniter4/pull/7985 +* fix: lang() may return false by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7966 +* fix: CI returns "200 OK" when PageNotFound by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/8011 +* fix: spark may not show exceptions or show backtrace as json by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7962 +* fix: CLI prompt validation message by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7977 +* fix: CSP style nonce is added even if honeypot is not attached by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/8025 +* fix: named routes don't work with spark by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/8028 +* fix: add a primary key to an existing table by @michalsn in https://github.com/codeigniter4/CodeIgniter4/pull/8031 +* fix: reverse route for `''` is not `false` by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/8024 +* fix: `spark routes` may show incorrect route names by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/8040 +* fix: Factories caching bug by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/8037 +* fix: file sort order in Files DebugBar by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/8048 + +### Enhancements + +* fix: check for CSRF token in the raw body by @michalsn in https://github.com/codeigniter4/CodeIgniter4/pull/7915 + +### Refactoring + +* fix: add types to View $filters and $plugins by @paulbalandan in https://github.com/codeigniter4/CodeIgniter4/pull/7885 +* test: use PHP_VERSION_ID instead of PHP_VERSION by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7913 +* [PHP 8.3] refactor: ReflectionProperty::setValue() signature deprecation by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7911 +* refactor: remove unneeded arguments to session by @paulbalandan in https://github.com/codeigniter4/CodeIgniter4/pull/7919 +* fix: types for common functions by @paulbalandan in https://github.com/codeigniter4/CodeIgniter4/pull/7917 +* Refactor: Apply PHPStan rule "Short ternary operator is not allowed" to RouteCollection by @pjsde in https://github.com/codeigniter4/CodeIgniter4/pull/7947 +* refactor: remove $_SESSION from methods and functions by @pjsde in https://github.com/codeigniter4/CodeIgniter4/pull/7982 +* refactor: if condition in OCI8/Connection.php by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7994 +* style: remove unnecessary () in Toolbar by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/8013 +* refactor: replace deprecated `Services::request(config, false)` by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7998 +* refactor: delete duplicate code for Composer loading by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/8004 +* [Rector] Apply BooleanInIfConditionRuleFixerRector by @samsonasik in https://github.com/codeigniter4/CodeIgniter4/pull/7951 + +**Full Changelog**: https://github.com/codeigniter4/CodeIgniter4/compare/v4.4.1...v4.4.2 + ## [v4.4.1](https://github.com/codeigniter4/CodeIgniter4/tree/v4.4.1) (2023-09-05) [Full Changelog](https://github.com/codeigniter4/CodeIgniter4/compare/v4.4.0...v4.4.1) diff --git a/system/CodeIgniter.php b/system/CodeIgniter.php index 5c3efb78e4e0..09fc6a1f689f 100644 --- a/system/CodeIgniter.php +++ b/system/CodeIgniter.php @@ -54,7 +54,7 @@ class CodeIgniter /** * The current version of CodeIgniter Framework */ - public const CI_VERSION = '4.4.1'; + public const CI_VERSION = '4.4.2'; /** * App startup time. diff --git a/user_guide_src/source/changelogs/v4.4.2.rst b/user_guide_src/source/changelogs/v4.4.2.rst index bacfdf2a2e97..eb146ef07c0c 100644 --- a/user_guide_src/source/changelogs/v4.4.2.rst +++ b/user_guide_src/source/changelogs/v4.4.2.rst @@ -1,7 +1,7 @@ Version 4.4.2 ############# -Release Date: Unreleased +Release Date: October 19, 2023 **4.4.2 release of CodeIgniter4** @@ -9,9 +9,6 @@ Release Date: Unreleased :local: :depth: 3 -BREAKING -******** - Message Changes *************** diff --git a/user_guide_src/source/conf.py b/user_guide_src/source/conf.py index a456e6a937a4..75454cc17896 100644 --- a/user_guide_src/source/conf.py +++ b/user_guide_src/source/conf.py @@ -26,7 +26,7 @@ version = '4.4' # The full version, including alpha/beta/rc tags. -release = '4.4.1' +release = '4.4.2' # -- General configuration --------------------------------------------------- diff --git a/user_guide_src/source/installation/upgrade_442.rst b/user_guide_src/source/installation/upgrade_442.rst index aefce9c51f2f..46ed0ff7da2e 100644 --- a/user_guide_src/source/installation/upgrade_442.rst +++ b/user_guide_src/source/installation/upgrade_442.rst @@ -12,15 +12,6 @@ Please refer to the upgrade instructions corresponding to your installation meth :local: :depth: 2 -Mandatory File Changes -********************** - -Breaking Changes -**************** - -Breaking Enhancements -********************* - Project Files ************* @@ -30,21 +21,12 @@ these files being outside of the **system** scope they will not be changed witho There are some third-party CodeIgniter modules available to assist with merging changes to the project space: `Explore on Packagist `_. -Content Changes -=============== - -The following files received significant changes (including deprecations or visual adjustments) -and it is recommended that you merge the updated versions with your application: - -Config ------- - -- @TODO - All Changes =========== This is a list of all files in the **project space** that received changes; many will be simple comments or formatting that have no effect on the runtime: -- @TODO +- app/Config/Migrations.php +- app/Config/View.php +- composer.json From 1f5d5eea4f1519683b0610d129073d02581ac28d Mon Sep 17 00:00:00 2001 From: kenjis Date: Thu, 19 Oct 2023 08:52:04 +0900 Subject: [PATCH 208/209] docs: split CHANGELOG.md --- CHANGELOG.md | 325 +---------------------------------- changelogs/CHANGELOG_4.3.md | 326 ++++++++++++++++++++++++++++++++++++ 2 files changed, 327 insertions(+), 324 deletions(-) create mode 100644 changelogs/CHANGELOG_4.3.md diff --git a/CHANGELOG.md b/CHANGELOG.md index dc158eebb21d..d670ddfce98e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -134,327 +134,4 @@ * refactor: [4.4] add types for phpstan by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7723 * Remove trimming logic of `Autoloader::loadClass()` by @paulbalandan in https://github.com/codeigniter4/CodeIgniter4/pull/7763 -## [v4.3.8](https://github.com/codeigniter4/CodeIgniter4/tree/v4.3.8) (2023-08-25) -[Full Changelog](https://github.com/codeigniter4/CodeIgniter4/compare/v4.3.7...v4.3.8) - -### Fixed Bugs - -* fix: [Pager] knocks down variables for View by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7758 -* fix: Model::insertBatch() causes error to non auto increment table by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7759 -* fix: [Model] updateBatch() may generate invalid SQL statement by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7787 -* fix: Model inserts cast $primaryKey value when using Entity by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7806 -* fix: instances of Validation rules are incremented each time `run()` is executed by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7815 -* fix: filter except empty by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7823 -* fix: `set_checkbox()` checks unchecked checkbox by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7818 - -### Refactoring - -* Normalize data provider names by @paulbalandan in https://github.com/codeigniter4/CodeIgniter4/pull/7656 -* refactor: remove Model::$tempPrimaryKeyValue by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7760 -* Remove unused cast on RedisHandler by @samsonasik in https://github.com/codeigniter4/CodeIgniter4/pull/7786 - -## [v4.3.7](https://github.com/codeigniter4/CodeIgniter4/tree/v4.3.7) (2023-07-30) -[Full Changelog](https://github.com/codeigniter4/CodeIgniter4/compare/v4.3.6...v4.3.7) - -### Breaking Changes - -* fix: FeatureTestTrait may change $params values passed to call(), and a few bug fixes by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7602 -* fix: auto routing legacy and $route->add() by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7690 -* fix: [Model] setValidationRule() cannot use with ruleGroup by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7691 - -### Fixed Bugs - -* docs: fix incorrect description on RedirectException (1) by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7629 -* docs: fix incorrect description on RedirectException (2) by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7633 -* fix: skip http proxy added header by @jozefrebjak in https://github.com/codeigniter4/CodeIgniter4/pull/7622 -* fix: number_to_roman() param type by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7640 -* fix: [Auto Routing Improved] feature testing may use incorrect param count by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7597 -* fix: `url_to()` error message by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7652 -* fix: [ViewCells] caching by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7663 -* fix: [ViewCells] when there are cells with the same short name, only the first cell is loaded by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7686 -* Fix number comparison in number_to_amount() in number_helper.php by @sba in https://github.com/codeigniter4/CodeIgniter4/pull/7701 -* fix: wrong Config classname to config() in Toolbar by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7735 -* fix: $sensitiveDataInTrace does not work by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7725 - -### Enhancements - -* Remove PHPStan from pre-commit hook by @lonnieezell in https://github.com/codeigniter4/CodeIgniter4/pull/7618 - -### Refactoring - -* refactor: remove unused property in Encryption\Handlers\BaseHandler by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7579 -* refactor: use ::class to config() param by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7611 -* refactor: remove unused non-empty array in RequestTrait by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7620 -* refactor: [Cache] simplify code of `FileHandler::getItem()` by @paulbalandan in https://github.com/codeigniter4/CodeIgniter4/pull/7667 -* refactor: replace `config(Paths::class)` by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7702 - -## [v4.3.6](https://github.com/codeigniter4/CodeIgniter4/tree/v4.3.6) (2023-06-18) -[Full Changelog](https://github.com/codeigniter4/CodeIgniter4/compare/v4.3.5...v4.3.6) - -### Breaking Changes - -* fix: [Validation] DBGroup is ignored when checking the value of a placeholder by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7549 -* fix: [Auto Routing Improved] feature testing may not find controller/method by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7543 - -### Fixed Bugs - -* fix: feature test with validation by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7548 -* fix: [Postgre] Semicolon in the connection parameters break the DSN string by @michalsn in https://github.com/codeigniter4/CodeIgniter4/pull/7552 -* fix: [QueryBuilder] incorrect SQL without space before "ON DUPLICATE KEY UPDATE" by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7564 -* fix: wrong classname in exception message in Cell by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7569 -* fix: `imagecreatefrompng()` gd-png: libpng warning by @ping-yee in https://github.com/codeigniter4/CodeIgniter4/pull/7570 - -### Refactoring - -* refactor: remove unneeded code in IncomingRequest by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7525 -* refactor: View by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7534 -* refactor: [Entity] fix incorrect return value by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7542 -* refactor: Database::initDriver() by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7553 -* refactor: remove Factories::models() by @paulbalandan in https://github.com/codeigniter4/CodeIgniter4/pull/7566 -* refactor: Validation::processRules() by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7565 -* refactor: [Auto Routing Improved] ensure $httpVerb is lower case by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7575 - -## [v4.3.5](https://github.com/codeigniter4/CodeIgniter4/tree/v4.3.5) (2023-05-21) -[Full Changelog](https://github.com/codeigniter4/CodeIgniter4/compare/v4.3.4...v4.3.5) - -### SECURITY - -* *Remote Code Execution Vulnerability in Validation Placeholders* was fixed. See the [Security advisory](https://github.com/codeigniter4/CodeIgniter4/security/advisories/GHSA-m6m8-6gq8-c9fj) for more information. -* fix: Session::stop() does not destroy session by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7503 - -### Fixed Bugs - -* docs: remove incorrect @property in ResponseTrait by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7495 -* fix: validation error when a closure is used in combination with permit_empty or if_exist rules by @michalsn in https://github.com/codeigniter4/CodeIgniter4/pull/7492 -* fix: standardize behavior of `make:cell` and `Cells` by @paulbalandan in https://github.com/codeigniter4/CodeIgniter4/pull/7481 -* fix: PostgreSQL getVersion() logic by @marekmosna in https://github.com/codeigniter4/CodeIgniter4/pull/7488 -* fix: PostgreSQL getVersion() output by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7509 - -### Enhancements - -* feat: user guide dark mode by @michalsn in https://github.com/codeigniter4/CodeIgniter4/pull/7463 - -### Refactoring - -* refactor: Entity variable by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7499 - -## [v4.3.4](https://github.com/codeigniter4/CodeIgniter4/tree/v4.3.4) (2023-04-27) -[Full Changelog](https://github.com/codeigniter4/CodeIgniter4/compare/v4.3.3...v4.3.4) - -### Breaking Changes - -* fix: redirect status code by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7445 -* fix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL constraint incorrectly by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7371 - -### Fixed Bugs - -* fix: view cell cannot locate the auto-generated view file by @sammyskills in https://github.com/codeigniter4/CodeIgniter4/pull/7392 -* fix: CURLRequest - clear response headers between requests by @michalsn in https://github.com/codeigniter4/CodeIgniter4/pull/7398 -* fix: [Auto Routing Improved] spark routes shows invalid routes by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7419 -* fix: remove $insertID in make:model template by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7443 -* fix: add missing 'make:cell' in app/Config/Generators.php by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7458 - -### Refactoring - -* refactor: Security::getPostedToken() by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7377 - -## [v4.3.3](https://github.com/codeigniter4/CodeIgniter4/tree/v4.3.3) (2023-03-26) -[Full Changelog](https://github.com/codeigniter4/CodeIgniter4/compare/v4.3.2...v4.3.3) - -### Fixed Bugs - -* docs: fix $systemDirectory path in existing project. by @jozefrebjak in https://github.com/codeigniter4/CodeIgniter4/pull/7289 -* docs: fix message.rst and improve content_negotiation.rst by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7280 -* fix: Encryption CI3 compatibility by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7273 -* fix: [QueryBuilder] RawSql causes error when using like() and countAllResults() by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7277 -* fix: handling of null bytes in `Exceptions::renderBacktrace()` by @paulbalandan in https://github.com/codeigniter4/CodeIgniter4/pull/7306 -* fix: incorrect metadata querying of Redis cache by @paulbalandan in https://github.com/codeigniter4/CodeIgniter4/pull/7307 -* fix: [Email] add missing TLS 1.3 support by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7317 -* docs: add warning to random_string() by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7333 -* fix: random_string() numeric by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7336 -* docs: add note for addColumn() and NULL by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7342 -* fix: respondNoContent() returns Kint script in development mode by @anggadarkprince in https://github.com/codeigniter4/CodeIgniter4/pull/7347 -* fix: use first exception in exceptionHandler() by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7341 -* fix: random_string() alpha alnum nozero by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7344 -* fix: migrate:rollback -b negative number by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7350 -* fix: site_url() does not support protocol-relative links by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7353 -* docs: add uri_string() BC in v4.3.2 by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7356 -* fix: Cache FileHandler error when there is a folder in cache dir by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7361 - -### Refactoring - -* refactor: consistent header name case by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7299 - -## [v4.3.2](https://github.com/codeigniter4/CodeIgniter4/tree/v4.3.2) (2023-02-18) -[Full Changelog](https://github.com/codeigniter4/CodeIgniter4/compare/v4.3.1...v4.3.2) - -### Breaking Changes - -* fix: base_url() removes trailing slash in baseURL by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7200 -* fix: remove parameter $relative in `uri_string()` by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7135 - -### Fixed Bugs - -* docs: fix incorrect sample code in view_parser by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7103 -* docs: add missing items in upgrade_430.rst/v4.3.0.rst by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7119 -* fix: remove `All` from `Options All -Indexes` in .htaccess by @sba in https://github.com/codeigniter4/CodeIgniter4/pull/7093 -* fix: bug on stuck content-type header in Feature Testing by @baycik in https://github.com/codeigniter4/CodeIgniter4/pull/7112 -* fix: ordering `Validation` show error by call `setRule()` by @ddevsr in https://github.com/codeigniter4/CodeIgniter4/pull/7149 -* fix: [QueryBuilder] where() generates incorrect SQL when using RawSql by @sclubricants in https://github.com/codeigniter4/CodeIgniter4/pull/7147 -* fix: [QueryBuilder] RawSql passed to set() disappears without error by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7148 -* fix: [Parser] local_currency causes "Passing null to parameter" by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7157 -* fix: [Parser] `!` does not work if delimiters are changed by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7142 -* fix: Throttler token time calculation by @rumpfc in https://github.com/codeigniter4/CodeIgniter4/pull/7160 -* fix: [QueryBuilder] getOperatorFromWhereKey() misses EXISTS, BETWEEN by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7155 -* docs: Correcting documentation mistakes in upgrading from one version to another by @objecttothis in https://github.com/codeigniter4/CodeIgniter4/pull/7191 -* fix: [Session] `Redis` connect to protocol `TLS` by @ddevsr in https://github.com/codeigniter4/CodeIgniter4/pull/7187 -* fix: Autoloader may not add Composer package's namespaces by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7193 -* fix: add try/catch to real_path() in clean_path() by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7195 -* fix: cannot create shared View instance when using debugbar by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7172 -* fix: RouteCollection::getRegisteredControllers() may not return all controllers by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7174 -* fix: `spark routes` shows incorrect hostname routes by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7176 -* docs: add missing composer.json in Mandatory File Changes by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7170 -* fix: stack trace displayed when Exception handler runs out of memory is useless by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7212 -* fix: support for display of error message using wildcard (*) by @sammyskills in https://github.com/codeigniter4/CodeIgniter4/pull/7226 -* fix: routing behavior when $uriProtocol is QUERY_STRING by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7199 -* fix: site_url() does not use alt Config by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7215 -* docs: add missing @method having() in Model by @paul45 in https://github.com/codeigniter4/CodeIgniter4/pull/7258 - -### Enhancements - -* add `application/vnd.microsoft.portable-executable` and `application/x-dosexec` by @totoprayogo1916 in https://github.com/codeigniter4/CodeIgniter4/pull/7144 - -### Refactoring - -* refactor: add PHPDoc types in RouteCollection by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7129 -* refactor: URI::parseStr() by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7154 -* refactor: error_exception.php by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7171 -* [Rector] Apply Rector to app/Views by @samsonasik in https://github.com/codeigniter4/CodeIgniter4/pull/7169 -* refactor: Update PHPDoc Common::config by @maniaba in https://github.com/codeigniter4/CodeIgniter4/pull/7224 - -## [v4.3.1](https://github.com/codeigniter4/CodeIgniter4/tree/v4.3.1) (2023-01-14) -[Full Changelog](https://github.com/codeigniter4/CodeIgniter4/compare/v4.3.0...v4.3.1) - -### Fixed Bugs - -* fix: Email config in the .env doesn't appear as expected by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7078 -* fix: TypeError in Validation is_unique/is_not_unique by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7085 -* fix: revert method name resetQuery() changed accidentally by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7083 -* fix: handling float in Validation Strcit Rules (greater_than, greater_than_equal_to, less_than, less_than_equal_to) by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7098 -* docs: add missing instruction for Config/Exceptions in PHP 8.2 by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7100 -* fix: Call to undefined method Composer\InstalledVersions::getAllRawData() error by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/7107 - -### Refactoring - -* [Rector] Enable AddDefaultValueForUndefinedVariableRector by @samsonasik in https://github.com/codeigniter4/CodeIgniter4/pull/7088 - -## [v4.3.0](https://github.com/codeigniter4/CodeIgniter4/tree/v4.3.0) (2023-01-10) -[Full Changelog](https://github.com/codeigniter4/CodeIgniter4/compare/v4.2.12...v4.3.0) - -### Breaking Changes - -* fix: throws DatabaseException in DB connections by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/6163 -* config: DB Error always throws Exception CI_DBUG by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/6183 -* Config Property Types by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/6214 -* refactor: loading app/Config/routes.php by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/6293 -* fix: exceptionHandler may return invalid HTTP status code by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/6228 -* feat: add Form helpers for Validation Errors by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/6384 -* fix: ValidationInterface by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/6253 -* fix: types in database classes by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/6527 -* fix: ResponseInterface (1) by @kenjis in https://github.com/codeigniter4/CodeIgniter4/pull/6556 -* Improve BaseConnection::getForeignKeyData() and Forge::addForeignKey() by @sclubricants in https://github.com/codeigniter4/CodeIgniter4/pull/6468 -* Refactor BaseBuilder *Batch() Methods by @sclubricants in https://github.com/codeigniter4/CodeIgniter4/pull/6536 -* refactor: remove `type="text/javascript"` in