schema-dsl 1.2.5 → 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 (243) hide show
  1. package/CHANGELOG.md +130 -238
  2. package/LICENSE +21 -21
  3. package/README.md +628 -2486
  4. package/dist/DslBuilder-BIgQOAXp.d.ts +343 -0
  5. package/dist/DslBuilder-CjHTucNQ.d.cts +343 -0
  6. package/dist/Validator-CllRdrY0.d.ts +192 -0
  7. package/dist/Validator-D6okG9tr.d.cts +192 -0
  8. package/dist/index.cjs +6640 -0
  9. package/dist/index.d.cts +1151 -0
  10. package/dist/index.d.ts +1151 -0
  11. package/dist/index.js +6574 -0
  12. package/dist/plugin-CIKtTMtS.d.cts +246 -0
  13. package/dist/plugin-CIKtTMtS.d.ts +246 -0
  14. package/dist/plugins/custom-format.cjs +3818 -0
  15. package/dist/plugins/custom-format.d.cts +12 -0
  16. package/dist/plugins/custom-format.d.ts +12 -0
  17. package/dist/plugins/custom-format.js +3788 -0
  18. package/dist/plugins/custom-type-example.cjs +3811 -0
  19. package/dist/plugins/custom-type-example.d.cts +8 -0
  20. package/dist/plugins/custom-type-example.d.ts +8 -0
  21. package/dist/plugins/custom-type-example.js +3781 -0
  22. package/dist/plugins/custom-validator.cjs +144 -0
  23. package/dist/plugins/custom-validator.d.cts +10 -0
  24. package/dist/plugins/custom-validator.d.ts +10 -0
  25. package/dist/plugins/custom-validator.js +119 -0
  26. package/docs/FEATURE-INDEX.md +553 -519
  27. package/docs/add-custom-locale.md +496 -483
  28. package/docs/add-keyword.md +24 -0
  29. package/docs/api-reference.md +1047 -805
  30. package/docs/api.md +13 -0
  31. package/docs/best-practices-project-structure.md +417 -408
  32. package/docs/best-practices.md +712 -672
  33. package/docs/cache-manager.md +344 -336
  34. package/docs/compile.md +45 -0
  35. package/docs/conditional-api.md +1307 -1278
  36. package/docs/custom-extensions-guide.md +339 -411
  37. package/docs/design-philosophy.md +606 -601
  38. package/docs/doc-index.md +324 -0
  39. package/docs/dsl-syntax.md +714 -664
  40. package/docs/dynamic-locale.md +608 -598
  41. package/docs/enum.md +482 -475
  42. package/docs/error-handling.md +1975 -1966
  43. package/docs/export-guide.md +501 -462
  44. package/docs/export-limitations.md +567 -551
  45. package/docs/faq.md +596 -577
  46. package/docs/frontend-i18n-guide.md +307 -293
  47. package/docs/i18n-user-guide.md +487 -474
  48. package/docs/i18n.md +476 -457
  49. package/docs/index.md +48 -0
  50. package/docs/json-schema-basics.md +40 -0
  51. package/docs/label-vs-description.md +271 -262
  52. package/docs/markdown-exporter.md +406 -397
  53. package/docs/mongodb-exporter.md +302 -295
  54. package/docs/multi-language.md +26 -0
  55. package/docs/multi-type-support.md +322 -329
  56. package/docs/mysql-exporter.md +280 -273
  57. package/docs/number-operators.md +449 -442
  58. package/docs/optional-marker-guide.md +326 -321
  59. package/docs/performance-guide.md +49 -0
  60. package/docs/plugin-system.md +381 -542
  61. package/docs/plugin-type-registration.md +34 -0
  62. package/docs/postgresql-exporter.md +311 -304
  63. package/docs/public/favicon.svg +5 -0
  64. package/docs/quick-start.md +435 -761
  65. package/docs/runtime-locale-support.md +532 -521
  66. package/docs/schema-helper.md +345 -340
  67. package/docs/schema-utils-advanced-issues.md +23 -0
  68. package/docs/schema-utils-best-practices.md +20 -0
  69. package/docs/schema-utils-chaining.md +150 -143
  70. package/docs/schema-utils.md +524 -490
  71. package/docs/security-checklist.md +20 -0
  72. package/docs/string-extensions.md +488 -480
  73. package/docs/troubleshooting.md +486 -471
  74. package/docs/type-converter.md +310 -319
  75. package/docs/type-reference.md +242 -219
  76. package/docs/typescript-guide.md +584 -573
  77. package/docs/union-type-guide.md +157 -147
  78. package/docs/union-types.md +284 -277
  79. package/docs/validate-async.md +491 -480
  80. package/docs/validate-batch.md +49 -0
  81. package/docs/validate-dsl-object-support.md +578 -573
  82. package/docs/validate.md +506 -486
  83. package/docs/validation-guide.md +502 -484
  84. package/docs/validator.md +39 -0
  85. package/package.json +131 -73
  86. package/plugins/custom-format.cjs +8 -0
  87. package/plugins/custom-type-example.cjs +8 -0
  88. package/plugins/custom-validator.cjs +8 -0
  89. package/src/adapters/DslAdapter.ts +111 -0
  90. package/src/adapters/index.ts +1 -0
  91. package/src/config/constants.ts +83 -0
  92. package/src/config/index.ts +2 -0
  93. package/src/config/patterns.ts +77 -0
  94. package/src/core/CacheManager.ts +169 -0
  95. package/src/core/ConditionalBuilder.ts +382 -0
  96. package/src/core/ConditionalRuntime.ts +28 -0
  97. package/src/core/ConditionalValidator.ts +255 -0
  98. package/src/core/DslBuilder.ts +687 -0
  99. package/src/core/ErrorCodes.ts +38 -0
  100. package/src/core/ErrorFormatter.ts +271 -0
  101. package/src/core/JSONSchemaCore.ts +65 -0
  102. package/src/core/Locale.ts +187 -0
  103. package/src/core/MessageTemplate.ts +42 -0
  104. package/src/core/ObjectDslBuilder.ts +64 -0
  105. package/src/core/PluginManager.ts +326 -0
  106. package/src/core/StringExtensions.ts +140 -0
  107. package/src/core/TemplateEngine.ts +44 -0
  108. package/src/core/Validator.ts +448 -0
  109. package/src/errors/I18nError.ts +159 -0
  110. package/src/errors/ValidationError.ts +105 -0
  111. package/src/exporters/BaseExporter.ts +60 -0
  112. package/src/exporters/MarkdownExporter.ts +305 -0
  113. package/src/exporters/MongoDBExporter.ts +126 -0
  114. package/src/exporters/MySQLExporter.ts +156 -0
  115. package/src/exporters/PostgreSQLExporter.ts +222 -0
  116. package/src/exporters/index.ts +18 -0
  117. package/src/index.ts +651 -0
  118. package/{lib/locales/en-US.js → src/locales/en-US.ts} +160 -176
  119. package/{lib/locales/es-ES.js → src/locales/es-ES.ts} +160 -113
  120. package/{lib/locales/fr-FR.js → src/locales/fr-FR.ts} +160 -113
  121. package/src/locales/index.ts +103 -0
  122. package/{lib/locales/ja-JP.js → src/locales/ja-JP.ts} +160 -118
  123. package/src/locales/types.ts +156 -0
  124. package/{lib/locales/zh-CN.js → src/locales/zh-CN.ts} +160 -177
  125. package/src/parser/ConstraintParser.ts +101 -0
  126. package/src/parser/DslParser.ts +470 -0
  127. package/src/parser/SchemaCompiler.ts +66 -0
  128. package/src/parser/TypeRegistry.ts +250 -0
  129. package/src/parser/index.ts +6 -0
  130. package/src/plugins/custom-format.ts +124 -0
  131. package/src/plugins/custom-type-example.ts +106 -0
  132. package/src/plugins/custom-validator.ts +138 -0
  133. package/src/types/conditional.ts +28 -0
  134. package/src/types/config.ts +59 -0
  135. package/src/types/dsl.ts +131 -0
  136. package/src/types/error.ts +60 -0
  137. package/src/types/index.ts +17 -0
  138. package/src/types/infer.ts +128 -0
  139. package/src/types/plugin.ts +58 -0
  140. package/src/types/safe-regex.d.ts +9 -0
  141. package/src/types/schema.ts +66 -0
  142. package/src/types/validate.ts +71 -0
  143. package/src/utils/SchemaHelper.ts +196 -0
  144. package/src/utils/SchemaUtils.ts +365 -0
  145. package/src/utils/TypeConverter.ts +215 -0
  146. package/src/utils/index.ts +10 -0
  147. package/src/validators/CustomKeywords.ts +477 -0
  148. package/.eslintignore +0 -11
  149. package/.eslintrc.json +0 -27
  150. package/CONTRIBUTING.md +0 -368
  151. package/STATUS.md +0 -491
  152. package/changelogs/v1.0.0.md +0 -328
  153. package/changelogs/v1.0.9.md +0 -367
  154. package/changelogs/v1.1.0.md +0 -389
  155. package/changelogs/v1.1.1.md +0 -308
  156. package/changelogs/v1.1.2.md +0 -183
  157. package/changelogs/v1.1.3.md +0 -161
  158. package/changelogs/v1.1.4.md +0 -432
  159. package/changelogs/v1.1.5.md +0 -493
  160. package/changelogs/v1.1.6.md +0 -211
  161. package/changelogs/v1.1.8.md +0 -376
  162. package/changelogs/v1.2.3.md +0 -124
  163. package/docs/INDEX.md +0 -252
  164. package/docs/issues-resolved-summary.md +0 -196
  165. package/docs/performance-benchmark-report.md +0 -179
  166. package/docs/performance-quick-reference.md +0 -123
  167. package/docs/user-questions-answered.md +0 -353
  168. package/docs/validation-rules-v1.0.2.md +0 -1608
  169. package/examples/README.md +0 -81
  170. package/examples/array-dsl-example.js +0 -227
  171. package/examples/conditional-example.js +0 -288
  172. package/examples/conditional-non-object.js +0 -129
  173. package/examples/conditional-validate-example.js +0 -321
  174. package/examples/custom-extension.js +0 -85
  175. package/examples/dsl-match-example.js +0 -74
  176. package/examples/dsl-style.js +0 -118
  177. package/examples/dynamic-locale-configuration.js +0 -348
  178. package/examples/dynamic-locale-example.js +0 -287
  179. package/examples/enum.examples.js +0 -324
  180. package/examples/export-demo.js +0 -130
  181. package/examples/express-integration.js +0 -376
  182. package/examples/i18n-error-handling-complete.js +0 -381
  183. package/examples/i18n-error-handling-quickstart.md +0 -0
  184. package/examples/i18n-error.examples.js +0 -181
  185. package/examples/i18n-full-demo.js +0 -301
  186. package/examples/i18n-memory-safety.examples.js +0 -268
  187. package/examples/markdown-export.js +0 -71
  188. package/examples/middleware-usage.js +0 -93
  189. package/examples/new-features-comparison.js +0 -315
  190. package/examples/password-reset/README.md +0 -153
  191. package/examples/password-reset/schema.js +0 -26
  192. package/examples/password-reset/test.js +0 -101
  193. package/examples/plugin-system.examples.js +0 -205
  194. package/examples/schema-utils-chaining.examples.js +0 -250
  195. package/examples/simple-example.js +0 -122
  196. package/examples/slug.examples.js +0 -179
  197. package/examples/string-extensions.js +0 -297
  198. package/examples/union-type-example.js +0 -127
  199. package/examples/union-types-example.js +0 -77
  200. package/examples/user-registration/README.md +0 -156
  201. package/examples/user-registration/routes.js +0 -92
  202. package/examples/user-registration/schema.js +0 -150
  203. package/examples/user-registration/server.js +0 -74
  204. package/index.d.ts +0 -3658
  205. package/index.js +0 -475
  206. package/index.mjs +0 -60
  207. package/lib/adapters/DslAdapter.js +0 -995
  208. package/lib/adapters/index.js +0 -20
  209. package/lib/config/constants.js +0 -286
  210. package/lib/config/patterns/common.js +0 -47
  211. package/lib/config/patterns/creditCard.js +0 -9
  212. package/lib/config/patterns/idCard.js +0 -9
  213. package/lib/config/patterns/index.js +0 -9
  214. package/lib/config/patterns/licensePlate.js +0 -4
  215. package/lib/config/patterns/passport.js +0 -4
  216. package/lib/config/patterns/phone.js +0 -9
  217. package/lib/config/patterns/postalCode.js +0 -5
  218. package/lib/core/CacheManager.js +0 -376
  219. package/lib/core/ConditionalBuilder.js +0 -503
  220. package/lib/core/DslBuilder.js +0 -1589
  221. package/lib/core/ErrorCodes.js +0 -233
  222. package/lib/core/ErrorFormatter.js +0 -445
  223. package/lib/core/JSONSchemaCore.js +0 -347
  224. package/lib/core/Locale.js +0 -130
  225. package/lib/core/MessageTemplate.js +0 -98
  226. package/lib/core/PluginManager.js +0 -448
  227. package/lib/core/StringExtensions.js +0 -240
  228. package/lib/core/Validator.js +0 -654
  229. package/lib/errors/I18nError.js +0 -328
  230. package/lib/errors/ValidationError.js +0 -191
  231. package/lib/exporters/MarkdownExporter.js +0 -420
  232. package/lib/exporters/MongoDBExporter.js +0 -162
  233. package/lib/exporters/MySQLExporter.js +0 -212
  234. package/lib/exporters/PostgreSQLExporter.js +0 -289
  235. package/lib/exporters/index.js +0 -24
  236. package/lib/locales/index.js +0 -8
  237. package/lib/utils/LRUCache.js +0 -174
  238. package/lib/utils/SchemaHelper.js +0 -240
  239. package/lib/utils/SchemaUtils.js +0 -445
  240. package/lib/utils/TypeConverter.js +0 -245
  241. package/lib/utils/index.js +0 -13
  242. package/lib/validators/CustomKeywords.js +0 -616
  243. package/lib/validators/index.js +0 -11
