From 9d5c71adcd3a066af69a5ccc1e43b5747c3215ef Mon Sep 17 00:00:00 2001
From: philipp lang <philipp@aweos.de>
Date: Mon, 31 Mar 2025 01:49:15 +0200
Subject: [PATCH] Add Data Eloquent casting

---
 app/Form/Data/ExportData.php             |  8 +++++++-
 app/Form/Data/FormConfigData.php         |  7 +++++++
 app/Lib/Editor/Condition.php             |  7 +++++++
 app/Lib/Editor/EditorData.php            |  7 +++++++
 composer.lock                            | 12 ++++++------
 phpstan.neon                             |  1 +
 tests/stub/phpstan/DataEloquentCast.stub | 13 +++++++++++++
 7 files changed, 48 insertions(+), 7 deletions(-)
 create mode 100644 tests/stub/phpstan/DataEloquentCast.stub

diff --git a/app/Form/Data/ExportData.php b/app/Form/Data/ExportData.php
index 0d2e1567..d0bed739 100644
--- a/app/Form/Data/ExportData.php
+++ b/app/Form/Data/ExportData.php
@@ -3,11 +3,11 @@
 namespace App\Form\Data;
 
 use App\Fileshare\Data\FileshareResourceData;
-use App\Form\Fields\Field;
 use Spatie\LaravelData\Attributes\MapInputName;
 use Spatie\LaravelData\Attributes\MapOutputName;
 use Spatie\LaravelData\Data;
 use Spatie\LaravelData\Mappers\SnakeCaseMapper;
+use Spatie\LaravelData\Support\EloquentCasts\DataEloquentCast;
 
 #[MapInputName(SnakeCaseMapper::class)]
 #[MapOutputName(SnakeCaseMapper::class)]
@@ -16,4 +16,10 @@ class ExportData extends Data
     public function __construct(public ?FileshareResourceData $root = null, public ?string $groupBy = null, public ?string $toGroupField = null)
     {
     }
+
+    /** @return DataEloquentCast<self> */
+    public static function castUsing(array $arguments): DataEloquentCast
+    {
+        return new DataEloquentCast(static::class, $arguments);
+    }
 }
diff --git a/app/Form/Data/FormConfigData.php b/app/Form/Data/FormConfigData.php
index 6e97ac0a..66de3149 100644
--- a/app/Form/Data/FormConfigData.php
+++ b/app/Form/Data/FormConfigData.php
@@ -8,6 +8,7 @@ use Illuminate\Support\Collection;
 use Spatie\LaravelData\Data;
 use Spatie\LaravelData\Attributes\WithCast;
 use Spatie\LaravelData\Attributes\WithTransformer;
+use Spatie\LaravelData\Support\EloquentCasts\DataEloquentCast;
 
 class FormConfigData extends Data
 {
@@ -29,4 +30,10 @@ class FormConfigData extends Data
             new FieldCollection([])
         );
     }
+
+    /** @return DataEloquentCast<self> */
+    public static function castUsing(array $arguments): DataEloquentCast
+    {
+        return new DataEloquentCast(static::class, $arguments);
+    }
 }
diff --git a/app/Lib/Editor/Condition.php b/app/Lib/Editor/Condition.php
index 09fc8f5a..ce28670e 100644
--- a/app/Lib/Editor/Condition.php
+++ b/app/Lib/Editor/Condition.php
@@ -6,6 +6,7 @@ use Spatie\LaravelData\Data;
 use Spatie\LaravelData\DataCollection;
 use Spatie\MediaLibrary\MediaCollections\Models\Media;
 use Spatie\LaravelData\Attributes\DataCollectionOf;
+use Spatie\LaravelData\Support\EloquentCasts\DataEloquentCast;
 
 class Condition extends Data
 {
@@ -42,4 +43,10 @@ class Condition extends Data
     {
         return $this->mode === ConditionMode::ALL;
     }
+
+    /** @return DataEloquentCast<self> */
+    public static function castUsing(array $arguments): DataEloquentCast
+    {
+        return new DataEloquentCast(static::class, $arguments);
+    }
 }
diff --git a/app/Lib/Editor/EditorData.php b/app/Lib/Editor/EditorData.php
index debffc23..497b5bbf 100644
--- a/app/Lib/Editor/EditorData.php
+++ b/app/Lib/Editor/EditorData.php
@@ -3,6 +3,7 @@
 namespace App\Lib\Editor;
 
 use Spatie\LaravelData\Data;
+use Spatie\LaravelData\Support\EloquentCasts\DataEloquentCast;
 
 /** @todo replace blocks with actual block data classes */
 class EditorData extends Data implements Editorable
@@ -83,4 +84,10 @@ class EditorData extends Data implements Editorable
     {
         return $this;
     }
+
+    /** @return DataEloquentCast<self> */
+    public static function castUsing(array $arguments): DataEloquentCast
+    {
+        return new DataEloquentCast(static::class, $arguments);
+    }
 }
diff --git a/composer.lock b/composer.lock
index 7f3d4b69..87bbf04d 100644
--- a/composer.lock
+++ b/composer.lock
@@ -6011,16 +6011,16 @@
         },
         {
             "name": "nette/utils",
-            "version": "v4.0.5",
+            "version": "v4.0.6",
             "source": {
                 "type": "git",
                 "url": "https://github.com/nette/utils.git",
-                "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96"
+                "reference": "ce708655043c7050eb050df361c5e313cf708309"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/nette/utils/zipball/736c567e257dbe0fcf6ce81b4d6dbe05c6899f96",
-                "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96",
+                "url": "https://api.github.com/repos/nette/utils/zipball/ce708655043c7050eb050df361c5e313cf708309",
+                "reference": "ce708655043c7050eb050df361c5e313cf708309",
                 "shasum": ""
             },
             "require": {
@@ -6091,9 +6091,9 @@
             ],
             "support": {
                 "issues": "https://github.com/nette/utils/issues",
-                "source": "https://github.com/nette/utils/tree/v4.0.5"
+                "source": "https://github.com/nette/utils/tree/v4.0.6"
             },
-            "time": "2024-08-07T15:39:19+00:00"
+            "time": "2025-03-30T21:06:30+00:00"
         },
         {
             "name": "nikic/php-parser",
diff --git a/phpstan.neon b/phpstan.neon
index 72b343e6..a757e1b8 100644
--- a/phpstan.neon
+++ b/phpstan.neon
@@ -7,6 +7,7 @@ parameters:
     stubFiles:
         - tests/stub/phpstan/TestResponse.stub
         - tests/stub/phpstan/Settings.stub
+        - tests/stub/phpstan/DataEloquentCast.stub
 
     paths:
         - app
diff --git a/tests/stub/phpstan/DataEloquentCast.stub b/tests/stub/phpstan/DataEloquentCast.stub
new file mode 100644
index 00000000..41d50325
--- /dev/null
+++ b/tests/stub/phpstan/DataEloquentCast.stub
@@ -0,0 +1,13 @@
+<?php
+
+namespace Spatie\LaravelData\Support\EloquentCasts;
+
+use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
+
+/**
+ * @template TDto
+ * @implements CastsAttributes<TDto, TDto>
+ */
+class DataEloquentCast implements CastsAttributes
+{
+}