pi-cloudflare 0.1.0
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/LICENSE +674 -0
- package/README.md +67 -0
- package/bin/setup.mjs +103 -0
- package/dist/auth-flow.d.ts +15 -0
- package/dist/auth-flow.d.ts.map +1 -0
- package/dist/auth-flow.js +90 -0
- package/dist/auth-flow.js.map +1 -0
- package/dist/client.d.ts +18 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +47 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +13 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +10 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +109 -0
- package/dist/index.js.map +1 -0
- package/dist/oauth.d.ts +44 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +135 -0
- package/dist/oauth.js.map +1 -0
- package/dist/proxy.d.ts +29 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +39 -0
- package/dist/proxy.js.map +1 -0
- package/dist/servers.d.ts +19 -0
- package/dist/servers.d.ts.map +1 -0
- package/dist/servers.js +40 -0
- package/dist/servers.js.map +1 -0
- package/dist/token-store.d.ts +23 -0
- package/dist/token-store.d.ts.map +1 -0
- package/dist/token-store.js +47 -0
- package/dist/token-store.js.map +1 -0
- package/package.json +67 -0
- package/skills/agents-sdk/SKILL.md +221 -0
- package/skills/agents-sdk/references/browse-the-web.md +63 -0
- package/skills/agents-sdk/references/callable.md +92 -0
- package/skills/agents-sdk/references/client-sdk.md +110 -0
- package/skills/agents-sdk/references/codemode.md +110 -0
- package/skills/agents-sdk/references/configuration.md +72 -0
- package/skills/agents-sdk/references/durable-execution.md +51 -0
- package/skills/agents-sdk/references/email.md +146 -0
- package/skills/agents-sdk/references/human-in-the-loop.md +67 -0
- package/skills/agents-sdk/references/mcp.md +188 -0
- package/skills/agents-sdk/references/observability.md +44 -0
- package/skills/agents-sdk/references/queue-retries.md +79 -0
- package/skills/agents-sdk/references/routing.md +75 -0
- package/skills/agents-sdk/references/server-driven-messages.md +63 -0
- package/skills/agents-sdk/references/state-scheduling.md +171 -0
- package/skills/agents-sdk/references/streaming-chat.md +198 -0
- package/skills/agents-sdk/references/think.md +112 -0
- package/skills/agents-sdk/references/voice.md +68 -0
- package/skills/agents-sdk/references/webhooks-push.md +86 -0
- package/skills/agents-sdk/references/workflows.md +132 -0
- package/skills/cloudflare/SKILL.md +248 -0
- package/skills/cloudflare/references/agents-sdk/README.md +89 -0
- package/skills/cloudflare/references/agents-sdk/api.md +190 -0
- package/skills/cloudflare/references/agents-sdk/configuration.md +182 -0
- package/skills/cloudflare/references/agents-sdk/gotchas.md +158 -0
- package/skills/cloudflare/references/agents-sdk/patterns.md +192 -0
- package/skills/cloudflare/references/ai-gateway/README.md +175 -0
- package/skills/cloudflare/references/ai-gateway/configuration.md +111 -0
- package/skills/cloudflare/references/ai-gateway/dynamic-routing.md +82 -0
- package/skills/cloudflare/references/ai-gateway/features.md +96 -0
- package/skills/cloudflare/references/ai-gateway/sdk-integration.md +114 -0
- package/skills/cloudflare/references/ai-gateway/troubleshooting.md +88 -0
- package/skills/cloudflare/references/ai-search/README.md +138 -0
- package/skills/cloudflare/references/ai-search/api.md +87 -0
- package/skills/cloudflare/references/ai-search/configuration.md +88 -0
- package/skills/cloudflare/references/ai-search/gotchas.md +81 -0
- package/skills/cloudflare/references/ai-search/patterns.md +85 -0
- package/skills/cloudflare/references/analytics-engine/README.md +94 -0
- package/skills/cloudflare/references/analytics-engine/api.md +112 -0
- package/skills/cloudflare/references/analytics-engine/configuration.md +112 -0
- package/skills/cloudflare/references/analytics-engine/gotchas.md +85 -0
- package/skills/cloudflare/references/analytics-engine/patterns.md +83 -0
- package/skills/cloudflare/references/api/README.md +66 -0
- package/skills/cloudflare/references/api/api.md +204 -0
- package/skills/cloudflare/references/api/configuration.md +160 -0
- package/skills/cloudflare/references/api/gotchas.md +225 -0
- package/skills/cloudflare/references/api/patterns.md +204 -0
- package/skills/cloudflare/references/api-shield/README.md +44 -0
- package/skills/cloudflare/references/api-shield/api.md +141 -0
- package/skills/cloudflare/references/api-shield/configuration.md +192 -0
- package/skills/cloudflare/references/api-shield/gotchas.md +125 -0
- package/skills/cloudflare/references/api-shield/patterns.md +180 -0
- package/skills/cloudflare/references/argo-smart-routing/README.md +90 -0
- package/skills/cloudflare/references/argo-smart-routing/api.md +240 -0
- package/skills/cloudflare/references/argo-smart-routing/configuration.md +197 -0
- package/skills/cloudflare/references/argo-smart-routing/gotchas.md +111 -0
- package/skills/cloudflare/references/argo-smart-routing/patterns.md +104 -0
- package/skills/cloudflare/references/artifacts/README.md +79 -0
- package/skills/cloudflare/references/artifacts/api.md +128 -0
- package/skills/cloudflare/references/artifacts/configuration.md +92 -0
- package/skills/cloudflare/references/bindings/README.md +122 -0
- package/skills/cloudflare/references/bindings/api.md +203 -0
- package/skills/cloudflare/references/bindings/configuration.md +188 -0
- package/skills/cloudflare/references/bindings/gotchas.md +208 -0
- package/skills/cloudflare/references/bindings/patterns.md +200 -0
- package/skills/cloudflare/references/bot-management/README.md +94 -0
- package/skills/cloudflare/references/bot-management/api.md +169 -0
- package/skills/cloudflare/references/bot-management/configuration.md +163 -0
- package/skills/cloudflare/references/bot-management/gotchas.md +114 -0
- package/skills/cloudflare/references/bot-management/patterns.md +182 -0
- package/skills/cloudflare/references/browser-rendering/README.md +78 -0
- package/skills/cloudflare/references/browser-rendering/api.md +108 -0
- package/skills/cloudflare/references/browser-rendering/configuration.md +78 -0
- package/skills/cloudflare/references/browser-rendering/gotchas.md +88 -0
- package/skills/cloudflare/references/browser-rendering/patterns.md +91 -0
- package/skills/cloudflare/references/c3/README.md +111 -0
- package/skills/cloudflare/references/c3/api.md +71 -0
- package/skills/cloudflare/references/c3/configuration.md +81 -0
- package/skills/cloudflare/references/c3/gotchas.md +92 -0
- package/skills/cloudflare/references/c3/patterns.md +82 -0
- package/skills/cloudflare/references/cache-reserve/README.md +147 -0
- package/skills/cloudflare/references/cache-reserve/api.md +194 -0
- package/skills/cloudflare/references/cache-reserve/configuration.md +169 -0
- package/skills/cloudflare/references/cache-reserve/gotchas.md +132 -0
- package/skills/cloudflare/references/cache-reserve/patterns.md +197 -0
- package/skills/cloudflare/references/containers/README.md +85 -0
- package/skills/cloudflare/references/containers/api.md +187 -0
- package/skills/cloudflare/references/containers/configuration.md +188 -0
- package/skills/cloudflare/references/containers/gotchas.md +178 -0
- package/skills/cloudflare/references/containers/patterns.md +202 -0
- package/skills/cloudflare/references/cron-triggers/README.md +99 -0
- package/skills/cloudflare/references/cron-triggers/api.md +196 -0
- package/skills/cloudflare/references/cron-triggers/configuration.md +180 -0
- package/skills/cloudflare/references/cron-triggers/gotchas.md +199 -0
- package/skills/cloudflare/references/cron-triggers/patterns.md +190 -0
- package/skills/cloudflare/references/d1/README.md +133 -0
- package/skills/cloudflare/references/d1/api.md +196 -0
- package/skills/cloudflare/references/d1/configuration.md +191 -0
- package/skills/cloudflare/references/d1/gotchas.md +98 -0
- package/skills/cloudflare/references/d1/patterns.md +189 -0
- package/skills/cloudflare/references/ddos/README.md +41 -0
- package/skills/cloudflare/references/ddos/api.md +164 -0
- package/skills/cloudflare/references/ddos/configuration.md +93 -0
- package/skills/cloudflare/references/ddos/gotchas.md +107 -0
- package/skills/cloudflare/references/ddos/patterns.md +174 -0
- package/skills/cloudflare/references/do-storage/README.md +75 -0
- package/skills/cloudflare/references/do-storage/api.md +102 -0
- package/skills/cloudflare/references/do-storage/configuration.md +112 -0
- package/skills/cloudflare/references/do-storage/gotchas.md +150 -0
- package/skills/cloudflare/references/do-storage/patterns.md +194 -0
- package/skills/cloudflare/references/do-storage/testing.md +183 -0
- package/skills/cloudflare/references/durable-objects/README.md +185 -0
- package/skills/cloudflare/references/durable-objects/api.md +187 -0
- package/skills/cloudflare/references/durable-objects/configuration.md +160 -0
- package/skills/cloudflare/references/durable-objects/gotchas.md +197 -0
- package/skills/cloudflare/references/durable-objects/patterns.md +201 -0
- package/skills/cloudflare/references/email-routing/README.md +89 -0
- package/skills/cloudflare/references/email-routing/api.md +195 -0
- package/skills/cloudflare/references/email-routing/configuration.md +186 -0
- package/skills/cloudflare/references/email-routing/gotchas.md +196 -0
- package/skills/cloudflare/references/email-routing/patterns.md +229 -0
- package/skills/cloudflare/references/email-workers/README.md +151 -0
- package/skills/cloudflare/references/email-workers/api.md +237 -0
- package/skills/cloudflare/references/email-workers/configuration.md +112 -0
- package/skills/cloudflare/references/email-workers/gotchas.md +125 -0
- package/skills/cloudflare/references/email-workers/patterns.md +102 -0
- package/skills/cloudflare/references/flagship/README.md +59 -0
- package/skills/cloudflare/references/flagship/api.md +390 -0
- package/skills/cloudflare/references/flagship/configuration.md +202 -0
- package/skills/cloudflare/references/flagship/gotchas.md +178 -0
- package/skills/cloudflare/references/flagship/patterns.md +469 -0
- package/skills/cloudflare/references/graphql-api/README.md +147 -0
- package/skills/cloudflare/references/graphql-api/api.md +175 -0
- package/skills/cloudflare/references/graphql-api/configuration.md +118 -0
- package/skills/cloudflare/references/graphql-api/gotchas.md +110 -0
- package/skills/cloudflare/references/graphql-api/patterns.md +225 -0
- package/skills/cloudflare/references/hyperdrive/README.md +82 -0
- package/skills/cloudflare/references/hyperdrive/api.md +143 -0
- package/skills/cloudflare/references/hyperdrive/configuration.md +159 -0
- package/skills/cloudflare/references/hyperdrive/gotchas.md +77 -0
- package/skills/cloudflare/references/hyperdrive/patterns.md +190 -0
- package/skills/cloudflare/references/images/README.md +61 -0
- package/skills/cloudflare/references/images/api.md +96 -0
- package/skills/cloudflare/references/images/configuration.md +211 -0
- package/skills/cloudflare/references/images/gotchas.md +99 -0
- package/skills/cloudflare/references/images/patterns.md +115 -0
- package/skills/cloudflare/references/kv/README.md +89 -0
- package/skills/cloudflare/references/kv/api.md +160 -0
- package/skills/cloudflare/references/kv/configuration.md +144 -0
- package/skills/cloudflare/references/kv/gotchas.md +131 -0
- package/skills/cloudflare/references/kv/patterns.md +196 -0
- package/skills/cloudflare/references/miniflare/README.md +105 -0
- package/skills/cloudflare/references/miniflare/api.md +187 -0
- package/skills/cloudflare/references/miniflare/configuration.md +173 -0
- package/skills/cloudflare/references/miniflare/gotchas.md +160 -0
- package/skills/cloudflare/references/miniflare/patterns.md +181 -0
- package/skills/cloudflare/references/network-interconnect/README.md +99 -0
- package/skills/cloudflare/references/network-interconnect/api.md +199 -0
- package/skills/cloudflare/references/network-interconnect/configuration.md +114 -0
- package/skills/cloudflare/references/network-interconnect/gotchas.md +165 -0
- package/skills/cloudflare/references/network-interconnect/patterns.md +166 -0
- package/skills/cloudflare/references/observability/README.md +88 -0
- package/skills/cloudflare/references/observability/api.md +164 -0
- package/skills/cloudflare/references/observability/configuration.md +169 -0
- package/skills/cloudflare/references/observability/gotchas.md +115 -0
- package/skills/cloudflare/references/observability/patterns.md +105 -0
- package/skills/cloudflare/references/pages/README.md +88 -0
- package/skills/cloudflare/references/pages/api.md +204 -0
- package/skills/cloudflare/references/pages/configuration.md +201 -0
- package/skills/cloudflare/references/pages/gotchas.md +203 -0
- package/skills/cloudflare/references/pages/patterns.md +204 -0
- package/skills/cloudflare/references/pages-functions/README.md +98 -0
- package/skills/cloudflare/references/pages-functions/api.md +143 -0
- package/skills/cloudflare/references/pages-functions/configuration.md +122 -0
- package/skills/cloudflare/references/pages-functions/gotchas.md +94 -0
- package/skills/cloudflare/references/pages-functions/patterns.md +137 -0
- package/skills/cloudflare/references/pipelines/README.md +90 -0
- package/skills/cloudflare/references/pipelines/api.md +124 -0
- package/skills/cloudflare/references/pipelines/configuration.md +155 -0
- package/skills/cloudflare/references/pipelines/gotchas.md +58 -0
- package/skills/cloudflare/references/pipelines/patterns.md +130 -0
- package/skills/cloudflare/references/pulumi/README.md +100 -0
- package/skills/cloudflare/references/pulumi/api.md +200 -0
- package/skills/cloudflare/references/pulumi/configuration.md +198 -0
- package/skills/cloudflare/references/pulumi/gotchas.md +181 -0
- package/skills/cloudflare/references/pulumi/patterns.md +191 -0
- package/skills/cloudflare/references/queues/README.md +96 -0
- package/skills/cloudflare/references/queues/api.md +206 -0
- package/skills/cloudflare/references/queues/configuration.md +144 -0
- package/skills/cloudflare/references/queues/gotchas.md +206 -0
- package/skills/cloudflare/references/queues/patterns.md +220 -0
- package/skills/cloudflare/references/r2/README.md +95 -0
- package/skills/cloudflare/references/r2/api.md +200 -0
- package/skills/cloudflare/references/r2/configuration.md +165 -0
- package/skills/cloudflare/references/r2/gotchas.md +190 -0
- package/skills/cloudflare/references/r2/patterns.md +193 -0
- package/skills/cloudflare/references/r2-data-catalog/README.md +75 -0
- package/skills/cloudflare/references/r2-data-catalog/api.md +122 -0
- package/skills/cloudflare/references/r2-data-catalog/configuration.md +98 -0
- package/skills/cloudflare/references/r2-data-catalog/gotchas.md +55 -0
- package/skills/cloudflare/references/r2-data-catalog/patterns.md +122 -0
- package/skills/cloudflare/references/r2-sql/README.md +64 -0
- package/skills/cloudflare/references/r2-sql/api.md +121 -0
- package/skills/cloudflare/references/r2-sql/configuration.md +50 -0
- package/skills/cloudflare/references/r2-sql/gotchas.md +39 -0
- package/skills/cloudflare/references/r2-sql/patterns.md +118 -0
- package/skills/cloudflare/references/realtime-sfu/README.md +65 -0
- package/skills/cloudflare/references/realtime-sfu/api.md +158 -0
- package/skills/cloudflare/references/realtime-sfu/configuration.md +137 -0
- package/skills/cloudflare/references/realtime-sfu/gotchas.md +133 -0
- package/skills/cloudflare/references/realtime-sfu/patterns.md +174 -0
- package/skills/cloudflare/references/realtimekit/README.md +113 -0
- package/skills/cloudflare/references/realtimekit/api.md +212 -0
- package/skills/cloudflare/references/realtimekit/configuration.md +203 -0
- package/skills/cloudflare/references/realtimekit/gotchas.md +169 -0
- package/skills/cloudflare/references/realtimekit/patterns.md +223 -0
- package/skills/cloudflare/references/sandbox/README.md +96 -0
- package/skills/cloudflare/references/sandbox/api.md +198 -0
- package/skills/cloudflare/references/sandbox/configuration.md +143 -0
- package/skills/cloudflare/references/sandbox/gotchas.md +194 -0
- package/skills/cloudflare/references/sandbox/patterns.md +201 -0
- package/skills/cloudflare/references/secrets-store/README.md +74 -0
- package/skills/cloudflare/references/secrets-store/api.md +200 -0
- package/skills/cloudflare/references/secrets-store/configuration.md +185 -0
- package/skills/cloudflare/references/secrets-store/gotchas.md +97 -0
- package/skills/cloudflare/references/secrets-store/patterns.md +207 -0
- package/skills/cloudflare/references/smart-placement/README.md +138 -0
- package/skills/cloudflare/references/smart-placement/api.md +183 -0
- package/skills/cloudflare/references/smart-placement/configuration.md +196 -0
- package/skills/cloudflare/references/smart-placement/gotchas.md +174 -0
- package/skills/cloudflare/references/smart-placement/patterns.md +183 -0
- package/skills/cloudflare/references/snippets/README.md +68 -0
- package/skills/cloudflare/references/snippets/api.md +198 -0
- package/skills/cloudflare/references/snippets/configuration.md +227 -0
- package/skills/cloudflare/references/snippets/gotchas.md +86 -0
- package/skills/cloudflare/references/snippets/patterns.md +135 -0
- package/skills/cloudflare/references/spectrum/README.md +52 -0
- package/skills/cloudflare/references/spectrum/api.md +181 -0
- package/skills/cloudflare/references/spectrum/configuration.md +194 -0
- package/skills/cloudflare/references/spectrum/gotchas.md +145 -0
- package/skills/cloudflare/references/spectrum/patterns.md +196 -0
- package/skills/cloudflare/references/static-assets/README.md +65 -0
- package/skills/cloudflare/references/static-assets/api.md +199 -0
- package/skills/cloudflare/references/static-assets/configuration.md +186 -0
- package/skills/cloudflare/references/static-assets/gotchas.md +162 -0
- package/skills/cloudflare/references/static-assets/patterns.md +189 -0
- package/skills/cloudflare/references/stream/README.md +114 -0
- package/skills/cloudflare/references/stream/api-live.md +195 -0
- package/skills/cloudflare/references/stream/api.md +199 -0
- package/skills/cloudflare/references/stream/configuration.md +141 -0
- package/skills/cloudflare/references/stream/gotchas.md +130 -0
- package/skills/cloudflare/references/stream/patterns.md +184 -0
- package/skills/cloudflare/references/tail-workers/README.md +89 -0
- package/skills/cloudflare/references/tail-workers/api.md +200 -0
- package/skills/cloudflare/references/tail-workers/configuration.md +176 -0
- package/skills/cloudflare/references/tail-workers/gotchas.md +192 -0
- package/skills/cloudflare/references/tail-workers/patterns.md +180 -0
- package/skills/cloudflare/references/terraform/README.md +102 -0
- package/skills/cloudflare/references/terraform/api.md +178 -0
- package/skills/cloudflare/references/terraform/configuration.md +197 -0
- package/skills/cloudflare/references/terraform/gotchas.md +150 -0
- package/skills/cloudflare/references/terraform/patterns.md +174 -0
- package/skills/cloudflare/references/tunnel/README.md +129 -0
- package/skills/cloudflare/references/tunnel/api.md +193 -0
- package/skills/cloudflare/references/tunnel/configuration.md +157 -0
- package/skills/cloudflare/references/tunnel/gotchas.md +147 -0
- package/skills/cloudflare/references/tunnel/networking.md +168 -0
- package/skills/cloudflare/references/tunnel/patterns.md +192 -0
- package/skills/cloudflare/references/turn/README.md +82 -0
- package/skills/cloudflare/references/turn/api.md +239 -0
- package/skills/cloudflare/references/turn/configuration.md +179 -0
- package/skills/cloudflare/references/turn/gotchas.md +231 -0
- package/skills/cloudflare/references/turn/patterns.md +213 -0
- package/skills/cloudflare/references/turnstile/README.md +99 -0
- package/skills/cloudflare/references/turnstile/api.md +240 -0
- package/skills/cloudflare/references/turnstile/configuration.md +222 -0
- package/skills/cloudflare/references/turnstile/gotchas.md +218 -0
- package/skills/cloudflare/references/turnstile/patterns.md +193 -0
- package/skills/cloudflare/references/vectorize/README.md +133 -0
- package/skills/cloudflare/references/vectorize/api.md +88 -0
- package/skills/cloudflare/references/vectorize/configuration.md +88 -0
- package/skills/cloudflare/references/vectorize/gotchas.md +76 -0
- package/skills/cloudflare/references/vectorize/patterns.md +90 -0
- package/skills/cloudflare/references/waf/README.md +113 -0
- package/skills/cloudflare/references/waf/api.md +202 -0
- package/skills/cloudflare/references/waf/configuration.md +203 -0
- package/skills/cloudflare/references/waf/gotchas.md +204 -0
- package/skills/cloudflare/references/waf/patterns.md +197 -0
- package/skills/cloudflare/references/web-analytics/README.md +141 -0
- package/skills/cloudflare/references/web-analytics/configuration.md +76 -0
- package/skills/cloudflare/references/web-analytics/gotchas.md +82 -0
- package/skills/cloudflare/references/web-analytics/integration.md +60 -0
- package/skills/cloudflare/references/web-analytics/patterns.md +91 -0
- package/skills/cloudflare/references/workerd/README.md +78 -0
- package/skills/cloudflare/references/workerd/api.md +185 -0
- package/skills/cloudflare/references/workerd/configuration.md +183 -0
- package/skills/cloudflare/references/workerd/gotchas.md +139 -0
- package/skills/cloudflare/references/workerd/patterns.md +192 -0
- package/skills/cloudflare/references/workers/README.md +108 -0
- package/skills/cloudflare/references/workers/api.md +195 -0
- package/skills/cloudflare/references/workers/configuration.md +185 -0
- package/skills/cloudflare/references/workers/frameworks.md +197 -0
- package/skills/cloudflare/references/workers/gotchas.md +137 -0
- package/skills/cloudflare/references/workers/patterns.md +198 -0
- package/skills/cloudflare/references/workers-ai/README.md +197 -0
- package/skills/cloudflare/references/workers-ai/api.md +112 -0
- package/skills/cloudflare/references/workers-ai/configuration.md +97 -0
- package/skills/cloudflare/references/workers-ai/gotchas.md +114 -0
- package/skills/cloudflare/references/workers-ai/patterns.md +120 -0
- package/skills/cloudflare/references/workers-for-platforms/README.md +89 -0
- package/skills/cloudflare/references/workers-for-platforms/api.md +196 -0
- package/skills/cloudflare/references/workers-for-platforms/configuration.md +167 -0
- package/skills/cloudflare/references/workers-for-platforms/gotchas.md +134 -0
- package/skills/cloudflare/references/workers-for-platforms/patterns.md +188 -0
- package/skills/cloudflare/references/workers-playground/README.md +127 -0
- package/skills/cloudflare/references/workers-playground/api.md +101 -0
- package/skills/cloudflare/references/workers-playground/configuration.md +163 -0
- package/skills/cloudflare/references/workers-playground/gotchas.md +88 -0
- package/skills/cloudflare/references/workers-playground/patterns.md +132 -0
- package/skills/cloudflare/references/workers-vpc/README.md +127 -0
- package/skills/cloudflare/references/workers-vpc/api.md +202 -0
- package/skills/cloudflare/references/workers-vpc/configuration.md +147 -0
- package/skills/cloudflare/references/workers-vpc/gotchas.md +167 -0
- package/skills/cloudflare/references/workers-vpc/patterns.md +209 -0
- package/skills/cloudflare/references/workflows/README.md +77 -0
- package/skills/cloudflare/references/workflows/api.md +218 -0
- package/skills/cloudflare/references/workflows/configuration.md +152 -0
- package/skills/cloudflare/references/workflows/gotchas.md +90 -0
- package/skills/cloudflare/references/workflows/patterns.md +175 -0
- package/skills/cloudflare/references/wrangler/README.md +135 -0
- package/skills/cloudflare/references/wrangler/api.md +188 -0
- package/skills/cloudflare/references/wrangler/configuration.md +197 -0
- package/skills/cloudflare/references/wrangler/gotchas.md +197 -0
- package/skills/cloudflare/references/wrangler/patterns.md +209 -0
- package/skills/cloudflare/references/zaraz/IMPLEMENTATION_SUMMARY.md +121 -0
- package/skills/cloudflare/references/zaraz/README.md +111 -0
- package/skills/cloudflare/references/zaraz/api.md +112 -0
- package/skills/cloudflare/references/zaraz/configuration.md +90 -0
- package/skills/cloudflare/references/zaraz/gotchas.md +81 -0
- package/skills/cloudflare/references/zaraz/patterns.md +74 -0
- package/skills/cloudflare-email-service/SKILL.md +103 -0
- package/skills/cloudflare-email-service/references/cli-and-mcp.md +125 -0
- package/skills/cloudflare-email-service/references/deliverability.md +285 -0
- package/skills/cloudflare-email-service/references/rest-api.md +184 -0
- package/skills/cloudflare-email-service/references/routing.md +199 -0
- package/skills/cloudflare-email-service/references/sending.md +252 -0
- package/skills/cloudflare-one/SKILL.md +176 -0
- package/skills/cloudflare-one-migrations/SKILL.md +110 -0
- package/skills/durable-objects/SKILL.md +186 -0
- package/skills/durable-objects/references/rules.md +295 -0
- package/skills/durable-objects/references/testing.md +264 -0
- package/skills/durable-objects/references/workers.md +346 -0
- package/skills/sandbox-migrate-to-next/SKILL.md +185 -0
- package/skills/sandbox-next/SKILL.md +91 -0
- package/skills/sandbox-next/references/api-quick-ref.md +94 -0
- package/skills/sandbox-next/references/examples.md +15 -0
- package/skills/sandbox-stable/SKILL.md +110 -0
- package/skills/turnstile-spin/README.md +51 -0
- package/skills/turnstile-spin/SKILL.md +330 -0
- package/skills/turnstile-spin/references/astro.md +199 -0
- package/skills/turnstile-spin/references/hugo.md +114 -0
- package/skills/turnstile-spin/references/nextjs-app.md +261 -0
- package/skills/turnstile-spin/references/nextjs-pages.md +82 -0
- package/skills/turnstile-spin/references/sveltekit.md +191 -0
- package/skills/turnstile-spin/references/vanilla-html.md +157 -0
- package/skills/turnstile-spin/scripts/auth-probe.sh +285 -0
- package/skills/turnstile-spin/scripts/persist-skill.sh +114 -0
- package/skills/turnstile-spin/scripts/validate.sh +137 -0
- package/skills/turnstile-spin/scripts/widget-create.sh +121 -0
- package/skills/turnstile-spin/tests/validation.md +62 -0
- package/skills/workers-best-practices/SKILL.md +127 -0
- package/skills/workers-best-practices/references/review.md +174 -0
- package/skills/workers-best-practices/references/rules.md +467 -0
- package/skills/wrangler/SKILL.md +922 -0
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
# Patterns
|
|
2
|
+
|
|
3
|
+
See [README.md](./README.md), [configuration.md](./configuration.md), [api.md](./api.md).
|
|
4
|
+
|
|
5
|
+
## High-Traffic Read-Heavy
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
const sql = postgres(env.HYPERDRIVE.connectionString, {max: 5, prepare: true});
|
|
9
|
+
|
|
10
|
+
// Cacheable: popular content
|
|
11
|
+
const posts = await sql`SELECT * FROM posts WHERE published = true ORDER BY views DESC LIMIT 20`;
|
|
12
|
+
|
|
13
|
+
// Cacheable: user profiles
|
|
14
|
+
const [user] = await sql`SELECT id, username, bio FROM users WHERE id = ${userId}`;
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
**Benefits:** Trending/profiles cached (60s), connection pooling handles spikes.
|
|
18
|
+
|
|
19
|
+
## Mixed Read/Write
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
interface Env {
|
|
23
|
+
HYPERDRIVE_CACHED: Hyperdrive; // max_age=120
|
|
24
|
+
HYPERDRIVE_REALTIME: Hyperdrive; // caching disabled
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Reads: cached
|
|
28
|
+
if (req.method === "GET") {
|
|
29
|
+
const sql = postgres(env.HYPERDRIVE_CACHED.connectionString, {prepare: true});
|
|
30
|
+
const products = await sql`SELECT * FROM products WHERE category = ${cat}`;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Writes: no cache (immediate consistency)
|
|
34
|
+
if (req.method === "POST") {
|
|
35
|
+
const sql = postgres(env.HYPERDRIVE_REALTIME.connectionString, {prepare: true});
|
|
36
|
+
await sql`INSERT INTO orders ${sql(data)}`;
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Analytics Dashboard
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
const client = new Client({connectionString: env.HYPERDRIVE.connectionString});
|
|
44
|
+
await client.connect();
|
|
45
|
+
|
|
46
|
+
// Aggregate queries cached (use fixed timestamps for caching)
|
|
47
|
+
const thirtyDaysAgo = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString();
|
|
48
|
+
const dailyStats = await client.query(`
|
|
49
|
+
SELECT DATE(created_at) as date, COUNT(*) as orders, SUM(amount) as revenue
|
|
50
|
+
FROM orders WHERE created_at >= $1
|
|
51
|
+
GROUP BY DATE(created_at) ORDER BY date DESC
|
|
52
|
+
`, [thirtyDaysAgo]);
|
|
53
|
+
|
|
54
|
+
const sevenDaysAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString();
|
|
55
|
+
const topProducts = await client.query(`
|
|
56
|
+
SELECT p.name, COUNT(oi.id) as count, SUM(oi.quantity * oi.price) as revenue
|
|
57
|
+
FROM order_items oi JOIN products p ON oi.product_id = p.id
|
|
58
|
+
WHERE oi.created_at >= $1
|
|
59
|
+
GROUP BY p.id, p.name ORDER BY revenue DESC LIMIT 10
|
|
60
|
+
`, [sevenDaysAgo]);
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**Benefits:** Expensive aggregations cached (avoid NOW() for cacheability), dashboard instant, reduced DB load.
|
|
64
|
+
|
|
65
|
+
## Multi-Tenant
|
|
66
|
+
|
|
67
|
+
```typescript
|
|
68
|
+
const tenantId = req.headers.get("X-Tenant-ID");
|
|
69
|
+
const sql = postgres(env.HYPERDRIVE.connectionString, {prepare: true});
|
|
70
|
+
|
|
71
|
+
// Tenant-scoped queries cached separately
|
|
72
|
+
const docs = await sql`
|
|
73
|
+
SELECT * FROM documents
|
|
74
|
+
WHERE tenant_id = ${tenantId} AND deleted_at IS NULL
|
|
75
|
+
ORDER BY updated_at DESC LIMIT 50
|
|
76
|
+
`;
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**Benefits:** Per-tenant caching, shared connection pool, protects DB from multi-tenant load.
|
|
80
|
+
|
|
81
|
+
## Geographically Distributed
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
// Worker runs at edge nearest user
|
|
85
|
+
// Connection setup at edge (fast), pooling near DB (efficient)
|
|
86
|
+
const sql = postgres(env.HYPERDRIVE.connectionString, {prepare: true});
|
|
87
|
+
const [user] = await sql`SELECT * FROM users WHERE id = ${userId}`;
|
|
88
|
+
|
|
89
|
+
return Response.json({
|
|
90
|
+
user,
|
|
91
|
+
serverRegion: req.cf?.colo, // Edge location
|
|
92
|
+
});
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
**Benefits:** Edge setup + DB pooling = global → single-region DB without replication.
|
|
96
|
+
|
|
97
|
+
## Multi-Query + Smart Placement
|
|
98
|
+
|
|
99
|
+
For Workers making **multiple queries** per request, enable Smart Placement to execute near DB:
|
|
100
|
+
|
|
101
|
+
```jsonc
|
|
102
|
+
// wrangler.jsonc
|
|
103
|
+
{
|
|
104
|
+
"placement": {"mode": "smart"},
|
|
105
|
+
"hyperdrive": [{"binding": "HYPERDRIVE", "id": "<ID>"}]
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
const sql = postgres(env.HYPERDRIVE.connectionString, {prepare: true});
|
|
111
|
+
|
|
112
|
+
// Multiple queries benefit from Smart Placement
|
|
113
|
+
const [user] = await sql`SELECT * FROM users WHERE id = ${userId}`;
|
|
114
|
+
const orders = await sql`SELECT * FROM orders WHERE user_id = ${userId} ORDER BY created_at DESC LIMIT 10`;
|
|
115
|
+
const stats = await sql`SELECT COUNT(*) as total, SUM(amount) as spent FROM orders WHERE user_id = ${userId}`;
|
|
116
|
+
|
|
117
|
+
return Response.json({user, orders, stats});
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
**Benefits:** Worker executes near DB → reduces latency for each query. Without Smart Placement, each query round-trips from edge.
|
|
121
|
+
|
|
122
|
+
## Connection Pooling
|
|
123
|
+
|
|
124
|
+
Operates in **transaction mode**: connection acquired per transaction, `RESET` on return.
|
|
125
|
+
|
|
126
|
+
**SET statements:**
|
|
127
|
+
```typescript
|
|
128
|
+
// ✅ Within transaction
|
|
129
|
+
await client.query("BEGIN");
|
|
130
|
+
await client.query("SET work_mem = '256MB'");
|
|
131
|
+
await client.query("SELECT * FROM large_table"); // Uses SET
|
|
132
|
+
await client.query("COMMIT"); // RESET after
|
|
133
|
+
|
|
134
|
+
// ✅ Single statement
|
|
135
|
+
await client.query("SET work_mem = '256MB'; SELECT * FROM large_table");
|
|
136
|
+
|
|
137
|
+
// ❌ Across queries (may get different connection)
|
|
138
|
+
await client.query("SET work_mem = '256MB'");
|
|
139
|
+
await client.query("SELECT * FROM large_table"); // SET not applied
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
**Best practices:**
|
|
143
|
+
```typescript
|
|
144
|
+
// ❌ Long transactions block pooling
|
|
145
|
+
await client.query("BEGIN");
|
|
146
|
+
await processThousands(); // Connection held entire time
|
|
147
|
+
await client.query("COMMIT");
|
|
148
|
+
|
|
149
|
+
// ✅ Short transactions
|
|
150
|
+
await client.query("BEGIN");
|
|
151
|
+
await client.query("UPDATE users SET status = $1 WHERE id = $2", [status, id]);
|
|
152
|
+
await client.query("COMMIT");
|
|
153
|
+
|
|
154
|
+
// ✅ SET LOCAL within transaction
|
|
155
|
+
await client.query("BEGIN");
|
|
156
|
+
await client.query("SET LOCAL work_mem = '256MB'");
|
|
157
|
+
await client.query("SELECT * FROM large_table");
|
|
158
|
+
await client.query("COMMIT");
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## Performance Tips
|
|
162
|
+
|
|
163
|
+
**Enable prepared statements (required for caching):**
|
|
164
|
+
```typescript
|
|
165
|
+
const sql = postgres(connectionString, {prepare: true}); // Default, enables caching
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
**Optimize connection settings:**
|
|
169
|
+
```typescript
|
|
170
|
+
const sql = postgres(connectionString, {
|
|
171
|
+
max: 5, // Stay under Workers' 6 connection limit
|
|
172
|
+
fetch_types: false, // Reduce latency if not using arrays
|
|
173
|
+
idle_timeout: 60, // Match Worker lifetime
|
|
174
|
+
});
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
**Write cache-friendly queries:**
|
|
178
|
+
```typescript
|
|
179
|
+
// ✅ Cacheable (deterministic)
|
|
180
|
+
await sql`SELECT * FROM products WHERE category = 'electronics' LIMIT 10`;
|
|
181
|
+
|
|
182
|
+
// ❌ Not cacheable (volatile NOW())
|
|
183
|
+
await sql`SELECT * FROM logs WHERE created_at > NOW()`;
|
|
184
|
+
|
|
185
|
+
// ✅ Cacheable (parameterized timestamp)
|
|
186
|
+
const ts = Date.now();
|
|
187
|
+
await sql`SELECT * FROM logs WHERE created_at > ${ts}`;
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
See [gotchas.md](./gotchas.md) for limits, troubleshooting.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Cloudflare Images Skill Reference
|
|
2
|
+
|
|
3
|
+
**Cloudflare Images** is an end-to-end image management solution providing storage, transformation, optimization, and delivery at scale via Cloudflare's global network.
|
|
4
|
+
|
|
5
|
+
## Quick Decision Tree
|
|
6
|
+
|
|
7
|
+
**Need to:**
|
|
8
|
+
- **Transform in Worker?** → [api.md](api.md#workers-binding-api-2026-primary-method) (Workers Binding API)
|
|
9
|
+
- **Upload from Worker?** → [api.md](api.md#upload-from-worker) (REST API)
|
|
10
|
+
- **Upload from client?** → [patterns.md](patterns.md#upload-from-client-direct-creator-upload) (Direct Creator Upload)
|
|
11
|
+
- **Set up variants?** → [configuration.md](configuration.md#variants-configuration)
|
|
12
|
+
- **Serve responsive images?** → [patterns.md](patterns.md#responsive-images)
|
|
13
|
+
- **Add watermarks?** → [patterns.md](patterns.md#watermarking)
|
|
14
|
+
- **Fix errors?** → [gotchas.md](gotchas.md#common-errors)
|
|
15
|
+
|
|
16
|
+
## Reading Order
|
|
17
|
+
|
|
18
|
+
**For building image upload/transform feature:**
|
|
19
|
+
1. [configuration.md](configuration.md) - Setup Workers binding
|
|
20
|
+
2. [api.md](api.md#workers-binding-api-2026-primary-method) - Learn transform API
|
|
21
|
+
3. [patterns.md](patterns.md#upload-from-client-direct-creator-upload) - Direct upload pattern
|
|
22
|
+
4. [gotchas.md](gotchas.md) - Check limits and errors
|
|
23
|
+
|
|
24
|
+
**For URL-based transforms:**
|
|
25
|
+
1. [configuration.md](configuration.md#variants-configuration) - Create variants
|
|
26
|
+
2. [api.md](api.md#url-transform-api) - URL syntax
|
|
27
|
+
3. [patterns.md](patterns.md#responsive-images) - Responsive patterns
|
|
28
|
+
|
|
29
|
+
**For troubleshooting:**
|
|
30
|
+
1. [gotchas.md](gotchas.md#common-errors) - Error messages
|
|
31
|
+
2. [gotchas.md](gotchas.md#limits) - Size/format limits
|
|
32
|
+
|
|
33
|
+
## Core Methods
|
|
34
|
+
|
|
35
|
+
| Method | Use Case | Location |
|
|
36
|
+
|--------|----------|----------|
|
|
37
|
+
| `env.IMAGES.input().transform()` | Transform in Worker | [api.md:11](api.md) |
|
|
38
|
+
| REST API `/images/v1` | Upload images | [api.md:57](api.md) |
|
|
39
|
+
| Direct Creator Upload | Client-side upload | [api.md:127](api.md) |
|
|
40
|
+
| URL transforms | Static image delivery | [api.md:112](api.md) |
|
|
41
|
+
|
|
42
|
+
## In This Reference
|
|
43
|
+
|
|
44
|
+
- **[api.md](api.md)** - Complete API: Workers binding, REST endpoints, URL transforms
|
|
45
|
+
- **[configuration.md](configuration.md)** - Setup: wrangler.toml, variants, auth, signed URLs
|
|
46
|
+
- **[patterns.md](patterns.md)** - Patterns: responsive images, watermarks, format negotiation, caching
|
|
47
|
+
- **[gotchas.md](gotchas.md)** - Troubleshooting: limits, errors, best practices
|
|
48
|
+
|
|
49
|
+
## Key Features
|
|
50
|
+
|
|
51
|
+
- **Automatic Optimization** - AVIF/WebP format negotiation
|
|
52
|
+
- **On-the-fly Transforms** - Resize, crop, blur, sharpen via URL or API
|
|
53
|
+
- **Workers Binding** - Transform images in Workers (2026 primary method)
|
|
54
|
+
- **Direct Upload** - Secure client-side uploads without backend proxy
|
|
55
|
+
- **Global Delivery** - Cached at 300+ Cloudflare data centers
|
|
56
|
+
- **Watermarking** - Overlay images programmatically
|
|
57
|
+
|
|
58
|
+
## See Also
|
|
59
|
+
|
|
60
|
+
- [Official Docs](https://developers.cloudflare.com/images/)
|
|
61
|
+
- [Workers Examples](https://developers.cloudflare.com/images/tutorials/)
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# API Reference
|
|
2
|
+
|
|
3
|
+
## Workers Binding API
|
|
4
|
+
|
|
5
|
+
```toml
|
|
6
|
+
# wrangler.toml
|
|
7
|
+
[images]
|
|
8
|
+
binding = "IMAGES"
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
### Transform Images
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
const imageResponse = await env.IMAGES
|
|
15
|
+
.input(fileBuffer)
|
|
16
|
+
.transform({ width: 800, height: 600, fit: "cover", quality: 85, format: "avif" })
|
|
17
|
+
.output();
|
|
18
|
+
return imageResponse.response();
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### Transform Options
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
interface TransformOptions {
|
|
25
|
+
width?: number; height?: number;
|
|
26
|
+
fit?: "scale-down" | "contain" | "cover" | "crop" | "pad";
|
|
27
|
+
quality?: number; // 1-100
|
|
28
|
+
format?: "avif" | "webp" | "jpeg" | "png";
|
|
29
|
+
dpr?: number; // 1-3
|
|
30
|
+
gravity?: "auto" | "left" | "right" | "top" | "bottom" | "face" | string;
|
|
31
|
+
sharpen?: number; // 0-10
|
|
32
|
+
blur?: number; // 1-250
|
|
33
|
+
rotate?: 90 | 180 | 270;
|
|
34
|
+
background?: string; // CSS color for pad
|
|
35
|
+
metadata?: "none" | "copyright" | "keep";
|
|
36
|
+
brightness?: number; contrast?: number; gamma?: number; // 0-2
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Draw/Watermark
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
await env.IMAGES.input(baseImage)
|
|
44
|
+
.draw(env.IMAGES.input(watermark).transform({ width: 100 }), { top: 10, left: 10, opacity: 0.8 })
|
|
45
|
+
.output();
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## REST API
|
|
49
|
+
|
|
50
|
+
### Upload Image
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
curl -X POST https://api.cloudflare.com/client/v4/accounts/{account_id}/images/v1 \
|
|
54
|
+
-H "Authorization: Bearer {token}" -F file=@image.jpg -F metadata='{"key":"value"}'
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Other Operations
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
GET /accounts/{account_id}/images/v1/{image_id} # Get details
|
|
61
|
+
DELETE /accounts/{account_id}/images/v1/{image_id} # Delete
|
|
62
|
+
GET /accounts/{account_id}/images/v1?page=1 # List
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## URL Transform API
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
https://imagedelivery.net/{hash}/{id}/width=800,height=600,fit=cover,format=avif
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**Params:** `w=`, `h=`, `fit=`, `q=`, `f=`, `dpr=`, `gravity=`, `sharpen=`, `blur=`, `rotate=`, `background=`, `metadata=`
|
|
72
|
+
|
|
73
|
+
## Direct Creator Upload
|
|
74
|
+
|
|
75
|
+
```typescript
|
|
76
|
+
// 1. Get upload URL (backend)
|
|
77
|
+
const { result } = await fetch(
|
|
78
|
+
`https://api.cloudflare.com/client/v4/accounts/${accountId}/images/v2/direct_upload`,
|
|
79
|
+
{ method: 'POST', headers: { 'Authorization': `Bearer ${token}` },
|
|
80
|
+
body: JSON.stringify({ requireSignedURLs: false }) }
|
|
81
|
+
).then(r => r.json());
|
|
82
|
+
|
|
83
|
+
// 2. Client uploads to result.uploadURL
|
|
84
|
+
const formData = new FormData();
|
|
85
|
+
formData.append('file', file);
|
|
86
|
+
await fetch(result.uploadURL, { method: 'POST', body: formData });
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Error Codes
|
|
90
|
+
|
|
91
|
+
| Code | Message | Solution |
|
|
92
|
+
|------|---------|----------|
|
|
93
|
+
| 5400 | Invalid format | Use JPEG, PNG, GIF, WebP |
|
|
94
|
+
| 5401 | Too large | Max 100MB |
|
|
95
|
+
| 5403 | Invalid transform | Check params |
|
|
96
|
+
| 9413 | Rate limit | Implement backoff |
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
# Configuration
|
|
2
|
+
|
|
3
|
+
## Wrangler Integration
|
|
4
|
+
|
|
5
|
+
### Workers Binding Setup
|
|
6
|
+
|
|
7
|
+
Add to `wrangler.toml`:
|
|
8
|
+
|
|
9
|
+
```toml
|
|
10
|
+
name = "my-image-worker"
|
|
11
|
+
main = "src/index.ts"
|
|
12
|
+
compatibility_date = "2024-01-01"
|
|
13
|
+
|
|
14
|
+
[images]
|
|
15
|
+
binding = "IMAGES"
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Access in Worker:
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
interface Env {
|
|
22
|
+
IMAGES: ImageBinding;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export default {
|
|
26
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
27
|
+
return await env.IMAGES
|
|
28
|
+
.input(imageBuffer)
|
|
29
|
+
.transform({ width: 800 })
|
|
30
|
+
.output()
|
|
31
|
+
.response();
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Upload via Script
|
|
37
|
+
|
|
38
|
+
Wrangler doesn't have built-in Images commands, use REST API:
|
|
39
|
+
|
|
40
|
+
```typescript
|
|
41
|
+
// scripts/upload-image.ts
|
|
42
|
+
import fs from 'fs';
|
|
43
|
+
import FormData from 'form-data';
|
|
44
|
+
|
|
45
|
+
async function uploadImage(filePath: string) {
|
|
46
|
+
const accountId = process.env.CLOUDFLARE_ACCOUNT_ID!;
|
|
47
|
+
const apiToken = process.env.CLOUDFLARE_API_TOKEN!;
|
|
48
|
+
|
|
49
|
+
const formData = new FormData();
|
|
50
|
+
formData.append('file', fs.createReadStream(filePath));
|
|
51
|
+
|
|
52
|
+
const response = await fetch(
|
|
53
|
+
`https://api.cloudflare.com/client/v4/accounts/${accountId}/images/v1`,
|
|
54
|
+
{
|
|
55
|
+
method: 'POST',
|
|
56
|
+
headers: {
|
|
57
|
+
'Authorization': `Bearer ${apiToken}`,
|
|
58
|
+
},
|
|
59
|
+
body: formData,
|
|
60
|
+
}
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
const result = await response.json();
|
|
64
|
+
console.log('Uploaded:', result);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
uploadImage('./photo.jpg');
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Environment Variables
|
|
71
|
+
|
|
72
|
+
Store account hash for URL construction:
|
|
73
|
+
|
|
74
|
+
```toml
|
|
75
|
+
[vars]
|
|
76
|
+
IMAGES_ACCOUNT_HASH = "your-account-hash"
|
|
77
|
+
ACCOUNT_ID = "your-account-id"
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Access in Worker:
|
|
81
|
+
|
|
82
|
+
```typescript
|
|
83
|
+
const imageUrl = `https://imagedelivery.net/${env.IMAGES_ACCOUNT_HASH}/${imageId}/public`;
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Variants Configuration
|
|
87
|
+
|
|
88
|
+
Variants are named presets for transformations.
|
|
89
|
+
|
|
90
|
+
### Create Variant (Dashboard)
|
|
91
|
+
|
|
92
|
+
1. Navigate to Images → Variants
|
|
93
|
+
2. Click "Create Variant"
|
|
94
|
+
3. Set name (e.g., `thumbnail`)
|
|
95
|
+
4. Configure: `width=200,height=200,fit=cover`
|
|
96
|
+
|
|
97
|
+
### Create Variant (API)
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
curl -X POST \
|
|
101
|
+
https://api.cloudflare.com/client/v4/accounts/{account_id}/images/v1/variants \
|
|
102
|
+
-H "Authorization: Bearer {api_token}" \
|
|
103
|
+
-H "Content-Type: application/json" \
|
|
104
|
+
-d '{
|
|
105
|
+
"id": "thumbnail",
|
|
106
|
+
"options": {
|
|
107
|
+
"width": 200,
|
|
108
|
+
"height": 200,
|
|
109
|
+
"fit": "cover"
|
|
110
|
+
},
|
|
111
|
+
"neverRequireSignedURLs": true
|
|
112
|
+
}'
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Use Variant
|
|
116
|
+
|
|
117
|
+
```
|
|
118
|
+
https://imagedelivery.net/{account_hash}/{image_id}/thumbnail
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Common Variant Presets
|
|
122
|
+
|
|
123
|
+
```json
|
|
124
|
+
{
|
|
125
|
+
"thumbnail": {
|
|
126
|
+
"width": 200,
|
|
127
|
+
"height": 200,
|
|
128
|
+
"fit": "cover"
|
|
129
|
+
},
|
|
130
|
+
"avatar": {
|
|
131
|
+
"width": 128,
|
|
132
|
+
"height": 128,
|
|
133
|
+
"fit": "cover",
|
|
134
|
+
"gravity": "face"
|
|
135
|
+
},
|
|
136
|
+
"hero": {
|
|
137
|
+
"width": 1920,
|
|
138
|
+
"height": 1080,
|
|
139
|
+
"fit": "cover",
|
|
140
|
+
"quality": 90
|
|
141
|
+
},
|
|
142
|
+
"mobile": {
|
|
143
|
+
"width": 640,
|
|
144
|
+
"fit": "scale-down",
|
|
145
|
+
"quality": 80,
|
|
146
|
+
"format": "avif"
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## Authentication
|
|
152
|
+
|
|
153
|
+
### API Token (Recommended)
|
|
154
|
+
|
|
155
|
+
Generate at: Dashboard → My Profile → API Tokens
|
|
156
|
+
|
|
157
|
+
Required permissions:
|
|
158
|
+
- Account → Cloudflare Images → Edit
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
curl -H "Authorization: Bearer {api_token}" \
|
|
162
|
+
https://api.cloudflare.com/client/v4/accounts/{account_id}/images/v1
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### API Key (Legacy)
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
curl -H "X-Auth-Email: {email}" \
|
|
169
|
+
-H "X-Auth-Key: {api_key}" \
|
|
170
|
+
https://api.cloudflare.com/client/v4/accounts/{account_id}/images/v1
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## Signed URLs
|
|
174
|
+
|
|
175
|
+
For private images, enable signed URLs:
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
# Upload with signed URLs required
|
|
179
|
+
curl -X POST \
|
|
180
|
+
https://api.cloudflare.com/client/v4/accounts/{account_id}/images/v1 \
|
|
181
|
+
-H "Authorization: Bearer {api_token}" \
|
|
182
|
+
-F file=@private.jpg \
|
|
183
|
+
-F requireSignedURLs=true
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
Generate signed URL:
|
|
187
|
+
|
|
188
|
+
```typescript
|
|
189
|
+
import { createHmac } from 'crypto';
|
|
190
|
+
|
|
191
|
+
function signUrl(imageId: string, variant: string, expiry: number, key: string): string {
|
|
192
|
+
const path = `/${imageId}/${variant}`;
|
|
193
|
+
const toSign = `${path}${expiry}`;
|
|
194
|
+
const signature = createHmac('sha256', key)
|
|
195
|
+
.update(toSign)
|
|
196
|
+
.digest('hex');
|
|
197
|
+
|
|
198
|
+
return `https://imagedelivery.net/{hash}${path}?exp=${expiry}&sig=${signature}`;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// Sign URL valid for 1 hour
|
|
202
|
+
const signedUrl = signUrl('image-id', 'public', Date.now() + 3600, env.SIGNING_KEY);
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
## Local Development
|
|
206
|
+
|
|
207
|
+
```bash
|
|
208
|
+
npx wrangler dev --remote
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
Must use `--remote` for Images binding access.
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Gotchas & Best Practices
|
|
2
|
+
|
|
3
|
+
## Fit Modes
|
|
4
|
+
|
|
5
|
+
| Mode | Best For | Behavior |
|
|
6
|
+
|------|----------|----------|
|
|
7
|
+
| `cover` | Hero images, thumbnails | Fills space, crops excess |
|
|
8
|
+
| `contain` | Product images, artwork | Preserves full image, may add padding |
|
|
9
|
+
| `scale-down` | User uploads | Never enlarges |
|
|
10
|
+
| `crop` | Precise crops | Uses gravity |
|
|
11
|
+
| `pad` | Fixed aspect ratio | Adds background |
|
|
12
|
+
|
|
13
|
+
## Format Selection
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
format: 'auto' // Recommended - negotiates best format
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
**Support:** AVIF (Chrome 85+, Firefox 93+, Safari 16.4+), WebP (Chrome 23+, Firefox 65+, Safari 14+)
|
|
20
|
+
|
|
21
|
+
## Quality Settings
|
|
22
|
+
|
|
23
|
+
| Use Case | Quality |
|
|
24
|
+
|----------|---------|
|
|
25
|
+
| Thumbnails | 75-80 |
|
|
26
|
+
| Standard | 85 (default) |
|
|
27
|
+
| High-quality | 90-95 |
|
|
28
|
+
|
|
29
|
+
## Common Errors
|
|
30
|
+
|
|
31
|
+
### 5403: "Image transformation failed"
|
|
32
|
+
- Verify `width`/`height` ≤ 12000
|
|
33
|
+
- Check `quality` 1-100, `dpr` 1-3
|
|
34
|
+
- Don't combine incompatible options
|
|
35
|
+
|
|
36
|
+
### 9413: "Rate limit exceeded"
|
|
37
|
+
Implement caching and exponential backoff:
|
|
38
|
+
```typescript
|
|
39
|
+
for (let i = 0; i < 3; i++) {
|
|
40
|
+
try { return await env.IMAGES.input(buffer).transform({...}).output(); }
|
|
41
|
+
catch { await new Promise(r => setTimeout(r, 2 ** i * 1000)); }
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### 5401: "Image too large"
|
|
46
|
+
Pre-process images before upload (max 100MB, 12000×12000px)
|
|
47
|
+
|
|
48
|
+
### 5400: "Invalid image format"
|
|
49
|
+
Supported: JPEG, PNG, GIF, WebP, AVIF, SVG
|
|
50
|
+
|
|
51
|
+
### 401/403: "Unauthorized"
|
|
52
|
+
Verify API token has `Cloudflare Images → Edit` permission
|
|
53
|
+
|
|
54
|
+
## Limits
|
|
55
|
+
|
|
56
|
+
| Resource | Limit |
|
|
57
|
+
|----------|-------|
|
|
58
|
+
| Max input size | 100MB |
|
|
59
|
+
| Max dimensions | 12000×12000px |
|
|
60
|
+
| Quality range | 1-100 |
|
|
61
|
+
| DPR range | 1-3 |
|
|
62
|
+
| API rate limit | ~1200 req/min |
|
|
63
|
+
|
|
64
|
+
## AVIF Gotchas
|
|
65
|
+
|
|
66
|
+
- **Slower encoding**: First request may have higher latency
|
|
67
|
+
- **Browser detection**:
|
|
68
|
+
```typescript
|
|
69
|
+
const format = /image\/avif/.test(request.headers.get('Accept') || '') ? 'avif' : 'webp';
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Anti-Patterns
|
|
73
|
+
|
|
74
|
+
```typescript
|
|
75
|
+
// ❌ No caching - transforms every request
|
|
76
|
+
return env.IMAGES.input(buffer).transform({...}).output().response();
|
|
77
|
+
|
|
78
|
+
// ❌ cover without both dimensions
|
|
79
|
+
transform({ width: 800, fit: 'cover' })
|
|
80
|
+
|
|
81
|
+
// ✅ Always set both for cover
|
|
82
|
+
transform({ width: 800, height: 600, fit: 'cover' })
|
|
83
|
+
|
|
84
|
+
// ❌ Exposes API token to client
|
|
85
|
+
// ✅ Use Direct Creator Upload (patterns.md)
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Debugging
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
// Check response headers
|
|
92
|
+
console.log('Content-Type:', response.headers.get('Content-Type'));
|
|
93
|
+
|
|
94
|
+
// Test with curl
|
|
95
|
+
// curl -I "https://imagedelivery.net/{hash}/{id}/width=800,format=avif"
|
|
96
|
+
|
|
97
|
+
// Monitor logs
|
|
98
|
+
// npx wrangler tail
|
|
99
|
+
```
|