jpnut/laravel-typescript-codegen

Laravel的TypeScript代码生成

0.2.1 2020-11-01 23:50 UTC

This package is auto-updated.

Last update: 2024-09-29 05:29:07 UTC


README

StyleCI GitHub Workflow Status License

此包允许您通过从您的Laravel路由和控制器获取类型信息来生成typescript模式。

例如,您可以将这个

    // routes/web.php

    ...

    Route::delete('/foo/{foo}', FooController::class.'@delete')->name('foo.delete');

    ...
    // App\Controllers\Web\FooController

    ...

    /**
     * @code-gen
     */
    public function delete(Request $request, Foo $foo): bool
    {
        return $foo->delete();
    }

    ...

转换成这个

export const fooDeleteRequest = (foo: string, options?: RequestInit) => request<bool>(`https:///foo/${foo}`, { method: `DELETE`, ...options });

安装

您可以通过composer安装此包

composer require jpnut/laravel-typescript-codegen

使用方法

要生成模式,使用带有所需文件位置的生成命令,位置作为唯一参数

php artisan code-gen:generate schema.ts

为了生成给定路由的函数,您必须在控制器方法(由路由使用)的文档块中添加@code-gen标签。

...

/**
 * @code-gen
 */
public function delete(Request $request, Foo $foo): bool

...

这将尝试从文档块的@return标签获取返回类型信息,或者如果没有,则使用方法的返回类型。如果没有类型信息,则返回类型默认为any

标量类型(例如 stringint 等)将转换为相应的typescript标量(例如 stringnumber 等)。如果方法返回一个类,则该类将被转换为一个包含所有公共属性的接口。

例如,给定以下类

// App\Objects\User

...

class User
{
    public string $name;

    public int $age;

    /**
     * App\Object\Token[]
     */
    public array $tokens;
}

生成的接口将如下所示

interface User {
  name: string;
  age: number;
  tokens: Token[];
}

interface Token {
  ...
}

与请求一起工作

为请求属性(例如请求正文)生成类型稍微复杂一些。请求必须实现JPNut\CodeGen\Contracts\CodeGenRequest,并且应该由Laravel的服务容器解析(通常这意味着扩展Illuminate\Foundation\Http\FormRequest)。然后,您应该创建并标记将请求映射到所需类型的方法。例如

// App\Requests\UpdateUserRequest

...

class UpdateUserRequest extends FormRequest
{
    /**
     * @code-gen-property body
     */
    public function data(): UpdateUserParams
    {
        return new UpdateUserParams([
            'name' => $this->input('name'),
            'age' => $this->input('age'),
        ]);
    }
}
// App\Objects\UpdateUserParams

...

class UpdateUserParams
{
    ...

    public ?string $name;

    public ?int $age;
}

在这种情况下,生成的接口和方法将如下所示

interface UpdateUserRequest {
  body: UpdateUserParams;
}

interface UpdateUserParams {
  name?: string | null;
  age?: number | null;
}

export const fooUpdateRequest = ({ body }: UpdateUserRequest, foo: string, options?: RequestInit) => request<any>(`https:///foo/${foo}`, { method: 'PUT', body: JSON.stringify(body), ...options });

请注意,正文参数会自动序列化请求。您可以通过修改request_properties配置属性来更改此操作或序列化其他属性。

忽略属性

您可能有一些您不希望为其生成类型的公共属性。可以通过包含@code-gen-ignore标签来忽略属性

class Foo {
    /**
     * @code-gen-ignore
     */
    public string $ignored_property;
}

使用自定义存根

默认情况下,此包将使用存根生成模式。此存根包含一个request方法,它是fetch api的包装,并返回包含反序列化响应数据的promise。

如果您希望自定义此存根,首先应发布配置文件

php artisan vendor:publish --provider="JPNut\CodeGen\CodeGenServiceProvider" --tag="config"

这将创建一个默认存根文件的副本,位于resource_path('stubs/typescript-codegen-schema.stub')。然后,将使用此文件生成模式。

使用自定义接口/方法编写器

您可能希望更改生成的接口和方法的输出。例如,您可能决定更改存根中request方法的名称。在这种情况下,您应该创建自己的接口或方法编写器,并用您的版本替换配置中的包含编写器。编写器应分别实现JPNut\CodeGen\Contracts\InterfaceWriterContractJPNut\CodeGen\Contracts\MethodWriterContract接口。

覆盖类解析

您可能希望将某些类解析为字面量。这对于不是您的代码库中的类特别有用。为此,请在配置中的default_literals数组中包含类。类名应该是键,值应该是一个PHP字面量类型数组(例如 string、int 等)。

例如,默认情况下,此包将Carbon\Carbon类转换为字符串。这是必要的,因为类的jsonSerialize方法的返回类型是string|array

测试

vendor/bin/phpunit

许可证

麻省理工学院许可证(MIT)。更多信息请参阅许可文件