@ailnaf/zoddb 0.0.0-stage → 0.2.0

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 (93) hide show
  1. package/CHANGELOG.md +73 -0
  2. package/LICENSE +15 -0
  3. package/README.md +440 -2
  4. package/dist/aggregate.d.ts +42 -0
  5. package/dist/aggregate.d.ts.map +1 -0
  6. package/dist/aggregate.js +77 -0
  7. package/dist/aggregate.js.map +1 -0
  8. package/dist/auth-schema.d.ts +26 -0
  9. package/dist/auth-schema.d.ts.map +1 -0
  10. package/dist/auth-schema.js +139 -0
  11. package/dist/auth-schema.js.map +1 -0
  12. package/dist/better-auth-adapter.d.ts +21 -0
  13. package/dist/better-auth-adapter.d.ts.map +1 -0
  14. package/dist/better-auth-adapter.js +175 -0
  15. package/dist/better-auth-adapter.js.map +1 -0
  16. package/dist/cli.d.ts +3 -0
  17. package/dist/cli.d.ts.map +1 -0
  18. package/dist/cli.js +341 -0
  19. package/dist/cli.js.map +1 -0
  20. package/dist/config.d.ts +22 -0
  21. package/dist/config.d.ts.map +1 -0
  22. package/dist/config.js +52 -0
  23. package/dist/config.js.map +1 -0
  24. package/dist/db.d.ts +183 -0
  25. package/dist/db.d.ts.map +1 -0
  26. package/dist/db.js +1063 -0
  27. package/dist/db.js.map +1 -0
  28. package/dist/ddl.d.ts +21 -0
  29. package/dist/ddl.d.ts.map +1 -0
  30. package/dist/ddl.js +127 -0
  31. package/dist/ddl.js.map +1 -0
  32. package/dist/dev.d.ts +9 -0
  33. package/dist/dev.d.ts.map +1 -0
  34. package/dist/dev.js +21 -0
  35. package/dist/dev.js.map +1 -0
  36. package/dist/errors.d.ts +63 -0
  37. package/dist/errors.d.ts.map +1 -0
  38. package/dist/errors.js +122 -0
  39. package/dist/errors.js.map +1 -0
  40. package/dist/filter.d.ts +67 -0
  41. package/dist/filter.d.ts.map +1 -0
  42. package/dist/filter.js +230 -0
  43. package/dist/filter.js.map +1 -0
  44. package/dist/graph.d.ts +54 -0
  45. package/dist/graph.d.ts.map +1 -0
  46. package/dist/graph.js +52 -0
  47. package/dist/graph.js.map +1 -0
  48. package/dist/index.d.ts +8 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +6 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/init.d.ts +12 -0
  53. package/dist/init.d.ts.map +1 -0
  54. package/dist/init.js +62 -0
  55. package/dist/init.js.map +1 -0
  56. package/dist/migrate.d.ts +58 -0
  57. package/dist/migrate.d.ts.map +1 -0
  58. package/dist/migrate.js +447 -0
  59. package/dist/migrate.js.map +1 -0
  60. package/dist/migrations.d.ts +80 -0
  61. package/dist/migrations.d.ts.map +1 -0
  62. package/dist/migrations.js +281 -0
  63. package/dist/migrations.js.map +1 -0
  64. package/dist/relation-graph.d.ts +50 -0
  65. package/dist/relation-graph.d.ts.map +1 -0
  66. package/dist/relation-graph.js +93 -0
  67. package/dist/relation-graph.js.map +1 -0
  68. package/dist/relations.d.ts +128 -0
  69. package/dist/relations.d.ts.map +1 -0
  70. package/dist/relations.js +21 -0
  71. package/dist/relations.js.map +1 -0
  72. package/dist/schema.d.ts +247 -0
  73. package/dist/schema.d.ts.map +1 -0
  74. package/dist/schema.js +584 -0
  75. package/dist/schema.js.map +1 -0
  76. package/dist/studio/page.d.ts +3 -0
  77. package/dist/studio/page.d.ts.map +1 -0
  78. package/dist/studio/page.js +708 -0
  79. package/dist/studio/page.js.map +1 -0
  80. package/dist/studio/server.d.ts +26 -0
  81. package/dist/studio/server.d.ts.map +1 -0
  82. package/dist/studio/server.js +415 -0
  83. package/dist/studio/server.js.map +1 -0
  84. package/dist/table.d.ts +156 -0
  85. package/dist/table.d.ts.map +1 -0
  86. package/dist/table.js +165 -0
  87. package/dist/table.js.map +1 -0
  88. package/dist/where.d.ts +18 -0
  89. package/dist/where.d.ts.map +1 -0
  90. package/dist/where.js +76 -0
  91. package/dist/where.js.map +1 -0
  92. package/docs/api.md +476 -0
  93. package/package.json +70 -4
