diff --git a/README.md b/README.md index e9bf87d..1aa077d 100644 --- a/README.md +++ b/README.md @@ -15,21 +15,29 @@ composer require savks/negotiator namespace App\Http\Mapping; -use App\Models\User;use Savks\Negotiator\Support\Mapping\{Casts\ObjectCast,Utils\Factory};use Savks\Negotiator\Support\Mapping\Mapper; +use App\Models\User; -class UserMapper extends Mapper +use Savks\Negotiator\Support\Mapping\{ + Casts\Cast, + Mapper, + Schema +}; + +use Savks\Negotiator\Support\Mapping\Mapper; + +final class UserMapper extends Mapper { public function __construct(public readonly User $user) { } - public function map(): ObjectCast + public static function schema(): Cast { - return new ObjectCast($this->user, fn (Factory $factory) => [ - 'id' => $factory->string('id'), - 'firstName' => $factory->string('first_name'), - 'lastName' => $factory->string('last_name')->nullable(), - ]); + return Schema::object([ + 'id' => Schema::string('id'), + 'firstName' => Schema::string('first_name'), + 'lastName' => Schema::string('last_name')->nullable(), + ], 'user'); } } ``` @@ -56,11 +64,14 @@ class UserMapper extends Mapper ```php source, fn (Factory $factory) => [ - 'items' => $factory->array( - fn (Item $item) => $item->anyObject(), +Schema::object([ + 'items' => Schema::array( + Schema::anyObject(), 'items' ), ]); @@ -70,10 +81,15 @@ new ObjectCast($this->source, fn (Factory $factory) => [ * `object` — об'єкт зі статичними полями. Приклад: ```php -use Savks\Negotiator\Support\Mapping\{Casts\ObjectCast,Utils\Factory}; +source, fn (Factory $factory) => [ - 'field' => $factory->string('field'), +use Savks\Negotiator\Support\Mapping\{ + Casts\Cast, + Schema +}; + +Schema::object([ + 'field' => Schema::string('field'), ]); ``` @@ -82,12 +98,14 @@ new ObjectCast($this->source, fn (Factory $factory) => [ ```php source, fn (Factory $factory) => [ - 'items' => $factory->keyedArray( - 'id', - fn (Item $item) => $item->anyObject(), +Schema::object([ + 'items' => Schema::keyedArray( + Schema::anyObject(), 'items' ), ]); @@ -101,14 +119,23 @@ new ObjectCast($this->source, fn (Factory $factory) => [ ```php source, fn (Factory $factory) => [ - 'user' => $factory->mapper( - fn (User $item): UserMapper => new UserMapper($user), +use Savks\Negotiator\Support\Mapping\{ + Casts\Cast, + Schema +}; + +Schema::object([ + 'user' => Schema::mapper( + fn (User $user): UserMapper => new UserMapper($user), 'user' ), ]); + +Schema::object([ + 'user' => Schema::mapper( UserMapper::class, 'user'), +]); ``` > Для правильно генерації типів, для TypeScript, у функції-резолвер мапера важливо вказувати сам мапер як тип що повертається, в іншому випадку значення набуватиму значення `any`. @@ -118,26 +145,30 @@ new ObjectCast($this->source, fn (Factory $factory) => [ ```php source, fn (Factory $factory) => [ - 'field' => $factory - ->union() +Schema::object([ + 'field' => Schema::union() ->variant( fn (User $user) => $user->role === 'admin', - fn (Factory $factory) => $factory->object(fn (Factory $factory) => [ - 'field' => $factory->string('field'), + Schema::object([ + 'field' => Schema::string('field'), ]) ) ->variant( fn (User $user) => $user->role === 'guest', - fn (Factory $factory) => $factory->object(fn (Factory $factory) => [ - 'field' => $factory->string('field'), + Schema::object([ + 'field' => Schema::string('field'), ]) ) ->default( - fn (Factory $factory) => $factory->object(fn (Factory $factory) => [ - 'field' => $factory->string('field'), + Schema::object([ + 'field' => Schema::string('field'), ]) ), ]); @@ -148,51 +179,62 @@ new ObjectCast($this->source, fn (Factory $factory) => [ ```php source, fn (Factory $factory) => [ - 'field' => $factory->string('field'), +Schema::object([ + 'field' => Schema::string('field'), - $factory->spread( - fn (Factory $factory) => [ - 'otherField' => $factory->string('other_field') - ], - 'accessor' - ), + new Spread([ + 'otherField' => Schema::string('other_field') + ], 'accessor'), ]); ``` -* `intersection` — використовується для вказання перетнутих типів, зазвичай використовується якщо необхідно розширити інший мареп. Приклад: +* `typedField` — дозволяє вказувати поле з типізованим ключем. Приклад: ```php source, fn (Factory $factory) => [ - 'field' => $factory->intersection( - $factory->mapper( - fn (User $user): UserMapper => new UserMapper($user), - 'user' - ), - $factory->object( fn (Factory $factory) => [ - 'otherField' => $factory->string('other_field') - ], 'user' ), - ), +use Savks\Negotiator\Support\Mapping\Casts\{ + ObjectUtils\TypedField, + Cast +}; + +Schema::object([ + 'field' => Schema::string('field'), + + new TypedField(SomeEnum::CASE, [ + 'otherField' => Schema::string('other_field') + ]), ]); ``` +* `intersection` — використовується для вказання перетнутих типів, зазвичай використовується якщо необхідно розширити інший мареп. Приклад: + ```php user), - new ObjectCast($this->user, fn (Factory $factory) => [ - 'otherField' => $factory->string('other_field') - ]), -); +Schema::object([ + 'field' => Schema::intersection( + Schema::mapper(UserMapper::class, 'user'), + + Schema::object([ + 'otherField' => Schema::string('other_field') + ], 'user'), + ), +]); ``` * `oneOfConst` — дозволяє вказати, що значення може набувати одного з типів-констант. Приклад: @@ -200,13 +242,16 @@ new IntersectionCast( ```php source, fn (Factory $factory) => [ - 'field' => $factory->oneOfConst([ - $factory->constNumber(1), - $factory->constNumber(2), - $factory->constNumber(3), +Schema::object([ + 'field' => Schema::oneOfConst([ + Schema::constNumber(1), + Schema::constNumber(2), + Schema::constNumber(3), ]), ]); ``` @@ -222,8 +267,8 @@ use App\Http\Mapping\UserMapper; use Savks\Negotiator\Enums\RefTypes; use Illuminate\Support\Str; -use Savks\Negotiator\Support\TypeGeneration\{ - TypeScript\Generator, +use Savks\Negotiator\Support\TypeGeneration\TypeScript\{ + Generator, Target }; diff --git a/src/Support/TypeGeneration/TypeScript/Generator.php b/src/Support/TypeGeneration/TypeScript/Generator.php index 4d227ea..ad673df 100644 --- a/src/Support/TypeGeneration/TypeScript/Generator.php +++ b/src/Support/TypeGeneration/TypeScript/Generator.php @@ -16,8 +16,7 @@ }; use Savks\Negotiator\Support\TypeGeneration\{ TypeScript\TypeProcessor as TypeGenerator, - Faker, - Target + Faker }; class Generator diff --git a/src/Support/TypeGeneration/RefsResolver.php b/src/Support/TypeGeneration/TypeScript/RefsResolver.php similarity index 98% rename from src/Support/TypeGeneration/RefsResolver.php rename to src/Support/TypeGeneration/TypeScript/RefsResolver.php index 4857a8a..768c865 100644 --- a/src/Support/TypeGeneration/RefsResolver.php +++ b/src/Support/TypeGeneration/TypeScript/RefsResolver.php @@ -1,6 +1,6 @@