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 +155 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +329 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +8 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +10 -0
- package/dist/config.js.map +1 -0
- package/dist/executor.d.ts +83 -0
- package/dist/executor.d.ts.map +1 -0
- package/dist/executor.js +69 -0
- package/dist/executor.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/migrate.d.ts +108 -0
- package/dist/migrate.d.ts.map +1 -0
- package/dist/migrate.js +145 -0
- package/dist/migrate.js.map +1 -0
- package/dist/naming.d.ts +14 -0
- package/dist/naming.d.ts.map +1 -0
- package/dist/naming.js +31 -0
- package/dist/naming.js.map +1 -0
- package/dist/query-builder.d.ts +8 -0
- package/dist/query-builder.d.ts.map +1 -0
- package/dist/query-builder.js +17 -0
- package/dist/query-builder.js.map +1 -0
- package/package.json +53 -0
package/README.md
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# d1-kyt
|
|
2
|
+
|
|
3
|
+
[](https://developers.cloudflare.com/d1/)
|
|
4
|
+
[](https://kysely.dev/)
|
|
5
|
+
[](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 @@
|
|
|
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
|
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,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"}
|
package/dist/executor.js
ADDED
|
@@ -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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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"}
|
package/dist/migrate.js
ADDED
|
@@ -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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"}
|
package/dist/naming.d.ts
ADDED
|
@@ -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
|
+
}
|