@aalis/schema-config 0.13.0 → 0.14.0

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.md CHANGED
@@ -1,28 +1,84 @@
1
1
  # @aalis/schema-config
2
2
 
3
- 配置表单 Schema 词汇契约包:`ConfigSchema` / `SchemaField` / `SchemaGroup` / `SchemaArray` 及 `SchemaFieldTypes` 扩展点,另含对这套词汇的中立解释函数 `defaultsFrom` / `validateConfig` / `removeExtraFields`,配置危险键闸与拷贝 `isUnsafeConfigKey` / `cloneConfigObject`,以及插件因配置问题无法激活时在 `apply` 里抛出的 `configError` / `missingConfigError`(后者用于缺必填项;name 为 `ConfigError`、不带 stack,激活失败日志只有一行,不像程序崩溃)。
3
+ 配置表单 Schema 词汇契约包:`ConfigSchema` / `SchemaField` / `SchemaGroup` / `SchemaArray` 及 `SchemaFieldTypes` 扩展点;声明与读取插件配置的 `defineConfig` / `ConfigOf` / `parseConfig`;对这套词汇的中立解释函数 `defaultsFrom` / `deepMergeDefaults` / `validateConfig` / `removeExtraFields`,配置危险键闸与拷贝 `isUnsafeConfigKey` / `cloneConfigObject`,以及插件因配置问题无法激活时在 `apply` 里抛出的 `configError` / `missingConfigError`(后者用于缺必填项;name 为 `ConfigError`、不带 stack,激活失败日志只有一行,不像程序崩溃)。
4
4
 
5
- `@aalis/core` 把插件的 `configSchema` 当作 opaque 数据透传、不解释任何字段;表单词汇(label / options / textarea …)属呈现层,统一住在本包。插件用它给自己的 `configSchema` 做形状检查,渲染宿主(WebUI)与宿主政策(runtime 的配置同步)用它消费 schema。
5
+ `@aalis/core` 把插件的 `configSchema` 当作 opaque 数据透传、不解释任何字段;表单词汇(label / options / textarea …)属呈现层,统一住在本包。同一份 schema 既是表单描述,又是插件配置值类型的来源(`ConfigOf`)和运行时解析规则(`parseConfig`);渲染宿主(WebUI)与宿主政策(runtime 的配置同步)也用它消费 schema。
6
6
 
7
7
  零运行时依赖:对 `@aalis/core` 只有 type-only 锚点(以 peer 依赖声明)。字段类型可由其他 api 包经 declaration merging 扩展(如 `api-llm` 注入 `'llm-ref'`)。
8
8
 
9
+ ## 声明与读取
10
+
11
+ ```ts
12
+ import { config, definePlugin, logger } from '@aalis/core';
13
+ import { defineConfig, parseConfig } from '@aalis/schema-config';
14
+
15
+ const configSchema = defineConfig({
16
+ apiKey: { type: 'string', label: 'API Key', required: true },
17
+ port: { type: 'number', label: '端口', default: 8080, min: 1, max: 65535, integer: true },
18
+ mode: {
19
+ type: 'select',
20
+ label: '模式',
21
+ default: 'fast',
22
+ options: [
23
+ { label: '快', value: 'fast' },
24
+ { label: '稳', value: 'safe' },
25
+ ],
26
+ },
27
+ });
28
+
29
+ export default definePlugin({
30
+ name: '@your-scope/plugin-x',
31
+ configSchema,
32
+ uses: { config, logger },
33
+ apply({ config, logger }) {
34
+ const cfg = parseConfig(configSchema, config, logger);
35
+ // cfg: { apiKey: string; port: number; mode: 'fast' | 'safe' }
36
+ },
37
+ });
38
+ ```
39
+
40
+ - **`defineConfig(schema)`**:运行时原样返回传入的对象(不冻结、不加任何属性,WebUI 读的就是这个活对象),类型层保留字面量,返回值可直接放进 `definePlugin({ configSchema })`。不要给变量标 `ConfigSchema` 类型注解,注解会把字面量拓宽掉,`ConfigOf` 只能推出宽类型。推出的类型里各属性只读、`options` 是字面量元组;需要在运行时改写 schema(如按已注册的服务补全选项)时,经 `ConfigSchema` 或 `SchemaField` 类型的引用改写。
41
+ - **`ConfigOf<S>`**:从 schema 推导配置值类型。字段取 `SchemaFieldTypes` 里登记的取值类型(见下表);select / multiselect 有静态 `options`、没有 `dynamicOptions` 且 `allowCustom` 不为 `true` 时收窄为选项值的字面量联合,数字选项对应数字字面量。有 `default` 或 `required: true` 的字段必定存在,其余为可选;分组推为嵌套对象,总是存在;数组推为元素类型的数组,元素按同一规则推导。
42
+ - **`parseConfig(schema, raw, logger?)`**:按 schema 解析插件拿到的配置,返回 `ConfigOf` 类型的新对象,不改入参。之后的夹紧、跨字段约束等核对作用于返回值。
43
+
9
44
  ## 字段类型
10
45
 
11
- 本包内置的中立类型,以及 `validateConfig` 对取值的检查(`undefined` / `null` 视为未配置,只在 `required` 且无 `default` 时报缺):
46
+ 本包内置的中立类型。「判定」一列是 `validateConfig` 与 `parseConfig` 共用的逐字段规则:
12
47
 
13
- | type | 取值 | validateConfig 检查 |
48
+ | type | 取值类型(`ConfigOf`) | 判定 |
14
49
  |---|---|---|
