init6
This commit is contained in:
6
shared/dist/utils/index.d.ts
vendored
Normal file
6
shared/dist/utils/index.d.ts
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
/**
|
||||
* Utils 导出索引
|
||||
* Utils export index
|
||||
*/
|
||||
export * from './validation.js';
|
||||
//# sourceMappingURL=index.d.ts.map
|
||||
1
shared/dist/utils/index.d.ts.map
vendored
Normal file
1
shared/dist/utils/index.d.ts.map
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,iBAAiB,CAAA"}
|
||||
6
shared/dist/utils/index.js
vendored
Normal file
6
shared/dist/utils/index.js
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
/**
|
||||
* Utils 导出索引
|
||||
* Utils export index
|
||||
*/
|
||||
export * from './validation.js';
|
||||
//# sourceMappingURL=index.js.map
|
||||
1
shared/dist/utils/index.js.map
vendored
Normal file
1
shared/dist/utils/index.js.map
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,iBAAiB,CAAA"}
|
||||
59
shared/dist/utils/validation.d.ts
vendored
Normal file
59
shared/dist/utils/validation.d.ts
vendored
Normal file
@@ -0,0 +1,59 @@
|
||||
/**
|
||||
* 通用验证工具函数
|
||||
* Common validation utility functions
|
||||
*/
|
||||
import * as v from 'valibot';
|
||||
/**
|
||||
* 验证错误接口
|
||||
* Validation error interface
|
||||
*/
|
||||
export interface ValidationError {
|
||||
field: string;
|
||||
message: string;
|
||||
code: string;
|
||||
}
|
||||
/**
|
||||
* 验证结果接口
|
||||
* Validation result interface
|
||||
*/
|
||||
export interface ValidationResult<T> {
|
||||
success: boolean;
|
||||
data?: T;
|
||||
errors?: ValidationError[];
|
||||
}
|
||||
/**
|
||||
* 将 Valibot 验证错误转换为自定义格式
|
||||
* Convert Valibot validation errors to custom format
|
||||
*/
|
||||
export declare function formatValidationErrors(issues: v.BaseIssue<unknown>[]): ValidationError[];
|
||||
/**
|
||||
* 安全解析数据
|
||||
* Safely parse data with validation
|
||||
*/
|
||||
export declare function safeParseData<T>(schema: v.BaseSchema<unknown, T, v.BaseIssue<unknown>>, data: unknown): ValidationResult<T>;
|
||||
/**
|
||||
* 解析并验证数据,失败时抛出错误
|
||||
* Parse and validate data, throw error on failure
|
||||
*/
|
||||
export declare function parseData<T>(schema: v.BaseSchema<unknown, T, v.BaseIssue<unknown>>, data: unknown): T;
|
||||
/**
|
||||
* 创建验证中间件函数(用于 API)
|
||||
* Create validation middleware function (for API)
|
||||
*/
|
||||
export declare function createValidationMiddleware<T>(schema: v.BaseSchema<unknown, T, v.BaseIssue<unknown>>): (data: unknown) => T;
|
||||
/**
|
||||
* 验证查询参数
|
||||
* Validate query parameters
|
||||
*/
|
||||
export declare function validateQuery<T>(schema: v.BaseSchema<unknown, T, v.BaseIssue<unknown>>, query: Record<string, any>): T;
|
||||
/**
|
||||
* 验证请求体数据
|
||||
* Validate request body data
|
||||
*/
|
||||
export declare function validateBody<T>(schema: v.BaseSchema<unknown, T, v.BaseIssue<unknown>>, body: unknown): T;
|
||||
/**
|
||||
* 验证路径参数
|
||||
* Validate path parameters
|
||||
*/
|
||||
export declare function validateParams<T>(schema: v.BaseSchema<unknown, T, v.BaseIssue<unknown>>, params: Record<string, any>): T;
|
||||
//# sourceMappingURL=validation.d.ts.map
|
||||
1
shared/dist/utils/validation.d.ts.map
vendored
Normal file
1
shared/dist/utils/validation.d.ts.map
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAE5B;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;CACb;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE,CAAC,CAAA;IACR,MAAM,CAAC,EAAE,eAAe,EAAE,CAAA;CAC3B;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,GAAG,eAAe,EAAE,CAMxF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAC7B,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EACtD,IAAI,EAAE,OAAO,GACZ,gBAAgB,CAAC,CAAC,CAAC,CA2BrB;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,CAAC,EACzB,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EACtD,IAAI,EAAE,OAAO,GACZ,CAAC,CAWH;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,CAAC,EAC1C,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,IAE9C,MAAM,OAAO,KAAG,CAAC,CAG1B;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAC7B,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EACtD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACzB,CAAC,CAqBH;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAC5B,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EACtD,IAAI,EAAE,OAAO,GACZ,CAAC,CAEH;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAC9B,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EACtD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC1B,CAAC,CAeH"}
|
||||
118
shared/dist/utils/validation.js
vendored
Normal file
118
shared/dist/utils/validation.js
vendored
Normal file
@@ -0,0 +1,118 @@
|
||||
/**
|
||||
* 通用验证工具函数
|
||||
* Common validation utility functions
|
||||
*/
|
||||
import * as v from 'valibot';
|
||||
/**
|
||||
* 将 Valibot 验证错误转换为自定义格式
|
||||
* Convert Valibot validation errors to custom format
|
||||
*/
|
||||
export function formatValidationErrors(issues) {
|
||||
return issues.map(issue => ({
|
||||
field: issue.path?.map(p => p.key).join('.') || 'unknown',
|
||||
message: issue.message,
|
||||
code: issue.type || 'VALIDATION_ERROR',
|
||||
}));
|
||||
}
|
||||
/**
|
||||
* 安全解析数据
|
||||
* Safely parse data with validation
|
||||
*/
|
||||
export function safeParseData(schema, data) {
|
||||
try {
|
||||
const result = v.safeParse(schema, data);
|
||||
if (result.success) {
|
||||
return {
|
||||
success: true,
|
||||
data: result.output,
|
||||
};
|
||||
}
|
||||
else {
|
||||
return {
|
||||
success: false,
|
||||
errors: formatValidationErrors(result.issues),
|
||||
};
|
||||
}
|
||||
}
|
||||
catch (error) {
|
||||
return {
|
||||
success: false,
|
||||
errors: [
|
||||
{
|
||||
field: 'unknown',
|
||||
message: error instanceof Error ? error.message : '验证过程中发生未知错误',
|
||||
code: 'UNKNOWN_ERROR',
|
||||
},
|
||||
],
|
||||
};
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 解析并验证数据,失败时抛出错误
|
||||
* Parse and validate data, throw error on failure
|
||||
*/
|
||||
export function parseData(schema, data) {
|
||||
const result = safeParseData(schema, data);
|
||||
if (!result.success) {
|
||||
const error = new Error('数据验证失败');
|
||||
error.statusCode = 400;
|
||||
error.validationErrors = result.errors;
|
||||
throw error;
|
||||
}
|
||||
return result.data;
|
||||
}
|
||||
/**
|
||||
* 创建验证中间件函数(用于 API)
|
||||
* Create validation middleware function (for API)
|
||||
*/
|
||||
export function createValidationMiddleware(schema) {
|
||||
return (data) => {
|
||||
return parseData(schema, data);
|
||||
};
|
||||
}
|
||||
/**
|
||||
* 验证查询参数
|
||||
* Validate query parameters
|
||||
*/
|
||||
export function validateQuery(schema, query) {
|
||||
// 转换查询参数中的数字字符串
|
||||
const processedQuery = Object.entries(query).reduce((acc, [key, value]) => {
|
||||
if (value === undefined || value === null || value === '') {
|
||||
return acc;
|
||||
}
|
||||
// 尝试转换数字
|
||||
if (typeof value === 'string' && !isNaN(Number(value))) {
|
||||
acc[key] = Number(value);
|
||||
}
|
||||
else {
|
||||
acc[key] = value;
|
||||
}
|
||||
return acc;
|
||||
}, {});
|
||||
return parseData(schema, processedQuery);
|
||||
}
|
||||
/**
|
||||
* 验证请求体数据
|
||||
* Validate request body data
|
||||
*/
|
||||
export function validateBody(schema, body) {
|
||||
return parseData(schema, body);
|
||||
}
|
||||
/**
|
||||
* 验证路径参数
|
||||
* Validate path parameters
|
||||
*/
|
||||
export function validateParams(schema, params) {
|
||||
// 转换路径参数中的数字字符串
|
||||
const processedParams = Object.entries(params).reduce((acc, [key, value]) => {
|
||||
if (typeof value === 'string' && !isNaN(Number(value))) {
|
||||
acc[key] = Number(value);
|
||||
}
|
||||
else {
|
||||
acc[key] = value;
|
||||
}
|
||||
return acc;
|
||||
}, {});
|
||||
return parseData(schema, processedParams);
|
||||
}
|
||||
//# sourceMappingURL=validation.js.map
|
||||
1
shared/dist/utils/validation.js.map
vendored
Normal file
1
shared/dist/utils/validation.js.map
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAsB5B;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAA8B;IACnE,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC1B,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS;QACzD,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,kBAAkB;KACvC,CAAC,CAAC,CAAA;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAsD,EACtD,IAAa;IAEb,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QAExC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,MAAM,CAAC,MAAM;aACpB,CAAA;QACH,CAAC;aAAM,CAAC;YACN,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,sBAAsB,CAAC,MAAM,CAAC,MAAM,CAAC;aAC9C,CAAA;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE;gBACN;oBACE,KAAK,EAAE,SAAS;oBAChB,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa;oBAC/D,IAAI,EAAE,eAAe;iBACtB;aACF;SACF,CAAA;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CACvB,MAAsD,EACtD,IAAa;IAEb,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAE1C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAQ,CAAA;QACxC,KAAK,CAAC,UAAU,GAAG,GAAG,CAAA;QACtB,KAAK,CAAC,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAA;QACtC,MAAM,KAAK,CAAA;IACb,CAAC;IAED,OAAO,MAAM,CAAC,IAAK,CAAA;AACrB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CACxC,MAAsD;IAEtD,OAAO,CAAC,IAAa,EAAK,EAAE;QAC1B,OAAO,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAChC,CAAC,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAsD,EACtD,KAA0B;IAE1B,gBAAgB;IAChB,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CACjD,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QACpB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YAC1D,OAAO,GAAG,CAAA;QACZ,CAAC;QAED,SAAS;QACT,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YACvD,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;QAC1B,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;QAClB,CAAC;QAED,OAAO,GAAG,CAAA;IACZ,CAAC,EACD,EAAyB,CAC1B,CAAA;IAED,OAAO,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;AAC1C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,MAAsD,EACtD,IAAa;IAEb,OAAO,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;AAChC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAsD,EACtD,MAA2B;IAE3B,gBAAgB;IAChB,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CACnD,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QACpB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YACvD,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;QAC1B,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;QAClB,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC,EACD,EAAyB,CAC1B,CAAA;IAED,OAAO,SAAS,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;AAC3C,CAAC"}
|
||||
Reference in New Issue
Block a user