open-index/open-npm huggingface dataset:
npm package: @rotcare/codegen
Description: `codegen()` 类似 C/C++ 的宏，会在编译期被执行，并替换源代码。
Latest version: 0.1.10

# TypeScript 编译期代码生成

`codegen()` 类似 C/C++ 的宏，会在编译期被执行，并替换源代码。

```ts
import { codegen, Model } from '@rotcare/codegen';
import { Product } from './Product';
import { generateForm } from 'some-generator';

const someVar = codegen((product: Model<Product>) => {
    return generateForm(product);
})
```

在编译的时候，codegen 中的回调会被执行。假设 generateForm 返回了 "Hello" 字符串。那么这里就变成了

```ts
const someVar = "Hello"; // 由 generateForm 生成的代码
```

codegen 可以依赖多个 Model，也可以扫描项目中的所有 Model

```ts
const someVar = codegen((product: Model<Product>, order: Model<Order>) => {
    ...
})

const someVar = codegen((...allModels: Model[]) => {
    ...
})
```

这里引用的 Model 对象，由编译期解析 Class 的定义得出，比如

```ts
// in Some/Path/Order.ts
export class Order {
    public id: string;
    public totoal: number;
}
```

那么在 `order: Model<Order>` 里就可以拿到 `id` 和 `total` 这两个 properties。也就是编译期的类定义反射。

编译需要选择对应的编译工具链

* [@rotcare/project](https://github.com/rotcare/project)
* [@rotcare/project-esbuild](https://github.com/rotcare/project-esbuild)
* [@rotcare/register](https://github.com/rotcare/register)

# API

```
yarn add @rotcare/codegen
```

* [codegen](./src/index.ts)
* [Model](./src/index.ts)
npm package: @rotcare/project
Description: `@rotcare/project` 使用 babel 在常规的 TypeScript 项目之上增加了如下编译期能力
Latest version: 0.1.10

# TypeScript 项目的高级组织方式

`@rotcare/project` 使用 babel 在常规的 TypeScript 项目之上增加了如下编译期能力

* codegen：使用 `@rotcare/codegen` 执行自定义的代码生成，把生成的代码插入到源代码处
* composite project：允许把一个 class 分解到多个 npm 包中，在编译时把 class 的多份代码粘合到一起

引入这两项能力其目的是把代码做更低耦合地拆分成多个 Git 仓库来编写。

如果没有使用 codegen 或者 composite project，可以直接用 babel 等工具把 TypeScript 转成 JavaScript 代替 `@rotcare/project`

`@rotcare/register` 和 `@rotcare/project-esbuild` 对这个包就行二次封装，使用起来会更贴近场景，更方便一些。

# API

```
yarn add @rotcare/project --dev
```

* [buildFile](./src/buildFile.ts)
* [buildModel](./src/buildModel.ts)
* [watch](./src/watch.ts)
npm package: @rotcare/project-esbuild
Description: 对接 esbuild 的构建工具链，在 `@rotcare/project` 的 API 上做的二次封装。
Latest version: 0.1.10

# project-esbuild

对接 esbuild 的构建工具链，在 `@rotcare/project` 的 API 上做的二次封装。

# API

```
yarn add @rotcare/project-esbuild --dev
```

* [esbuildPlugin](./src/esbuildPlugin)
* [buildBackend](./src/buildBacckend)
* [buildFrontend](./src/buildFrontend)