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/docs/validator.md
CHANGED
|
@@ -1,39 +1,39 @@
|
|
|
1
|
-
# Validator 类概述
|
|
2
|
-
|
|
3
|
-
`Validator` 是对 AJV 的封装,提供编译缓存、错误格式化、自定义关键字和批量验证能力。
|
|
4
|
-
|
|
5
|
-
```javascript
|
|
6
|
-
const { Validator, dsl } = require('schema-dsl');
|
|
7
|
-
const validator = new Validator();
|
|
8
|
-
const schema = dsl({ email: 'email!' });
|
|
9
|
-
console.log(validator.validate(schema, { email: 'test@example.com' }));
|
|
10
|
-
```
|
|
11
|
-
|
|
12
|
-
## 缓存配置
|
|
13
|
-
|
|
14
|
-
`Validator` 构造器支持两种缓存写法:
|
|
15
|
-
|
|
16
|
-
```javascript
|
|
17
|
-
new Validator({ cache: true }); // 使用默认缓存配置
|
|
18
|
-
new Validator({ cache: false }); // 关闭缓存
|
|
19
|
-
|
|
20
|
-
new Validator({
|
|
21
|
-
cache: {
|
|
22
|
-
enabled: true,
|
|
23
|
-
maxSize: 500,
|
|
24
|
-
ttl: 60 * 60 * 1000
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
> 如果你希望直接传入 DSL 对象(例如 `validate({ email: 'email!' }, data)`),请使用顶层便捷函数 `validate()` / `validateAsync()`;`Validator` 实例方法仍建议接收标准 JSON Schema 或 `dsl({...})` 的转换结果。
|
|
30
|
-
|
|
31
|
-
相关方法:`compile()`、`validate()`、`validateAsync()`、`validateBatch()`、`addKeyword()`、`addFormat()`。
|
|
32
|
-
|
|
33
|
-
---
|
|
34
|
-
|
|
35
|
-
## 对应示例文件
|
|
36
|
-
|
|
37
|
-
**示例入口**: [validator.ts](https://github.com/vextjs/schema-dsl/blob/main/examples/docs/validator.ts)
|
|
38
|
-
**说明**: 覆盖 `new Validator()` 的常见配置、单次验证、编译缓存命中和 `validateBatch()` 复用路径。
|
|
39
|
-
|
|
1
|
+
# Validator 类概述
|
|
2
|
+
|
|
3
|
+
`Validator` 是对 AJV 的封装,提供编译缓存、错误格式化、自定义关键字和批量验证能力。
|
|
4
|
+
|
|
5
|
+
```javascript
|
|
6
|
+
const { Validator, dsl } = require('schema-dsl');
|
|
7
|
+
const validator = new Validator();
|
|
8
|
+
const schema = dsl({ email: 'email!' });
|
|
9
|
+
console.log(validator.validate(schema, { email: 'test@example.com' }));
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## 缓存配置
|
|
13
|
+
|
|
14
|
+
`Validator` 构造器支持两种缓存写法:
|
|
15
|
+
|
|
16
|
+
```javascript
|
|
17
|
+
new Validator({ cache: true }); // 使用默认缓存配置
|
|
18
|
+
new Validator({ cache: false }); // 关闭缓存
|
|
19
|
+
|
|
20
|
+
new Validator({
|
|
21
|
+
cache: {
|
|
22
|
+
enabled: true,
|
|
23
|
+
maxSize: 500,
|
|
24
|
+
ttl: 60 * 60 * 1000
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
> 如果你希望直接传入 DSL 对象(例如 `validate({ email: 'email!' }, data)`),请使用顶层便捷函数 `validate()` / `validateAsync()`;`Validator` 实例方法仍建议接收标准 JSON Schema 或 `dsl({...})` 的转换结果。
|
|
30
|
+
|
|
31
|
+
相关方法:`compile()`、`validate()`、`validateAsync()`、`validateBatch()`、`addKeyword()`、`addFormat()`。
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 对应示例文件
|
|
36
|
+
|
|
37
|
+
**示例入口**: [validator.ts](https://github.com/vextjs/schema-dsl/blob/main/examples/docs/validator.ts)
|
|
38
|
+
**说明**: 覆盖 `new Validator()` 的常见配置、单次验证、编译缓存命中和 `validateBatch()` 复用路径。
|
|
39
|
+
|
package/package.json
CHANGED
|
@@ -1,131 +1,131 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "schema-dsl",
|
|
3
|
-
"version": "2.0.
|
|
4
|
-
"description": "A concise and powerful JSON Schema validation library - DSL syntax + String extensions + convenient validate API",
|
|
5
|
-
"main": "./dist/index.cjs",
|
|
6
|
-
"module": "./dist/index.js",
|
|
7
|
-
"types": "./dist/index.d.ts",
|
|
8
|
-
"exports": {
|
|
9
|
-
".": {
|
|
10
|
-
"import": {
|
|
11
|
-
"types": "./dist/index.d.ts",
|
|
12
|
-
"default": "./dist/index.js"
|
|
13
|
-
},
|
|
14
|
-
"require": {
|
|
15
|
-
"types": "./dist/index.d.cts",
|
|
16
|
-
"default": "./dist/index.cjs"
|
|
17
|
-
}
|
|
18
|
-
},
|
|
19
|
-
"./plugins/custom-format": {
|
|
20
|
-
"import": {
|
|
21
|
-
"types": "./dist/plugins/custom-format.d.ts",
|
|
22
|
-
"default": "./dist/plugins/custom-format.js"
|
|
23
|
-
},
|
|
24
|
-
"require": {
|
|
25
|
-
"types": "./dist/plugins/custom-format.d.cts",
|
|
26
|
-
"default": "./dist/plugins/custom-format.cjs"
|
|
27
|
-
}
|
|
28
|
-
},
|
|
29
|
-
"./plugins/custom-validator": {
|
|
30
|
-
"import": {
|
|
31
|
-
"types": "./dist/plugins/custom-validator.d.ts",
|
|
32
|
-
"default": "./dist/plugins/custom-validator.js"
|
|
33
|
-
},
|
|
34
|
-
"require": {
|
|
35
|
-
"types": "./dist/plugins/custom-validator.d.cts",
|
|
36
|
-
"default": "./dist/plugins/custom-validator.cjs"
|
|
37
|
-
}
|
|
38
|
-
},
|
|
39
|
-
"./plugins/custom-type-example": {
|
|
40
|
-
"import": {
|
|
41
|
-
"types": "./dist/plugins/custom-type-example.d.ts",
|
|
42
|
-
"default": "./dist/plugins/custom-type-example.js"
|
|
43
|
-
},
|
|
44
|
-
"require": {
|
|
45
|
-
"types": "./dist/plugins/custom-type-example.d.cts",
|
|
46
|
-
"default": "./dist/plugins/custom-type-example.cjs"
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
},
|
|
50
|
-
"scripts": {
|
|
51
|
-
"build": "tsup",
|
|
52
|
-
"dev": "tsup --watch",
|
|
53
|
-
"test": "vitest run",
|
|
54
|
-
"test:watch": "vitest",
|
|
55
|
-
"test:coverage": "vitest run --coverage",
|
|
56
|
-
"typecheck": "tsc --noEmit",
|
|
57
|
-
"examples:typecheck": "tsc -p tsconfig.examples.json --noEmit",
|
|
58
|
-
"examples:build": "tsc -p tsconfig.examples.json",
|
|
59
|
-
"lint": "eslint src/**/*.ts",
|
|
60
|
-
"test:version": "node -e \"const p=require('./package.json');const {VERSION}=require('./dist/index.cjs');if(p.version!==VERSION)throw new Error('Version mismatch: '+p.version+' vs '+VERSION);console.log('Version OK:',p.version)\"",
|
|
61
|
-
"bench": "node test/benchmarks/library-comparison.js",
|
|
62
|
-
"prepublishOnly": "npm run build && npm run typecheck && npm test"
|
|
63
|
-
},
|
|
64
|
-
"keywords": [
|
|
65
|
-
"schema",
|
|
66
|
-
"validation",
|
|
67
|
-
"validator",
|
|
68
|
-
"dsl",
|
|
69
|
-
"json-schema",
|
|
70
|
-
"data-validation",
|
|
71
|
-
"form-validation",
|
|
72
|
-
"mongodb",
|
|
73
|
-
"mysql",
|
|
74
|
-
"postgresql",
|
|
75
|
-
"database-schema",
|
|
76
|
-
"i18n",
|
|
77
|
-
"internationalization",
|
|
78
|
-
"typescript",
|
|
79
|
-
"express",
|
|
80
|
-
"koa",
|
|
81
|
-
"fastify",
|
|
82
|
-
"rest-api",
|
|
83
|
-
"input-validation"
|
|
84
|
-
],
|
|
85
|
-
"author": "rocky <rockyshi1993@gmail.com>",
|
|
86
|
-
"license": "MIT",
|
|
87
|
-
"repository": {
|
|
88
|
-
"type": "git",
|
|
89
|
-
"url": "https://github.com/vextjs/schema-dsl.git"
|
|
90
|
-
},
|
|
91
|
-
"bugs": {
|
|
92
|
-
"url": "https://github.com/vextjs/schema-dsl/issues"
|
|
93
|
-
},
|
|
94
|
-
"homepage": "https://github.com/vextjs/schema-dsl#readme",
|
|
95
|
-
"engines": {
|
|
96
|
-
"node": ">=18.0.0"
|
|
97
|
-
},
|
|
98
|
-
"dependencies": {
|
|
99
|
-
"ajv": "^8.18.0",
|
|
100
|
-
"ajv-formats": "^2.1.1",
|
|
101
|
-
"cache-hub": "^1.0.0",
|
|
102
|
-
"json5": "^2.2.3",
|
|
103
|
-
"safe-regex": "^2.1.1"
|
|
104
|
-
},
|
|
105
|
-
"devDependencies": {
|
|
106
|
-
"@types/node": "^25.6.0",
|
|
107
|
-
"@typescript-eslint/eslint-plugin": "^8.0.0",
|
|
108
|
-
"@typescript-eslint/parser": "^8.0.0",
|
|
109
|
-
"@vitest/coverage-v8": "^3.0.0",
|
|
110
|
-
"eslint": "^9.0.0",
|
|
111
|
-
"fastest-validator": "^1.19.1",
|
|
112
|
-
"joi": "^18.1.2",
|
|
113
|
-
"tsup": "^8.0.0",
|
|
114
|
-
"typescript": "^5.5.0",
|
|
115
|
-
"vitest": "^3.0.0",
|
|
116
|
-
"yup": "^1.7.1",
|
|
117
|
-
"zod": "^4.3.6"
|
|
118
|
-
},
|
|
119
|
-
"type": "module",
|
|
120
|
-
"files": [
|
|
121
|
-
"dist/**/*.js",
|
|
122
|
-
"dist/**/*.cjs",
|
|
123
|
-
"dist/**/*.d.ts",
|
|
124
|
-
"dist/**/*.d.cts",
|
|
125
|
-
"plugins",
|
|
126
|
-
"src",
|
|
127
|
-
"docs",
|
|
128
|
-
"README.md",
|
|
129
|
-
"CHANGELOG.md"
|
|
130
|
-
]
|
|
131
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "schema-dsl",
|
|
3
|
+
"version": "2.0.1",
|
|
4
|
+
"description": "A concise and powerful JSON Schema validation library - DSL syntax + String extensions + convenient validate API",
|
|
5
|
+
"main": "./dist/index.cjs",
|
|
6
|
+
"module": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"default": "./dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"require": {
|
|
15
|
+
"types": "./dist/index.d.cts",
|
|
16
|
+
"default": "./dist/index.cjs"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"./plugins/custom-format": {
|
|
20
|
+
"import": {
|
|
21
|
+
"types": "./dist/plugins/custom-format.d.ts",
|
|
22
|
+
"default": "./dist/plugins/custom-format.js"
|
|
23
|
+
},
|
|
24
|
+
"require": {
|
|
25
|
+
"types": "./dist/plugins/custom-format.d.cts",
|
|
26
|
+
"default": "./dist/plugins/custom-format.cjs"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"./plugins/custom-validator": {
|
|
30
|
+
"import": {
|
|
31
|
+
"types": "./dist/plugins/custom-validator.d.ts",
|
|
32
|
+
"default": "./dist/plugins/custom-validator.js"
|
|
33
|
+
},
|
|
34
|
+
"require": {
|
|
35
|
+
"types": "./dist/plugins/custom-validator.d.cts",
|
|
36
|
+
"default": "./dist/plugins/custom-validator.cjs"
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"./plugins/custom-type-example": {
|
|
40
|
+
"import": {
|
|
41
|
+
"types": "./dist/plugins/custom-type-example.d.ts",
|
|
42
|
+
"default": "./dist/plugins/custom-type-example.js"
|
|
43
|
+
},
|
|
44
|
+
"require": {
|
|
45
|
+
"types": "./dist/plugins/custom-type-example.d.cts",
|
|
46
|
+
"default": "./dist/plugins/custom-type-example.cjs"
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
"scripts": {
|
|
51
|
+
"build": "tsup",
|
|
52
|
+
"dev": "tsup --watch",
|
|
53
|
+
"test": "vitest run",
|
|
54
|
+
"test:watch": "vitest",
|
|
55
|
+
"test:coverage": "vitest run --coverage",
|
|
56
|
+
"typecheck": "tsc --noEmit",
|
|
57
|
+
"examples:typecheck": "tsc -p tsconfig.examples.json --noEmit",
|
|
58
|
+
"examples:build": "tsc -p tsconfig.examples.json",
|
|
59
|
+
"lint": "eslint src/**/*.ts",
|
|
60
|
+
"test:version": "node -e \"const p=require('./package.json');const {VERSION}=require('./dist/index.cjs');if(p.version!==VERSION)throw new Error('Version mismatch: '+p.version+' vs '+VERSION);console.log('Version OK:',p.version)\"",
|
|
61
|
+
"bench": "node test/benchmarks/library-comparison.js",
|
|
62
|
+
"prepublishOnly": "npm run build && npm run typecheck && npm test"
|
|
63
|
+
},
|
|
64
|
+
"keywords": [
|
|
65
|
+
"schema",
|
|
66
|
+
"validation",
|
|
67
|
+
"validator",
|
|
68
|
+
"dsl",
|
|
69
|
+
"json-schema",
|
|
70
|
+
"data-validation",
|
|
71
|
+
"form-validation",
|
|
72
|
+
"mongodb",
|
|
73
|
+
"mysql",
|
|
74
|
+
"postgresql",
|
|
75
|
+
"database-schema",
|
|
76
|
+
"i18n",
|
|
77
|
+
"internationalization",
|
|
78
|
+
"typescript",
|
|
79
|
+
"express",
|
|
80
|
+
"koa",
|
|
81
|
+
"fastify",
|
|
82
|
+
"rest-api",
|
|
83
|
+
"input-validation"
|
|
84
|
+
],
|
|
85
|
+
"author": "rocky <rockyshi1993@gmail.com>",
|
|
86
|
+
"license": "MIT",
|
|
87
|
+
"repository": {
|
|
88
|
+
"type": "git",
|
|
89
|
+
"url": "https://github.com/vextjs/schema-dsl.git"
|
|
90
|
+
},
|
|
91
|
+
"bugs": {
|
|
92
|
+
"url": "https://github.com/vextjs/schema-dsl/issues"
|
|
93
|
+
},
|
|
94
|
+
"homepage": "https://github.com/vextjs/schema-dsl#readme",
|
|
95
|
+
"engines": {
|
|
96
|
+
"node": ">=18.0.0"
|
|
97
|
+
},
|
|
98
|
+
"dependencies": {
|
|
99
|
+
"ajv": "^8.18.0",
|
|
100
|
+
"ajv-formats": "^2.1.1",
|
|
101
|
+
"cache-hub": "^1.0.0",
|
|
102
|
+
"json5": "^2.2.3",
|
|
103
|
+
"safe-regex": "^2.1.1"
|
|
104
|
+
},
|
|
105
|
+
"devDependencies": {
|
|
106
|
+
"@types/node": "^25.6.0",
|
|
107
|
+
"@typescript-eslint/eslint-plugin": "^8.0.0",
|
|
108
|
+
"@typescript-eslint/parser": "^8.0.0",
|
|
109
|
+
"@vitest/coverage-v8": "^3.0.0",
|
|
110
|
+
"eslint": "^9.0.0",
|
|
111
|
+
"fastest-validator": "^1.19.1",
|
|
112
|
+
"joi": "^18.1.2",
|
|
113
|
+
"tsup": "^8.0.0",
|
|
114
|
+
"typescript": "^5.5.0",
|
|
115
|
+
"vitest": "^3.0.0",
|
|
116
|
+
"yup": "^1.7.1",
|
|
117
|
+
"zod": "^4.3.6"
|
|
118
|
+
},
|
|
119
|
+
"type": "module",
|
|
120
|
+
"files": [
|
|
121
|
+
"dist/**/*.js",
|
|
122
|
+
"dist/**/*.cjs",
|
|
123
|
+
"dist/**/*.d.ts",
|
|
124
|
+
"dist/**/*.d.cts",
|
|
125
|
+
"plugins",
|
|
126
|
+
"src",
|
|
127
|
+
"docs",
|
|
128
|
+
"README.md",
|
|
129
|
+
"CHANGELOG.md"
|
|
130
|
+
]
|
|
131
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const mod = require('../dist/plugins/custom-format.cjs');
|
|
4
|
-
const plugin = mod.default ?? mod.customFormatPlugin ?? mod;
|
|
5
|
-
|
|
6
|
-
module.exports = plugin;
|
|
7
|
-
module.exports.default = plugin;
|
|
8
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const mod = require('../dist/plugins/custom-format.cjs');
|
|
4
|
+
const plugin = mod.default ?? mod.customFormatPlugin ?? mod;
|
|
5
|
+
|
|
6
|
+
module.exports = plugin;
|
|
7
|
+
module.exports.default = plugin;
|
|
8
|
+
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const mod = require('../dist/plugins/custom-type-example.cjs');
|
|
4
|
-
const plugin = mod.default ?? mod.customTypeExamplePlugin ?? mod;
|
|
5
|
-
|
|
6
|
-
module.exports = plugin;
|
|
7
|
-
module.exports.default = plugin;
|
|
8
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const mod = require('../dist/plugins/custom-type-example.cjs');
|
|
4
|
+
const plugin = mod.default ?? mod.customTypeExamplePlugin ?? mod;
|
|
5
|
+
|
|
6
|
+
module.exports = plugin;
|
|
7
|
+
module.exports.default = plugin;
|
|
8
|
+
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const mod = require('../dist/plugins/custom-validator.cjs');
|
|
4
|
-
const plugin = mod.default ?? mod.customValidatorPlugin ?? mod;
|
|
5
|
-
|
|
6
|
-
module.exports = plugin;
|
|
7
|
-
module.exports.default = plugin;
|
|
8
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const mod = require('../dist/plugins/custom-validator.cjs');
|
|
4
|
+
const plugin = mod.default ?? mod.customValidatorPlugin ?? mod;
|
|
5
|
+
|
|
6
|
+
module.exports = plugin;
|
|
7
|
+
module.exports.default = plugin;
|
|
8
|
+
|
|
@@ -1,111 +1,111 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
* DslAdapter — DSL parsing adapter (thin wrapper layer).
|
|
4
|
-
*
|
|
5
|
-
* v2 changes:
|
|
6
|
-
* - All parsing logic delegated to DslParser (replaces v1 DslAdapter._parseType duplication)
|
|
7
|
-
* - Fixes DA-01/DA-02/DA-03 (handled uniformly by the DslParser pipeline)
|
|
8
|
-
* - parseObject delegates to DslParser.parseObject (replaces JSONSchemaCore)
|
|
9
|
-
* - BC-2 fix: parseObject() returns ObjectDslBuilder (supports chain .strict()/.requireAll())
|
|
10
|
-
* - BC-4 fix: typeMap getter exposes all registered types; registerType() convenience entry point
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import type { JSONSchema } from '../types/schema.js'
|
|
14
|
-
import type { DslDefinition } from '../types/dsl.js'
|
|
15
|
-
import { DslParser } from '../parser/DslParser.js'
|
|
16
|
-
import { TypeRegistry } from '../parser/TypeRegistry.js'
|
|
17
|
-
import { ObjectDslBuilder } from '../core/ObjectDslBuilder.js'
|
|
18
|
-
|
|
19
|
-
type DslMarker = Record<string, unknown>
|
|
20
|
-
|
|
21
|
-
export const DslAdapter = {
|
|
22
|
-
/**
|
|
23
|
-
* Parse a DSL string into a JSON Schema.
|
|
24
|
-
* Equivalent to v1 DslAdapter.parseString(), but delegates to the unified DslParser.
|
|
25
|
-
*/
|
|
26
|
-
parseString(dslString: string): JSONSchema {
|
|
27
|
-
if (!dslString || typeof dslString !== 'string') {
|
|
28
|
-
throw new Error('[schema-dsl] DslAdapter.parseString: DSL must be a string')
|
|
29
|
-
}
|
|
30
|
-
return DslParser.parseString(dslString)
|
|
31
|
-
},
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* parse() — alias for parseString() (backwards compat with v1).
|
|
35
|
-
*/
|
|
36
|
-
parse(dslString: string): JSONSchema {
|
|
37
|
-
if (!dslString || typeof dslString !== 'string') {
|
|
38
|
-
throw new Error('[schema-dsl] DslAdapter.parse: DSL must be a string')
|
|
39
|
-
}
|
|
40
|
-
const schema = DslParser.parseString(dslString)
|
|
41
|
-
// v1 compat: always set _required (false if not set)
|
|
42
|
-
if ((schema as Record<string, unknown>)['_required'] === undefined) {
|
|
43
|
-
(schema as Record<string, unknown>)['_required'] = false
|
|
44
|
-
}
|
|
45
|
-
return schema
|
|
46
|
-
},
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Parse an object-form DSL definition → ObjectDslBuilder (BC-2 fix).
|
|
50
|
-
* v1: parseObject() returned a chainable builder (.strict()/.requireAll()).
|
|
51
|
-
* v2 fix: returns ObjectDslBuilder wrapping the compiled JSONSchema.
|
|
52
|
-
*/
|
|
53
|
-
parseObject(dslObj: DslDefinition): ObjectDslBuilder {
|
|
54
|
-
const schema = DslParser.parseObject(dslObj)
|
|
55
|
-
return new ObjectDslBuilder(schema)
|
|
56
|
-
},
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Create a Match marker (v1 compat). The actual JSON Schema is built per target field in parseObject.
|
|
60
|
-
*/
|
|
61
|
-
match(field: string, map: Record<string, unknown>): DslMarker {
|
|
62
|
-
return { _isMatch: true, field, map }
|
|
63
|
-
},
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Create an If marker (v1 compat). The actual JSON Schema is built per target field in parseObject.
|
|
67
|
-
*/
|
|
68
|
-
if(condition: string, thenSchema: unknown, elseSchema?: unknown): DslMarker {
|
|
69
|
-
return { _isIf: true, condition, then: thenSchema, else: elseSchema }
|
|
70
|
-
},
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* toCore() — v1 compat: returns { schema } wrapper
|
|
74
|
-
*/
|
|
75
|
-
toCore(dslInput: string | DslDefinition): { schema: JSONSchema } {
|
|
76
|
-
let schema: JSONSchema
|
|
77
|
-
if (typeof dslInput === 'string') {
|
|
78
|
-
schema = this.parse(dslInput)
|
|
79
|
-
} else {
|
|
80
|
-
schema = DslParser.parseObject(dslInput)
|
|
81
|
-
}
|
|
82
|
-
return { schema }
|
|
83
|
-
},
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* typeMap getter — v1 compat: DslAdapter.typeMap exposes all registered types (BC-4 fix).
|
|
87
|
-
* Assigning typeMap[name] = schema is equivalent to calling TypeRegistry.register(name, schema).
|
|
88
|
-
*/
|
|
89
|
-
get typeMap(): Record<string, JSONSchema> {
|
|
90
|
-
const map: Record<string, JSONSchema> = {}
|
|
91
|
-
for (const [name, def] of TypeRegistry.entries()) {
|
|
92
|
-
map[name] = def.baseSchema as JSONSchema
|
|
93
|
-
}
|
|
94
|
-
return new Proxy(map, {
|
|
95
|
-
set(_target: Record<string, JSONSchema>, key: string, value: JSONSchema) {
|
|
96
|
-
TypeRegistry.register(key, { baseSchema: value })
|
|
97
|
-
return true
|
|
98
|
-
},
|
|
99
|
-
})
|
|
100
|
-
},
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* registerType() — v1 compat: register a custom type into TypeRegistry (BC-4 fix).
|
|
104
|
-
*/
|
|
105
|
-
registerType(name: string, schema: JSONSchema): void {
|
|
106
|
-
TypeRegistry.register(name, { baseSchema: schema })
|
|
107
|
-
},
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
export type DslAdapterType = typeof DslAdapter
|
|
111
|
-
|
|
1
|
+
|
|
2
|
+
/**
|
|
3
|
+
* DslAdapter — DSL parsing adapter (thin wrapper layer).
|
|
4
|
+
*
|
|
5
|
+
* v2 changes:
|
|
6
|
+
* - All parsing logic delegated to DslParser (replaces v1 DslAdapter._parseType duplication)
|
|
7
|
+
* - Fixes DA-01/DA-02/DA-03 (handled uniformly by the DslParser pipeline)
|
|
8
|
+
* - parseObject delegates to DslParser.parseObject (replaces JSONSchemaCore)
|
|
9
|
+
* - BC-2 fix: parseObject() returns ObjectDslBuilder (supports chain .strict()/.requireAll())
|
|
10
|
+
* - BC-4 fix: typeMap getter exposes all registered types; registerType() convenience entry point
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import type { JSONSchema } from '../types/schema.js'
|
|
14
|
+
import type { DslDefinition } from '../types/dsl.js'
|
|
15
|
+
import { DslParser } from '../parser/DslParser.js'
|
|
16
|
+
import { TypeRegistry } from '../parser/TypeRegistry.js'
|
|
17
|
+
import { ObjectDslBuilder } from '../core/ObjectDslBuilder.js'
|
|
18
|
+
|
|
19
|
+
type DslMarker = Record<string, unknown>
|
|
20
|
+
|
|
21
|
+
export const DslAdapter = {
|
|
22
|
+
/**
|
|
23
|
+
* Parse a DSL string into a JSON Schema.
|
|
24
|
+
* Equivalent to v1 DslAdapter.parseString(), but delegates to the unified DslParser.
|
|
25
|
+
*/
|
|
26
|
+
parseString(dslString: string): JSONSchema {
|
|
27
|
+
if (!dslString || typeof dslString !== 'string') {
|
|
28
|
+
throw new Error('[schema-dsl] DslAdapter.parseString: DSL must be a string')
|
|
29
|
+
}
|
|
30
|
+
return DslParser.parseString(dslString)
|
|
31
|
+
},
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* parse() — alias for parseString() (backwards compat with v1).
|
|
35
|
+
*/
|
|
36
|
+
parse(dslString: string): JSONSchema {
|
|
37
|
+
if (!dslString || typeof dslString !== 'string') {
|
|
38
|
+
throw new Error('[schema-dsl] DslAdapter.parse: DSL must be a string')
|
|
39
|
+
}
|
|
40
|
+
const schema = DslParser.parseString(dslString)
|
|
41
|
+
// v1 compat: always set _required (false if not set)
|
|
42
|
+
if ((schema as Record<string, unknown>)['_required'] === undefined) {
|
|
43
|
+
(schema as Record<string, unknown>)['_required'] = false
|
|
44
|
+
}
|
|
45
|
+
return schema
|
|
46
|
+
},
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Parse an object-form DSL definition → ObjectDslBuilder (BC-2 fix).
|
|
50
|
+
* v1: parseObject() returned a chainable builder (.strict()/.requireAll()).
|
|
51
|
+
* v2 fix: returns ObjectDslBuilder wrapping the compiled JSONSchema.
|
|
52
|
+
*/
|
|
53
|
+
parseObject(dslObj: DslDefinition): ObjectDslBuilder {
|
|
54
|
+
const schema = DslParser.parseObject(dslObj)
|
|
55
|
+
return new ObjectDslBuilder(schema)
|
|
56
|
+
},
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Create a Match marker (v1 compat). The actual JSON Schema is built per target field in parseObject.
|
|
60
|
+
*/
|
|
61
|
+
match(field: string, map: Record<string, unknown>): DslMarker {
|
|
62
|
+
return { _isMatch: true, field, map }
|
|
63
|
+
},
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Create an If marker (v1 compat). The actual JSON Schema is built per target field in parseObject.
|
|
67
|
+
*/
|
|
68
|
+
if(condition: string, thenSchema: unknown, elseSchema?: unknown): DslMarker {
|
|
69
|
+
return { _isIf: true, condition, then: thenSchema, else: elseSchema }
|
|
70
|
+
},
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* toCore() — v1 compat: returns { schema } wrapper
|
|
74
|
+
*/
|
|
75
|
+
toCore(dslInput: string | DslDefinition): { schema: JSONSchema } {
|
|
76
|
+
let schema: JSONSchema
|
|
77
|
+
if (typeof dslInput === 'string') {
|
|
78
|
+
schema = this.parse(dslInput)
|
|
79
|
+
} else {
|
|
80
|
+
schema = DslParser.parseObject(dslInput)
|
|
81
|
+
}
|
|
82
|
+
return { schema }
|
|
83
|
+
},
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* typeMap getter — v1 compat: DslAdapter.typeMap exposes all registered types (BC-4 fix).
|
|
87
|
+
* Assigning typeMap[name] = schema is equivalent to calling TypeRegistry.register(name, schema).
|
|
88
|
+
*/
|
|
89
|
+
get typeMap(): Record<string, JSONSchema> {
|
|
90
|
+
const map: Record<string, JSONSchema> = {}
|
|
91
|
+
for (const [name, def] of TypeRegistry.entries()) {
|
|
92
|
+
map[name] = def.baseSchema as JSONSchema
|
|
93
|
+
}
|
|
94
|
+
return new Proxy(map, {
|
|
95
|
+
set(_target: Record<string, JSONSchema>, key: string, value: JSONSchema) {
|
|
96
|
+
TypeRegistry.register(key, { baseSchema: value })
|
|
97
|
+
return true
|
|
98
|
+
},
|
|
99
|
+
})
|
|
100
|
+
},
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* registerType() — v1 compat: register a custom type into TypeRegistry (BC-4 fix).
|
|
104
|
+
*/
|
|
105
|
+
registerType(name: string, schema: JSONSchema): void {
|
|
106
|
+
TypeRegistry.register(name, { baseSchema: schema })
|
|
107
|
+
},
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export type DslAdapterType = typeof DslAdapter
|
|
111
|
+
|
package/src/adapters/index.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from './DslAdapter.js'
|
|
1
|
+
export * from './DslAdapter.js'
|