codebuds/generate-ts-bundle

从PHP文件生成TypeScript代码

安装: 34

依赖项: 0

建议者: 0

安全性: 0

星星: 5

关注者: 2

分支: 0

开放问题: 0

类型:symfony-bundle

0.2.0 2023-12-08 11:28 UTC

This package is auto-updated.

Last update: 2024-09-08 13:52:21 UTC


README

Code Coverage Badge

CodeBuds TypeScript生成器包

CodeBuds TypeScript生成器包是一个Symfony包,旨在通过自动根据PHP文件生成TypeScript文件来改善开发人员的体验。该包会扫描您的PHP实体并创建相应的TypeScript接口和类型。它还可以扫描PHP枚举以生成等效的TypeScript枚举。

目录

安装

要安装包,请使用composer

composer require codebuds/ts-generator-bundle --dev

配置

此包提供三个可配置的参数,默认值如下

  • namespace:您的实体的PHP命名空间。默认值为 'App\Entity'。
  • interface_output_directory:生成的TypeScript接口文件存储的目录。默认值为 '%kernel.project_dir%/assets/interfaces'。
  • type_output_directory:生成的TypeScript类型文件存储的目录。默认值为 '%kernel.project_dir%/assets/types'。
  • enum_output_directory:生成的TypeScript枚举文件存储的目录。默认值为 '%kernel.project_dir%/assets/enums'。
  • entity_input_directory:包含用于TypeScript生成的PHP文件的目录。默认值为 '%kernel.project_dir%/src/Entity'。
  • enum_input_directory:包含用于TypeScript枚举生成的PHP枚举的目录。默认值为 '%kernel.project_dir%/src/Enum'。

您可以通过在配置目录内创建YAML文件来覆盖这些默认配置

#config/generate_ts.yaml
generate_ts:
    namespace: 'App\CustomNamespace\'
    type_output_directory: '%kernel.project_dir%/custom/types'
    interface_output_directory: '%kernel.project_dir%/custom/interfaces'
    enum_output_directory: '%kernel.project_dir%/custom/enums'
    entity_input_directory: '%kernel.project_dir%/custom/Entity'
    enum_input_directory: '%kernel.project_dir%/custom/Enum'

使用

类型和接口

要生成TypeScript接口,运行以下命令

php bin/console codebuds:generate-ts:interfaces --force

要生成TypeScript类型,运行以下命令

php bin/console codebuds:generate-ts:types --force

当命令生成新接口时的输出如下

Generate TypeScript Interfaces
==============================

 0/3 [░░░░░░░░░░░░░░░░░░░░░░░░░░░░]   0%     
                                                                                                                    
 [INFO] /srv/app/assets/interfaces/Sub1/SubSub1/SubSubEntity2.ts generated for /srv/app/src/Entity/Sub1/SubSub1/SubSubEntity2.php                                                       
                                                                                                                                                   
 [INFO] /srv/app/assets/interfaces/Sub2/SubEntity2.ts generated for /srv/app/src/Entity/Sub2/SubEntity2.php      
                                                                                                                 
 [INFO] /srv/app/assets/interfaces/Root.ts generated for /srv/app/src/Entity/Root.php                                                         

 3/3 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%

如果输出没有变化,您将得到

Generate TypeScript Interfaces
==============================

 0/3 [░░░░░░░░░░░░░░░░░░░░░░░░░░░░]   0% 
 
 ! [NOTE] No changes for /srv/app/assets/interfaces/Sub1/SubSub1/SubSubEntity2.ts                                       

 ! [NOTE] No changes for /srv/app/assets/interfaces/Sub2/SubEntity2.ts                                                  

 ! [NOTE] No changes for /srv/app/assets/interfaces/Root.ts     
 
 3/3 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%

选项

在运行命令时,您可以覆盖配置的命名空间、输入目录和输出目录的值

codebuds:generate-ts:interfaces --namespace=App/Test/ --inputDirectory=vendor/codebuds/generate-ts-bundle/src/Tests/data --outputDirectory=vendor/codebuds/generate-ts-bundle/src/Tests/output --force

输出

脚本将尝试匹配类型。如果您有一个具有关系的实体,它将映射这些关系到TypeScript接口。

例如,有一个实体

<?php

namespace App\Test;

use App\Repository\RootRepository;
use App\Test\Sub1\SubEntity1;
use App\Test\Sub1\SubSub1\SubSubEntity1;
use App\Test\Sub1\SubSub1\SubSubEntity2;
use App\Test\Sub2\SubEntity2;
use DateTimeInterface;
use Doctrine\Common\Collections\Collection;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity(repositoryClass: RootRepository::class)]
class Root
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    private ?int $id = null;

    #[ORM\ManyToOne]
    private ?SubSubEntity1 $subSubEntity1 = null;

    #[ORM\OneToMany(mappedBy: 'root', targetEntity: SubSubEntity2::class)]
    private Collection $subSubEntity2;

    #[ORM\ManyToMany(targetEntity: SubEntity1::class, inversedBy: 'roots')]
    private Collection $subEntity1;

    #[ORM\OneToOne(cascade: ['persist', 'remove'])]
    private ?SubEntity2 $subEntity2 = null;

    #[ORM\Column(type: Types::DATETIME_MUTABLE, nullable: true)]
    private ?DateTimeInterface $datetime = null;

    #[ORM\Column(type: Types::TEXT)]
    private ?string $text = null;
}

接口输出将是

import {SubSubEntity1} from "./Sub1/SubSub1/SubSubEntity1"
import {SubSubEntity2} from "./Sub1/SubSub1/SubSubEntity2"
import {SubEntity1} from "./Sub1/SubEntity1"
import {SubEntity2} from "./Sub2/SubEntity2"

export interface Root {
  id: number;
  subSubEntity1: SubSubEntity1;
  subSubEntity2: Array<SubSubEntity2>;
  subEntity1: Array<SubEntity1>;
  subEntity2: SubEntity2;
  datetime: Date;
  text: string;
}

类型输出将是

import {SubSubEntity1} from "./Sub1/SubSub1/SubSubEntity1"
import {SubSubEntity2} from "./Sub1/SubSub1/SubSubEntity2"
import {SubEntity1} from "./Sub1/SubEntity1"
import {SubEntity2} from "./Sub2/SubEntity2"

export type Root = {
  id: number;
  subSubEntity1: SubSubEntity1;
  subSubEntity2: Array<SubSubEntity2>;
  subEntity1: Array<SubEntity1>;
  subEntity2: SubEntity2;
  datetime: Date;
  text: string;
}

枚举

要生成TypeScript枚举,运行以下命令

php bin/console codebuds:generate-ts:enums --force

这适用于简单枚举

<?php

namespace App\Test\Enum;

enum NotBacked
{
    case First;
    case Second;
}

转换为

export enum NotBacked {
  First,
  Second,
}

对于后端枚举

<?php

namespace App\Test\Enum;

enum BackedString: string
{
    case String = 'String';
    case Another = 'Something';
}

转换为

export enum BackedString {
  String = "String",
  Another = "Something",
}

待办事项

  • 联合类型

贡献

如果您想为此项目做出贡献,请随意提出问题和提交拉取请求。

许可

此包是开源软件,许可协议为MIT许可