@zhin.js/scaffold-wizard 1.1.0 → 1.1.2

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 (58) hide show
  1. package/README.md +5 -0
  2. package/lib/adapter.js +1 -1
  3. package/lib/adapter.js.map +1 -1
  4. package/lib/ai.d.ts +1 -7
  5. package/lib/ai.d.ts.map +1 -1
  6. package/lib/ai.js +0 -63
  7. package/lib/ai.js.map +1 -1
  8. package/lib/apply.d.ts +5 -5
  9. package/lib/apply.d.ts.map +1 -1
  10. package/lib/apply.js +13 -23
  11. package/lib/apply.js.map +1 -1
  12. package/lib/database-definitions.d.ts +28 -0
  13. package/lib/database-definitions.d.ts.map +1 -0
  14. package/lib/database-definitions.js +290 -0
  15. package/lib/database-definitions.js.map +1 -0
  16. package/lib/database.d.ts.map +1 -1
  17. package/lib/database.js +69 -51
  18. package/lib/database.js.map +1 -1
  19. package/lib/env.d.ts +6 -0
  20. package/lib/env.d.ts.map +1 -1
  21. package/lib/env.js +51 -0
  22. package/lib/env.js.map +1 -1
  23. package/lib/index.d.ts +8 -6
  24. package/lib/index.d.ts.map +1 -1
  25. package/lib/index.js +7 -6
  26. package/lib/index.js.map +1 -1
  27. package/lib/optional-peers.d.ts.map +1 -1
  28. package/lib/optional-peers.js +5 -16
  29. package/lib/optional-peers.js.map +1 -1
  30. package/lib/project-config-plan.d.ts +2 -1
  31. package/lib/project-config-plan.d.ts.map +1 -1
  32. package/lib/project-config-plan.js +29 -83
  33. package/lib/project-config-plan.js.map +1 -1
  34. package/lib/project-deps.d.ts +1 -1
  35. package/lib/project-deps.d.ts.map +1 -1
  36. package/lib/project-deps.js +5 -7
  37. package/lib/project-deps.js.map +1 -1
  38. package/lib/types.d.ts +4 -3
  39. package/lib/types.d.ts.map +1 -1
  40. package/lib/types.js +6 -8
  41. package/lib/types.js.map +1 -1
  42. package/lib/zhin-stack-deps.d.ts +8 -6
  43. package/lib/zhin-stack-deps.d.ts.map +1 -1
  44. package/lib/zhin-stack-deps.js +16 -25
  45. package/lib/zhin-stack-deps.js.map +1 -1
  46. package/package.json +3 -3
  47. package/src/adapter.ts +1 -1
  48. package/src/ai.ts +1 -70
  49. package/src/apply.ts +17 -23
  50. package/src/database-definitions.ts +336 -0
  51. package/src/database.ts +77 -52
  52. package/src/env.ts +52 -0
  53. package/src/index.ts +18 -6
  54. package/src/optional-peers.ts +4 -14
  55. package/src/project-config-plan.ts +35 -79
  56. package/src/project-deps.ts +5 -6
  57. package/src/types.ts +13 -10
  58. package/src/zhin-stack-deps.ts +16 -27
