# Configuration ## TypeScript Setup **Generate types from wrangler.jsonc** (replaces deprecated `@cloudflare/workers-types`): ```bash npx wrangler types ``` Creates `worker-configuration.d.ts` with typed `Env` interface based on your bindings. ```typescript // functions/api.ts export const onRequest: PagesFunction = async (ctx) => { // ctx.env.KV, ctx.env.DB, etc. are fully typed return Response.json({ ok: true }); }; ``` **Manual types** (if not using wrangler types): ```typescript interface Env { KV: KVNamespace; DB: D1Database; API_KEY: string; } export const onRequest: PagesFunction = async (ctx) => { /* ... */ }; ``` ## wrangler.jsonc ```jsonc { "$schema": "./node_modules/wrangler/config-schema.json", "name": "my-pages-app", "pages_build_output_dir": "./dist", "compatibility_date": "2025-01-01", "compatibility_flags": ["nodejs_compat"], "vars": { "API_URL": "https://api.example.com" }, "kv_namespaces": [{ "binding": "KV", "id": "abc123" }], "d1_databases": [{ "binding": "DB", "database_name": "prod-db", "database_id": "xyz789" }], "r2_buckets": [{ "binding": "BUCKET", "bucket_name": "my-bucket" }], "durable_objects": { "bindings": [{ "name": "COUNTER", "class_name": "Counter", "script_name": "counter-worker" }] }, "services": [{ "binding": "AUTH", "service": "auth-worker" }], "ai": { "binding": "AI" }, "vectorize": [{ "binding": "VECTORIZE", "index_name": "my-index" }], "analytics_engine_datasets": [{ "binding": "ANALYTICS" }] } ``` ## Environment Overrides Top-level → local dev, `env.preview` → preview, `env.production` → production ```jsonc { "vars": { "API_URL": "http://localhost:8787" }, "env": { "production": { "vars": { "API_URL": "https://api.example.com" } } } } ``` **Note:** If overriding `vars`, `kv_namespaces`, `d1_databases`, etc., ALL must be redefined (non-inheritable) ## Local Secrets (.dev.vars) **Local dev only** - NOT deployed: ```bash # .dev.vars (add to .gitignore) SECRET_KEY="my-secret-value" ``` Accessed via `ctx.env.SECRET_KEY`. Set production secrets: ```bash echo "value" | npx wrangler pages secret put SECRET_KEY --project-name=my-app ``` ## Static Config Files **_routes.json** - Custom routing: ```json { "version": 1, "include": ["/api/*"], "exclude": ["/static/*"] } ``` **_headers** - Static headers: ``` /static/* Cache-Control: public, max-age=31536000 ``` **_redirects** - Redirects: ``` /old /new 301 ``` ## Local Dev & Deployment ```bash # Dev server npx wrangler pages dev ./dist # With bindings npx wrangler pages dev ./dist --kv=KV --d1=DB=db-id --r2=BUCKET # Durable Objects (2 terminals) cd do-worker && npx wrangler dev cd pages-project && npx wrangler pages dev ./dist --do COUNTER=Counter@do-worker # Deploy npx wrangler pages deploy ./dist npx wrangler pages deploy ./dist --branch preview # Download config npx wrangler pages download config my-project ``` **See also:** [api.md](./api.md) for binding usage examples