flint-orm 0.3.0 → 0.4.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/API.md +151 -316
- package/README.md +237 -134
- package/dist/index.js +288 -255
- package/package.json +42 -11
- package/src/cli.ts +58 -11
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "flint-orm",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"bin": {
|
|
5
5
|
"flint": "./src/cli.ts"
|
|
6
6
|
},
|
|
@@ -10,46 +10,77 @@
|
|
|
10
10
|
"README.md"
|
|
11
11
|
],
|
|
12
12
|
"type": "module",
|
|
13
|
-
"main": "./dist/index.js",
|
|
13
|
+
"main": "./dist/src/index.js",
|
|
14
14
|
"types": "./dist/index.d.ts",
|
|
15
15
|
"exports": {
|
|
16
16
|
".": {
|
|
17
|
-
"import": "./dist/index.js",
|
|
17
|
+
"import": "./dist/src/index.js",
|
|
18
18
|
"types": "./dist/index.d.ts"
|
|
19
19
|
},
|
|
20
|
+
"./bun-sqlite": {
|
|
21
|
+
"import": "./dist/src/entries/bun-sqlite.js",
|
|
22
|
+
"types": "./dist/entries/bun-sqlite.d.ts"
|
|
23
|
+
},
|
|
24
|
+
"./better-sqlite3": {
|
|
25
|
+
"import": "./dist/src/entries/better-sqlite3.js",
|
|
26
|
+
"types": "./dist/entries/better-sqlite3.d.ts"
|
|
27
|
+
},
|
|
28
|
+
"./libsql": {
|
|
29
|
+
"import": "./dist/src/entries/libsql.js",
|
|
30
|
+
"types": "./dist/entries/libsql.d.ts"
|
|
31
|
+
},
|
|
32
|
+
"./libsql-web": {
|
|
33
|
+
"import": "./dist/src/entries/libsql-web.js",
|
|
34
|
+
"types": "./dist/entries/libsql-web.d.ts"
|
|
35
|
+
},
|
|
36
|
+
"./turso-sync": {
|
|
37
|
+
"import": "./dist/src/entries/turso-sync.js",
|
|
38
|
+
"types": "./dist/entries/turso-sync.d.ts"
|
|
39
|
+
},
|
|
40
|
+
"./turso": {
|
|
41
|
+
"import": "./dist/src/entries/turso.js",
|
|
42
|
+
"types": "./dist/entries/turso.d.ts"
|
|
43
|
+
},
|
|
20
44
|
"./table": {
|
|
21
|
-
"import": "./dist/entries/table.js",
|
|
45
|
+
"import": "./dist/src/entries/table.js",
|
|
22
46
|
"types": "./dist/entries/table.d.ts"
|
|
23
47
|
},
|
|
24
48
|
"./expressions": {
|
|
25
|
-
"import": "./dist/entries/expressions.js",
|
|
49
|
+
"import": "./dist/src/entries/expressions.js",
|
|
26
50
|
"types": "./dist/entries/expressions.d.ts"
|
|
27
51
|
},
|
|
28
52
|
"./config": {
|
|
29
|
-
"import": "./dist/entries/config.js",
|
|
53
|
+
"import": "./dist/src/entries/config.js",
|
|
30
54
|
"types": "./dist/entries/config.d.ts"
|
|
31
55
|
},
|
|
32
56
|
"./migration": {
|
|
33
57
|
"import": "./dist/src/migration/index.js",
|
|
34
|
-
"types": "./dist/
|
|
58
|
+
"types": "./dist/migration/index.d.ts"
|
|
35
59
|
}
|
|
36
60
|
},
|
|
37
61
|
"scripts": {
|
|
38
|
-
"build": "bun build ./src/index.ts ./src/entries/table.ts ./src/entries/expressions.ts ./src/entries/config.ts --outdir ./dist --target bun && tsc --project tsconfig.build.json",
|
|
62
|
+
"build": "bun build ./src/index.ts ./src/entries/bun-sqlite.ts ./src/entries/better-sqlite3.ts ./src/entries/libsql.ts ./src/entries/libsql-web.ts ./src/entries/turso-sync.ts ./src/entries/turso.ts ./src/entries/table.ts ./src/entries/expressions.ts ./src/entries/config.ts ./src/migration/index.ts --outdir ./dist --target bun && tsc --project tsconfig.build.json",
|
|
39
63
|
"typecheck": "tsc --noEmit",
|
|
40
|
-
"lint": "oxlint",
|
|
41
|
-
"format": "oxfmt"
|
|
64
|
+
"lint": "oxlint --fix",
|
|
65
|
+
"format": "oxfmt --write",
|
|
66
|
+
"check": "oxlint && oxfmt"
|
|
42
67
|
},
|
|
43
68
|
"dependencies": {
|
|
44
69
|
"@clack/prompts": "1.7.0",
|
|
70
|
+
"@libsql/client": "0.17.4",
|
|
71
|
+
"@tursodatabase/database": "0.6.1",
|
|
72
|
+
"@tursodatabase/sync": "0.6.1",
|
|
73
|
+
"better-sqlite3": "12.11.1",
|
|
45
74
|
"picocolors": "1.1.1"
|
|
46
75
|
},
|
|
47
76
|
"devDependencies": {
|
|
77
|
+
"@types/better-sqlite3": "7.6.13",
|
|
48
78
|
"@types/bun": "1.3.14",
|
|
79
|
+
"@types/node": "26.1.1",
|
|
49
80
|
"oxfmt": "0.57.0",
|
|
50
81
|
"oxlint": "1.72.0"
|
|
51
82
|
},
|
|
52
83
|
"peerDependencies": {
|
|
53
|
-
"typescript": "7.0.
|
|
84
|
+
"typescript": "7.0.2"
|
|
54
85
|
}
|
|
55
86
|
}
|
package/src/cli.ts
CHANGED
|
@@ -9,17 +9,20 @@ import { join, resolve, isAbsolute } from 'node:path';
|
|
|
9
9
|
import { pathToFileURL } from 'node:url';
|
|
10
10
|
import type { AnyTable, TableDef } from './schema/table.js';
|
|
11
11
|
import type { SchemaState } from './migration/types.js';
|
|
12
|
-
import {
|
|
12
|
+
import { outro, log, cancel, isCancel, select, pc, note } from './cli/ui.js';
|
|
13
13
|
import { CancellationError } from './migration/diff.js';
|
|
14
14
|
import type { RenamePrompt } from './migration/diff.js';
|
|
15
|
+
import type { Executor } from './executor.js';
|
|
15
16
|
|
|
16
17
|
// ---------------------------------------------------------------------------
|
|
17
18
|
// Config loading
|
|
18
19
|
// ---------------------------------------------------------------------------
|
|
19
20
|
|
|
20
21
|
interface FlintConfig {
|
|
21
|
-
/**
|
|
22
|
-
|
|
22
|
+
/** Which SQLite driver to use. */
|
|
23
|
+
driver: string;
|
|
24
|
+
/** Database connection details. */
|
|
25
|
+
database: { url: string; authToken?: string };
|
|
23
26
|
/** Path to schema file or directory. */
|
|
24
27
|
schema: string;
|
|
25
28
|
/** Path to migrations directory (default: ./flint). */
|
|
@@ -173,21 +176,65 @@ async function cmdGenerate(args: ReturnType<typeof parseArgs>['values'], config:
|
|
|
173
176
|
}
|
|
174
177
|
|
|
175
178
|
async function cmdMigrate(args: ReturnType<typeof parseArgs>['values'], config: FlintConfig): Promise<void> {
|
|
176
|
-
const { Database } = await import('bun:sqlite');
|
|
177
179
|
const { migrate, getMigrationStatus } = await import('./migration/migrate.js');
|
|
178
180
|
|
|
179
181
|
const migrationsDir = resolve(process.cwd(), config.migrations ?? './flint');
|
|
180
182
|
const dryRun = args['dry-run'] === true;
|
|
181
183
|
const statusOnly = args.status === true;
|
|
182
|
-
const name = typeof args.name === 'string' ? args.name : undefined;
|
|
183
184
|
|
|
184
|
-
//
|
|
185
|
-
const
|
|
186
|
-
const
|
|
185
|
+
// Dynamically create executor based on configured driver
|
|
186
|
+
const isLocalDriver = config.driver === 'bun-sqlite' || config.driver === 'better-sqlite3';
|
|
187
|
+
const dbUrl = isLocalDriver ? resolve(process.cwd(), config.database.url) : config.database.url;
|
|
188
|
+
|
|
189
|
+
let executor: Executor;
|
|
190
|
+
|
|
191
|
+
switch (config.driver) {
|
|
192
|
+
case 'bun-sqlite': {
|
|
193
|
+
const { BunSqliteExecutor } = await import('./drivers/bun-sqlite');
|
|
194
|
+
const { Database } = await import('bun:sqlite');
|
|
195
|
+
executor = new BunSqliteExecutor(new Database(dbUrl));
|
|
196
|
+
break;
|
|
197
|
+
}
|
|
198
|
+
case 'better-sqlite3': {
|
|
199
|
+
const { BetterSqlite3Executor } = await import('./drivers/better-sqlite3');
|
|
200
|
+
const Database = (await import('better-sqlite3')).default;
|
|
201
|
+
executor = new BetterSqlite3Executor(new Database(dbUrl));
|
|
202
|
+
break;
|
|
203
|
+
}
|
|
204
|
+
case 'libsql': {
|
|
205
|
+
const { LibsqlExecutor } = await import('./drivers/libsql');
|
|
206
|
+
const { createClient: createLibsqlClient } = await import('@libsql/client');
|
|
207
|
+
executor = new LibsqlExecutor(createLibsqlClient({ url: dbUrl, authToken: config.database.authToken }));
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
case 'libsql-web': {
|
|
211
|
+
const { LibsqlWebExecutor } = await import('./drivers/libsql-web');
|
|
212
|
+
const { createClient: createLibsqlWebClient } = await import('@libsql/client/web');
|
|
213
|
+
executor = new LibsqlWebExecutor(createLibsqlWebClient({ url: dbUrl, authToken: config.database.authToken }));
|
|
214
|
+
break;
|
|
215
|
+
}
|
|
216
|
+
case 'turso-sync': {
|
|
217
|
+
const { TursoSyncExecutor } = await import('./drivers/turso-sync');
|
|
218
|
+
const { connect } = await import('@tursodatabase/sync');
|
|
219
|
+
const db = await connect({ path: dbUrl, authToken: config.database.authToken });
|
|
220
|
+
executor = new TursoSyncExecutor(db);
|
|
221
|
+
break;
|
|
222
|
+
}
|
|
223
|
+
case 'turso': {
|
|
224
|
+
const { TursoExecutor } = await import('./drivers/turso');
|
|
225
|
+
const { connect } = await import('@tursodatabase/database');
|
|
226
|
+
const db = await connect(dbUrl);
|
|
227
|
+
executor = new TursoExecutor(db);
|
|
228
|
+
break;
|
|
229
|
+
}
|
|
230
|
+
default:
|
|
231
|
+
cancel(`Unsupported driver: ${config.driver}`);
|
|
232
|
+
process.exit(1);
|
|
233
|
+
}
|
|
187
234
|
|
|
188
235
|
try {
|
|
189
236
|
if (statusOnly) {
|
|
190
|
-
const status = getMigrationStatus(
|
|
237
|
+
const status = await getMigrationStatus(executor, migrationsDir);
|
|
191
238
|
|
|
192
239
|
if (status.applied.length === 0 && status.pending.length === 0) {
|
|
193
240
|
outro('No migrations found.');
|
|
@@ -212,7 +259,7 @@ async function cmdMigrate(args: ReturnType<typeof parseArgs>['values'], config:
|
|
|
212
259
|
return;
|
|
213
260
|
}
|
|
214
261
|
|
|
215
|
-
const result = await migrate(
|
|
262
|
+
const result = await migrate(executor, {
|
|
216
263
|
migrationsDir,
|
|
217
264
|
dryRun,
|
|
218
265
|
});
|
|
@@ -230,7 +277,7 @@ async function cmdMigrate(args: ReturnType<typeof parseArgs>['values'], config:
|
|
|
230
277
|
log.info(`Skipped ${result.skipped.length} already applied migration(s)`);
|
|
231
278
|
}
|
|
232
279
|
} finally {
|
|
233
|
-
|
|
280
|
+
executor.close();
|
|
234
281
|
}
|
|
235
282
|
}
|
|
236
283
|
|