Skip to content

Instantly share code, notes, and snippets.

@mizchi
Created September 1, 2023 17:18
Show Gist options
  • Save mizchi/d9e819dc8c2dd09c1ab92c52a3e1d4b5 to your computer and use it in GitHub Desktop.
Save mizchi/d9e819dc8c2dd09c1ab92c52a3e1d4b5 to your computer and use it in GitHub Desktop.
Cloudflare env emulator
/**
* cloudflare local emulator
*/
import { parse } from "@iarna/toml";
type WranglerConfig = {
d1_databases?: Array<{
database_name: string;
database_id: string;
binding: string;
migrations_dir: string;
}>;
};
let _env: Record<string, any> | undefined = undefined;
export async function createCloudflareEnv() {
if (!import.meta.env.DEV) throw new Error("DEV ONLY");
if (_env) return _env;
if (import.meta.env.DEV) {
const env: Record<string, any> = {};
const { default: raw } = await import("../../wrangler.toml?raw");
const parsed = parse(raw) as WranglerConfig;
for (const database of parsed.d1_databases ?? []) {
env[database.binding] = await createD1(database.database_id);
}
return (_env = env);
}
throw new Error("Unreachable");
}
async function createD1(database_id: string) {
const { D1DatabaseAPI, D1Database } = await import("@miniflare/d1");
const { createSQLiteDB } = await import("@miniflare/shared");
const db = await createSQLiteDB(
`.wrangler/state/v3/d1/${database_id}/db.sqlite`,
);
return new D1Database(new D1DatabaseAPI(db));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment