@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,281 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { existsSync } from 'node:fs';
3
+ import { mkdir, readFile, readdir, writeFile } from 'node:fs/promises';
4
+ import { join } from 'node:path';
5
+ import { setTimeout as delay } from 'node:timers/promises';
6
+ import { DestructiveMigrationError } from './errors.js';
7
+ import { diffSchema } from './migrate.js';
8
+ import { relationGraph } from './relation-graph.js';
9
+ /** 迁移历史表;与业务表同一 schema */
10
+ export const MIGRATIONS_TABLE = '_zoddb_migrations';
11
+ function isTableArray(input) {
12
+ return Array.isArray(input);
13
+ }
14
+ function migrationTables(input) {
15
+ return isTableArray(input) ? input : input.tableList;
16
+ }
17
+ function migrationGraph(input) {
18
+ return isTableArray(input) ? undefined : relationGraph(input);
19
+ }
20
+ const checksum = (content) => createHash('sha256').update(content).digest('hex');
21
+ const stamp = (d) => d.toISOString().replace(/[-:T.]/g, '').slice(0, 17);
22
+ const safeName = (name) => name.replace(/[^a-zA-Z0-9_]+/g, '_').replace(/^_+|_+$/g, '') || 'migration';
23
+ /** 生成下一个不冲突的文件名(同毫秒同名/同毫秒多次生成) */
24
+ function nextFile(dir, base) {
25
+ let file = join(dir, `${base}.sql`);
26
+ for (let i = 2; existsSync(file); i++)
27
+ file = join(dir, `${base}_${i}.sql`);
28
+ return file;
29
+ }
30
+ /** 单调时间戳:即使同一毫秒多次 generate,文件名也严格递增 */
31
+ async function nextStamp(dir, now) {
32
+ let max = 0;
33
+ try {
34
+ for (const e of await readdir(dir, { withFileTypes: true })) {
35
+ const m = /^(\d{17})_/.exec(e.name);
36
+ if (m)
37
+ max = Math.max(max, Number(m[1]));
38
+ }
39
+ }
40
+ catch {
41
+ // 目录不存在时从 now 开始
42
+ }
43
+ return String(Math.max(Number(stamp(now)), max + 1)).padStart(17, '0');
44
+ }
45
+ /** 对比 schema 与当前库,写一个迁移文件;无差异返回 null。不执行任何 DDL。 */
46
+ export async function generateMigration(db, input, opts) {
47
+ const tables = migrationTables(input);
48
+ const diff = await diffSchema(db, tables, { graph: migrationGraph(input) });
49
+ if (diff.destructive.length > 0 && !opts.allowDestructive) {
50
+ throw new DestructiveMigrationError(diff.destructive);
51
+ }
52
+ const all = [...(opts.allowDestructive ? diff.destructive : []), ...diff.statements];
53
+ if (all.length === 0)
54
+ return null;
55
+ const base = `${await nextStamp(opts.dir, opts.now ?? new Date())}_${safeName(opts.name ?? 'migration')}`;
56
+ await mkdir(opts.dir, { recursive: true });
57
+ const file = nextFile(opts.dir, base);
58
+ const body = all.map(s => `${s.replace(/;\s*$/, '')};`).join('\n\n');
59
+ const content = [
60
+ `-- zoddb migration ${base}`,
61
+ diff.destructive.length > 0 ? '-- 包含破坏性语句(生成时显式允许)' : null,
62
+ '',
63
+ body,
64
+ '',
65
+ ].filter((line) => line !== null).join('\n');
66
+ await writeFile(file, content, 'utf8');
67
+ return { file, content, diff };
68
+ }
69
+ async function ensureMigrationsTable(db) {
70
+ await db.raw.unsafe(`
71
+ create table if not exists "${MIGRATIONS_TABLE}" (
72
+ id text primary key,
73
+ checksum text not null,
74
+ applied_at timestamptz not null default now()
75
+ )
76
+ `);
77
+ }
78
+ async function listMigrationFiles(dir) {
79
+ let entries;
80
+ try {
81
+ entries = await readdir(dir, { withFileTypes: true });
82
+ }
83
+ catch (err) {
84
+ if (err.code === 'ENOENT')
85
+ return [];
86
+ throw err;
87
+ }
88
+ const names = entries.filter(e => e.isFile() && e.name.endsWith('.sql')).map(e => e.name).sort();
89
+ return Promise.all(names.map(async (name) => {
90
+ const path = join(dir, name);
91
+ const content = await readFile(path, 'utf8');
92
+ return { id: name, path, content, checksum: checksum(content) };
93
+ }));
94
+ }
95
+ function reservedMigrationDb(conn) {
96
+ return {
97
+ raw: conn,
98
+ async begin(fn) {
99
+ await conn.unsafe('begin');
100
+ try {
101
+ const result = await fn({ raw: conn });
102
+ await conn.unsafe('commit');
103
+ return result;
104
+ }
105
+ catch (err) {
106
+ await conn.unsafe('rollback').catch(() => { });
107
+ throw err;
108
+ }
109
+ },
110
+ };
111
+ }
112
+ async function appliedMigrations(db) {
113
+ const [table] = await db.raw.unsafe('select to_regclass($1) as table_name', [MIGRATIONS_TABLE]);
114
+ if (!table?.table_name)
115
+ return [];
116
+ const rows = await db.raw.unsafe(`select id, checksum, applied_at from "${MIGRATIONS_TABLE}" order by id`);
117
+ return rows.map(r => ({ id: r.id, checksum: r.checksum, appliedAt: r.applied_at }));
118
+ }
119
+ const DEFAULT_LOCK_TIMEOUT_MS = 10_000;
120
+ const LOCK_POLL_MS = 50;
121
+ const LOCK_SQL = (fn) => `select ${fn}(hashtext(current_schema()), hashtext($1)) as locked`;
122
+ async function acquireMigrationLock(conn, timeoutMs) {
123
+ const deadline = Date.now() + Math.max(0, timeoutMs);
124
+ while (true) {
125
+ const rows = await conn.unsafe(LOCK_SQL('pg_try_advisory_lock'), [MIGRATIONS_TABLE]);
126
+ if (rows[0]?.locked)
127
+ return;
128
+ const remaining = deadline - Date.now();
129
+ if (remaining <= 0) {
130
+ throw new Error(`migrations: 获取迁移锁超时(${timeoutMs}ms);另一个迁移可能正在执行`);
131
+ }
132
+ await delay(Math.min(LOCK_POLL_MS, remaining));
133
+ }
134
+ }
135
+ async function releaseMigrationLock(conn) {
136
+ try {
137
+ await conn.unsafe(LOCK_SQL('pg_advisory_unlock'), [MIGRATIONS_TABLE]);
138
+ }
139
+ finally {
140
+ conn.release();
141
+ }
142
+ }
143
+ async function applyMigrationsLocked(db, dir, opts) {
144
+ await ensureMigrationsTable(db);
145
+ const applied = await appliedMigrations(db);
146
+ const files = await listMigrationFiles(dir);
147
+ const known = new Map(applied.map(a => [a.id, a.checksum]));
148
+ const fileIds = new Set(files.map(f => f.id));
149
+ const missing = applied.filter(a => !fileIds.has(a.id)).map(a => a.id);
150
+ if (missing.length > 0) {
151
+ throw new Error(`migrations: 已应用文件缺失: ${missing.join(', ')}`);
152
+ }
153
+ // 先整体检查已应用文件的完整性,避免“执行了一半才发现被篡改”
154
+ for (const f of files) {
155
+ const prev = known.get(f.id);
156
+ if (prev !== undefined && prev !== f.checksum) {
157
+ throw new Error(`迁移 ${f.id} 已应用但内容被修改(checksum 不符)`);
158
+ }
159
+ }
160
+ const empty = files.filter(f => f.content.trim() === '').map(f => f.id);
161
+ if (empty.length > 0) {
162
+ throw new Error(`migrations: 迁移文件 ${empty.join(', ')} 是空文件`);
163
+ }
164
+ const maxApplied = applied.at(-1)?.id;
165
+ const outOfOrder = files
166
+ .filter(f => !known.has(f.id) && maxApplied !== undefined && f.id < maxApplied)
167
+ .map(f => f.id);
168
+ if (outOfOrder.length > 0 && !opts.allowOutOfOrder) {
169
+ throw new Error(`migrations: 迁移文件 ${outOfOrder.join(', ')} 早于已应用的最新迁移 ${maxApplied};设置 allowOutOfOrder 才能继续`);
170
+ }
171
+ const result = { applied: [], skipped: [] };
172
+ for (const f of files) {
173
+ if (known.has(f.id)) {
174
+ result.skipped.push(f.id);
175
+ continue;
176
+ }
177
+ await db.begin(async (tx) => {
178
+ await tx.raw.unsafe(f.content);
179
+ await tx.raw.unsafe(`insert into "${MIGRATIONS_TABLE}" (id, checksum) values ($1, $2)`, [f.id, f.checksum]);
180
+ });
181
+ result.applied.push(f.id);
182
+ }
183
+ return result;
184
+ }
185
+ async function withMigrationLock(db, opts, fn) {
186
+ const conn = await db.raw.reserve();
187
+ const lockDb = reservedMigrationDb(conn);
188
+ let acquired = false;
189
+ try {
190
+ await acquireMigrationLock(conn, opts.lockTimeoutMs ?? DEFAULT_LOCK_TIMEOUT_MS);
191
+ acquired = true;
192
+ return await fn(lockDb);
193
+ }
194
+ finally {
195
+ if (acquired) {
196
+ try {
197
+ await releaseMigrationLock(conn);
198
+ }
199
+ catch {
200
+ // releaseMigrationLock 的 finally 已负责 release;避免重复归还连接。
201
+ }
202
+ }
203
+ else {
204
+ conn.release();
205
+ }
206
+ }
207
+ }
208
+ /** 应用迁移:先获取 schema 级 advisory lock,再用保留连接执行全部文件。 */
209
+ export async function applyMigrations(db, dir, opts = {}) {
210
+ return withMigrationLock(db, opts, lockDb => applyMigrationsLocked(lockDb, dir, opts));
211
+ }
212
+ /**
213
+ * 把 through 及之前的迁移标记为已应用,不执行任何文件 SQL。
214
+ * 默认要求 schema 与当前库一致,避免把未落地的结构“伪装”成已迁移。
215
+ */
216
+ export async function baselineMigrations(db, dir, opts) {
217
+ return withMigrationLock(db, opts, async (lockDb) => {
218
+ const files = await listMigrationFiles(dir);
219
+ const throughIndex = files.findIndex(f => f.id === opts.through);
220
+ if (throughIndex < 0) {
221
+ throw new Error(`baseline: through 文件不存在: ${opts.through}`);
222
+ }
223
+ const selected = files.slice(0, throughIndex + 1);
224
+ const empty = selected.filter(f => f.content.trim() === '').map(f => f.id);
225
+ if (empty.length > 0) {
226
+ throw new Error(`baseline: 迁移文件 ${empty.join(', ')} 是空文件`);
227
+ }
228
+ await ensureMigrationsTable(lockDb);
229
+ const applied = await appliedMigrations(lockDb);
230
+ const fileIds = new Set(files.map(f => f.id));
231
+ const missing = applied.filter(a => !fileIds.has(a.id)).map(a => a.id);
232
+ if (missing.length > 0) {
233
+ throw new Error(`baseline: 已应用文件缺失: ${missing.join(', ')}`);
234
+ }
235
+ const known = new Map(applied.map(a => [a.id, a.checksum]));
236
+ for (const f of files) {
237
+ const prev = known.get(f.id);
238
+ if (prev !== undefined && prev !== f.checksum) {
239
+ throw new Error(`baseline: 迁移 ${f.id} 已应用但内容被修改(checksum 不符)`);
240
+ }
241
+ }
242
+ const diff = await diffSchema(lockDb, migrationTables(opts.schema), { graph: migrationGraph(opts.schema) });
243
+ const drift = [...diff.destructive, ...diff.statements];
244
+ if (drift.length > 0 && !opts.allowDrift) {
245
+ throw new Error(`baseline: 数据库 schema 与定义不一致;请先运行 migrate/push 或显式 allowDrift\n${drift.join('\n')}`);
246
+ }
247
+ const pending = selected.filter(f => !known.has(f.id));
248
+ const skipped = selected.filter(f => known.has(f.id)).map(f => f.id);
249
+ const appliedIds = [];
250
+ if (pending.length > 0) {
251
+ await lockDb.begin(async (tx) => {
252
+ for (const f of pending) {
253
+ await tx.raw.unsafe(`insert into "${MIGRATIONS_TABLE}" (id, checksum) values ($1, $2)`, [f.id, f.checksum]);
254
+ appliedIds.push(f.id);
255
+ }
256
+ });
257
+ }
258
+ return { applied: appliedIds, skipped };
259
+ });
260
+ }
261
+ /** 已应用 / 待应用 / drift / 被篡改;drift 需要传 tables(否则跳过)。 */
262
+ export async function migrationStatus(db, dir, input) {
263
+ const applied = await appliedMigrations(db);
264
+ const files = await listMigrationFiles(dir);
265
+ const byId = new Map(files.map(f => [f.id, f]));
266
+ const appliedIds = new Set(applied.map(a => a.id));
267
+ const pending = files.filter(f => !appliedIds.has(f.id)).map(f => f.id);
268
+ const missing = applied.filter(a => !byId.has(a.id)).map(a => a.id);
269
+ const empty = files.filter(f => f.content.trim() === '').map(f => f.id);
270
+ const maxApplied = applied.at(-1)?.id;
271
+ const outOfOrder = pending.filter(id => maxApplied !== undefined && id < maxApplied);
272
+ const tampered = applied
273
+ .filter(a => byId.has(a.id) && byId.get(a.id).checksum !== a.checksum)
274
+ .map(a => a.id);
275
+ const diff = input
276
+ ? await diffSchema(db, migrationTables(input), { graph: migrationGraph(input) })
277
+ : undefined;
278
+ const drift = diff ? [...diff.destructive, ...diff.statements] : [];
279
+ return { applied, pending, missing, outOfOrder, empty, drift, tampered };
280
+ }
281
+ //# sourceMappingURL=migrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../src/migrations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import type { ZodOnDelete, SchemaDefinition } from './schema.js';
2
+ /** 图中的一列;key 是 schema 字段名,column 是 SQL 列名。 */
3
+ export interface RelationGraphColumn {
4
+ readonly key: string;
5
+ readonly column: string;
6
+ readonly type: string;
7
+ readonly nullable: boolean;
8
+ readonly primaryKey: boolean;
9
+ readonly unique: boolean;
10
+ }
11
+ /** 图中的一张表。 */
12
+ export interface RelationGraphNode {
13
+ readonly key: string;
14
+ readonly table: string;
15
+ readonly primaryKey: readonly string[];
16
+ readonly columns: readonly RelationGraphColumn[];
17
+ }
18
+ /** M2M 边的中间表信息;table/from/to 都是 schema key。 */
19
+ export interface RelationGraphThrough {
20
+ readonly table: string;
21
+ readonly from: string;
22
+ readonly to: string;
23
+ }
24
+ /** 图中的一条已编译关系边。 */
25
+ export interface RelationGraphEdge {
26
+ readonly from: string;
27
+ readonly name: string;
28
+ readonly to: string;
29
+ readonly kind: 'one' | 'many';
30
+ readonly fromColumn: string;
31
+ readonly toColumn: string;
32
+ readonly foreignKey: boolean;
33
+ readonly onDelete?: ZodOnDelete;
34
+ readonly write: boolean;
35
+ readonly through?: RelationGraphThrough;
36
+ }
37
+ /** 可直接 JSON.stringify 的关系图 IR。 */
38
+ export interface RelationGraph {
39
+ readonly nodes: readonly RelationGraphNode[];
40
+ readonly edges: readonly RelationGraphEdge[];
41
+ }
42
+ /**
43
+ * 把已编译的 `defineSchema()` 结果导出为纯 JSON 关系图。
44
+ *
45
+ * - 自动包含 edge 反向关系和 manyToMany through 边
46
+ * - 不连接数据库,不执行 SQL,不修改 schema
47
+ * - 节点/边使用 schema key;SQL 名在 node.table / column.column
48
+ */
49
+ export declare function relationGraph(schema: SchemaDefinition): RelationGraph;
50
+ //# sourceMappingURL=relation-graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relation-graph.d.ts","sourceRoot":"","sources":["../src/relation-graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAIhE,8CAA8C;AAC9C,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;IAC5B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CACzB;AAED,cAAc;AACd,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAA;IACtC,QAAQ,CAAC,OAAO,EAAE,SAAS,mBAAmB,EAAE,CAAA;CACjD;AAED,+CAA+C;AAC/C,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CACpB;AAED,mBAAmB;AACnB,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,IAAI,EAAE,KAAK,GAAG,MAAM,CAAA;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAA;IAC/B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,oBAAoB,CAAA;CACxC;AAED,kCAAkC;AAClC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,SAAS,iBAAiB,EAAE,CAAA;IAC5C,QAAQ,CAAC,KAAK,EAAE,SAAS,iBAAiB,EAAE,CAAA;CAC7C;AAUD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,aAAa,CA2ErE"}
@@ -0,0 +1,93 @@
1
+ import { resolveRelationColumn } from './relations.js';
2
+ function columnIsPrimary(table, dbKey, pk) {
3
+ return pk || table.__primaryKey.includes(dbKey);
4
+ }
5
+ function columnIsUnique(table, dbKey, unique) {
6
+ return unique || table.__uniques.some(group => group.length === 1 && group[0] === dbKey);
7
+ }
8
+ /**
9
+ * 把已编译的 `defineSchema()` 结果导出为纯 JSON 关系图。
10
+ *
11
+ * - 自动包含 edge 反向关系和 manyToMany through 边
12
+ * - 不连接数据库,不执行 SQL,不修改 schema
13
+ * - 节点/边使用 schema key;SQL 名在 node.table / column.column
14
+ */
15
+ export function relationGraph(schema) {
16
+ const tables = schema.tables;
17
+ const keyOf = new Map();
18
+ for (const [key, table] of Object.entries(tables))
19
+ keyOf.set(table, key);
20
+ const nodes = Object.entries(tables).map(([key, table]) => {
21
+ const primaryKey = table.__plan
22
+ .filter(p => columnIsPrimary(table, p.dbKey, p.pk))
23
+ .map(p => p.outKey);
24
+ return {
25
+ key,
26
+ table: table.name,
27
+ primaryKey,
28
+ columns: table.__plan.map(p => ({
29
+ key: p.outKey,
30
+ column: p.dbKey,
31
+ type: p.sqlType,
32
+ nullable: p.nullable,
33
+ primaryKey: columnIsPrimary(table, p.dbKey, p.pk),
34
+ unique: columnIsUnique(table, p.dbKey, p.unique),
35
+ })),
36
+ };
37
+ });
38
+ const edges = [];
39
+ for (const group of schema.relations) {
40
+ const from = keyOf.get(group.table);
41
+ if (!from)
42
+ throw new Error(`relationGraph: 关系源表 ${group.table.name} 不在 schema.tables 中`);
43
+ for (const [name, def] of Object.entries(group.map)) {
44
+ const to = keyOf.get(def.table);
45
+ if (!to)
46
+ throw new Error(`relationGraph: 关系目标表 ${def.table.name} 不在 schema.tables 中`);
47
+ const fromColumn = resolveRelationColumn(def.from);
48
+ const toColumn = resolveRelationColumn(def.to);
49
+ const sourcePlan = group.table.__plan.find(p => p.outKey === fromColumn.outKey);
50
+ const ref = sourcePlan?.ref;
51
+ let foreignKey = false;
52
+ let onDelete;
53
+ if (ref && !def.through) {
54
+ try {
55
+ const target = ref.thunk();
56
+ const owner = target._owner;
57
+ if (owner?.table === def.table && owner.outKey === toColumn.outKey) {
58
+ foreignKey = true;
59
+ onDelete = ref.onDelete;
60
+ }
61
+ }
62
+ catch {
63
+ // 列的 references thunk 异常时不让只读图导出失败;该边标记为非 FK。
64
+ }
65
+ }
66
+ let through;
67
+ if (def.through) {
68
+ const throughKey = keyOf.get(def.through.table);
69
+ if (!throughKey)
70
+ throw new Error(`relationGraph: through 表 ${def.through.table.name} 不在 schema.tables 中`);
71
+ through = {
72
+ table: throughKey,
73
+ from: resolveRelationColumn(def.through.from).outKey,
74
+ to: resolveRelationColumn(def.through.to).outKey,
75
+ };
76
+ }
77
+ edges.push({
78
+ from,
79
+ name,
80
+ to,
81
+ kind: def._kind,
82
+ fromColumn: fromColumn.outKey,
83
+ toColumn: toColumn.outKey,
84
+ foreignKey,
85
+ ...(onDelete ? { onDelete } : {}),
86
+ write: def._write !== false,
87
+ ...(through ? { through } : {}),
88
+ });
89
+ }
90
+ }
91
+ return { nodes, edges };
92
+ }
93
+ //# sourceMappingURL=relation-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relation-graph.js","sourceRoot":"","sources":["../src/relation-graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,128 @@
1
+ import type { ColumnBuilder, InsertOf, RowOf, Table, UpdateOf } from './table.js';
2
+ import type { OrderBy, WhereFilter } from './filter.js';
3
+ export interface RelationOptions {
4
+ from: ColumnBuilder<any, any, any, any>;
5
+ to: ColumnBuilder<any, any, any, any>;
6
+ }
7
+ export interface ThroughRelation {
8
+ readonly table: Table;
9
+ readonly from: ColumnBuilder<any, any, any, any>;
10
+ readonly to: ColumnBuilder<any, any, any, any>;
11
+ }
12
+ export interface RelationDef<Kind extends 'many' | 'one' = 'many' | 'one', T extends Table = Table> {
13
+ readonly _kind: Kind;
14
+ readonly table: T;
15
+ readonly from: ColumnBuilder<any, any, any, any>;
16
+ readonly to: ColumnBuilder<any, any, any, any>;
17
+ /** many-to-many 的中间表元数据 */
18
+ readonly through?: ThroughRelation;
19
+ /** false 表示只读关系,不支持 nested create/connect */
20
+ readonly _write?: boolean;
21
+ }
22
+ export interface Relations<T extends Table = Table, M extends Record<string, RelationDef> = Record<string, RelationDef>> {
23
+ readonly _tag: 'relations';
24
+ readonly table: T;
25
+ readonly map: M;
26
+ }
27
+ export interface ResolvedColumn {
28
+ table: Table;
29
+ outKey: string;
30
+ dbKey: string;
31
+ }
32
+ export declare function resolveRelationColumn(col: ColumnBuilder<any, any, any, any>): ResolvedColumn;
33
+ export declare function relations<T extends Table, M extends Record<string, RelationDef>>(table: T, map: M): Relations<T, M>;
34
+ type EntryOf<R extends readonly Relations[], T extends Table> = Extract<R[number], {
35
+ table: T;
36
+ }>;
37
+ type UnionToIntersection<U> = (U extends unknown ? (arg: U) => void : never) extends (arg: infer I) => void ? I : never;
38
+ type MapOfEntry<E> = E extends Relations<any, infer M> ? M : never;
39
+ export type RelationMapOf<R extends readonly Relations[], T extends Table> = [
40
+ EntryOf<R, T>
41
+ ] extends [never] ? {} : [UnionToIntersection<MapOfEntry<EntryOf<R, T>>>] extends [never] ? {} : UnionToIntersection<MapOfEntry<EntryOf<R, T>>>;
42
+ type NumericKeys<T extends Table> = {
43
+ [K in keyof RowOf<T>]: RowOf<T>[K] extends number | bigint ? K : never;
44
+ }[keyof RowOf<T>];
45
+ export type RelationAggregateInput<T extends Table> = {
46
+ count?: true;
47
+ sum?: Partial<Record<NumericKeys<T>, true>>;
48
+ max?: Partial<Record<keyof RowOf<T>, true>>;
49
+ };
50
+ type PrevWithDepth<D extends number> = D extends 3 ? 2 : D extends 2 ? 1 : D extends 1 ? 0 : never;
51
+ export interface WithRelationOptions<R extends readonly Relations[], T extends Table, D extends number = 3> {
52
+ where?: WhereFilter<T>;
53
+ orderBy?: OrderBy<T> | readonly OrderBy<T>[];
54
+ limit?: number;
55
+ offset?: number;
56
+ with?: D extends 0 ? never : WithInput<R, T, D>;
57
+ aggregate?: RelationAggregateInput<T>;
58
+ }
59
+ export type WithInput<R extends readonly Relations[], T extends Table, D extends number = 3> = {
60
+ [K in keyof RelationMapOf<R, T>]?: RelationMapOf<R, T>[K] extends RelationDef<'many' | 'one', infer U> ? true | false | WithRelationOptions<R, U, PrevWithDepth<D>> : never;
61
+ };
62
+ type RelationValue<R extends readonly Relations[], U extends Table, V> = V extends {
63
+ with: infer W2;
64
+ } ? WithResult<R, U, W2> : RowOf<U>;
65
+ type AggregateResult<U extends Table, A> = (A extends {
66
+ count: true;
67
+ } ? {
68
+ count: number;
69
+ } : {}) & (A extends {
70
+ sum: infer S;
71
+ } ? {
72
+ sum: {
73
+ [C in keyof S & NumericKeys<U>]: number | null;
74
+ };
75
+ } : {}) & (A extends {
76
+ max: infer M;
77
+ } ? {
78
+ max: {
79
+ [C in keyof M & keyof RowOf<U>]: RowOf<U>[C] | null;
80
+ };
81
+ } : {});
82
+ type AggregateRow<R extends readonly Relations[], T extends Table, W> = {
83
+ [K in keyof W & keyof RelationMapOf<R, T> as W[K] extends {
84
+ aggregate: unknown;
85
+ } ? `${K & string}Aggregate` : never]: RelationMapOf<R, T>[K] extends RelationDef<'many' | 'one', infer U> ? W[K] extends {
86
+ aggregate: infer A;
87
+ } ? AggregateResult<U, A> : never : never;
88
+ };
89
+ export type WithRow<R extends readonly Relations[], T extends Table, W> = {
90
+ [K in keyof W & keyof RelationMapOf<R, T>]: RelationMapOf<R, T>[K] extends RelationDef<'many', infer U> ? RelationValue<R, U, W[K]>[] : RelationMapOf<R, T>[K] extends RelationDef<'one', infer U> ? RelationValue<R, U, W[K]> | null : never;
91
+ } & AggregateRow<R, T, W>;
92
+ export type WithResult<R extends readonly Relations[], T extends Table, W> = RowOf<T> & WithRow<R, T, W>;
93
+ /** M2M 关系只管理 through link,不创建 target 行 */
94
+ export type LinkWrite<U extends Table> = {
95
+ connect?: readonly Partial<RowOf<U>>[];
96
+ disconnect?: readonly Partial<RowOf<U>>[];
97
+ set?: readonly Partial<RowOf<U>>[];
98
+ };
99
+ /** create 只允许 connect;update 可使用完整 LinkWrite */
100
+ export type CreateLinkWrite<U extends Table> = Pick<LinkWrite<U>, 'connect'>;
101
+ /** 嵌套写:many 支持 create/connect;M2M 只支持 connect;one 只支持 connect(目标已存在) */
102
+ export type NestedWrite<R extends readonly Relations[], T extends Table> = {
103
+ [K in keyof RelationMapOf<R, T>]?: RelationMapOf<R, T>[K] extends {
104
+ through: ThroughRelation;
105
+ table: infer U extends Table;
106
+ } ? CreateLinkWrite<U> : RelationMapOf<R, T>[K] extends {
107
+ _write: false;
108
+ } ? never : RelationMapOf<R, T>[K] extends RelationDef<'many', infer U> ? {
109
+ create?: readonly Partial<InsertOf<U>>[];
110
+ connect?: readonly Partial<RowOf<U>>[];
111
+ } : RelationMapOf<R, T>[K] extends RelationDef<'one', infer U> ? {
112
+ connect?: Partial<RowOf<U>>;
113
+ } : never;
114
+ };
115
+ export type CreateInput<R extends readonly Relations[], T extends Table> = InsertOf<T> & NestedWrite<R, T>;
116
+ export type CreateResult<R extends readonly Relations[], T extends Table, C> = RowOf<T> & {
117
+ [K in keyof C & keyof RelationMapOf<R, T>]: RelationMapOf<R, T>[K] extends RelationDef<'many', infer U> ? RowOf<U>[] : RelationMapOf<R, T>[K] extends RelationDef<'one', infer U> ? RowOf<U> | null : never;
118
+ };
119
+ /** update 只扩展 M2M through 关系;普通 relation 仍不支持关系写入 */
120
+ export type UpdateNestedWrite<R extends readonly Relations[], T extends Table> = {
121
+ [K in keyof RelationMapOf<R, T>]?: RelationMapOf<R, T>[K] extends {
122
+ through: ThroughRelation;
123
+ table: infer U extends Table;
124
+ } ? LinkWrite<U> : never;
125
+ };
126
+ export type UpdateInput<R extends readonly Relations[], T extends Table> = UpdateOf<T> & UpdateNestedWrite<R, T>;
127
+ export {};
128
+ //# sourceMappingURL=relations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relations.d.ts","sourceRoot":"","sources":["../src/relations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export function resolveRelationColumn(col) {
2
+ const owner = col._owner;
3
+ if (!owner)
4
+ throw new Error('relations: from/to 必须来自表定义里的列');
5
+ const plan = owner.table.__plan.find(p => p.outKey === owner.outKey);
6
+ if (!plan)
7
+ throw new Error(`relations: 找不到 ${owner.table.name}.${owner.outKey} 的列定义`);
8
+ return { table: owner.table, outKey: owner.outKey, dbKey: plan.dbKey };
9
+ }
10
+ export function relations(table, map) {
11
+ for (const [key, def] of Object.entries(map)) {
12
+ const from = resolveRelationColumn(def.from);
13
+ const to = resolveRelationColumn(def.to);
14
+ if (from.table !== table)
15
+ throw new Error(`relations: ${table.name}.${key} 的 from 必须来自 ${table.name}`);
16
+ if (to.table !== def.table)
17
+ throw new Error(`relations: ${table.name}.${key} 的 to 必须来自 ${def.table.name}`);
18
+ }
19
+ return { _tag: 'relations', table, map };
20
+ }
21
+ //# sourceMappingURL=relations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relations.js","sourceRoot":"","sources":["../src/relations.ts"],"names":[],"mappings":"AAwCA,MAAM,UAAU,qBAAqB,CAAC,GAAsC;IAC1E,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAA;IACxB,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAA;IAC5D,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC,CAAA;IACpE,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,OAAO,CAAC,CAAA;IACrF,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAA;AACxE,CAAC;AAED,MAAM,UAAU,SAAS,CAAyD,KAAQ,EAAE,GAAM;IAChG,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAC5C,MAAM,EAAE,GAAG,qBAAqB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACxC,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,cAAc,KAAK,CAAC,IAAI,IAAI,GAAG,gBAAgB,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;QACtG,IAAI,EAAE,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,cAAc,KAAK,CAAC,IAAI,IAAI,GAAG,cAAc,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;IAC5G,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,CAAA;AAC1C,CAAC"}