@yuhere/js-jsonrpc2 2.1.10 → 2.1.11
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/dist/cli/cli.js +9 -1
- package/dist/cli/cli.js.map +1 -1
- package/dist/cli/demo-methods.d.ts.map +1 -1
- package/dist/cli/demo-methods.js +24 -25
- package/dist/cli/demo-methods.js.map +1 -1
- package/dist/core/Repository.d.ts +3 -7
- package/dist/core/Repository.d.ts.map +1 -1
- package/dist/core/Repository.js +159 -19
- package/dist/core/Repository.js.map +1 -1
- package/dist/core/descriptor.d.ts.map +1 -1
- package/dist/core/llm-tools.d.ts.map +1 -1
- package/dist/core/llm-tools.js +19 -14
- package/dist/core/llm-tools.js.map +1 -1
- package/dist/core/system-methods.d.ts.map +1 -1
- package/dist/core/system-methods.js +22 -6
- package/dist/core/system-methods.js.map +1 -1
- package/dist/metrics/memory.d.ts +59 -0
- package/dist/metrics/memory.d.ts.map +1 -0
- package/dist/metrics/memory.js +188 -0
- package/dist/metrics/memory.js.map +1 -0
- package/dist/metrics/prom.d.ts +1 -0
- package/dist/metrics/prom.d.ts.map +1 -0
- package/dist/metrics/prom.js +105 -0
- package/dist/metrics/prom.js.map +1 -0
- package/dist/schema/json/index.d.ts +1 -0
- package/dist/schema/json/index.d.ts.map +1 -1
- package/dist/schema/json/primitives.d.ts +81 -42
- package/dist/schema/json/primitives.d.ts.map +1 -1
- package/dist/schema/json/primitives.js +95 -67
- package/dist/schema/json/primitives.js.map +1 -1
- package/dist/schema/z/protocol.d.ts +1 -1
- package/dist/transport/express/middleware.d.ts +1 -1
- package/dist/transport/express/middleware.d.ts.map +1 -1
- package/dist/types.d.ts +26 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -12,6 +12,13 @@ export type SchemaKind = string;
|
|
|
12
12
|
export interface SchemaDescription {
|
|
13
13
|
kind: SchemaKind;
|
|
14
14
|
description?: string;
|
|
15
|
+
/**
|
|
16
|
+
* 该值是否允许为 null。
|
|
17
|
+
*
|
|
18
|
+
* 唯一真相来源:由 `NullableSchema` 及其子类通过 `.nullable(bool)` 设置,
|
|
19
|
+
* `UnknownSchema` / `NullSchema` 不使用该字段(它们本身就接受 null)。
|
|
20
|
+
* `kind` 永远表示值的真实形状,不会被 nullability 污染。
|
|
21
|
+
*/
|
|
15
22
|
nullable?: boolean;
|
|
16
23
|
constraints?: Record<string, unknown>;
|
|
17
24
|
children?: Record<string, unknown>;
|
|
@@ -21,10 +28,11 @@ export declare class SchemaValidationError extends Error {
|
|
|
21
28
|
constructor(message: string, path?: string[]);
|
|
22
29
|
}
|
|
23
30
|
/**
|
|
24
|
-
* 所有 Schema
|
|
31
|
+
* 所有 Schema 的抽象基类。
|
|
25
32
|
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
33
|
+
* 只负责 description 与描述输出;nullability 由 `NullableSchema` 提供。
|
|
34
|
+
* `UnknownSchema` / `NullSchema` 直接继承本类——它们天然接受 null,
|
|
35
|
+
* 不需要 `.nullable()`。
|
|
28
36
|
*/
|
|
29
37
|
export declare abstract class Schema<T> {
|
|
30
38
|
abstract readonly kind: SchemaKind;
|
|
@@ -33,7 +41,6 @@ export declare abstract class Schema<T> {
|
|
|
33
41
|
describe(description: string): this;
|
|
34
42
|
/**
|
|
35
43
|
* 创建保留原型和现有字段的新实例,供不可变链式方法使用。
|
|
36
|
-
* Schema 子类的状态字段会一并复制,因此扩展类仍保留自身原型和状态。
|
|
37
44
|
*/
|
|
38
45
|
protected cloneWith(updates: Record<string, unknown>): this;
|
|
39
46
|
getDescription(): string | undefined;
|
|
@@ -51,62 +58,67 @@ export declare abstract class Schema<T> {
|
|
|
51
58
|
protected fail(message: string, path: string[]): never;
|
|
52
59
|
}
|
|
53
60
|
/**
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* nullable 包装器。
|
|
61
|
+
* 支持 nullability 的 Schema 基类。
|
|
62
|
+
*
|
|
63
|
+
* 除 `UnknownSchema` / `NullSchema` 外的所有具体 Schema 都继承本类。
|
|
64
|
+
*
|
|
65
|
+
* - `nullable()` / `nullable(true)` → 允许 null
|
|
66
|
+
* - `nullable(false)` → 不允许 null(撤销之前的标记)
|
|
62
67
|
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
68
|
+
* `_parse` 在调用子类 `_parseValue` 前统一做 null 短路;
|
|
69
|
+
* `toJSON()` 在基类输出上附加 `nullable: true`。
|
|
65
70
|
*/
|
|
66
|
-
export declare class NullableSchema<T> extends Schema<T | null> {
|
|
67
|
-
private
|
|
68
|
-
|
|
69
|
-
|
|
71
|
+
export declare abstract class NullableSchema<T> extends Schema<T | null> {
|
|
72
|
+
private _nullable;
|
|
73
|
+
nullable(value?: boolean): this;
|
|
74
|
+
isNullable(): boolean;
|
|
70
75
|
protected _parse(input: unknown, path: string[]): T | null;
|
|
71
|
-
protected
|
|
76
|
+
protected abstract _parseValue(input: unknown, path: string[]): T;
|
|
77
|
+
toJSON(): SchemaDescription;
|
|
72
78
|
}
|
|
73
|
-
export declare class StringSchema<K extends string = "string"> extends
|
|
79
|
+
export declare class StringSchema<K extends string = "string"> extends NullableSchema<string> {
|
|
74
80
|
readonly kind: K;
|
|
75
81
|
constructor();
|
|
76
82
|
private minimum?;
|
|
77
83
|
private maximum?;
|
|
78
84
|
min(value: number): this;
|
|
79
85
|
max(value: number): this;
|
|
80
|
-
protected
|
|
86
|
+
protected _parseValue(input: unknown, path: string[]): string;
|
|
81
87
|
protected _describe(): SchemaDescription;
|
|
82
88
|
protected validateBound(value: number): void;
|
|
83
89
|
}
|
|
84
|
-
export declare class NumberSchema extends
|
|
90
|
+
export declare class NumberSchema extends NullableSchema<number> {
|
|
85
91
|
readonly kind: "number";
|
|
86
92
|
constructor();
|
|
87
93
|
private minimum?;
|
|
88
94
|
private maximum?;
|
|
89
95
|
min(value: number): this;
|
|
90
96
|
max(value: number): this;
|
|
91
|
-
protected
|
|
97
|
+
protected _parseValue(input: unknown, path: string[]): number;
|
|
92
98
|
protected _describe(): SchemaDescription;
|
|
93
99
|
protected validateBound(value: number): void;
|
|
94
100
|
}
|
|
95
|
-
export declare class BooleanSchema extends
|
|
101
|
+
export declare class BooleanSchema extends NullableSchema<boolean> {
|
|
96
102
|
readonly kind: "boolean";
|
|
97
103
|
constructor();
|
|
98
|
-
protected
|
|
104
|
+
protected _parseValue(input: unknown, path: string[]): boolean;
|
|
99
105
|
protected _describe(): SchemaDescription;
|
|
100
106
|
}
|
|
101
|
-
|
|
102
|
-
|
|
107
|
+
/**
|
|
108
|
+
* 字面量只支持 string / number / boolean。
|
|
109
|
+
*
|
|
110
|
+
* null 由 `s.null()` 表达;需要「该字面量或 null」时,对字面量调用
|
|
111
|
+
* `.nullable()`。`literal(null)` 会抛 TypeError。
|
|
112
|
+
*/
|
|
113
|
+
export type LiteralValue = string | number | boolean;
|
|
114
|
+
export declare class LiteralSchema<const T extends LiteralValue> extends NullableSchema<T> {
|
|
103
115
|
private readonly expected;
|
|
104
116
|
readonly kind: "literal";
|
|
105
117
|
constructor(expected: T);
|
|
106
|
-
protected
|
|
118
|
+
protected _parseValue(input: unknown, path: string[]): T;
|
|
107
119
|
protected _describe(): SchemaDescription;
|
|
108
120
|
}
|
|
109
|
-
export declare class ArraySchema<T> extends
|
|
121
|
+
export declare class ArraySchema<T> extends NullableSchema<T[]> {
|
|
110
122
|
private readonly itemSchema;
|
|
111
123
|
readonly kind: "array";
|
|
112
124
|
private minimum?;
|
|
@@ -114,7 +126,7 @@ export declare class ArraySchema<T> extends NullableCapableSchema<T[]> {
|
|
|
114
126
|
constructor(itemSchema: Schema<T>);
|
|
115
127
|
min(value: number): this;
|
|
116
128
|
max(value: number): this;
|
|
117
|
-
protected
|
|
129
|
+
protected _parseValue(input: unknown, path: string[]): T[];
|
|
118
130
|
protected _describe(): SchemaDescription;
|
|
119
131
|
protected validateBound(value: number): void;
|
|
120
132
|
}
|
|
@@ -126,7 +138,7 @@ type ShapeOutput<S extends ObjectShape> = {
|
|
|
126
138
|
type OptionalShapeOutput<S extends ObjectShape> = {
|
|
127
139
|
[K in keyof S]?: SchemaValue<S[K]>;
|
|
128
140
|
};
|
|
129
|
-
export declare class ObjectSchema<S extends ObjectShape, Strict extends boolean = false> extends
|
|
141
|
+
export declare class ObjectSchema<S extends ObjectShape, Strict extends boolean = false> extends NullableSchema<Strict extends true ? ShapeOutput<S> : OptionalShapeOutput<S>> {
|
|
130
142
|
private readonly shape;
|
|
131
143
|
readonly kind: "object";
|
|
132
144
|
private isStrict;
|
|
@@ -135,10 +147,10 @@ export declare class ObjectSchema<S extends ObjectShape, Strict extends boolean
|
|
|
135
147
|
* strict() 要求所有声明属性存在,并拒绝未声明属性。
|
|
136
148
|
*/
|
|
137
149
|
strict(): ObjectSchema<S, true>;
|
|
138
|
-
protected
|
|
150
|
+
protected _parseValue(input: unknown, path: string[]): Strict extends true ? ShapeOutput<S> : OptionalShapeOutput<S>;
|
|
139
151
|
protected _describe(): SchemaDescription;
|
|
140
152
|
}
|
|
141
|
-
export declare class RecordSchema<T> extends
|
|
153
|
+
export declare class RecordSchema<T> extends NullableSchema<Record<string, T>> {
|
|
142
154
|
private readonly valueSchema;
|
|
143
155
|
readonly kind: "record";
|
|
144
156
|
private minimum?;
|
|
@@ -146,37 +158,51 @@ export declare class RecordSchema<T> extends NullableCapableSchema<Record<string
|
|
|
146
158
|
constructor(valueSchema: Schema<T>);
|
|
147
159
|
min(value: number): this;
|
|
148
160
|
max(value: number): this;
|
|
149
|
-
protected
|
|
161
|
+
protected _parseValue(input: unknown, path: string[]): Record<string, T>;
|
|
150
162
|
protected _describe(): SchemaDescription;
|
|
151
163
|
protected validateBound(value: number): void;
|
|
152
164
|
}
|
|
153
|
-
|
|
154
|
-
|
|
165
|
+
/**
|
|
166
|
+
* 联合。
|
|
167
|
+
*
|
|
168
|
+
* 传入的 member schemas 会被 clone 并 `nullable(false)`——因为「某个
|
|
169
|
+
* 分支允许 null」这件事在 union 层面没有意义:null 是否允许应通过
|
|
170
|
+
* `union(...).nullable()` 统一表达。
|
|
171
|
+
*/
|
|
172
|
+
export declare class UnionSchema<const S extends readonly [Schema<unknown>, ...Schema<unknown>[]]> extends NullableSchema<SchemaValue<S[number]>> {
|
|
155
173
|
readonly kind: "union";
|
|
174
|
+
private readonly options;
|
|
156
175
|
constructor(schemas: S);
|
|
157
|
-
protected
|
|
176
|
+
protected _parseValue(input: unknown, path: string[]): SchemaValue<S[number]>;
|
|
158
177
|
protected _describe(): SchemaDescription;
|
|
159
178
|
}
|
|
160
|
-
export declare class TupleSchema<const S extends readonly [Schema<unknown>, ...Schema<unknown>[]]> extends
|
|
179
|
+
export declare class TupleSchema<const S extends readonly [Schema<unknown>, ...Schema<unknown>[]]> extends NullableSchema<SchemaValue<S[number]>[]> {
|
|
161
180
|
private readonly schemas;
|
|
162
181
|
readonly kind: "tuple";
|
|
163
182
|
constructor(schemas: S);
|
|
164
|
-
protected
|
|
183
|
+
protected _parseValue(input: unknown, path: string[]): SchemaValue<S[number]>[];
|
|
165
184
|
protected _describe(): SchemaDescription;
|
|
166
185
|
}
|
|
167
|
-
|
|
186
|
+
/**
|
|
187
|
+
* 字符串枚举。
|
|
188
|
+
*
|
|
189
|
+
* 继承 `NullableSchema`,因此可以 `s.enum([...]).nullable()`;
|
|
190
|
+
* 它不包含嵌套 schema,所以不需要像 union 那样处理成员 nullability。
|
|
191
|
+
*/
|
|
192
|
+
export declare class EnumSchema<const T extends readonly [string, ...string[]]> extends NullableSchema<T[number]> {
|
|
168
193
|
private readonly values;
|
|
169
194
|
readonly kind: "enum";
|
|
170
195
|
private readonly allowedValues;
|
|
171
196
|
constructor(values: T);
|
|
172
|
-
protected
|
|
197
|
+
protected _parseValue(input: unknown, path: string[]): T[number];
|
|
173
198
|
protected _describe(): SchemaDescription;
|
|
174
199
|
}
|
|
175
200
|
/**
|
|
176
201
|
* 校验任意 JSON 值。
|
|
177
202
|
*
|
|
178
203
|
* 不允许 undefined、非有限数字、循环引用等非 JSON 数据。
|
|
179
|
-
*
|
|
204
|
+
* null 本身就在接受范围内,因此不继承 `NullableSchema`,也不提供
|
|
205
|
+
* `.nullable()`——那是冗余的。
|
|
180
206
|
*/
|
|
181
207
|
export declare class UnknownSchema extends Schema<JSONValue> {
|
|
182
208
|
readonly kind: "unknown";
|
|
@@ -184,6 +210,18 @@ export declare class UnknownSchema extends Schema<JSONValue> {
|
|
|
184
210
|
protected _parse(input: unknown, path: string[]): JSONValue;
|
|
185
211
|
protected _describe(): SchemaDescription;
|
|
186
212
|
}
|
|
213
|
+
/**
|
|
214
|
+
* 精确的 null 值。
|
|
215
|
+
*
|
|
216
|
+
* 与 `UnknownSchema` 一样天然表达 null,不需要 `.nullable()`。
|
|
217
|
+
* 想表达「某类型或 null」用 `.nullable()`;想表达「就是 null」用 `s.null()`。
|
|
218
|
+
*/
|
|
219
|
+
export declare class NullSchema extends Schema<null> {
|
|
220
|
+
readonly kind: "null";
|
|
221
|
+
constructor();
|
|
222
|
+
protected _parse(input: unknown, path: string[]): null;
|
|
223
|
+
protected _describe(): SchemaDescription;
|
|
224
|
+
}
|
|
187
225
|
export type Infer<T extends Schema<unknown>> = T extends Schema<infer U> ? U : never;
|
|
188
226
|
export declare const primitives: {
|
|
189
227
|
string: () => StringSchema<"string">;
|
|
@@ -197,6 +235,7 @@ export declare const primitives: {
|
|
|
197
235
|
tuple: <const S extends readonly [Schema<unknown>, ...Schema<unknown>[]]>(schemas: S) => TupleSchema<S>;
|
|
198
236
|
enum: <const T extends readonly [string, ...string[]]>(values: T) => EnumSchema<T>;
|
|
199
237
|
unknown: () => UnknownSchema;
|
|
238
|
+
null: () => NullSchema;
|
|
200
239
|
};
|
|
201
240
|
export {};
|
|
202
241
|
//# sourceMappingURL=primitives.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"primitives.d.ts","sourceRoot":"","sources":["../../../src/schema/json/primitives.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAE7D,MAAM,MAAM,SAAS,GACjB,aAAa,GACb,SAAS,EAAE,GACX;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAEjC,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC;AAEhC,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,UAAU,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,qBAAa,qBAAsB,SAAQ,KAAK;aAG5B,IAAI,EAAE,MAAM,EAAE;IAFhC,YACE,OAAO,EAAE,MAAM,EACC,IAAI,GAAE,MAAM,EAAO,EAIpC;CACF;AAED
|
|
1
|
+
{"version":3,"file":"primitives.d.ts","sourceRoot":"","sources":["../../../src/schema/json/primitives.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,10 +7,11 @@ export class SchemaValidationError extends Error {
|
|
|
7
7
|
}
|
|
8
8
|
}
|
|
9
9
|
/**
|
|
10
|
-
* 所有 Schema
|
|
10
|
+
* 所有 Schema 的抽象基类。
|
|
11
11
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
12
|
+
* 只负责 description 与描述输出;nullability 由 `NullableSchema` 提供。
|
|
13
|
+
* `UnknownSchema` / `NullSchema` 直接继承本类——它们天然接受 null,
|
|
14
|
+
* 不需要 `.nullable()`。
|
|
14
15
|
*/
|
|
15
16
|
export class Schema {
|
|
16
17
|
description;
|
|
@@ -22,7 +23,6 @@ export class Schema {
|
|
|
22
23
|
}
|
|
23
24
|
/**
|
|
24
25
|
* 创建保留原型和现有字段的新实例,供不可变链式方法使用。
|
|
25
|
-
* Schema 子类的状态字段会一并复制,因此扩展类仍保留自身原型和状态。
|
|
26
26
|
*/
|
|
27
27
|
cloneWith(updates) {
|
|
28
28
|
const clone = Object.assign(Object.create(Object.getPrototypeOf(this)), this);
|
|
@@ -58,53 +58,39 @@ export class Schema {
|
|
|
58
58
|
}
|
|
59
59
|
}
|
|
60
60
|
/**
|
|
61
|
-
*
|
|
62
|
-
* 通过 nullable() 显式接受 null。
|
|
63
|
-
*/
|
|
64
|
-
export class NullableCapableSchema extends Schema {
|
|
65
|
-
nullable() {
|
|
66
|
-
return new NullableSchema(this);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* nullable 包装器。
|
|
61
|
+
* 支持 nullability 的 Schema 基类。
|
|
71
62
|
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
63
|
+
* 除 `UnknownSchema` / `NullSchema` 外的所有具体 Schema 都继承本类。
|
|
64
|
+
*
|
|
65
|
+
* - `nullable()` / `nullable(true)` → 允许 null
|
|
66
|
+
* - `nullable(false)` → 不允许 null(撤销之前的标记)
|
|
67
|
+
*
|
|
68
|
+
* `_parse` 在调用子类 `_parseValue` 前统一做 null 短路;
|
|
69
|
+
* `toJSON()` 在基类输出上附加 `nullable: true`。
|
|
74
70
|
*/
|
|
75
71
|
export class NullableSchema extends Schema {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
72
|
+
_nullable = false;
|
|
73
|
+
nullable(value = true) {
|
|
74
|
+
return this.cloneWith({ _nullable: value });
|
|
75
|
+
}
|
|
76
|
+
isNullable() {
|
|
77
|
+
return this._nullable;
|
|
81
78
|
}
|
|
82
79
|
_parse(input, path) {
|
|
83
|
-
if (input === null) {
|
|
80
|
+
if (this._nullable && input === null) {
|
|
84
81
|
return null;
|
|
85
82
|
}
|
|
86
|
-
|
|
87
|
-
return this.inner.parse(input);
|
|
88
|
-
}
|
|
89
|
-
catch (error) {
|
|
90
|
-
if (error instanceof SchemaValidationError) {
|
|
91
|
-
throw new SchemaValidationError(error.message, [
|
|
92
|
-
...path,
|
|
93
|
-
...error.path,
|
|
94
|
-
]);
|
|
95
|
-
}
|
|
96
|
-
throw error;
|
|
97
|
-
}
|
|
83
|
+
return this._parseValue(input, path);
|
|
98
84
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
nullable
|
|
103
|
-
|
|
104
|
-
|
|
85
|
+
toJSON() {
|
|
86
|
+
const result = super.toJSON();
|
|
87
|
+
if (this._nullable) {
|
|
88
|
+
result.nullable = true;
|
|
89
|
+
}
|
|
90
|
+
return result;
|
|
105
91
|
}
|
|
106
92
|
}
|
|
107
|
-
export class StringSchema extends
|
|
93
|
+
export class StringSchema extends NullableSchema {
|
|
108
94
|
kind = "string";
|
|
109
95
|
constructor() {
|
|
110
96
|
super();
|
|
@@ -119,7 +105,7 @@ export class StringSchema extends NullableCapableSchema {
|
|
|
119
105
|
this.validateBound(value);
|
|
120
106
|
return this.cloneWith({ maximum: value });
|
|
121
107
|
}
|
|
122
|
-
|
|
108
|
+
_parseValue(input, path) {
|
|
123
109
|
if (typeof input !== "string") {
|
|
124
110
|
return this.fail("Expected a string", path);
|
|
125
111
|
}
|
|
@@ -146,7 +132,7 @@ export class StringSchema extends NullableCapableSchema {
|
|
|
146
132
|
}
|
|
147
133
|
}
|
|
148
134
|
}
|
|
149
|
-
export class NumberSchema extends
|
|
135
|
+
export class NumberSchema extends NullableSchema {
|
|
150
136
|
kind = "number";
|
|
151
137
|
constructor() {
|
|
152
138
|
super();
|
|
@@ -161,7 +147,7 @@ export class NumberSchema extends NullableCapableSchema {
|
|
|
161
147
|
this.validateBound(value);
|
|
162
148
|
return this.cloneWith({ maximum: value });
|
|
163
149
|
}
|
|
164
|
-
|
|
150
|
+
_parseValue(input, path) {
|
|
165
151
|
if (typeof input !== "number" || !globalThis.Number.isFinite(input)) {
|
|
166
152
|
return this.fail("Expected a finite number", path);
|
|
167
153
|
}
|
|
@@ -188,12 +174,12 @@ export class NumberSchema extends NullableCapableSchema {
|
|
|
188
174
|
}
|
|
189
175
|
}
|
|
190
176
|
}
|
|
191
|
-
export class BooleanSchema extends
|
|
177
|
+
export class BooleanSchema extends NullableSchema {
|
|
192
178
|
kind = "boolean";
|
|
193
179
|
constructor() {
|
|
194
180
|
super();
|
|
195
181
|
}
|
|
196
|
-
|
|
182
|
+
_parseValue(input, path) {
|
|
197
183
|
if (typeof input !== "boolean") {
|
|
198
184
|
return this.fail("Expected a boolean", path);
|
|
199
185
|
}
|
|
@@ -203,7 +189,7 @@ export class BooleanSchema extends NullableCapableSchema {
|
|
|
203
189
|
return { kind: this.kind };
|
|
204
190
|
}
|
|
205
191
|
}
|
|
206
|
-
export class LiteralSchema extends
|
|
192
|
+
export class LiteralSchema extends NullableSchema {
|
|
207
193
|
expected;
|
|
208
194
|
kind = "literal";
|
|
209
195
|
constructor(expected) {
|
|
@@ -212,11 +198,12 @@ export class LiteralSchema extends NullableCapableSchema {
|
|
|
212
198
|
if (typeof expected === "number" && !Number.isFinite(expected)) {
|
|
213
199
|
throw new TypeError("LiteralSchema expected number must be finite");
|
|
214
200
|
}
|
|
215
|
-
if (expected
|
|
216
|
-
throw new TypeError("LiteralSchema expected value must be a string, number, boolean
|
|
201
|
+
if (expected === null || !["string", "number", "boolean"].includes(typeof expected)) {
|
|
202
|
+
throw new TypeError("LiteralSchema expected value must be a string, number, or boolean. " +
|
|
203
|
+
"Use s.null() for null, or .nullable() to allow null alongside a literal.");
|
|
217
204
|
}
|
|
218
205
|
}
|
|
219
|
-
|
|
206
|
+
_parseValue(input, path) {
|
|
220
207
|
if (input !== this.expected) {
|
|
221
208
|
return this.fail(`Expected literal ${JSON.stringify(this.expected)}`, path);
|
|
222
209
|
}
|
|
@@ -229,7 +216,7 @@ export class LiteralSchema extends NullableCapableSchema {
|
|
|
229
216
|
};
|
|
230
217
|
}
|
|
231
218
|
}
|
|
232
|
-
export class ArraySchema extends
|
|
219
|
+
export class ArraySchema extends NullableSchema {
|
|
233
220
|
itemSchema;
|
|
234
221
|
kind = "array";
|
|
235
222
|
minimum;
|
|
@@ -246,7 +233,7 @@ export class ArraySchema extends NullableCapableSchema {
|
|
|
246
233
|
this.validateBound(value);
|
|
247
234
|
return this.cloneWith({ maximum: value });
|
|
248
235
|
}
|
|
249
|
-
|
|
236
|
+
_parseValue(input, path) {
|
|
250
237
|
if (!globalThis.Array.isArray(input)) {
|
|
251
238
|
return this.fail("Expected an array", path);
|
|
252
239
|
}
|
|
@@ -287,7 +274,7 @@ export class ArraySchema extends NullableCapableSchema {
|
|
|
287
274
|
}
|
|
288
275
|
}
|
|
289
276
|
}
|
|
290
|
-
export class ObjectSchema extends
|
|
277
|
+
export class ObjectSchema extends NullableSchema {
|
|
291
278
|
shape;
|
|
292
279
|
kind = "object";
|
|
293
280
|
isStrict;
|
|
@@ -302,7 +289,7 @@ export class ObjectSchema extends NullableCapableSchema {
|
|
|
302
289
|
strict() {
|
|
303
290
|
return new ObjectSchema(this.shape, true, this.getDescription());
|
|
304
291
|
}
|
|
305
|
-
|
|
292
|
+
_parseValue(input, path) {
|
|
306
293
|
if (input === null ||
|
|
307
294
|
typeof input !== "object" ||
|
|
308
295
|
globalThis.Array.isArray(input)) {
|
|
@@ -361,7 +348,7 @@ export class ObjectSchema extends NullableCapableSchema {
|
|
|
361
348
|
};
|
|
362
349
|
}
|
|
363
350
|
}
|
|
364
|
-
export class RecordSchema extends
|
|
351
|
+
export class RecordSchema extends NullableSchema {
|
|
365
352
|
valueSchema;
|
|
366
353
|
kind = "record";
|
|
367
354
|
minimum;
|
|
@@ -378,7 +365,7 @@ export class RecordSchema extends NullableCapableSchema {
|
|
|
378
365
|
this.validateBound(value);
|
|
379
366
|
return this.cloneWith({ maximum: value });
|
|
380
367
|
}
|
|
381
|
-
|
|
368
|
+
_parseValue(input, path) {
|
|
382
369
|
if (input === null ||
|
|
383
370
|
typeof input !== "object" ||
|
|
384
371
|
globalThis.Array.isArray(input)) {
|
|
@@ -424,19 +411,31 @@ export class RecordSchema extends NullableCapableSchema {
|
|
|
424
411
|
}
|
|
425
412
|
}
|
|
426
413
|
}
|
|
427
|
-
|
|
428
|
-
|
|
414
|
+
/**
|
|
415
|
+
* 联合。
|
|
416
|
+
*
|
|
417
|
+
* 传入的 member schemas 会被 clone 并 `nullable(false)`——因为「某个
|
|
418
|
+
* 分支允许 null」这件事在 union 层面没有意义:null 是否允许应通过
|
|
419
|
+
* `union(...).nullable()` 统一表达。
|
|
420
|
+
*/
|
|
421
|
+
export class UnionSchema extends NullableSchema {
|
|
429
422
|
kind = "union";
|
|
423
|
+
options;
|
|
430
424
|
constructor(schemas) {
|
|
431
425
|
super();
|
|
432
|
-
this.schemas = schemas;
|
|
433
426
|
if (schemas.length === 0) {
|
|
434
427
|
throw new TypeError("UnionSchema requires at least one schema");
|
|
435
428
|
}
|
|
429
|
+
this.options = schemas.map((schema) => {
|
|
430
|
+
if (schema instanceof NullableSchema) {
|
|
431
|
+
return schema.nullable(false);
|
|
432
|
+
}
|
|
433
|
+
return schema;
|
|
434
|
+
});
|
|
436
435
|
}
|
|
437
|
-
|
|
436
|
+
_parseValue(input, path) {
|
|
438
437
|
const errors = [];
|
|
439
|
-
for (const schema of this.
|
|
438
|
+
for (const schema of this.options) {
|
|
440
439
|
try {
|
|
441
440
|
return schema.parse(input);
|
|
442
441
|
}
|
|
@@ -454,12 +453,12 @@ export class UnionSchema extends NullableCapableSchema {
|
|
|
454
453
|
return {
|
|
455
454
|
kind: this.kind,
|
|
456
455
|
children: {
|
|
457
|
-
options: this.
|
|
456
|
+
options: this.options.map((schema) => schema.toJSON()),
|
|
458
457
|
},
|
|
459
458
|
};
|
|
460
459
|
}
|
|
461
460
|
}
|
|
462
|
-
export class TupleSchema extends
|
|
461
|
+
export class TupleSchema extends NullableSchema {
|
|
463
462
|
schemas;
|
|
464
463
|
kind = "tuple";
|
|
465
464
|
constructor(schemas) {
|
|
@@ -469,7 +468,7 @@ export class TupleSchema extends NullableCapableSchema {
|
|
|
469
468
|
throw new TypeError("TupleSchema requires at least one schema");
|
|
470
469
|
}
|
|
471
470
|
}
|
|
472
|
-
|
|
471
|
+
_parseValue(input, path) {
|
|
473
472
|
if (!Array.isArray(input)) {
|
|
474
473
|
return this.fail("Expected an array", path);
|
|
475
474
|
}
|
|
@@ -500,7 +499,13 @@ export class TupleSchema extends NullableCapableSchema {
|
|
|
500
499
|
};
|
|
501
500
|
}
|
|
502
501
|
}
|
|
503
|
-
|
|
502
|
+
/**
|
|
503
|
+
* 字符串枚举。
|
|
504
|
+
*
|
|
505
|
+
* 继承 `NullableSchema`,因此可以 `s.enum([...]).nullable()`;
|
|
506
|
+
* 它不包含嵌套 schema,所以不需要像 union 那样处理成员 nullability。
|
|
507
|
+
*/
|
|
508
|
+
export class EnumSchema extends NullableSchema {
|
|
504
509
|
values;
|
|
505
510
|
kind = "enum";
|
|
506
511
|
allowedValues;
|
|
@@ -509,7 +514,7 @@ export class EnumSchema extends NullableCapableSchema {
|
|
|
509
514
|
this.values = values;
|
|
510
515
|
this.allowedValues = new Set(values);
|
|
511
516
|
}
|
|
512
|
-
|
|
517
|
+
_parseValue(input, path) {
|
|
513
518
|
if (typeof input !== "string" || !this.allowedValues.has(input)) {
|
|
514
519
|
return this.fail(`Expected one of: ${this.values.join(", ")}`, path);
|
|
515
520
|
}
|
|
@@ -526,7 +531,8 @@ export class EnumSchema extends NullableCapableSchema {
|
|
|
526
531
|
* 校验任意 JSON 值。
|
|
527
532
|
*
|
|
528
533
|
* 不允许 undefined、非有限数字、循环引用等非 JSON 数据。
|
|
529
|
-
*
|
|
534
|
+
* null 本身就在接受范围内,因此不继承 `NullableSchema`,也不提供
|
|
535
|
+
* `.nullable()`——那是冗余的。
|
|
530
536
|
*/
|
|
531
537
|
export class UnknownSchema extends Schema {
|
|
532
538
|
kind = "unknown";
|
|
@@ -541,6 +547,27 @@ export class UnknownSchema extends Schema {
|
|
|
541
547
|
return { kind: this.kind };
|
|
542
548
|
}
|
|
543
549
|
}
|
|
550
|
+
/**
|
|
551
|
+
* 精确的 null 值。
|
|
552
|
+
*
|
|
553
|
+
* 与 `UnknownSchema` 一样天然表达 null,不需要 `.nullable()`。
|
|
554
|
+
* 想表达「某类型或 null」用 `.nullable()`;想表达「就是 null」用 `s.null()`。
|
|
555
|
+
*/
|
|
556
|
+
export class NullSchema extends Schema {
|
|
557
|
+
kind = "null";
|
|
558
|
+
constructor() {
|
|
559
|
+
super();
|
|
560
|
+
}
|
|
561
|
+
_parse(input, path) {
|
|
562
|
+
if (input !== null) {
|
|
563
|
+
return this.fail("Expected null", path);
|
|
564
|
+
}
|
|
565
|
+
return null;
|
|
566
|
+
}
|
|
567
|
+
_describe() {
|
|
568
|
+
return { kind: this.kind };
|
|
569
|
+
}
|
|
570
|
+
}
|
|
544
571
|
function assertJSONValue(value, path, ancestors = new Set()) {
|
|
545
572
|
if (value === null ||
|
|
546
573
|
typeof value === "string" ||
|
|
@@ -594,5 +621,6 @@ export const primitives = {
|
|
|
594
621
|
tuple: (schemas) => new TupleSchema(schemas),
|
|
595
622
|
enum: (values) => new EnumSchema(values),
|
|
596
623
|
unknown: () => new UnknownSchema(),
|
|
624
|
+
null: () => new NullSchema(),
|
|
597
625
|
};
|
|
598
626
|
//# sourceMappingURL=primitives.js.map
|