d1-kyt 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/README.md ADDED
@@ -0,0 +1,155 @@
1
+ # d1-kyt
2
+
3
+ [![Cloudflare D1](https://img.shields.io/badge/Cloudflare-D1-F38020?logo=cloudflare)](https://developers.cloudflare.com/d1/)
4
+ [![Kysely](https://img.shields.io/badge/Kysely-Query_Builder-blue)](https://kysely.dev/)
5
+ [![npm](https://img.shields.io/npm/v/d1-kyt)](https://www.npmjs.com/package/d1-kyt)
6
+
7
+ Opinionated [Cloudflare D1](https://developers.cloudflare.com/d1/) + [Kysely](https://kysely.dev/) toolkit.
8
+
9
+ Not an ORM, just a wrapper with helpers that relies on Kysely's type inference. No magic, no runtime overhead.
10
+
11
+ **ky**(sely) + **t**(oolkit) = **kyt**
12
+
13
+
14
+ ## Install
15
+
16
+ ```bash
17
+ npm install d1-kyt kysely kysely-codegen
18
+ ```
19
+
20
+ ## CLI
21
+
22
+ ```bash
23
+ d1-kyt init # creates d1-kyt/ and db/index.ts
24
+ d1-kyt migrate:create <name> # creates d1-kyt/migrations/0001_<name>.ts
25
+ d1-kyt migrate:build # compiles d1-kyt/migrations/*.ts → db/migrations/*.sql
26
+ d1-kyt typegen # runs kysely-codegen
27
+ ```
28
+
29
+ Reads `wrangler.jsonc` to detect `migrations_dir` automatically.
30
+
31
+ ### Configuration
32
+
33
+ ```typescript
34
+ // d1-kyt/config.ts
35
+
36
+ import { defineConfig } from 'd1-kyt/config';
37
+
38
+ export default defineConfig({
39
+ migrationsDir: 'db/migrations',
40
+ dbDir: 'db',
41
+ namingStrategy: 'sequential', // or 'timestamp'
42
+ });
43
+ ```
44
+
45
+ ## Usage
46
+
47
+ ### Query Builder
48
+
49
+ ```typescript
50
+ // src/queries.ts
51
+
52
+ import { createQueryBuilder } from 'd1-kyt';
53
+ import type { DB } from './db/generated';
54
+
55
+ const db = createQueryBuilder<DB>();
56
+
57
+ export const getUsers = () => db.selectFrom('User').selectAll().compile();
58
+
59
+ export const getUser = (id: number) =>
60
+ db.selectFrom('User').selectAll().where('id', '=', id).compile();
61
+
62
+ export const insertUser = (email: string, name: string) =>
63
+ db.insertInto('User').values({ email, name }).returning(['id']).compile();
64
+ ```
65
+
66
+ ### Execute Queries
67
+
68
+ ```typescript
69
+ // src/app.ts
70
+
71
+ import Hono from 'hono';
72
+ import { queryAll, queryFirst, queryRun } from 'd1-kyt';
73
+ import * as q from './queries';
74
+
75
+ const app = new Hono();
76
+
77
+ app.get('/users', async (c) => {
78
+ const users = await queryAll(c.env.DB, q.getUsers());
79
+ return c.json(users);
80
+ });
81
+
82
+ app.get('/users/:id', async (c) => {
83
+ const user = await queryFirst(c.env.DB, q.getUser(c.req.param('id')));
84
+ return user ? c.json(user) : c.notFound();
85
+ });
86
+
87
+ app.post('/users', async (c) => {
88
+ const { email, name } = await c.req.json();
89
+ const [user] = await queryAll(c.env.DB, q.insertUser(email, name));
90
+ return c.json(user, 201);
91
+ });
92
+ ```
93
+
94
+ ### Migration DSL
95
+
96
+ ```typescript
97
+ // d1-kyt/migrations/0001_create_user_table.ts
98
+
99
+ import { defineTable, createIndex } from 'd1-kyt/migrate';
100
+
101
+ const User = defineTable('User', (col) => ({
102
+ externalId: col.text().notNull(), // ULID or similar
103
+ email: col.text().notNull(),
104
+ name: col.text(),
105
+ }));
106
+
107
+ export const migration = () => [
108
+ ...User.sql,
109
+ createIndex(User, ['externalId'], { unique: true }),
110
+ createIndex(User, ['email'], { unique: true }),
111
+ ];
112
+ ```
113
+
114
+ ### Later Migrations
115
+
116
+ Import `useTable` from the generated `db/index.ts`:
117
+
118
+ ```typescript
119
+ // d1-kyt/migrations/0042_add_age_to_user_table.ts
120
+
121
+ import { useTable } from '../../db';
122
+ import { addColumn, createIndex } from 'd1-kyt/migrate';
123
+
124
+ const User = useTable('User');
125
+
126
+ export const migration = () => [
127
+ addColumn(User, 'age', (col) => col.integer()),
128
+ createIndex(User, ['age']),
129
+ ];
130
+ ```
131
+
132
+ ## Conventions
133
+
134
+ - Auto `id`, `createdAt`, `updatedAt` on every table
135
+ - Auto trigger for `updatedAt`
136
+
137
+ ## API
138
+
139
+ | Function | Description |
140
+ | --------------------------------- | --------------------------------- |
141
+ | `queryAll(db, query)` | Execute, return all rows |
142
+ | `queryFirst(db, query)` | Execute, return first row or null |
143
+ | `queryRun(db, query)` | Execute mutation |
144
+ | `queryBatch(db, queries)` | Execute batch |
145
+ | `defineTable(name, fn)` | Define new table |
146
+ | `createUseTable<DB>()` | Factory for typed table refs |
147
+ | `useTable<T>(name)` | Reference table (manual typing) |
148
+ | `createIndex(table, cols, opts?)` | Create index |
149
+ | `addColumn(table, col, fn)` | Add column |
150
+ | `dropTable(table)` | Drop table + trigger |
151
+ | `dropIndex(name)` | Drop index |
152
+
153
+ ## License
154
+
155
+ MIT
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,329 @@
1
+ #!/usr/bin/env node
2
+ import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';
3
+ import { join, resolve } from 'node:path';
4
+ import { execSync } from 'node:child_process';
5
+ const VERSION = '0.1.0';
6
+ const HELP = `
7
+ d1-kyt v${VERSION} - Opinionated Cloudflare D1 + Kysely toolkit
8
+
9
+ Usage:
10
+ d1-kyt init [--db-dir <dir>]
11
+ d1-kyt migrate:create <name>
12
+ d1-kyt migrate:build
13
+ d1-kyt typegen
14
+
15
+ Commands:
16
+ init Initialize d1-kyt/ folder and config
17
+ migrate:create Create a new migration .ts file
18
+ migrate:build Compile .ts migrations to .sql
19
+ typegen Generate TypeScript types (wraps kysely-codegen)
20
+
21
+ Options:
22
+ --db-dir <dir> Directory for generated.ts and index.ts (default: db)
23
+ --help, -h Show this help message
24
+ --version, -v Show version
25
+
26
+ Examples:
27
+ d1-kyt init
28
+ d1-kyt init --db-dir src/db
29
+ d1-kyt migrate:create create_users
30
+ d1-kyt migrate:build
31
+ d1-kyt typegen
32
+ `;
33
+ import { generateMigrationPrefix } from './naming.js';
34
+ // ----------------------------------------------------------------------------
35
+ // Config Helpers
36
+ // ----------------------------------------------------------------------------
37
+ const D1_KYT_DIR = 'd1-kyt';
38
+ const CONFIG_FILE = 'config.ts';
39
+ const KYSELY_CONFIG_FILE = 'kysely-codegen.json';
40
+ function getConfigPath() {
41
+ return resolve(process.cwd(), D1_KYT_DIR, CONFIG_FILE);
42
+ }
43
+ function getKyselyConfigPath() {
44
+ return resolve(process.cwd(), D1_KYT_DIR, KYSELY_CONFIG_FILE);
45
+ }
46
+ async function readD1KytConfig() {
47
+ const configPath = getConfigPath();
48
+ if (!existsSync(configPath))
49
+ return null;
50
+ try {
51
+ const module = await import(configPath);
52
+ return module.default ?? module.config;
53
+ }
54
+ catch {
55
+ return null;
56
+ }
57
+ }
58
+ function readWranglerConfig() {
59
+ const wranglerPaths = ['wrangler.jsonc', 'wrangler.json', 'wrangler.toml'];
60
+ for (const filename of wranglerPaths) {
61
+ const filepath = resolve(process.cwd(), filename);
62
+ if (!existsSync(filepath))
63
+ continue;
64
+ if (filename.endsWith('.toml')) {
65
+ const content = readFileSync(filepath, 'utf-8');
66
+ const match = content.match(/migrations_dir\s*=\s*"([^"]+)"/);
67
+ if (match) {
68
+ return { migrationsDir: match[1] };
69
+ }
70
+ }
71
+ else {
72
+ const content = readFileSync(filepath, 'utf-8')
73
+ .replace(/\/\/.*$/gm, '')
74
+ .replace(/\/\*[\s\S]*?\*\//g, '');
75
+ try {
76
+ const config = JSON.parse(content);
77
+ const d1 = config.d1_databases?.[0];
78
+ if (d1?.migrations_dir) {
79
+ return { migrationsDir: d1.migrations_dir };
80
+ }
81
+ }
82
+ catch {
83
+ // Invalid JSON
84
+ }
85
+ }
86
+ }
87
+ return null;
88
+ }
89
+ // ----------------------------------------------------------------------------
90
+ // Commands
91
+ // ----------------------------------------------------------------------------
92
+ function cmdInit(dbDir) {
93
+ const wrangler = readWranglerConfig();
94
+ const migrationsDir = wrangler?.migrationsDir ?? 'db/migrations';
95
+ if (wrangler) {
96
+ console.log(`Detected wrangler migrations_dir: ${migrationsDir}`);
97
+ }
98
+ // Create .d1-kyt directory
99
+ const d1KytDir = resolve(process.cwd(), D1_KYT_DIR);
100
+ if (!existsSync(d1KytDir)) {
101
+ mkdirSync(d1KytDir, { recursive: true });
102
+ console.log(`Created: ${D1_KYT_DIR}/`);
103
+ }
104
+ // Create .d1-kyt/migrations
105
+ const srcMigrationsDir = join(d1KytDir, 'migrations');
106
+ if (!existsSync(srcMigrationsDir)) {
107
+ mkdirSync(srcMigrationsDir, { recursive: true });
108
+ console.log(`Created: ${D1_KYT_DIR}/migrations/`);
109
+ }
110
+ // Create .d1-kyt/config.ts
111
+ const configPath = getConfigPath();
112
+ if (!existsSync(configPath)) {
113
+ const configTemplate = `import { defineConfig } from 'd1-kyt/config';
114
+
115
+ export default defineConfig({
116
+ migrationsDir: '${migrationsDir}',
117
+ dbDir: '${dbDir}',
118
+ namingStrategy: 'sequential',
119
+ });
120
+ `;
121
+ writeFileSync(configPath, configTemplate);
122
+ console.log(`Created: ${D1_KYT_DIR}/${CONFIG_FILE}`);
123
+ }
124
+ else {
125
+ console.log(`Skipped: ${D1_KYT_DIR}/${CONFIG_FILE} (already exists)`);
126
+ }
127
+ // Create .d1-kyt/kysely-codegen.json
128
+ const kyselyConfigPath = getKyselyConfigPath();
129
+ if (!existsSync(kyselyConfigPath)) {
130
+ const kyselyConfig = {
131
+ dialect: 'sqlite',
132
+ excludePattern: '(_cf_|d1_)*',
133
+ outFile: `${dbDir}/generated.ts`,
134
+ camelCase: true,
135
+ };
136
+ writeFileSync(kyselyConfigPath, JSON.stringify(kyselyConfig, null, 2) + '\n');
137
+ console.log(`Created: ${D1_KYT_DIR}/${KYSELY_CONFIG_FILE}`);
138
+ }
139
+ else {
140
+ console.log(`Skipped: ${D1_KYT_DIR}/${KYSELY_CONFIG_FILE} (already exists)`);
141
+ }
142
+ // Create db directory
143
+ const absoluteDbDir = resolve(process.cwd(), dbDir);
144
+ if (!existsSync(absoluteDbDir)) {
145
+ mkdirSync(absoluteDbDir, { recursive: true });
146
+ console.log(`Created: ${dbDir}/`);
147
+ }
148
+ // Create db/index.ts with useTable helper
149
+ const indexPath = join(absoluteDbDir, 'index.ts');
150
+ if (!existsSync(indexPath)) {
151
+ const template = `import type { DB } from './generated';
152
+ import { createUseTable } from 'd1-kyt/migrate';
153
+
154
+ export const useTable = createUseTable<DB>();
155
+ `;
156
+ writeFileSync(indexPath, template);
157
+ console.log(`Created: ${dbDir}/index.ts`);
158
+ }
159
+ else {
160
+ console.log(`Skipped: ${dbDir}/index.ts (already exists)`);
161
+ }
162
+ console.log(`\nNext steps:`);
163
+ console.log(` 1. Create migration: d1-kyt migrate:create <name>`);
164
+ console.log(` 2. Build migrations: d1-kyt migrate:build`);
165
+ console.log(` 3. Apply migrations: wrangler d1 migrations apply <db> --local`);
166
+ console.log(` 4. Generate types: d1-kyt typegen`);
167
+ }
168
+ async function cmdMigrateCreate(name) {
169
+ const config = await readD1KytConfig();
170
+ if (!config) {
171
+ console.error('Error: d1-kyt not initialized. Run "d1-kyt init" first.');
172
+ process.exit(1);
173
+ }
174
+ const srcDir = resolve(process.cwd(), D1_KYT_DIR, 'migrations');
175
+ const outDir = resolve(process.cwd(), config.migrationsDir);
176
+ const strategy = config.namingStrategy ?? 'sequential';
177
+ // Collect existing files for sequential numbering
178
+ const existingSql = existsSync(outDir) ? readdirSync(outDir) : [];
179
+ const existingTs = existsSync(srcDir) ? readdirSync(srcDir) : [];
180
+ const existingFiles = [...existingSql, ...existingTs];
181
+ const prefix = generateMigrationPrefix(strategy, existingFiles);
182
+ const snakeName = name
183
+ .replace(/([a-z])([A-Z])/g, '$1_$2')
184
+ .replace(/[\s-]+/g, '_')
185
+ .toLowerCase();
186
+ const filename = `${prefix}_${snakeName}.ts`;
187
+ const filepath = join(srcDir, filename);
188
+ const template = `import { defineTable, createIndex } from 'd1-kyt/migrate';
189
+
190
+ // Migration: ${snakeName}
191
+ // Created: ${new Date().toISOString().split('T')[0]}
192
+
193
+ export const migration = () => {
194
+ // Example:
195
+ // const User = defineTable('User', (col) => ({
196
+ // email: col.text().notNull(),
197
+ // name: col.text(),
198
+ // }));
199
+ //
200
+ // return [
201
+ // ...User.sql,
202
+ // createIndex(User, ['email'], { unique: true }),
203
+ // ];
204
+
205
+ return [];
206
+ };
207
+ `;
208
+ writeFileSync(filepath, template);
209
+ console.log(`Created: ${D1_KYT_DIR}/migrations/${filename}`);
210
+ console.log(`\nEdit the file, then run: d1-kyt migrate:build`);
211
+ }
212
+ async function cmdMigrateBuild() {
213
+ const config = await readD1KytConfig();
214
+ if (!config) {
215
+ console.error('Error: d1-kyt not initialized. Run "d1-kyt init" first.');
216
+ process.exit(1);
217
+ }
218
+ const srcDir = resolve(process.cwd(), D1_KYT_DIR, 'migrations');
219
+ const outDir = resolve(process.cwd(), config.migrationsDir);
220
+ if (!existsSync(outDir)) {
221
+ mkdirSync(outDir, { recursive: true });
222
+ }
223
+ // Match sequential (3-4 digit) and timestamp (14 digit) patterns
224
+ const tsFiles = readdirSync(srcDir)
225
+ .filter((f) => /^\d{3,14}_.*\.ts$/.test(f))
226
+ .sort();
227
+ if (tsFiles.length === 0) {
228
+ console.log('No migration files to build.');
229
+ return;
230
+ }
231
+ let built = 0;
232
+ for (const tsFile of tsFiles) {
233
+ const sqlFile = tsFile.replace(/\.ts$/, '.sql');
234
+ const sqlPath = join(outDir, sqlFile);
235
+ // Skip if .sql already exists
236
+ if (existsSync(sqlPath)) {
237
+ continue;
238
+ }
239
+ const tsPath = join(srcDir, tsFile);
240
+ try {
241
+ // Dynamic import the migration file
242
+ const module = await import(tsPath);
243
+ const statements = module.migration();
244
+ if (statements.length === 0) {
245
+ console.log(`Skipped: ${tsFile} (empty migration)`);
246
+ continue;
247
+ }
248
+ const sql = `-- Generated by d1-kyt from ${tsFile}\n-- ${new Date().toISOString()}\n\n${statements.join('\n\n')}\n`;
249
+ writeFileSync(sqlPath, sql);
250
+ console.log(`Built: ${config.migrationsDir}/${sqlFile}`);
251
+ built++;
252
+ }
253
+ catch (err) {
254
+ console.error(`Error building ${tsFile}:`, err);
255
+ process.exit(1);
256
+ }
257
+ }
258
+ if (built === 0) {
259
+ console.log('All migrations already built.');
260
+ }
261
+ else {
262
+ console.log(`\nBuilt ${built} migration(s). Run: wrangler d1 migrations apply <db> --local`);
263
+ }
264
+ }
265
+ function cmdTypegen() {
266
+ const kyselyConfigPath = getKyselyConfigPath();
267
+ if (!existsSync(kyselyConfigPath)) {
268
+ console.error('Error: d1-kyt not initialized. Run "d1-kyt init" first.');
269
+ process.exit(1);
270
+ }
271
+ console.log('Running kysely-codegen...');
272
+ try {
273
+ execSync(`npx kysely-codegen --config-file "${kyselyConfigPath}"`, {
274
+ stdio: 'inherit',
275
+ cwd: process.cwd(),
276
+ });
277
+ }
278
+ catch {
279
+ process.exit(1);
280
+ }
281
+ }
282
+ // ----------------------------------------------------------------------------
283
+ // Main
284
+ // ----------------------------------------------------------------------------
285
+ async function main() {
286
+ const args = process.argv.slice(2);
287
+ const command = args[0];
288
+ if (!command || command === '--help' || command === '-h') {
289
+ console.log(HELP);
290
+ process.exit(0);
291
+ }
292
+ if (command === '--version' || command === '-v') {
293
+ console.log(VERSION);
294
+ process.exit(0);
295
+ }
296
+ switch (command) {
297
+ case 'init': {
298
+ let dbDir = 'db';
299
+ const dbDirIdx = args.indexOf('--db-dir');
300
+ if (dbDirIdx !== -1 && args[dbDirIdx + 1]) {
301
+ dbDir = args[dbDirIdx + 1];
302
+ }
303
+ cmdInit(dbDir);
304
+ break;
305
+ }
306
+ case 'migrate:create': {
307
+ const name = args[1];
308
+ if (!name) {
309
+ console.error('Error: Migration name required');
310
+ console.error('Usage: d1-kyt migrate:create <name>');
311
+ process.exit(1);
312
+ }
313
+ await cmdMigrateCreate(name);
314
+ break;
315
+ }
316
+ case 'migrate:build':
317
+ await cmdMigrateBuild();
318
+ break;
319
+ case 'typegen':
320
+ cmdTypegen();
321
+ break;
322
+ default:
323
+ console.error(`Unknown command: ${command}`);
324
+ console.log(HELP);
325
+ process.exit(1);
326
+ }
327
+ }
328
+ main();
329
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export type NamingStrategy = 'sequential' | 'timestamp';
2
+ export interface D1KytConfig {
3
+ migrationsDir: string;
4
+ dbDir: string;
5
+ namingStrategy: NamingStrategy;
6
+ }
7
+ export declare function defineConfig(config: D1KytConfig): D1KytConfig;
8
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,cAAc,GAAG,YAAY,GAAG,WAAW,CAAC;AAExD,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,cAAc,CAAC;CAChC;AAMD,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAE7D"}
package/dist/config.js ADDED
@@ -0,0 +1,10 @@
1
+ // ----------------------------------------------------------------------------
2
+ // Config Types
3
+ // ----------------------------------------------------------------------------
4
+ // ----------------------------------------------------------------------------
5
+ // defineConfig
6
+ // ----------------------------------------------------------------------------
7
+ export function defineConfig(config) {
8
+ return config;
9
+ }
10
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,eAAe;AACf,+EAA+E;AAU/E,+EAA+E;AAC/E,eAAe;AACf,+EAA+E;AAE/E,MAAM,UAAU,YAAY,CAAC,MAAmB;IAC9C,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,83 @@
1
+ import type { CompiledQuery } from 'kysely';
2
+ /**
3
+ * D1 query result with metadata
4
+ */
5
+ export interface D1RunResult {
6
+ success: boolean;
7
+ meta: {
8
+ duration: number;
9
+ rows_read: number;
10
+ rows_written: number;
11
+ last_row_id: number;
12
+ changed_db: boolean;
13
+ changes: number;
14
+ };
15
+ }
16
+ /**
17
+ * D1Database interface (subset of Cloudflare's D1Database)
18
+ * Compatible with wrangler-generated types
19
+ */
20
+ export interface D1Database {
21
+ prepare(sql: string): D1PreparedStatement;
22
+ batch<T = unknown>(statements: D1PreparedStatement[]): Promise<D1Result<T>[]>;
23
+ }
24
+ interface D1PreparedStatement {
25
+ bind(...values: unknown[]): D1PreparedStatement;
26
+ all<T = unknown>(): Promise<D1Result<T>>;
27
+ first<T = unknown>(): Promise<T | null>;
28
+ run(): Promise<D1Result<unknown>>;
29
+ }
30
+ interface D1Result<T = unknown> {
31
+ results?: T[];
32
+ success: boolean;
33
+ meta: {
34
+ duration: number;
35
+ rows_read: number;
36
+ rows_written: number;
37
+ last_row_id: number;
38
+ changed_db: boolean;
39
+ changes: number;
40
+ };
41
+ }
42
+ /**
43
+ * Execute query and return all rows
44
+ *
45
+ * @example
46
+ * ```ts
47
+ * const users = await queryAll(env.DB, queries.listUsers());
48
+ * ```
49
+ */
50
+ export declare function queryAll<T>(db: D1Database, query: CompiledQuery<T>): Promise<T[]>;
51
+ /**
52
+ * Execute query and return first row or null
53
+ *
54
+ * @example
55
+ * ```ts
56
+ * const user = await queryFirst(env.DB, queries.getUserById({ id: 1 }));
57
+ * ```
58
+ */
59
+ export declare function queryFirst<T>(db: D1Database, query: CompiledQuery<T>): Promise<T | null>;
60
+ /**
61
+ * Execute query without returning rows (INSERT/UPDATE/DELETE)
62
+ *
63
+ * @example
64
+ * ```ts
65
+ * const result = await queryRun(env.DB, queries.deleteUser({ id: 1 }));
66
+ * console.log(result.meta.changes);
67
+ * ```
68
+ */
69
+ export declare function queryRun(db: D1Database, query: CompiledQuery<unknown>): Promise<D1RunResult>;
70
+ /**
71
+ * Execute multiple queries in a batch (transaction-like)
72
+ *
73
+ * @example
74
+ * ```ts
75
+ * const results = await queryBatch(env.DB, [
76
+ * queries.createUser({ name: 'A' }),
77
+ * queries.createUser({ name: 'B' }),
78
+ * ]);
79
+ * ```
80
+ */
81
+ export declare function queryBatch(db: D1Database, queries: readonly CompiledQuery<unknown>[]): Promise<D1RunResult[]>;
82
+ export {};
83
+ //# sourceMappingURL=executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE;QACJ,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,OAAO,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,CAAC;IAC1C,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;CAC/E;AAED,UAAU,mBAAmB;IAC3B,IAAI,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,mBAAmB,CAAC;IAChD,GAAG,CAAC,CAAC,GAAG,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,KAAK,CAAC,CAAC,GAAG,OAAO,KAAK,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACxC,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;CACnC;AAED,UAAU,QAAQ,CAAC,CAAC,GAAG,OAAO;IAC5B,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE;QACJ,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,OAAO,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED;;;;;;;GAOG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAC9B,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,GACtB,OAAO,CAAC,CAAC,EAAE,CAAC,CAMd;AAED;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAAC,CAAC,EAChC,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,GACtB,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAMnB;AAED;;;;;;;;GAQG;AACH,wBAAsB,QAAQ,CAC5B,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,GAC5B,OAAO,CAAC,WAAW,CAAC,CAStB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,UAAU,CAC9B,EAAE,EAAE,UAAU,EACd,OAAO,EAAE,SAAS,aAAa,CAAC,OAAO,CAAC,EAAE,GACzC,OAAO,CAAC,WAAW,EAAE,CAAC,CASxB"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Execute query and return all rows
3
+ *
4
+ * @example
5
+ * ```ts
6
+ * const users = await queryAll(env.DB, queries.listUsers());
7
+ * ```
8
+ */
9
+ export async function queryAll(db, query) {
10
+ const result = await db
11
+ .prepare(query.sql)
12
+ .bind(...query.parameters)
13
+ .all();
14
+ return result.results ?? [];
15
+ }
16
+ /**
17
+ * Execute query and return first row or null
18
+ *
19
+ * @example
20
+ * ```ts
21
+ * const user = await queryFirst(env.DB, queries.getUserById({ id: 1 }));
22
+ * ```
23
+ */
24
+ export async function queryFirst(db, query) {
25
+ const result = await db
26
+ .prepare(query.sql)
27
+ .bind(...query.parameters)
28
+ .first();
29
+ return result ?? null;
30
+ }
31
+ /**
32
+ * Execute query without returning rows (INSERT/UPDATE/DELETE)
33
+ *
34
+ * @example
35
+ * ```ts
36
+ * const result = await queryRun(env.DB, queries.deleteUser({ id: 1 }));
37
+ * console.log(result.meta.changes);
38
+ * ```
39
+ */
40
+ export async function queryRun(db, query) {
41
+ const result = await db
42
+ .prepare(query.sql)
43
+ .bind(...query.parameters)
44
+ .run();
45
+ return {
46
+ success: result.success,
47
+ meta: result.meta,
48
+ };
49
+ }
50
+ /**
51
+ * Execute multiple queries in a batch (transaction-like)
52
+ *
53
+ * @example
54
+ * ```ts
55
+ * const results = await queryBatch(env.DB, [
56
+ * queries.createUser({ name: 'A' }),
57
+ * queries.createUser({ name: 'B' }),
58
+ * ]);
59
+ * ```
60
+ */
61
+ export async function queryBatch(db, queries) {
62
+ const statements = queries.map((q) => db.prepare(q.sql).bind(...q.parameters));
63
+ const results = await db.batch(statements);
64
+ return results.map((r) => ({
65
+ success: r.success,
66
+ meta: r.meta,
67
+ }));
68
+ }
69
+ //# sourceMappingURL=executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"AA8CA;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,EAAc,EACd,KAAuB;IAEvB,MAAM,MAAM,GAAG,MAAM,EAAE;SACpB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;SAClB,IAAI,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC;SACzB,GAAG,EAAK,CAAC;IACZ,OAAO,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;AAC9B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,EAAc,EACd,KAAuB;IAEvB,MAAM,MAAM,GAAG,MAAM,EAAE;SACpB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;SAClB,IAAI,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC;SACzB,KAAK,EAAK,CAAC;IACd,OAAO,MAAM,IAAI,IAAI,CAAC;AACxB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,EAAc,EACd,KAA6B;IAE7B,MAAM,MAAM,GAAG,MAAM,EAAE;SACpB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;SAClB,IAAI,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC;SACzB,GAAG,EAAE,CAAC;IACT,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,IAAI,EAAE,MAAM,CAAC,IAAI;KAClB,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,EAAc,EACd,OAA0C;IAE1C,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACnC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CACxC,CAAC;IACF,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC3C,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACzB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,IAAI,EAAE,CAAC,CAAC,IAAI;KACb,CAAC,CAAC,CAAC;AACN,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { createQueryBuilder } from './query-builder.js';
2
+ export { queryAll, queryFirst, queryRun, queryBatch } from './executor.js';
3
+ export type { D1Database, D1RunResult } from './executor.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3E,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { createQueryBuilder } from './query-builder.js';
2
+ export { queryAll, queryFirst, queryRun, queryBatch } from './executor.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Migration DSL for D1/SQLite
3
+ * Constrained API - uses limited operations for predictable output
4
+ */
5
+ type SqliteType = 'TEXT' | 'INTEGER' | 'REAL' | 'BLOB';
6
+ interface ColumnDefInternal {
7
+ type: SqliteType;
8
+ isNotNull: boolean;
9
+ defaultValue: string | null;
10
+ }
11
+ /**
12
+ * Column definition - chainable but limited.
13
+ * Only notNull() and default() are available.
14
+ * No unique(), references(), check() - by design.
15
+ */
16
+ export interface ColumnDef {
17
+ notNull(): ColumnDef;
18
+ default(value: string): ColumnDef;
19
+ /** @internal */
20
+ _def: ColumnDefInternal;
21
+ }
22
+ /**
23
+ * Column builder - creates column definitions.
24
+ * Only SQLite types: text, integer, real, blob.
25
+ */
26
+ export interface ColumnBuilder {
27
+ text(): ColumnDef;
28
+ integer(): ColumnDef;
29
+ real(): ColumnDef;
30
+ blob(): ColumnDef;
31
+ }
32
+ /**
33
+ * Auto-generated columns added to every table.
34
+ */
35
+ interface AutoColumns {
36
+ id: unknown;
37
+ createdAt: unknown;
38
+ updatedAt: unknown;
39
+ }
40
+ /**
41
+ * Table reference - carries type information for column names.
42
+ */
43
+ export interface Table<T> {
44
+ readonly _name: string;
45
+ readonly _phantom?: T;
46
+ }
47
+ /**
48
+ * Table with SQL statements (from defineTable).
49
+ */
50
+ export interface DefinedTable<T> extends Table<T> {
51
+ readonly sql: string[];
52
+ }
53
+ type TableDefFn<T extends Record<string, ColumnDef>> = (col: ColumnBuilder) => T;
54
+ /**
55
+ * Define a table with auto-generated id, createdAt, updatedAt columns.
56
+ * Returns a Table object with sql property containing CREATE TABLE + CREATE TRIGGER.
57
+ */
58
+ export declare function defineTable<T extends Record<string, ColumnDef>>(name: string, fn: TableDefFn<T>): DefinedTable<{
59
+ [K in keyof T]: unknown;
60
+ } & AutoColumns>;
61
+ /**
62
+ * Reference an existing table for type-safe operations.
63
+ * Use with kysely-codegen types: useTable<DB['Place']>('Place')
64
+ */
65
+ export declare function useTable<T>(name: string): Table<T>;
66
+ /**
67
+ * Create a typed useTable function for your database schema.
68
+ * Setup once, use everywhere with full type inference.
69
+ *
70
+ * @example
71
+ * ```typescript
72
+ * // db/index.ts - create once
73
+ * import type { DB } from './generated';
74
+ * import { createUseTable } from 'd1-kyt/migrate';
75
+ *
76
+ * export const useTable = createUseTable<DB>();
77
+ *
78
+ * // migrations - use with inference
79
+ * const Place = useTable('Place'); // Table<DB['Place']>
80
+ * const City = useTable('City'); // Table<DB['City']>
81
+ * ```
82
+ */
83
+ export declare function createUseTable<DB>(): <K extends keyof DB & string>(name: K) => Table<DB[K]>;
84
+ interface IndexOptions {
85
+ unique?: boolean;
86
+ name?: string;
87
+ }
88
+ /**
89
+ * Create an index on a table.
90
+ * Use { unique: true } for unique constraint.
91
+ * Use { name: 'custom_name' } to override auto-generated name.
92
+ */
93
+ export declare function createIndex<T>(table: Table<T>, columns: (keyof T & string)[], options?: IndexOptions): string;
94
+ /**
95
+ * Drop an index by name.
96
+ */
97
+ export declare function dropIndex(name: string): string;
98
+ /**
99
+ * Add a column to an existing table.
100
+ * Column name is type-checked against table columns.
101
+ */
102
+ export declare function addColumn<T, K extends string>(table: Table<T>, column: K, fn: (col: ColumnBuilder) => ColumnDef): string;
103
+ /**
104
+ * Drop a table and its updatedAt trigger.
105
+ */
106
+ export declare function dropTable<T>(table: Table<T>): string[];
107
+ export {};
108
+ //# sourceMappingURL=migrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,KAAK,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;AAEvD,UAAU,iBAAiB;IACzB,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,OAAO,IAAI,SAAS,CAAC;IACrB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,gBAAgB;IAChB,IAAI,EAAE,iBAAiB,CAAC;CACzB;AAwBD;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,IAAI,SAAS,CAAC;IAClB,OAAO,IAAI,SAAS,CAAC;IACrB,IAAI,IAAI,SAAS,CAAC;IAClB,IAAI,IAAI,SAAS,CAAC;CACnB;AAaD;;GAEG;AACH,UAAU,WAAW;IACnB,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,KAAK,CAAC,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC,CAAE,SAAQ,KAAK,CAAC,CAAC,CAAC;IAC/C,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC;CACxB;AAMD,KAAK,UAAU,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,KAAK,CAAC,CAAC;AAEjF;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EAC7D,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,GAChB,YAAY,CAAC;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,OAAO;CAAE,GAAG,WAAW,CAAC,CAoCzD;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAElD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,CAAC,EAAE,MACd,CAAC,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,MAAM,CAAC,KAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAGrE;AAMD,UAAU,YAAY;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAC3B,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EACf,OAAO,EAAE,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,EAC7B,OAAO,CAAC,EAAE,YAAY,GACrB,MAAM,CASR;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAMD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,EAC3C,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EACf,MAAM,EAAE,CAAC,EACT,EAAE,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,SAAS,GACpC,MAAM,CAUR;AAMD;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAMtD"}
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Migration DSL for D1/SQLite
3
+ * Constrained API - uses limited operations for predictable output
4
+ */
5
+ function createColumnDef(type) {
6
+ const def = {
7
+ type,
8
+ isNotNull: false,
9
+ defaultValue: null,
10
+ };
11
+ const columnDef = {
12
+ _def: def,
13
+ notNull() {
14
+ def.isNotNull = true;
15
+ return columnDef;
16
+ },
17
+ default(value) {
18
+ def.defaultValue = value;
19
+ return columnDef;
20
+ },
21
+ };
22
+ return columnDef;
23
+ }
24
+ const columnBuilder = {
25
+ text: () => createColumnDef('TEXT'),
26
+ integer: () => createColumnDef('INTEGER'),
27
+ real: () => createColumnDef('REAL'),
28
+ blob: () => createColumnDef('BLOB'),
29
+ };
30
+ /**
31
+ * Define a table with auto-generated id, createdAt, updatedAt columns.
32
+ * Returns a Table object with sql property containing CREATE TABLE + CREATE TRIGGER.
33
+ */
34
+ export function defineTable(name, fn) {
35
+ const columns = fn(columnBuilder);
36
+ const columnDefs = [];
37
+ // Auto id column
38
+ columnDefs.push(` "id" INTEGER PRIMARY KEY AUTOINCREMENT`);
39
+ // User-defined columns
40
+ for (const [colName, colDef] of Object.entries(columns)) {
41
+ let sql = ` "${colName}" ${colDef._def.type}`;
42
+ if (colDef._def.isNotNull) {
43
+ sql += ' NOT NULL';
44
+ }
45
+ if (colDef._def.defaultValue !== null) {
46
+ sql += ` DEFAULT ${colDef._def.defaultValue}`;
47
+ }
48
+ columnDefs.push(sql);
49
+ }
50
+ // Auto timestamp columns
51
+ columnDefs.push(` "createdAt" TEXT NOT NULL DEFAULT (datetime('now'))`);
52
+ columnDefs.push(` "updatedAt" TEXT NOT NULL DEFAULT (datetime('now'))`);
53
+ const createTableSql = `CREATE TABLE "${name}" (\n${columnDefs.join(',\n')}\n);`;
54
+ const createTriggerSql = `CREATE TRIGGER "${name}_updatedAt"
55
+ AFTER UPDATE ON "${name}"
56
+ FOR EACH ROW
57
+ BEGIN
58
+ UPDATE "${name}" SET "updatedAt" = datetime('now') WHERE "id" = NEW."id";
59
+ END;`;
60
+ return {
61
+ _name: name,
62
+ sql: [createTableSql, createTriggerSql],
63
+ };
64
+ }
65
+ /**
66
+ * Reference an existing table for type-safe operations.
67
+ * Use with kysely-codegen types: useTable<DB['Place']>('Place')
68
+ */
69
+ export function useTable(name) {
70
+ return { _name: name };
71
+ }
72
+ /**
73
+ * Create a typed useTable function for your database schema.
74
+ * Setup once, use everywhere with full type inference.
75
+ *
76
+ * @example
77
+ * ```typescript
78
+ * // db/index.ts - create once
79
+ * import type { DB } from './generated';
80
+ * import { createUseTable } from 'd1-kyt/migrate';
81
+ *
82
+ * export const useTable = createUseTable<DB>();
83
+ *
84
+ * // migrations - use with inference
85
+ * const Place = useTable('Place'); // Table<DB['Place']>
86
+ * const City = useTable('City'); // Table<DB['City']>
87
+ * ```
88
+ */
89
+ export function createUseTable() {
90
+ return function (name) {
91
+ return { _name: name };
92
+ };
93
+ }
94
+ /**
95
+ * Create an index on a table.
96
+ * Use { unique: true } for unique constraint.
97
+ * Use { name: 'custom_name' } to override auto-generated name.
98
+ */
99
+ export function createIndex(table, columns, options) {
100
+ const tableName = table._name;
101
+ const unique = options?.unique ?? false;
102
+ const suffix = unique ? 'unique' : 'idx';
103
+ const indexName = options?.name ?? `${tableName}_${columns.join('_')}_${suffix}`;
104
+ const columnList = columns.map((c) => `"${c}"`).join(', ');
105
+ const uniqueKeyword = unique ? 'UNIQUE ' : '';
106
+ return `CREATE ${uniqueKeyword}INDEX "${indexName}" ON "${tableName}"(${columnList});`;
107
+ }
108
+ /**
109
+ * Drop an index by name.
110
+ */
111
+ export function dropIndex(name) {
112
+ return `DROP INDEX "${name}";`;
113
+ }
114
+ // ----------------------------------------------------------------------------
115
+ // Column Operations
116
+ // ----------------------------------------------------------------------------
117
+ /**
118
+ * Add a column to an existing table.
119
+ * Column name is type-checked against table columns.
120
+ */
121
+ export function addColumn(table, column, fn) {
122
+ const colDef = fn(columnBuilder);
123
+ let sql = `ALTER TABLE "${table._name}" ADD COLUMN "${column}" ${colDef._def.type}`;
124
+ if (colDef._def.isNotNull) {
125
+ sql += ' NOT NULL';
126
+ }
127
+ if (colDef._def.defaultValue !== null) {
128
+ sql += ` DEFAULT ${colDef._def.defaultValue}`;
129
+ }
130
+ return sql + ';';
131
+ }
132
+ // ----------------------------------------------------------------------------
133
+ // Table Operations
134
+ // ----------------------------------------------------------------------------
135
+ /**
136
+ * Drop a table and its updatedAt trigger.
137
+ */
138
+ export function dropTable(table) {
139
+ const name = table._name;
140
+ return [
141
+ `DROP TABLE "${name}";`,
142
+ `DROP TRIGGER IF EXISTS "${name}_updatedAt";`,
143
+ ];
144
+ }
145
+ //# 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,14 @@
1
+ import type { NamingStrategy } from './config.js';
2
+ /**
3
+ * Generate timestamp prefix: YYYYMMDDHHmmss (UTC)
4
+ */
5
+ export declare function generateTimestampPrefix(date?: Date): string;
6
+ /**
7
+ * Generate sequential prefix: 4-digit zero-padded
8
+ */
9
+ export declare function generateSequentialPrefix(existingFiles: string[]): string;
10
+ /**
11
+ * Generate migration prefix based on strategy
12
+ */
13
+ export declare function generateMigrationPrefix(strategy: NamingStrategy, existingFiles: string[], date?: Date): string;
14
+ //# sourceMappingURL=naming.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"naming.d.ts","sourceRoot":"","sources":["../src/naming.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,GAAE,IAAiB,GAAG,MAAM,CAGvE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,MAAM,CAYxE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,cAAc,EACxB,aAAa,EAAE,MAAM,EAAE,EACvB,IAAI,CAAC,EAAE,IAAI,GACV,MAAM,CAKR"}
package/dist/naming.js ADDED
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Generate timestamp prefix: YYYYMMDDHHmmss (UTC)
3
+ */
4
+ export function generateTimestampPrefix(date = new Date()) {
5
+ const pad = (n) => String(n).padStart(2, '0');
6
+ return `${date.getUTCFullYear()}${pad(date.getUTCMonth() + 1)}${pad(date.getUTCDate())}${pad(date.getUTCHours())}${pad(date.getUTCMinutes())}${pad(date.getUTCSeconds())}`;
7
+ }
8
+ /**
9
+ * Generate sequential prefix: 4-digit zero-padded
10
+ */
11
+ export function generateSequentialPrefix(existingFiles) {
12
+ const seqPattern = /^(\d{4})_.*\.(ts|sql)$/;
13
+ const numbers = existingFiles
14
+ .map((f) => {
15
+ const match = f.match(seqPattern);
16
+ return match ? parseInt(match[1], 10) : NaN;
17
+ })
18
+ .filter((n) => !isNaN(n));
19
+ const nextNum = numbers.length > 0 ? Math.max(...numbers) + 1 : 1;
20
+ return String(nextNum).padStart(4, '0');
21
+ }
22
+ /**
23
+ * Generate migration prefix based on strategy
24
+ */
25
+ export function generateMigrationPrefix(strategy, existingFiles, date) {
26
+ if (strategy === 'timestamp') {
27
+ return generateTimestampPrefix(date);
28
+ }
29
+ return generateSequentialPrefix(existingFiles);
30
+ }
31
+ //# sourceMappingURL=naming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"naming.js","sourceRoot":"","sources":["../src/naming.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAa,IAAI,IAAI,EAAE;IAC7D,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACtD,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC;AAC7K,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,aAAuB;IAC9D,MAAM,UAAU,GAAG,wBAAwB,CAAC;IAE5C,MAAM,OAAO,GAAG,aAAa;SAC1B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAClC,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC9C,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5B,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACrC,QAAwB,EACxB,aAAuB,EACvB,IAAW;IAEX,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;QAC7B,OAAO,uBAAuB,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,wBAAwB,CAAC,aAAa,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { Kysely } from 'kysely';
2
+ /**
3
+ * Creates a Kysely query builder configured for D1 (SQLite).
4
+ * Uses DummyDriver - queries are compiled only, never executed directly.
5
+ * Execute compiled queries via createD1().
6
+ */
7
+ export declare function createQueryBuilder<DB>(): Kysely<DB>;
8
+ //# sourceMappingURL=query-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-builder.d.ts","sourceRoot":"","sources":["../src/query-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EAKP,MAAM,QAAQ,CAAC;AAEhB;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC,CASnD"}
@@ -0,0 +1,17 @@
1
+ import { Kysely, DummyDriver, SqliteAdapter, SqliteIntrospector, SqliteQueryCompiler, } from 'kysely';
2
+ /**
3
+ * Creates a Kysely query builder configured for D1 (SQLite).
4
+ * Uses DummyDriver - queries are compiled only, never executed directly.
5
+ * Execute compiled queries via createD1().
6
+ */
7
+ export function createQueryBuilder() {
8
+ return new Kysely({
9
+ dialect: {
10
+ createAdapter: () => new SqliteAdapter(),
11
+ createDriver: () => new DummyDriver(),
12
+ createIntrospector: (db) => new SqliteIntrospector(db),
13
+ createQueryCompiler: () => new SqliteQueryCompiler(),
14
+ },
15
+ });
16
+ }
17
+ //# sourceMappingURL=query-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-builder.js","sourceRoot":"","sources":["../src/query-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,WAAW,EACX,aAAa,EACb,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,QAAQ,CAAC;AAEhB;;;;GAIG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,MAAM,CAAK;QACpB,OAAO,EAAE;YACP,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI,aAAa,EAAE;YACxC,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,WAAW,EAAE;YACrC,kBAAkB,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,kBAAkB,CAAC,EAAE,CAAC;YACtD,mBAAmB,EAAE,GAAG,EAAE,CAAC,IAAI,mBAAmB,EAAE;SACrD;KACF,CAAC,CAAC;AACL,CAAC"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "d1-kyt",
3
+ "version": "0.1.0",
4
+ "description": "Opinionated Cloudflare D1 + Kysely toolkit",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "d1-kyt": "./dist/cli.js"
10
+ },
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.js"
15
+ },
16
+ "./migrate": {
17
+ "types": "./dist/migrate.d.ts",
18
+ "import": "./dist/migrate.js"
19
+ },
20
+ "./config": {
21
+ "types": "./dist/config.d.ts",
22
+ "import": "./dist/config.js"
23
+ }
24
+ },
25
+ "files": [
26
+ "dist"
27
+ ],
28
+ "scripts": {
29
+ "build": "tsc",
30
+ "test": "vitest",
31
+ "typecheck": "tsc --noEmit",
32
+ "prepublishOnly": "pnpm build"
33
+ },
34
+ "keywords": [
35
+ "cloudflare",
36
+ "d1",
37
+ "kysely",
38
+ "sqlite",
39
+ "workers"
40
+ ],
41
+ "author": "sher",
42
+ "license": "MIT",
43
+ "peerDependencies": {
44
+ "kysely": ">=0.27.0",
45
+ "kysely-codegen": ">=0.17.0"
46
+ },
47
+ "devDependencies": {
48
+ "@types/node": "22.15.29",
49
+ "kysely": "0.28.8",
50
+ "typescript": "5.9.3",
51
+ "vitest": "4.0.15"
52
+ }
53
+ }