This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Utopia-Utils 是一个 TypeScript monorepo 工具库集合,使用 pnpm workspaces 管理多个子包。主要包含以下子包:
@utopia-utils/core- 核心工具函数集合(数组、对象、函数、Promise、字符串、数值等)@utopia-utils/dom- DOM 和浏览器环境相关工具@utopia-utils/tree- 树结构操作工具@utopia-utils/vueuse- Vue 3 Composables@utopia-utils/share- 类型判断和共享工具@utopia-utils/cli- CLI 工具函数@utopia-utils/type- 类型定义
# 构建所有包(会先检查依赖是否过时)
pnpm build
# 开发模式运行示例项目
pnpm example
# 清理所有包的构建产物
pnpm clean
# 类型检查
pnpm typecheck# 运行所有测试(watch 模式)
pnpm test
# 运行单次测试
pnpm test:once
# 测试单个文件
pnpm test:once packages/dom/src/styleUtil.test.ts
# 生成测试覆盖率报告
pnpm coverage# 运行 linter(oxlint)
pnpm lint
# 自动修复 lint 问题
pnpm lint:fix# 版本发布(会先检查依赖是否过时)
pnpm release- 使用 pnpm workspaces 管理多包
- 使用 Turbo 进行构建优化和缓存
- 使用 tsdown 构建各个子包
- 使用 Vitest 进行单元测试
- 每个子包都有独立的
tsdown.config.ts配置 - 构建产物输出到各包的
dist/目录 - 支持 sourcemap、类型声明文件生成
- 生产环境自动 minify
- 使用
stale-dep在构建、测试、发布前自动检查过时依赖 - 子包之间使用
workspace:*协议互相引用 - 强制使用 pnpm(preinstall hook)
- 测试文件命名:
[function-name].test.ts - 测试文件与源文件放在同一目录下
- 使用 TypeScript 编写
- 使用 Vitest,启用全局变量模式(
globals: true) - DOM 相关测试自动使用 happy-dom 环境(
packages/dom/**下的所有测试) - 非 DOM 测试使用默认 node 环境
- 如果在非
packages/dom下需要 DOM 环境,在文件头部添加:/** @vitest-environment happy-dom */
- 使用
describe描述测试套件,命名与被测试函数相同 - 使用
it描述具体测试用例 - 测试分类:正常路径、边界情况、错误处理、类型安全
- 遵循 AAA 模式:Arrange(准备)、Act(执行)、Assert(断言)
import { describe, expect, it, afterEach, vi } from 'vitest'
describe('functionName', () => {
afterEach(() => {
vi.restoreAllMocks()
})
// 测试用例...
})- 核心业务逻辑应达到 100% 覆盖率
- 覆盖所有分支和边界条件
index.ts导出文件被排除在覆盖率统计之外
- 在 JS/TS 代码中,变量名和函数名使用
/** */进行注释 - 测试代码中使用多行注释格式:
/* 注释内容 */
- 启用严格模式(
strict: true) - 启用
isolatedDeclarations用于类型声明 - 所有导出的函数都应有完整的类型定义
@utopia-utils/core 重新导出了以下优秀的第三方库:
debounce/throttle- 来自 throttle-debounceCookies- 来自 js-cookiemitt- 事件发布/订阅merge/merge.all- 来自 deepmergeNP- 来自 number-precision
- 在对应子包的
src/目录下创建功能文件 - 在同一目录创建对应的
.test.ts测试文件 - 在子包的
src/index.ts中导出 - 如果是 core 包,需要在根目录 README.md 中添加 API 文档
所有 tree utils 支持自定义字段名(fieldNames):
interface FieldNames {
id?: string
children?: string
parentId?: string
}- Node >= 22.16.0
- pnpm >= 10.8.0
- 所有包输出 ESM 格式(
.mjs) - 类型定义文件后缀为
.d.mts - 使用
fixedExtension: true确保扩展名一致性