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
@@ -1,311 +1,311 @@
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
-
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
+
@@ -1,5 +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" />
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
5
  </svg>