# @rotcare/codegen

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

Latest version **0.1.10** (published 2021-03-23) · 0 weekly downloads

## Install

```sh
npm install @rotcare/codegen
pnpm add @rotcare/codegen
yarn add @rotcare/codegen
bun add @rotcare/codegen
```

## Health

**Score 20/100 (F)** — status: abandoned.

Positive: has types; no vulnerabilities.

Warnings: low downloads; no esm support; pre 1.0.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 0.1.10 |
| Published | 2021-03-23 |
| First published | 2021-03-22 |
| Weekly downloads | 0 |
| TypeScript types | bundled |
| Module format | CommonJS |
| Dependencies | 0 |
| Unpacked size | 8.6 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 1 |
| Maintainers | taowen |

## Links

- npm: https://www.npmjs.com/package/@rotcare/codegen
- Repository: https://github.com/rotcare/codegen
- Homepage: https://rot.care/codegen/
- Issues: https://github.com/rotcare/codegen/issues
- npm.io page: https://npm.io/package/@rotcare/codegen

## Recent versions

- 0.1.10 (latest) — 2021-03-23
- 0.1.9 — 2021-03-23
- 0.1.8 — 2021-03-23
- 0.1.7 — 2021-03-23
- 0.1.6 — 2021-03-23
- 0.1.5 — 2021-03-23
- 0.1.1 — 2021-03-23
- 0.1.0 — 2021-03-22

## README

# 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)

---
_Source: https://npm.io/package/@rotcare/codegen · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
