opencodekit 0.15.4 → 0.15.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +2 -2
- package/dist/template/.opencode/agent/explore.md +13 -12
- package/dist/template/.opencode/command/cloudflare.md +70 -0
- package/dist/template/.opencode/memory/observations/2026-01-19-learning-oh-my-opencode-slim-vs-opencodekit-templ.md +27 -0
- package/dist/template/.opencode/package.json +1 -1
- package/dist/template/.opencode/plugin/sessions.ts +38 -4
- package/dist/template/.opencode/skill/cloudflare/SKILL.md +233 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/README.md +35 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/api.md +100 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/configuration.md +99 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/gotchas.md +59 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/patterns.md +89 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-gateway/README.md +695 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/api.md +38 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/configuration.md +52 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/gotchas.md +41 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/patterns.md +45 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/api.md +27 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/configuration.md +45 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/gotchas.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/patterns.md +36 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/README.md +21 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/api.md +31 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/configuration.md +20 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/gotchas.md +28 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/patterns.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/README.md +20 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/api.md +78 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/configuration.md +128 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/gotchas.md +51 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/patterns.md +145 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/api.md +50 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/configuration.md +53 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/gotchas.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/patterns.md +45 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/configuration.md +58 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/gotchas.md +35 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/patterns.md +37 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/README.md +71 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/api.md +168 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/configuration.md +114 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/gotchas.md +99 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/patterns.md +125 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/api.md +54 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/configuration.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/gotchas.md +29 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/patterns.md +29 -0
- package/dist/template/.opencode/skill/cloudflare/references/c3/README.md +264 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/README.md +93 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/api.md +176 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/configuration.md +164 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/gotchas.md +203 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/patterns.md +180 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/api.md +43 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/configuration.md +56 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/gotchas.md +21 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/patterns.md +40 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/README.md +85 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/api.md +198 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/configuration.md +151 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/gotchas.md +129 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/patterns.md +122 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/README.md +92 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/api.md +141 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/configuration.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/gotchas.md +70 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/patterns.md +144 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/README.md +34 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/api.md +136 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/configuration.md +67 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/gotchas.md +114 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/patterns.md +158 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/README.md +62 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/api.md +89 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/configuration.md +116 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/gotchas.md +93 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/patterns.md +112 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/README.md +125 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/api.md +152 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/configuration.md +148 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/gotchas.md +158 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/patterns.md +255 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/README.md +18 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/api.md +46 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/configuration.md +63 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/gotchas.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/patterns.md +46 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-workers/README.md +598 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/README.md +62 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/api.md +137 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/configuration.md +133 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/gotchas.md +184 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/patterns.md +176 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/configuration.md +45 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/gotchas.md +23 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/patterns.md +31 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/README.md +60 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/api.md +114 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/configuration.md +92 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/gotchas.md +117 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/patterns.md +139 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/README.md +64 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/api.md +144 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/configuration.md +203 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/gotchas.md +187 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/patterns.md +211 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/README.md +60 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/api.md +240 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/configuration.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/gotchas.md +171 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/patterns.md +171 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/README.md +18 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/api.md +51 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/configuration.md +60 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/gotchas.md +36 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/patterns.md +42 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/README.md +76 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/api.md +200 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/configuration.md +228 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/gotchas.md +161 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/patterns.md +145 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/README.md +57 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/api.md +201 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/configuration.md +159 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/gotchas.md +151 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/patterns.md +190 -0
- package/dist/template/.opencode/skill/cloudflare/references/pipelines/README.md +664 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/README.md +107 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/api.md +194 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/configuration.md +216 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/gotchas.md +223 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/patterns.md +139 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/README.md +69 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/api.md +138 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/configuration.md +125 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/gotchas.md +112 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/patterns.md +155 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/README.md +61 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/api.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/configuration.md +76 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/gotchas.md +94 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/patterns.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/README.md +18 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/api.md +29 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/configuration.md +39 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/gotchas.md +20 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/patterns.md +46 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-sql/README.md +512 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/README.md +21 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/api.md +135 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/configuration.md +63 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/gotchas.md +75 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/patterns.md +102 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/README.md +81 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/api.md +164 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/configuration.md +147 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/gotchas.md +172 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/patterns.md +155 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/README.md +90 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/api.md +178 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/configuration.md +131 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/gotchas.md +156 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/patterns.md +203 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/README.md +58 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/api.md +182 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/configuration.md +140 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/gotchas.md +129 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/patterns.md +218 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/README.md +91 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/api.md +139 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/configuration.md +129 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/gotchas.md +87 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/patterns.md +135 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/README.md +15 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/api.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/configuration.md +33 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/gotchas.md +21 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/patterns.md +34 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/api.md +24 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/configuration.md +43 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/gotchas.md +42 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/patterns.md +40 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/configuration.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/gotchas.md +44 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/patterns.md +42 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/README.md +103 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/api.md +204 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/configuration.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/gotchas.md +131 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/patterns.md +152 -0
- package/dist/template/.opencode/skill/cloudflare/references/tail-workers/README.md +640 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/README.md +76 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/api.md +159 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/configuration.md +156 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/gotchas.md +207 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/patterns.md +135 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/README.md +82 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/api.md +105 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/configuration.md +113 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/gotchas.md +115 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/patterns.md +157 -0
- package/dist/template/.opencode/skill/cloudflare/references/turn/README.md +699 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/configuration.md +19 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/gotchas.md +27 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/patterns.md +41 -0
- package/dist/template/.opencode/skill/cloudflare/references/vectorize/README.md +682 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/configuration.md +44 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/gotchas.md +24 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/patterns.md +29 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/README.md +19 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/api.md +52 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/configuration.md +31 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/gotchas.md +28 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/patterns.md +52 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/README.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/api.md +199 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/configuration.md +185 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/gotchas.md +203 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/patterns.md +216 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/README.md +96 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/api.md +137 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/configuration.md +147 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/gotchas.md +99 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/patterns.md +149 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-ai/README.md +116 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/README.md +48 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/api.md +169 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/configuration.md +136 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/gotchas.md +130 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/patterns.md +170 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/api.md +20 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/configuration.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/gotchas.md +35 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/patterns.md +42 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-vpc/README.md +579 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/README.md +62 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/api.md +125 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/configuration.md +177 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/gotchas.md +136 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/patterns.md +132 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/README.md +90 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/api.md +140 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/configuration.md +128 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/gotchas.md +93 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/patterns.md +150 -0
- package/dist/template/.opencode/skill/cloudflare/references/zaraz/README.md +360 -0
- package/dist/template/.opencode/skill/react-best-practices/AGENTS.md +2410 -0
- package/dist/template/.opencode/skill/react-best-practices/README.md +123 -0
- package/dist/template/.opencode/skill/react-best-practices/SKILL.md +125 -0
- package/dist/template/.opencode/skill/react-best-practices/metadata.json +15 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/_sections.md +46 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/_template.md +28 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/advanced-use-latest.md +49 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-api-routes.md +38 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-defer-await.md +80 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-dependencies.md +36 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-parallel.md +28 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-conditional.md +31 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-preload.md +50 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/client-event-listeners.md +74 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/client-swr-dedup.md +56 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-batch-dom-css.md +82 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-function-results.md +80 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-property-access.md +28 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-storage.md +70 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-combine-iterations.md +32 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-early-exit.md +50 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-index-maps.md +37 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-length-check-first.md +49 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-min-max-loop.md +82 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-activity.md +26 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-dependencies.md +45 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-derived-state.md +29 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-memo.md +44 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-transitions.md +40 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-cache-lru.md +41 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-cache-react.md +76 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-serialization.md +38 -0
- package/dist/template/.opencode/skill/supabase/SKILL.md +120 -0
- package/dist/template/.opencode/skill/supabase/mcp.json +27 -0
- package/dist/template/.opencode/skill/vercel-deploy-claimable/SKILL.md +112 -0
- package/dist/template/.opencode/skill/vercel-deploy-claimable/scripts/deploy.sh +249 -0
- package/dist/template/.opencode/skill/web-design-guidelines/SKILL.md +39 -0
- package/dist/template/.opencode/tool/memory-read.ts +64 -44
- package/dist/template/.opencode/tool/memory-search.ts +9 -2
- package/dist/template/.opencode/tool/memory-update.ts +59 -47
- package/dist/template/.opencode/tool/observation.ts +16 -2
- package/package.json +1 -1
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# Patterns
|
|
2
|
+
|
|
3
|
+
## API Routes
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
// functions/api/todos/[id].ts
|
|
7
|
+
export const onRequestGet: PagesFunction<Env> = async ({ env, params }) => {
|
|
8
|
+
const todo = await env.DB.prepare('SELECT * FROM todos WHERE id = ?').bind(params.id).first();
|
|
9
|
+
if (!todo) return new Response('Not found', { status: 404 });
|
|
10
|
+
return Response.json(todo);
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export const onRequestPut: PagesFunction<Env> = async ({ env, params, request }) => {
|
|
14
|
+
const body = await request.json();
|
|
15
|
+
await env.DB.prepare('UPDATE todos SET title = ?, completed = ? WHERE id = ?')
|
|
16
|
+
.bind(body.title, body.completed, params.id).run();
|
|
17
|
+
return Response.json({ success: true });
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export const onRequestDelete: PagesFunction<Env> = async ({ env, params }) => {
|
|
21
|
+
await env.DB.prepare('DELETE FROM todos WHERE id = ?').bind(params.id).run();
|
|
22
|
+
return new Response(null, { status: 204 });
|
|
23
|
+
};
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Auth Middleware
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
// functions/_middleware.ts
|
|
30
|
+
const auth: PagesFunction<Env> = async (context) => {
|
|
31
|
+
if (context.request.url.includes('/public/')) return context.next();
|
|
32
|
+
const authHeader = context.request.headers.get('Authorization');
|
|
33
|
+
if (!authHeader?.startsWith('Bearer ')) return new Response('Unauthorized', { status: 401 });
|
|
34
|
+
|
|
35
|
+
try {
|
|
36
|
+
const payload = await verifyJWT(authHeader.substring(7), context.env.JWT_SECRET);
|
|
37
|
+
context.data.user = payload;
|
|
38
|
+
return context.next();
|
|
39
|
+
} catch (err) {
|
|
40
|
+
return new Response('Invalid token', { status: 401 });
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
export const onRequest = [auth];
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## CORS
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
// functions/api/_middleware.ts
|
|
50
|
+
const corsHeaders = {'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS', 'Access-Control-Allow-Headers': 'Content-Type, Authorization'};
|
|
51
|
+
const cors: PagesFunction = async (context) => {
|
|
52
|
+
if (context.request.method === 'OPTIONS') return new Response(null, { headers: corsHeaders });
|
|
53
|
+
const response = await context.next();
|
|
54
|
+
Object.entries(corsHeaders).forEach(([k, v]) => response.headers.set(k, v));
|
|
55
|
+
return response;
|
|
56
|
+
};
|
|
57
|
+
export const onRequest = [cors];
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Form Handling
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
// functions/api/contact.ts
|
|
64
|
+
export const onRequestPost: PagesFunction<Env> = async ({ request, env }) => {
|
|
65
|
+
const formData = await request.formData();
|
|
66
|
+
await env.QUEUE.send({name: formData.get('name'), email: formData.get('email'), message: formData.get('message')});
|
|
67
|
+
return new Response('<h1>Thanks!</h1>', { headers: { 'Content-Type': 'text/html' } });
|
|
68
|
+
};
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Background Tasks
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
export const onRequestPost: PagesFunction = async ({ request, waitUntil }) => {
|
|
75
|
+
const data = await request.json();
|
|
76
|
+
waitUntil(fetch('https://api.example.com/webhook', {method: 'POST', body: JSON.stringify(data)}));
|
|
77
|
+
return Response.json({ queued: true });
|
|
78
|
+
};
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Error Handling
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
// functions/_middleware.ts
|
|
85
|
+
const errorHandler: PagesFunction = async (context) => {
|
|
86
|
+
try {
|
|
87
|
+
return await context.next();
|
|
88
|
+
} catch (error) {
|
|
89
|
+
console.error('Error:', error);
|
|
90
|
+
if (context.request.url.includes('/api/')) return Response.json({ error: error.message }, { status: 500 });
|
|
91
|
+
return new Response(`<html><body><h1>Error</h1><p>${error.message}</p></body></html>`, { status: 500, headers: { 'Content-Type': 'text/html' } });
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
export const onRequest = [errorHandler];
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## Caching
|
|
98
|
+
|
|
99
|
+
```typescript
|
|
100
|
+
// functions/api/data.ts
|
|
101
|
+
export const onRequestGet: PagesFunction<Env> = async ({ env, request }) => {
|
|
102
|
+
const url = new URL(request.url);
|
|
103
|
+
const cacheKey = `data:${url.pathname}`;
|
|
104
|
+
const cached = await env.KV.get(cacheKey, 'json');
|
|
105
|
+
if (cached) return Response.json(cached, { headers: { 'X-Cache': 'HIT' } });
|
|
106
|
+
|
|
107
|
+
const data = await env.DB.prepare('SELECT * FROM data WHERE path = ?').bind(url.pathname).first();
|
|
108
|
+
await env.KV.put(cacheKey, JSON.stringify(data), {expirationTtl: 3600});
|
|
109
|
+
return Response.json(data, {headers: {'X-Cache': 'MISS', 'Cache-Control': 'public, max-age=3600'}});
|
|
110
|
+
};
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Framework Integration
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
npm create cloudflare@latest my-app -- --framework=<framework>
|
|
117
|
+
# next, svelte, remix, nuxt, astro, qwik
|
|
118
|
+
```
|
|
119
|
+
[Framework Guides](https://developers.cloudflare.com/pages/framework-guides/)
|
|
120
|
+
|
|
121
|
+
## Monorepo
|
|
122
|
+
|
|
123
|
+
Dashboard → Project → Settings → Build settings → Root directory
|
|
124
|
+
|
|
125
|
+
Set to subproject path (e.g., `apps/web`). Only builds when files in that dir change.
|
|
126
|
+
|
|
127
|
+
## Best Practices
|
|
128
|
+
|
|
129
|
+
### Performance
|
|
130
|
+
1. Exclude static from Functions via `_routes.json`
|
|
131
|
+
2. Cache with KV (API responses, rendered content)
|
|
132
|
+
3. Use Cache API: `await caches.default.match(request)`
|
|
133
|
+
4. Minimize Function size: tree-shake, dynamic imports, keep < 1MB
|
|
134
|
+
|
|
135
|
+
### Security
|
|
136
|
+
1. Set security headers in `_headers` for static
|
|
137
|
+
2. Use secrets, never commit to wrangler.toml
|
|
138
|
+
3. Validate all inputs
|
|
139
|
+
4. Rate limit with KV/DO
|
|
140
|
+
|
|
141
|
+
### Workflow
|
|
142
|
+
1. Preview deployments per branch/PR
|
|
143
|
+
2. Local dev: `npx wrangler pages dev ./dist`
|
|
144
|
+
3. Environment-specific configs in `wrangler.toml`
|
|
145
|
+
4. Rollbacks: Dashboard → Deployments → Rollback (instant)
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Cloudflare Pages Functions
|
|
2
|
+
|
|
3
|
+
Serverless functions on Cloudflare Pages using Workers runtime. Full-stack dev with file-based routing.
|
|
4
|
+
|
|
5
|
+
## File-Based Routing
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
/functions
|
|
9
|
+
├── index.js → /
|
|
10
|
+
├── api.js → /api
|
|
11
|
+
├── users/
|
|
12
|
+
│ ├── index.js → /users/
|
|
13
|
+
│ ├── [user].js → /users/:user
|
|
14
|
+
│ └── [[catchall]].js → /users/*
|
|
15
|
+
└── _middleware.js → runs on all routes
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
**Rules:**
|
|
19
|
+
- `index.js` → directory root
|
|
20
|
+
- Trailing slash optional
|
|
21
|
+
- Specific routes precede catch-alls
|
|
22
|
+
- Falls back to static if no match
|
|
23
|
+
|
|
24
|
+
## Dynamic Routes
|
|
25
|
+
|
|
26
|
+
**Single segment** `[param]` → string:
|
|
27
|
+
```js
|
|
28
|
+
// /functions/users/[user].js
|
|
29
|
+
export function onRequest(context) {
|
|
30
|
+
return new Response(`Hello ${context.params.user}`);
|
|
31
|
+
}
|
|
32
|
+
// Matches: /users/nevi
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
**Multi-segment** `[[param]]` → array:
|
|
36
|
+
```js
|
|
37
|
+
// /functions/users/[[catchall]].js
|
|
38
|
+
export function onRequest(context) {
|
|
39
|
+
return new Response(JSON.stringify(context.params.catchall));
|
|
40
|
+
}
|
|
41
|
+
// Matches: /users/nevi/foobar → ["nevi", "foobar"]
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Key Features
|
|
45
|
+
|
|
46
|
+
- **Method handlers:** `onRequestGet`, `onRequestPost`, etc.
|
|
47
|
+
- **Middleware:** `_middleware.js` for cross-cutting concerns
|
|
48
|
+
- **Bindings:** KV, D1, R2, Durable Objects, Workers AI, Service bindings
|
|
49
|
+
- **TypeScript:** Full type support via `@cloudflare/workers-types`
|
|
50
|
+
- **Advanced mode:** Use `_worker.js` for custom routing logic
|
|
51
|
+
|
|
52
|
+
## See Also
|
|
53
|
+
|
|
54
|
+
- [configuration.md](./configuration.md) - Routes, headers, redirects, wrangler config
|
|
55
|
+
- [api.md](./api.md) - EventContext, handlers, bindings
|
|
56
|
+
- [patterns.md](./patterns.md) - Auth, CORS, rate limiting, forms, caching
|
|
57
|
+
- [gotchas.md](./gotchas.md) - Common issues, debugging, limits
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
# Function API
|
|
2
|
+
|
|
3
|
+
## EventContext
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
interface EventContext<Env = any> {
|
|
7
|
+
request: Request; // Incoming request
|
|
8
|
+
functionPath: string; // Request path
|
|
9
|
+
waitUntil(promise: Promise<any>): void; // Background work
|
|
10
|
+
passThroughOnException(): void; // Fallback on error
|
|
11
|
+
next(input?: Request | string, init?: RequestInit): Promise<Response>;
|
|
12
|
+
env: Env; // Bindings, vars, secrets
|
|
13
|
+
params: Record<string, string | string[]>; // Route params
|
|
14
|
+
data: any; // Middleware shared data
|
|
15
|
+
}
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Handlers
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
// Generic (fallback)
|
|
22
|
+
export async function onRequest(context: EventContext): Promise<Response> {
|
|
23
|
+
return new Response('Any method');
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Method-specific (takes precedence)
|
|
27
|
+
export async function onRequestGet(context: EventContext): Promise<Response> {
|
|
28
|
+
return new Response('GET request');
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export async function onRequestPost(context: EventContext): Promise<Response> {
|
|
32
|
+
const body = await context.request.json();
|
|
33
|
+
return Response.json({ received: body });
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Also: onRequestPut, onRequestPatch, onRequestDelete, onRequestHead, onRequestOptions
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Bindings
|
|
40
|
+
|
|
41
|
+
### KV
|
|
42
|
+
|
|
43
|
+
```typescript
|
|
44
|
+
interface Env { TODO_LIST: KVNamespace; }
|
|
45
|
+
|
|
46
|
+
export const onRequest: PagesFunction<Env> = async (context) => {
|
|
47
|
+
await context.env.TODO_LIST.put('Task:123', 'Buy milk');
|
|
48
|
+
const task = await context.env.TODO_LIST.get('Task:123');
|
|
49
|
+
await context.env.TODO_LIST.delete('Task:123');
|
|
50
|
+
const keys = await context.env.TODO_LIST.list({ prefix: 'Task:' });
|
|
51
|
+
|
|
52
|
+
// With options
|
|
53
|
+
await context.env.TODO_LIST.put('session', data, { expirationTtl: 3600 });
|
|
54
|
+
const value = await context.env.TODO_LIST.get('key', { type: 'json' });
|
|
55
|
+
|
|
56
|
+
return new Response(task);
|
|
57
|
+
};
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### D1
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
interface Env { DB: D1Database; }
|
|
64
|
+
|
|
65
|
+
export const onRequest: PagesFunction<Env> = async (context) => {
|
|
66
|
+
// Prepared statements
|
|
67
|
+
const result = await context.env.DB.prepare('SELECT * FROM users WHERE id = ?')
|
|
68
|
+
.bind(123)
|
|
69
|
+
.first();
|
|
70
|
+
|
|
71
|
+
// Batch
|
|
72
|
+
const data = await context.env.DB.batch([
|
|
73
|
+
context.env.DB.prepare('SELECT * FROM users'),
|
|
74
|
+
context.env.DB.prepare('SELECT * FROM posts')
|
|
75
|
+
]);
|
|
76
|
+
|
|
77
|
+
return Response.json(result);
|
|
78
|
+
};
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### R2
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
interface Env { BUCKET: R2Bucket; }
|
|
85
|
+
|
|
86
|
+
export const onRequest: PagesFunction<Env> = async (context) => {
|
|
87
|
+
const url = new URL(context.request.url);
|
|
88
|
+
const key = url.pathname.slice(1);
|
|
89
|
+
|
|
90
|
+
// GET
|
|
91
|
+
const obj = await context.env.BUCKET.get(key);
|
|
92
|
+
if (!obj) return new Response('Not found', { status: 404 });
|
|
93
|
+
|
|
94
|
+
// PUT
|
|
95
|
+
await context.env.BUCKET.put(key, context.request.body, {
|
|
96
|
+
httpMetadata: { contentType: 'application/octet-stream' }
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
// DELETE
|
|
100
|
+
await context.env.BUCKET.delete(key);
|
|
101
|
+
|
|
102
|
+
return new Response(obj.body);
|
|
103
|
+
};
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Durable Objects
|
|
107
|
+
|
|
108
|
+
```typescript
|
|
109
|
+
interface Env { COUNTER: DurableObjectNamespace; }
|
|
110
|
+
|
|
111
|
+
export const onRequest: PagesFunction<Env> = async (context) => {
|
|
112
|
+
const id = context.env.COUNTER.idFromName('global-counter');
|
|
113
|
+
const stub = context.env.COUNTER.get(id);
|
|
114
|
+
return stub.fetch(context.request);
|
|
115
|
+
};
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Workers AI
|
|
119
|
+
|
|
120
|
+
```typescript
|
|
121
|
+
interface Env { AI: Ai; }
|
|
122
|
+
|
|
123
|
+
export const onRequest: PagesFunction<Env> = async (context) => {
|
|
124
|
+
const answer = await context.env.AI.run(
|
|
125
|
+
'@cf/meta/llama-3.1-8b-instruct',
|
|
126
|
+
{ prompt: 'Hello, World?' }
|
|
127
|
+
);
|
|
128
|
+
return Response.json(answer);
|
|
129
|
+
};
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Service Bindings
|
|
133
|
+
|
|
134
|
+
```typescript
|
|
135
|
+
interface Env { AUTH_SERVICE: Fetcher; }
|
|
136
|
+
|
|
137
|
+
export const onRequest: PagesFunction<Env> = async (context) => {
|
|
138
|
+
// Forward request
|
|
139
|
+
return context.env.AUTH_SERVICE.fetch(context.request);
|
|
140
|
+
|
|
141
|
+
// Custom request
|
|
142
|
+
const req = new Request('https://internal/verify', {
|
|
143
|
+
method: 'POST',
|
|
144
|
+
body: JSON.stringify({ token: 'xyz' })
|
|
145
|
+
});
|
|
146
|
+
return context.env.AUTH_SERVICE.fetch(req);
|
|
147
|
+
};
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### Environment Variables
|
|
151
|
+
|
|
152
|
+
```typescript
|
|
153
|
+
interface Env {
|
|
154
|
+
API_KEY: string;
|
|
155
|
+
ENVIRONMENT: string;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
export const onRequest: PagesFunction<Env> = async (context) => {
|
|
159
|
+
const apiKey = context.env.API_KEY;
|
|
160
|
+
const isProd = context.env.ENVIRONMENT === 'production';
|
|
161
|
+
return new Response('OK');
|
|
162
|
+
};
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## TypeScript
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
npm install -D @cloudflare/workers-types
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
```json
|
|
172
|
+
// tsconfig.json
|
|
173
|
+
{
|
|
174
|
+
"compilerOptions": {
|
|
175
|
+
"target": "ES2021",
|
|
176
|
+
"module": "ES2022",
|
|
177
|
+
"lib": ["ES2021"],
|
|
178
|
+
"types": ["@cloudflare/workers-types"]
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
```typescript
|
|
184
|
+
import type { PagesFunction, EventContext } from '@cloudflare/workers-types';
|
|
185
|
+
|
|
186
|
+
interface Env {
|
|
187
|
+
KV: KVNamespace;
|
|
188
|
+
DB: D1Database;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export const onRequest: PagesFunction<Env> = async (context) => {
|
|
192
|
+
// context.env fully typed
|
|
193
|
+
return new Response('OK');
|
|
194
|
+
};
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## See Also
|
|
198
|
+
|
|
199
|
+
- [README.md](./README.md) - Overview
|
|
200
|
+
- [configuration.md](./configuration.md) - wrangler.json
|
|
201
|
+
- [patterns.md](./patterns.md) - Common patterns
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
# Configuration
|
|
2
|
+
|
|
3
|
+
## wrangler.json / wrangler.toml
|
|
4
|
+
|
|
5
|
+
```jsonc
|
|
6
|
+
{
|
|
7
|
+
"$schema": "./node_modules/wrangler/config-schema.json",
|
|
8
|
+
"name": "my-pages-app",
|
|
9
|
+
"pages_build_output_dir": "./dist",
|
|
10
|
+
"compatibility_date": "2024-01-15",
|
|
11
|
+
"compatibility_flags": ["nodejs_compat"],
|
|
12
|
+
|
|
13
|
+
"vars": { "API_URL": "https://api.example.com" },
|
|
14
|
+
|
|
15
|
+
"kv_namespaces": [
|
|
16
|
+
{ "binding": "KV", "id": "abc123" }
|
|
17
|
+
],
|
|
18
|
+
|
|
19
|
+
"d1_databases": [{
|
|
20
|
+
"binding": "DB",
|
|
21
|
+
"database_name": "production-db",
|
|
22
|
+
"database_id": "xyz789"
|
|
23
|
+
}],
|
|
24
|
+
|
|
25
|
+
"r2_buckets": [
|
|
26
|
+
{ "binding": "BUCKET", "bucket_name": "my-bucket" }
|
|
27
|
+
],
|
|
28
|
+
|
|
29
|
+
"durable_objects": {
|
|
30
|
+
"bindings": [{
|
|
31
|
+
"name": "COUNTER",
|
|
32
|
+
"class_name": "Counter",
|
|
33
|
+
"script_name": "counter-worker"
|
|
34
|
+
}]
|
|
35
|
+
},
|
|
36
|
+
|
|
37
|
+
"services": [
|
|
38
|
+
{ "binding": "AUTH", "service": "auth-worker" }
|
|
39
|
+
],
|
|
40
|
+
|
|
41
|
+
"ai": { "binding": "AI" },
|
|
42
|
+
|
|
43
|
+
"vectorize": [{
|
|
44
|
+
"binding": "VECTORIZE",
|
|
45
|
+
"index_name": "my-index"
|
|
46
|
+
}],
|
|
47
|
+
|
|
48
|
+
"hyperdrive": [{
|
|
49
|
+
"binding": "HYPERDRIVE",
|
|
50
|
+
"id": "hyperdrive-id"
|
|
51
|
+
}],
|
|
52
|
+
|
|
53
|
+
"analytics_engine_datasets": [{ "binding": "ANALYTICS" }]
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Environment Overrides
|
|
58
|
+
|
|
59
|
+
```jsonc
|
|
60
|
+
{
|
|
61
|
+
"name": "my-app",
|
|
62
|
+
"vars": { "API_URL": "http://localhost:8787" },
|
|
63
|
+
|
|
64
|
+
"env": {
|
|
65
|
+
"preview": {
|
|
66
|
+
"vars": { "API_URL": "https://preview.example.com" }
|
|
67
|
+
},
|
|
68
|
+
"production": {
|
|
69
|
+
"vars": { "API_URL": "https://api.example.com" }
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**Rules:**
|
|
76
|
+
- Top-level → local dev
|
|
77
|
+
- `env.preview` → preview deployments
|
|
78
|
+
- `env.production` → production
|
|
79
|
+
- **Non-inheritable keys:** If overriding `vars`, `kv_namespaces`, `d1_databases`, etc., ALL must be redefined
|
|
80
|
+
|
|
81
|
+
## Local Secrets (.dev.vars)
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
# .dev.vars (DO NOT COMMIT)
|
|
85
|
+
SECRET_KEY="my-secret-value"
|
|
86
|
+
API_TOKEN="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
- Add `.dev.vars*` to `.gitignore`
|
|
90
|
+
- Use `vars` for non-sensitive config
|
|
91
|
+
- Environment-specific: `.dev.vars.preview`, `.dev.vars.production`
|
|
92
|
+
|
|
93
|
+
## _routes.json (Advanced)
|
|
94
|
+
|
|
95
|
+
Custom routing rules in build output:
|
|
96
|
+
|
|
97
|
+
```json
|
|
98
|
+
{
|
|
99
|
+
"version": 1,
|
|
100
|
+
"include": ["/api/*"],
|
|
101
|
+
"exclude": ["/static/*"]
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## _headers (Static)
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
/static/*
|
|
109
|
+
Cache-Control: public, max-age=31536000
|
|
110
|
+
X-Custom: value
|
|
111
|
+
|
|
112
|
+
/api/*
|
|
113
|
+
Access-Control-Allow-Origin: *
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## _redirects (Static)
|
|
117
|
+
|
|
118
|
+
```
|
|
119
|
+
/old-page /new-page 301
|
|
120
|
+
/docs/* https://docs.example.com/:splat 302
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Local Dev
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
# Start dev server
|
|
127
|
+
npx wrangler pages dev ./dist
|
|
128
|
+
|
|
129
|
+
# With bindings
|
|
130
|
+
npx wrangler pages dev ./dist \
|
|
131
|
+
--kv=KV \
|
|
132
|
+
--d1=DB=database-id \
|
|
133
|
+
--r2=BUCKET \
|
|
134
|
+
--binding=API_KEY=secret123
|
|
135
|
+
|
|
136
|
+
# Durable Objects (2 terminals)
|
|
137
|
+
cd do-worker && npx wrangler dev
|
|
138
|
+
cd pages-project && npx wrangler pages dev ./dist \
|
|
139
|
+
--do COUNTER=CounterClass@do-worker
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## Deployment
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
# Git push (auto-deploys)
|
|
146
|
+
git push origin main
|
|
147
|
+
|
|
148
|
+
# CLI
|
|
149
|
+
npx wrangler pages deploy ./dist
|
|
150
|
+
npx wrangler pages deploy ./dist --branch preview
|
|
151
|
+
|
|
152
|
+
# Download config from dashboard
|
|
153
|
+
npx wrangler pages download config my-project-name
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## See Also
|
|
157
|
+
|
|
158
|
+
- [README.md](./README.md) - Overview
|
|
159
|
+
- [api.md](./api.md) - EventContext, bindings
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
# Gotchas & Debugging
|
|
2
|
+
|
|
3
|
+
## Common Issues
|
|
4
|
+
|
|
5
|
+
### Functions Not Invoking
|
|
6
|
+
|
|
7
|
+
All requests serve static, functions never run.
|
|
8
|
+
|
|
9
|
+
**Fix:**
|
|
10
|
+
- `/functions` in correct location (project root)
|
|
11
|
+
- Check `pages_build_output_dir` in wrangler.json
|
|
12
|
+
- Files have `.js` or `.ts` extension
|
|
13
|
+
- `_routes.json` not excluding paths
|
|
14
|
+
|
|
15
|
+
### Binding Not Available
|
|
16
|
+
|
|
17
|
+
`context.env.MY_BINDING is undefined`
|
|
18
|
+
|
|
19
|
+
**Fix:**
|
|
20
|
+
- Binding in wrangler.json or dashboard
|
|
21
|
+
- Name matches exactly (case-sensitive)
|
|
22
|
+
- Local dev: pass flags OR configure wrangler.json
|
|
23
|
+
- Redeploy after changes
|
|
24
|
+
|
|
25
|
+
### TypeScript Errors
|
|
26
|
+
|
|
27
|
+
Type errors for `context.env`
|
|
28
|
+
|
|
29
|
+
**Fix:**
|
|
30
|
+
```typescript
|
|
31
|
+
interface Env { MY_BINDING: KVNamespace; }
|
|
32
|
+
|
|
33
|
+
export const onRequest: PagesFunction<Env> = async (context) => {
|
|
34
|
+
// context.env.MY_BINDING now typed
|
|
35
|
+
};
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Middleware Not Running
|
|
39
|
+
|
|
40
|
+
`_middleware.js` not executing
|
|
41
|
+
|
|
42
|
+
**Fix:**
|
|
43
|
+
- Named exactly `_middleware.js`
|
|
44
|
+
- In correct directory for route scope
|
|
45
|
+
- `onRequest` or method handler exported
|
|
46
|
+
- Use `context.next()` to pass control
|
|
47
|
+
|
|
48
|
+
### Environment Variables Missing
|
|
49
|
+
|
|
50
|
+
`context.env.VAR_NAME is undefined`
|
|
51
|
+
|
|
52
|
+
**Fix:**
|
|
53
|
+
- `vars` in wrangler.json
|
|
54
|
+
- Secrets: `.dev.vars` locally, dashboard/wrangler.json for prod
|
|
55
|
+
- Redeploy after changes
|
|
56
|
+
|
|
57
|
+
## Debugging
|
|
58
|
+
|
|
59
|
+
### Console Logging
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
export async function onRequest(context) {
|
|
63
|
+
console.log('Request:', context.request.method, context.request.url);
|
|
64
|
+
console.log('Headers:', Object.fromEntries(context.request.headers));
|
|
65
|
+
|
|
66
|
+
const response = await context.next();
|
|
67
|
+
console.log('Response status:', response.status);
|
|
68
|
+
return response;
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Wrangler Tail
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
# Stream real-time logs
|
|
76
|
+
npx wrangler pages deployment tail
|
|
77
|
+
|
|
78
|
+
# Filter
|
|
79
|
+
npx wrangler pages deployment tail --status error
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Source Maps
|
|
83
|
+
|
|
84
|
+
```jsonc
|
|
85
|
+
// wrangler.json
|
|
86
|
+
{ "upload_source_maps": true }
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Limits
|
|
90
|
+
|
|
91
|
+
- **CPU:** 10ms (Free), 50ms (Paid)
|
|
92
|
+
- **Memory:** 128 MB
|
|
93
|
+
- **Script size:** 10 MB compressed
|
|
94
|
+
- **Env vars:** 5 KB per var, 64 max
|
|
95
|
+
- **Requests:** 100k free/day, $0.50/million after
|
|
96
|
+
|
|
97
|
+
## Best Practices
|
|
98
|
+
|
|
99
|
+
**Performance:**
|
|
100
|
+
- Minimize deps for cold starts
|
|
101
|
+
- KV for infrequent reads, D1 for relational, R2 for large files
|
|
102
|
+
- Set `Cache-Control` headers
|
|
103
|
+
- Use prepared statements, batch operations
|
|
104
|
+
- Handle errors gracefully
|
|
105
|
+
|
|
106
|
+
**Security:**
|
|
107
|
+
- Never commit secrets
|
|
108
|
+
- Use secrets (encrypted) not vars for sensitive data
|
|
109
|
+
- Validate all input
|
|
110
|
+
- Sanitize before DB ops
|
|
111
|
+
- Implement auth middleware
|
|
112
|
+
- Set appropriate CORS headers
|
|
113
|
+
- Rate limit per-IP
|
|
114
|
+
|
|
115
|
+
## Migration
|
|
116
|
+
|
|
117
|
+
### From Workers
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
// Worker
|
|
121
|
+
export default {
|
|
122
|
+
fetch(request, env) { }
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Pages Function
|
|
126
|
+
export function onRequest(context) {
|
|
127
|
+
const { request, env } = context;
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
In `_worker.js`: `return env.ASSETS.fetch(request)` for static assets.
|
|
132
|
+
|
|
133
|
+
### From Other Platforms
|
|
134
|
+
|
|
135
|
+
- `/functions/api/users.js` → `/api/users`
|
|
136
|
+
- Dynamic routes: `[param]` not `:param`
|
|
137
|
+
- Replace deps with Workers APIs or `nodejs_compat` flag
|
|
138
|
+
|
|
139
|
+
## Resources
|
|
140
|
+
|
|
141
|
+
- [Docs](https://developers.cloudflare.com/pages/functions/)
|
|
142
|
+
- [Workers APIs](https://developers.cloudflare.com/workers/runtime-apis/)
|
|
143
|
+
- [Examples](https://github.com/cloudflare/pages-example-projects)
|
|
144
|
+
- [Discord](https://discord.gg/cloudflaredev)
|
|
145
|
+
|
|
146
|
+
## See Also
|
|
147
|
+
|
|
148
|
+
- [README.md](./README.md) - Overview
|
|
149
|
+
- [configuration.md](./configuration.md) - wrangler.json
|
|
150
|
+
- [api.md](./api.md) - EventContext, bindings
|
|
151
|
+
- [patterns.md](./patterns.md) - Common patterns
|