@ailnaf/zoddb 0.0.0-stage → 0.1.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.
- package/CHANGELOG.md +41 -0
- package/LICENSE +15 -0
- package/README.md +412 -2
- package/dist/aggregate.d.ts +42 -0
- package/dist/aggregate.d.ts.map +1 -0
- package/dist/aggregate.js +77 -0
- package/dist/aggregate.js.map +1 -0
- package/dist/auth-schema.d.ts +26 -0
- package/dist/auth-schema.d.ts.map +1 -0
- package/dist/auth-schema.js +139 -0
- package/dist/auth-schema.js.map +1 -0
- package/dist/better-auth-adapter.d.ts +21 -0
- package/dist/better-auth-adapter.d.ts.map +1 -0
- package/dist/better-auth-adapter.js +175 -0
- package/dist/better-auth-adapter.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +341 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +22 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +52 -0
- package/dist/config.js.map +1 -0
- package/dist/db.d.ts +183 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +946 -0
- package/dist/db.js.map +1 -0
- package/dist/ddl.d.ts +21 -0
- package/dist/ddl.d.ts.map +1 -0
- package/dist/ddl.js +127 -0
- package/dist/ddl.js.map +1 -0
- package/dist/dev.d.ts +9 -0
- package/dist/dev.d.ts.map +1 -0
- package/dist/dev.js +21 -0
- package/dist/dev.js.map +1 -0
- package/dist/errors.d.ts +63 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +122 -0
- package/dist/errors.js.map +1 -0
- package/dist/filter.d.ts +66 -0
- package/dist/filter.d.ts.map +1 -0
- package/dist/filter.js +219 -0
- package/dist/filter.js.map +1 -0
- package/dist/graph.d.ts +54 -0
- package/dist/graph.d.ts.map +1 -0
- package/dist/graph.js +52 -0
- package/dist/graph.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +12 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +62 -0
- package/dist/init.js.map +1 -0
- package/dist/migrate.d.ts +58 -0
- package/dist/migrate.d.ts.map +1 -0
- package/dist/migrate.js +447 -0
- package/dist/migrate.js.map +1 -0
- package/dist/migrations.d.ts +80 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +281 -0
- package/dist/migrations.js.map +1 -0
- package/dist/relation-graph.d.ts +50 -0
- package/dist/relation-graph.d.ts.map +1 -0
- package/dist/relation-graph.js +93 -0
- package/dist/relation-graph.js.map +1 -0
- package/dist/relations.d.ts +94 -0
- package/dist/relations.d.ts.map +1 -0
- package/dist/relations.js +21 -0
- package/dist/relations.js.map +1 -0
- package/dist/schema.d.ts +247 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +584 -0
- package/dist/schema.js.map +1 -0
- package/dist/studio/page.d.ts +3 -0
- package/dist/studio/page.d.ts.map +1 -0
- package/dist/studio/page.js +708 -0
- package/dist/studio/page.js.map +1 -0
- package/dist/studio/server.d.ts +26 -0
- package/dist/studio/server.d.ts.map +1 -0
- package/dist/studio/server.js +415 -0
- package/dist/studio/server.js.map +1 -0
- package/dist/table.d.ts +156 -0
- package/dist/table.d.ts.map +1 -0
- package/dist/table.js +165 -0
- package/dist/table.js.map +1 -0
- package/dist/where.d.ts +18 -0
- package/dist/where.d.ts.map +1 -0
- package/dist/where.js +76 -0
- package/dist/where.js.map +1 -0
- package/docs/api.md +444 -0
- package/package.json +70 -4
package/dist/cli.js
ADDED
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { watch } from 'node:fs';
|
|
3
|
+
import { spawn } from 'node:child_process';
|
|
4
|
+
import { resolve } from 'node:path';
|
|
5
|
+
import { pathToFileURL } from 'node:url';
|
|
6
|
+
import postgres from 'postgres';
|
|
7
|
+
import { createDb } from './db.js';
|
|
8
|
+
import { loadConfig, loadConfigAt, loadDotEnv } from './config.js';
|
|
9
|
+
import { devCycle } from './dev.js';
|
|
10
|
+
import { initProject } from './init.js';
|
|
11
|
+
import { applyMigrations, baselineMigrations, generateMigration, migrationStatus } from './migrations.js';
|
|
12
|
+
const USAGE = `zoddb <init|generate|migrate|baseline|status|dev|studio> [options]
|
|
13
|
+
|
|
14
|
+
init 生成 zoddb.config.mts / schema.mts / .env.example
|
|
15
|
+
generate 把 schema 与当前库的差异写成迁移文件
|
|
16
|
+
migrate 按文件名顺序应用未执行的迁移
|
|
17
|
+
baseline 把 through 及之前的迁移标记为已应用,不执行文件 SQL
|
|
18
|
+
status 查看已应用/待应用/drift
|
|
19
|
+
dev 生成并应用 additive 迁移;默认监听 schema
|
|
20
|
+
studio 启动只读 schema explorer(127.0.0.1)
|
|
21
|
+
|
|
22
|
+
options:
|
|
23
|
+
--schema <file> schema 模块(导出 tables 或 defineSchema);默认读 zoddb.config.ts/.mts
|
|
24
|
+
--dir <dir> 迁移目录(默认 config.migrations 或 ./migrations)
|
|
25
|
+
--name <name> generate 的文件名后缀(默认 migration)
|
|
26
|
+
--through <file> baseline 的目标迁移文件 id
|
|
27
|
+
--url <url> 数据库 URL(默认 config.url 或 DATABASE_URL)
|
|
28
|
+
--config <file> 指定 config(默认 ./zoddb.config.ts/.mts)
|
|
29
|
+
--once dev 只执行一次(CI/测试)
|
|
30
|
+
--force init 覆盖已存在的 scaffold 文件
|
|
31
|
+
--docker init 额外生成 docker-compose.yml
|
|
32
|
+
--allow-destructive 允许 generate 写入删列/改类型等破坏性语句
|
|
33
|
+
--allow-out-of-order 允许 migrate 应用早于已应用最大 id 的 pending 文件
|
|
34
|
+
--lock-timeout <ms> migrate/baseline 获取迁移锁的等待时间(默认 10000)
|
|
35
|
+
--dry-run migrate 只输出计划,不执行、不写历史
|
|
36
|
+
--json status 只输出 JSON
|
|
37
|
+
--port <port> studio 监听端口(默认 5555;0 为随机端口)
|
|
38
|
+
--write studio 开启写模式(默认只读)
|
|
39
|
+
`;
|
|
40
|
+
const FLAG_KEYS = new Set([
|
|
41
|
+
'schema', 'dir', 'name', 'url', 'config',
|
|
42
|
+
'allow-destructive', 'allow-out-of-order', 'lock-timeout', 'through', 'dry-run', 'json', 'once', 'force', 'docker', 'port', 'write',
|
|
43
|
+
]);
|
|
44
|
+
function parseArgs(argv) {
|
|
45
|
+
const [command = 'help', ...rest] = argv;
|
|
46
|
+
const flags = new Map();
|
|
47
|
+
for (let i = 0; i < rest.length; i++) {
|
|
48
|
+
const arg = rest[i];
|
|
49
|
+
if (!arg.startsWith('--'))
|
|
50
|
+
throw new Error(`未知参数 ${arg}`);
|
|
51
|
+
const eq = arg.indexOf('=');
|
|
52
|
+
const key = eq === -1 ? arg.slice(2) : arg.slice(2, eq);
|
|
53
|
+
if (!FLAG_KEYS.has(key))
|
|
54
|
+
throw new Error(`未知选项 --${key}`);
|
|
55
|
+
if (['allow-destructive', 'allow-out-of-order', 'dry-run', 'json', 'once', 'force', 'docker', 'write'].includes(key)) {
|
|
56
|
+
flags.set(key, true);
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
const value = eq === -1 ? rest[++i] : arg.slice(eq + 1);
|
|
60
|
+
if (value === undefined || value.startsWith('--'))
|
|
61
|
+
throw new Error(`--${key} 缺少值`);
|
|
62
|
+
flags.set(key, value);
|
|
63
|
+
}
|
|
64
|
+
const lockRaw = flags.get('lock-timeout');
|
|
65
|
+
const lockTimeoutMs = lockRaw === undefined ? undefined : Number(lockRaw);
|
|
66
|
+
if (lockTimeoutMs !== undefined && (!Number.isInteger(lockTimeoutMs) || lockTimeoutMs < 0)) {
|
|
67
|
+
throw new Error('--lock-timeout 必须是非负整数毫秒');
|
|
68
|
+
}
|
|
69
|
+
const portRaw = flags.get('port');
|
|
70
|
+
const port = portRaw === undefined ? undefined : Number(portRaw);
|
|
71
|
+
if (port !== undefined && (!Number.isInteger(port) || port < 0 || port > 65535)) {
|
|
72
|
+
throw new Error('--port 必须是 0–65535 的整数');
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
command,
|
|
76
|
+
schema: flags.get('schema'),
|
|
77
|
+
dir: flags.get('dir'),
|
|
78
|
+
name: flags.get('name'),
|
|
79
|
+
url: flags.get('url'),
|
|
80
|
+
config: flags.get('config'),
|
|
81
|
+
allowDestructive: flags.get('allow-destructive') === true,
|
|
82
|
+
allowOutOfOrder: flags.get('allow-out-of-order') === true,
|
|
83
|
+
lockTimeoutMs,
|
|
84
|
+
through: flags.get('through'),
|
|
85
|
+
dryRun: flags.get('dry-run') === true,
|
|
86
|
+
json: flags.get('json') === true,
|
|
87
|
+
once: flags.get('once') === true,
|
|
88
|
+
force: flags.get('force') === true,
|
|
89
|
+
docker: flags.get('docker') === true,
|
|
90
|
+
port,
|
|
91
|
+
write: flags.get('write') === true,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
async function loadSchemaInput(path) {
|
|
95
|
+
const url = `${pathToFileURL(resolve(path)).href}?t=${Date.now()}`;
|
|
96
|
+
const mod = await import(url);
|
|
97
|
+
const exported = mod.schema ?? mod.tables ?? mod.default;
|
|
98
|
+
const isSchema = exported !== null
|
|
99
|
+
&& typeof exported === 'object'
|
|
100
|
+
&& exported._tag === 'schema';
|
|
101
|
+
const tables = isSchema
|
|
102
|
+
? exported.tableList
|
|
103
|
+
: exported;
|
|
104
|
+
if (!Array.isArray(tables) || tables.length === 0) {
|
|
105
|
+
throw new Error('schema 模块必须导出非空 tables 数组,或 defineSchema() 返回的 schema');
|
|
106
|
+
}
|
|
107
|
+
for (const t of tables) {
|
|
108
|
+
if (!t || typeof t !== 'object' || typeof t.name !== 'string') {
|
|
109
|
+
throw new Error('tables 里存在非表定义值');
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return exported;
|
|
113
|
+
}
|
|
114
|
+
async function loadGraphSchema(path) {
|
|
115
|
+
const input = await loadSchemaInput(path);
|
|
116
|
+
if (Array.isArray(input)) {
|
|
117
|
+
throw new Error('studio 需要 schema 模块导出 defineSchema() 返回的 schema,而不是 tables 数组');
|
|
118
|
+
}
|
|
119
|
+
return input;
|
|
120
|
+
}
|
|
121
|
+
function printList(title, items) {
|
|
122
|
+
if (items.length === 0)
|
|
123
|
+
return;
|
|
124
|
+
console.log(`${title}:`);
|
|
125
|
+
for (const item of items)
|
|
126
|
+
console.log(` - ${item}`);
|
|
127
|
+
}
|
|
128
|
+
function statusExit(st) {
|
|
129
|
+
return st.pending.length > 0 || st.missing.length > 0 || st.outOfOrder.length > 0
|
|
130
|
+
|| st.empty.length > 0 || st.tampered.length > 0 || st.drift.length > 0 ? 1 : 0;
|
|
131
|
+
}
|
|
132
|
+
function printStatus(st, json) {
|
|
133
|
+
if (json) {
|
|
134
|
+
console.log(JSON.stringify(st));
|
|
135
|
+
return statusExit(st);
|
|
136
|
+
}
|
|
137
|
+
console.log(`已应用: ${st.applied.length}, 待应用: ${st.pending.length}, 缺失: ${st.missing.length}, ` +
|
|
138
|
+
`乱序: ${st.outOfOrder.length}, 空文件: ${st.empty.length}, 篡改: ${st.tampered.length}, drift: ${st.drift.length}`);
|
|
139
|
+
printList('待应用', st.pending);
|
|
140
|
+
printList('缺失', st.missing);
|
|
141
|
+
printList('乱序', st.outOfOrder);
|
|
142
|
+
printList('空文件', st.empty);
|
|
143
|
+
printList('被篡改', st.tampered);
|
|
144
|
+
printList('drift', st.drift);
|
|
145
|
+
return statusExit(st);
|
|
146
|
+
}
|
|
147
|
+
function loadConfigOrUndefined(path) {
|
|
148
|
+
return path ? loadConfigAt(path) : loadConfig();
|
|
149
|
+
}
|
|
150
|
+
async function runDev(url, dir, schemaPath, once) {
|
|
151
|
+
const runOnce = async () => {
|
|
152
|
+
const input = await loadSchemaInput(schemaPath);
|
|
153
|
+
const res = await devCycle(url, dir, input);
|
|
154
|
+
if (res.generated)
|
|
155
|
+
console.log(`已生成 ${res.generated}`);
|
|
156
|
+
else
|
|
157
|
+
console.log('没有 schema 变化');
|
|
158
|
+
console.log(`已应用: ${res.applied.length}, skipped: ${res.skipped.length}`);
|
|
159
|
+
};
|
|
160
|
+
if (once) {
|
|
161
|
+
await runOnce();
|
|
162
|
+
return 0;
|
|
163
|
+
}
|
|
164
|
+
await runOnce();
|
|
165
|
+
console.log(`正在监听 ${schemaPath};Ctrl+C 退出`);
|
|
166
|
+
// Bun 会忽略 import() 的 query cache-bust;watch 的每次变更用独立进程重载 schema,
|
|
167
|
+
// 避免“文件已改但还是旧 schema”的假阴性。
|
|
168
|
+
const runOnceFresh = () => new Promise((resolveChild, rejectChild) => {
|
|
169
|
+
const entry = process.argv[1] ? resolve(process.argv[1]) : undefined;
|
|
170
|
+
if (!entry) {
|
|
171
|
+
void runOnce().then(() => resolveChild(0), rejectChild);
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
const proc = spawn(process.execPath, [
|
|
175
|
+
entry, 'dev', '--once',
|
|
176
|
+
'--schema', schemaPath,
|
|
177
|
+
'--dir', dir,
|
|
178
|
+
'--url', url,
|
|
179
|
+
], { cwd: process.cwd(), env: process.env, stdio: 'inherit' });
|
|
180
|
+
proc.once('error', rejectChild);
|
|
181
|
+
proc.once('exit', code => resolveChild(code ?? 1));
|
|
182
|
+
});
|
|
183
|
+
let running = false;
|
|
184
|
+
let timer;
|
|
185
|
+
const schedule = () => {
|
|
186
|
+
if (timer)
|
|
187
|
+
clearTimeout(timer);
|
|
188
|
+
timer = setTimeout(() => {
|
|
189
|
+
void (async () => {
|
|
190
|
+
if (running)
|
|
191
|
+
return;
|
|
192
|
+
running = true;
|
|
193
|
+
try {
|
|
194
|
+
const code = await runOnceFresh();
|
|
195
|
+
if (code !== 0)
|
|
196
|
+
console.error(`zoddb: dev cycle 退出码 ${code}`);
|
|
197
|
+
}
|
|
198
|
+
catch (err) {
|
|
199
|
+
console.error(`zoddb: ${err instanceof Error ? err.message : String(err)}`);
|
|
200
|
+
}
|
|
201
|
+
finally {
|
|
202
|
+
running = false;
|
|
203
|
+
}
|
|
204
|
+
})();
|
|
205
|
+
}, 150);
|
|
206
|
+
};
|
|
207
|
+
const watcher = watch(schemaPath, { persistent: true }, schedule);
|
|
208
|
+
watcher.on('error', err => console.error(`zoddb: watch: ${err.message}`));
|
|
209
|
+
await new Promise(resolveStop => {
|
|
210
|
+
const stop = () => {
|
|
211
|
+
watcher.close();
|
|
212
|
+
resolveStop();
|
|
213
|
+
};
|
|
214
|
+
process.once('SIGINT', stop);
|
|
215
|
+
process.once('SIGTERM', stop);
|
|
216
|
+
});
|
|
217
|
+
return 0;
|
|
218
|
+
}
|
|
219
|
+
async function main(argv) {
|
|
220
|
+
const opts = parseArgs(argv);
|
|
221
|
+
if (opts.command === 'help' || opts.command === '--help' || opts.command === '-h') {
|
|
222
|
+
console.log(USAGE);
|
|
223
|
+
return 0;
|
|
224
|
+
}
|
|
225
|
+
if (!['init', 'generate', 'migrate', 'baseline', 'status', 'dev', 'studio'].includes(opts.command)) {
|
|
226
|
+
throw new Error(`未知命令 ${opts.command}\n\n${USAGE}`);
|
|
227
|
+
}
|
|
228
|
+
// 标准的项目 .env;已有环境变量优先,不覆盖。
|
|
229
|
+
loadDotEnv();
|
|
230
|
+
if (opts.command === 'init') {
|
|
231
|
+
const res = initProject({ cwd: process.cwd(), force: opts.force, docker: opts.docker });
|
|
232
|
+
if (res.created.length > 0)
|
|
233
|
+
console.log(`已创建: ${res.created.join(', ')}`);
|
|
234
|
+
if (res.skipped.length > 0)
|
|
235
|
+
console.log(`已存在,跳过: ${res.skipped.join(', ')}`);
|
|
236
|
+
console.log('下一步:');
|
|
237
|
+
console.log(' 1. 将 DATABASE_URL 写入 .env(或 docker compose up -d)');
|
|
238
|
+
console.log(' 2. npx zoddb dev --once');
|
|
239
|
+
return 0;
|
|
240
|
+
}
|
|
241
|
+
const config = await loadConfigOrUndefined(opts.config);
|
|
242
|
+
const schemaPath = opts.schema ? resolve(opts.schema) : config?.schema;
|
|
243
|
+
const dir = opts.dir ? resolve(opts.dir) : (config?.migrations ?? resolve('./migrations'));
|
|
244
|
+
if (opts.command === 'studio') {
|
|
245
|
+
if (!schemaPath)
|
|
246
|
+
throw new Error('studio 需要 --schema,或在 zoddb.config.ts/.mts 配置 schema');
|
|
247
|
+
const cliEntry = process.argv[1];
|
|
248
|
+
if (!cliEntry)
|
|
249
|
+
throw new Error('studio 无法定位 CLI 入口');
|
|
250
|
+
const schema = await loadGraphSchema(schemaPath);
|
|
251
|
+
const studioUrl = opts.url ?? config?.url ?? process.env.DATABASE_URL;
|
|
252
|
+
if (opts.write && !studioUrl) {
|
|
253
|
+
throw new Error('studio --write 需要数据库 URL(--url、config.url 或 DATABASE_URL)');
|
|
254
|
+
}
|
|
255
|
+
const { startStudio } = await import('./studio/server.js');
|
|
256
|
+
const studio = await startStudio({
|
|
257
|
+
schema,
|
|
258
|
+
url: studioUrl,
|
|
259
|
+
write: opts.write,
|
|
260
|
+
port: opts.port,
|
|
261
|
+
schemaPath,
|
|
262
|
+
migrationsDir: dir,
|
|
263
|
+
cli: { command: process.execPath, args: [cliEntry] },
|
|
264
|
+
});
|
|
265
|
+
console.log(`zoddb studio: ${studio.url}`);
|
|
266
|
+
console.log(opts.write ? '写模式;Ctrl+C 退出' : '只读模式;Ctrl+C 退出');
|
|
267
|
+
try {
|
|
268
|
+
await new Promise((resolveStop) => {
|
|
269
|
+
const stop = () => resolveStop();
|
|
270
|
+
process.once('SIGINT', stop);
|
|
271
|
+
process.once('SIGTERM', stop);
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
finally {
|
|
275
|
+
await studio.close();
|
|
276
|
+
}
|
|
277
|
+
return 0;
|
|
278
|
+
}
|
|
279
|
+
const url = opts.url ?? config?.url ?? process.env.DATABASE_URL;
|
|
280
|
+
if (!url)
|
|
281
|
+
throw new Error('缺少数据库 URL(--url、config.url 或 DATABASE_URL)');
|
|
282
|
+
if (opts.command === 'generate' && !schemaPath)
|
|
283
|
+
throw new Error('generate 需要 --schema,或在 zoddb.config.ts/.mts 配置 schema');
|
|
284
|
+
if (opts.command === 'baseline' && !schemaPath)
|
|
285
|
+
throw new Error('baseline 需要 --schema,或在 zoddb.config.ts/.mts 配置 schema');
|
|
286
|
+
if (opts.command === 'baseline' && !opts.through)
|
|
287
|
+
throw new Error('baseline 需要 --through <file>');
|
|
288
|
+
if (opts.command === 'dev' && !schemaPath)
|
|
289
|
+
throw new Error('dev 需要 --schema,或在 zoddb.config.ts/.mts 配置 schema');
|
|
290
|
+
const input = schemaPath ? await loadSchemaInput(schemaPath) : undefined;
|
|
291
|
+
if (opts.command === 'dev')
|
|
292
|
+
return runDev(url, dir, schemaPath, opts.once);
|
|
293
|
+
const raw = postgres(url, { max: 1, onnotice: () => { } });
|
|
294
|
+
const db = createDb(raw);
|
|
295
|
+
try {
|
|
296
|
+
if (opts.command === 'generate') {
|
|
297
|
+
const gen = await generateMigration(db, input, {
|
|
298
|
+
dir,
|
|
299
|
+
name: opts.name,
|
|
300
|
+
allowDestructive: opts.allowDestructive,
|
|
301
|
+
});
|
|
302
|
+
console.log(gen ? `已生成 ${gen.file}` : '没有差异,未生成文件');
|
|
303
|
+
return 0;
|
|
304
|
+
}
|
|
305
|
+
if (opts.command === 'migrate') {
|
|
306
|
+
if (opts.dryRun) {
|
|
307
|
+
const st = await migrationStatus(db, dir, input);
|
|
308
|
+
console.log('dry-run: 未执行、未写历史');
|
|
309
|
+
return printStatus(st, false);
|
|
310
|
+
}
|
|
311
|
+
const res = await applyMigrations(db, dir, {
|
|
312
|
+
lockTimeoutMs: opts.lockTimeoutMs,
|
|
313
|
+
allowOutOfOrder: opts.allowOutOfOrder,
|
|
314
|
+
});
|
|
315
|
+
console.log(`applied: ${res.applied.length}, skipped: ${res.skipped.length}`);
|
|
316
|
+
printList('已应用', res.applied);
|
|
317
|
+
return 0;
|
|
318
|
+
}
|
|
319
|
+
if (opts.command === 'baseline') {
|
|
320
|
+
const res = await baselineMigrations(db, dir, {
|
|
321
|
+
through: opts.through,
|
|
322
|
+
schema: input,
|
|
323
|
+
allowDrift: opts.force,
|
|
324
|
+
lockTimeoutMs: opts.lockTimeoutMs,
|
|
325
|
+
});
|
|
326
|
+
console.log(`baseline applied: ${res.applied.length}, skipped: ${res.skipped.length}`);
|
|
327
|
+
printList('已标记', res.applied);
|
|
328
|
+
return 0;
|
|
329
|
+
}
|
|
330
|
+
const st = await migrationStatus(db, dir, input);
|
|
331
|
+
return printStatus(st, opts.json);
|
|
332
|
+
}
|
|
333
|
+
finally {
|
|
334
|
+
await db.close();
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
main(process.argv.slice(2)).then(code => { process.exitCode = code; }, err => {
|
|
338
|
+
console.error(`zoddb: ${err instanceof Error ? err.message : String(err)}`);
|
|
339
|
+
process.exitCode = 1;
|
|
340
|
+
});
|
|
341
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** zoddb.config.ts 的默认导出;路径相对 config 文件 */
|
|
2
|
+
export interface ZoddbConfigFile {
|
|
3
|
+
schema?: string;
|
|
4
|
+
migrations?: string;
|
|
5
|
+
url?: string;
|
|
6
|
+
/** 从环境变量读取 URL(避免把连接串写进仓库) */
|
|
7
|
+
urlEnv?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface LoadedConfig extends ZoddbConfigFile {
|
|
10
|
+
path: string;
|
|
11
|
+
dir: string;
|
|
12
|
+
schema?: string;
|
|
13
|
+
migrations: string;
|
|
14
|
+
}
|
|
15
|
+
/** 从当前工作目录加载 .env;不覆盖已存在的环境变量。 */
|
|
16
|
+
export declare function loadDotEnv(cwd?: string): void;
|
|
17
|
+
export declare function findConfig(cwd?: string): string | undefined;
|
|
18
|
+
/** 读取指定 config 文件;路径一律解析成绝对路径。 */
|
|
19
|
+
export declare function loadConfigAt(configPath: string): Promise<LoadedConfig>;
|
|
20
|
+
/** 读取 ./zoddb.config.*;不存在返回 undefined。 */
|
|
21
|
+
export declare function loadConfig(cwd?: string): Promise<LoadedConfig | undefined>;
|
|
22
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,2CAA2C;AAC3C,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,YAAa,SAAQ,eAAe;IACnD,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;CACnB;AAID,kCAAkC;AAClC,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAAsB,GAAG,IAAI,CAI5D;AAED,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM,GAAG,SAAS,CAM1E;AAED,kCAAkC;AAClC,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAwB5E;AAED,2CAA2C;AAC3C,wBAAsB,UAAU,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAG/F"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { dirname, resolve } from 'node:path';
|
|
3
|
+
import { pathToFileURL } from 'node:url';
|
|
4
|
+
const CONFIG_NAMES = ['zoddb.config.ts', 'zoddb.config.mts', 'zoddb.config.js', 'zoddb.config.mjs'];
|
|
5
|
+
/** 从当前工作目录加载 .env;不覆盖已存在的环境变量。 */
|
|
6
|
+
export function loadDotEnv(cwd = process.cwd()) {
|
|
7
|
+
const path = resolve(cwd, '.env');
|
|
8
|
+
if (!existsSync(path))
|
|
9
|
+
return;
|
|
10
|
+
process.loadEnvFile(path);
|
|
11
|
+
}
|
|
12
|
+
export function findConfig(cwd = process.cwd()) {
|
|
13
|
+
for (const name of CONFIG_NAMES) {
|
|
14
|
+
const path = resolve(cwd, name);
|
|
15
|
+
if (existsSync(path))
|
|
16
|
+
return path;
|
|
17
|
+
}
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
/** 读取指定 config 文件;路径一律解析成绝对路径。 */
|
|
21
|
+
export async function loadConfigAt(configPath) {
|
|
22
|
+
const path = resolve(configPath);
|
|
23
|
+
let mod;
|
|
24
|
+
try {
|
|
25
|
+
mod = await import(`${pathToFileURL(path).href}?t=${Date.now()}`);
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
throw new Error(`无法加载 ${path}:${err instanceof Error ? err.message : String(err)}`);
|
|
29
|
+
}
|
|
30
|
+
const raw = mod.default ?? mod.config;
|
|
31
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {
|
|
32
|
+
throw new Error(`${path} 必须默认导出一个对象`);
|
|
33
|
+
}
|
|
34
|
+
const cfg = raw;
|
|
35
|
+
const dir = dirname(path);
|
|
36
|
+
const schema = typeof cfg.schema === 'string' ? resolve(dir, cfg.schema) : undefined;
|
|
37
|
+
const migrations = typeof cfg.migrations === 'string'
|
|
38
|
+
? resolve(dir, cfg.migrations)
|
|
39
|
+
: resolve(dir, 'migrations');
|
|
40
|
+
const url = typeof cfg.url === 'string'
|
|
41
|
+
? cfg.url
|
|
42
|
+
: typeof cfg.urlEnv === 'string'
|
|
43
|
+
? process.env[cfg.urlEnv]
|
|
44
|
+
: undefined;
|
|
45
|
+
return { ...cfg, path, dir, schema, migrations, url };
|
|
46
|
+
}
|
|
47
|
+
/** 读取 ./zoddb.config.*;不存在返回 undefined。 */
|
|
48
|
+
export async function loadConfig(cwd = process.cwd()) {
|
|
49
|
+
const path = findConfig(cwd);
|
|
50
|
+
return path ? loadConfigAt(path) : undefined;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/db.d.ts
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import postgres from 'postgres';
|
|
2
|
+
import { type FindManyOptions, type WhereFilter } from './filter.js';
|
|
3
|
+
import { type AggKey, type AggRow, type AggregateOptions } from './aggregate.js';
|
|
4
|
+
import { type CreateResult, type NestedWrite, type RelationDef, type RelationOptions, type Relations, type UpdateInput, type WithInput, type WithResult, type WithRow } from './relations.js';
|
|
5
|
+
import type { FastMapper, InsertOf, RowOf, SqlFragment, Table } from './table.js';
|
|
6
|
+
export type ValidateMode = 'always' | 'never';
|
|
7
|
+
export type IsolationLevel = 'read committed' | 'repeatable read' | 'serializable';
|
|
8
|
+
export interface BeginOptions {
|
|
9
|
+
isolation?: IsolationLevel;
|
|
10
|
+
}
|
|
11
|
+
export interface QueryEvent {
|
|
12
|
+
sql: string;
|
|
13
|
+
params: readonly unknown[];
|
|
14
|
+
durationMs: number;
|
|
15
|
+
operation: string;
|
|
16
|
+
table?: string;
|
|
17
|
+
rows?: number;
|
|
18
|
+
error?: unknown;
|
|
19
|
+
slow: boolean;
|
|
20
|
+
replica?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export interface DbHooks {
|
|
23
|
+
onQuery?: (event: QueryEvent) => void;
|
|
24
|
+
onSlowQuery?: (event: QueryEvent) => void;
|
|
25
|
+
}
|
|
26
|
+
export interface DbRuntimeOptions {
|
|
27
|
+
hooks?: DbHooks;
|
|
28
|
+
slowQueryMs?: number;
|
|
29
|
+
/** 只读副本连接;读 API 走它,写/事务/db.sql 走主库 */
|
|
30
|
+
replica?: postgres.Sql;
|
|
31
|
+
}
|
|
32
|
+
/** 条件:过滤对象(支持操作符)或 sql 片段;写操作空条件会被拒绝(防全表操作) */
|
|
33
|
+
export type WhereInput<T extends Table, R extends readonly Relations[] = []> = SqlFragment | WhereFilter<T, R>;
|
|
34
|
+
export type SelectMap<T extends Table> = {
|
|
35
|
+
[K in keyof RowOf<T>]?: boolean;
|
|
36
|
+
};
|
|
37
|
+
type TrueKeys<S> = {
|
|
38
|
+
[K in keyof S]-?: S[K] extends true ? K : never;
|
|
39
|
+
}[keyof S];
|
|
40
|
+
export type SelectedOf<T extends Table, S> = Pick<RowOf<T>, Extract<TrueKeys<S>, keyof RowOf<T>>>;
|
|
41
|
+
export interface Many<T extends Table = Table> {
|
|
42
|
+
readonly _rel: 'many';
|
|
43
|
+
readonly table: T;
|
|
44
|
+
}
|
|
45
|
+
export interface One<T extends Table = Table> {
|
|
46
|
+
readonly _rel: 'one';
|
|
47
|
+
readonly table: T;
|
|
48
|
+
}
|
|
49
|
+
export declare function many<T extends Table>(table: T): Many<T>;
|
|
50
|
+
export declare function many<T extends Table>(table: T, opts: RelationOptions): RelationDef<'many', T>;
|
|
51
|
+
export declare function one<T extends Table>(table: T): One<T>;
|
|
52
|
+
export declare function one<T extends Table>(table: T, opts: RelationOptions): RelationDef<'one', T>;
|
|
53
|
+
export type IncludeMap = Record<string, Many<Table> | One<Table>>;
|
|
54
|
+
export type IncludeRow<I extends IncludeMap> = {
|
|
55
|
+
[K in keyof I]: I[K] extends Many<infer T> ? RowOf<T>[] : I[K] extends One<infer T> ? RowOf<T> | null : never;
|
|
56
|
+
};
|
|
57
|
+
export type Row = Record<string, any>;
|
|
58
|
+
interface Ctx {
|
|
59
|
+
readonly raw: postgres.Sql;
|
|
60
|
+
readonly validate: ValidateMode;
|
|
61
|
+
readonly shouldValidate: boolean;
|
|
62
|
+
readonly relations: readonly Relations[];
|
|
63
|
+
readonly hooks?: DbHooks;
|
|
64
|
+
readonly slowQueryMs?: number;
|
|
65
|
+
readonly replica?: postgres.Sql;
|
|
66
|
+
readonly onReplica?: boolean;
|
|
67
|
+
}
|
|
68
|
+
export type SelectedKeys<T extends Table, C> = Extract<keyof C, keyof RowOf<T>> & string;
|
|
69
|
+
export interface SelectFragment<T extends Table = Table, R = RowOf<T>> {
|
|
70
|
+
readonly _tag: 'select';
|
|
71
|
+
readonly table: T;
|
|
72
|
+
readonly keys: readonly string[];
|
|
73
|
+
/** postgres.js 片段:可安全插进 sql`...` 模板 */
|
|
74
|
+
readonly __fragment: unknown;
|
|
75
|
+
readonly __mapFast: FastMapper;
|
|
76
|
+
readonly __mapValid: (row: Row, index: number) => Row;
|
|
77
|
+
/** phantom:只用于类型收窄,运行时不读写 */
|
|
78
|
+
readonly $row: R;
|
|
79
|
+
as(alias: string): SelectFragment<T, R>;
|
|
80
|
+
toSQL(): string;
|
|
81
|
+
}
|
|
82
|
+
export declare class Query<R extends postgres.MaybeRow = Row> implements PromiseLike<R[]> {
|
|
83
|
+
#private;
|
|
84
|
+
constructor(ctx: Ctx, factory: () => postgres.PendingQuery<R[]>, sql?: string, params?: readonly unknown[]);
|
|
85
|
+
private pending;
|
|
86
|
+
private run;
|
|
87
|
+
then<TResult1 = R[], TResult2 = never>(onfulfilled?: ((value: R[]) => TResult1 | PromiseLike<TResult1>) | null, onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null): Promise<TResult1 | TResult2>;
|
|
88
|
+
catch<TResult = never>(onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null): Promise<R[] | TResult>;
|
|
89
|
+
finally(onfinally?: (() => void) | null): Promise<R[]>;
|
|
90
|
+
/** 原始行:不映射、不校验(逃生舱) */
|
|
91
|
+
execute(): Promise<R[]>;
|
|
92
|
+
rows<T extends Table>(table: T): Promise<RowOf<T>[]>;
|
|
93
|
+
rows<T extends Table, R>(sel: SelectFragment<T, R>): Promise<R[]>;
|
|
94
|
+
rows<T extends Table, I extends IncludeMap>(table: T, opts: {
|
|
95
|
+
include: I;
|
|
96
|
+
}): Promise<(RowOf<T> & IncludeRow<I>)[]>;
|
|
97
|
+
one<T extends Table>(table: T): Promise<RowOf<T>>;
|
|
98
|
+
one<T extends Table, R>(sel: SelectFragment<T, R>): Promise<R>;
|
|
99
|
+
one<T extends Table, I extends IncludeMap>(table: T, opts: {
|
|
100
|
+
include: I;
|
|
101
|
+
}): Promise<RowOf<T> & IncludeRow<I>>;
|
|
102
|
+
maybeOne<T extends Table>(table: T): Promise<RowOf<T> | null>;
|
|
103
|
+
maybeOne<T extends Table, R>(sel: SelectFragment<T, R>): Promise<R | null>;
|
|
104
|
+
maybeOne<T extends Table, I extends IncludeMap>(table: T, opts: {
|
|
105
|
+
include: I;
|
|
106
|
+
}): Promise<(RowOf<T> & IncludeRow<I>) | null>;
|
|
107
|
+
}
|
|
108
|
+
export interface SqlTag {
|
|
109
|
+
<R extends postgres.MaybeRow = Row>(strings: TemplateStringsArray, ...params: unknown[]): Query<R>;
|
|
110
|
+
}
|
|
111
|
+
export interface Db<R extends readonly Relations[] = readonly Relations[]> {
|
|
112
|
+
readonly sql: SqlTag;
|
|
113
|
+
readonly raw: postgres.Sql;
|
|
114
|
+
select<T extends Table>(table: T): SelectFragment<T, RowOf<T>>;
|
|
115
|
+
select<T extends Table, const C extends Partial<Record<keyof RowOf<T>, true>>>(table: T, columns: C): SelectFragment<T, Pick<RowOf<T>, SelectedKeys<T, C>>>;
|
|
116
|
+
insert<T extends Table>(table: T, values: InsertOf<T>): Promise<RowOf<T>[]>;
|
|
117
|
+
insertMany<T extends Table>(table: T, values: InsertOf<T>[], opts?: {
|
|
118
|
+
chunkSize?: number;
|
|
119
|
+
}): Promise<RowOf<T>[]>;
|
|
120
|
+
create<T extends Table, const C extends NestedWrite<R, T>>(table: T, input: InsertOf<T> & C): Promise<CreateResult<R, T, C>>;
|
|
121
|
+
seed<T extends Table>(table: T, rows: readonly InsertOf<T>[], opts: {
|
|
122
|
+
conflict: readonly (keyof RowOf<T> & string)[];
|
|
123
|
+
update?: readonly (keyof RowOf<T> & string)[];
|
|
124
|
+
}): Promise<RowOf<T>[]>;
|
|
125
|
+
update<T extends Table>(table: T, values: UpdateInput<R, T>, where: WhereInput<T>): Promise<RowOf<T>[]>;
|
|
126
|
+
delete<T extends Table>(table: T, where: WhereInput<T>): Promise<number>;
|
|
127
|
+
upsert<T extends Table>(table: T, values: InsertOf<T>, opts: {
|
|
128
|
+
conflict: readonly (keyof RowOf<T> & string)[];
|
|
129
|
+
update?: readonly (keyof RowOf<T> & string)[];
|
|
130
|
+
}): Promise<RowOf<T>[]>;
|
|
131
|
+
count<T extends Table>(table: T, where?: WhereInput<T>): Promise<number>;
|
|
132
|
+
aggregate<T extends Table, const S extends readonly AggKey<T>[] = [], const A extends readonly AggKey<T>[] = [], const N extends readonly AggKey<T>[] = [], const X extends readonly AggKey<T>[] = []>(table: T, opts: AggregateOptions<T> & {
|
|
133
|
+
sum?: S;
|
|
134
|
+
avg?: A;
|
|
135
|
+
min?: N;
|
|
136
|
+
max?: X;
|
|
137
|
+
}): Promise<AggRow<T, [], S, A, N, X>>;
|
|
138
|
+
groupBy<T extends Table, const G extends readonly AggKey<T>[], const S extends readonly AggKey<T>[] = [], const A extends readonly AggKey<T>[] = [], const N extends readonly AggKey<T>[] = [], const X extends readonly AggKey<T>[] = []>(table: T, opts: AggregateOptions<T> & {
|
|
139
|
+
groupBy: G;
|
|
140
|
+
sum?: S;
|
|
141
|
+
avg?: A;
|
|
142
|
+
min?: N;
|
|
143
|
+
max?: X;
|
|
144
|
+
}): Promise<AggRow<T, G, S, A, N, X>[]>;
|
|
145
|
+
findMany<T extends Table, const S extends SelectMap<T>, const W extends WithInput<R, T>>(table: T, opts: FindManyOptions<T> & {
|
|
146
|
+
select: S;
|
|
147
|
+
with: W;
|
|
148
|
+
}): Promise<(SelectedOf<T, S> & WithRow<R, T, W>)[]>;
|
|
149
|
+
findMany<T extends Table, const S extends SelectMap<T>>(table: T, opts: FindManyOptions<T> & {
|
|
150
|
+
select: S;
|
|
151
|
+
}): Promise<SelectedOf<T, S>[]>;
|
|
152
|
+
findMany<T extends Table, const W extends WithInput<R, T>>(table: T, opts: FindManyOptions<T> & {
|
|
153
|
+
with: W;
|
|
154
|
+
}): Promise<WithResult<R, T, W>[]>;
|
|
155
|
+
findMany<T extends Table>(table: T, opts?: FindManyOptions<T>): Promise<RowOf<T>[]>;
|
|
156
|
+
findOne<T extends Table, const S extends SelectMap<T>, const W extends WithInput<R, T>>(table: T, opts: FindManyOptions<T> & {
|
|
157
|
+
select: S;
|
|
158
|
+
with: W;
|
|
159
|
+
}): Promise<(SelectedOf<T, S> & WithRow<R, T, W>) | null>;
|
|
160
|
+
findOne<T extends Table, const S extends SelectMap<T>>(table: T, opts: FindManyOptions<T> & {
|
|
161
|
+
select: S;
|
|
162
|
+
}): Promise<SelectedOf<T, S> | null>;
|
|
163
|
+
findOne<T extends Table, const W extends WithInput<R, T>>(table: T, opts: FindManyOptions<T> & {
|
|
164
|
+
with: W;
|
|
165
|
+
}): Promise<WithResult<R, T, W> | null>;
|
|
166
|
+
findOne<T extends Table>(table: T, opts?: FindManyOptions<T>): Promise<RowOf<T> | null>;
|
|
167
|
+
begin<X>(fn: (tx: Db<R>) => Promise<X>, opts?: BeginOptions): Promise<X>;
|
|
168
|
+
close(): Promise<void>;
|
|
169
|
+
}
|
|
170
|
+
export declare function createDb<R extends readonly Relations[] = readonly Relations[]>(conn: postgres.Sql, validate?: ValidateMode, relations?: R, opts?: DbRuntimeOptions): Db<R>;
|
|
171
|
+
export interface DbOptions<R extends readonly Relations[] = readonly Relations[]> {
|
|
172
|
+
connection?: postgres.Sql;
|
|
173
|
+
url?: string;
|
|
174
|
+
validate?: ValidateMode;
|
|
175
|
+
relations?: R;
|
|
176
|
+
hooks?: DbHooks;
|
|
177
|
+
slowQueryMs?: number;
|
|
178
|
+
replica?: postgres.Sql;
|
|
179
|
+
replicaUrl?: string;
|
|
180
|
+
}
|
|
181
|
+
export declare function defineDb<const R extends readonly Relations[] = []>(opts: DbOptions<R>): Db<R>;
|
|
182
|
+
export {};
|
|
183
|
+
//# sourceMappingURL=db.d.ts.map
|