@h-ai/kit 0.1.0-alpha9 → 1.0.0-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +430 -0
- package/README.ja.md +430 -0
- package/README.md +351 -40
- package/dist/adapter/index.d.ts +17 -2
- package/dist/adapter/index.js.map +1 -1
- package/dist/browser.d.ts +19 -8
- package/dist/browser.js +10 -7
- package/dist/browser.js.map +1 -1
- package/dist/chunk-3OHUSKHI.js +175 -0
- package/dist/chunk-3OHUSKHI.js.map +1 -0
- package/dist/chunk-5VWPH7DO.js +126 -0
- package/dist/chunk-5VWPH7DO.js.map +1 -0
- package/dist/chunk-7EH47MTW.js +141 -0
- package/dist/chunk-7EH47MTW.js.map +1 -0
- package/dist/chunk-JRQPMPQC.js +63 -0
- package/dist/chunk-JRQPMPQC.js.map +1 -0
- package/dist/chunk-USFJN7IO.js +187 -0
- package/dist/chunk-USFJN7IO.js.map +1 -0
- package/dist/chunk-YKJRQCWR.js +363 -0
- package/dist/chunk-YKJRQCWR.js.map +1 -0
- package/dist/client/index.d.ts +51 -2
- package/dist/client/index.js +21 -2
- package/dist/client/index.js.map +1 -1
- package/dist/index.d.ts +303 -409
- package/dist/index.js +598 -310
- package/dist/index.js.map +1 -1
- package/dist/kit-a2a-types-4dapztu2.d.ts +136 -0
- package/dist/kit-client-auth-BnhrkzZF.d.ts +422 -0
- package/dist/kit-crypto-types-CXr888wf.d.ts +200 -0
- package/dist/kit-i18n-EBzZKYN-.d.ts +502 -0
- package/dist/kit-types-BkNdyKj8.d.ts +822 -0
- package/dist/modules/a2a/index.d.ts +15 -113
- package/dist/modules/a2a/index.js +2 -55
- package/dist/modules/a2a/index.js.map +1 -1
- package/dist/modules/crypto/index.d.ts +31 -79
- package/dist/modules/crypto/index.js +3 -3
- package/dist/modules/crypto/index.js.map +1 -1
- package/package.json +36 -22
- package/dist/chunk-475WECWK.js +0 -110
- package/dist/chunk-475WECWK.js.map +0 -1
- package/dist/chunk-6TMSXG7J.js +0 -169
- package/dist/chunk-6TMSXG7J.js.map +0 -1
- package/dist/chunk-AD6S473Y.js +0 -137
- package/dist/chunk-AD6S473Y.js.map +0 -1
- package/dist/chunk-FRYJMRTP.js +0 -71
- package/dist/chunk-FRYJMRTP.js.map +0 -1
- package/dist/chunk-PHS7ZD5L.js +0 -274
- package/dist/chunk-PHS7ZD5L.js.map +0 -1
- package/dist/index-BotXLTck.d.ts +0 -203
- package/dist/kit-crypto-types-C-gEvx04.d.ts +0 -253
- package/dist/kit-i18n-CgpNTh9G.d.ts +0 -206
- package/dist/kit-types-BHlDNNpd.d.ts +0 -618
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { TransportServerKeyRing, CryptoFunctions, TransportKeyStore } from '@h-ai/crypto';
|
|
2
|
+
import { RequestEvent } from '@sveltejs/kit';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @h-ai/kit — Crypto 类型定义
|
|
6
|
+
*
|
|
7
|
+
* Crypto 模块集成相关类型
|
|
8
|
+
* @module kit-crypto-types
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* 辅助函数所需的异步加密依赖结构;实际服务需由应用适配,不等同于 @h-ai/crypto 的公开接口。
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* import type { CryptoServiceLike } from '@h-ai/kit'
|
|
16
|
+
*
|
|
17
|
+
* async function verify(crypto: CryptoServiceLike, body: string, secret: string, signature: string) {
|
|
18
|
+
* const result = await crypto.hmac.verify(body, secret, signature, 'sha256')
|
|
19
|
+
* return result.success && result.data === true
|
|
20
|
+
* }
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
interface CryptoServiceLike {
|
|
24
|
+
hmac: {
|
|
25
|
+
sign: (data: string, key: string, algorithm?: string) => Promise<{
|
|
26
|
+
success: boolean;
|
|
27
|
+
data?: string;
|
|
28
|
+
error?: {
|
|
29
|
+
code: number;
|
|
30
|
+
message: string;
|
|
31
|
+
};
|
|
32
|
+
}>;
|
|
33
|
+
verify: (data: string, key: string, signature: string, algorithm?: string) => Promise<{
|
|
34
|
+
success: boolean;
|
|
35
|
+
data?: boolean;
|
|
36
|
+
error?: {
|
|
37
|
+
code: number;
|
|
38
|
+
message: string;
|
|
39
|
+
};
|
|
40
|
+
}>;
|
|
41
|
+
};
|
|
42
|
+
hash: {
|
|
43
|
+
digest: (data: string, algorithm?: string) => Promise<{
|
|
44
|
+
success: boolean;
|
|
45
|
+
data?: string;
|
|
46
|
+
error?: {
|
|
47
|
+
code: number;
|
|
48
|
+
message: string;
|
|
49
|
+
};
|
|
50
|
+
}>;
|
|
51
|
+
timingSafeEqual: (a: string, b: string) => Promise<{
|
|
52
|
+
success: boolean;
|
|
53
|
+
data?: boolean;
|
|
54
|
+
error?: {
|
|
55
|
+
code: number;
|
|
56
|
+
message: string;
|
|
57
|
+
};
|
|
58
|
+
}>;
|
|
59
|
+
};
|
|
60
|
+
aes: {
|
|
61
|
+
encrypt: (data: string, key: string) => Promise<{
|
|
62
|
+
success: boolean;
|
|
63
|
+
data?: string;
|
|
64
|
+
error?: {
|
|
65
|
+
code: number;
|
|
66
|
+
message: string;
|
|
67
|
+
};
|
|
68
|
+
}>;
|
|
69
|
+
decrypt: (data: string, key: string) => Promise<{
|
|
70
|
+
success: boolean;
|
|
71
|
+
data?: string;
|
|
72
|
+
error?: {
|
|
73
|
+
code: number;
|
|
74
|
+
message: string;
|
|
75
|
+
};
|
|
76
|
+
}>;
|
|
77
|
+
};
|
|
78
|
+
random: {
|
|
79
|
+
bytes: (length: number) => Promise<{
|
|
80
|
+
success: boolean;
|
|
81
|
+
data?: Uint8Array;
|
|
82
|
+
error?: {
|
|
83
|
+
code: number;
|
|
84
|
+
message: string;
|
|
85
|
+
};
|
|
86
|
+
}>;
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Webhook 验证配置
|
|
91
|
+
* @example
|
|
92
|
+
* ```ts
|
|
93
|
+
* import type { WebhookVerifyConfig } from '@h-ai/kit'
|
|
94
|
+
*
|
|
95
|
+
* function signatureHeader(config: WebhookVerifyConfig) { return config.event.request.headers.get(config.signatureHeader ?? 'X-Signature') }
|
|
96
|
+
* ```
|
|
97
|
+
*/
|
|
98
|
+
interface WebhookVerifyConfig {
|
|
99
|
+
/** Crypto 服务实例 */
|
|
100
|
+
crypto: CryptoServiceLike;
|
|
101
|
+
/** 请求事件 */
|
|
102
|
+
event: RequestEvent;
|
|
103
|
+
/** 签名密钥 */
|
|
104
|
+
secretKey: string;
|
|
105
|
+
/** 签名头名称 */
|
|
106
|
+
signatureHeader?: string;
|
|
107
|
+
/** 算法 */
|
|
108
|
+
algorithm?: 'sha256' | 'sha512';
|
|
109
|
+
/** 编码 */
|
|
110
|
+
encoding?: 'hex' | 'base64';
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* CSRF 配置
|
|
114
|
+
* @example
|
|
115
|
+
* ```ts
|
|
116
|
+
* import type { CryptoCsrfConfig } from '@h-ai/kit'
|
|
117
|
+
*
|
|
118
|
+
* function tokenSize(config: CryptoCsrfConfig) { return config.tokenLength ?? 32 }
|
|
119
|
+
* ```
|
|
120
|
+
*/
|
|
121
|
+
interface CryptoCsrfConfig {
|
|
122
|
+
/** Crypto 服务实例 */
|
|
123
|
+
crypto: CryptoServiceLike;
|
|
124
|
+
/** Cookie 名称 */
|
|
125
|
+
cookieName?: string;
|
|
126
|
+
/** Header 名称 */
|
|
127
|
+
headerName?: string;
|
|
128
|
+
/** 表单字段名称 */
|
|
129
|
+
formFieldName?: string;
|
|
130
|
+
/** Token 长度 */
|
|
131
|
+
tokenLength?: number;
|
|
132
|
+
/** Cookie 选项 */
|
|
133
|
+
cookieOptions?: {
|
|
134
|
+
path?: string;
|
|
135
|
+
httpOnly?: boolean;
|
|
136
|
+
secure?: boolean;
|
|
137
|
+
sameSite?: 'strict' | 'lax' | 'none';
|
|
138
|
+
maxAge?: number;
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* 加密 Cookie 配置
|
|
143
|
+
* @example
|
|
144
|
+
* ```ts
|
|
145
|
+
* import type { EncryptedCookieConfig } from '@h-ai/kit'
|
|
146
|
+
*
|
|
147
|
+
* function assertKey(config: EncryptedCookieConfig) {
|
|
148
|
+
* if (!config.encryptionKey) throw new Error('Encryption key required')
|
|
149
|
+
* }
|
|
150
|
+
* ```
|
|
151
|
+
*/
|
|
152
|
+
interface EncryptedCookieConfig {
|
|
153
|
+
/** Crypto 服务实例 */
|
|
154
|
+
crypto: CryptoServiceLike;
|
|
155
|
+
/** 加密密钥 */
|
|
156
|
+
encryptionKey: string;
|
|
157
|
+
/** Cookie 选项 */
|
|
158
|
+
cookieOptions?: {
|
|
159
|
+
path?: string;
|
|
160
|
+
httpOnly?: boolean;
|
|
161
|
+
secure?: boolean;
|
|
162
|
+
sameSite?: 'strict' | 'lax' | 'none';
|
|
163
|
+
maxAge?: number;
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* 传输加密配置。
|
|
169
|
+
*
|
|
170
|
+
* kit 不再维护本地加解密实现;服务端管理器由 `crypto.transport.createServer()` 创建,
|
|
171
|
+
* 协议常量与载荷类型统一来自 `@h-ai/crypto`。
|
|
172
|
+
* @example
|
|
173
|
+
* ```ts
|
|
174
|
+
* import type { TransportEncryptionConfig } from '@h-ai/kit'
|
|
175
|
+
*
|
|
176
|
+
* function publicPaths(config: TransportEncryptionConfig) { return config.excludePaths ?? [] }
|
|
177
|
+
* ```
|
|
178
|
+
*/
|
|
179
|
+
interface TransportEncryptionConfig {
|
|
180
|
+
/** 宿主构建挂载目录,默认空字符串;仅作用于 API/data 保护范围。 */
|
|
181
|
+
basePath?: string;
|
|
182
|
+
/** 双向业务明文 UTF-8 字节上限;默认 1 MiB,整数范围 1 KiB~64 MiB。 */
|
|
183
|
+
maxPlaintextBytes?: number;
|
|
184
|
+
/** 路由明文容量;* 匹配一个完整路径段。 */
|
|
185
|
+
routePlaintextBytes?: Readonly<Record<string, number>>;
|
|
186
|
+
/** 受管服务端密钥环,仅从服务端 Secret 注入,不放公开 kit 配置。 */
|
|
187
|
+
serverKeyRing: TransportServerKeyRing;
|
|
188
|
+
/** 是否启用传输加密(默认 false) */
|
|
189
|
+
enabled: boolean;
|
|
190
|
+
/** @h-ai/crypto 服务实例 */
|
|
191
|
+
crypto: CryptoFunctions;
|
|
192
|
+
/** 密钥交换端点路径(默认 `/api/_hai/key-exchange`) */
|
|
193
|
+
keyExchangePath?: string;
|
|
194
|
+
/** 排除路径(不加密),支持精确匹配和前缀匹配 */
|
|
195
|
+
excludePaths?: readonly string[];
|
|
196
|
+
/** 显式客户端公钥存储;生产使用共享 Redis/reldb,内存仅供开发/测试。 */
|
|
197
|
+
keyStore: TransportKeyStore;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export type { CryptoCsrfConfig as C, EncryptedCookieConfig as E, TransportEncryptionConfig as T, WebhookVerifyConfig as W, CryptoServiceLike as a };
|
|
@@ -0,0 +1,502 @@
|
|
|
1
|
+
import { l as KitServerConfig, n as KitTransportConfig, j as KitConfigInput, K as KitConfig, o as KitTransportConfigInput } from './kit-types-BkNdyKj8.js';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @h-ai/kit — CRUD 类型定义
|
|
6
|
+
*
|
|
7
|
+
* 声明式 CRUD 资源定义所需的全部类型。
|
|
8
|
+
* @module kit-crud-types
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* 支持的字段类型
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* import type { CrudFieldType } from '@h-ai/kit'
|
|
15
|
+
*
|
|
16
|
+
* const value: CrudFieldType = 'date-range'
|
|
17
|
+
* void value
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
type CrudFieldType = 'string' | 'number' | 'boolean' | 'date' | 'date-range' | 'datetime' | 'email' | 'url' | 'tel' | 'password' | 'textarea' | 'select' | 'multi-select' | 'radio' | 'checkbox' | 'custom';
|
|
21
|
+
/**
|
|
22
|
+
* 字段校验规则
|
|
23
|
+
* @example
|
|
24
|
+
* ```ts
|
|
25
|
+
* import type { CrudFieldValidation } from '@h-ai/kit'
|
|
26
|
+
*
|
|
27
|
+
* const value: CrudFieldValidation = { required: true, max: 120 }
|
|
28
|
+
* void value
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
interface CrudFieldValidation {
|
|
32
|
+
/** 是否必填 */
|
|
33
|
+
required?: boolean;
|
|
34
|
+
/** 最小值(number)或 最小长度(string) */
|
|
35
|
+
min?: number;
|
|
36
|
+
/** 最大值(number)或 最大长度(string) */
|
|
37
|
+
max?: number;
|
|
38
|
+
/** 正则表达式 */
|
|
39
|
+
pattern?: string;
|
|
40
|
+
/** 自定义错误提示 */
|
|
41
|
+
message?: CrudText;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* 选项项(用于 select/radio 等)
|
|
45
|
+
* @example
|
|
46
|
+
* ```ts
|
|
47
|
+
* import type { CrudFieldOption } from '@h-ai/kit'
|
|
48
|
+
*
|
|
49
|
+
* const value: CrudFieldOption = { label: 'Published', value: 'published' }
|
|
50
|
+
* void value
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
interface CrudFieldOption {
|
|
54
|
+
label: string;
|
|
55
|
+
value: string | number | boolean;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* 选项来源:静态数组或动态工厂函数
|
|
59
|
+
* @example
|
|
60
|
+
* ```ts
|
|
61
|
+
* import type { CrudFieldOptions } from '@h-ai/kit'
|
|
62
|
+
*
|
|
63
|
+
* const value: CrudFieldOptions = [{ label: 'Published', value: 'published' }]
|
|
64
|
+
* void value
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
type CrudFieldOptions = CrudFieldOption[] | (() => CrudFieldOption[]);
|
|
68
|
+
/**
|
|
69
|
+
* 可解析为字符串的文本值(支持 i18n)
|
|
70
|
+
* @example
|
|
71
|
+
* ```ts
|
|
72
|
+
* import type { CrudText } from '@h-ai/kit'
|
|
73
|
+
*
|
|
74
|
+
* const value: CrudText = () => 'Articles'
|
|
75
|
+
* void value
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
type CrudText = string | (() => string);
|
|
79
|
+
/**
|
|
80
|
+
* 字段定义
|
|
81
|
+
* @example
|
|
82
|
+
* ```ts
|
|
83
|
+
* import type { CrudFieldDef } from '@h-ai/kit'
|
|
84
|
+
*
|
|
85
|
+
* const value: CrudFieldDef = { id: 'title', label: 'Title', type: 'string', validation: { required: true } }
|
|
86
|
+
* void value
|
|
87
|
+
* ```
|
|
88
|
+
*/
|
|
89
|
+
interface CrudFieldDef {
|
|
90
|
+
/** 字段 ID(对应数据对象的 key) */
|
|
91
|
+
id: string;
|
|
92
|
+
/** 显示名称(支持 i18n 函数) */
|
|
93
|
+
label: CrudText;
|
|
94
|
+
/** 字段类型 */
|
|
95
|
+
type: CrudFieldType;
|
|
96
|
+
/** 是否在列表中显示(默认 true) */
|
|
97
|
+
inList?: boolean;
|
|
98
|
+
/** 是否是过滤项(默认 false) */
|
|
99
|
+
filterable?: boolean;
|
|
100
|
+
/** 是否只读(编辑时不可修改,默认 false) */
|
|
101
|
+
readonly?: boolean;
|
|
102
|
+
/** 是否在新建表单中显示(默认 true) */
|
|
103
|
+
inCreate?: boolean;
|
|
104
|
+
/** 是否在编辑表单中显示(默认 true) */
|
|
105
|
+
inEdit?: boolean;
|
|
106
|
+
/** 是否在详情中显示(默认 true) */
|
|
107
|
+
inDetail?: boolean;
|
|
108
|
+
/** 选项列表(select/radio/checkbox/multi-select) */
|
|
109
|
+
options?: CrudFieldOptions;
|
|
110
|
+
/** 校验规则 */
|
|
111
|
+
validation?: CrudFieldValidation;
|
|
112
|
+
/** 双列表单中的占用列数;auto 按控件类型判断,默认 auto。 */
|
|
113
|
+
colSpan?: 'auto' | 1 | 2;
|
|
114
|
+
/** 列宽(列表模式) */
|
|
115
|
+
width?: string;
|
|
116
|
+
/** 列对齐方式 */
|
|
117
|
+
align?: 'left' | 'center' | 'right';
|
|
118
|
+
/** 自定义列表渲染 */
|
|
119
|
+
render?: (value: unknown, item: Record<string, unknown>) => string;
|
|
120
|
+
/** 占位符 */
|
|
121
|
+
placeholder?: CrudText;
|
|
122
|
+
/** 日期范围起始值的查询参数名;仅 date-range 字段使用,默认 `${id}Start` */
|
|
123
|
+
startKey?: string;
|
|
124
|
+
/** 日期范围结束值的查询参数名;仅 date-range 字段使用,默认 `${id}End` */
|
|
125
|
+
endKey?: string;
|
|
126
|
+
/** 默认值(新建时) */
|
|
127
|
+
defaultValue?: unknown;
|
|
128
|
+
/** 排列权重(数值越小越靠前) */
|
|
129
|
+
order?: number;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* 分页参数
|
|
133
|
+
* @example
|
|
134
|
+
* ```ts
|
|
135
|
+
* import type { CrudPaginationParams } from '@h-ai/kit'
|
|
136
|
+
*
|
|
137
|
+
* const value: CrudPaginationParams = { page: 1, pageSize: 20 }
|
|
138
|
+
* void value
|
|
139
|
+
* ```
|
|
140
|
+
*/
|
|
141
|
+
interface CrudPaginationParams {
|
|
142
|
+
page: number;
|
|
143
|
+
pageSize: number;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* 过滤参数(搜索 + 自定义过滤字段)
|
|
147
|
+
* @example
|
|
148
|
+
* ```ts
|
|
149
|
+
* import type { CrudFilterParams } from '@h-ai/kit'
|
|
150
|
+
*
|
|
151
|
+
* const value: CrudFilterParams = { search: 'example', status: 'published' }
|
|
152
|
+
* void value
|
|
153
|
+
* ```
|
|
154
|
+
*/
|
|
155
|
+
interface CrudFilterParams {
|
|
156
|
+
search?: string;
|
|
157
|
+
[key: string]: unknown;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* 分页结果
|
|
161
|
+
* @example
|
|
162
|
+
* ```ts
|
|
163
|
+
* import type { CrudPaginatedResult } from '@h-ai/kit'
|
|
164
|
+
*
|
|
165
|
+
* const value: CrudPaginatedResult<{ id: string }> = { items: [], total: 0, page: 1, pageSize: 20 }
|
|
166
|
+
* void value
|
|
167
|
+
* ```
|
|
168
|
+
*/
|
|
169
|
+
interface CrudPaginatedResult<T> {
|
|
170
|
+
items: T[];
|
|
171
|
+
total: number;
|
|
172
|
+
page: number;
|
|
173
|
+
pageSize: number;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* CRUD API 接口定义
|
|
177
|
+
* @example
|
|
178
|
+
* ```ts
|
|
179
|
+
* import type { CrudApiDef } from '@h-ai/kit'
|
|
180
|
+
*
|
|
181
|
+
* // 应用适配层把持久化查询结果转为此结构,失败应拒绝 Promise。
|
|
182
|
+
* function listAdapter(list: CrudApiDef<{ id: string }>['list']): CrudApiDef<{ id: string }> { return { list } }
|
|
183
|
+
* ```
|
|
184
|
+
*/
|
|
185
|
+
interface CrudApiDef<T = Record<string, unknown>> {
|
|
186
|
+
/** 获取分页列表 */
|
|
187
|
+
list: (params: CrudPaginationParams & CrudFilterParams) => Promise<CrudPaginatedResult<T>>;
|
|
188
|
+
/** 获取单条记录 */
|
|
189
|
+
get?: (id: string) => Promise<T | null>;
|
|
190
|
+
/** 新建记录 */
|
|
191
|
+
create?: (data: Partial<T>) => Promise<T>;
|
|
192
|
+
/** 更新记录(patch) */
|
|
193
|
+
update?: (id: string, data: Partial<T>) => Promise<T>;
|
|
194
|
+
/** 删除记录 */
|
|
195
|
+
remove?: (id: string) => Promise<void>;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* CRUD 资源定义
|
|
199
|
+
* @example
|
|
200
|
+
* ```ts
|
|
201
|
+
* import type { CrudApiDef, CrudResourceDef } from '@h-ai/kit'
|
|
202
|
+
*
|
|
203
|
+
* function articles(api: CrudApiDef<{ id: string, title: string }>): CrudResourceDef<{ id: string, title: string }> {
|
|
204
|
+
* return { name: 'article', label: 'Articles', fields: [{ id: 'title', label: 'Title', type: 'string' }], api }
|
|
205
|
+
* }
|
|
206
|
+
* ```
|
|
207
|
+
*/
|
|
208
|
+
interface CrudResourceDef<T = Record<string, unknown>> {
|
|
209
|
+
/** 资源名称(如 'user', 'role'),用于 URL 路由 */
|
|
210
|
+
name: string;
|
|
211
|
+
/** 显示名称(面包屑、标题用,支持 i18n) */
|
|
212
|
+
label: CrudText;
|
|
213
|
+
/** 主键字段名(默认 'id') */
|
|
214
|
+
keyField?: string;
|
|
215
|
+
/** 字段列表 */
|
|
216
|
+
fields: CrudFieldDef[];
|
|
217
|
+
/** API 接口 */
|
|
218
|
+
api: CrudApiDef<T>;
|
|
219
|
+
/** 默认分页大小(默认 20) */
|
|
220
|
+
defaultPageSize?: number;
|
|
221
|
+
/** 是否支持搜索(默认 true) */
|
|
222
|
+
searchable?: boolean;
|
|
223
|
+
/** 搜索占位符 */
|
|
224
|
+
searchPlaceholder?: CrudText;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* DataTable 列配置(适配 @h-ai/ui DataTable)
|
|
228
|
+
* @example
|
|
229
|
+
* ```ts
|
|
230
|
+
* import type { CrudTableColumn } from '@h-ai/kit'
|
|
231
|
+
*
|
|
232
|
+
* const value: CrudTableColumn = { key: 'title', label: 'Title' }
|
|
233
|
+
* void value
|
|
234
|
+
* ```
|
|
235
|
+
*/
|
|
236
|
+
interface CrudTableColumn {
|
|
237
|
+
key: string;
|
|
238
|
+
label: string;
|
|
239
|
+
width?: string;
|
|
240
|
+
align?: 'left' | 'center' | 'right';
|
|
241
|
+
render?: (item: Record<string, unknown>) => string;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* CRUD 操作对象(由 defineCrud 返回)
|
|
245
|
+
* @example
|
|
246
|
+
* ```ts
|
|
247
|
+
* import type { CrudOperations } from '@h-ai/kit'
|
|
248
|
+
*
|
|
249
|
+
* function columns(resource: CrudOperations<{ id: string }>) { return resource.toTableColumns() }
|
|
250
|
+
* ```
|
|
251
|
+
*/
|
|
252
|
+
interface CrudOperations<T = Record<string, unknown>> {
|
|
253
|
+
/** 资源元信息 */
|
|
254
|
+
resource: CrudResourceDef<T>;
|
|
255
|
+
/** 获取列表列字段(inList=true) */
|
|
256
|
+
getListFields: () => CrudFieldDef[];
|
|
257
|
+
/** 获取过滤字段(filterable=true) */
|
|
258
|
+
getFilterFields: () => CrudFieldDef[];
|
|
259
|
+
/** 获取新建表单字段(inCreate=true) */
|
|
260
|
+
getCreateFields: () => CrudFieldDef[];
|
|
261
|
+
/** 获取编辑表单字段(inEdit=true) */
|
|
262
|
+
getEditFields: () => CrudFieldDef[];
|
|
263
|
+
/** 获取详情字段(inDetail=true) */
|
|
264
|
+
getDetailFields: () => CrudFieldDef[];
|
|
265
|
+
/** 构建 DataTable 列配置 */
|
|
266
|
+
toTableColumns: () => CrudTableColumn[];
|
|
267
|
+
/** 构建新建时的默认值 */
|
|
268
|
+
getDefaultValues: () => Record<string, unknown>;
|
|
269
|
+
/** API 操作代理 */
|
|
270
|
+
api: CrudApiDef<T>;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* @h-ai/kit — CRUD 操作定义
|
|
275
|
+
*
|
|
276
|
+
* 声明式 CRUD 资源定义工厂函数。
|
|
277
|
+
* @module kit-crud
|
|
278
|
+
*/
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* 解析 CrudText 为字符串
|
|
282
|
+
*/
|
|
283
|
+
declare function resolveText(text: CrudText): string;
|
|
284
|
+
/**
|
|
285
|
+
* 解析选项列表
|
|
286
|
+
*/
|
|
287
|
+
declare function resolveOptions(options: CrudFieldOptions | undefined): Array<{
|
|
288
|
+
label: string;
|
|
289
|
+
value: string | number | boolean;
|
|
290
|
+
}>;
|
|
291
|
+
/**
|
|
292
|
+
* 定义 CRUD 资源
|
|
293
|
+
*
|
|
294
|
+
* 返回 CrudOperations 对象,包含字段过滤、列构建和 API 代理等能力。
|
|
295
|
+
* 与 @h-ai/ui 的 CrudPage 组件配合使用。
|
|
296
|
+
*
|
|
297
|
+
* @param resource - 资源定义
|
|
298
|
+
* @returns CRUD 操作对象
|
|
299
|
+
* @example
|
|
300
|
+
* ```ts
|
|
301
|
+
* import { kit } from '@h-ai/kit'
|
|
302
|
+
*
|
|
303
|
+
* import type { CrudApiDef } from '@h-ai/kit'
|
|
304
|
+
*
|
|
305
|
+
* function articleResource(api: CrudApiDef<{ id: string, title: string }>) {
|
|
306
|
+
* return kit.crud.define({ name: 'article', label: 'Articles', fields: [{ id: 'title', label: 'Title', type: 'string' }], api })
|
|
307
|
+
* }
|
|
308
|
+
* ```
|
|
309
|
+
*/
|
|
310
|
+
declare function defineCrud<T = Record<string, unknown>>(resource: CrudResourceDef<T>): CrudOperations<T>;
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* @h-ai/kit — 宿主配置
|
|
314
|
+
*
|
|
315
|
+
* 为 `config/_kit.yml` 提供监听、传输与请求策略的默认值和校验。
|
|
316
|
+
* 服务端消费完整配置;浏览器仅接收显式投影的 transport 公共字段。
|
|
317
|
+
* @module kit-config
|
|
318
|
+
*/
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* `config/_kit.yml` 对应的配置 Schema。
|
|
322
|
+
* @example
|
|
323
|
+
* ```ts
|
|
324
|
+
* import { KitConfigSchema } from '@h-ai/kit'
|
|
325
|
+
*
|
|
326
|
+
* const config = KitConfigSchema.parse({ server: { port: 3000 }, transport: false })
|
|
327
|
+
* void config
|
|
328
|
+
* ```
|
|
329
|
+
*/
|
|
330
|
+
declare const KitConfigSchema: z.ZodPipe<z.ZodObject<{
|
|
331
|
+
server: z.ZodOptional<z.ZodObject<{
|
|
332
|
+
host: z.ZodDefault<z.ZodString>;
|
|
333
|
+
port: z.ZodDefault<z.ZodNumber>;
|
|
334
|
+
}, z.core.$strip>>;
|
|
335
|
+
transport: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodObject<{
|
|
336
|
+
maxPlaintextBytes: z.ZodOptional<z.ZodPipe<z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"auto">]>, z.ZodTransform<number | undefined, number | "auto">>>;
|
|
337
|
+
routePlaintextBytes: z.ZodOptional<z.ZodRecord<z.ZodCustom<`/${string}`, `/${string}`>, z.ZodNumber>>;
|
|
338
|
+
keyExchangePath: z.ZodDefault<z.ZodCustom<`/${string}`, `/${string}`>>;
|
|
339
|
+
excludePaths: z.ZodDefault<z.ZodArray<z.ZodCustom<`/${string}`, `/${string}`>>>;
|
|
340
|
+
}, z.core.$strip>]>>;
|
|
341
|
+
trustedProxies: z.ZodDefault<z.ZodUnion<readonly [z.ZodLiteral<"auto">, z.ZodArray<z.ZodUnion<readonly [z.ZodIPv4, z.ZodIPv6, z.ZodCIDRv4, z.ZodCIDRv6]>>]>>;
|
|
342
|
+
access: z.ZodDefault<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodObject<{
|
|
343
|
+
file: z.ZodString;
|
|
344
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
345
|
+
global: z.ZodOptional<z.ZodObject<{
|
|
346
|
+
allowIps: z.ZodDefault<z.ZodArray<z.ZodUnion<readonly [z.ZodIPv4, z.ZodIPv6, z.ZodCIDRv4, z.ZodCIDRv6]>>>;
|
|
347
|
+
denyIps: z.ZodDefault<z.ZodArray<z.ZodUnion<readonly [z.ZodIPv4, z.ZodIPv6, z.ZodCIDRv4, z.ZodCIDRv6]>>>;
|
|
348
|
+
timezone: z.ZodDefault<z.ZodString>;
|
|
349
|
+
windows: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
350
|
+
days: z.ZodArray<z.ZodNumber>;
|
|
351
|
+
start: z.ZodString;
|
|
352
|
+
end: z.ZodString;
|
|
353
|
+
}, z.core.$strict>>>;
|
|
354
|
+
}, z.core.$strict>>;
|
|
355
|
+
rules: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
356
|
+
allowIps: z.ZodDefault<z.ZodArray<z.ZodUnion<readonly [z.ZodIPv4, z.ZodIPv6, z.ZodCIDRv4, z.ZodCIDRv6]>>>;
|
|
357
|
+
denyIps: z.ZodDefault<z.ZodArray<z.ZodUnion<readonly [z.ZodIPv4, z.ZodIPv6, z.ZodCIDRv4, z.ZodCIDRv6]>>>;
|
|
358
|
+
timezone: z.ZodDefault<z.ZodString>;
|
|
359
|
+
windows: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
360
|
+
days: z.ZodArray<z.ZodNumber>;
|
|
361
|
+
start: z.ZodString;
|
|
362
|
+
end: z.ZodString;
|
|
363
|
+
}, z.core.$strict>>>;
|
|
364
|
+
id: z.ZodString;
|
|
365
|
+
paths: z.ZodArray<z.ZodString>;
|
|
366
|
+
methods: z.ZodDefault<z.ZodArray<z.ZodEnum<{
|
|
367
|
+
GET: "GET";
|
|
368
|
+
HEAD: "HEAD";
|
|
369
|
+
POST: "POST";
|
|
370
|
+
PUT: "PUT";
|
|
371
|
+
PATCH: "PATCH";
|
|
372
|
+
DELETE: "DELETE";
|
|
373
|
+
OPTIONS: "OPTIONS";
|
|
374
|
+
CONNECT: "CONNECT";
|
|
375
|
+
TRACE: "TRACE";
|
|
376
|
+
}>>>;
|
|
377
|
+
encryption: z.ZodOptional<z.ZodEnum<{
|
|
378
|
+
required: "required";
|
|
379
|
+
disabled: "disabled";
|
|
380
|
+
}>>;
|
|
381
|
+
}, z.core.$strict>>>;
|
|
382
|
+
}, z.core.$strict>]>>;
|
|
383
|
+
}, z.core.$strip>, z.ZodTransform<{
|
|
384
|
+
server: KitServerConfig;
|
|
385
|
+
transport: false | KitTransportConfig;
|
|
386
|
+
trustedProxies: string[] | "auto";
|
|
387
|
+
access: false | {
|
|
388
|
+
file: string;
|
|
389
|
+
} | {
|
|
390
|
+
rules: {
|
|
391
|
+
allowIps: string[];
|
|
392
|
+
denyIps: string[];
|
|
393
|
+
timezone: string;
|
|
394
|
+
windows: {
|
|
395
|
+
days: number[];
|
|
396
|
+
start: string;
|
|
397
|
+
end: string;
|
|
398
|
+
}[];
|
|
399
|
+
id: string;
|
|
400
|
+
paths: string[];
|
|
401
|
+
methods: ("GET" | "HEAD" | "POST" | "PUT" | "PATCH" | "DELETE" | "OPTIONS" | "CONNECT" | "TRACE")[];
|
|
402
|
+
encryption?: "required" | "disabled" | undefined;
|
|
403
|
+
}[];
|
|
404
|
+
global?: {
|
|
405
|
+
allowIps: string[];
|
|
406
|
+
denyIps: string[];
|
|
407
|
+
timezone: string;
|
|
408
|
+
windows: {
|
|
409
|
+
days: number[];
|
|
410
|
+
start: string;
|
|
411
|
+
end: string;
|
|
412
|
+
}[];
|
|
413
|
+
} | undefined;
|
|
414
|
+
};
|
|
415
|
+
}, {
|
|
416
|
+
trustedProxies: string[] | "auto";
|
|
417
|
+
access: false | {
|
|
418
|
+
file: string;
|
|
419
|
+
} | {
|
|
420
|
+
rules: {
|
|
421
|
+
allowIps: string[];
|
|
422
|
+
denyIps: string[];
|
|
423
|
+
timezone: string;
|
|
424
|
+
windows: {
|
|
425
|
+
days: number[];
|
|
426
|
+
start: string;
|
|
427
|
+
end: string;
|
|
428
|
+
}[];
|
|
429
|
+
id: string;
|
|
430
|
+
paths: string[];
|
|
431
|
+
methods: ("GET" | "HEAD" | "POST" | "PUT" | "PATCH" | "DELETE" | "OPTIONS" | "CONNECT" | "TRACE")[];
|
|
432
|
+
encryption?: "required" | "disabled" | undefined;
|
|
433
|
+
}[];
|
|
434
|
+
global?: {
|
|
435
|
+
allowIps: string[];
|
|
436
|
+
denyIps: string[];
|
|
437
|
+
timezone: string;
|
|
438
|
+
windows: {
|
|
439
|
+
days: number[];
|
|
440
|
+
start: string;
|
|
441
|
+
end: string;
|
|
442
|
+
}[];
|
|
443
|
+
} | undefined;
|
|
444
|
+
};
|
|
445
|
+
server?: {
|
|
446
|
+
host: string;
|
|
447
|
+
port: number;
|
|
448
|
+
} | undefined;
|
|
449
|
+
transport?: false | {
|
|
450
|
+
keyExchangePath: `/${string}`;
|
|
451
|
+
excludePaths: `/${string}`[];
|
|
452
|
+
maxPlaintextBytes?: number | undefined;
|
|
453
|
+
routePlaintextBytes?: Record<`/${string}`, number> | undefined;
|
|
454
|
+
} | undefined;
|
|
455
|
+
}>>;
|
|
456
|
+
/**
|
|
457
|
+
* 解析 transport 配置并补齐默认值。
|
|
458
|
+
*
|
|
459
|
+
* @param input - `config/_kit.yml` 中的 transport 配置
|
|
460
|
+
* @returns 完整 transport 配置;`false` 表示关闭
|
|
461
|
+
* @example
|
|
462
|
+
* ```ts
|
|
463
|
+
* import { resolveKitTransportConfig } from '@h-ai/kit'
|
|
464
|
+
*
|
|
465
|
+
* const transport = resolveKitTransportConfig({ excludePaths: ['/api/health'] })
|
|
466
|
+
* if (transport) void transport.keyExchangePath
|
|
467
|
+
* ```
|
|
468
|
+
*/
|
|
469
|
+
declare function resolveKitTransportConfig(input?: false | KitTransportConfigInput): false | KitTransportConfig;
|
|
470
|
+
/**
|
|
471
|
+
* 解析 `config/_kit.yml` 顶层配置并补齐默认值。
|
|
472
|
+
*
|
|
473
|
+
* 适合同一份配置同时供 SvelteKit 服务端 hook 与浏览器端 client 读取。
|
|
474
|
+
* @param input - Kit 监听和公开 transport 输入;省略字段按 Schema 补默认值。
|
|
475
|
+
* @returns 已补齐默认值的配置;不合法输入抛出 ZodError。
|
|
476
|
+
* @example
|
|
477
|
+
* ```ts
|
|
478
|
+
* import { resolveKitConfig } from '@h-ai/kit'
|
|
479
|
+
*
|
|
480
|
+
* const config = resolveKitConfig({ transport: false })
|
|
481
|
+
* void config.server.port
|
|
482
|
+
* ```
|
|
483
|
+
*/
|
|
484
|
+
declare function resolveKitConfig(input?: KitConfigInput): KitConfig;
|
|
485
|
+
|
|
486
|
+
/**
|
|
487
|
+
* 设置浏览器应用语言或 Node 启动默认语言;请求中只更新当前 runWithLocale 上下文。
|
|
488
|
+
*
|
|
489
|
+
* 通过 @h-ai/core 的集中式 locale 管理器,一次调用即可同步所有模块。
|
|
490
|
+
* 各模块的 createMessageGetter 优先读取当前 Node 请求上下文;SSR 必须包裹实际 resolve。
|
|
491
|
+
* @param locale - 支持的应用默认语言;请求中应使用上下文隔离。
|
|
492
|
+
* @example
|
|
493
|
+
* ```ts
|
|
494
|
+
* import { kit } from '@h-ai/kit'
|
|
495
|
+
*
|
|
496
|
+
* // 应用启动时设置默认语言;请求内使用 runWithLocale。
|
|
497
|
+
* kit.i18n.setLocale('en-US')
|
|
498
|
+
* ```
|
|
499
|
+
*/
|
|
500
|
+
declare function setAllModulesLocale(locale: string): void;
|
|
501
|
+
|
|
502
|
+
export { type CrudApiDef as C, KitConfigSchema as K, resolveKitTransportConfig as a, type CrudFieldDef as b, type CrudFieldOption as c, defineCrud as d, type CrudFieldOptions as e, type CrudFieldType as f, type CrudFieldValidation as g, type CrudFilterParams as h, type CrudOperations as i, type CrudPaginatedResult as j, type CrudPaginationParams as k, type CrudResourceDef as l, type CrudTableColumn as m, type CrudText as n, resolveOptions as o, resolveText as p, resolveKitConfig as r, setAllModulesLocale as s };
|