@@ -0,0 +1,290 @@
1
+ const text = (defaultValue, extras = {}) => ({
2
+ type: 'string',
3
+ minLength: 1,
4
+ ...(defaultValue === undefined ? {} : { default: defaultValue }),
5
+ ...extras,
6
+ });
7
+ const port = (defaultValue) => ({
8
+ type: 'integer',
9
+ minimum: 1,
10
+ maximum: 65535,
11
+ default: defaultValue,
12
+ });
13
+ export const DATABASE_DIALECT_DEFINITIONS = Object.freeze([
14
+ {
15
+ dialect: 'sqlite',
16
+ name: 'SQLite',
17
+ description: '推荐,零配置,适合单机 Bot',
18
+ verifiedServer: 'Node.js 内置 node:sqlite(Node.js 22.5+)',
19
+ schema: {
20
+ type: 'object',
21
+ additionalProperties: true,
22
+ required: ['dialect'],
23
+ properties: {
24
+ dialect: { const: 'sqlite' },
25
+ filename: text('./data/bot.db'),
26
+ mode: { type: 'string', enum: ['wal', 'delete', 'memory'], default: 'wal' },
27
+ },
28
+ },
29
+ },
30
+ {
31
+ dialect: 'mysql',
32
+ name: 'MySQL',
33
+ description: '关系型数据库',
34
+ verifiedServer: 'MySQL 8.4 LTS',
35
+ driver: { package: 'mysql2', version: '^3.23.2' },
36
+ schema: {
37
+ type: 'object',
38
+ additionalProperties: true,
39
+ required: ['dialect'],
40
+ properties: {
41
+ dialect: { const: 'mysql' },
42
+ host: text('127.0.0.1'),
43
+ port: port(3306),
44
+ user: text('root'),
45
+ password: { type: 'string' },
46
+ database: text('zhin_bot'),
47
+ },
48
+ },
49
+ },
50
+ {
51
+ dialect: 'pg',
52
+ name: 'PostgreSQL',
53
+ description: '关系型数据库,方言名为 pg',
54
+ verifiedServer: 'PostgreSQL 17',
55
+ driver: { package: 'pg', version: '^8.22.0' },
56
+ schema: {
57
+ type: 'object',
58
+ additionalProperties: true,
59
+ required: ['dialect'],
60
+ properties: {
61
+ dialect: { const: 'pg' },
62
+ host: text('127.0.0.1'),
63
+ port: port(5432),
64
+ user: text('postgres'),
65
+ password: { type: 'string' },
66
+ database: text('zhin_bot'),
67
+ },
68
+ },
69
+ },
70
+ {
71
+ dialect: 'mongodb',
72
+ name: 'MongoDB',
73
+ description: '文档数据库',
74
+ verifiedServer: 'MongoDB 8',
75
+ driver: { package: 'mongodb', version: '^7.5.0' },
76
+ schema: {
77
+ type: 'object',
78
+ additionalProperties: true,
79
+ required: ['dialect', 'url', 'dbName'],
80
+ properties: {
81
+ dialect: { const: 'mongodb' },
82
+ url: text('mongodb://127.0.0.1:27017', { pattern: '^mongodb(?:\\+srv)?://' }),
83
+ dbName: text('zhin_bot'),
84
+ },
85
+ },
86
+ },
87
+ {
88
+ dialect: 'redis',
89
+ name: 'Redis',
90
+ description: '键值数据库',
91
+ verifiedServer: 'Redis 8',
92
+ driver: { package: 'redis', version: '^6.1.0' },
93
+ schema: {
94
+ type: 'object',
95
+ additionalProperties: true,
96
+ required: ['dialect'],
97
+ properties: {
98
+ dialect: { const: 'redis' },
99
+ socket: {
100
+ type: 'object',
101
+ additionalProperties: true,
102
+ required: ['host', 'port'],
103
+ properties: {
104
+ host: text('127.0.0.1'),
105
+ port: port(6379),
106
+ },
107
+ },
108
+ password: { type: 'string' },
109
+ database: { type: 'integer', minimum: 0, default: 0 },
110
+ },
111
+ },
112
+ },
113
+ {
114
+ dialect: 'memory',
115
+ name: 'Memory',
116
+ description: '仅进程内,适合测试,不持久化',
117
+ verifiedServer: 'Zhin 内置实现',
118
+ schema: {
119
+ type: 'object',
120
+ additionalProperties: false,
121
+ required: ['dialect'],
122
+ properties: { dialect: { const: 'memory' } },
123
+ },
124
+ },
125
+ ]);
126
+ const definitions = new Map(DATABASE_DIALECT_DEFINITIONS.map((definition) => [definition.dialect, definition]));
127
+ export function getDatabaseDialectDefinition(dialect) {
128
+ return definitions.get(dialect);
129
+ }
130
+ export function databaseChoiceLabel(definition) {
131
+ const driver = definition.driver
132
+ ? `;驱动 ${definition.driver.package} ${definition.driver.version}`
133
+ : '';
134
+ return `${definition.name}(${definition.description};当前支持/实机验证 ${definition.verifiedServer}${driver})`;
135
+ }
136
+ function expandEnvReferences(input, path, env, issues) {
137
+ let output = '';
138
+ let index = 0;
139
+ while (index < input.length) {
140
+ const start = input.indexOf('${', index);
141
+ if (start < 0)
142
+ break;
143
+ let cursor = start + 2;
144
+ const first = input[cursor];
145
+ if (first === undefined || !isEnvKeyStart(first)) {
146
+ output += input.slice(index, start + 1);
147
+ index = start + 1;
148
+ continue;
149
+ }
150
+ cursor += 1;
151
+ while (cursor < input.length && isEnvKeyCharacter(input[cursor]))
152
+ cursor += 1;
153
+ const key = input.slice(start + 2, cursor);
154
+ let fallback;
155
+ if (input[cursor] === ':' && (input[cursor + 1] === '-' || input[cursor + 1] === '=')) {
156
+ const close = input.indexOf('}', cursor + 2);
157
+ if (close < 0) {
158
+ output += input.slice(index, start + 1);
159
+ index = start + 1;
160
+ continue;
161
+ }
162
+ fallback = input.slice(cursor + 2, close);
163
+ cursor = close;
164
+ }
165
+ if (input[cursor] !== '}') {
166
+ output += input.slice(index, start + 1);
167
+ index = start + 1;
168
+ continue;
169
+ }
170
+ output += input.slice(index, start);
171
+ const resolved = env[key];
172
+ if ((resolved === undefined || resolved === '') && fallback !== undefined) {
173
+ output += fallback;
174
+ }
175
+ else if (resolved === undefined) {
176
+ issues.push({
177
+ kind: 'env_missing',
178
+ path,
179
+ envKey: key,
180
+ message: `环境变量 ${key} 未设置(${path})`,
181
+ });
182
+ }
183
+ else {
184
+ output += resolved;
185
+ }
186
+ index = cursor + 1;
187
+ }
188
+ return output + input.slice(index);
189
+ }
190
+ function isEnvKeyStart(character) {
191
+ return (character >= 'A' && character <= 'Z')
192
+ || (character >= 'a' && character <= 'z')
193
+ || character === '_';
194
+ }
195
+ function isEnvKeyCharacter(character) {
196
+ return isEnvKeyStart(character) || (character >= '0' && character <= '9');
197
+ }
198
+ function validateValue(schema, rawValue, path, env, issues) {
199
+ let value = rawValue;
200
+ if (typeof value === 'string') {
201
+ const before = issues.length;
202
+ value = expandEnvReferences(value, path, env, issues);
203
+ if (issues.length > before)
204
+ return;
205
+ }
206
+ if ('const' in schema && value !== schema.const) {
207
+ issues.push({ kind: 'invalid', path, message: `${path} 必须是 ${JSON.stringify(schema.const)}` });
208
+ return;
209
+ }
210
+ const type = schema.type;
211
+ if (type === 'object') {
212
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
213
+ issues.push({ kind: 'invalid', path, message: `${path} 必须是对象` });
214
+ return;
215
+ }
216
+ const record = value;
217
+ const properties = (schema.properties ?? {});
218
+ if (schema.additionalProperties === false) {
219
+ for (const key of Object.keys(record)) {
220
+ if (!(key in properties)) {
221
+ issues.push({ kind: 'invalid', path: `${path}.${key}`, message: `${path}.${key} 不是受支持的配置项` });
222
+ }
223
+ }
224
+ }
225
+ for (const required of (schema.required ?? [])) {
226
+ if (!(required in record) || record[required] === undefined || record[required] === null) {
227
+ issues.push({ kind: 'invalid', path: `${path}.${required}`, message: `${path}.${required} 不能为空` });
228
+ }
229
+ }
230
+ for (const [key, propertySchema] of Object.entries(properties)) {
231
+ if (record[key] !== undefined)
232
+ validateValue(propertySchema, record[key], `${path}.${key}`, env, issues);
233
+ }
234
+ return;
235
+ }
236
+ if (type === 'string') {
237
+ if (typeof value !== 'string') {
238
+ issues.push({ kind: 'invalid', path, message: `${path} 必须是字符串` });
239
+ return;
240
+ }
241
+ if (typeof schema.minLength === 'number' && value.length < schema.minLength) {
242
+ issues.push({ kind: 'invalid', path, message: `${path} 不能为空` });
243
+ }
244
+ if (typeof schema.pattern === 'string' && !new RegExp(schema.pattern, 'u').test(value)) {
245
+ issues.push({ kind: 'invalid', path, message: `${path} 格式无效` });
246
+ }
247
+ if (Array.isArray(schema.enum) && !schema.enum.includes(value)) {
248
+ issues.push({ kind: 'invalid', path, message: `${path} 必须是 ${schema.enum.join('、')} 之一` });
249
+ }
250
+ return;
251
+ }
252
+ if (type === 'integer') {
253
+ const numeric = typeof value === 'number'
254
+ ? value
255
+ : typeof value === 'string' && /^\d+$/u.test(value.trim())
256
+ ? Number(value.trim())
257
+ : Number.NaN;
258
+ if (!Number.isInteger(numeric)) {
259
+ issues.push({ kind: 'invalid', path, message: `${path} 必须是整数` });
260
+ return;
261
+ }
262
+ if (typeof schema.minimum === 'number' && numeric < schema.minimum) {
263
+ issues.push({ kind: 'invalid', path, message: `${path} 不能小于 ${schema.minimum}` });
264
+ }
265
+ if (typeof schema.maximum === 'number' && numeric > schema.maximum) {
266
+ issues.push({ kind: 'invalid', path, message: `${path} 不能大于 ${schema.maximum}` });
267
+ }
268
+ }
269
+ }
270
+ export function validateDatabaseConfig(config, env = {}) {
271
+ if (!config || typeof config !== 'object' || Array.isArray(config)) {
272
+ return [{ kind: 'invalid', path: 'database', message: 'database 必须是对象' }];
273
+ }
274
+ const dialect = config.dialect;
275
+ if (typeof dialect !== 'string') {
276
+ return [{ kind: 'invalid', path: 'database.dialect', message: 'database.dialect 不能为空' }];
277
+ }
278
+ const definition = getDatabaseDialectDefinition(dialect);
279
+ if (!definition) {
280
+ return [{
281
+ kind: 'invalid',
282
+ path: 'database.dialect',
283
+ message: `不支持的数据库方言 ${JSON.stringify(dialect)}`,
284
+ }];
285
+ }
286
+ const issues = [];
287
+ validateValue(definition.schema, config, 'database', env, issues);
288
+ return Object.freeze(issues);
289
+ }
290
+ //# sourceMappingURL=database-definitions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database-definitions.js","sourceRoot":"","sources":["../src/database-definitions.ts"],"names":[],"mappings":"AA4BA,MAAM,IAAI,GAAG,CAAC,YAAqB,EAAE,SAAkC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC7E,IAAI,EAAE,QAAQ;IACd,SAAS,EAAE,CAAC;IACZ,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;IAChE,GAAG,MAAM;CACV,CAAC,CAAC;AAEH,MAAM,IAAI,GAAG,CAAC,YAAoB,EAAE,EAAE,CAAC,CAAC;IACtC,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,KAAK;IACd,OAAO,EAAE,YAAY;CACtB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,4BAA4B,GAAyC,MAAM,CAAC,MAAM,CAAC;IAC9F;QACE,OAAO,EAAE,QAAQ;QACjB,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,iBAAiB;QAC9B,cAAc,EAAE,uCAAuC;QACvD,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,oBAAoB,EAAE,IAAI;YAC1B,QAAQ,EAAE,CAAC,SAAS,CAAC;YACrB,UAAU,EAAE;gBACV,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE;gBAC5B,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC;gBAC/B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE;aAC5E;SACF;KACF;IACD;QACE,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,QAAQ;QACrB,cAAc,EAAE,eAAe;QAC/B,MAAM,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE;QACjD,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,oBAAoB,EAAE,IAAI;YAC1B,QAAQ,EAAE,CAAC,SAAS,CAAC;YACrB,UAAU,EAAE;gBACV,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;gBAC3B,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC;gBACvB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;gBAChB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;gBAClB,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC5B,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC;aAC3B;SACF;KACF;IACD;QACE,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,gBAAgB;QAC7B,cAAc,EAAE,eAAe;QAC/B,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE;QAC7C,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,oBAAoB,EAAE,IAAI;YAC1B,QAAQ,EAAE,CAAC,SAAS,CAAC;YACrB,UAAU,EAAE;gBACV,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;gBACxB,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC;gBACvB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;gBAChB,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC;gBACtB,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC5B,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC;aAC3B;SACF;KACF;IACD;QACE,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,OAAO;QACpB,cAAc,EAAE,WAAW;QAC3B,MAAM,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE;QACjD,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,oBAAoB,EAAE,IAAI;YAC1B,QAAQ,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,CAAC;YACtC,UAAU,EAAE;gBACV,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;gBAC7B,GAAG,EAAE,IAAI,CAAC,2BAA2B,EAAE,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC;gBAC7E,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC;aACzB;SACF;KACF;IACD;QACE,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,OAAO;QACpB,cAAc,EAAE,SAAS;QACzB,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE;QAC/C,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,oBAAoB,EAAE,IAAI;YAC1B,QAAQ,EAAE,CAAC,SAAS,CAAC;YACrB,UAAU,EAAE;gBACV,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;gBAC3B,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,oBAAoB,EAAE,IAAI;oBAC1B,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;oBAC1B,UAAU,EAAE;wBACV,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC;wBACvB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;qBACjB;iBACF;gBACD,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC5B,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;aACtD;SACF;KACF;IACD;QACE,OAAO,EAAE,QAAQ;QACjB,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,gBAAgB;QAC7B,cAAc,EAAE,WAAW;QAC3B,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,oBAAoB,EAAE,KAAK;YAC3B,QAAQ,EAAE,CAAC,SAAS,CAAC;YACrB,UAAU,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;SAC7C;KACF;CACF,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,4BAA4B,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;AAEhH,MAAM,UAAU,4BAA4B,CAAC,OAAe;IAC1D,OAAO,WAAW,CAAC,GAAG,CAAC,OAA0B,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,UAAqC;IACvE,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM;QAC9B,CAAC,CAAC,OAAO,UAAU,CAAC,MAAM,CAAC,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE;QACjE,CAAC,CAAC,EAAE,CAAC;IACP,OAAO,GAAG,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,WAAW,cAAc,UAAU,CAAC,cAAc,GAAG,MAAM,GAAG,CAAC;AACzG,CAAC;AAED,SAAS,mBAAmB,CAC1B,KAAa,EACb,IAAY,EACZ,GAAiD,EACjD,MAA6B;IAE7B,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACzC,IAAI,KAAK,GAAG,CAAC;YAAE,MAAM;QACrB,IAAI,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC;QACvB,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5B,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YACxC,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;YAClB,SAAS;QACX,CAAC;QACD,MAAM,IAAI,CAAC,CAAC;QACZ,OAAO,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAE,CAAC;YAAE,MAAM,IAAI,CAAC,CAAC;QAC/E,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;QAC3C,IAAI,QAA4B,CAAC;QACjC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;YACtF,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;YAC7C,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;gBACxC,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;gBAClB,SAAS;YACX,CAAC;YACD,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;YAC1C,MAAM,GAAG,KAAK,CAAC;QACjB,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YACxC,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;YAClB,SAAS;QACX,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACpC,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,EAAE,CAAC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC1E,MAAM,IAAI,QAAQ,CAAC;QACrB,CAAC;aAAM,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,aAAa;gBACnB,IAAI;gBACJ,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,QAAQ,GAAG,QAAQ,IAAI,GAAG;aACpC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,QAAQ,CAAC;QACrB,CAAC;QACD,KAAK,GAAG,MAAM,GAAG,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,aAAa,CAAC,SAAiB;IACtC,OAAO,CAAC,SAAS,IAAI,GAAG,IAAI,SAAS,IAAI,GAAG,CAAC;WACxC,CAAC,SAAS,IAAI,GAAG,IAAI,SAAS,IAAI,GAAG,CAAC;WACtC,SAAS,KAAK,GAAG,CAAC;AACzB,CAAC;AAED,SAAS,iBAAiB,CAAC,SAAiB;IAC1C,OAAO,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,IAAI,GAAG,IAAI,SAAS,IAAI,GAAG,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,aAAa,CACpB,MAA+B,EAC/B,QAAiB,EACjB,IAAY,EACZ,GAAiD,EACjD,MAA6B;IAE7B,IAAI,KAAK,GAAG,QAAQ,CAAC;IACrB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC7B,KAAK,GAAG,mBAAmB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACtD,IAAI,MAAM,CAAC,MAAM,GAAG,MAAM;YAAE,OAAO;IACrC,CAAC;IAED,IAAI,OAAO,IAAI,MAAM,IAAI,KAAK,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,QAAQ,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/F,OAAO;IACT,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAChE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC,CAAC;YACjE,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,KAAgC,CAAC;QAChD,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAA4C,CAAC;QACxF,IAAI,MAAM,CAAC,oBAAoB,KAAK,KAAK,EAAE,CAAC;YAC1C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtC,IAAI,CAAC,CAAC,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC;oBACzB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,EAAE,OAAO,EAAE,GAAG,IAAI,IAAI,GAAG,YAAY,EAAE,CAAC,CAAC;gBAChG,CAAC;YACH,CAAC;QACH,CAAC;QACD,KAAK,MAAM,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAa,EAAE,CAAC;YAC3D,IAAI,CAAC,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;gBACzF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,QAAQ,EAAE,EAAE,OAAO,EAAE,GAAG,IAAI,IAAI,QAAQ,OAAO,EAAE,CAAC,CAAC;YACrG,CAAC;QACH,CAAC;QACD,KAAK,MAAM,CAAC,GAAG,EAAE,cAAc,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/D,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS;gBAAE,aAAa,CAAC,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAC3G,CAAC;QACD,OAAO;IACT,CAAC;IACD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,SAAS,EAAE,CAAC,CAAC;YAClE,OAAO;QACT,CAAC;QACD,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;YAC5E,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACvF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/D,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,QAAQ,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QAC7F,CAAC;QACD,OAAO;IACT,CAAC;IACD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,OAAO,KAAK,KAAK,QAAQ;YACvC,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;gBACxD,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;gBACtB,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;QACjB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC,CAAC;YACjE,OAAO;QACT,CAAC;QACD,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YACnE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,SAAS,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACpF,CAAC;QACD,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YACnE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,SAAS,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,MAAe,EACf,MAAoD,EAAE;IAEtD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnE,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,OAAO,GAAI,MAAkC,CAAC,OAAO,CAAC;IAC5D,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC,CAAC;IAC3F,CAAC;IACD,MAAM,UAAU,GAAG,4BAA4B,CAAC,OAAO,CAAC,CAAC;IACzD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC;gBACN,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,kBAAkB;gBACxB,OAAO,EAAE,aAAa,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE;aAChD,CAAC,CAAC;IACL,CAAC;IACD,MAAM,MAAM,GAA0B,EAAE,CAAC;IACzC,aAAa,CAAC,UAAU,CAAC,MAAiC,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IAC7F,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5C,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,cAAc,CAAC,CA+BxE"}
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AA6B5C,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,cAAc,CAAC,CA0CxE"}
package/lib/database.js CHANGED
@@ -1,4 +1,23 @@
1
1
  import inquirer from 'inquirer';
