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.
Files changed (145) hide show
  1. package/CHANGELOG.md +130 -113
  2. package/LICENSE +21 -21
  3. package/README.md +628 -628
  4. package/dist/{DslBuilder-DkLaOo9Q.d.ts → DslBuilder-BIgQOAXp.d.ts} +2 -0
  5. package/dist/{DslBuilder-DQDN0ZxZ.d.cts → DslBuilder-CjHTucNQ.d.cts} +2 -0
  6. package/dist/{Validator-hFWKGxir.d.ts → Validator-CllRdrY0.d.ts} +1 -1
  7. package/dist/{Validator-C7GsVQOH.d.cts → Validator-D6okG9tr.d.cts} +1 -1
  8. package/dist/index.cjs +75 -29
  9. package/dist/index.d.cts +10 -4
  10. package/dist/index.d.ts +10 -4
  11. package/dist/index.js +75 -29
  12. package/dist/plugins/custom-format.cjs +33 -17
  13. package/dist/plugins/custom-format.d.cts +1 -1
  14. package/dist/plugins/custom-format.d.ts +1 -1
  15. package/dist/plugins/custom-format.js +33 -17
  16. package/dist/plugins/custom-type-example.cjs +33 -17
  17. package/dist/plugins/custom-type-example.d.cts +1 -1
  18. package/dist/plugins/custom-type-example.d.ts +1 -1
  19. package/dist/plugins/custom-type-example.js +33 -17
  20. package/dist/plugins/custom-validator.cjs +0 -2
  21. package/dist/plugins/custom-validator.d.cts +1 -1
  22. package/dist/plugins/custom-validator.d.ts +1 -1
  23. package/dist/plugins/custom-validator.js +0 -2
  24. package/docs/FEATURE-INDEX.md +553 -553
  25. package/docs/add-custom-locale.md +496 -496
  26. package/docs/add-keyword.md +24 -24
  27. package/docs/api-reference.md +1047 -1047
  28. package/docs/api.md +13 -13
  29. package/docs/best-practices-project-structure.md +417 -417
  30. package/docs/best-practices.md +712 -712
  31. package/docs/cache-manager.md +344 -344
  32. package/docs/compile.md +45 -45
  33. package/docs/conditional-api.md +1307 -1307
  34. package/docs/custom-extensions-guide.md +339 -339
  35. package/docs/design-philosophy.md +606 -606
  36. package/docs/doc-index.md +324 -324
  37. package/docs/dsl-syntax.md +714 -714
  38. package/docs/dynamic-locale.md +608 -608
  39. package/docs/enum.md +482 -482
  40. package/docs/error-handling.md +1975 -1975
  41. package/docs/export-guide.md +501 -501
  42. package/docs/export-limitations.md +567 -567
  43. package/docs/faq.md +596 -596
  44. package/docs/frontend-i18n-guide.md +307 -307
  45. package/docs/i18n-user-guide.md +487 -487
  46. package/docs/i18n.md +476 -476
  47. package/docs/index.md +48 -48
  48. package/docs/json-schema-basics.md +40 -40
  49. package/docs/label-vs-description.md +271 -271
  50. package/docs/markdown-exporter.md +406 -406
  51. package/docs/mongodb-exporter.md +302 -302
  52. package/docs/multi-language.md +26 -26
  53. package/docs/multi-type-support.md +322 -322
  54. package/docs/mysql-exporter.md +280 -280
  55. package/docs/number-operators.md +449 -449
  56. package/docs/optional-marker-guide.md +326 -326
  57. package/docs/performance-guide.md +49 -49
  58. package/docs/plugin-system.md +381 -381
  59. package/docs/plugin-type-registration.md +34 -34
  60. package/docs/postgresql-exporter.md +311 -311
  61. package/docs/public/favicon.svg +4 -4
  62. package/docs/quick-start.md +435 -435
  63. package/docs/runtime-locale-support.md +532 -532
  64. package/docs/schema-helper.md +345 -345
  65. package/docs/schema-utils-advanced-issues.md +23 -23
  66. package/docs/schema-utils-best-practices.md +20 -20
  67. package/docs/schema-utils-chaining.md +150 -150
  68. package/docs/schema-utils.md +524 -524
  69. package/docs/security-checklist.md +20 -20
  70. package/docs/string-extensions.md +488 -488
  71. package/docs/troubleshooting.md +486 -486
  72. package/docs/type-converter.md +310 -310
  73. package/docs/type-reference.md +242 -242
  74. package/docs/typescript-guide.md +584 -584
  75. package/docs/union-type-guide.md +157 -157
  76. package/docs/union-types.md +284 -284
  77. package/docs/validate-async.md +491 -491
  78. package/docs/validate-batch.md +49 -49
  79. package/docs/validate-dsl-object-support.md +578 -578
  80. package/docs/validate.md +506 -506
  81. package/docs/validation-guide.md +502 -502
  82. package/docs/validator.md +39 -39
  83. package/package.json +131 -131
  84. package/plugins/custom-format.cjs +8 -8
  85. package/plugins/custom-type-example.cjs +8 -8
  86. package/plugins/custom-validator.cjs +8 -8
  87. package/src/adapters/DslAdapter.ts +111 -111
  88. package/src/adapters/index.ts +1 -1
  89. package/src/config/constants.ts +83 -83
  90. package/src/config/index.ts +2 -2
  91. package/src/config/patterns.ts +77 -77
  92. package/src/core/CacheManager.ts +169 -159
  93. package/src/core/ConditionalBuilder.ts +382 -382
  94. package/src/core/ConditionalRuntime.ts +27 -27
  95. package/src/core/ConditionalValidator.ts +254 -254
  96. package/src/core/DslBuilder.ts +687 -677
  97. package/src/core/ErrorCodes.ts +38 -38
  98. package/src/core/ErrorFormatter.ts +271 -271
  99. package/src/core/JSONSchemaCore.ts +65 -65
  100. package/src/core/Locale.ts +187 -187
  101. package/src/core/MessageTemplate.ts +42 -42
  102. package/src/core/ObjectDslBuilder.ts +64 -64
  103. package/src/core/PluginManager.ts +326 -326
  104. package/src/core/StringExtensions.ts +140 -140
  105. package/src/core/TemplateEngine.ts +44 -44
  106. package/src/core/Validator.ts +448 -448
  107. package/src/errors/I18nError.ts +159 -159
  108. package/src/errors/ValidationError.ts +105 -105
  109. package/src/exporters/BaseExporter.ts +60 -60
  110. package/src/exporters/MarkdownExporter.ts +305 -305
  111. package/src/exporters/MongoDBExporter.ts +126 -126
  112. package/src/exporters/MySQLExporter.ts +156 -155
  113. package/src/exporters/PostgreSQLExporter.ts +222 -222
  114. package/src/exporters/index.ts +18 -18
  115. package/src/index.ts +651 -633
  116. package/src/locales/en-US.ts +160 -160
  117. package/src/locales/es-ES.ts +160 -160
  118. package/src/locales/fr-FR.ts +160 -160
  119. package/src/locales/index.ts +103 -103
  120. package/src/locales/ja-JP.ts +160 -160
  121. package/src/locales/types.ts +156 -156
  122. package/src/locales/zh-CN.ts +160 -160
  123. package/src/parser/ConstraintParser.ts +101 -101
  124. package/src/parser/DslParser.ts +470 -470
  125. package/src/parser/SchemaCompiler.ts +66 -66
  126. package/src/parser/TypeRegistry.ts +250 -250
  127. package/src/parser/index.ts +6 -6
  128. package/src/plugins/custom-format.ts +124 -126
  129. package/src/plugins/custom-type-example.ts +106 -108
  130. package/src/plugins/custom-validator.ts +138 -140
  131. package/src/types/conditional.ts +28 -28
  132. package/src/types/config.ts +59 -59
  133. package/src/types/dsl.ts +131 -131
  134. package/src/types/error.ts +60 -60
  135. package/src/types/index.ts +17 -17
  136. package/src/types/infer.ts +127 -127
  137. package/src/types/plugin.ts +58 -58
  138. package/src/types/safe-regex.d.ts +9 -9
  139. package/src/types/schema.ts +66 -66
  140. package/src/types/validate.ts +71 -71
  141. package/src/utils/SchemaHelper.ts +196 -196
  142. package/src/utils/SchemaUtils.ts +365 -346
  143. package/src/utils/TypeConverter.ts +215 -215
  144. package/src/utils/index.ts +10 -10
  145. 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.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
+
@@ -1 +1 @@
1
- export * from './DslAdapter.js'
1
+ export * from './DslAdapter.js'