@@ -0,0 +1,447 @@
1
+ import { createSchema, renderColumnDefinition, renderCreateEnum, renderDefaultValue, resolveRef } from './ddl.js';
2
+ import { DestructiveMigrationError } from './errors.js';
3
+ const quoteIdent = (s) => `"${s.replace(/"/g, '""')}"`;
4
+ const TYPE_ALIASES = {
5
+ integer: 'int4',
6
+ int: 'int4',
7
+ int4: 'int4',
8
+ bigint: 'int8',
9
+ int8: 'int8',
10
+ boolean: 'bool',
11
+ bool: 'bool',
12
+ 'timestamp with time zone': 'timestamptz',
13
+ timestamptz: 'timestamptz',
14
+ 'timestamp without time zone': 'timestamp',
15
+ timestamp: 'timestamp',
16
+ 'character varying': 'varchar',
17
+ varchar: 'varchar',
18
+ 'double precision': 'float8',
19
+ float8: 'float8',
20
+ real: 'float4',
21
+ float4: 'float4',
22
+ };
23
+ /** 把 format_type() 与我们的 sqlType 归一到同一写法 */
24
+ export function normalizeType(t) {
25
+ const s = t.trim().toLowerCase();
26
+ const suffix = s.endsWith('[]') ? '[]' : '';
27
+ const base = suffix ? s.slice(0, -2) : s;
28
+ const m = base.match(/^(character varying|varchar)\((\d+)\)$/);
29
+ const core = m ? `varchar(${m[2]})` : (TYPE_ALIASES[base] ?? base);
30
+ return core + suffix;
31
+ }
32
+ /** 去掉 PG 的 ::cast 与外层括号,便于比较默认值 */
33
+ export function normalizeDefault(d) {
34
+ if (d === null)
35
+ return null;
36
+ let s = d.trim();
37
+ while (s.startsWith('(') && s.endsWith(')'))
38
+ s = s.slice(1, -1).trim();
39
+ s = s.replace(/::[a-zA-Z_][a-zA-Z0-9_ ]*(\(\d+\))?(\[\])?/g, '');
40
+ return s.replace(/\s+/g, ' ').trim();
41
+ }
42
+ export async function introspect(client, tableNames) {
43
+ const out = new Map();
44
+ if (tableNames.length === 0)
45
+ return out;
46
+ const rows = await client.unsafe(`
47
+ select c.relname as table_name,
48
+ a.attname as column_name,
49
+ format_type(a.atttypid, a.atttypmod) as data_type,
50
+ a.attnotnull as not_null,
51
+ pg_get_expr(d.adbin, d.adrelid) as default_expr
52
+ from pg_attribute a
53
+ join pg_class c on c.oid = a.attrelid
54
+ join pg_namespace n on n.oid = c.relnamespace
55
+ left join pg_attrdef d on d.adrelid = a.attrelid and d.adnum = a.attnum
56
+ where n.nspname = current_schema() and c.relkind = 'r'
57
+ and c.relname = any($1) and a.attnum > 0 and not a.attisdropped
58
+ order by c.relname, a.attnum
59
+ `, [tableNames]);
60
+ for (const r of rows) {
61
+ if (!out.has(r.table_name))
62
+ out.set(r.table_name, new Map());
63
+ out.get(r.table_name).set(r.column_name, {
64
+ name: r.column_name,
65
+ type: r.data_type,
66
+ notNull: r.not_null,
67
+ default: r.default_expr,
68
+ });
69
+ }
70
+ return out;
71
+ }
72
+ async function introspectEnums(client, names) {
73
+ const out = new Map();
74
+ if (names.length === 0)
75
+ return out;
76
+ const rows = await client.unsafe(`
77
+ select t.typname as type_name, e.enumlabel as label
78
+ from pg_type t
79
+ join pg_enum e on e.enumtypid = t.oid
80
+ join pg_namespace n on n.oid = t.typnamespace
81
+ where n.nspname = current_schema() and t.typname = any($1)
82
+ order by t.typname, e.enumsortorder
83
+ `, [names]);
84
+ for (const r of rows) {
85
+ const list = out.get(r.type_name);
86
+ if (list)
87
+ list.push(r.label);
88
+ else
89
+ out.set(r.type_name, [r.label]);
90
+ }
91
+ return out;
92
+ }
93
+ async function introspectIndexes(client, tableNames) {
94
+ if (tableNames.length === 0)
95
+ return [];
96
+ const rows = await client.unsafe(`
97
+ select t.relname as table_name,
98
+ i.relname as index_name,
99
+ ix.indisunique as is_unique,
100
+ array_agg(a.attname order by k.ord) as columns
101
+ from pg_index ix
102
+ join pg_class t on t.oid = ix.indrelid
103
+ join pg_class i on i.oid = ix.indexrelid
104
+ join pg_namespace n on n.oid = t.relnamespace
105
+ join lateral unnest(ix.indkey) with ordinality as k(attnum, ord) on true
106
+ join pg_attribute a on a.attrelid = t.oid and a.attnum = k.attnum
107
+ where n.nspname = current_schema() and t.relname = any($1)
108
+ and not ix.indisprimary
109
+ and not exists (select 1 from pg_constraint c where c.conindid = ix.indexrelid)
110
+ group by t.relname, i.relname, ix.indisunique
111
+ `, [tableNames]);
112
+ return rows.map(r => ({
113
+ table: r.table_name,
114
+ name: r.index_name,
115
+ columns: r.columns,
116
+ unique: r.is_unique,
117
+ }));
118
+ }
119
+ async function introspectConstraints(client, tableNames) {
120
+ if (tableNames.length === 0)
121
+ return [];
122
+ const rows = await client.unsafe(`
123
+ select t.relname as table_name,
124
+ c.conname,
125
+ c.contype,
126
+ (
127
+ select array_agg(a.attname order by k.ord)
128
+ from unnest(c.conkey) with ordinality as k(attnum, ord)
129
+ join pg_attribute a on a.attrelid = t.oid and a.attnum = k.attnum
130
+ ) as columns,
131
+ rt.relname as ref_table,
132
+ (
133
+ select array_agg(a.attname order by k.ord)
134
+ from unnest(c.confkey) with ordinality as k(attnum, ord)
135
+ join pg_attribute a on a.attrelid = c.confrelid and a.attnum = k.attnum
136
+ ) as ref_columns,
137
+ case c.confdeltype
138
+ when 'a' then 'no action'
139
+ when 'r' then 'restrict'
140
+ when 'c' then 'cascade'
141
+ when 'n' then 'set null'
142
+ when 'd' then 'set default'
143
+ end as on_delete
144
+ from pg_constraint c
145
+ join pg_class t on t.oid = c.conrelid
146
+ join pg_namespace n on n.oid = t.relnamespace
147
+ left join pg_class rt on rt.oid = c.confrelid
148
+ where n.nspname = current_schema() and t.relname = any($1)
149
+ and c.contype in ('u', 'f', 'p')
150
+ `, [tableNames]);
151
+ return rows.map(r => ({
152
+ table: r.table_name,
153
+ name: r.conname,
154
+ kind: r.contype,
155
+ columns: r.columns ?? [],
156
+ ...(r.ref_table ? { refTable: r.ref_table } : {}),
157
+ ...(r.ref_columns ? { refColumns: r.ref_columns } : {}),
158
+ ...(r.on_delete ? { onDelete: r.on_delete } : {}),
159
+ }));
160
+ }
161
+ async function introspectChecks(client, tableNames) {
162
+ if (tableNames.length === 0)
163
+ return [];
164
+ const rows = await client.unsafe(`
165
+ select t.relname as table_name,
166
+ c.conname,
167
+ pg_get_constraintdef(c.oid) as definition
168
+ from pg_constraint c
169
+ join pg_class t on t.oid = c.conrelid
170
+ join pg_namespace n on n.oid = t.relnamespace
171
+ where n.nspname = current_schema() and t.relname = any($1) and c.contype = 'c'
172
+ `, [tableNames]);
173
+ return rows.map(r => ({ table: r.table_name, name: r.conname, definition: r.definition }));
174
+ }
175
+ /** 归一化 CHECK 表达式:去掉 CHECK、外层括号、cast、空白与大小写 */
176
+ function normalizeCheck(expr) {
177
+ let s = expr.trim().replace(/^check\s*/i, '');
178
+ const strip = (x) => {
179
+ if (!x.startsWith('(') || !x.endsWith(')'))
180
+ return x;
181
+ let depth = 0;
182
+ for (let i = 0; i < x.length; i++) {
183
+ if (x[i] === '(')
184
+ depth++;
185
+ else if (x[i] === ')') {
186
+ depth--;
187
+ if (depth === 0 && i < x.length - 1)
188
+ return x;
189
+ }
190
+ }
191
+ return depth === 0 ? x.slice(1, -1).trim() : x;
192
+ };
193
+ let prev = '';
194
+ while (prev !== s) {
195
+ prev = s;
196
+ s = strip(s);
197
+ }
198
+ return s
199
+ .replace(/::[a-zA-Z_][a-zA-Z0-9_ ]*(\(\d+\))?(\[\])?/g, '')
200
+ .replace(/\s+/g, ' ')
201
+ .replace(/\s*([(),])\s*/g, '$1')
202
+ .trim()
203
+ .toLowerCase();
204
+ }
205
+ function renderIndex(table, idx) {
206
+ return `create ${idx.unique ? 'unique ' : ''}index if not exists ${quoteIdent(idx.name)} on ${quoteIdent(table)} (${idx.columns.map(quoteIdent).join(', ')})`;
207
+ }
208
+ const normalizeOnDelete = (value) => (value ?? 'no action').toLowerCase();
209
+ /**
210
+ * 用 relationGraph 校验 graph 的关系语义与 table plan 的 references() 一致。
211
+ * graph 只补充关系语义;真正的 DDL 仍由 plan 决定,冲突时在生成迁移前失败。
212
+ */
213
+ function validateGraphForeignKeys(graph, tables) {
214
+ const nodes = new Map(graph.nodes.map(n => [n.key, n]));
215
+ const tablesByName = new Map(tables.map(t => [t.name, t]));
216
+ const expected = new Map();
217
+ for (const edge of graph.edges) {
218
+ if (!edge.foreignKey || edge.through || edge.write === false)
219
+ continue;
220
+ const from = nodes.get(edge.from);
221
+ const to = nodes.get(edge.to);
222
+ if (!from || !to) {
223
+ throw new Error(`diffSchema: relation ${edge.from}.${edge.name} 的 graph 节点缺失`);
224
+ }
225
+ const sourceTable = tablesByName.get(from.table);
226
+ if (!sourceTable) {
227
+ throw new Error(`diffSchema: relation ${edge.from}.${edge.name} 的源表 ${from.table} 不在迁移输入中`);
228
+ }
229
+ const sourcePlan = sourceTable.__plan.find(p => p.outKey === edge.fromColumn);
230
+ const targetColumn = to.columns.find(c => c.key === edge.toColumn);
231
+ if (!sourcePlan || !targetColumn) {
232
+ throw new Error(`diffSchema: relation ${edge.from}.${edge.name} 的 from/to 列无法在 table plan 中解析`);
233
+ }
234
+ const ref = sourcePlan.ref ? resolveRef(sourcePlan) : undefined;
235
+ if (!ref) {
236
+ throw new Error(`diffSchema: relation ${edge.from}.${edge.name} 标记为 foreign key,但 ${sourceTable.name}.${sourcePlan.dbKey} 没有 references()`);
237
+ }
238
+ if (ref.table !== to.table || ref.column !== targetColumn.column) {
239
+ throw new Error(`diffSchema: relation ${edge.from}.${edge.name} 指向 ${to.table}.${targetColumn.column},但 references() 指向 ${ref.table}.${ref.column}`);
240
+ }
241
+ if (normalizeOnDelete(ref.onDelete) !== normalizeOnDelete(edge.onDelete)) {
242
+ throw new Error(`diffSchema: relation ${edge.from}.${edge.name} 的 onDelete=${edge.onDelete ?? 'no action'} 与 references() 的 ${ref.onDelete ?? 'no action'} 不一致`);
243
+ }
244
+ expected.set(`${sourceTable.name}.${sourcePlan.dbKey}`, {
245
+ table: to.table,
246
+ columns: [targetColumn.column],
247
+ onDelete: normalizeOnDelete(edge.onDelete),
248
+ });
249
+ }
250
+ return expected;
251
+ }
252
+ export async function diffSchema(db, tables, opts = {}) {
253
+ const graphForeignKeys = opts.graph
254
+ ? validateGraphForeignKeys(opts.graph, tables)
255
+ : undefined;
256
+ const live = await introspect(db.raw, tables.map(t => t.name));
257
+ const statements = [];
258
+ const destructive = [];
259
+ // enum:先建类型;已有类型只允许尾部追加
260
+ const desiredEnums = new Map();
261
+ for (const t of tables) {
262
+ for (const p of t.__plan) {
263
+ if (!p.enum)
264
+ continue;
265
+ const prev = desiredEnums.get(p.enum.name);
266
+ if (prev && JSON.stringify(prev) !== JSON.stringify(p.enum.values)) {
267
+ throw new Error(`diffSchema: enum ${p.enum.name} 在不同列上的值不一致`);
268
+ }
269
+ desiredEnums.set(p.enum.name, p.enum.values);
270
+ }
271
+ }
272
+ const liveEnums = await introspectEnums(db.raw, [...desiredEnums.keys()]);
273
+ const missing = tables.filter(t => !live.has(t.name));
274
+ const coveredByCreate = new Set(missing.flatMap(t => t.__plan.flatMap(p => p.enum ? [p.enum.name] : [])));
275
+ for (const [name, values] of desiredEnums) {
276
+ const liveValues = liveEnums.get(name);
277
+ if (!liveValues) {
278
+ if (!coveredByCreate.has(name))
279
+ statements.push(renderCreateEnum({ name, values }));
280
+ continue;
281
+ }
282
+ const isPrefix = liveValues.every((v, i) => values[i] === v);
283
+ if (isPrefix) {
284
+ for (const v of values.slice(liveValues.length)) {
285
+ statements.push(`alter type ${quoteIdent(name)} add value if not exists '${v.replace(/'/g, "''")}'`);
286
+ }
287
+ continue;
288
+ }
289
+ throw new Error(`diffSchema: enum ${name} 的值不匹配(库: ${liveValues.join(',')};schema: ${values.join(',')});删除/重排需要手工迁移`);
290
+ }
291
+ if (missing.length > 0)
292
+ statements.push(createSchema(missing, { ifNotExists: false }));
293
+ const liveIndexes = await introspectIndexes(db.raw, tables.map(t => t.name));
294
+ const liveConstraints = await introspectConstraints(db.raw, tables.map(t => t.name));
295
+ const liveChecks = await introspectChecks(db.raw, tables.map(t => t.name));
296
+ for (const t of tables) {
297
+ const liveCols = live.get(t.name);
298
+ if (!liveCols)
299
+ continue;
300
+ const prefix = `alter table ${quoteIdent(t.name)}`;
301
+ const wantPk = t.__primaryKey.length > 0
302
+ ? [...t.__primaryKey]
303
+ : t.__plan.filter(p => p.pk).map(p => p.dbKey);
304
+ const wantPkSet = new Set(wantPk);
305
+ for (const p of t.__plan) {
306
+ const col = liveCols.get(p.dbKey);
307
+ if (!col) {
308
+ const sql = `${prefix} add column ${renderColumnDefinition(p).trim()}`;
309
+ if (p.pk || wantPkSet.has(p.dbKey))
310
+ destructive.push(sql); // 给已有表加主键列可能失败,归为需确认
311
+ else
312
+ statements.push(sql);
313
+ continue;
314
+ }
315
+ if (normalizeType(col.type) !== normalizeType(p.sqlType)) {
316
+ destructive.push(`${prefix} alter column ${quoteIdent(p.dbKey)} type ${p.sqlType} using ${quoteIdent(p.dbKey)}::${p.sqlType}`);
317
+ }
318
+ const wantNotNull = !p.nullable || p.pk || wantPkSet.has(p.dbKey);
319
+ if (wantNotNull && !col.notNull)
320
+ statements.push(`${prefix} alter column ${quoteIdent(p.dbKey)} set not null`);
321
+ if (!wantNotNull && col.notNull)
322
+ statements.push(`${prefix} alter column ${quoteIdent(p.dbKey)} drop not null`);
323
+ const wantDefault = p.defaultValue === undefined ? null : normalizeDefault(renderDefaultValue(p.defaultValue));
324
+ if (wantDefault !== normalizeDefault(col.default)) {
325
+ statements.push(wantDefault === null
326
+ ? `${prefix} alter column ${quoteIdent(p.dbKey)} drop default`
327
+ : `${prefix} alter column ${quoteIdent(p.dbKey)} set default ${renderDefaultValue(p.defaultValue)}`);
328
+ }
329
+ }
330
+ for (const name of liveCols.keys()) {
331
+ if (!t.__plan.some(p => p.dbKey === name)) {
332
+ destructive.push(`${prefix} drop column ${quoteIdent(name)}`);
333
+ }
334
+ }
335
+ // 主键:与 unique/FK 分开比较;任何变化都归为 destructive
336
+ const livePk = liveConstraints.find(c => c.table === t.name && c.kind === 'p');
337
+ if (wantPk.length > 0) {
338
+ if (!livePk) {
339
+ destructive.push(`${prefix} add constraint ${quoteIdent(`${t.name}_pkey`)} primary key (${wantPk.map(quoteIdent).join(', ')})`);
340
+ }
341
+ else if (livePk.columns.join(',') !== wantPk.join(',')) {
342
+ destructive.push(`${prefix} drop constraint ${quoteIdent(livePk.name)}`);
343
+ destructive.push(`${prefix} add constraint ${quoteIdent(`${t.name}_pkey`)} primary key (${wantPk.map(quoteIdent).join(', ')})`);
344
+ }
345
+ }
346
+ else if (livePk) {
347
+ destructive.push(`${prefix} drop constraint ${quoteIdent(livePk.name)}`);
348
+ }
349
+ // check 约束
350
+ const wantChecks = new Map(t.__checks.map(c => [c.name, normalizeCheck(c.expression)]));
351
+ const gotChecks = new Map(liveChecks.filter(c => c.table === t.name).map(c => [c.name, normalizeCheck(c.definition)]));
352
+ for (const [name, expr] of wantChecks) {
353
+ const got = gotChecks.get(name);
354
+ if (got === undefined) {
355
+ statements.push(`${prefix} add constraint ${quoteIdent(name)} check (${t.__checks.find(c => c.name === name).expression})`);
356
+ }
357
+ else if (got !== expr) {
358
+ destructive.push(`${prefix} drop constraint ${quoteIdent(name)}`);
359
+ statements.push(`${prefix} add constraint ${quoteIdent(name)} check (${t.__checks.find(c => c.name === name).expression})`);
360
+ }
361
+ }
362
+ for (const c of liveChecks) {
363
+ if (c.table === t.name && !wantChecks.has(c.name))
364
+ destructive.push(`${prefix} drop constraint ${quoteIdent(c.name)}`);
365
+ }
366
+ const wantConstraints = new Map();
367
+ for (const p of t.__plan) {
368
+ if (p.unique && !p.pk)
369
+ wantConstraints.set(`${t.name}_${p.dbKey}_key`, { kind: 'u', columns: [p.dbKey] });
370
+ if (p.ref) {
371
+ const graphFk = graphForeignKeys?.get(`${t.name}.${p.dbKey}`);
372
+ const planRef = graphFk ? undefined : resolveRef(p);
373
+ if (graphFk || planRef) {
374
+ wantConstraints.set(`${t.name}_${p.dbKey}_fkey`, {
375
+ kind: 'f',
376
+ columns: [p.dbKey],
377
+ ref: {
378
+ table: graphFk?.table ?? planRef.table,
379
+ columns: graphFk?.columns ?? [planRef.column],
380
+ onDelete: normalizeOnDelete(graphFk?.onDelete ?? planRef.onDelete),
381
+ },
382
+ });
383
+ }
384
+ }
385
+ }
386
+ for (const cols of t.__uniques)
387
+ wantConstraints.set(`${t.name}_${cols.join('_')}_key`, { kind: 'u', columns: [...cols] });
388
+ const gotConstraints = new Map(liveConstraints.filter(c => c.table === t.name && c.kind !== 'p').map(c => [c.name, c]));
389
+ for (const [name, want] of wantConstraints) {
390
+ const got = gotConstraints.get(name);
391
+ const same = got !== undefined
392
+ && got.kind === want.kind
393
+ && got.columns.join(',') === want.columns.join(',')
394
+ && (want.kind === 'u' || (want.ref !== undefined
395
+ && got.refTable === want.ref.table
396
+ && (got.refColumns ?? []).join(',') === want.ref.columns.join(',')
397
+ && normalizeOnDelete(got.onDelete) === want.ref.onDelete));
398
+ if (same)
399
+ continue;
400
+ if (got)
401
+ destructive.push(`${prefix} drop constraint ${quoteIdent(name)}`);
402
+ if (want.kind === 'u') {
403
+ statements.push(`${prefix} add constraint ${quoteIdent(name)} unique (${want.columns.map(quoteIdent).join(', ')})`);
404
+ }
405
+ else if (want.ref) {
406
+ const onDelete = want.ref.onDelete === 'no action' ? '' : ` on delete ${want.ref.onDelete}`;
407
+ statements.push(`${prefix} add constraint ${quoteIdent(name)} foreign key (${quoteIdent(want.columns[0])}) references ${quoteIdent(want.ref.table)}(${quoteIdent(want.ref.columns[0])})${onDelete}`);
408
+ }
409
+ }
410
+ for (const c of liveConstraints) {
411
+ if (c.table === t.name && c.kind !== 'p' && !wantConstraints.has(c.name))
412
+ destructive.push(`${prefix} drop constraint ${quoteIdent(c.name)}`);
413
+ }
414
+ // 索引(排除约束自动生成的索引)
415
+ const wantIndexes = new Map(t.__indexes.map(i => [i.name, i]));
416
+ const gotIndexes = new Map(liveIndexes.filter(i => i.table === t.name).map(i => [i.name, i]));
417
+ for (const [name, want] of wantIndexes) {
418
+ const got = gotIndexes.get(name);
419
+ if (got && got.unique === want.unique && got.columns.join(',') === want.columns.join(','))
420
+ continue;
421
+ if (got)
422
+ destructive.push(`drop index ${quoteIdent(name)}`);
423
+ statements.push(renderIndex(t.name, want));
424
+ }
425
+ for (const i of liveIndexes) {
426
+ if (i.table === t.name && !wantIndexes.has(i.name))
427
+ destructive.push(`drop index ${quoteIdent(i.name)}`);
428
+ }
429
+ }
430
+ return { statements, destructive };
431
+ }
432
+ /** 把数据库推到 tables 定义的结构;返回本次 diff。幂等:无差异时不执行任何 SQL。 */
433
+ export async function pushSchema(db, tables, opts = {}) {
434
+ const diff = await diffSchema(db, tables);
435
+ if (diff.destructive.length > 0 && !opts.allowDestructive) {
436
+ throw new DestructiveMigrationError(diff.destructive);
437
+ }
438
+ const all = [...(opts.allowDestructive ? diff.destructive : []), ...diff.statements];
439
+ if (all.length === 0)
440
+ return diff;
441
+ await db.begin(async (tx) => {
442
+ for (const stmt of all)
443
+ await tx.raw.unsafe(stmt);
444
+ });
445
+ return diff;
446
+ }
447
+ //# sourceMappingURL=migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ import { type SchemaDiff } from './migrate.js';
2
+ import type { Db } from './db.js';
3
+ import type { SchemaDefinition } from './schema.js';
4
+ import type { Table } from './table.js';
5
+ /** 迁移历史表;与业务表同一 schema */
6
+ export declare const MIGRATIONS_TABLE = "_zoddb_migrations";
7
+ /** 迁移可接收低层 tables 或 defineSchema() 结果;后者会带上关系图语义。 */
8
+ export type MigrationInput = readonly Table[] | SchemaDefinition;
9
+ export interface GenerateOptions {
10
+ /** 迁移文件目录 */
11
+ dir: string;
12
+ /** 文件名后缀,默认 migration */
13
+ name?: string;
14
+ /** 允许把删列/改类型等破坏性语句写进文件 */
15
+ allowDestructive?: boolean;
16
+ /** 便于测试固定时间戳 */
17
+ now?: Date;
18
+ }
19
+ export interface GeneratedMigration {
20
+ file: string;
21
+ content: string;
22
+ diff: SchemaDiff;
23
+ }
24
+ export interface MigrationFile {
25
+ id: string;
26
+ path: string;
27
+ content: string;
28
+ checksum: string;
29
+ }
30
+ export interface AppliedMigration {
31
+ id: string;
32
+ checksum: string;
33
+ appliedAt: Date;
34
+ }
35
+ export interface MigrateResult {
36
+ applied: string[];
37
+ skipped: string[];
38
+ }
39
+ export interface ApplyOptions {
40
+ /** 获取迁移 advisory lock 的总等待时间;默认 10_000ms */
41
+ lockTimeoutMs?: number;
42
+ /** 显式允许 pending 文件早于已应用最大 id */
43
+ allowOutOfOrder?: boolean;
44
+ }
45
+ export interface MigrationStatus {
46
+ applied: AppliedMigration[];
47
+ pending: string[];
48
+ /** DB 已应用但目录里没有对应文件 */
49
+ missing: string[];
50
+ /** pending 文件 id 早于已应用最大 id */
51
+ outOfOrder: string[];
52
+ /** 空白迁移文件 */
53
+ empty: string[];
54
+ /** 与 schema 定义不一致的语句(缺的 additive + 多的 destructive) */
55
+ drift: string[];
56
+ /** 已应用但文件内容被改过 */
57
+ tampered: string[];
58
+ }
59
+ /** 对比 schema 与当前库,写一个迁移文件;无差异返回 null。不执行任何 DDL。 */
60
+ export declare function generateMigration(db: Db, input: MigrationInput, opts: GenerateOptions): Promise<GeneratedMigration | null>;
61
+ /** 应用迁移:先获取 schema 级 advisory lock,再用保留连接执行全部文件。 */
62
+ export declare function applyMigrations(db: Db, dir: string, opts?: ApplyOptions): Promise<MigrateResult>;
63
+ export interface BaselineOptions {
64
+ /** 只 baseline 到这个文件 id(含),必须存在 */
65
+ through: string;
66
+ /** 用于 drift 检查的 schema;默认要求与当前库一致 */
67
+ schema: MigrationInput;
68
+ /** 显式允许有 drift 时仍标记历史(危险) */
69
+ allowDrift?: boolean;
70
+ /** 获取迁移 advisory lock 的总等待时间 */
71
+ lockTimeoutMs?: number;
72
+ }
73
+ /**
74
+ * 把 through 及之前的迁移标记为已应用,不执行任何文件 SQL。
75
+ * 默认要求 schema 与当前库一致,避免把未落地的结构“伪装”成已迁移。
76
+ */
77
+ export declare function baselineMigrations(db: Db, dir: string, opts: BaselineOptions): Promise<MigrateResult>;
78
+ /** 已应用 / 待应用 / drift / 被篡改;drift 需要传 tables(否则跳过)。 */
79
+ export declare function migrationStatus(db: Db, dir: string, input?: MigrationInput): Promise<MigrationStatus>;
80
+ //# sourceMappingURL=migrations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../src/migrations.ts"],"names":[],"mappings":"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"}