///| Cloudflare Worker entry and Wrangler config generators.
///|
extern "js" fn ffi_js_string_literal(value : String) -> String =
#| (value) => JSON.stringify(value)
///|
/// Generate an edge-safe server module that imports a generated Sol app.
pub fn generate_cloudflare_server_entry_js(main_module : String) -> String {
let main_module_literal = ffi_js_string_literal(main_module)
let buf = StringBuilder::new()
buf.write_string("// Cloudflare Workers adapter for Sol\n")
buf.write_string("// Generated by: sol_adapter_cloudflare\n\n")
buf.write_string("globalThis.__SOL_RUNTIME__ = 'cloudflare';\n")
buf.write_string("globalThis.__SOL_ADAPTER_MODE__ = true;\n")
buf.write_string("await import(\{main_module_literal});\n\n")
buf.write_string("const app = globalThis.__SOL_APP__;\n")
buf.write_string(
"if (!app) throw new Error('Sol app was not exported by the server module');\n\n",
)
buf.write_string("export default app;\n")
buf.to_string()
}
///|
/// Generate a host Worker entry that routes platform APIs before Sol pages.
pub fn generate_worker_entry_js(
sol_module : String,
api_prefix? : String = "/api/",
) -> String {
let sol_module_literal = ffi_js_string_literal(sol_module)
let api_prefix_literal = ffi_js_string_literal(api_prefix)
let health_path_literal = ffi_js_string_literal("/api/health")
let buf = StringBuilder::new()
buf.write_string("import solApp from \{sol_module_literal};\n\n")
buf.write_string("async function apiFetch(request, env, ctx) {\n")
buf.write_string(" const url = new URL(request.url);\n")
buf.write_string(" if (url.pathname === \{health_path_literal}) {\n")
buf.write_string(
" return Response.json({ status: \"ok\", source: \"worker-api\" });\n",
)
buf.write_string(" }\n")
buf.write_string(" return new Response(\"Not found\", { status: 404 });\n")
buf.write_string("}\n\n")
buf.write_string("export default {\n")
buf.write_string(" async fetch(request, env, ctx) {\n")
buf.write_string(" const url = new URL(request.url);\n")
buf.write_string(
" if (url.pathname.startsWith(\{api_prefix_literal})) {\n",
)
buf.write_string(" return apiFetch(request, env, ctx);\n")
buf.write_string(" }\n")
buf.write_string(" return solApp.fetch(request, env, ctx);\n")
buf.write_string(" },\n")
buf.write_string("};\n")
buf.to_string()
}
///|
/// Generate a minimal Wrangler TOML config for a Sol Worker.
pub fn generate_wrangler_toml(
name : String,
main? : String = "worker.entry.mjs",
compatibility_date? : String = "2025-01-01",
no_bundle? : Bool = false,
) -> String {
let name_literal = ffi_js_string_literal(name)
let main_literal = ffi_js_string_literal(main)
let date_literal = ffi_js_string_literal(compatibility_date)
let buf = StringBuilder::new()
buf.write_string("name = \{name_literal}\n")
buf.write_string("main = \{main_literal}\n")
buf.write_string("compatibility_date = \{date_literal}\n")
if no_bundle {
buf.write_string("no_bundle = true\n")
}
buf.to_string()
}