2
+ import { DATABASE_DIALECT_DEFINITIONS, databaseChoiceLabel, getDatabaseDialectDefinition, validateDatabaseConfig, } from './database-definitions.js';
3
+ function schemaDefault(dialect, ...path) {
4
+ let schema = getDatabaseDialectDefinition(dialect)?.schema;
5
+ for (const segment of path) {
6
+ const properties = schema?.properties;
7
+ schema = properties?.[segment];
8
+ }
9
+ return schema?.default;
10
+ }
11
+ function parseIntegerInput(input, minimum, maximum = Number.MAX_SAFE_INTEGER) {
12
+ const raw = String(input).trim();
13
+ if (!/^\d+$/u.test(raw))
14
+ return `请输入有效的整数 (${minimum}-${maximum})`;
15
+ const value = Number(raw);
16
+ if (!Number.isSafeInteger(value) || value < minimum || value > maximum) {
17
+ return `请输入有效的整数 (${minimum}-${maximum})`;
18
+ }
19
+ return value;
20
+ }
2
21
  // 配置数据库选项
3
22
  export async function configureDatabaseOptions() {
4
23
  const { dialect } = await inquirer.prompt([
@@ -6,30 +25,41 @@ export async function configureDatabaseOptions() {
6
25
  type: 'select',
7
26
  name: 'dialect',
8
27
  message: '选择数据库类型:',
9
- choices: [
10
- { name: 'SQLite (推荐, 零配置)', value: 'sqlite' },
11
- { name: 'MySQL', value: 'mysql' },
12
- { name: 'PostgreSQL', value: 'pg' },
13
- { name: 'MongoDB', value: 'mongodb' },
14
- { name: 'Redis', value: 'redis' }
15
- ],
28
+ choices: DATABASE_DIALECT_DEFINITIONS.map((definition) => ({
29
+ name: databaseChoiceLabel(definition),
30
+ value: definition.dialect,
31
+ })),
16
32
  default: 'sqlite'
17
33
  }
18
34
  ]);
35
+ let config;
19
36
  switch (dialect) {
20
37
  case 'sqlite':
21
- return await configureSQLite();
38
+ config = await configureSQLite();
39
+ break;
22
40
  case 'mysql':
23
- return await configureMySQL();
41
+ config = await configureMySQL();
42
+ break;
24
43
  case 'pg':
25
- return await configurePostgreSQL();
44
+ config = await configurePostgreSQL();
45
+ break;
26
46
  case 'mongodb':
27
- return await configureMongoDB();
47
+ config = await configureMongoDB();
48
+ break;
28
49
  case 'redis':
29
- return await configureRedis();
50
+ config = await configureRedis();
51
+ break;
52
+ case 'memory':
53
+ config = { dialect: 'memory' };
54
+ break;
30
55
  default:
31
56
  throw new Error(`未支持的数据库类型: ${dialect}`);
32
57
  }
58
+ const issues = validateDatabaseConfig(config);
59
+ if (issues.length > 0) {
60
+ throw new TypeError(`数据库配置不符合 Schema:${issues.map((issue) => issue.message).join(';')}`);
61
+ }
62
+ return config;
33
63
  }
