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.
Files changed (5) hide show
  1. package/API.md +151 -316
  2. package/README.md +237 -134
  3. package/dist/index.js +288 -255
  4. package/package.json +42 -11
  5. 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.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/src/migration/index.d.ts"
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.1-rc"
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 { intro, outro, log, cancel, isCancel, select, pc, note } from './cli/ui.js';
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
- /** Path to the SQLite database file. */
22
- url: string;
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
- // Open database from config
185
- const dbUrl = resolve(process.cwd(), config.url);
186
- const db = new Database(dbUrl);
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(db, migrationsDir);
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(db, {
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
- db.close();
280
+ executor.close();
234
281
  }
235
282
  }
236
283