init: 从 cs-hand/hand-server-2/lib/shrimp 抽出独立仓
- 6 个框架源文件搬到 src/, 加 src/index.ts barrel 作为公共 API 入口 - package.json 标 private, main/types 指 src/index.ts (ts-node 消费方编译) - 加 vitest + 22 条单元测试 (ILabel / MemoryShrimpCrud) 全通过 - examples/basic-admin/ 用 MemoryShrimpCrud 跑零 Mongo 依赖 demo 待办: ShrimpServer 强耦合 Mongo+JWT+Express, crudRegistry 用 .model 判断数据源, 这两个问题在 demo 中已暴露, 计划后续重构补到 90 分。
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
import { describe, it, expect } from "vitest"
|
||||
import { ShrimpError, ShrimpCode } from "../src"
|
||||
import type { ILabel } from "../src"
|
||||
|
||||
describe("ILabel", () => {
|
||||
it("ShrimpError 接受字面量 string", () => {
|
||||
const e = new ShrimpError("余额不足")
|
||||
expect(e.tip).toBe("余额不足")
|
||||
expect(e.message).toBe("余额不足")
|
||||
expect(e.code).toBe(ShrimpCode.FAIL)
|
||||
})
|
||||
|
||||
it("ShrimpError 接受 {t} 翻译键", () => {
|
||||
const tip: ILabel = { t: "myapp.notEnough", params: { need: 100 } }
|
||||
const e = new ShrimpError(tip)
|
||||
expect(e.tip).toEqual(tip)
|
||||
// message 用 i18n key 作为日志友好的字符串
|
||||
expect(e.message).toBe("myapp.notEnough")
|
||||
})
|
||||
|
||||
it("ShrimpError 接受 {tc} 复数键", () => {
|
||||
const tip: ILabel = { tc: "myapp.items", count: 3 }
|
||||
const e = new ShrimpError(tip)
|
||||
expect(e.tip).toEqual(tip)
|
||||
expect(e.message).toBe("myapp.items")
|
||||
})
|
||||
|
||||
it("ShrimpError 接受 {d} 日期形态", () => {
|
||||
const now = Date.now()
|
||||
const tip: ILabel = { d: now, format: "short" }
|
||||
const e = new ShrimpError(tip)
|
||||
expect(e.message).toBe(String(now))
|
||||
})
|
||||
|
||||
it("ShrimpError 接受 {n} 数字/货币形态", () => {
|
||||
const tip: ILabel = { n: 99.5, format: "currency" }
|
||||
const e = new ShrimpError(tip)
|
||||
expect(e.message).toBe("99.5")
|
||||
})
|
||||
|
||||
it("ShrimpError 接受内联多语言对象", () => {
|
||||
const tip: ILabel = { zh: "提交", en: "Submit" }
|
||||
const e = new ShrimpError(tip)
|
||||
// 对内联多语言 extractILabelText 没有特殊处理,返回 fallback
|
||||
expect(e.message).toBe("[ILabel]")
|
||||
expect(e.tip).toEqual(tip)
|
||||
})
|
||||
|
||||
it("ShrimpError 支持自定义 code", () => {
|
||||
const e = new ShrimpError("权限不足", ShrimpCode.FORBIDDEN)
|
||||
expect(e.code).toBe(ShrimpCode.FORBIDDEN)
|
||||
})
|
||||
|
||||
it("ShrimpError 是 Error 的子类", () => {
|
||||
const e = new ShrimpError("err")
|
||||
expect(e).toBeInstanceOf(Error)
|
||||
expect(e.name).toBe("ShrimpError")
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user