chore: starter
This commit is contained in:
27
packages/schema/package.json
Normal file
27
packages/schema/package.json
Normal file
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"name": "@cslab-dcs/schema",
|
||||
"type": "module",
|
||||
"version": "1.0.0",
|
||||
"private": true,
|
||||
"exports": {
|
||||
".": {
|
||||
"types": "./src/index.ts",
|
||||
"import": "./src/index.ts"
|
||||
},
|
||||
"./*": {
|
||||
"types": "./src/*.ts",
|
||||
"import": "./src/*.ts"
|
||||
}
|
||||
},
|
||||
"main": "./src/index.ts",
|
||||
"types": "./src/index.ts",
|
||||
"scripts": {
|
||||
"typecheck": "tsc --noEmit"
|
||||
},
|
||||
"dependencies": {
|
||||
"zod": "^3.24.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
99
packages/schema/src/dcs.ts
Normal file
99
packages/schema/src/dcs.ts
Normal file
@@ -0,0 +1,99 @@
|
||||
/**
|
||||
* DCS 配置相关类型和验证器
|
||||
*/
|
||||
import { z } from 'zod'
|
||||
|
||||
/**
|
||||
* DCS 配置项类型
|
||||
*/
|
||||
export type DCSValueType = 'string' | 'number' | 'boolean' | 'array' | 'object'
|
||||
|
||||
/**
|
||||
* DCS 配置项
|
||||
*/
|
||||
export interface DCSConfigItem {
|
||||
key: string
|
||||
value: unknown
|
||||
type: DCSValueType
|
||||
description?: string
|
||||
required?: boolean
|
||||
children?: DCSConfigItem[]
|
||||
}
|
||||
|
||||
/**
|
||||
* DCS 配置文件
|
||||
*/
|
||||
export interface DCSConfigFile {
|
||||
name: string
|
||||
path: string
|
||||
version: string
|
||||
description?: string
|
||||
items: DCSConfigItem[]
|
||||
createdAt: string
|
||||
updatedAt: string
|
||||
}
|
||||
|
||||
/**
|
||||
* DCS 项目
|
||||
*/
|
||||
export interface DCSProject {
|
||||
id: string
|
||||
name: string
|
||||
description?: string
|
||||
configs: DCSConfigFile[]
|
||||
createdAt: string
|
||||
updatedAt: string
|
||||
}
|
||||
|
||||
/**
|
||||
* DCS 配置项验证器
|
||||
*/
|
||||
export const dcsConfigItemSchema: z.ZodType<DCSConfigItem> = z.lazy(() =>
|
||||
z.object({
|
||||
key: z.string().min(1, '配置键不能为空'),
|
||||
value: z.unknown(),
|
||||
type: z.enum(['string', 'number', 'boolean', 'array', 'object']),
|
||||
description: z.string().optional(),
|
||||
required: z.boolean().optional(),
|
||||
children: z.array(dcsConfigItemSchema).optional(),
|
||||
}),
|
||||
)
|
||||
|
||||
/**
|
||||
* DCS 配置文件验证器
|
||||
*/
|
||||
export const dcsConfigFileSchema = z.object({
|
||||
name: z.string().min(1, '文件名不能为空'),
|
||||
path: z.string().min(1, '文件路径不能为空'),
|
||||
version: z.string().regex(/^\d+\.\d+\.\d+$/, '版本号格式应为 x.x.x'),
|
||||
description: z.string().optional(),
|
||||
items: z.array(dcsConfigItemSchema),
|
||||
createdAt: z.string().datetime(),
|
||||
updatedAt: z.string().datetime(),
|
||||
})
|
||||
|
||||
/**
|
||||
* DCS 项目验证器
|
||||
*/
|
||||
export const dcsProjectSchema = z.object({
|
||||
id: z.string().uuid(),
|
||||
name: z.string().min(1, '项目名不能为空'),
|
||||
description: z.string().optional(),
|
||||
configs: z.array(dcsConfigFileSchema),
|
||||
createdAt: z.string().datetime(),
|
||||
updatedAt: z.string().datetime(),
|
||||
})
|
||||
|
||||
/**
|
||||
* 验证 DCS 配置
|
||||
*/
|
||||
export function validateDCSConfig(data: unknown): DCSConfigFile {
|
||||
return dcsConfigFileSchema.parse(data)
|
||||
}
|
||||
|
||||
/**
|
||||
* 安全验证 DCS 配置
|
||||
*/
|
||||
export function safeParseDCSConfig(data: unknown) {
|
||||
return dcsConfigFileSchema.safeParse(data)
|
||||
}
|
||||
8
packages/schema/src/index.ts
Normal file
8
packages/schema/src/index.ts
Normal file
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* @cslab-dcs/schema
|
||||
* 数据模型和验证器统一导出
|
||||
*/
|
||||
|
||||
export * from './dcs'
|
||||
export * from './types'
|
||||
export * from './validators'
|
||||
82
packages/schema/src/types.ts
Normal file
82
packages/schema/src/types.ts
Normal file
@@ -0,0 +1,82 @@
|
||||
/**
|
||||
* 通用类型定义
|
||||
*/
|
||||
|
||||
/**
|
||||
* API 响应结构
|
||||
*/
|
||||
export interface ApiResponse<T = unknown> {
|
||||
code: number
|
||||
message: string
|
||||
data: T
|
||||
success: boolean
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页请求参数
|
||||
*/
|
||||
export interface PaginationParams {
|
||||
page: number
|
||||
pageSize: number
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页响应结构
|
||||
*/
|
||||
export interface PaginatedData<T> {
|
||||
list: T[]
|
||||
total: number
|
||||
page: number
|
||||
pageSize: number
|
||||
totalPages: number
|
||||
}
|
||||
|
||||
/**
|
||||
* 树形结构节点
|
||||
*/
|
||||
export interface TreeNode<T = unknown> {
|
||||
id: string
|
||||
label: string
|
||||
children?: TreeNode<T>[]
|
||||
data?: T
|
||||
disabled?: boolean
|
||||
isLeaf?: boolean
|
||||
}
|
||||
|
||||
/**
|
||||
* 键值对
|
||||
*/
|
||||
export interface KeyValue<T = string> {
|
||||
key: string
|
||||
value: T
|
||||
}
|
||||
|
||||
/**
|
||||
* 选项结构
|
||||
*/
|
||||
export interface SelectOption<T = string | number> {
|
||||
label: string
|
||||
value: T
|
||||
disabled?: boolean
|
||||
}
|
||||
|
||||
/**
|
||||
* 用户信息
|
||||
*/
|
||||
export interface UserInfo {
|
||||
id: string
|
||||
username: string
|
||||
nickname?: string
|
||||
avatar?: string
|
||||
email?: string
|
||||
roles?: string[]
|
||||
}
|
||||
|
||||
/**
|
||||
* 应用状态
|
||||
*/
|
||||
export interface AppState {
|
||||
theme: 'light' | 'dark' | 'system'
|
||||
language: string
|
||||
sidebarCollapsed: boolean
|
||||
}
|
||||
58
packages/schema/src/validators.ts
Normal file
58
packages/schema/src/validators.ts
Normal file
@@ -0,0 +1,58 @@
|
||||
/**
|
||||
* Zod 验证器
|
||||
*/
|
||||
import { z } from 'zod'
|
||||
|
||||
/**
|
||||
* 通用验证规则
|
||||
*/
|
||||
export const requiredString = z.string().min(1, '此字段为必填项')
|
||||
export const optionalString = z.string().optional()
|
||||
export const email = z.string().email('请输入有效的邮箱地址')
|
||||
export const phone = z.string().regex(/^1[3-9]\d{9}$/, '请输入有效的手机号')
|
||||
export const url = z.string().url('请输入有效的 URL')
|
||||
export const positiveNumber = z.number().positive('请输入正数')
|
||||
export const nonNegativeNumber = z.number().nonnegative('请输入非负数')
|
||||
|
||||
/**
|
||||
* API 响应验证
|
||||
*/
|
||||
export const apiResponseSchema = z.object({
|
||||
code: z.number(),
|
||||
message: z.string(),
|
||||
data: z.unknown(),
|
||||
success: z.boolean(),
|
||||
})
|
||||
|
||||
/**
|
||||
* 分页参数验证
|
||||
*/
|
||||
export const paginationSchema = z.object({
|
||||
page: z.number().int().min(1).default(1),
|
||||
pageSize: z.number().int().min(1).max(100).default(20),
|
||||
})
|
||||
|
||||
/**
|
||||
* 用户信息验证
|
||||
*/
|
||||
export const userInfoSchema = z.object({
|
||||
id: z.string(),
|
||||
username: z.string().min(2, '用户名至少2个字符'),
|
||||
nickname: z.string().optional(),
|
||||
avatar: z.string().url().optional(),
|
||||
email: z.string().email().optional(),
|
||||
roles: z.array(z.string()).optional(),
|
||||
})
|
||||
|
||||
/**
|
||||
* 创建可选字段的 schema
|
||||
*/
|
||||
export function createPartialSchema<T extends z.ZodRawShape>(schema: z.ZodObject<T>) {
|
||||
return schema.partial()
|
||||
}
|
||||
|
||||
/**
|
||||
* 重新导出 zod
|
||||
*/
|
||||
export { z }
|
||||
export type { ZodError, ZodSchema, ZodType } from 'zod'
|
||||
10
packages/schema/tsconfig.json
Normal file
10
packages/schema/tsconfig.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"extends": "../../tsconfig.base.json",
|
||||
"compilerOptions": {
|
||||
"composite": true,
|
||||
"rootDir": "./src",
|
||||
"outDir": "./dist"
|
||||
},
|
||||
"include": ["src/**/*"],
|
||||
"exclude": ["node_modules", "dist"]
|
||||
}
|
||||
Reference in New Issue
Block a user