diff --git a/phpstan.neon b/phpstan.neon
index f628907..2ab5346 100644
--- a/phpstan.neon
+++ b/phpstan.neon
@@ -1,7 +1,7 @@
parameters:
paths:
- src
- level: 0
+ level: 1
ignoreErrors:
- '#Unsafe usage of new static#'
- '#env\(\).*outside of the config directory#'
diff --git a/psalm.xml b/psalm.xml
index 7d23bb2..b4e4aff 100644
--- a/psalm.xml
+++ b/psalm.xml
@@ -31,8 +31,6 @@
-
-
diff --git a/src/Core/Config/Models/Channel.php b/src/Core/Config/Models/Channel.php
index 5d2d34f..4ac8996 100644
--- a/src/Core/Config/Models/Channel.php
+++ b/src/Core/Config/Models/Channel.php
@@ -15,6 +15,7 @@ use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
+use Illuminate\Support\Facades\Log;
/**
* Configuration channel (voice/context substrate).
@@ -123,7 +124,7 @@ class Channel extends Model
while ($current->parent_id !== null) {
if (isset($seen[$current->parent_id])) {
- \Log::error('Circular reference detected in channel inheritance', [
+ Log::error('Circular reference detected in channel inheritance', [
'channel_id' => $this->id,
'cycle_at' => $current->parent_id,
]);
diff --git a/src/Core/Config/View/Modal/Admin/ConfigPanel.php b/src/Core/Config/View/Modal/Admin/ConfigPanel.php
index 0899053..290be2a 100644
--- a/src/Core/Config/View/Modal/Admin/ConfigPanel.php
+++ b/src/Core/Config/View/Modal/Admin/ConfigPanel.php
@@ -19,6 +19,13 @@ use Livewire\Attributes\Computed;
use Livewire\Attributes\Url;
use Livewire\Component;
+/**
+ * Configuration panel for managing config keys and values.
+ *
+ * @property-read ConfigProfile $activeProfile
+ * @property-read array $categories
+ * @property-read \Illuminate\Database\Eloquent\Collection $workspaces
+ */
class ConfigPanel extends Component
{
#[Url]
diff --git a/src/Core/Config/View/Modal/Admin/WorkspaceConfig.php b/src/Core/Config/View/Modal/Admin/WorkspaceConfig.php
index 8b373ad..bcacfe9 100644
--- a/src/Core/Config/View/Modal/Admin/WorkspaceConfig.php
+++ b/src/Core/Config/View/Modal/Admin/WorkspaceConfig.php
@@ -19,6 +19,17 @@ use Livewire\Attributes\Computed;
use Livewire\Attributes\On;
use Livewire\Component;
+/**
+ * Workspace configuration panel.
+ *
+ * @property-read int $depth
+ * @property-read array $namespaces
+ * @property-read ConfigProfile|null $workspaceProfile
+ * @property-read ConfigProfile $systemProfile
+ * @property-read object|null $workspace
+ * @property-read string $prefix
+ * @property-read array $tabs
+ */
class WorkspaceConfig extends Component
{
public ?string $path = null;
diff --git a/src/Core/Crypt/EncryptArrayObject.php b/src/Core/Crypt/EncryptArrayObject.php
index 0e90a84..3533124 100644
--- a/src/Core/Crypt/EncryptArrayObject.php
+++ b/src/Core/Crypt/EncryptArrayObject.php
@@ -14,6 +14,7 @@ namespace Core\Crypt;
use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
use Illuminate\Database\Eloquent\Casts\ArrayObject;
use Illuminate\Support\Facades\Crypt;
+use Illuminate\Support\Facades\Log;
/**
* Cast for storing encrypted array data as ArrayObject.
@@ -36,7 +37,7 @@ class EncryptArrayObject implements CastsAttributes
try {
$decrypted = Crypt::decryptString($attributes[$key]);
} catch (\Illuminate\Contracts\Encryption\DecryptException $e) {
- \Log::warning('Failed to decrypt array object', ['key' => $key, 'error' => $e->getMessage()]);
+ Log::warning('Failed to decrypt array object', ['key' => $key, 'error' => $e->getMessage()]);
return null;
}
@@ -44,7 +45,7 @@ class EncryptArrayObject implements CastsAttributes
$decoded = json_decode($decrypted, true);
if ($decoded === null && json_last_error() !== JSON_ERROR_NONE) {
- \Log::warning('Failed to decode encrypted array', ['key' => $key, 'error' => json_last_error_msg()]);
+ Log::warning('Failed to decode encrypted array', ['key' => $key, 'error' => json_last_error_msg()]);
return null;
}
diff --git a/src/Core/Input/Input.php b/src/Core/Input/Input.php
index 5231efb..7f2bd0c 100644
--- a/src/Core/Input/Input.php
+++ b/src/Core/Input/Input.php
@@ -22,8 +22,8 @@ class Input
{
$sanitiser = new Sanitiser;
- $_GET = $sanitiser->filter($_GET ?? []);
- $_POST = $sanitiser->filter($_POST ?? []);
+ $_GET = $sanitiser->filter($_GET);
+ $_POST = $sanitiser->filter($_POST);
return Request::capture();
}
diff --git a/src/Core/Media/Image/ImageOptimization.php b/src/Core/Media/Image/ImageOptimization.php
index 1e9cdff..e30c242 100644
--- a/src/Core/Media/Image/ImageOptimization.php
+++ b/src/Core/Media/Image/ImageOptimization.php
@@ -16,6 +16,23 @@ use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\MorphTo;
+/**
+ * Image optimisation record.
+ *
+ * @property int $id
+ * @property string $path
+ * @property string|null $original_path
+ * @property int $original_size
+ * @property int $optimized_size
+ * @property int $percentage_saved
+ * @property string|null $driver
+ * @property int|null $quality
+ * @property int|null $workspace_id
+ * @property string|null $optimizable_type
+ * @property int|null $optimizable_id
+ * @property \Illuminate\Support\Carbon|null $created_at
+ * @property \Illuminate\Support\Carbon|null $updated_at
+ */
class ImageOptimization extends Model
{
use HasFactory;
diff --git a/src/Core/Seo/SeoMetadata.php b/src/Core/Seo/SeoMetadata.php
index 4eb3481..471653f 100644
--- a/src/Core/Seo/SeoMetadata.php
+++ b/src/Core/Seo/SeoMetadata.php
@@ -14,6 +14,26 @@ namespace Core\Seo;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\MorphTo;
+/**
+ * SEO metadata for any model.
+ *
+ * @property int $id
+ * @property string $seoable_type
+ * @property int $seoable_id
+ * @property string|null $title
+ * @property string|null $description
+ * @property string|null $canonical_url
+ * @property array|null $og_data
+ * @property array|null $twitter_data
+ * @property array|null $schema_markup
+ * @property string|null $robots
+ * @property string|null $focus_keyword
+ * @property int|null $seo_score
+ * @property array|null $seo_issues
+ * @property array|null $seo_suggestions
+ * @property \Illuminate\Support\Carbon|null $created_at
+ * @property \Illuminate\Support\Carbon|null $updated_at
+ */
class SeoMetadata extends Model
{
protected $table = 'seo_metadata';