1// Async (non-Effect) Worker that exercises the native D1 binding against
2// the local workerd simulator: exec / prepared statements / batch.
3interface Env {
4 DB: {
5 exec(sql: string): Promise<{ count: number }>;
6 prepare(sql: string): {
7 bind(...params: unknown[]): {
8 run(): Promise<{ success: boolean }>;
9 all<T>(): Promise<{ results: T[] }>;
10 };
11 run(): Promise<{ success: boolean }>;
12 all<T>(): Promise<{ results: T[] }>;
13 first<T>(): Promise<T | null>;
14 };
15 };
16}
17
18export default {
19 fetch: async (request: Request, env: Env) => {
20 const url = new URL(request.url);
21 if (url.pathname === "/roundtrip") {
22 await env.DB.exec(
23 "CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT NOT NULL)",
24 );
25 await env.DB.prepare("DELETE FROM users").run();
26 await env.DB.prepare("INSERT INTO users (name) VALUES (?)")
27 .bind("alice")
28 .run();
29 await env.DB.prepare("INSERT INTO users (name) VALUES (?)")
30 .bind("bob")
31 .run();
32 const all = await env.DB.prepare(
33 "SELECT name FROM users ORDER BY name",
34 ).all<{ name: string }>();
35 const first = await env.DB.prepare(
36 "SELECT COUNT(*) AS n FROM users",
37 ).first<{ n: number }>();
38 return Response.json({
39 names: all.results.map((r) => r.name),
40 count: first?.n ?? null,
41 });
42 }
43 if (url.pathname === "/tables") {
44 const tables = await env.DB.prepare(
45 "SELECT name FROM sqlite_schema WHERE type = 'table' ORDER BY name",
46 ).all<{ name: string }>();
47 return Response.json({ tables: tables.results.map((t) => t.name) });
48 }
49 if (url.pathname === "/migrations") {
50 const rows = await env.DB.prepare(
51 "SELECT id, name FROM __alchemy_migrations ORDER BY id",
52 ).all<{ id: string; name: string }>();
53 return Response.json({ migrations: rows.results });
54 }
55 if (url.pathname === "/users") {
56 const rows = await env.DB.prepare(
57 "SELECT name FROM users ORDER BY name",
58 ).all<{ name: string }>();
59 return Response.json({ users: rows.results.map((r) => r.name) });
60 }
61 return new Response("not found", { status: 404 });
62 },
63};