codebuds / generate-ts-bundle
从PHP文件生成TypeScript代码
0.2.0
2023-12-08 11:28 UTC
Requires
- php: ^8.1
- symfony/http-client: ^6.1|^7.0
Requires (Dev)
- rector/rector: ^0.15.21
- roave/security-advisories: dev-latest
- symfony/console: ^6.1|^7.0
- symfony/framework-bundle: ^6.1|^7.0
- symfony/phpunit-bridge: ^6.1|^7.0
README
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许可。