@deepstorm/cli 0.9.3 → 0.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +508 -24
- package/dist/registry.json +169 -1
- package/dist/skills/reef-gen-backend/variants/nodejs/steps.md +53 -0
- package/dist/skills/reef-style-backend/fragments/nodejs/eslint-config.json +30 -0
- package/dist/skills/reef-style-backend/fragments/nodejs/nestjs-structure.md +58 -0
- package/dist/skills/reef-style-backend/fragments/nodejs/prettier-config.json +19 -0
- package/dist/skills/reef-style-backend/variants/nodejs/examples/module-example.md +166 -0
- package/dist/skills/reef-style-backend/variants/nodejs/examples/prisma-example.md +115 -0
- package/dist/skills/reef-style-backend/variants/nodejs/quick-reference.md +117 -0
- package/package.json +2 -2
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# 后端编码快速参考 — Node.js / NestJS
|
|
2
|
+
|
|
3
|
+
按需加载。仅当你需要编写对应组件类型时阅读相关章节。
|
|
4
|
+
|
|
5
|
+
> 跨维度规范(适用所有后端代码):
|
|
6
|
+
> - [API 规范](api-spec.md) — RESTful 命名、统一响应体、OpenAPI、版本策略
|
|
7
|
+
> - [依赖管理规范](dependency-management.md) — 版本一致性、CVE
|
|
8
|
+
> - [异常处理深度规范](exception-handling.md) — 异常层次、错误码、全局过滤
|
|
9
|
+
> - [安全红线](security-redlines.md) — P0/P1 安全规则(必须遵守)
|
|
10
|
+
|
|
11
|
+
## 速查
|
|
12
|
+
|
|
13
|
+
| 场景 | 决策 |
|
|
14
|
+
| --- | --- |
|
|
15
|
+
| 模块结构 | 每个业务模块一个 NestJS Module,独立 Controller/Service/DTO/Entity |
|
|
16
|
+
| 依赖注入 | 构造函数注入,`@Injectable()` 装饰器,禁止 `@Inject()` 字段注入 |
|
|
17
|
+
| 参数验证 | DTO 使用 `class-validator` 装饰器(`@IsNotEmpty`、`@IsString`) |
|
|
18
|
+
| 响应格式 | 统一使用 Controller 返回值,禁止在 Service 中直接返回 Response 对象 |
|
|
19
|
+
| 异步处理 | 所有数据库/IO 操作用 `async/await`,禁止裸 `.subscribe()` 或 `.then()` |
|
|
20
|
+
| 配置管理 | 使用 `@nestjs/config` 的 `ConfigService`,禁止 `process.env` 直读(测试不可 mock) |
|
|
21
|
+
| 异常处理 | 使用 NestJS 全局异常过滤器(`ExceptionFilter`),禁止在 Controller 中 try-catch 吞异常 |
|
|
22
|
+
| 日志 | 使用 `@nestjs/common` 的 `Logger`,构造函数中注入:`private readonly logger = new Logger(XxxService.name)` |
|
|
23
|
+
| 类型安全 | 禁止 `any` 类型,优先用 `unknown` + 类型守卫 |
|
|
24
|
+
| 模块注册 | 动态模块用 `forRoot()/forFeature()` 模式,禁止在 Module 中直接 `new Provider()` |
|
|
25
|
+
|
|
26
|
+
## 代码风格
|
|
27
|
+
|
|
28
|
+
### LLM 常犯错误
|
|
29
|
+
|
|
30
|
+
- DTO 验证装饰器必须与 Swagger 装饰器同时存在(`@ApiProperty()` + `@IsString()`),禁止遗漏 Swagger
|
|
31
|
+
- Controller 方法用 `@HttpCode()` 显式声明状态码,不依赖默认 200
|
|
32
|
+
- Service 方法中数据库查询用 `findFirstOrThrow()` / `findUniqueOrThrow()` 替代手动 `if (!result) throw`
|
|
33
|
+
- Prisma 事务用 `$transaction` 包裹,禁止手动 `prisma.$executeRaw` 拼事务
|
|
34
|
+
- 枚举值用 `@nestjs/common` 的 `EnumValidationPipe` 校验,禁止手动 `if (!Object.values(E).includes(v))`
|
|
35
|
+
- 不在 Controller 中直接实例化 Service(由 DI 注入),不在 Service 中直接实例化 Repository(由 DI 注入)
|
|
36
|
+
- 所有 `catch` 块不能为空:要么 `throw` 重新抛出,要么 `this.logger.error()` + 返回 fallback
|
|
37
|
+
|
|
38
|
+
### TypeScript Decorator 使用规范
|
|
39
|
+
|
|
40
|
+
| 组件类型 | 必用装饰器 | 说明 |
|
|
41
|
+
|---------|-----------|------|
|
|
42
|
+
| Controller | `@Controller('prefix')`、`@Get()`/`@Post()`/`@Put()`/`@Delete()` | 路由定义 |
|
|
43
|
+
| DTO | `@ApiProperty()`、`@IsString()`/`@IsNumber()`/`@IsOptional()` | 验证 + Swagger |
|
|
44
|
+
| Service | `@Injectable()` | DI 可注入 |
|
|
45
|
+
| Module | `@Module()` | NestJS 模块定义 |
|
|
46
|
+
| Entity (Prisma) | 使用 Prisma Schema 定义,不额外装饰 | TypeScript 类型由 `prisma generate` 生成 |
|
|
47
|
+
|
|
48
|
+
### 控件能力声明模式
|
|
49
|
+
|
|
50
|
+
NestJS 中通过 Interface 和 Provider 令牌实现能力声明:
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
// 定义能力接口
|
|
54
|
+
export interface ToolCapability {
|
|
55
|
+
readonly name: string;
|
|
56
|
+
supports(context: ExecutionContext): boolean;
|
|
57
|
+
execute(input: unknown): Promise<unknown>;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// 注册 Provider
|
|
61
|
+
@Module({
|
|
62
|
+
providers: [
|
|
63
|
+
{ provide: 'TOOL_CAPABILITIES', useClass: TextToolCapability, multi: true },
|
|
64
|
+
],
|
|
65
|
+
})
|
|
66
|
+
export class ToolsModule {}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## 注释规则
|
|
70
|
+
|
|
71
|
+
| 文件类型 | 注释要求 |
|
|
72
|
+
|---------|---------|
|
|
73
|
+
| **Entity / Prisma Schema** | Prisma Schema 中每个 model 加 `/// 注释`;生成类型不修改 |
|
|
74
|
+
| **DTO** | 类 JSDoc `/** 用途说明 */`;字段装饰器自带文档(`@ApiProperty({ description: '...' })`) |
|
|
75
|
+
| **Service** | 每个 public 方法加 JSDoc `/** 功能、@param、@returns */` |
|
|
76
|
+
| **Controller** | 每个端点加 `@ApiOperation({ summary: '...', description: '...' })` |
|
|
77
|
+
| **Module** | 类 JSDoc `/** 模块职责 */`;`@Module({})` 中 imports/providers/exports 按字母排序 |
|
|
78
|
+
|
|
79
|
+
## 项目目录结构
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
server/src/
|
|
83
|
+
├── main.ts # 入口文件
|
|
84
|
+
├── app.module.ts # 根模块
|
|
85
|
+
├── app.controller.ts # 根 Controller(健康检查)
|
|
86
|
+
├── prisma/
|
|
87
|
+
│ ├── prisma.module.ts # Prisma 全局模块
|
|
88
|
+
│ └── prisma.service.ts # Prisma Client 封装
|
|
89
|
+
├── common/
|
|
90
|
+
│ ├── guards/ # 认证/授权守卫
|
|
91
|
+
│ ├── interceptors/ # 请求拦截器
|
|
92
|
+
│ ├── filters/ # 异常过滤器
|
|
93
|
+
│ ├── pipes/ # 管道校验
|
|
94
|
+
│ └── decorators/ # 自定义装饰器
|
|
95
|
+
├── config/
|
|
96
|
+
│ └── app.config.ts # 应用配置
|
|
97
|
+
└── modules/
|
|
98
|
+
└── {module}/
|
|
99
|
+
├── {module}.module.ts
|
|
100
|
+
├── {module}.controller.ts
|
|
101
|
+
├── {module}.service.ts
|
|
102
|
+
├── dto/
|
|
103
|
+
│ ├── create-{entity}.dto.ts
|
|
104
|
+
│ └── update-{entity}.dto.ts
|
|
105
|
+
└── entities/
|
|
106
|
+
└── {entity}.entity.ts # Prisma 生成类型的二次封装(可选)
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## 常见坑
|
|
110
|
+
|
|
111
|
+
| 场景 | 问题 | 正确做法 |
|
|
112
|
+
|------|------|---------|
|
|
113
|
+
| 循环依赖 | Module A imports Module B,Module B imports Module A | 用 `forwardRef(() => ModuleB)` |
|
|
114
|
+
| 异步初始化 | Service 的 `constructor` 中 await Prisma 连接 | 实现 `OnModuleInit` 接口,在 `onModuleInit()` 中初始化 |
|
|
115
|
+
| 环境变量直读 | `process.env.DB_URL` 在代码中硬编码 | 通过 `ConfigService.get('DB_URL')` 读取 |
|
|
116
|
+
| DTO 缺少装饰器 | `class-validator` 装饰器缺失导致验证不生效 | 每个 DTO 字段同时加 `@ApiProperty()` 和验证装饰器 |
|
|
117
|
+
| 事务边界 | 事务内调用外部 HTTP 服务 | Prisma `$transaction` 中禁止非数据库操作 |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deepstorm/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.1",
|
|
4
4
|
"description": "DeepStorm CLI — 一键配置项目开发环境",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "billkang",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"dotenv": "^17.4.2",
|
|
17
17
|
"handlebars": "^4.7.8",
|
|
18
18
|
"js-yaml": "^4.1.0",
|
|
19
|
-
"@deepstorm/pilot": "^0.
|
|
19
|
+
"@deepstorm/pilot": "^0.10.1"
|
|
20
20
|
},
|
|
21
21
|
"devDependencies": {
|
|
22
22
|
"@types/node": "^22.0.0",
|