15
- | `string` / `textarea` | `string` | 类型;声明了 `pattern` 时按正则匹配 |
16
- | `number` | 有限数值 | 类型;`min` / `max` / `integer` |
17
- | `boolean` | `boolean` | 类型 |
18
- | `select` | `string` 或 `number` | 类型(`options` 不是取值白名单) |
19
- | `multiselect` | `(string \| number)[]` | 数组及元素类型;集合语义,WebUI 以勾选框编辑,不能表达重复项 |
20
- | `list` | `string[]` | 数组及元素类型;有序,允许重复(如命令行参数) |
21
- | `map` | `Record<string, string>` | 对象及每个值的类型(如环境变量表) |
50
+ | `string` / `textarea` | `string` | 字符串;有限数字按字符串收;声明了 `pattern` 时按正则匹配 |
51
+ | `number` | `number` | 有限数值;去掉首尾空白后非空、能完整解析为有限数的字符串按数字收;`min` / `max` / `integer` |
52
+ | `boolean` | `boolean` | 类型,不做转换 |
53
+ | `select` | 选项值的字面量联合,否则 `string` | 字符串或有限数字;有静态 `options`、没有 `dynamicOptions` 且 `allowCustom` 不为 `true` 时须是某个选项值 |
54
+ | `multiselect` | 选项值字面量联合的数组,否则 `string[]` | 数组;元素同 `select`;集合语义,WebUI 以勾选框编辑,不能表达重复项 |
55
+ | `list` | `string[]` | 数组,元素按字符串判定;有序,允许重复(如命令行参数) |
56
+ | `map` | `Record<string, string>` | 对象,每个值按字符串判定(如环境变量表) |
57
+
58
+ - **标量宽容**:YAML 里不加引号的纯数字(QQ 号、口令、端口、环境变量值)在期望字符串的位置照常可用,加了引号的数字在期望数字的位置照常可用;`parseConfig` 返回换算后的值。
59
+ - **选项即取值范围**:选项按字符串比较,`parseConfig` 取选项声明的原值(WebUI 把数字选项存成字符串,读出时归位成数字)。
60
+ - **`dynamicOptions` / `allowCustom`**:两者影响取值判定,由本包声明。`dynamicOptions` 是动态选项来源的服务名(WebUI 经 webui-server 调该服务的 `listModels()` 或等价方法获取选项),声明后静态 `options` 不再是取值范围,只查取值是字符串或数字;`allowCustom` 表示接受选项之外的值,不查是否在选项内:WebUI 给 multiselect 提供手动输入;select 用它表示静态选项不全(例如由插件在运行时补全选项的字段)。只影响 WebUI 呈现的 `secret` 由 `@aalis/api-webui` 注入。
61
+ - **扩展字段类型**:api 包经 declaration merging 往 `SchemaFieldTypes` 登记类型名与取值类型(如 `'llm-ref': ModelRef`),`ConfigOf` 据此推导。本包不校验外来类型的取值:`validateConfig` 跳过,`parseConfig` 除把 `''` 当作未配置外原样透传。
62
+
63
+ ## parseConfig 的处置
64
+
65
+ - **缺失**:`undefined` 与 `null`(YAML 裸键);`required` 字段另把 `''` 当作缺失(WebUI 与脚手架用 `''` 表示未填),外来类型的 `''` 一律当作缺失(WebUI 给未选的 `llm-ref` 存 `''`)。有 `default` 用 `default` 的拷贝;无 `default` 且 `required` 不可恢复;否则省略该键。
66
+ - **无效**(不符合上表的判定):未声明 `onInvalid` 时保持宽容处置:有 `default` 回落并告警;无 `default` 且 `required` 不可恢复;否则省略并告警。字段声明 `onInvalid: 'error'` 时,显式无效值即使有 `default` 也抛 `ConfigError`;它不改变 `required` 的缺省含义,`undefined` / `null` 仍走上述缺省规则。
67
+ - **list / map / multiselect**:默认坏元素、坏值逐个丢弃并告警,其余保留;稀疏数组的空位和 map 的保留键也属于坏成员。严格字段只要含一个坏成员就拒绝整个值,不返回部分结果。
68
+ - **分组**:值不是对象时默认告警,整组按空对象解析,子字段各取默认值。显式给非对象且分组含严格字段时拒绝;`undefined` / `null` 仍视为缺省。
69
+ - **数组**:值不是数组按无效处理,含严格元素字段时显式无效的数组值会被拒绝;元素不是对象、或元素内有不可恢复的字段时只丢这一条元素并告警,邻居元素照常解析;元素字段的默认值逐元素补齐(runtime 的配置同步不补数组元素的默认值)。
70
+ - **整体配置**:显式非对象且 schema 含严格字段时拒绝;`undefined` / `null` 仍视为缺省。严格错误说明字段路径与安全的类型或约束原因;集合的下标可定位,map 的键可能含密钥,因此错误只定位到 map 字段,不写用户值或键。
71
+ - **schema 外的键**:丢弃并告警。runtime 已先裁掉顶层与分组内的,这里主要覆盖数组元素,以及不经 runtime 的宿主。
72
+ - **不可恢复**(顶层或分组内):缺失抛 `missingConfigError`,无效抛 `configError`,插件随之进 error 态,在 WebUI 保存或配置文件热重载后重试激活。
73
+ - **告警文案**:`配置项 <路径> <原因>,改用默认值 <JSON>`、`配置项 <路径> <原因>,已忽略`、`配置项 <数组路径>[i] 已忽略:<字段> <原因>`。只写路径、类型名与约束,不写原值(可能是密钥);默认值会写出。
74
+
75
+ 数组也可声明 `onInvalid: 'error'`:非对象元素或元素内不可恢复的字段会拒绝整个数组,避免丢弃坏项后触发空数组的业务默认;元素内普通字段仍按自身的回落策略解析。未声明时继续逐项跳过,适合相互独立的 server 列表。
76
+
77
+ `validateConfig(schema, config)` 用同一份判定做只读检查,返回问题清单(`kind` 为 `missing` 或 `invalid`),不转换、不回填、不裁剪;它只把 `undefined` / `null` 当作未配置,只在 `required` 且无 `default` 时报缺。`onInvalid` 改变 `parseConfig` 的处置,不改变校验器的判定或报告。宿主用它告警或拦截保存:runtime 的配置同步对启用中的插件打告警,WebUI 保存插件配置时拒绝本次新引入的 `invalid`。
22
78
 
23
79
  `list` 与 `map` 的补充约定:
24
80
 
25
- - **默认值**:`default` 分别写数组与对象,`defaultsFrom` 按值拷贝。runtime 的配置同步合并默认值时递归合并对象,因此顶层或分组里的 `map` 会按键补齐:默认映射中的键总会回到用户配置里,删掉也无效。需要用户可删除的预置条目时,默认值写 `{}`,由插件代码兜底。`list` 不参与合并,用户配置了就整体采用。
81
+ - **默认值**:`default` 分别写数组与对象,`defaultsFrom` 按值拷贝。`deepMergeDefaults` 合并默认值时递归合并对象(runtime 的配置同步与 WebUI 保存插件配置都用它),因此顶层或分组里的 `map` 会按键补齐:默认映射中的键总会回到用户配置里,删掉也无效。需要用户可删除的预置条目时,默认值写 `{}`,由插件代码兜底。`list` 不参与合并,用户配置了就整体采用。
26
82
  - **未知字段裁剪**:`removeExtraFields` 把 `map` 当作叶子整体保留,不按键裁剪。
27
83
  - **缺省 UI**(WebUI 的 SchemaForm):两者都渲染为多行文本框。`list` 每行一项,空白行忽略;`map` 每行一条 `KEY=VALUE`,按第一个 `=` 切分,键去掉首尾空白,值原样保留,缺少 `=` 或键为空的行不保存。现有的数字、布尔项或值按字符串显示,编辑后写成字符串;其余无法按这套规则逐行表达的值(项或值本身含换行、`list` 含空白项、`null`、嵌套的数组或对象等)会让该字段只读显示,需在配置文件中编辑。旧版存下的空串按空列表 / 空映射显示,保存时写成 `[]` / `{}`。
28
84
 
@@ -40,3 +96,5 @@
40
96
  就是一次 minor,届时所有已发布消费者的范围会拒收新版,node_modules 里出现两份副本——而
41
97
  declaration merging 是按模块副本生效的,`SchemaFieldTypes` / `SchemaField` 的合并面会就此裂开
42
98
  (一份合并了 `'llm-ref'`,另一份没有)。宽区间让整个 0.x 段自由流动,加词汇零级联。
99
+
100
+ 解析以调用方传入的值为准。宿主与 Core 的配置拷贝会移除 `__proto__` / `constructor` / `prototype` 保留键,`parseConfig` 无法诊断在上游已被删除的条目;配置字典(含 env)不能使用这些键。
package/dist/index.d.ts CHANGED
@@ -2,34 +2,39 @@
2
2
  * Schema 字段类型注册表 —— declaration merging 扩展点。
3
3
  *
4
4
  * 本包只内置基础类型;带业务语义的类型由对应 api 包合并声明
5
- * (如 `'llm-ref'` 由 @aalis/api-llm 注入)。key 即类型名,value 恒为 true。
5
+ * (如 `'llm-ref'` 由 @aalis/api-llm 注入)。key 即类型名,value 是该类型的取值类型,
6
+ * {@link ConfigOf} 据此推导配置值类型。
6
7
  *
7
8
  * ```ts
8
9
  * declare module '@aalis/schema-config' {
9
10
  * interface SchemaFieldTypes {
10
- * 'llm-ref': true;
11
+ * 'llm-ref': ModelRef;
11
12
  * }
12
13
  * }
13
14
  * ```
15
+ *
16
+ * 外来类型的取值不经本包校验:parseConfig 除把 `''` 当作未配置外原样透传,value 只是类型层的声明。
14
17
  */
15
18
  export interface SchemaFieldTypes {
16
- string: true;
17
- number: true;
18
- boolean: true;
19
- select: true;
20
- multiselect: true;
21
- textarea: true;
22
- /** 有序字符串列表(`string[]`):保序、允许重复;与 multiselect 的集合语义不同 */
23
- list: true;
24
- /** 字符串映射(`Record<string, string>`),如环境变量表 */
25
- map: true;
19
+ string: string;
20
+ number: number;
21
+ boolean: boolean;
22
+ /** 有静态 options、没有 dynamicOptions 且 allowCustom 不为 true 时,ConfigOf 收窄为选项值的字面量联合 */
23
+ select: string;
24
+ /** 有静态 options、没有 dynamicOptions 且 allowCustom 不为 true 时,ConfigOf 收窄为选项值字面量联合的数组 */
25
+ multiselect: string[];
26
+ textarea: string;
27
+ /** 有序字符串列表:保序、允许重复;与 multiselect 的集合语义不同 */
28
+ list: string[];
29
+ /** 字符串映射,如环境变量表 */
30
+ map: Record<string, string>;
26
31
  }
27
32
  export type SchemaFieldType = keyof SchemaFieldTypes & string;