34
64
  // SQLite 配置
35
65
  async function configureSQLite() {
@@ -38,7 +68,7 @@ async function configureSQLite() {
38
68
  type: 'input',
39
69
  name: 'filename',
40
70
  message: 'SQLite 数据库文件路径:',
41
- default: './data/bot.db',
71
+ default: schemaDefault('sqlite', 'filename'),
42
72
  validate: (input) => {
43
73
  if (!input.trim())
44
74
  return '文件路径不能为空';
@@ -54,7 +84,7 @@ async function configureSQLite() {
54
84
  { name: 'DELETE (默认)', value: 'delete' },
55
85
  { name: 'MEMORY (内存数据库)', value: 'memory' }
56
86
  ],
57
- default: 'wal'
87
+ default: schemaDefault('sqlite', 'mode')
58
88
  }
59
89
  ]);
60
90
  return {
@@ -70,26 +100,23 @@ async function configureMySQL() {
70
100
  type: 'input',
71
101
  name: 'host',
72
102
  message: 'MySQL 主机地址:',
73
- default: 'localhost'
103
+ default: schemaDefault('mysql', 'host')
74
104
  },
75
105
  {
76
106
  type: 'input',
77
107
  name: 'port',
78
108
  message: 'MySQL 端口:',
79
- default: '3306',
109
+ default: String(schemaDefault('mysql', 'port')),
80
110
  validate: (input) => {
81
- const port = parseInt(input);
82
- if (isNaN(port) || port < 1 || port > 65535) {
83
- return '请输入有效的端口号 (1-65535)';
84
- }
85
- return true;
111
+ const value = parseIntegerInput(input, 1, 65535);
112
+ return typeof value === 'number' ? true : value;
86
113
  }
87
114
  },
88
115
  {
89
116
  type: 'input',
90
117
  name: 'user',
91
118
  message: 'MySQL 用户名:',
92
- default: 'root'
119
+ default: schemaDefault('mysql', 'user')
93
120
  },
94
121
  {
95
122
  type: 'password',
@@ -100,7 +127,7 @@ async function configureMySQL() {
100
127
  type: 'input',
101
128
  name: 'database',
102
129
  message: 'MySQL 数据库名:',
103
- default: 'zhin_bot',
130
+ default: schemaDefault('mysql', 'database'),
104
131
  validate: (input) => {
105
132
  if (!input.trim())
106
133
  return '数据库名不能为空';
@@ -111,7 +138,7 @@ async function configureMySQL() {
111
138
  return {
112
139
  dialect: 'mysql',
113
140
  host: config.host,
114
- port: parseInt(config.port),
141
+ port: Number(config.port),
115
142
  user: config.user,
116
143
  password: config.password,
117
144
  database: config.database
@@ -124,26 +151,23 @@ async function configurePostgreSQL() {
124
151
  type: 'input',
125
152
  name: 'host',
126
153
  message: 'PostgreSQL 主机地址:',
127
- default: 'localhost'
154
+ default: schemaDefault('pg', 'host')
128
155
  },
129
156
  {
130
157
  type: 'input',
131
158
  name: 'port',
132
159
  message: 'PostgreSQL 端口:',
133
- default: '5432',
160
+ default: String(schemaDefault('pg', 'port')),
134
161
  validate: (input) => {
135
- const port = parseInt(input);
136
- if (isNaN(port) || port < 1 || port > 65535) {
137
- return '请输入有效的端口号 (1-65535)';
138
- }
139
- return true;
162
+ const value = parseIntegerInput(input, 1, 65535);
163
+ return typeof value === 'number' ? true : value;
140
164
  }
141
165
  },
142
166
  {
143
167
  type: 'input',
144
168
  name: 'user',
145
169
  message: 'PostgreSQL 用户名:',
146
- default: 'postgres'
170
+ default: schemaDefault('pg', 'user')
147
171
  },
148
172
  {
149
173
  type: 'password',
@@ -154,7 +178,7 @@ async function configurePostgreSQL() {
154
178
  type: 'input',
155
179
  name: 'database',
156
180
  message: 'PostgreSQL 数据库名:',
157
- default: 'zhin_bot',
181
+ default: schemaDefault('pg', 'database'),
158
182
  validate: (input) => {
159
183
  if (!input.trim())
160
184
  return '数据库名不能为空';
@@ -165,7 +189,7 @@ async function configurePostgreSQL() {
165
189
  return {
166
190
  dialect: 'pg',
167
191
  host: config.host,
168
- port: parseInt(config.port),
192
+ port: Number(config.port),
169
193
  user: config.user,
170
194
  password: config.password,
171
195
  database: config.database
@@ -178,7 +202,7 @@ async function configureMongoDB() {
178
202
  type: 'input',
179
203
  name: 'url',
180
204
  message: 'MongoDB 连接字符串:',
181
- default: 'mongodb://localhost:27017',
205
+ default: schemaDefault('mongodb', 'url'),
182
206
  validate: (input) => {
183
207
  if (!input.trim())
184
208
  return '连接字符串不能为空';
@@ -192,7 +216,7 @@ async function configureMongoDB() {
192
216
  type: 'input',
193
217
  name: 'dbName',
194
218
  message: 'MongoDB 数据库名:',
195
- default: 'zhin_bot',
219
+ default: schemaDefault('mongodb', 'dbName'),
196
220
  validate: (input) => {
197
221
  if (!input.trim())
198
222
  return '数据库名不能为空';
@@ -213,19 +237,16 @@ async function configureRedis() {
213
237
  type: 'input',
214
238
  name: 'host',
215
239
  message: 'Redis 主机地址:',
216
- default: 'localhost'
240
+ default: schemaDefault('redis', 'socket', 'host')
217
241
  },
218
242
  {
219
243
  type: 'input',
220
244
  name: 'port',
221
245
  message: 'Redis 端口:',
222
- default: '6379',
246
+ default: String(schemaDefault('redis', 'socket', 'port')),
223
247
  validate: (input) => {
224
- const port = parseInt(input);
225
- if (isNaN(port) || port < 1 || port > 65535) {
226
- return '请输入有效的端口号 (1-65535)';
227
- }
228
- return true;
248
+ const value = parseIntegerInput(input, 1, 65535);
249
+ return typeof value === 'number' ? true : value;
229
250
  }
230
251
  },
231
252
  {
@@ -237,13 +258,10 @@ async function configureRedis() {
237
258
  type: 'input',
238
259
  name: 'db',
239
260
  message: 'Redis 数据库索引:',
240
- default: '0',
261
+ default: String(schemaDefault('redis', 'database')),
241
262
  validate: (input) => {
242
- const db = parseInt(input);
243
- if (isNaN(db) || db < 0) {
244
- return '请输入有效的数据库索引 (>= 0)';
245
- }
246
- return true;
263
+ const value = parseIntegerInput(input, 0);
264
+ return typeof value === 'number' ? true : '请输入有效的数据库索引 (>= 0)';
247
265
  }
248
266
  }
249
267
  ]);
@@ -251,10 +269,10 @@ async function configureRedis() {
251
269
  dialect: 'redis',
252
270
  socket: {
253
271
  host: config.host,
254
- port: parseInt(config.port)
272
+ port: Number(config.port)
255
273
  },
256
274
  password: config.password || undefined,
257
- database: parseInt(config.db)
275
+ database: Number(config.db)
258
276
  };
259
277
  }
260
278
  //# sourceMappingURL=database.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"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"}
package/lib/env.d.ts CHANGED
@@ -11,4 +11,10 @@ export declare function formatEnvValue(value: unknown): string;
11
11
  export declare function mergeEnvText(existing: string, extra: string): string;
12
12
  /** 生成数据库连接环境变量(连接参数落 .env,配置文件只引用 ${VAR})。 */
13
13
  export declare function generateDatabaseEnvVars(config: DatabaseConfig): string;
14
+ /**
15
+ * Generate a version-control-safe database section for `.env.example`.
16
+ * User-entered passwords and credential-bearing connection URLs are never
17
+ * copied from the interactive wizard.
18
+ */
19
+ export declare function generateDatabaseEnvExample(config: DatabaseConfig): string;
14
20
  //# sourceMappingURL=env.d.ts.map
package/lib/env.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQrD;AAID;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAwCpE;AAED,8CAA8C;AAC9C,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CA+CtE"}
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQrD;AAID;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAwCpE;AAED,8CAA8C;AAC9C,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAgDtE;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CA4CzE"}