@@ -0,0 +1,34 @@
1
+ # 自定义类型注册
2
+
3
+ 当前版本通过 `TypeRegistry` 提供类型注册能力;如果你更偏向 DSL 侧入口,也可以使用 `DslBuilder.registerType()`,它内部会委托给 `TypeRegistry`。
4
+
5
+ ```javascript
6
+ const { TypeRegistry, dsl } = require('schema-dsl');
7
+
8
+ TypeRegistry.register('evenNumber', {
9
+ baseSchema: { type: 'number', multipleOf: 2 }
10
+ });
11
+
12
+ const schema = dsl({ value: 'evenNumber!' });
13
+ ```
14
+
15
+ 如果你希望统一从 Builder 侧管理自定义类型,也可以这样写:
16
+
17
+ ```javascript
18
+ const { DslBuilder } = require('schema-dsl');
19
+
20
+ DslBuilder.registerType('orderCode', {
21
+ type: 'string',
22
+ pattern: '^ORD\\d{6}$'
23
+ });
24
+ ```
25
+
26
+ 插件化扩展可结合 [plugin-system.md](./plugin-system.md) 使用。
27
+
28
+ ---
29
+
30
+ ## 对应示例文件
31
+
32
+ **示例入口**: [plugin-type-registration.ts](https://github.com/vextjs/schema-dsl/blob/main/examples/docs/plugin-type-registration.ts)
33
+ **说明**: 同时覆盖 `TypeRegistry.register()` 和 `DslBuilder.registerType()` 两条入口,以及注册后的真实验证与清理流程。
34
+
@@ -1,304 +1,311 @@
1
- # PostgreSQL 导出器文档
2
-
3
- > **模块**: `lib/exporters/PostgreSQLExporter.js`
4
-
5
- > **用途**: 将 JSON Schema 转换为 PostgreSQL CREATE TABLE 语句
6
-
7
- ---
8
-
9
- ## 📑 目录
10
-
11
- - [概述](#概述)
12
- - [快速开始](#快速开始)
13
- - [API 参考](#api-参考)
14
- - [配置选项](#配置选项)
15
- - [完整示例](#完整示例)
16
- - [类型映射](#类型映射)
17
- - [CHECK 约束](#check-约束)
18
-
19
- ---
20
-
21
- ## 概述
22
-
23
- `PostgreSQLExporter` 将 SchemaI-DSL 生成的 JSON Schema 转换为 PostgreSQL 的 DDL 语句,支持丰富的 PostgreSQL 特性。
24
-
25
- ### 核心功能
26
-
27
- - ✅ 生成 `CREATE TABLE` DDL 语句
28
- - ✅ 自动类型映射(支持 JSONB、UUID 等)
29
- - ✅ 自动生成 CHECK 约束
30
- - ✅ 支持表和列的 COMMENT
31
- - ✅ 支持多种索引类型(btree、hash、gin、gist)
32
- - ✅ 支持 PostgreSQL schema 命名空间
33
-
34
- ---
35
-
36
- ## 快速开始
37
-
38
- ```javascript
39
- const { dsl, exporters } = require('schema-dsl');
40
-
41
- // 1. 定义 Schema
42
- const userSchema = dsl({
43
- id: 'uuid!',
44
- username: 'string:3-32!',
45
- email: 'email!',
46
- age: 'number:18-120',
47
- status: 'active|inactive'
48
- });
49
-
50
- // 2. 创建导出器
51
- const exporter = new exporters.PostgreSQLExporter();
52
-
53
- // 3. 导出为 PostgreSQL DDL
54
- const ddl = exporter.export('users', userSchema);
55
- console.log(ddl);
56
- ```
57
-
58
- **输出**:
59
-
60
- ```sql
61
- CREATE TABLE public.users (
62
- id UUID NOT NULL,
63
- username VARCHAR(32) NOT NULL CHECK (LENGTH(username) BETWEEN 3 AND 32),
64
- email VARCHAR(255) NOT NULL,
65
- age DOUBLE PRECISION CHECK (age BETWEEN 18 AND 120),
66
- status VARCHAR(255) CHECK (status IN ('active', 'inactive')),
67
- PRIMARY KEY (id)
68
- );
69
- ```
70
-
71
- ---
72
-
73
- ## API 参考
74
-
75
- ### 构造函数
76
-
77
- ```javascript
78
- new PostgreSQLExporter(options)
79
- ```
80
-
81
- **参数**:
82
-
83
- | 参数 | 类型 | 默认值 | 说明 |
84
- |------|------|--------|------|
85
- | `options.schema` | string | `'public'` | PostgreSQL schema 名称 |
86
-
87
- ### 方法
88
-
89
- #### `export(tableName, jsonSchema)`
90
-
91
- 生成 PostgreSQL CREATE TABLE 语句。
92
-
93
- ```javascript
94
- const ddl = exporter.export('users', userSchema);
95
- ```
96
-
97
- **参数**:
98
- - `tableName` (string): 表名
99
- - `jsonSchema` (Object): JSON Schema 对象(必须是 object 类型)
100
-
101
- **返回值**:
102
- - `string`: PostgreSQL DDL 语句(包含 COMMENT 语句)
103
-
104
- ---
105
-
106
- #### `generateIndex(tableName, columnName, options)`
107
-
108
- 生成索引创建语句。
109
-
110
- ```javascript
111
- const indexDdl = exporter.generateIndex('users', 'email', {
112
- unique: true,
113
- method: 'btree'
114
- });
115
- console.log(indexDdl);
116
- // CREATE UNIQUE INDEX idx_users_email ON public.users USING btree (email);
117
- ```
118
-
119
- **参数**:
120
- - `tableName` (string): 表名
121
- - `columnName` (string): 列名
122
- - `options.name` (string): 索引名(可选)
123
- - `options.unique` (boolean): 是否唯一索引
124
- - `options.method` (string): 索引方法(btree/hash/gin/gist)
125
-
126
- ---
127
-
128
- #### `PostgreSQLExporter.export(tableName, jsonSchema)` (静态方法)
129
-
130
- 快速导出,无需实例化。
131
-
132
- ```javascript
133
- const ddl = exporters.PostgreSQLExporter.export('users', userSchema);
134
- ```
135
-
136
- ---
137
-
138
- ## 配置选项
139
-
140
- ### Schema 命名空间
141
-
142
- ```javascript
143
- // 使用自定义 schema
144
- const exporter = new exporters.PostgreSQLExporter({
145
- schema: 'myapp'
146
- });
147
-
148
- const ddl = exporter.export('users', userSchema);
149
- // CREATE TABLE myapp.users (...);
150
- ```
151
-
152
- ---
153
-
154
- ## 完整示例
155
-
156
- ### 用户表 DDL 生成
157
-
158
- ```javascript
159
- const { dsl, exporters } = require('schema-dsl');
160
-
161
- // 定义用户 Schema(带描述)
162
- const userSchema = dsl({
163
- id: 'uuid!',
164
- username: 'string:3-32!'
165
- .description('用户登录名,3-32个字符'),
166
- email: 'email!'
167
- .description('用户邮箱地址'),
168
- password: 'string:8-64!',
169
- age: 'number:18-120',
170
- profile: {
171
- bio: 'string:500',
172
- avatar: 'url'
173
- },
174
- status: 'active|inactive|banned',
175
- createdAt: 'datetime!'
176
- });
177
-
178
- // 添加表描述
179
- userSchema.description = '用户信息表';
180
-
181
- // 生成 DDL
182
- const exporter = new exporters.PostgreSQLExporter({ schema: 'app' });
183
- const ddl = exporter.export('users', userSchema);
184
-
185
- console.log(ddl);
186
-
187
- // 生成索引
188
- console.log(exporter.generateIndex('users', 'email', { unique: true }));
189
- console.log(exporter.generateIndex('users', 'username', { unique: true }));
190
- console.log(exporter.generateIndex('users', 'profile', { method: 'gin' }));
191
- ```
192
-
193
- **输出**:
194
-
195
- ```sql
196
- CREATE TABLE app.users (
197
- id UUID NOT NULL,
198
- username VARCHAR(32) NOT NULL CHECK (LENGTH(username) BETWEEN 3 AND 32),
199
- email VARCHAR(255) NOT NULL,
200
- password VARCHAR(64) NOT NULL CHECK (LENGTH(password) BETWEEN 8 AND 64),
201
- age DOUBLE PRECISION CHECK (age BETWEEN 18 AND 120),
202
- profile JSONB,
203
- status VARCHAR(255) CHECK (status IN ('active', 'inactive', 'banned')),
204
- createdAt TIMESTAMP NOT NULL,
205
- PRIMARY KEY (id)
206
- );
207
-
208
- COMMENT ON TABLE app.users IS '用户信息表';
209
-
210
- COMMENT ON COLUMN app.users.username IS '用户登录名,3-32个字符';
211
- COMMENT ON COLUMN app.users.email IS '用户邮箱地址';
212
-
213
- CREATE UNIQUE INDEX idx_users_email ON app.users USING btree (email);
214
- CREATE UNIQUE INDEX idx_users_username ON app.users USING btree (username);
215
- CREATE INDEX idx_users_profile ON app.users USING gin (profile);
216
- ```
217
-
218
- ---
219
-
220
- ## 类型映射
221
-
222
- | JSON Schema 类型 | 格式/约束 | PostgreSQL 类型 |
223
- |------------------|-----------|-----------------|
224
- | `string` | - | `VARCHAR(255)` |
225
- | `string` | `maxLength: 50` | `VARCHAR(50)` |
226
- | `string` | `maxLength: 500` | `TEXT` |
227
- | `string` | `format: email` | `VARCHAR(255)` |
228
- | `string` | `format: uuid` | `UUID` |
229
- | `string` | `format: date` | `DATE` |
230
- | `string` | `format: date-time` | `TIMESTAMP` |
231
- | `integer` | `maximum: 32767` | `SMALLINT` |
232
- | `integer` | `maximum: 2147483647` | `INTEGER` |
233
- | `integer` | - | `BIGINT` |
234
- | `number` | - | `DOUBLE PRECISION` |
235
- | `boolean` | - | `BOOLEAN` |
236
- | `object` | - | `JSONB` |
237
- | `array` | - | `JSONB` |
238
-
239
- ---
240
-
241
- ## CHECK 约束
242
-
243
- PostgreSQLExporter 会自动为以下约束生成 CHECK 语句:
244
-
245
- ### 字符串长度约束
246
-
247
- ```javascript
248
- username: 'string:3-32!'
249
- // CHECK (LENGTH(username) BETWEEN 3 AND 32)
250
- ```
251
-
252
- ### 数值范围约束
253
-
254
- ```javascript
255
- age: 'number:18-120'
256
- // CHECK (age BETWEEN 18 AND 120)
257
- ```
258
-
259
- ### 枚举约束
260
-
261
- ```javascript
262
- status: 'active|inactive|banned'
263
- // CHECK (status IN ('active', 'inactive', 'banned'))
264
- ```
265
-
266
- ---
267
-
268
- ## 索引类型
269
-
270
- | 方法 | 用途 | 示例 |
271
- |------|------|------|
272
- | `btree` (默认) | 通用索引,支持排序和范围查询 | 主键、外键、排序字段 |
273
- | `hash` | 等值查询 | 精确匹配查询 |
274
- | `gin` | JSON/数组索引 | JSONB 字段、全文搜索 |
275
- | `gist` | 几何数据、范围类型 | 地理位置、IP 范围 |
276
-
277
- ```javascript
278
- // GIN 索引用于 JSONB 字段
279
- exporter.generateIndex('users', 'metadata', { method: 'gin' });
280
- ```
281
-
282
- ---
283
-
284
- ## 导出限制
285
-
286
- ⚠️ **重要提示**: PostgreSQL 虽然支持 CHECK 约束,但仍有部分特性无法导出。
287
-
288
- **PostgreSQL 不支持的特性**:
289
- - ❌ 正则表达式约束(`pattern`)
290
- - ❌ 嵌套对象约束(导出为 `JSONB`,内部约束丢失)
291
- - ❌ 条件验证逻辑(`dsl.match()`, `dsl.if()`)
292
-
293
- **详细说明**: 请阅读 [导出限制说明文档](export-limitations.md)
294
-
295
- ---
296
-
297
- ## 相关文档
298
-
299
- - [数据库导出指南](export-guide.md)
300
- - [MongoDB 导出器](mongodb-exporter.md)
301
- - [MySQL 导出器](mysql-exporter.md)
302
- - [TypeConverter](type-converter.md)
303
- - [**导出限制说明**](export-limitations.md) ⚠️
304
-
1
+ # PostgreSQL 导出器文档
2
+
3
+ > **模块**: `src/exporters/PostgreSQLExporter.ts`
4
+
5
+ > **用途**: 将 JSON Schema 转换为 PostgreSQL CREATE TABLE 语句
6
+
7
+ ---
8
+
9
+ ## 📑 目录
10
+
11
+ - [概述](#概述)
12
+ - [快速开始](#快速开始)
13
+ - [API 参考](#api-参考)
14
+ - [配置选项](#配置选项)
15
+ - [完整示例](#完整示例)
16
+ - [类型映射](#类型映射)
17
+ - [CHECK 约束](#check-约束)
18
+
19
+ ---
20
+
21
+ ## 概述
22
+
23
+ `PostgreSQLExporter` 将 schema-dsl 生成的 JSON Schema 转换为 PostgreSQL 的 DDL 语句,支持丰富的 PostgreSQL 特性。
24
+
25
+ ### 核心功能
26
+
27
+ - ✅ 生成 `CREATE TABLE` DDL 语句
28
+ - ✅ 自动类型映射(支持 JSONB、UUID 等)
29
+ - ✅ 自动生成 CHECK 约束
30
+ - ✅ 支持表和列的 COMMENT
31
+ - ✅ 支持多种索引类型(btree、hash、gin、gist)
32
+ - ✅ 支持 PostgreSQL schema 命名空间
33
+
34
+ ---
35
+
36
+ ## 快速开始
37
+
38
+ ```javascript
39
+ const { dsl, exporters } = require('schema-dsl');
40
+
41
+ // 1. 定义 Schema
42
+ const userSchema = dsl({
43
+ id: 'uuid!',
44
+ username: 'string:3-32!',
45
+ email: 'email!',
46
+ age: 'number:18-120',
47
+ status: 'active|inactive'
48
+ });
49
+
50
+ // 2. 创建导出器
51
+ const exporter = new exporters.PostgreSQLExporter();
52
+
53
+ // 3. 导出为 PostgreSQL DDL
54
+ const ddl = exporter.export('users', userSchema);
55
+ console.log(ddl);
56
+ ```
57
+
58
+ **输出**:
59
+
60
+ ```sql
61
+ CREATE TABLE public.users (
62
+ id UUID NOT NULL,
63
+ username VARCHAR(32) NOT NULL CHECK (LENGTH(username) BETWEEN 3 AND 32),
64
+ email VARCHAR(255) NOT NULL,
65
+ age DOUBLE PRECISION CHECK (age BETWEEN 18 AND 120),
66
+ status VARCHAR(255) CHECK (status IN ('active', 'inactive')),
67
+ PRIMARY KEY (id)
68
+ );
69
+ ```
70
+
71
+ ---
72
+
73
+ ## API 参考
74
+
75
+ ### 构造函数
76
+
77
+ ```javascript
78
+ new PostgreSQLExporter(options)
79
+ ```
80
+
81
+ **参数**:
82
+
83
+ | 参数 | 类型 | 默认值 | 说明 |
84
+ |------|------|--------|------|
85
+ | `options.schema` | string | `'public'` | PostgreSQL schema 名称 |
86
+
87
+ ### 方法
88
+
89
+ #### `export(tableName, jsonSchema)`
90
+
91
+ 生成 PostgreSQL CREATE TABLE 语句。
92
+
93
+ ```javascript
94
+ const ddl = exporter.export('users', userSchema);
95
+ ```
96
+
97
+ **参数**:
98
+ - `tableName` (string): 表名
99
+ - `jsonSchema` (Object): JSON Schema 对象(必须是 object 类型)
100
+
101
+ **返回值**:
102
+ - `string`: PostgreSQL DDL 语句(包含 COMMENT 语句)
103
+
104
+ ---
105
+
106
+ #### `generateIndex(tableName, columnName, options)`
107
+
108
+ 生成索引创建语句。
109
+
110
+ ```javascript
111
+ const indexDdl = exporter.generateIndex('users', 'email', {
112
+ unique: true,
113
+ method: 'btree'
114
+ });
115
+ console.log(indexDdl);
116
+ // CREATE UNIQUE INDEX idx_users_email ON public.users USING btree (email);
117
+ ```
118
+
119
+ **参数**:
120
+ - `tableName` (string): 表名
121
+ - `columnName` (string): 列名
122
+ - `options.name` (string): 索引名(可选)
123
+ - `options.unique` (boolean): 是否唯一索引
124
+ - `options.method` (string): 索引方法(btree/hash/gin/gist)
125
+
126
+ ---
127
+
128
+ #### `PostgreSQLExporter.export(tableName, jsonSchema)` (静态方法)
129
+
130
+ 快速导出,无需实例化。
131
+
132
+ ```javascript
133
+ const ddl = exporters.PostgreSQLExporter.export('users', userSchema);
134
+ ```
135
+
136
+ ---
137
+
138
+ ## 配置选项
139
+
140
+ ### Schema 命名空间
141
+
142
+ ```javascript
143
+ // 使用自定义 schema
144
+ const exporter = new exporters.PostgreSQLExporter({
145
+ schema: 'myapp'
146
+ });
147
+
148
+ const ddl = exporter.export('users', userSchema);
149
+ // CREATE TABLE myapp.users (...);
150
+ ```
151
+
152
+ ---
153
+
154
+ ## 完整示例
155
+
156
+ ### 用户表 DDL 生成
157
+
158
+ ```javascript
159
+ const { dsl, exporters } = require('schema-dsl');
160
+
161
+ // 定义用户 Schema(带描述)
162
+ const userSchema = dsl({
163
+ id: 'uuid!',
164
+ username: 'string:3-32!'
165
+ .description('用户登录名,3-32个字符'),
166
+ email: 'email!'
167
+ .description('用户邮箱地址'),
168
+ password: 'string:8-64!',
169
+ age: 'number:18-120',
170
+ profile: {
171
+ bio: 'string:500',
172
+ avatar: 'url'
173
+ },
174
+ status: 'active|inactive|banned',
175
+ createdAt: 'datetime!'
176
+ });
177
+
178
+ // 添加表描述
179
+ userSchema.description = '用户信息表';
180
+
181
+ // 生成 DDL
182
+ const exporter = new exporters.PostgreSQLExporter({ schema: 'app' });
183
+ const ddl = exporter.export('users', userSchema);
184
+
185
+ console.log(ddl);
186
+
187
+ // 生成索引
188
+ console.log(exporter.generateIndex('users', 'email', { unique: true }));
189
+ console.log(exporter.generateIndex('users', 'username', { unique: true }));
190
+ console.log(exporter.generateIndex('users', 'profile', { method: 'gin' }));
191
+ ```
192
+
193
+ **输出**:
194
+
195
+ ```sql
196
+ CREATE TABLE app.users (
197
+ id UUID NOT NULL,
198
+ username VARCHAR(32) NOT NULL CHECK (LENGTH(username) BETWEEN 3 AND 32),
199
+ email VARCHAR(255) NOT NULL,
200
+ password VARCHAR(64) NOT NULL CHECK (LENGTH(password) BETWEEN 8 AND 64),
201
+ age DOUBLE PRECISION CHECK (age BETWEEN 18 AND 120),
202
+ profile JSONB,
203
+ status VARCHAR(255) CHECK (status IN ('active', 'inactive', 'banned')),
204
+ createdAt TIMESTAMP NOT NULL,
205
+ PRIMARY KEY (id)
206
+ );
207
+
208
+ COMMENT ON TABLE app.users IS '用户信息表';
209
+
210
+ COMMENT ON COLUMN app.users.username IS '用户登录名,3-32个字符';
211
+ COMMENT ON COLUMN app.users.email IS '用户邮箱地址';
212
+
213
+ CREATE UNIQUE INDEX idx_users_email ON app.users USING btree (email);
214
+ CREATE UNIQUE INDEX idx_users_username ON app.users USING btree (username);
215
+ CREATE INDEX idx_users_profile ON app.users USING gin (profile);
216
+ ```
217
+
218
+ ---
219
+
220
+ ## 类型映射
221
+
222
+ | JSON Schema 类型 | 格式/约束 | PostgreSQL 类型 |
223
+ |------------------|-----------|-----------------|
224
+ | `string` | - | `VARCHAR(255)` |
225
+ | `string` | `maxLength: 50` | `VARCHAR(50)` |
226
+ | `string` | `maxLength: 500` | `TEXT` |
227
+ | `string` | `format: email` | `VARCHAR(255)` |
228
+ | `string` | `format: uuid` | `UUID` |
229
+ | `string` | `format: date` | `DATE` |
230
+ | `string` | `format: date-time` | `TIMESTAMP` |
231
+ | `integer` | `maximum: 32767` | `SMALLINT` |
232
+ | `integer` | `maximum: 2147483647` | `INTEGER` |
233
+ | `integer` | - | `BIGINT` |
234
+ | `number` | - | `DOUBLE PRECISION` |
235
+ | `boolean` | - | `BOOLEAN` |
236
+ | `object` | - | `JSONB` |
237
+ | `array` | - | `JSONB` |
238
+
239
+ ---
240
+
241
+ ## CHECK 约束
242
+
243
+ PostgreSQLExporter 会自动为以下约束生成 CHECK 语句:
244
+
245
+ ### 字符串长度约束
246
+
247
+ ```javascript
248
+ username: 'string:3-32!'
249
+ // CHECK (LENGTH(username) BETWEEN 3 AND 32)
250
+ ```
251
+
252
+ ### 数值范围约束
253
+
254
+ ```javascript
255
+ age: 'number:18-120'
256
+ // CHECK (age BETWEEN 18 AND 120)
257
+ ```
258
+
259
+ ### 枚举约束
260
+
261
+ ```javascript
262
+ status: 'active|inactive|banned'
263
+ // CHECK (status IN ('active', 'inactive', 'banned'))
264
+ ```
265
+
266
+ ---
267
+
268
+ ## 索引类型
269
+
270
+ | 方法 | 用途 | 示例 |
271
+ |------|------|------|
272
+ | `btree` (默认) | 通用索引,支持排序和范围查询 | 主键、外键、排序字段 |
273
+ | `hash` | 等值查询 | 精确匹配查询 |
274
+ | `gin` | JSON/数组索引 | JSONB 字段、全文搜索 |
275
+ | `gist` | 几何数据、范围类型 | 地理位置、IP 范围 |
276
+
277
+ ```javascript
278
+ // GIN 索引用于 JSONB 字段
279
+ exporter.generateIndex('users', 'metadata', { method: 'gin' });
280
+ ```
281
+
282
+ ---
283
+
284
+ ## 导出限制
285
+
286
+ ⚠️ **重要提示**: PostgreSQL 虽然支持 CHECK 约束,但仍有部分特性无法导出。
287
+
288
+ **PostgreSQL 不支持的特性**:
289
+ - ❌ 正则表达式约束(`pattern`)
290
+ - ❌ 嵌套对象约束(导出为 `JSONB`,内部约束丢失)
291
+ - ❌ 条件验证逻辑(`dsl.match()`, `dsl.if()`)
292
+
293
+ **详细说明**: 请阅读 [导出限制说明文档](export-limitations.md)
294
+
295
+ ---
296
+
297
+ ## 相关文档
298
+
299
+ - [数据库导出指南](export-guide.md)
300
+ - [MongoDB 导出器](mongodb-exporter.md)
301
+ - [MySQL 导出器](mysql-exporter.md)
302
+ - [TypeConverter](type-converter.md)
303
+ - [**导出限制说明**](export-limitations.md) ⚠️
304
+
305
+ ---
306
+
307
+ ## 对应示例文件
308
+
309
+ **示例入口**: [postgresql-exporter.ts](https://github.com/vextjs/schema-dsl/blob/main/examples/docs/postgresql-exporter.ts)
310
+ **说明**: 覆盖 PostgreSQL DDL 导出、CHECK 约束示意,以及 `generateIndex()` 生成 `gin` 索引。
311
+
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" fill="none">
2
+ <rect width="64" height="64" rx="14" fill="#0F172A" />
3
+ <path d="M18 22.5L32 14L46 22.5V41.5L32 50L18 41.5V22.5Z" fill="#38BDF8" />
4
+ <path d="M32 20L40 24.8V34.2L32 39L24 34.2V24.8L32 20Z" fill="#E2E8F0" />
5
+ </svg>