schema-dsl 2.0.0 → 2.0.1
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/CHANGELOG.md +130 -113
- package/LICENSE +21 -21
- package/README.md +628 -628
- package/dist/{DslBuilder-DkLaOo9Q.d.ts → DslBuilder-BIgQOAXp.d.ts} +2 -0
- package/dist/{DslBuilder-DQDN0ZxZ.d.cts → DslBuilder-CjHTucNQ.d.cts} +2 -0
- package/dist/{Validator-hFWKGxir.d.ts → Validator-CllRdrY0.d.ts} +1 -1
- package/dist/{Validator-C7GsVQOH.d.cts → Validator-D6okG9tr.d.cts} +1 -1
- package/dist/index.cjs +75 -29
- package/dist/index.d.cts +10 -4
- package/dist/index.d.ts +10 -4
- package/dist/index.js +75 -29
- package/dist/plugins/custom-format.cjs +33 -17
- package/dist/plugins/custom-format.d.cts +1 -1
- package/dist/plugins/custom-format.d.ts +1 -1
- package/dist/plugins/custom-format.js +33 -17
- package/dist/plugins/custom-type-example.cjs +33 -17
- package/dist/plugins/custom-type-example.d.cts +1 -1
- package/dist/plugins/custom-type-example.d.ts +1 -1
- package/dist/plugins/custom-type-example.js +33 -17
- package/dist/plugins/custom-validator.cjs +0 -2
- package/dist/plugins/custom-validator.d.cts +1 -1
- package/dist/plugins/custom-validator.d.ts +1 -1
- package/dist/plugins/custom-validator.js +0 -2
- package/docs/FEATURE-INDEX.md +553 -553
- package/docs/add-custom-locale.md +496 -496
- package/docs/add-keyword.md +24 -24
- package/docs/api-reference.md +1047 -1047
- package/docs/api.md +13 -13
- package/docs/best-practices-project-structure.md +417 -417
- package/docs/best-practices.md +712 -712
- package/docs/cache-manager.md +344 -344
- package/docs/compile.md +45 -45
- package/docs/conditional-api.md +1307 -1307
- package/docs/custom-extensions-guide.md +339 -339
- package/docs/design-philosophy.md +606 -606
- package/docs/doc-index.md +324 -324
- package/docs/dsl-syntax.md +714 -714
- package/docs/dynamic-locale.md +608 -608
- package/docs/enum.md +482 -482
- package/docs/error-handling.md +1975 -1975
- package/docs/export-guide.md +501 -501
- package/docs/export-limitations.md +567 -567
- package/docs/faq.md +596 -596
- package/docs/frontend-i18n-guide.md +307 -307
- package/docs/i18n-user-guide.md +487 -487
- package/docs/i18n.md +476 -476
- package/docs/index.md +48 -48
- package/docs/json-schema-basics.md +40 -40
- package/docs/label-vs-description.md +271 -271
- package/docs/markdown-exporter.md +406 -406
- package/docs/mongodb-exporter.md +302 -302
- package/docs/multi-language.md +26 -26
- package/docs/multi-type-support.md +322 -322
- package/docs/mysql-exporter.md +280 -280
- package/docs/number-operators.md +449 -449
- package/docs/optional-marker-guide.md +326 -326
- package/docs/performance-guide.md +49 -49
- package/docs/plugin-system.md +381 -381
- package/docs/plugin-type-registration.md +34 -34
- package/docs/postgresql-exporter.md +311 -311
- package/docs/public/favicon.svg +4 -4
- package/docs/quick-start.md +435 -435
- package/docs/runtime-locale-support.md +532 -532
- package/docs/schema-helper.md +345 -345
- package/docs/schema-utils-advanced-issues.md +23 -23
- package/docs/schema-utils-best-practices.md +20 -20
- package/docs/schema-utils-chaining.md +150 -150
- package/docs/schema-utils.md +524 -524
- package/docs/security-checklist.md +20 -20
- package/docs/string-extensions.md +488 -488
- package/docs/troubleshooting.md +486 -486
- package/docs/type-converter.md +310 -310
- package/docs/type-reference.md +242 -242
- package/docs/typescript-guide.md +584 -584
- package/docs/union-type-guide.md +157 -157
- package/docs/union-types.md +284 -284
- package/docs/validate-async.md +491 -491
- package/docs/validate-batch.md +49 -49
- package/docs/validate-dsl-object-support.md +578 -578
- package/docs/validate.md +506 -506
- package/docs/validation-guide.md +502 -502
- package/docs/validator.md +39 -39
- package/package.json +131 -131
- package/plugins/custom-format.cjs +8 -8
- package/plugins/custom-type-example.cjs +8 -8
- package/plugins/custom-validator.cjs +8 -8
- package/src/adapters/DslAdapter.ts +111 -111
- package/src/adapters/index.ts +1 -1
- package/src/config/constants.ts +83 -83
- package/src/config/index.ts +2 -2
- package/src/config/patterns.ts +77 -77
- package/src/core/CacheManager.ts +169 -159
- package/src/core/ConditionalBuilder.ts +382 -382
- package/src/core/ConditionalRuntime.ts +27 -27
- package/src/core/ConditionalValidator.ts +254 -254
- package/src/core/DslBuilder.ts +687 -677
- package/src/core/ErrorCodes.ts +38 -38
- package/src/core/ErrorFormatter.ts +271 -271
- package/src/core/JSONSchemaCore.ts +65 -65
- package/src/core/Locale.ts +187 -187
- package/src/core/MessageTemplate.ts +42 -42
- package/src/core/ObjectDslBuilder.ts +64 -64
- package/src/core/PluginManager.ts +326 -326
- package/src/core/StringExtensions.ts +140 -140
- package/src/core/TemplateEngine.ts +44 -44
- package/src/core/Validator.ts +448 -448
- package/src/errors/I18nError.ts +159 -159
- package/src/errors/ValidationError.ts +105 -105
- package/src/exporters/BaseExporter.ts +60 -60
- package/src/exporters/MarkdownExporter.ts +305 -305
- package/src/exporters/MongoDBExporter.ts +126 -126
- package/src/exporters/MySQLExporter.ts +156 -155
- package/src/exporters/PostgreSQLExporter.ts +222 -222
- package/src/exporters/index.ts +18 -18
- package/src/index.ts +651 -633
- package/src/locales/en-US.ts +160 -160
- package/src/locales/es-ES.ts +160 -160
- package/src/locales/fr-FR.ts +160 -160
- package/src/locales/index.ts +103 -103
- package/src/locales/ja-JP.ts +160 -160
- package/src/locales/types.ts +156 -156
- package/src/locales/zh-CN.ts +160 -160
- package/src/parser/ConstraintParser.ts +101 -101
- package/src/parser/DslParser.ts +470 -470
- package/src/parser/SchemaCompiler.ts +66 -66
- package/src/parser/TypeRegistry.ts +250 -250
- package/src/parser/index.ts +6 -6
- package/src/plugins/custom-format.ts +124 -126
- package/src/plugins/custom-type-example.ts +106 -108
- package/src/plugins/custom-validator.ts +138 -140
- package/src/types/conditional.ts +28 -28
- package/src/types/config.ts +59 -59
- package/src/types/dsl.ts +131 -131
- package/src/types/error.ts +60 -60
- package/src/types/index.ts +17 -17
- package/src/types/infer.ts +127 -127
- package/src/types/plugin.ts +58 -58
- package/src/types/safe-regex.d.ts +9 -9
- package/src/types/schema.ts +66 -66
- package/src/types/validate.ts +71 -71
- package/src/utils/SchemaHelper.ts +196 -196
- package/src/utils/SchemaUtils.ts +365 -346
- package/src/utils/TypeConverter.ts +215 -215
- package/src/utils/index.ts +10 -10
- package/src/validators/CustomKeywords.ts +477 -477
package/src/types/infer.ts
CHANGED
|
@@ -1,128 +1,128 @@
|
|
|
1
|
-
type StripMarker<S extends string> = S extends `${infer Base}!` | `${infer Base}?` ? Base : S
|
|
2
|
-
|
|
3
|
-
type KnownDslType =
|
|
4
|
-
| 'string'
|
|
5
|
-
| 'email'
|
|
6
|
-
| 'url'
|
|
7
|
-
| 'uri'
|
|
8
|
-
| 'uuid'
|
|
9
|
-
| 'ipv4'
|
|
10
|
-
| 'ipv6'
|
|
11
|
-
| 'ip'
|
|
12
|
-
| 'hostname'
|
|
13
|
-
| 'date'
|
|
14
|
-
| 'datetime'
|
|
15
|
-
| 'time'
|
|
16
|
-
| 'binary'
|
|
17
|
-
| 'objectId'
|
|
18
|
-
| 'hexColor'
|
|
19
|
-
| 'macAddress'
|
|
20
|
-
| 'cron'
|
|
21
|
-
| 'slug'
|
|
22
|
-
| 'chineseName'
|
|
23
|
-
| 'chinese'
|
|
24
|
-
| 'emailDomain'
|
|
25
|
-
| 'alphanum'
|
|
26
|
-
| 'lower'
|
|
27
|
-
| 'upper'
|
|
28
|
-
| 'json'
|
|
29
|
-
| 'port'
|
|
30
|
-
| 'number'
|
|
31
|
-
| 'integer'
|
|
32
|
-
| 'boolean'
|
|
33
|
-
| 'object'
|
|
34
|
-
| 'array'
|
|
35
|
-
| 'null'
|
|
36
|
-
| 'any'
|
|
37
|
-
|
|
38
|
-
type InferPipeMember<S extends string> = StripMarker<S> extends KnownDslType ? InferDslString<S> : StripMarker<S>
|
|
39
|
-
|
|
40
|
-
type SplitPipe<S extends string> = S extends `${infer Head}|${infer Tail}`
|
|
41
|
-
? InferPipeMember<Head> | SplitPipe<Tail>
|
|
42
|
-
: InferPipeMember<S>
|
|
43
|
-
|
|
44
|
-
type RequiredDslKeys<T extends Record<string, unknown>> = {
|
|
45
|
-
[K in keyof T]: K extends string
|
|
46
|
-
? K extends `${infer Name}!`
|
|
47
|
-
? Name
|
|
48
|
-
: T[K] extends `${string}!`
|
|
49
|
-
? K
|
|
50
|
-
: never
|
|
51
|
-
: never
|
|
52
|
-
}[keyof T]
|
|
53
|
-
|
|
54
|
-
type CleanDslKey<K> = K extends `${infer Name}!` | `${infer Name}?` ? Name : K
|
|
55
|
-
|
|
56
|
-
type InferJsonSchemaProperties<Properties, RequiredKeys extends PropertyKey> =
|
|
57
|
-
& {
|
|
58
|
-
[K in keyof Properties as K extends RequiredKeys ? K : never]-?: InferSchema<Properties[K]>
|
|
59
|
-
}
|
|
60
|
-
& {
|
|
61
|
-
[K in keyof Properties as K extends RequiredKeys ? never : K]?: InferSchema<Properties[K]>
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
type InferDslProperties<T extends Record<string, unknown>, RequiredKeys extends PropertyKey = RequiredDslKeys<T>> =
|
|
65
|
-
& {
|
|
66
|
-
[K in keyof T as CleanDslKey<K> extends RequiredKeys ? CleanDslKey<K> : never]-?: InferSchema<T[K]>
|
|
67
|
-
}
|
|
68
|
-
& {
|
|
69
|
-
[K in keyof T as CleanDslKey<K> extends RequiredKeys ? never : CleanDslKey<K>]?: InferSchema<T[K]>
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export type InferDslString<T extends string> = StripMarker<T> extends `types:${infer Rest}`
|
|
73
|
-
? SplitPipe<Rest>
|
|
74
|
-
: StripMarker<T> extends `enum:${infer Values}`
|
|
75
|
-
? SplitPipe<Values>
|
|
76
|
-
: StripMarker<T> extends `array<${infer Item}>`
|
|
77
|
-
? InferDslString<Item>[]
|
|
78
|
-
: StripMarker<T> extends `${infer Base}:${string}`
|
|
79
|
-
? InferDslString<Base>
|
|
80
|
-
: StripMarker<T> extends 'number' | 'integer' | 'port'
|
|
81
|
-
? number
|
|
82
|
-
: StripMarker<T> extends 'boolean'
|
|
83
|
-
? boolean
|
|
84
|
-
: StripMarker<T> extends 'object'
|
|
85
|
-
? Record<string, unknown>
|
|
86
|
-
: StripMarker<T> extends 'array'
|
|
87
|
-
? unknown[]
|
|
88
|
-
: StripMarker<T> extends 'null'
|
|
89
|
-
? null
|
|
90
|
-
: StripMarker<T> extends 'any'
|
|
91
|
-
? unknown
|
|
92
|
-
: StripMarker<T> extends `${string}|${string}`
|
|
93
|
-
? SplitPipe<StripMarker<T>>
|
|
94
|
-
: string
|
|
95
|
-
|
|
96
|
-
export type InferJsonSchema<T> = T extends { oneOf: readonly (infer Variant)[] }
|
|
97
|
-
? InferSchema<Variant>
|
|
98
|
-
: T extends { anyOf: readonly (infer Variant)[] }
|
|
99
|
-
? InferSchema<Variant>
|
|
100
|
-
: T extends { enum: readonly (infer Value)[] }
|
|
101
|
-
? Value
|
|
102
|
-
: T extends { type: 'object'; properties: infer Properties; required?: readonly (infer RequiredKey)[] }
|
|
103
|
-
? InferJsonSchemaProperties<Properties, Extract<RequiredKey, keyof Properties>>
|
|
104
|
-
: T extends { type: 'array'; items: infer Item }
|
|
105
|
-
? InferSchema<Item>[]
|
|
106
|
-
: T extends { type: 'number' | 'integer' }
|
|
107
|
-
? number
|
|
108
|
-
: T extends { type: 'boolean' }
|
|
109
|
-
? boolean
|
|
110
|
-
: T extends { type: 'null' }
|
|
111
|
-
? null
|
|
112
|
-
: T extends { type: 'object' }
|
|
113
|
-
? Record<string, unknown>
|
|
114
|
-
: T extends { type: 'array' }
|
|
115
|
-
? unknown[]
|
|
116
|
-
: T extends { type: 'string' }
|
|
117
|
-
? string
|
|
118
|
-
: unknown
|
|
119
|
-
|
|
120
|
-
export type InferDslDefinition<T extends Record<string, unknown>> = InferDslProperties<T>
|
|
121
|
-
|
|
122
|
-
export type InferSchema<T> = T extends string
|
|
123
|
-
? InferDslString<T>
|
|
124
|
-
: T extends { type: unknown } | { properties: unknown } | { oneOf: unknown } | { anyOf: unknown } | { enum: unknown }
|
|
125
|
-
? InferJsonSchema<T>
|
|
126
|
-
: T extends Record<string, unknown>
|
|
127
|
-
? InferDslDefinition<T>
|
|
1
|
+
type StripMarker<S extends string> = S extends `${infer Base}!` | `${infer Base}?` ? Base : S
|
|
2
|
+
|
|
3
|
+
type KnownDslType =
|
|
4
|
+
| 'string'
|
|
5
|
+
| 'email'
|
|
6
|
+
| 'url'
|
|
7
|
+
| 'uri'
|
|
8
|
+
| 'uuid'
|
|
9
|
+
| 'ipv4'
|
|
10
|
+
| 'ipv6'
|
|
11
|
+
| 'ip'
|
|
12
|
+
| 'hostname'
|
|
13
|
+
| 'date'
|
|
14
|
+
| 'datetime'
|
|
15
|
+
| 'time'
|
|
16
|
+
| 'binary'
|
|
17
|
+
| 'objectId'
|
|
18
|
+
| 'hexColor'
|
|
19
|
+
| 'macAddress'
|
|
20
|
+
| 'cron'
|
|
21
|
+
| 'slug'
|
|
22
|
+
| 'chineseName'
|
|
23
|
+
| 'chinese'
|
|
24
|
+
| 'emailDomain'
|
|
25
|
+
| 'alphanum'
|
|
26
|
+
| 'lower'
|
|
27
|
+
| 'upper'
|
|
28
|
+
| 'json'
|
|
29
|
+
| 'port'
|
|
30
|
+
| 'number'
|
|
31
|
+
| 'integer'
|
|
32
|
+
| 'boolean'
|
|
33
|
+
| 'object'
|
|
34
|
+
| 'array'
|
|
35
|
+
| 'null'
|
|
36
|
+
| 'any'
|
|
37
|
+
|
|
38
|
+
type InferPipeMember<S extends string> = StripMarker<S> extends KnownDslType ? InferDslString<S> : StripMarker<S>
|
|
39
|
+
|
|
40
|
+
type SplitPipe<S extends string> = S extends `${infer Head}|${infer Tail}`
|
|
41
|
+
? InferPipeMember<Head> | SplitPipe<Tail>
|
|
42
|
+
: InferPipeMember<S>
|
|
43
|
+
|
|
44
|
+
type RequiredDslKeys<T extends Record<string, unknown>> = {
|
|
45
|
+
[K in keyof T]: K extends string
|
|
46
|
+
? K extends `${infer Name}!`
|
|
47
|
+
? Name
|
|
48
|
+
: T[K] extends `${string}!`
|
|
49
|
+
? K
|
|
50
|
+
: never
|
|
51
|
+
: never
|
|
52
|
+
}[keyof T]
|
|
53
|
+
|
|
54
|
+
type CleanDslKey<K> = K extends `${infer Name}!` | `${infer Name}?` ? Name : K
|
|
55
|
+
|
|
56
|
+
type InferJsonSchemaProperties<Properties, RequiredKeys extends PropertyKey> =
|
|
57
|
+
& {
|
|
58
|
+
[K in keyof Properties as K extends RequiredKeys ? K : never]-?: InferSchema<Properties[K]>
|
|
59
|
+
}
|
|
60
|
+
& {
|
|
61
|
+
[K in keyof Properties as K extends RequiredKeys ? never : K]?: InferSchema<Properties[K]>
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
type InferDslProperties<T extends Record<string, unknown>, RequiredKeys extends PropertyKey = RequiredDslKeys<T>> =
|
|
65
|
+
& {
|
|
66
|
+
[K in keyof T as CleanDslKey<K> extends RequiredKeys ? CleanDslKey<K> : never]-?: InferSchema<T[K]>
|
|
67
|
+
}
|
|
68
|
+
& {
|
|
69
|
+
[K in keyof T as CleanDslKey<K> extends RequiredKeys ? never : CleanDslKey<K>]?: InferSchema<T[K]>
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export type InferDslString<T extends string> = StripMarker<T> extends `types:${infer Rest}`
|
|
73
|
+
? SplitPipe<Rest>
|
|
74
|
+
: StripMarker<T> extends `enum:${infer Values}`
|
|
75
|
+
? SplitPipe<Values>
|
|
76
|
+
: StripMarker<T> extends `array<${infer Item}>`
|
|
77
|
+
? InferDslString<Item>[]
|
|
78
|
+
: StripMarker<T> extends `${infer Base}:${string}`
|
|
79
|
+
? InferDslString<Base>
|
|
80
|
+
: StripMarker<T> extends 'number' | 'integer' | 'port'
|
|
81
|
+
? number
|
|
82
|
+
: StripMarker<T> extends 'boolean'
|
|
83
|
+
? boolean
|
|
84
|
+
: StripMarker<T> extends 'object'
|
|
85
|
+
? Record<string, unknown>
|
|
86
|
+
: StripMarker<T> extends 'array'
|
|
87
|
+
? unknown[]
|
|
88
|
+
: StripMarker<T> extends 'null'
|
|
89
|
+
? null
|
|
90
|
+
: StripMarker<T> extends 'any'
|
|
91
|
+
? unknown
|
|
92
|
+
: StripMarker<T> extends `${string}|${string}`
|
|
93
|
+
? SplitPipe<StripMarker<T>>
|
|
94
|
+
: string
|
|
95
|
+
|
|
96
|
+
export type InferJsonSchema<T> = T extends { oneOf: readonly (infer Variant)[] }
|
|
97
|
+
? InferSchema<Variant>
|
|
98
|
+
: T extends { anyOf: readonly (infer Variant)[] }
|
|
99
|
+
? InferSchema<Variant>
|
|
100
|
+
: T extends { enum: readonly (infer Value)[] }
|
|
101
|
+
? Value
|
|
102
|
+
: T extends { type: 'object'; properties: infer Properties; required?: readonly (infer RequiredKey)[] }
|
|
103
|
+
? InferJsonSchemaProperties<Properties, Extract<RequiredKey, keyof Properties>>
|
|
104
|
+
: T extends { type: 'array'; items: infer Item }
|
|
105
|
+
? InferSchema<Item>[]
|
|
106
|
+
: T extends { type: 'number' | 'integer' }
|
|
107
|
+
? number
|
|
108
|
+
: T extends { type: 'boolean' }
|
|
109
|
+
? boolean
|
|
110
|
+
: T extends { type: 'null' }
|
|
111
|
+
? null
|
|
112
|
+
: T extends { type: 'object' }
|
|
113
|
+
? Record<string, unknown>
|
|
114
|
+
: T extends { type: 'array' }
|
|
115
|
+
? unknown[]
|
|
116
|
+
: T extends { type: 'string' }
|
|
117
|
+
? string
|
|
118
|
+
: unknown
|
|
119
|
+
|
|
120
|
+
export type InferDslDefinition<T extends Record<string, unknown>> = InferDslProperties<T>
|
|
121
|
+
|
|
122
|
+
export type InferSchema<T> = T extends string
|
|
123
|
+
? InferDslString<T>
|
|
124
|
+
: T extends { type: unknown } | { properties: unknown } | { oneOf: unknown } | { anyOf: unknown } | { enum: unknown }
|
|
125
|
+
? InferJsonSchema<T>
|
|
126
|
+
: T extends Record<string, unknown>
|
|
127
|
+
? InferDslDefinition<T>
|
|
128
128
|
: unknown
|
package/src/types/plugin.ts
CHANGED
|
@@ -1,58 +1,58 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Built-in hook names (pipeline execution phases).
|
|
3
|
-
*/
|
|
4
|
-
export type HookName =
|
|
5
|
-
| 'beforeParse'
|
|
6
|
-
| 'afterParse'
|
|
7
|
-
| 'beforeCompile'
|
|
8
|
-
| 'afterCompile'
|
|
9
|
-
| 'beforeValidate'
|
|
10
|
-
| 'afterValidate'
|
|
11
|
-
| 'onError'
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Hook function type (accepts arbitrary arguments; compatible with v1 custom hook names).
|
|
15
|
-
*/
|
|
16
|
-
export type HookFn = (...args: unknown[]) => unknown | Promise<unknown>
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Hook context (passed to built-in hooks).
|
|
20
|
-
*/
|
|
21
|
-
export interface HookContext {
|
|
22
|
-
/** Current hook phase. */
|
|
23
|
-
hook: HookName
|
|
24
|
-
/** Data being processed. */
|
|
25
|
-
data?: unknown
|
|
26
|
-
/** DSL definition. */
|
|
27
|
-
schema?: unknown
|
|
28
|
-
/** Additional metadata. */
|
|
29
|
-
meta?: Record<string, unknown>
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Plugin interface (backwards-compatible with v1).
|
|
34
|
-
*/
|
|
35
|
-
export interface Plugin {
|
|
36
|
-
/** Plugin name. */
|
|
37
|
-
name: string
|
|
38
|
-
/** Plugin version. */
|
|
39
|
-
version?: string
|
|
40
|
-
/** Plugin description. */
|
|
41
|
-
description?: string
|
|
42
|
-
/** Plugin options (passed as the second argument to install). */
|
|
43
|
-
options?: Record<string, unknown>
|
|
44
|
-
/** Plugin hook map (supports arbitrary hook names for v1 compatibility). */
|
|
45
|
-
hooks?: Record<string, HookFn>
|
|
46
|
-
/** Install method. */
|
|
47
|
-
install?(core: unknown, options?: unknown, context?: unknown): void
|
|
48
|
-
/** Uninstall method (optional). */
|
|
49
|
-
uninstall?(core?: unknown, context?: unknown): void
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* PluginManager configuration.
|
|
54
|
-
*/
|
|
55
|
-
export interface PluginManagerOptions {
|
|
56
|
-
/** Whether hooks are executed asynchronously (default true). */
|
|
57
|
-
async?: boolean
|
|
58
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Built-in hook names (pipeline execution phases).
|
|
3
|
+
*/
|
|
4
|
+
export type HookName =
|
|
5
|
+
| 'beforeParse'
|
|
6
|
+
| 'afterParse'
|
|
7
|
+
| 'beforeCompile'
|
|
8
|
+
| 'afterCompile'
|
|
9
|
+
| 'beforeValidate'
|
|
10
|
+
| 'afterValidate'
|
|
11
|
+
| 'onError'
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Hook function type (accepts arbitrary arguments; compatible with v1 custom hook names).
|
|
15
|
+
*/
|
|
16
|
+
export type HookFn = (...args: unknown[]) => unknown | Promise<unknown>
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Hook context (passed to built-in hooks).
|
|
20
|
+
*/
|
|
21
|
+
export interface HookContext {
|
|
22
|
+
/** Current hook phase. */
|
|
23
|
+
hook: HookName
|
|
24
|
+
/** Data being processed. */
|
|
25
|
+
data?: unknown
|
|
26
|
+
/** DSL definition. */
|
|
27
|
+
schema?: unknown
|
|
28
|
+
/** Additional metadata. */
|
|
29
|
+
meta?: Record<string, unknown>
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Plugin interface (backwards-compatible with v1).
|
|
34
|
+
*/
|
|
35
|
+
export interface Plugin {
|
|
36
|
+
/** Plugin name. */
|
|
37
|
+
name: string
|
|
38
|
+
/** Plugin version. */
|
|
39
|
+
version?: string
|
|
40
|
+
/** Plugin description. */
|
|
41
|
+
description?: string
|
|
42
|
+
/** Plugin options (passed as the second argument to install). */
|
|
43
|
+
options?: Record<string, unknown>
|
|
44
|
+
/** Plugin hook map (supports arbitrary hook names for v1 compatibility). */
|
|
45
|
+
hooks?: Record<string, HookFn>
|
|
46
|
+
/** Install method. */
|
|
47
|
+
install?(core: unknown, options?: unknown, context?: unknown): void
|
|
48
|
+
/** Uninstall method (optional). */
|
|
49
|
+
uninstall?(core?: unknown, context?: unknown): void
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* PluginManager configuration.
|
|
54
|
+
*/
|
|
55
|
+
export interface PluginManagerOptions {
|
|
56
|
+
/** Whether hooks are executed asynchronously (default true). */
|
|
57
|
+
async?: boolean
|
|
58
|
+
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
declare module 'safe-regex' {
|
|
2
|
-
interface SafeRegexOptions {
|
|
3
|
-
limit?: number
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
export default function safeRegex(pattern: string | RegExp, options?: SafeRegexOptions): boolean
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
declare module 'safe-regex' {
|
|
2
|
+
interface SafeRegexOptions {
|
|
3
|
+
limit?: number
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
export default function safeRegex(pattern: string | RegExp, options?: SafeRegexOptions): boolean
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
|
package/src/types/schema.ts
CHANGED
|
@@ -1,66 +1,66 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* JSON Schema Draft 7 type definitions.
|
|
3
|
-
* Includes schema-dsl internal keys (prefixed with _; stripped by toJsonSchema()).
|
|
4
|
-
*/
|
|
5
|
-
import type { ErrorMessages } from './error.js'
|
|
6
|
-
|
|
7
|
-
export interface JSONSchema {
|
|
8
|
-
// --- Standard JSON Schema Draft 7 fields ---
|
|
9
|
-
type?: string | string[]
|
|
10
|
-
properties?: Record<string, JSONSchema>
|
|
11
|
-
required?: string[]
|
|
12
|
-
minLength?: number
|
|
13
|
-
maxLength?: number
|
|
14
|
-
minimum?: number
|
|
15
|
-
maximum?: number
|
|
16
|
-
exclusiveMinimum?: number | boolean
|
|
17
|
-
exclusiveMaximum?: number | boolean
|
|
18
|
-
multipleOf?: number
|
|
19
|
-
pattern?: string
|
|
20
|
-
format?: string
|
|
21
|
-
enum?: unknown[]
|
|
22
|
-
const?: unknown
|
|
23
|
-
items?: JSONSchema | JSONSchema[]
|
|
24
|
-
minItems?: number
|
|
25
|
-
maxItems?: number
|
|
26
|
-
uniqueItems?: boolean
|
|
27
|
-
additionalProperties?: boolean | JSONSchema
|
|
28
|
-
allOf?: JSONSchema[]
|
|
29
|
-
anyOf?: JSONSchema[]
|
|
30
|
-
oneOf?: JSONSchema[]
|
|
31
|
-
not?: JSONSchema
|
|
32
|
-
if?: JSONSchema
|
|
33
|
-
then?: JSONSchema
|
|
34
|
-
else?: JSONSchema
|
|
35
|
-
title?: string
|
|
36
|
-
description?: string
|
|
37
|
-
default?: unknown
|
|
38
|
-
examples?: unknown[]
|
|
39
|
-
$ref?: string
|
|
40
|
-
$schema?: string
|
|
41
|
-
$id?: string
|
|
42
|
-
definitions?: Record<string, JSONSchema>
|
|
43
|
-
$defs?: Record<string, JSONSchema>
|
|
44
|
-
|
|
45
|
-
// --- schema-dsl internal keys (used during parsing; stripped on output) ---
|
|
46
|
-
_label?: string
|
|
47
|
-
_customMessages?: Record<string, string>
|
|
48
|
-
_description?: string
|
|
49
|
-
_required?: boolean
|
|
50
|
-
|
|
51
|
-
// Allows custom keyword extensions (AJV custom keywords)
|
|
52
|
-
[key: string]: unknown
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* SchemaIO configuration options (backwards-compatible with v1).
|
|
57
|
-
*/
|
|
58
|
-
export interface SchemaIOOptions {
|
|
59
|
-
allErrors?: boolean
|
|
60
|
-
verbose?: boolean
|
|
61
|
-
messages?: ErrorMessages
|
|
62
|
-
locale?: string
|
|
63
|
-
cache?: boolean
|
|
64
|
-
cacheSize?: number
|
|
65
|
-
[key: string]: unknown
|
|
66
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* JSON Schema Draft 7 type definitions.
|
|
3
|
+
* Includes schema-dsl internal keys (prefixed with _; stripped by toJsonSchema()).
|
|
4
|
+
*/
|
|
5
|
+
import type { ErrorMessages } from './error.js'
|
|
6
|
+
|
|
7
|
+
export interface JSONSchema {
|
|
8
|
+
// --- Standard JSON Schema Draft 7 fields ---
|
|
9
|
+
type?: string | string[]
|
|
10
|
+
properties?: Record<string, JSONSchema>
|
|
11
|
+
required?: string[]
|
|
12
|
+
minLength?: number
|
|
13
|
+
maxLength?: number
|
|
14
|
+
minimum?: number
|
|
15
|
+
maximum?: number
|
|
16
|
+
exclusiveMinimum?: number | boolean
|
|
17
|
+
exclusiveMaximum?: number | boolean
|
|
18
|
+
multipleOf?: number
|
|
19
|
+
pattern?: string
|
|
20
|
+
format?: string
|
|
21
|
+
enum?: unknown[]
|
|
22
|
+
const?: unknown
|
|
23
|
+
items?: JSONSchema | JSONSchema[]
|
|
24
|
+
minItems?: number
|
|
25
|
+
maxItems?: number
|
|
26
|
+
uniqueItems?: boolean
|
|
27
|
+
additionalProperties?: boolean | JSONSchema
|
|
28
|
+
allOf?: JSONSchema[]
|
|
29
|
+
anyOf?: JSONSchema[]
|
|
30
|
+
oneOf?: JSONSchema[]
|
|
31
|
+
not?: JSONSchema
|
|
32
|
+
if?: JSONSchema
|
|
33
|
+
then?: JSONSchema
|
|
34
|
+
else?: JSONSchema
|
|
35
|
+
title?: string
|
|
36
|
+
description?: string
|
|
37
|
+
default?: unknown
|
|
38
|
+
examples?: unknown[]
|
|
39
|
+
$ref?: string
|
|
40
|
+
$schema?: string
|
|
41
|
+
$id?: string
|
|
42
|
+
definitions?: Record<string, JSONSchema>
|
|
43
|
+
$defs?: Record<string, JSONSchema>
|
|
44
|
+
|
|
45
|
+
// --- schema-dsl internal keys (used during parsing; stripped on output) ---
|
|
46
|
+
_label?: string
|
|
47
|
+
_customMessages?: Record<string, string>
|
|
48
|
+
_description?: string
|
|
49
|
+
_required?: boolean
|
|
50
|
+
|
|
51
|
+
// Allows custom keyword extensions (AJV custom keywords)
|
|
52
|
+
[key: string]: unknown
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* SchemaIO configuration options (backwards-compatible with v1).
|
|
57
|
+
*/
|
|
58
|
+
export interface SchemaIOOptions {
|
|
59
|
+
allErrors?: boolean
|
|
60
|
+
verbose?: boolean
|
|
61
|
+
messages?: ErrorMessages
|
|
62
|
+
locale?: string
|
|
63
|
+
cache?: boolean
|
|
64
|
+
cacheSize?: number
|
|
65
|
+
[key: string]: unknown
|
|
66
|
+
}
|
package/src/types/validate.ts
CHANGED
|
@@ -1,71 +1,71 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Validation options.
|
|
3
|
-
*/
|
|
4
|
-
import type { CacheOptions } from './config.js'
|
|
5
|
-
import type { ErrorMessages } from './error.js'
|
|
6
|
-
|
|
7
|
-
export interface ValidateOptions {
|
|
8
|
-
/** Whether to format errors (default true). */
|
|
9
|
-
format?: boolean
|
|
10
|
-
/** Whether to return all errors (default false — only the first). */
|
|
11
|
-
allErrors?: boolean
|
|
12
|
-
/** Dynamically specify a locale (e.g. 'zh-CN', 'en-US', 'ja-JP', 'es-ES', 'fr-FR'). */
|
|
13
|
-
locale?: string
|
|
14
|
-
/** Custom error messages. */
|
|
15
|
-
messages?: ErrorMessages
|
|
16
|
-
/** Whether to enable smart type coercion (auto-converts string → number etc.). */
|
|
17
|
-
smartCoerce?: boolean
|
|
18
|
-
/** Whether to remove additional properties. */
|
|
19
|
-
removeAdditional?: boolean | 'all' | 'failing'
|
|
20
|
-
/** Whether to enable caching. */
|
|
21
|
-
cache?: boolean | CacheOptions
|
|
22
|
-
/** Whether to enable strict mode. */
|
|
23
|
-
strict?: boolean
|
|
24
|
-
[key: string]: unknown
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Validation result.
|
|
29
|
-
*/
|
|
30
|
-
export interface ValidationResult<T = unknown> {
|
|
31
|
-
/** Whether validation passed. */
|
|
32
|
-
valid: boolean
|
|
33
|
-
/** Snapshot of the data after validation (returned on both success and failure; useful for locating input on failure). */
|
|
34
|
-
data?: T
|
|
35
|
-
/** Error list (empty array on success; detailed errors on failure). */
|
|
36
|
-
errors?: ValidationErrorItem[]
|
|
37
|
-
/** First error message (convenience accessor). */
|
|
38
|
-
errorMessage?: string
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Validation error item (element of ValidationResult.errors).
|
|
43
|
-
*/
|
|
44
|
-
export interface ValidationErrorItem {
|
|
45
|
-
/** Error message. */
|
|
46
|
-
message: string
|
|
47
|
-
/** Error field path (dot-separated, e.g. 'user.email'). */
|
|
48
|
-
path: string
|
|
49
|
-
/** Validation keyword (min, max, email, pattern, etc.). */
|
|
50
|
-
keyword: string
|
|
51
|
-
/** Validation parameters. */
|
|
52
|
-
params?: Record<string, unknown>
|
|
53
|
-
/** Alias for path (backwards compatibility). */
|
|
54
|
-
field?: string
|
|
55
|
-
/** Alias for keyword (backwards-compatible with v1 err.type). */
|
|
56
|
-
type?: string | undefined
|
|
57
|
-
/** Expected type (backwards-compatible with v1 err.expected; only present for type errors). */
|
|
58
|
-
expected?: string | undefined
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Raw AJV error object type (internal use).
|
|
63
|
-
*/
|
|
64
|
-
export interface AjvError {
|
|
65
|
-
keyword: string
|
|
66
|
-
instancePath: string
|
|
67
|
-
schemaPath: string
|
|
68
|
-
params: Record<string, unknown>
|
|
69
|
-
message?: string
|
|
70
|
-
data?: unknown
|
|
71
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Validation options.
|
|
3
|
+
*/
|
|
4
|
+
import type { CacheOptions } from './config.js'
|
|
5
|
+
import type { ErrorMessages } from './error.js'
|
|
6
|
+
|
|
7
|
+
export interface ValidateOptions {
|
|
8
|
+
/** Whether to format errors (default true). */
|
|
9
|
+
format?: boolean
|
|
10
|
+
/** Whether to return all errors (default false — only the first). */
|
|
11
|
+
allErrors?: boolean
|
|
12
|
+
/** Dynamically specify a locale (e.g. 'zh-CN', 'en-US', 'ja-JP', 'es-ES', 'fr-FR'). */
|
|
13
|
+
locale?: string
|
|
14
|
+
/** Custom error messages. */
|
|
15
|
+
messages?: ErrorMessages
|
|
16
|
+
/** Whether to enable smart type coercion (auto-converts string → number etc.). */
|
|
17
|
+
smartCoerce?: boolean
|
|
18
|
+
/** Whether to remove additional properties. */
|
|
19
|
+
removeAdditional?: boolean | 'all' | 'failing'
|
|
20
|
+
/** Whether to enable caching. */
|
|
21
|
+
cache?: boolean | CacheOptions
|
|
22
|
+
/** Whether to enable strict mode. */
|
|
23
|
+
strict?: boolean
|
|
24
|
+
[key: string]: unknown
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Validation result.
|
|
29
|
+
*/
|
|
30
|
+
export interface ValidationResult<T = unknown> {
|
|
31
|
+
/** Whether validation passed. */
|
|
32
|
+
valid: boolean
|
|
33
|
+
/** Snapshot of the data after validation (returned on both success and failure; useful for locating input on failure). */
|
|
34
|
+
data?: T
|
|
35
|
+
/** Error list (empty array on success; detailed errors on failure). */
|
|
36
|
+
errors?: ValidationErrorItem[]
|
|
37
|
+
/** First error message (convenience accessor). */
|
|
38
|
+
errorMessage?: string
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Validation error item (element of ValidationResult.errors).
|
|
43
|
+
*/
|
|
44
|
+
export interface ValidationErrorItem {
|
|
45
|
+
/** Error message. */
|
|
46
|
+
message: string
|
|
47
|
+
/** Error field path (dot-separated, e.g. 'user.email'). */
|
|
48
|
+
path: string
|
|
49
|
+
/** Validation keyword (min, max, email, pattern, etc.). */
|
|
50
|
+
keyword: string
|
|
51
|
+
/** Validation parameters. */
|
|
52
|
+
params?: Record<string, unknown>
|
|
53
|
+
/** Alias for path (backwards compatibility). */
|
|
54
|
+
field?: string
|
|
55
|
+
/** Alias for keyword (backwards-compatible with v1 err.type). */
|
|
56
|
+
type?: string | undefined
|
|
57
|
+
/** Expected type (backwards-compatible with v1 err.expected; only present for type errors). */
|
|
58
|
+
expected?: string | undefined
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Raw AJV error object type (internal use).
|
|
63
|
+
*/
|
|
64
|
+
export interface AjvError {
|
|
65
|
+
keyword: string
|
|
66
|
+
instancePath: string
|
|
67
|
+
schemaPath: string
|
|
68
|
+
params: Record<string, unknown>
|
|
69
|
+
message?: string
|
|
70
|
+
data?: unknown
|
|
71
|
+
}
|