feat!: 拆分 core / server 入口,peer deps 全部 optional
让只用 Shrimp 核心(RPC + 模块声明 + 内存 CRUD)的项目不必装
express / mongoose / bcrypt / jsonwebtoken,显著降低 install 时间。
- src/core.ts:0 重依赖入口(Shrimp / MemoryShrimpCrud / 类型)
- src/server.ts:在 core 之上再导出 ShrimpServer + MongoShrimpCrud
- package.json:加 exports 字段 + peerDependenciesMeta.optional
- Shrimp.ts:bcrypt 改 lazy import,只有走 Password 字段才触发
- MemoryShrimpCrud.populateItems:接 crudRegistry 参数(对齐 Mongo)
- ShrimpTableModule 构造时自动登记 crudRegistry,业务无需手动 wire
- 新增 test/crudRegistry.test.ts 验证自动登记 + relation 自动 populate
BREAKING: import { ShrimpServer } from 'shrimp-server' 不再可用,
请改为 'shrimp-server/server'。
This commit is contained in:
@@ -0,0 +1,39 @@
|
||||
import { describe, it, expect } from "vitest"
|
||||
import { Shrimp, ShrimpTableModule, MemoryShrimpCrud, ShrimpFieldTypes } from "../src"
|
||||
import type { IFieldConfig } from "../src"
|
||||
|
||||
describe("crudRegistry 自动登记", () => {
|
||||
it("ShrimpTableModule 构造时自动把 dataSource 登记到 root.crudRegistry", () => {
|
||||
const shrimp = new Shrimp()
|
||||
const crud = new MemoryShrimpCrud()
|
||||
new ShrimpTableModule(shrimp, "tag", crud, [], "标签")
|
||||
expect(shrimp.crudRegistry.get("tag")).toBe(crud)
|
||||
})
|
||||
|
||||
it("通过 ShrimpTableModule.list 走 relation populate,只需声明字段无需手动 wire", async () => {
|
||||
const shrimp = new Shrimp()
|
||||
|
||||
const tagCrud = new MemoryShrimpCrud<{ _id: string; name: string }>()
|
||||
new ShrimpTableModule(shrimp, "tag", tagCrud, [
|
||||
{ key: "name", label: "名称", type: ShrimpFieldTypes.String },
|
||||
], "标签").initCrud()
|
||||
const t1 = await tagCrud.add({ name: "热门" } as any)
|
||||
const t2 = await tagCrud.add({ name: "促销" } as any)
|
||||
|
||||
const productCrud = new MemoryShrimpCrud<{ _id: string; code: string; tagIds: string[] }>()
|
||||
const productFields: IFieldConfig[] = [
|
||||
{ key: "code", label: "编码", type: ShrimpFieldTypes.String },
|
||||
{
|
||||
key: "tagIds", label: "标签", type: ShrimpFieldTypes.Relation,
|
||||
relation: { moduleKey: "tag", labelKey: "name" }, multiple: true,
|
||||
},
|
||||
]
|
||||
const productModule = new ShrimpTableModule(shrimp, "product", productCrud, productFields, "商品")
|
||||
productModule.initCrud()
|
||||
|
||||
await productCrud.add({ code: "P001", tagIds: [t1._id, t2._id] } as any)
|
||||
|
||||
const result = await productModule.list({})
|
||||
expect((result.list[0] as any).tagIds_label).toEqual(["热门", "促销"])
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user