sol_adapter_cloudflare

Cloudflare adapter utilities for Sol

sol
cloudflare
wrangler
moonbit
moon add mizchi/sol_adapter_cloudflare@0.23.2
Download zip
Author
Version
0.23.2
License
MIT
Last updated
last month
Downloads
353

Dependencies

README

#sol_adapter_cloudflare

Cloudflare adapter utilities for Sol.

This package depends on mizchi/sol and keeps Cloudflare/Wrangler-specific route conversion outside the Sol core package.

#Worker runtime

Use this package from a Cloudflare-targeted Sol server entry:

async fn main {
@sol_cloudflare.run_app(fn() {
@sol.create_app(routes(), config=config())
})
}

The exported app supports the Worker shape:

export default { fetch(request, env, ctx) { return solApp.fetch(request, env, ctx); }, };

env and ctx are passed into Mars/Sol request context, so route handlers and middleware can use ctx.env_var("NAME") and ctx.wait_until(...).

#Binding validation

Declare the bindings a Worker expects and fail early in local tests or Worker entry code:

let missing = @sol_cloudflare.missing_required_bindings(env, [
@sol_cloudflare.env_var("API_TOKEN"),
@sol_cloudflare.kv_namespace("CACHE"),
@sol_cloudflare.r2_bucket("MEDIA"),
])

#Generators

  • generate_cloudflare_server_entry_js(...) creates an edge-safe Sol server module wrapper without top-level timers or Node imports.
  • generate_worker_entry_js(...) creates a host Worker composition entry that routes /api/* before delegating to Sol.
  • generate_wrangler_toml(...) and generate_wrangler_assets_config(...) generate Wrangler config fragments with string escaping handled by the adapter.

#
App

using @mizchi/mars { type Server as App }

Mars app type used by Sol.

#
Env

using @mizchi/mars { type JsEnv as Env }

Cloudflare Workers environment object.

#
ExecutionContext

using @mizchi/mars { type JsExecCtx as ExecutionContext }

Cloudflare Workers execution context.

#
BindingKey

pub(all) struct BindingKey[T] {
name : String
kind : BindingKind
optional : Bool
_type : T?
}

Phantom-typed binding key for generated env contracts.

#
BindingKey::kind

fn[T] BindingKey::kind(self : BindingKey[T]) -> BindingKind

#
BindingKey::name

fn[T] BindingKey::name(self : BindingKey[T]) -> String

#
BindingKey::optional

fn[T] BindingKey::optional(self : BindingKey[T]) -> Bool

#
BindingKind

pub(all) enum BindingKind {
EnvVar
Secret
KV
R2
D1
DurableObject
Service
AI
Queue
}

Cloudflare binding category used for dev/test validation and docs.

#
BindingKind::label

fn BindingKind::label(self : BindingKind) -> String

#
BindingSpec

pub(all) struct BindingSpec {
name : String
kind : BindingKind
optional : Bool
}

One expected Cloudflare binding.

#
MissingBinding

pub(all) struct MissingBinding {
name : String
kind : BindingKind
}

A required binding that is missing from the Worker env.

#
ai_binding

fn ai_binding(name : String, optional? : Bool) -> BindingSpec

Required Workers AI binding.

#
binding

fn binding(name : String, kind : BindingKind, optional? : Bool) -> BindingSpec

#
binding_key

fn[T] binding_key(name : String, kind : BindingKind, optional? : Bool) -> BindingKey[T]

#
bindings_typescript_decl

fn bindings_typescript_decl(specs : Array[BindingSpec], interface_name? : String) -> String

#
d1_database

fn d1_database(name : String, optional? : Bool) -> BindingSpec

Required D1 database binding.

#
describe_missing_bindings

fn describe_missing_bindings(missing : Array[MissingBinding]) -> String

Human-readable validation error for missing bindings.

#
durable_object

fn durable_object(name : String, optional? : Bool) -> BindingSpec

Required Durable Object namespace binding.

#
env_var

fn env_var(name : String, optional? : Bool) -> BindingSpec

Required plain env var.

#
env_var_key

fn env_var_key(name : String, optional? : Bool) -> BindingKey[String]

#
export_app

fn export_app(app :
Server
) -> Unit

Export a Sol app as a Cloudflare Worker fetch(request, env, ctx) app.

#
extract_worker_first_patterns

fn extract_worker_first_patterns(routes : Array[
SolRoutes
]) -> Array[String]

Extract Cloudflare run_worker_first patterns from Sol routes.

#
generate_cloudflare_server_entry_js

fn generate_cloudflare_server_entry_js(main_module : String) -> String

Generate an edge-safe server module that imports a generated Sol app.

#
generate_worker_entry_js

fn generate_worker_entry_js(sol_module : String, api_prefix? : String) -> String

Generate a host Worker entry that routes platform APIs before Sol pages.

#
generate_wrangler_assets_config

fn generate_wrangler_assets_config(routes : Array[
SolRoutes
], output_dir : String) -> String

Generate a Wrangler assets config fragment for Cloudflare Workers.

#
generate_wrangler_toml

fn generate_wrangler_toml(name : String, main? : String, compatibility_date? : String, no_bundle? : Bool) -> String

Generate a minimal Wrangler TOML config for a Sol Worker.

#
kv_namespace

fn kv_namespace(name : String, optional? : Bool) -> BindingSpec

Required KV namespace binding.

#
missing_required_bindings

fn missing_required_bindings(env :
JsEnv
, specs : Array[BindingSpec]) -> Array[MissingBinding]

Return all missing required bindings for a Cloudflare Worker env.

#
queue_binding

fn queue_binding(name : String, optional? : Bool) -> BindingSpec

Required Queue binding.

#
r2_bucket

fn r2_bucket(name : String, optional? : Bool) -> BindingSpec

Required R2 bucket binding.

#
route_pattern_to_worker_glob

fn route_pattern_to_worker_glob(path : String) -> String

Convert a Sol route pattern to a Cloudflare run_worker_first glob.

#
run

fn run(configure : (
Server
) -> Unit) -> Unit

Run a configured Sol app in Cloudflare adapter mode.

#
run_app

fn run_app(create_and_configure : () ->
Server
) -> Unit

Run a Sol app factory in Cloudflare adapter mode.

#
secret

fn secret(name : String, optional? : Bool) -> BindingSpec

Required secret env var.

#
secret_key

fn secret_key(name : String, optional? : Bool) -> BindingKey[String]

#
service_binding

fn service_binding(name : String, optional? : Bool) -> BindingSpec

Required Service Binding.

#
validate_bindings

fn validate_bindings(env :
JsEnv
, specs : Array[BindingSpec]) -> Bool

True when every required binding exists.

Powered by MoonBit

Site sourceReport issuePackagesBuild queueSkillsStatistics

© 2026 mooncakes.io