28
33
  /**
29
34
  * 单个配置字段。
30
35
  *
31
- * 只声明所有渲染宿主共需的字段;单一宿主的交互属性
32
- * (如 `secret` / `dynamicOptions` / `allowCustom`)由消费它们的宿主 api 包
36
+ * 声明各渲染宿主共需的字段,以及影响取值判定的属性(`dynamicOptions` / `allowCustom`);
37
+ * 只影响单一宿主呈现的交互属性(如 `secret`)由消费它们的宿主 api 包
33
38
  * (@aalis/api-webui)通过 declaration merging 注入。
34
39
  */
35
40
  export interface SchemaField {
@@ -38,20 +43,35 @@ export interface SchemaField {
38
43
  description?: string;
39
44
  default?: unknown;
40
45
  required?: boolean;
41
- /** select / multiselect 类型的静态选项 */
46
+ /** 显式配置的值无效时拒绝激活;缺省仍按 default / required 处理,省略时保持宽容回落 */
47
+ onInvalid?: 'error';
48
+ /**
49
+ * select / multiselect 类型的静态选项。没有 dynamicOptions、allowCustom 不为 true 时即取值范围:
50
+ * 值按字符串与选项值比较,parseConfig 取选项声明的原值(数字选项存成字符串也能归位)
51
+ */
42
52
  options?: Array<{
43
53
  label: string;
44
54
  value: string | number;
45
55
  }>;
46
- /** number:数值下限(含),validateConfig 强制。无 default 的 number 表单不预填(留空=走服务端默认),带 min 仍建议声明 default 以免长期处于缺失告警 */
56
+ /**
57
+ * select / multiselect 的动态选项来源:服务名(WebUI 经 webui-server 调该服务的 listModels() 或等价方法获取选项)。
58
+ * 声明后静态 options 不再是取值范围:parseConfig / validateConfig 只查取值是字符串或数字,ConfigOf 推为 string / string[]
59
+ */
60
+ dynamicOptions?: string;
61
+ /**
62
+ * 是否允许选项之外的值。为 true 时 parseConfig / validateConfig 不查取值是否在选项内,ConfigOf 推为 string / string[]。
63
+ * WebUI 只给 multiselect 提供手动输入;select 用它表示静态选项不全(例如由插件在运行时补全选项的字段)
64
+ */
65
+ allowCustom?: boolean;
66
+ /** number:数值下限(含),validateConfig 与 parseConfig 强制。无 default 的 number 表单不预填(留空=走服务端默认),带 min 仍建议声明 default 以免长期处于缺失告警 */
47
67
  min?: number;
48
- /** number:数值上限(含),validateConfig 强制 */
68
+ /** number:数值上限(含),validateConfig 与 parseConfig 强制 */
49
69
  max?: number;
50
- /** number:仅接受整数,validateConfig 强制 */
70
+ /** number:仅接受整数,validateConfig 与 parseConfig 强制 */
51
71
  integer?: boolean;
52
- /** number:步进——纯 UI 提示(浮点取模不可靠),validateConfig 不校验 */
72
+ /** number:步进——纯 UI 提示(浮点取模不可靠),不校验 */
53
73
  step?: number;
54
- /** string / textarea:正则约束(RegExp 源文本,test() 子串语义——要整串匹配请显式 ^…$),validateConfig 强制;模式本身非法则跳过该检查 */
74
+ /** string / textarea:正则约束(RegExp 源文本,test() 子串语义——要整串匹配请显式 ^…$),validateConfig 与 parseConfig 强制;模式本身非法则跳过该检查 */
55
75
  pattern?: string;
56
76
  }
57
77
  export interface SchemaGroup {
@@ -67,9 +87,71 @@ export interface SchemaArray {
67
87
  /** 数组每个元素的字段定义 */
68
88
  items: Record<string, SchemaField>;
69
89
  default?: unknown[];
90
+ /** 遇到非对象元素或元素内不可恢复的字段时拒绝整个数组;默认只丢弃该元素。 */
91
+ onInvalid?: 'error';
70
92
  }
71
93
  /** 配置 Schema:顶层 key 可以是字段、分组或数组 */
72
94
  export type ConfigSchema = Record<string, SchemaField | SchemaGroup | SchemaArray>;
95
+ /**
96
+ * 声明插件的配置 schema:运行时原样返回传入的对象(不冻结、不加任何属性),类型层保留字面量,
97
+ * 供 {@link ConfigOf} 推出配置值类型。返回值可直接放进 `definePlugin({ configSchema })`。
98
+ *
99
+ * 别给变量标 `ConfigSchema` 类型注解:注解会把字面量拓宽掉,ConfigOf 只能推出宽类型。
100
+ * 推出的类型里各属性是只读的、options 是字面量元组;要在运行时改写 schema(WebUI 读的是这个活对象),
101
+ * 经 `ConfigSchema` 类型的引用改写(如 `const live: ConfigSchema = configSchema`)。
102
+ */
103
+ export declare function defineConfig<const S extends ConfigSchema>(schema: S): S;
104
+ /** 展开交叉类型,悬停提示显示成一个对象 */
105
+ type Flatten<T> = {
106
+ [K in keyof T]: T[K];
107
+ } & {};
108
+ /** parseConfig 成功后必定存在的条目:分组、required 字段、声明了 default 的字段与数组 */
109
+ type IsPresent<E> = E extends {
110
+ fields: unknown;
111
+ } ? true : E extends {
112
+ required: true;
113
+ } ? true : E extends {
114
+ default: infer D;
115
+ } ? [D] extends [undefined] ? false : true : false;
116
+ type HasDynamicOptions<E> = E extends {
117
+ dynamicOptions: infer D;
118
+ } ? ([D] extends [undefined] ? false : true) : false;
119
+ /** allowCustom 不是字面量 false 时按可能允许算:宽类型总是安全的 */
120
+ type AllowsCustom<E> = E extends {
121
+ allowCustom: infer A;
122
+ } ? (true extends A ? true : false) : false;
123
+ type StaticOptionValue<E> = E extends {
124
+ options: ReadonlyArray<{
125
+ value: infer V;
126
+ }>;
127
+ } ? V : never;
128
+ /** 有非空静态 options 且没有动态来源时收窄为选项值的字面量联合,否则取宽类型 */
129
+ type ChoiceValue<E> = HasDynamicOptions<E> extends true ? string : [StaticOptionValue<E>] extends [never] ? string : StaticOptionValue<E>;
130
+ type FieldValue<E> = E extends {
131
+ type: 'select';
132
+ } ? AllowsCustom<E> extends true ? string : ChoiceValue<E> : E extends {
133
+ type: 'multiselect';
134
+ } ? (AllowsCustom<E> extends true ? string : ChoiceValue<E>)[] : E extends {
135
+ type: infer T extends keyof SchemaFieldTypes;
136
+ } ? SchemaFieldTypes[T] : unknown;
137
+ type EntryValue<E> = E extends {
138
+ fields: infer F extends ConfigSchema;
139
+ } ? ConfigOf<F> : E extends {
140
+ type: 'array';
141
+ items: infer I extends ConfigSchema;
142
+ } ? ConfigOf<I>[] : FieldValue<E>;
143
+ /**
144
+ * 从 schema 推导 {@link parseConfig} 返回的配置值类型(schema 须经 {@link defineConfig} 声明才保留字面量)。
145
+ *
146
+ * - 字段取 {@link SchemaFieldTypes} 里登记的取值类型;select / multiselect 见该注册表的说明
147
+ * - 有 default 或 `required: true` 的字段必定存在,其余为可选(parseConfig 省略未配置的键)
148
+ * - 分组推为嵌套对象,总是存在;数组推为元素类型的数组,元素按同一规则推导
149
+ */
150
+ export type ConfigOf<S extends ConfigSchema> = Flatten<{
151
+ -readonly [K in keyof S as IsPresent<S[K]> extends true ? K : never]: EntryValue<S[K]>;
152
+ } & {
153
+ -readonly [K in keyof S as IsPresent<S[K]> extends true ? never : K]?: EntryValue<S[K]>;
154
+ }>;
73
155
  /**
74
156
  * core 基础设施配置(name / logLevel / slowThresholdMs)的表单描述。
75
157
  *
@@ -90,6 +172,12 @@ export declare const CORE_CONFIG_SCHEMA: ConfigSchema;
90
172
  * - SchemaGroup:递归 `fields`,总是产出嵌套对象(即使子字段全无默认值)
91
173
  */
92
174
  export declare function defaultsFrom(schema: ConfigSchema | undefined): Record<string, unknown>;
175
+ /**
176
+ * 把默认值(通常是 {@link defaultsFrom} 的结果)深合并进配置:只填充缺失的键,已有的值(含显式 null)不覆盖。
177
+ * 嵌套对象递归合并,只写了半块的分组照样补齐其余默认子键;数组与基础类型按「已存在则保留」处理。
178
+ * 宿主的配置同步与 WebUI 保存插件配置用同一个合并,两条路径写出的配置形状一致。
179
+ */
180
+ export declare function deepMergeDefaults(defaults: Record<string, unknown>, current: Record<string, unknown>): Record<string, unknown>;
93
181
  /**
94
182
  * validateConfig 发现的单条问题。path 以点号/下标定位(如 `server.port`、`hosts[2]`)。
95
183
  * kind 区分两类性质不同的问题,供调用方分级处置:
@@ -105,34 +193,56 @@ export interface SchemaIssue {
105
193
  * 按 ConfigSchema 对配置做只读结构校验,返回问题清单(空数组 = 无问题)。
106
194
  *
107
195
  * 定位与边界:
108
- * - **只读**:不转换、不回填、不裁剪——回填是 defaultsFrom,裁剪是 removeExtraFields。
109
- * 校验器出错的最大代价必须始终是"少一条警告",因此它绝不参与配置取值链路。
110
- * - **只解释中立词汇**:type/required 之外的语义(含宿主经 declaration merging
111
- * 注入的呈现属性,如 secret/allowCustom)一概不解读。
112
- * - **options 不作为取值白名单**:中立契约里 options 只是"静态选项"(呈现语义),
113
- * 是否允许选项外的值由宿主属性(allowCustom)决定,而本包看不见宿主属性,
114
- * 故 select/multiselect 只查原始类型不查成员资格。
196
+ * - **只读**:不转换、不回填、不裁剪——回填是 defaultsFrom,裁剪是 removeExtraFields,取值是 parseConfig。
197
+ * 逐字段判定与 parseConfig 共用同一份:这里报 invalid 的值,parseConfig 会回落、忽略或拒绝。
198
+ * 校验器出错的最大代价必须始终是"少一条警告",因此它对畸形 schema 不抛错。
199
+ * - **只解释本包的词汇**:type/required、约束键与影响取值的 dynamicOptions/allowCustom;
200
+ * 宿主经 declaration merging 注入的呈现属性(如 secret)一概不解读。
201
+ * - **标量宽容**:期望字符串的位置(string/textarea、list 元素、map 值、选项比较)接受有限数字;
202
+ * 期望数字的位置接受去掉首尾空白后能完整解析为有限数的字符串。boolean 不做转换。
203
+ * - **options 即取值范围**:select 有静态 options、没有 dynamicOptions 且 allowCustom 不为 true 时,值须是
204
+ * 某个选项值(按字符串比较);multiselect 同样逐元素判定。
115
205
  * - **约束键**:number 强制 min/max(含边界)与 integer,string/textarea 强制
116
206
  * pattern(模式非法则跳过该检查);step 是纯 UI 提示不校验。约束只在类型
117
207
  * 检查通过后评估——类型都不对时报类型错,不叠报约束错。
118
- * - **list / map**:list 须为数组且每个元素是 string(保序、重复合法);map 须为
119
- * 对象且每个值是 string,逐值报错的路径形如 `env.KEY`。
120
- * - **宽容缺失**:undefined 与 null(YAML 裸键)视为"未配置",仅在 required 且
121
- * 未声明 default 时报缺——顶层/分组的默认值在调用点已合并,数组元素的默认值
208
+ * - **list / map**:list 须为数组、map 须为对象,逐元素 / 逐值报错,路径形如 `args[1]`、`env.KEY`。
209
+ * - **宽容缺失**:undefined 与 null(YAML 裸键)视为"未配置",required 字段的 `''` 也算未配置(WebUI 与脚手架
210
+ * 用 `''` 表示未填,与 parseConfig 一致;空数组仍算已配置),仅在 required 且未声明 default 时报缺——顶层/分组的默认值在调用点已合并,数组元素的默认值
122
211
  * 不参与合并(defaultsFrom 把 SchemaArray 当叶子),靠 default 声明本身放行。
123
212
  *
124
- * 政策留给调用方:config-sync 对启用插件打 warn(不拒载,存量脏值不打死实例;
125
- * 禁用插件的配置是休眠数据,不告警),webui 的 PUT 只拦**新增**的 `invalid`
126
- * (存量问题与 `missing` 放行——拦新不追旧,半成品配置允许落盘)。
213
+ * 政策留给调用方:config-sync 对启用插件打 warn(禁用插件的配置是休眠数据,不告警),
214
+ * webui 的 PUT 只拦**新增**的 `invalid`(存量问题与 `missing` 放行——拦新不追旧,半成品配置允许落盘)。
127
215
  */
128
216
  export declare function validateConfig(schema: ConfigSchema | undefined, config: Record<string, unknown>): SchemaIssue[];
217
+ /**
218
+ * 按 schema 解析插件拿到的配置,返回 {@link ConfigOf} 类型的新对象(不改入参)。插件在 apply 里用它读配置:
219
+ * `const cfg = parseConfig(configSchema, caps.config, caps.logger)`,之后的夹紧、跨字段约束等核对作用于 cfg。
220
+ *
221
+ * - **缺失**:undefined 与 null;required 字段另把 `''` 当作缺失(WebUI 与脚手架用 `''` 表示未填),
222
+ * 外来类型的 `''` 一律当作缺失。有 default 用 default(拷贝),无 default 且 required 不可恢复,否则省略该键。
223
+ * - **无效**:逐字段判定与 validateConfig 共用(标量宽容、选项即取值范围、约束键)。
224
+ * 默认有 default 回落并告警;无 default 且 required 不可恢复;否则省略并告警。
225
+ * `onInvalid: 'error'` 的字段遇到显式无效值或坏集合成员时,即使有 default 也不可恢复。
226
+ * - **外来类型**:除 `''` 外原样透传,不校验。
227
+ * - **list / map / multiselect**:默认坏元素、坏值逐个丢弃并告警;严格字段拒绝整个值。
228
+ * - **分组**:值不是对象时默认告警并按空对象解析;含严格字段时拒绝显式无效的分组值。
229
+ * - **数组**:值不是数组按无效处理,含严格元素字段时拒绝显式无效的数组值;元素不是对象、或元素内有不可恢复的字段时只丢这一条元素并告警;
230
+ * 数组自身声明 `onInvalid: 'error'` 时不丢元素而是拒绝整个数组。元素字段的默认值逐元素补齐。
231
+ * - **schema 外的键**:丢弃并告警。
232
+ * - **不可恢复**(顶层或分组内):缺失抛 {@link missingConfigError},无效抛 {@link configError},插件随之进 error 态。
233
+ *
234
+ * 告警只写路径、类型名与约束,不写原值(可能是密钥);默认值可以写。
235
+ */
236
+ export declare function parseConfig<S extends ConfigSchema>(schema: S, raw: unknown, logger?: {
237
+ warn(message: string): void;
238
+ }): ConfigOf<S>;
129
239
  /**
130
240
  * 按 schema 键集裁掉未知字段。configSchema 是插件配置的**唯一声明来源**(默认值也从它派生),
131
241
  * 所以它的键集就是完整的白名单:不在 schema 里的字段,要么是用户手写的错别字,
132
242
  * 要么是已废弃的旧字段,裁掉即归位。无 schema 的插件不裁(见调用方守卫)。
133
243
  *
134
244
  * 被裁的键写入 `removed`(带点号前缀)——静默裁剪会让「字段被吃掉」与「用户没配」不可分辨。
135
- * `type: 'array'` 的值整段保留(数组元素结构由 validateConfig 解释,不在这里拆)。
245
+ * `type: 'array'` 的值整段保留(数组元素结构由 validateConfig / parseConfig 解释,不在这里拆)。
136
246
  */
137
247
  export declare function removeExtraFields(config: Record<string, unknown>, schema: Record<string, unknown>, removed?: string[], prefix?: string): Record<string, unknown>;
138
248
  /**
@@ -156,4 +266,5 @@ declare module '@aalis/core' {
156
266
  configSchema?: ConfigSchema;
157
267
  }
158
268
  }
269
+ export {};
159
270
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,19 +1,32 @@
1
1
  // ============================================================
2
2
  // @aalis/schema-config — 配置 Schema 词汇契约 + 词汇的中立解释
3
3
  //
4
- // 类型部分描述"配置如何呈现为表单"(label / options / textarea …);
5
- // 函数部分是对这套词汇的**中立解释**:默认值派生(defaultsFrom)、只读
6
- // 结构校验(validateConfig)、按 schema 键集裁未知字段(removeExtraFields)。
7
- // 三者都不属于 @aalis/core——core 只把 `PluginMeta.configSchema` 当作
4
+ // 类型部分描述"配置如何呈现为表单"(label / options / textarea …),并由
5
+ // ConfigOf 从同一份 schema 推导配置值类型;
6
+ // 函数部分是对这套词汇的**中立解释**:默认值派生(defaultsFrom)与深合并(deepMergeDefaults)、
7
+ // 只读结构校验(validateConfig)、按 schema 键集裁未知字段(removeExtraFields)、
8
+ // 按 schema 解析插件拿到的配置(parseConfig)。
9
+ // 它们都不属于 @aalis/core——core 只把 `PluginMeta.configSchema` 当作
8
10
  // opaque 数据透传,不解释任何字段。另有插件因配置问题无法激活时抛的错误(configError / missingConfigError)。
9
11
  //
10
12
  // 消费方:
11
- // - 插件:在 `definePlugin({ configSchema })` 的定义对象里声明
13
+ // - 插件:用 defineConfig 声明 schema、放进 `definePlugin({ configSchema })`,apply 里用 parseConfig 读配置
12
14
  // - 渲染宿主(webui-server/client 等):读取并渲染表单
13
15
  // - 宿主政策(@aalis/runtime 的 config-sync):按 schema 裁剪未知字段、校验告警
14
16
  //
15
17
  // 本包零运行时依赖:对 @aalis/core 仅有 type-only 锚点 import(编译后擦除)。
16
18
  // ============================================================
19
+ /**
20
+ * 声明插件的配置 schema:运行时原样返回传入的对象(不冻结、不加任何属性),类型层保留字面量,
21
+ * 供 {@link ConfigOf} 推出配置值类型。返回值可直接放进 `definePlugin({ configSchema })`。
22
+ *
23
+ * 别给变量标 `ConfigSchema` 类型注解:注解会把字面量拓宽掉,ConfigOf 只能推出宽类型。
24
+ * 推出的类型里各属性是只读的、options 是字面量元组;要在运行时改写 schema(WebUI 读的是这个活对象),
25
+ * 经 `ConfigSchema` 类型的引用改写(如 `const live: ConfigSchema = configSchema`)。
26
+ */
27
+ export function defineConfig(schema) {
28
+ return schema;
29
+ }
17
30
  /**
18
31
  * core 基础设施配置(name / logLevel / slowThresholdMs)的表单描述。
19
32
  *
@@ -24,7 +37,7 @@ export const CORE_CONFIG_SCHEMA = {
24
37
  name: {
25
38
  type: 'string',
26
39
  label: '应用名称',
27
- description: '应用显示名称,用于启动日志和界面展示;装有人设时界面显示人设名',
40
+ description: '应用显示名称,用于启动日志和界面展示;装有人设时仪表盘仍显示它,聊天显示人设名',
28
41
  default: 'Aalis',
29
42
  },
30
43
  logLevel: {
@@ -75,9 +88,31 @@ export function defaultsFrom(schema) {
75
88
  }
76
89
  return out;
77
90
  }
78
- // 校验器在运行时需要一份"本包内置类型"名单:SchemaFieldTypes 是纯类型层的
91
+ /**
92
+ * 把默认值(通常是 {@link defaultsFrom} 的结果)深合并进配置:只填充缺失的键,已有的值(含显式 null)不覆盖。
93
+ * 嵌套对象递归合并,只写了半块的分组照样补齐其余默认子键;数组与基础类型按「已存在则保留」处理。
94
+ * 宿主的配置同步与 WebUI 保存插件配置用同一个合并,两条路径写出的配置形状一致。
95
+ */
96
+ export function deepMergeDefaults(defaults, current) {
97
+ const result = { ...current };
98
+ for (const [key, defaultValue] of Object.entries(defaults)) {
99
+ if (!Object.hasOwn(result, key)) {
100
+ result[key] = defaultValue;
101
+ }
102
+ else if (defaultValue !== null &&
103
+ typeof defaultValue === 'object' &&
104
+ !Array.isArray(defaultValue) &&
105
+ result[key] !== null &&
106
+ typeof result[key] === 'object' &&
107
+ !Array.isArray(result[key])) {
108
+ result[key] = deepMergeDefaults(defaultValue, result[key]);
109
+ }
110
+ }
111
+ return result;
112
+ }
113
+ // 校验与解析在运行时需要一份"本包内置类型"名单:SchemaFieldTypes 是纯类型层的
79
114
  // merging 注册表,运行时不存在。外来类型(如 'llm-ref')落在名单之外,
80
- // 校验器一律跳过放行——开放词汇表要求校验器同样开放。
115
+ // validateConfig 一律跳过放行、parseConfig 原样透传——开放词汇表要求两者同样开放。
81
116
  const NEUTRAL_FIELD_TYPES = new Set([
82
117
  'string',
83
118
  'number',
@@ -92,43 +127,84 @@ const NEUTRAL_FIELD_TYPES = new Set([
92
127
  * 按 ConfigSchema 对配置做只读结构校验,返回问题清单(空数组 = 无问题)。
93
128
  *
94
129
  * 定位与边界:
95
- * - **只读**:不转换、不回填、不裁剪——回填是 defaultsFrom,裁剪是 removeExtraFields。
96
- * 校验器出错的最大代价必须始终是"少一条警告",因此它绝不参与配置取值链路。
97
- * - **只解释中立词汇**:type/required 之外的语义(含宿主经 declaration merging
98
- * 注入的呈现属性,如 secret/allowCustom)一概不解读。
99
- * - **options 不作为取值白名单**:中立契约里 options 只是"静态选项"(呈现语义),
100
- * 是否允许选项外的值由宿主属性(allowCustom)决定,而本包看不见宿主属性,
101
- * 故 select/multiselect 只查原始类型不查成员资格。
130
+ * - **只读**:不转换、不回填、不裁剪——回填是 defaultsFrom,裁剪是 removeExtraFields,取值是 parseConfig。
131
+ * 逐字段判定与 parseConfig 共用同一份:这里报 invalid 的值,parseConfig 会回落、忽略或拒绝。
132
+ * 校验器出错的最大代价必须始终是"少一条警告",因此它对畸形 schema 不抛错。
133
+ * - **只解释本包的词汇**:type/required、约束键与影响取值的 dynamicOptions/allowCustom;
134
+ * 宿主经 declaration merging 注入的呈现属性(如 secret)一概不解读。
135
+ * - **标量宽容**:期望字符串的位置(string/textarea、list 元素、map 值、选项比较)接受有限数字;
136
+ * 期望数字的位置接受去掉首尾空白后能完整解析为有限数的字符串。boolean 不做转换。
137
+ * - **options 即取值范围**:select 有静态 options、没有 dynamicOptions 且 allowCustom 不为 true 时,值须是
138
+ * 某个选项值(按字符串比较);multiselect 同样逐元素判定。
102
139
  * - **约束键**:number 强制 min/max(含边界)与 integer,string/textarea 强制
103
140
  * pattern(模式非法则跳过该检查);step 是纯 UI 提示不校验。约束只在类型
104
141
  * 检查通过后评估——类型都不对时报类型错,不叠报约束错。
105
- * - **list / map**:list 须为数组且每个元素是 string(保序、重复合法);map 须为
106
- * 对象且每个值是 string,逐值报错的路径形如 `env.KEY`。
107
- * - **宽容缺失**:undefined 与 null(YAML 裸键)视为"未配置",仅在 required 且
108
- * 未声明 default 时报缺——顶层/分组的默认值在调用点已合并,数组元素的默认值
142
+ * - **list / map**:list 须为数组、map 须为对象,逐元素 / 逐值报错,路径形如 `args[1]`、`env.KEY`。
143
+ * - **宽容缺失**:undefined 与 null(YAML 裸键)视为"未配置",required 字段的 `''` 也算未配置(WebUI 与脚手架
144
+ * 用 `''` 表示未填,与 parseConfig 一致;空数组仍算已配置),仅在 required 且未声明 default 时报缺——顶层/分组的默认值在调用点已合并,数组元素的默认值
109
145
  * 不参与合并(defaultsFrom 把 SchemaArray 当叶子),靠 default 声明本身放行。
110
146
  *
111
- * 政策留给调用方:config-sync 对启用插件打 warn(不拒载,存量脏值不打死实例;
112
- * 禁用插件的配置是休眠数据,不告警),webui 的 PUT 只拦**新增**的 `invalid`
113
- * (存量问题与 `missing` 放行——拦新不追旧,半成品配置允许落盘)。
147
+ * 政策留给调用方:config-sync 对启用插件打 warn(禁用插件的配置是休眠数据,不告警),
148
+ * webui 的 PUT 只拦**新增**的 `invalid`(存量问题与 `missing` 放行——拦新不追旧,半成品配置允许落盘)。
114
149
  */
115
150
  export function validateConfig(schema, config) {
116
151
  const issues = [];
117
152
  validateFields(schema ?? {}, config, '', issues);
118
153
  return issues;
119
154
  }
155
+ /**
156
+ * 按 schema 解析插件拿到的配置,返回 {@link ConfigOf} 类型的新对象(不改入参)。插件在 apply 里用它读配置:
157
+ * `const cfg = parseConfig(configSchema, caps.config, caps.logger)`,之后的夹紧、跨字段约束等核对作用于 cfg。
158
+ *
159
+ * - **缺失**:undefined 与 null;required 字段另把 `''` 当作缺失(WebUI 与脚手架用 `''` 表示未填),
160
+ * 外来类型的 `''` 一律当作缺失。有 default 用 default(拷贝),无 default 且 required 不可恢复,否则省略该键。
161
+ * - **无效**:逐字段判定与 validateConfig 共用(标量宽容、选项即取值范围、约束键)。
162
+ * 默认有 default 回落并告警;无 default 且 required 不可恢复;否则省略并告警。
163
+ * `onInvalid: 'error'` 的字段遇到显式无效值或坏集合成员时,即使有 default 也不可恢复。
164
+ * - **外来类型**:除 `''` 外原样透传,不校验。
165
+ * - **list / map / multiselect**:默认坏元素、坏值逐个丢弃并告警;严格字段拒绝整个值。
166
+ * - **分组**:值不是对象时默认告警并按空对象解析;含严格字段时拒绝显式无效的分组值。
167
+ * - **数组**:值不是数组按无效处理,含严格元素字段时拒绝显式无效的数组值;元素不是对象、或元素内有不可恢复的字段时只丢这一条元素并告警;
168
+ * 数组自身声明 `onInvalid: 'error'` 时不丢元素而是拒绝整个数组。元素字段的默认值逐元素补齐。
169
+ * - **schema 外的键**:丢弃并告警。
170
+ * - **不可恢复**(顶层或分组内):缺失抛 {@link missingConfigError},无效抛 {@link configError},插件随之进 error 态。
171
+ *
172
+ * 告警只写路径、类型名与约束,不写原值(可能是密钥);默认值可以写。
173
+ */
174
+ export function parseConfig(schema, raw, logger) {
175
+ const warn = (message) => logger?.warn(message);
176
+ let source = {};
177
+ if (isRecord(raw))
178
+ source = raw;
179
+ else if (raw !== undefined && raw !== null) {
180
+ if (hasStrictField(schema))
181
+ throw configError('配置整体期望对象,在 WebUI 或配置文件中改正后生效');
182
+ warn(`配置整体期望对象,得到 ${describeType(raw)},已忽略`);
183
+ }
184
+ try {
185
+ return parseEntries(schema, source, '', warn);
186
+ }
187
+ catch (err) {
188
+ if (!(err instanceof UnrecoverableField))
189
+ throw err;
190
+ throw err.missing
191
+ ? missingConfigError(err.path)
192
+ : configError(`配置项 ${err.path} ${err.reason},在 WebUI 或配置文件中改正后生效`);
193
+ }
194
+ }
120
195
  /**
121
196
  * 按 schema 键集裁掉未知字段。configSchema 是插件配置的**唯一声明来源**(默认值也从它派生),
122
197
  * 所以它的键集就是完整的白名单:不在 schema 里的字段,要么是用户手写的错别字,
123
198
  * 要么是已废弃的旧字段,裁掉即归位。无 schema 的插件不裁(见调用方守卫)。
124
199
  *
125
200
  * 被裁的键写入 `removed`(带点号前缀)——静默裁剪会让「字段被吃掉」与「用户没配」不可分辨。
126
- * `type: 'array'` 的值整段保留(数组元素结构由 validateConfig 解释,不在这里拆)。
201
+ * `type: 'array'` 的值整段保留(数组元素结构由 validateConfig / parseConfig 解释,不在这里拆)。
127
202
  */
128
203
  export function removeExtraFields(config, schema, removed, prefix = '') {
129
204
  const result = {};
130
205
  for (const [key, value] of Object.entries(config)) {
131
- if (!(key in schema)) {
206
+ // 只认 schema 的自有键:配置里的 toString、valueOf 这类键不能靠原型上的同名属性逃过裁剪
207
+ if (!Object.hasOwn(schema, key)) {
132
208
  removed?.push(prefix + key);
133
209
  continue;
134
210
  }
@@ -180,7 +256,7 @@ function validateFields(schema, config, prefix, issues) {
180
256
  if ('fields' in entry) {
181
257
  if (value === undefined || value === null)
182
258
  continue;
183
- if (typeof value !== 'object' || Array.isArray(value)) {
259
+ if (!isRecord(value)) {
184
260
  issues.push({ path, message: `期望对象(分组),得到 ${describeType(value)}`, kind: 'invalid' });
185
261
  continue;
186
262
  }
@@ -195,7 +271,7 @@ function validateFields(schema, config, prefix, issues) {
195
271
  continue;
196
272
  }
197
273
  value.forEach((item, i) => {
198
- if (item === null || typeof item !== 'object' || Array.isArray(item)) {
274
+ if (!isRecord(item)) {
199
275
  issues.push({ path: `${path}[${i}]`, message: `期望对象元素,得到 ${describeType(item)}`, kind: 'invalid' });
200
276
  return;
201
277
  }
@@ -203,7 +279,7 @@ function validateFields(schema, config, prefix, issues) {
203
279
  });
204
280
  continue;
205
281
  }
206
- if (value === undefined || value === null) {
282
+ if (value === undefined || value === null || (value === '' && entry.required)) {
207
283
  // 声明了 default 的字段永远不算缺失:顶层/分组的默认值多已在调用点合并,但合并不覆盖
208
284
  // 显式 null(YAML 裸键),这类值照样走到这里,
209
285
  // 数组元素的默认值不参与任何合并(defaultsFrom 把 SchemaArray 当叶子),
@@ -214,99 +290,154 @@ function validateFields(schema, config, prefix, issues) {
214
290
  }
215
291
  if (!NEUTRAL_FIELD_TYPES.has(entry.type))
216
292
  continue;
217
- switch (entry.type) {
218
- case 'string':
219
- case 'textarea':
220
- if (typeof value !== 'string') {
221
- issues.push({ path, message: `期望 string,得到 ${describeType(value)}`, kind: 'invalid' });
222
- }
223
- else if (entry.pattern !== undefined) {
224
- // 模式本身非法(作者的 schema bug)时跳过该检查——校验器不得因 schema
225
- // 缺陷抛错或误伤值;作者侧问题由类型检查与测试兜。
226
- try {
227
- if (!new RegExp(entry.pattern).test(value)) {
228
- issues.push({ path, message: `不匹配模式 ${entry.pattern}`, kind: 'invalid' });
229
- }
230
- }
231
- catch {
232
- /* 非法 pattern:跳过 */
233
- }
234
- }
235
- break;
236
- case 'number':
237
- if (typeof value !== 'number' || !Number.isFinite(value)) {
238
- issues.push({ path, message: `期望有限数值,得到 ${describeType(value)}`, kind: 'invalid' });
239
- }
240
- else if (entry.integer && !Number.isInteger(value)) {
241
- issues.push({ path, message: '期望整数', kind: 'invalid' });
242
- }
243
- else if (entry.min !== undefined && value < entry.min) {
244
- issues.push({ path, message: `小于下限 ${entry.min}`, kind: 'invalid' });
245
- }
246
- else if (entry.max !== undefined && value > entry.max) {
247
- issues.push({ path, message: `大于上限 ${entry.max}`, kind: 'invalid' });
248
- }
249
- break;
250
- case 'boolean':
251
- if (typeof value !== 'boolean')
252
- issues.push({ path, message: `期望 boolean,得到 ${describeType(value)}`, kind: 'invalid' });
253
- break;
254
- case 'select':
255
- if (typeof value !== 'string' && typeof value !== 'number') {
256
- issues.push({ path, message: `期望 string 或 number,得到 ${describeType(value)}`, kind: 'invalid' });
257
- }
258
- break;
259
- case 'multiselect':
260
- if (!Array.isArray(value)) {
261
- issues.push({ path, message: `期望数组,得到 ${describeType(value)}`, kind: 'invalid' });
262
- }
263
- else {
264
- value.forEach((item, i) => {
265
- if (typeof item !== 'string' && typeof item !== 'number') {
266
- issues.push({
267
- path: `${path}[${i}]`,
268
- message: `期望 string 或 number 元素,得到 ${describeType(item)}`,
269
- kind: 'invalid',
270
- });
271
- }
272
- });
273
- }
274
- break;
275
- case 'list':
276
- if (!Array.isArray(value)) {
277
- issues.push({ path, message: `期望数组,得到 ${describeType(value)}`, kind: 'invalid' });
278
- }
279
- else {
280
- value.forEach((item, i) => {
281
- if (typeof item !== 'string') {
282
- issues.push({
283
- path: `${path}[${i}]`,
284
- message: `期望 string 元素,得到 ${describeType(item)}`,
285
- kind: 'invalid',
286
- });
287
- }
288
- });
293
+ const verdict = judgeField(entry, value);
294
+ if ('invalid' in verdict) {
295
+ issues.push({ path, message: verdict.invalid, kind: 'invalid' });
296
+ continue;
297
+ }
298
+ for (const d of verdict.dropped)
299
+ issues.push({ path: path + d.at, message: d.reason, kind: 'invalid' });
300
+ }
301
+ }
302
+ function judgeField(field, value) {
303
+ switch (field.type) {
304
+ case 'string':
305
+ case 'textarea': {
306
+ const text = asText(value);
307
+ if (text === undefined)
308
+ return { invalid: `期望 string,得到 ${describeType(value)}` };
309
+ if (field.pattern !== undefined && !matchesPattern(field.pattern, text)) {
310
+ return { invalid: `不匹配模式 ${field.pattern}` };
311
+ }
312
+ return { value: text, dropped: [] };
313
+ }
314
+ case 'number': {
315
+ const num = asNumber(value);
316
+ if (num === undefined)
317
+ return { invalid: `期望有限数值,得到 ${describeType(value)}` };
318
+ if (field.integer && !Number.isInteger(num))
319
+ return { invalid: '期望整数' };
320
+ if (field.min !== undefined && num < field.min)
321
+ return { invalid: `小于下限 ${field.min}` };
322
+ if (field.max !== undefined && num > field.max)
323
+ return { invalid: `大于上限 ${field.max}` };
324
+ return { value: num, dropped: [] };
325
+ }
326
+ case 'boolean':
327
+ return typeof value === 'boolean'
328
+ ? { value, dropped: [] }
329
+ : { invalid: `期望 boolean,得到 ${describeType(value)}` };
330
+ case 'select': {
331
+ const text = asText(value);
332
+ if (text === undefined)
333
+ return { invalid: `期望 string 或 number,得到 ${describeType(value)}` };
334
+ const options = field.allowCustom === true ? undefined : choiceOptions(field);
335
+ if (!options)
336
+ return { value: text, dropped: [] };
337
+ const hit = options.find(o => String(o.value) === text);
338
+ return hit ? { value: hit.value, dropped: [] } : { invalid: notAnOption(options) };
339
+ }
340
+ case 'multiselect': {
341
+ if (!Array.isArray(value))
342
+ return { invalid: `期望数组,得到 ${describeType(value)}` };
343
+ const options = field.allowCustom === true ? undefined : choiceOptions(field);
344
+ const kept = [];
345
+ const dropped = [];
346
+ for (let i = 0; i < value.length; i++) {
347
+ const item = value[i];
348
+ const text = asText(item);
349
+ if (text === undefined) {
350
+ dropped.push({ at: `[${i}]`, reason: `期望 string 或 number 元素,得到 ${describeType(item)}` });
289
351
  }
290
- break;
291
- case 'map':
292
- if (typeof value !== 'object' || Array.isArray(value)) {
293
- issues.push({ path, message: `期望对象(映射),得到 ${describeType(value)}`, kind: 'invalid' });
352
+ else if (!options) {
353
+ kept.push(text);
294
354
  }
295
355
  else {
296
- for (const [k, v] of Object.entries(value)) {
297
- if (typeof v !== 'string') {
298
- issues.push({
299
- path: `${path}.${k}`,
300
- message: `期望 string 值,得到 ${describeType(v)}`,
301
- kind: 'invalid',
302
- });
303
- }
304
- }
356
+ const hit = options.find(o => String(o.value) === text);
357
+ if (hit)
358
+ kept.push(hit.value);
359
+ else
360
+ dropped.push({ at: `[${i}]`, reason: notAnOption(options) });
305
361
  }
306
- break;
362
+ }
363
+ return { value: kept, dropped };
364
+ }
365
+ case 'list': {
366
+ if (!Array.isArray(value))
367
+ return { invalid: `期望数组,得到 ${describeType(value)}` };
368
+ const kept = [];
369
+ const dropped = [];
370
+ for (let i = 0; i < value.length; i++) {
371
+ const item = value[i];
372
+ const text = asText(item);
373
+ if (text === undefined)
374
+ dropped.push({ at: `[${i}]`, reason: `期望 string 元素,得到 ${describeType(item)}` });
375
+ else
376
+ kept.push(text);
377
+ }
378
+ return { value: kept, dropped };
379
+ }
380
+ case 'map': {
381
+ if (!isRecord(value))
382
+ return { invalid: `期望对象(映射),得到 ${describeType(value)}` };
383
+ const kept = {};
384
+ const dropped = [];
385
+ for (const [k, v] of Object.entries(value)) {
386
+ const text = asText(v);
387
+ if (text === undefined)
388
+ dropped.push({ at: `.${k}`, reason: `期望 string 值,得到 ${describeType(v)}` });
389
+ // 危险键不进结果对象:写 `__proto__` 会改掉结果的原型
390
+ else if (isUnsafeConfigKey(k))
391
+ dropped.push({ at: `.${k}`, reason: '保留键不可用' });
392
+ else
393
+ kept[k] = text;
394
+ }
395
+ return { value: kept, dropped };
307
396
  }
397
+ default:
398
+ return { value, dropped: [] };
308
399
  }
309
400
  }
401
+ /** 期望字符串的位置:字符串原样,有限数字转成字符串(YAML 里不加引号的 QQ 号、端口照常可用) */
402
+ function asText(value) {
403
+ if (typeof value === 'string')
404
+ return value;
405
+ if (typeof value === 'number' && Number.isFinite(value))
406
+ return String(value);
407
+ return undefined;
408
+ }
409
+ /** 期望数字的位置:有限数字原样,去掉首尾空白后非空、能完整解析为有限数的字符串转成数字(YAML 里加了引号的数字照常可用) */
410
+ function asNumber(value) {
411
+ if (typeof value === 'number')
412
+ return Number.isFinite(value) ? value : undefined;
413
+ if (typeof value !== 'string' || value.trim() === '')
414
+ return undefined;
415
+ const num = Number(value);
416
+ return Number.isFinite(num) ? num : undefined;
417
+ }
418
+ /** 构成取值范围的静态选项:有非空 options 且没有 dynamicOptions(动态来源的选项在运行时才知道,静态列表不完整) */
419
+ function choiceOptions(field) {
420
+ if (field.dynamicOptions !== undefined || !Array.isArray(field.options))
421
+ return undefined;
422
+ const options = field.options.filter(o => o !== null && typeof o === 'object');
423
+ return options.length > 0 ? options : undefined;
424
+ }
425
+ function notAnOption(options) {
426
+ return `不是可选值(${options.map(o => JSON.stringify(o.value)).join('、')})之一`;
427
+ }
428
+ function matchesPattern(pattern, text) {
429
+ // 模式本身非法(作者的 schema bug)时跳过该检查——判定不得因 schema
430
+ // 缺陷抛错或误伤值;作者侧问题由类型检查与测试兜。
431
+ try {
432
+ return new RegExp(pattern).test(text);
433
+ }
434
+ catch {
435
+ return true;
436
+ }
437
+ }
438
+ function isRecord(value) {
439
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
440
+ }
310
441
  function describeType(value) {
311
442
  if (value === null)
312
443
  return 'null';
@@ -316,6 +447,165 @@ function describeType(value) {
316
447
  return String(value);
317
448
  return typeof value;
318
449
  }
450
+ /** 顶层或分组内无法恢复的字段:parseConfig 把它转成 missingConfigError / configError 抛出,数组元素内只丢这一条元素 */
451
+ class UnrecoverableField extends Error {
452
+ path;
453
+ reason;
454
+ missing;
455
+ constructor(path, reason, missing) {
456
+ super(`${path} ${reason}`);
457
+ this.path = path;
458
+ this.reason = reason;
459
+ this.missing = missing;
460
+ }
461
+ }
462
+ /** 只在祖先值显式无效时检查;缺省的容器仍按字段原有的缺省规则解析。 */
463
+ function hasStrictField(schema) {
464
+ if (!isRecord(schema))
465
+ return false;
466
+ return Object.values(schema).some(entry => {
467
+ if (!isRecord(entry))
468
+ return false;
469
+ if (entry.onInvalid === 'error')
470
+ return true;
471
+ if ('fields' in entry)
472
+ return hasStrictField(entry.fields);
473
+ if (entry.type === 'array')
474
+ return hasStrictField(entry.items);
475
+ return false;
476
+ });
477
+ }
478
+ function parseEntries(schema, source, prefix, warn) {
479
+ // 畸形 schema(分组 fields 为 null、数组缺 items、条目为原始值)按空处理,不抛错
480
+ const entries = isRecord(schema) ? schema : {};
481
+ const out = {};
482
+ for (const [key, entry] of Object.entries(entries)) {
483
+ if (!isRecord(entry) || isUnsafeConfigKey(key))
484
+ continue;
485
+ const path = prefix + key;
486
+ // 只认自有属性:`toString` 这类键不能从原型上读到值
487
+ const value = Object.hasOwn(source, key) ? source[key] : undefined;
488
+ let parsed;
489
+ if ('fields' in entry)
490
+ parsed = parseGroup(entry.fields, value, path, warn);
491
+ else if (entry.type === 'array')
492
+ parsed = parseArray(entry, value, path, warn);
493
+ else
494
+ parsed = parseField(entry, value, path, warn);
495
+ if (parsed !== undefined)
496
+ out[key] = parsed;
497
+ }
498
+ for (const key of Object.keys(source)) {
499
+ if (!Object.hasOwn(entries, key))
500
+ warn(`配置项 ${prefix + key} 不在 schema 中,已忽略`);
501
+ }
502
+ return out;
503
+ }
504
+ function parseGroup(fields, value, path, warn) {
505
+ let source = {};
506
+ if (isRecord(value))
507
+ source = value;
508
+ else if (value !== undefined && value !== null) {
509
+ if (hasStrictField(fields))
510
+ throw new UnrecoverableField(path, '期望对象(分组)', false);
511
+ warn(`配置项 ${path} 期望对象(分组),得到 ${describeType(value)},已忽略`);
512
+ }
513
+ return parseEntries(fields, source, `${path}.`, warn);
514
+ }
515
+ function parseField(field, value, path, warn) {
516
+ const neutral = NEUTRAL_FIELD_TYPES.has(field.type);
517
+ if (value === undefined || value === null || (value === '' && (field.required || !neutral))) {
518
+ if (field.default !== undefined)
519
+ return cloneConfigValue(field.default);
520
+ if (field.required)
521
+ throw new UnrecoverableField(path, '必填字段缺失', true);
522
+ return undefined;
523
+ }
524
+ if (!neutral)
525
+ return cloneConfigValue(value);
526
+ const verdict = judgeField(field, value);
527
+ if ('invalid' in verdict)
528
+ return fallBack(field, path, verdict.invalid, warn);
529
+ if (field.onInvalid === 'error' && verdict.dropped.length > 0) {
530
+ const first = verdict.dropped[0];
531
+ // map 键来自配置,可能本身是密钥;集合下标则可安全指出。
532
+ const memberPath = field.type === 'map' ? path : path + first.at;
533
+ throw new UnrecoverableField(memberPath, safeInvalidReason(first.reason), false);
534
+ }
535
+ for (const d of verdict.dropped)
536
+ warn(`配置项 ${path}${d.at} ${d.reason},已忽略`);
537
+ return verdict.value;
538
+ }
539
+ function parseArray(entry, value, path, warn) {
540
+ let list = value;
541
+ if (value === undefined || value === null) {
542
+ list = entry.default;
543
+ }
544
+ else if (!Array.isArray(value)) {
545
+ if (hasStrictField(entry.items))
546
+ throw new UnrecoverableField(path, '期望数组', false);
547
+ list = fallBack(entry, path, `期望数组,得到 ${describeType(value)}`, warn);
548
+ }
549
+ // 默认值同样逐元素解析:元素字段的默认值要补齐;default 本身不是数组(畸形 schema)按未配置处理
550
+ if (!Array.isArray(list))
551
+ return undefined;
552
+ const out = [];
553
+ for (let i = 0; i < list.length; i++) {
554
+ const item = list[i];
555
+ const at = `${path}[${i}]`;
556
+ if (!isRecord(item)) {
557
+ if (entry.onInvalid === 'error')
558
+ throw new UnrecoverableField(at, '期望对象元素', false);
559
+ warn(`配置项 ${at} 已忽略:期望对象元素,得到 ${describeType(item)}`);
560
+ continue;
561
+ }
562
+ // 元素内的告警先攒着:这条元素整条丢弃时只报丢弃原因
563
+ const pending = [];
564
+ try {
565
+ out.push(parseEntries(entry.items, item, `${at}.`, message => pending.push(message)));
566
+ }
567
+ catch (err) {
568
+ if (!(err instanceof UnrecoverableField))
569
+ throw err;
570
+ if (entry.onInvalid === 'error')
571
+ throw err;
572
+ warn(`配置项 ${at} 已忽略:${err.path.slice(at.length + 1)} ${err.reason}`);
573
+ continue;
574
+ }
575
+ for (const message of pending)
576
+ warn(message);
577
+ }
578
+ return out;
579
+ }
580
+ /** 无效值的处置:有 default 回落并告警;无 default 且 required 不可恢复;否则省略并告警 */
581
+ function fallBack(entry, path, reason, warn) {
582
+ if (entry.onInvalid === 'error')
583
+ throw new UnrecoverableField(path, safeInvalidReason(reason), false);
584
+ if (entry.default !== undefined) {
585
+ warn(`配置项 ${path} ${reason},改用默认值 ${describeDefault(entry.default)}`);
586
+ return cloneConfigValue(entry.default);
587
+ }
588
+ if (entry.required)
589
+ throw new UnrecoverableField(path, reason, false);
590
+ warn(`配置项 ${path} ${reason},已忽略`);
591
+ return undefined;
592
+ }
593
+ /** 错误可说明类型与约束,但不列出用户值、静态选项值或正则文本。 */
594
+ function safeInvalidReason(reason) {
595
+ if (reason.startsWith('不是可选值'))
596
+ return '不是可选值';
597
+ if (reason.startsWith('不匹配模式'))
598
+ return '不匹配模式';
599
+ return reason.replace(/得到 (?:NaN|-?Infinity)/g, '得到 number');
600
+ }
601
+ function describeDefault(value) {
602
+ try {
603
+ return JSON.stringify(value) ?? String(value);
604
+ }
605
+ catch {
606
+ return String(value);
607
+ }
608
+ }
319
609
  // 与 packages/core/src/infrastructure/config-values.ts 同一规则(本包零运行时依赖,不能 import core)。
320
610
  // 防漂移:test/architecture/config-copy-parity.test.ts
321
611
  const UNSAFE_CONFIG_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aalis/schema-config",
3
- "version": "0.13.0",
3
+ "version": "0.14.0",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -20,7 +20,7 @@
20
20
  ],
21
21
  "devDependencies": {
22
22
  "typescript": "^5.7.0",
23
- "@aalis/core": "0.18.0"
23
+ "@aalis/core": "0.19.1"
24
24
  },
25
25
  "keywords": [
26
26
  "aalis",