Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Comprehensive Cloudflare platform skill covering Workers, D1, R2, KV, AI, Durable Objects, and security.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
references/wrangler/patterns.md
1# Wrangler Development Patterns23Common workflows and best practices.45## New Worker Project67```bash8wrangler init my-worker && cd my-worker9wrangler dev # Develop locally10wrangler deploy # Deploy11```1213## Local Development1415```bash16wrangler dev # Local mode (fast, simulated)17wrangler dev --remote # Remote mode (production-accurate)18wrangler dev --env staging --port 878719wrangler dev --inspector-port 9229 # Enable debugging20```2122Debug: chrome://inspect → Configure → localhost:92292324## Secrets2526```bash27# Production28echo "secret-value" | wrangler secret put SECRET_KEY2930# Local: use .dev.vars (gitignored)31# SECRET_KEY=local-dev-key32```3334## Adding KV3536```bash37wrangler kv namespace create MY_KV38wrangler kv namespace create MY_KV --preview39# Add to wrangler.jsonc: { "binding": "MY_KV", "id": "abc123" }40wrangler deploy41```4243## Adding D14445```bash46wrangler d1 create my-db47wrangler d1 migrations create my-db "initial_schema"48# Edit migration file in migrations/, then:49wrangler d1 migrations apply my-db --local50wrangler deploy51wrangler d1 migrations apply my-db --remote5253# Time Travel (restore to point in time)54wrangler d1 time-travel restore my-db --timestamp 2025-01-01T12:00:00Z55```5657## Multi-Environment5859```bash60wrangler deploy --env staging61wrangler deploy --env production62```6364```jsonc65{ "env": { "staging": { "vars": { "ENV": "staging" } } } }66```6768## Testing6970### Integration Tests with Node.js Test Runner7172```typescript73import { startWorker } from "wrangler";74import { describe, it, before, after } from "node:test";75import assert from "node:assert";7677describe("API", () => {78let worker;7980before(async () => {81worker = await startWorker({82config: "wrangler.jsonc",83remote: "minimal" // Fast tests with real bindings84});85});8687after(async () => await worker.dispose());8889it("creates user", async () => {90const response = await worker.fetch("http://example.com/api/users", {91method: "POST",92body: JSON.stringify({ name: "Alice" })93});94assert.strictEqual(response.status, 201);95});96});97```9899### Testing with Vitest100101Install: `npm install -D vitest @cloudflare/vitest-pool-workers`102103**vitest.config.ts:**104```typescript105import { defineWorkersConfig } from "@cloudflare/vitest-pool-workers/config";106export default defineWorkersConfig({107test: { poolOptions: { workers: { wrangler: { configPath: "./wrangler.jsonc" } } } }108});109```110111**tests/api.test.ts:**112```typescript113import { env, SELF } from "cloudflare:test";114import { describe, it, expect } from "vitest";115116it("fetches users", async () => {117const response = await SELF.fetch("https://example.com/api/users");118expect(response.status).toBe(200);119});120121it("uses bindings", async () => {122await env.MY_KV.put("key", "value");123expect(await env.MY_KV.get("key")).toBe("value");124});125```126127### Multi-Worker Development (Service Bindings)128129```typescript130const authWorker = await startWorker({ config: "./auth/wrangler.jsonc" });131const apiWorker = await startWorker({132config: "./api/wrangler.jsonc",133bindings: { AUTH: authWorker } // Service binding134});135136// Test API calling AUTH137const response = await apiWorker.fetch("http://example.com/api/protected");138await authWorker.dispose();139await apiWorker.dispose();140```141142### Mock External APIs143144```typescript145const worker = await startWorker({146config: "wrangler.jsonc",147outboundService: (req) => {148const url = new URL(req.url);149if (url.hostname === "api.external.com") {150return new Response(JSON.stringify({ mocked: true }), {151headers: { "content-type": "application/json" }152});153}154return fetch(req); // Pass through other requests155}156});157158// Test Worker that calls external API159const response = await worker.fetch("http://example.com/proxy");160// Worker internally fetches api.external.com - gets mocked response161```162163## Monitoring & Versions164165```bash166wrangler tail # Real-time logs167wrangler tail --status error # Filter errors168wrangler versions list169wrangler rollback [id]170```171172## TypeScript173174```bash175wrangler types # Generate types from config176```177178```typescript179export default {180async fetch(request: Request, env: Env): Promise<Response> {181return Response.json({ value: await env.MY_KV.get("key") });182}183} satisfies ExportedHandler<Env>;184```185186## Workers Assets187188```jsonc189{ "assets": { "directory": "./dist", "binding": "ASSETS" } }190```191192```typescript193export default {194async fetch(request, env) {195// API routes first196if (new URL(request.url).pathname.startsWith("/api/")) {197return Response.json({ data: "from API" });198}199return env.ASSETS.fetch(request); // Static assets200}201}202```203204## See Also205206- [README.md](./README.md) - Commands207- [configuration.md](./configuration.md) - Config208- [api.md](./api.md) - Programmatic API209- [gotchas.md](./gotchas.md) - Issues210