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,240 @@
|
|
|
1
|
+
# API Reference
|
|
2
|
+
|
|
3
|
+
## Client-Side JavaScript API
|
|
4
|
+
|
|
5
|
+
The Turnstile JavaScript API is available at `window.turnstile` after loading the script.
|
|
6
|
+
|
|
7
|
+
### `turnstile.render(container, options)`
|
|
8
|
+
|
|
9
|
+
Renders a Turnstile widget into a container element.
|
|
10
|
+
|
|
11
|
+
**Parameters:**
|
|
12
|
+
- `container` (string | HTMLElement): CSS selector or DOM element
|
|
13
|
+
- `options` (TurnstileOptions): Configuration object (see [configuration.md](configuration.md))
|
|
14
|
+
|
|
15
|
+
**Returns:** `string` - Widget ID for use with other API methods
|
|
16
|
+
|
|
17
|
+
**Example:**
|
|
18
|
+
```javascript
|
|
19
|
+
const widgetId = window.turnstile.render('#my-container', {
|
|
20
|
+
sitekey: 'YOUR_SITE_KEY',
|
|
21
|
+
callback: (token) => console.log('Success:', token),
|
|
22
|
+
'error-callback': (code) => console.error('Error:', code)
|
|
23
|
+
});
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### `turnstile.reset(widgetId)`
|
|
27
|
+
|
|
28
|
+
Resets a widget (clears token, resets challenge state). Useful when form validation fails.
|
|
29
|
+
|
|
30
|
+
**Parameters:**
|
|
31
|
+
- `widgetId` (string): Widget ID from `render()`, or container element
|
|
32
|
+
|
|
33
|
+
**Returns:** `void`
|
|
34
|
+
|
|
35
|
+
**Example:**
|
|
36
|
+
```javascript
|
|
37
|
+
// Reset on form error
|
|
38
|
+
if (!validateForm()) {
|
|
39
|
+
window.turnstile.reset(widgetId);
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### `turnstile.remove(widgetId)`
|
|
44
|
+
|
|
45
|
+
Removes a widget from the DOM completely.
|
|
46
|
+
|
|
47
|
+
**Parameters:**
|
|
48
|
+
- `widgetId` (string): Widget ID from `render()`
|
|
49
|
+
|
|
50
|
+
**Returns:** `void`
|
|
51
|
+
|
|
52
|
+
**Example:**
|
|
53
|
+
```javascript
|
|
54
|
+
// Cleanup on navigation
|
|
55
|
+
window.turnstile.remove(widgetId);
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### `turnstile.getResponse(widgetId)`
|
|
59
|
+
|
|
60
|
+
Gets the current token from a widget (if challenge completed).
|
|
61
|
+
|
|
62
|
+
**Parameters:**
|
|
63
|
+
- `widgetId` (string): Widget ID from `render()`, or container element
|
|
64
|
+
|
|
65
|
+
**Returns:** `string | undefined` - Token string, or undefined if not ready
|
|
66
|
+
|
|
67
|
+
**Example:**
|
|
68
|
+
```javascript
|
|
69
|
+
const token = window.turnstile.getResponse(widgetId);
|
|
70
|
+
if (token) {
|
|
71
|
+
submitForm(token);
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### `turnstile.isExpired(widgetId)`
|
|
76
|
+
|
|
77
|
+
Checks if a widget's token has expired (>5 minutes old).
|
|
78
|
+
|
|
79
|
+
**Parameters:**
|
|
80
|
+
- `widgetId` (string): Widget ID from `render()`
|
|
81
|
+
|
|
82
|
+
**Returns:** `boolean` - True if expired
|
|
83
|
+
|
|
84
|
+
**Example:**
|
|
85
|
+
```javascript
|
|
86
|
+
if (window.turnstile.isExpired(widgetId)) {
|
|
87
|
+
window.turnstile.reset(widgetId);
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Callback Signatures
|
|
92
|
+
|
|
93
|
+
```typescript
|
|
94
|
+
type TurnstileCallback = (token: string) => void;
|
|
95
|
+
type ErrorCallback = (errorCode: string) => void;
|
|
96
|
+
type TimeoutCallback = () => void;
|
|
97
|
+
type ExpiredCallback = () => void;
|
|
98
|
+
type BeforeInteractiveCallback = () => void;
|
|
99
|
+
type AfterInteractiveCallback = () => void;
|
|
100
|
+
type UnsupportedCallback = () => void;
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Siteverify API (Server-Side)
|
|
104
|
+
|
|
105
|
+
**Endpoint:** `https://challenges.cloudflare.com/turnstile/v0/siteverify`
|
|
106
|
+
|
|
107
|
+
### Request
|
|
108
|
+
|
|
109
|
+
**Method:** POST
|
|
110
|
+
**Content-Type:** `application/json` or `application/x-www-form-urlencoded`
|
|
111
|
+
|
|
112
|
+
```typescript
|
|
113
|
+
interface SiteverifyRequest {
|
|
114
|
+
secret: string; // Your secret key (never expose client-side)
|
|
115
|
+
response: string; // Token from cf-turnstile-response
|
|
116
|
+
remoteip?: string; // User's IP (optional but recommended)
|
|
117
|
+
idempotency_key?: string; // Unique key for idempotent validation
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**Example:**
|
|
122
|
+
```javascript
|
|
123
|
+
// Cloudflare Workers
|
|
124
|
+
const result = await fetch('https://challenges.cloudflare.com/turnstile/v0/siteverify', {
|
|
125
|
+
method: 'POST',
|
|
126
|
+
headers: { 'Content-Type': 'application/json' },
|
|
127
|
+
body: JSON.stringify({
|
|
128
|
+
secret: env.TURNSTILE_SECRET,
|
|
129
|
+
response: token,
|
|
130
|
+
remoteip: request.headers.get('CF-Connecting-IP')
|
|
131
|
+
})
|
|
132
|
+
});
|
|
133
|
+
const data = await result.json();
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### Response
|
|
137
|
+
|
|
138
|
+
```typescript
|
|
139
|
+
interface SiteverifyResponse {
|
|
140
|
+
success: boolean; // Validation result
|
|
141
|
+
challenge_ts?: string; // ISO timestamp of challenge
|
|
142
|
+
hostname?: string; // Hostname where widget was solved
|
|
143
|
+
'error-codes'?: string[]; // Error codes if success=false
|
|
144
|
+
action?: string; // Action name from widget config
|
|
145
|
+
cdata?: string; // Custom data from widget config
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
**Example Success:**
|
|
150
|
+
```json
|
|
151
|
+
{
|
|
152
|
+
"success": true,
|
|
153
|
+
"challenge_ts": "2024-01-15T10:30:00Z",
|
|
154
|
+
"hostname": "example.com",
|
|
155
|
+
"action": "login",
|
|
156
|
+
"cdata": "user123"
|
|
157
|
+
}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
**Example Failure:**
|
|
161
|
+
```json
|
|
162
|
+
{
|
|
163
|
+
"success": false,
|
|
164
|
+
"error-codes": ["timeout-or-duplicate"]
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
## Error Codes
|
|
169
|
+
|
|
170
|
+
| Code | Cause | Solution |
|
|
171
|
+
|------|-------|----------|
|
|
172
|
+
| `missing-input-secret` | Secret key not provided | Include `secret` in request |
|
|
173
|
+
| `invalid-input-secret` | Secret key is wrong | Check secret key in dashboard |
|
|
174
|
+
| `missing-input-response` | Token not provided | Include `response` token |
|
|
175
|
+
| `invalid-input-response` | Token is invalid/malformed | Verify token from widget |
|
|
176
|
+
| `timeout-or-duplicate` | Token expired (>5min) or reused | Generate new token, validate once |
|
|
177
|
+
| `internal-error` | Cloudflare server error | Retry with exponential backoff |
|
|
178
|
+
| `bad-request` | Malformed request | Check JSON/form encoding |
|
|
179
|
+
|
|
180
|
+
## TypeScript Types
|
|
181
|
+
|
|
182
|
+
```typescript
|
|
183
|
+
interface TurnstileOptions {
|
|
184
|
+
sitekey: string;
|
|
185
|
+
action?: string;
|
|
186
|
+
cData?: string;
|
|
187
|
+
callback?: (token: string) => void;
|
|
188
|
+
'error-callback'?: (errorCode: string) => void;
|
|
189
|
+
'expired-callback'?: () => void;
|
|
190
|
+
'timeout-callback'?: () => void;
|
|
191
|
+
'before-interactive-callback'?: () => void;
|
|
192
|
+
'after-interactive-callback'?: () => void;
|
|
193
|
+
'unsupported-callback'?: () => void;
|
|
194
|
+
theme?: 'light' | 'dark' | 'auto';
|
|
195
|
+
size?: 'normal' | 'compact' | 'flexible';
|
|
196
|
+
tabindex?: number;
|
|
197
|
+
'response-field'?: boolean;
|
|
198
|
+
'response-field-name'?: string;
|
|
199
|
+
retry?: 'auto' | 'never';
|
|
200
|
+
'retry-interval'?: number;
|
|
201
|
+
language?: string;
|
|
202
|
+
execution?: 'render' | 'execute';
|
|
203
|
+
appearance?: 'always' | 'execute' | 'interaction-only';
|
|
204
|
+
'refresh-expired'?: 'auto' | 'manual' | 'never';
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
interface Turnstile {
|
|
208
|
+
render(container: string | HTMLElement, options: TurnstileOptions): string;
|
|
209
|
+
reset(widgetId: string): void;
|
|
210
|
+
remove(widgetId: string): void;
|
|
211
|
+
getResponse(widgetId: string): string | undefined;
|
|
212
|
+
isExpired(widgetId: string): boolean;
|
|
213
|
+
execute(container?: string | HTMLElement, options?: TurnstileOptions): void;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
declare global {
|
|
217
|
+
interface Window {
|
|
218
|
+
turnstile: Turnstile;
|
|
219
|
+
onloadTurnstileCallback?: () => void;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
## Script Loading
|
|
225
|
+
|
|
226
|
+
```html
|
|
227
|
+
<!-- Standard -->
|
|
228
|
+
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
|
|
229
|
+
|
|
230
|
+
<!-- Explicit render mode -->
|
|
231
|
+
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit"></script>
|
|
232
|
+
|
|
233
|
+
<!-- With load callback -->
|
|
234
|
+
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js?onload=onloadTurnstileCallback"></script>
|
|
235
|
+
<script>
|
|
236
|
+
window.onloadTurnstileCallback = () => {
|
|
237
|
+
window.turnstile.render('#container', { sitekey: 'YOUR_SITE_KEY' });
|
|
238
|
+
};
|
|
239
|
+
</script>
|
|
240
|
+
```
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
# Configuration
|
|
2
|
+
|
|
3
|
+
## Script Loading
|
|
4
|
+
|
|
5
|
+
### Basic (Implicit Rendering)
|
|
6
|
+
```html
|
|
7
|
+
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
|
|
8
|
+
```
|
|
9
|
+
Automatically renders widgets with `class="cf-turnstile"` on page load.
|
|
10
|
+
|
|
11
|
+
### Explicit Rendering
|
|
12
|
+
```html
|
|
13
|
+
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit"></script>
|
|
14
|
+
```
|
|
15
|
+
Manual control over when/where widgets render via `window.turnstile.render()`.
|
|
16
|
+
|
|
17
|
+
### With Load Callback
|
|
18
|
+
```html
|
|
19
|
+
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js?onload=myCallback"></script>
|
|
20
|
+
<script>
|
|
21
|
+
function myCallback() {
|
|
22
|
+
// API ready
|
|
23
|
+
window.turnstile.render('#container', { sitekey: 'YOUR_SITE_KEY' });
|
|
24
|
+
}
|
|
25
|
+
</script>
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Compatibility Mode
|
|
29
|
+
```html
|
|
30
|
+
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js?compat=recaptcha"></script>
|
|
31
|
+
```
|
|
32
|
+
Provides `grecaptcha` API for Google reCAPTCHA drop-in replacement.
|
|
33
|
+
|
|
34
|
+
## Widget Configuration
|
|
35
|
+
|
|
36
|
+
### Complete Options Object
|
|
37
|
+
|
|
38
|
+
```javascript
|
|
39
|
+
{
|
|
40
|
+
// Required
|
|
41
|
+
sitekey: 'YOUR_SITE_KEY', // Widget sitekey from dashboard
|
|
42
|
+
|
|
43
|
+
// Callbacks
|
|
44
|
+
callback: (token) => {}, // Success - token ready
|
|
45
|
+
'error-callback': (code) => {}, // Error occurred
|
|
46
|
+
'expired-callback': () => {}, // Token expired (>5min)
|
|
47
|
+
'timeout-callback': () => {}, // Challenge timeout
|
|
48
|
+
'before-interactive-callback': () => {}, // Before showing checkbox
|
|
49
|
+
'after-interactive-callback': () => {}, // After user interacts
|
|
50
|
+
'unsupported-callback': () => {}, // Browser doesn't support Turnstile
|
|
51
|
+
|
|
52
|
+
// Appearance
|
|
53
|
+
theme: 'auto', // 'light' | 'dark' | 'auto'
|
|
54
|
+
size: 'normal', // 'normal' | 'compact' | 'flexible'
|
|
55
|
+
tabindex: 0, // Tab order (accessibility)
|
|
56
|
+
language: 'auto', // ISO 639-1 code or 'auto'
|
|
57
|
+
|
|
58
|
+
// Behavior
|
|
59
|
+
execution: 'render', // 'render' (auto) | 'execute' (manual)
|
|
60
|
+
appearance: 'always', // 'always' | 'execute' | 'interaction-only'
|
|
61
|
+
retry: 'auto', // 'auto' | 'never'
|
|
62
|
+
'retry-interval': 8000, // Retry interval (ms), default 8000
|
|
63
|
+
'refresh-expired': 'auto', // 'auto' | 'manual' | 'never'
|
|
64
|
+
|
|
65
|
+
// Form Integration
|
|
66
|
+
'response-field': true, // Add hidden input (default: true)
|
|
67
|
+
'response-field-name': 'cf-turnstile-response', // Hidden input name
|
|
68
|
+
|
|
69
|
+
// Analytics & Data
|
|
70
|
+
action: 'login', // Action name (for analytics)
|
|
71
|
+
cData: 'user-session-123', // Custom data (returned in siteverify)
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Key Options Explained
|
|
76
|
+
|
|
77
|
+
**`execution`:**
|
|
78
|
+
- `'render'` (default): Challenge starts immediately on render
|
|
79
|
+
- `'execute'`: Wait for `turnstile.execute()` call
|
|
80
|
+
|
|
81
|
+
**`appearance`:**
|
|
82
|
+
- `'always'` (default): Widget always visible
|
|
83
|
+
- `'execute'`: Hidden until `execute()` called
|
|
84
|
+
- `'interaction-only'`: Hidden until user interaction needed
|
|
85
|
+
|
|
86
|
+
**`refresh-expired`:**
|
|
87
|
+
- `'auto'` (default): Auto-refresh expired tokens
|
|
88
|
+
- `'manual'`: App must call `reset()` after expiry
|
|
89
|
+
- `'never'`: No refresh, expired-callback triggered
|
|
90
|
+
|
|
91
|
+
**`retry`:**
|
|
92
|
+
- `'auto'` (default): Auto-retry failed challenges
|
|
93
|
+
- `'never'`: Don't retry, trigger error-callback
|
|
94
|
+
|
|
95
|
+
## HTML Data Attributes
|
|
96
|
+
|
|
97
|
+
For implicit rendering, use data attributes on `<div class="cf-turnstile">`:
|
|
98
|
+
|
|
99
|
+
| JavaScript Property | HTML Data Attribute | Example |
|
|
100
|
+
|---------------------|---------------------|---------|
|
|
101
|
+
| `sitekey` | `data-sitekey` | `data-sitekey="YOUR_KEY"` |
|
|
102
|
+
| `action` | `data-action` | `data-action="login"` |
|
|
103
|
+
| `cData` | `data-cdata` | `data-cdata="session-123"` |
|
|
104
|
+
| `callback` | `data-callback` | `data-callback="onSuccess"` |
|
|
105
|
+
| `error-callback` | `data-error-callback` | `data-error-callback="onError"` |
|
|
106
|
+
| `expired-callback` | `data-expired-callback` | `data-expired-callback="onExpired"` |
|
|
107
|
+
| `timeout-callback` | `data-timeout-callback` | `data-timeout-callback="onTimeout"` |
|
|
108
|
+
| `theme` | `data-theme` | `data-theme="dark"` |
|
|
109
|
+
| `size` | `data-size` | `data-size="compact"` |
|
|
110
|
+
| `tabindex` | `data-tabindex` | `data-tabindex="0"` |
|
|
111
|
+
| `response-field` | `data-response-field` | `data-response-field="false"` |
|
|
112
|
+
| `response-field-name` | `data-response-field-name` | `data-response-field-name="token"` |
|
|
113
|
+
| `retry` | `data-retry` | `data-retry="never"` |
|
|
114
|
+
| `retry-interval` | `data-retry-interval` | `data-retry-interval="5000"` |
|
|
115
|
+
| `language` | `data-language` | `data-language="en"` |
|
|
116
|
+
| `execution` | `data-execution` | `data-execution="execute"` |
|
|
117
|
+
| `appearance` | `data-appearance` | `data-appearance="interaction-only"` |
|
|
118
|
+
| `refresh-expired` | `data-refresh-expired` | `data-refresh-expired="manual"` |
|
|
119
|
+
|
|
120
|
+
**Example:**
|
|
121
|
+
```html
|
|
122
|
+
<div class="cf-turnstile"
|
|
123
|
+
data-sitekey="YOUR_SITE_KEY"
|
|
124
|
+
data-theme="dark"
|
|
125
|
+
data-callback="onTurnstileSuccess"
|
|
126
|
+
data-error-callback="onTurnstileError"></div>
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## Content Security Policy
|
|
130
|
+
|
|
131
|
+
Add these directives to CSP header/meta tag:
|
|
132
|
+
|
|
133
|
+
```
|
|
134
|
+
script-src https://challenges.cloudflare.com;
|
|
135
|
+
frame-src https://challenges.cloudflare.com;
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
**Full Example:**
|
|
139
|
+
```html
|
|
140
|
+
<meta http-equiv="Content-Security-Policy"
|
|
141
|
+
content="default-src 'self';
|
|
142
|
+
script-src 'self' https://challenges.cloudflare.com;
|
|
143
|
+
frame-src https://challenges.cloudflare.com;">
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## Framework-Specific Setup
|
|
147
|
+
|
|
148
|
+
### React
|
|
149
|
+
```bash
|
|
150
|
+
npm install @marsidev/react-turnstile
|
|
151
|
+
```
|
|
152
|
+
```jsx
|
|
153
|
+
import Turnstile from '@marsidev/react-turnstile';
|
|
154
|
+
|
|
155
|
+
<Turnstile
|
|
156
|
+
siteKey="YOUR_SITE_KEY"
|
|
157
|
+
onSuccess={(token) => console.log(token)}
|
|
158
|
+
/>
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### Vue
|
|
162
|
+
```bash
|
|
163
|
+
npm install vue-turnstile
|
|
164
|
+
```
|
|
165
|
+
```vue
|
|
166
|
+
<template>
|
|
167
|
+
<VueTurnstile site-key="YOUR_SITE_KEY" @success="onSuccess" />
|
|
168
|
+
</template>
|
|
169
|
+
<script setup>
|
|
170
|
+
import VueTurnstile from 'vue-turnstile';
|
|
171
|
+
</script>
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### Svelte
|
|
175
|
+
```bash
|
|
176
|
+
npm install svelte-turnstile
|
|
177
|
+
```
|
|
178
|
+
```svelte
|
|
179
|
+
<script>
|
|
180
|
+
import Turnstile from 'svelte-turnstile';
|
|
181
|
+
</script>
|
|
182
|
+
<Turnstile siteKey="YOUR_SITE_KEY" on:turnstile-callback={handleToken} />
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### Next.js (App Router)
|
|
186
|
+
```tsx
|
|
187
|
+
// app/components/TurnstileWidget.tsx
|
|
188
|
+
'use client';
|
|
189
|
+
import { useEffect, useRef } from 'react';
|
|
190
|
+
|
|
191
|
+
export default function TurnstileWidget({ sitekey, onSuccess }) {
|
|
192
|
+
const ref = useRef<HTMLDivElement>(null);
|
|
193
|
+
|
|
194
|
+
useEffect(() => {
|
|
195
|
+
if (ref.current && window.turnstile) {
|
|
196
|
+
const widgetId = window.turnstile.render(ref.current, {
|
|
197
|
+
sitekey,
|
|
198
|
+
callback: onSuccess
|
|
199
|
+
});
|
|
200
|
+
return () => window.turnstile.remove(widgetId);
|
|
201
|
+
}
|
|
202
|
+
}, [sitekey, onSuccess]);
|
|
203
|
+
|
|
204
|
+
return <div ref={ref} />;
|
|
205
|
+
}
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## Cloudflare Pages Plugin
|
|
209
|
+
|
|
210
|
+
```bash
|
|
211
|
+
npm install @cloudflare/pages-plugin-turnstile
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
```typescript
|
|
215
|
+
// functions/_middleware.ts
|
|
216
|
+
import turnstilePlugin from '@cloudflare/pages-plugin-turnstile';
|
|
217
|
+
|
|
218
|
+
export const onRequest = turnstilePlugin({
|
|
219
|
+
secret: 'YOUR_SECRET_KEY',
|
|
220
|
+
onError: () => new Response('CAPTCHA failed', { status: 403 })
|
|
221
|
+
});
|
|
222
|
+
```
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
# Troubleshooting & Gotchas
|
|
2
|
+
|
|
3
|
+
## Critical Rules
|
|
4
|
+
|
|
5
|
+
### ❌ Skipping Server-Side Validation
|
|
6
|
+
**Problem:** Client-only validation is easily bypassed.
|
|
7
|
+
|
|
8
|
+
**Solution:** Always validate on server.
|
|
9
|
+
```javascript
|
|
10
|
+
// CORRECT - Server validates token
|
|
11
|
+
app.post('/submit', async (req, res) => {
|
|
12
|
+
const token = req.body['cf-turnstile-response'];
|
|
13
|
+
const validation = await fetch('https://challenges.cloudflare.com/turnstile/v0/siteverify', {
|
|
14
|
+
method: 'POST',
|
|
15
|
+
body: JSON.stringify({ secret: SECRET, response: token })
|
|
16
|
+
}).then(r => r.json());
|
|
17
|
+
|
|
18
|
+
if (!validation.success) return res.status(403).json({ error: 'CAPTCHA failed' });
|
|
19
|
+
});
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### ❌ Exposing Secret Key
|
|
23
|
+
**Problem:** Secret key leaked in client-side code.
|
|
24
|
+
|
|
25
|
+
**Solution:** Server-side validation only. Never send secret to client.
|
|
26
|
+
|
|
27
|
+
### ❌ Reusing Tokens (Single-Use Rule)
|
|
28
|
+
**Problem:** Tokens are single-use. Revalidation fails with `timeout-or-duplicate`.
|
|
29
|
+
|
|
30
|
+
**Solution:** Generate new token for each submission. Reset widget on error.
|
|
31
|
+
```javascript
|
|
32
|
+
if (!response.ok) window.turnstile.reset(widgetId);
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### ❌ Not Handling Token Expiry
|
|
36
|
+
**Problem:** Tokens expire after 5 minutes.
|
|
37
|
+
|
|
38
|
+
**Solution:** Handle expiry callback or use auto-refresh.
|
|
39
|
+
```javascript
|
|
40
|
+
window.turnstile.render('#container', {
|
|
41
|
+
sitekey: 'YOUR_SITE_KEY',
|
|
42
|
+
'refresh-expired': 'auto', // or 'manual' with expired-callback
|
|
43
|
+
'expired-callback': () => window.turnstile.reset(widgetId)
|
|
44
|
+
});
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Common Errors
|
|
48
|
+
|
|
49
|
+
| Error | Cause | Solution |
|
|
50
|
+
|-------|-------|----------|
|
|
51
|
+
| **Widget not rendering** | Incorrect sitekey, CSP blocking, file:// protocol | Check sitekey, add CSP for challenges.cloudflare.com, use http:// |
|
|
52
|
+
| **timeout-or-duplicate** | Token expired (>5min) or reused | Generate fresh token, don't cache >5min |
|
|
53
|
+
| **invalid-input-secret** | Wrong secret key | Verify secret from dashboard, check env vars |
|
|
54
|
+
| **missing-input-response** | Token not sent | Check form field name is 'cf-turnstile-response' |
|
|
55
|
+
|
|
56
|
+
## Framework Gotchas
|
|
57
|
+
|
|
58
|
+
### React: Widget Re-mounting
|
|
59
|
+
**Problem:** Widget re-renders on state change, losing token.
|
|
60
|
+
|
|
61
|
+
**Solution:** Control lifecycle with useRef.
|
|
62
|
+
```tsx
|
|
63
|
+
function TurnstileWidget({ onToken }) {
|
|
64
|
+
const containerRef = useRef(null);
|
|
65
|
+
const widgetIdRef = useRef(null);
|
|
66
|
+
|
|
67
|
+
useEffect(() => {
|
|
68
|
+
if (containerRef.current && !widgetIdRef.current) {
|
|
69
|
+
widgetIdRef.current = window.turnstile.render(containerRef.current, {
|
|
70
|
+
sitekey: 'YOUR_SITE_KEY',
|
|
71
|
+
callback: onToken
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
return () => {
|
|
75
|
+
if (widgetIdRef.current) {
|
|
76
|
+
window.turnstile.remove(widgetIdRef.current);
|
|
77
|
+
widgetIdRef.current = null;
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
}, []);
|
|
81
|
+
|
|
82
|
+
return <div ref={containerRef} />;
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### React StrictMode: Double Render
|
|
87
|
+
**Problem:** Widget renders twice in dev due to StrictMode.
|
|
88
|
+
|
|
89
|
+
**Solution:** Use cleanup function.
|
|
90
|
+
```tsx
|
|
91
|
+
useEffect(() => {
|
|
92
|
+
const widgetId = window.turnstile.render('#container', { sitekey });
|
|
93
|
+
return () => window.turnstile.remove(widgetId);
|
|
94
|
+
}, []);
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Next.js: SSR Hydration
|
|
98
|
+
**Problem:** `window.turnstile` undefined during SSR.
|
|
99
|
+
|
|
100
|
+
**Solution:** Use `'use client'` or dynamic import with `ssr: false`.
|
|
101
|
+
```tsx
|
|
102
|
+
'use client';
|
|
103
|
+
export default function Turnstile() { /* component */ }
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### SPA: Navigation Without Cleanup
|
|
107
|
+
**Problem:** Navigating leaves orphaned widgets.
|
|
108
|
+
|
|
109
|
+
**Solution:** Remove widget in cleanup.
|
|
110
|
+
```javascript
|
|
111
|
+
// Vue
|
|
112
|
+
onBeforeUnmount(() => window.turnstile.remove(widgetId));
|
|
113
|
+
|
|
114
|
+
// React
|
|
115
|
+
useEffect(() => () => window.turnstile.remove(widgetId), []);
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Network & Security
|
|
119
|
+
|
|
120
|
+
### CSP Blocking
|
|
121
|
+
**Problem:** Content Security Policy blocks script/iframe.
|
|
122
|
+
|
|
123
|
+
**Solution:** Add CSP directives.
|
|
124
|
+
```html
|
|
125
|
+
<meta http-equiv="Content-Security-Policy"
|
|
126
|
+
content="script-src 'self' https://challenges.cloudflare.com;
|
|
127
|
+
frame-src https://challenges.cloudflare.com;">
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### IP Address Forwarding
|
|
131
|
+
**Problem:** Server receives proxy IP instead of client IP.
|
|
132
|
+
|
|
133
|
+
**Solution:** Use correct header.
|
|
134
|
+
```javascript
|
|
135
|
+
// Cloudflare Workers
|
|
136
|
+
const ip = request.headers.get('CF-Connecting-IP');
|
|
137
|
+
|
|
138
|
+
// Behind proxy
|
|
139
|
+
const ip = request.headers.get('X-Forwarded-For')?.split(',')[0];
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### CORS (Siteverify)
|
|
143
|
+
**Problem:** CORS error calling siteverify from browser.
|
|
144
|
+
|
|
145
|
+
**Solution:** Never call siteverify client-side. Call your backend, backend calls siteverify.
|
|
146
|
+
|
|
147
|
+
## Limits & Constraints
|
|
148
|
+
|
|
149
|
+
| Limit | Value | Impact |
|
|
150
|
+
|-------|-------|--------|
|
|
151
|
+
| Token validity | 5 minutes | Must regenerate after expiry |
|
|
152
|
+
| Token use | Single-use | Cannot revalidate same token |
|
|
153
|
+
| Widget size | 300x65px (normal), 130x120px (compact) | Plan layout |
|
|
154
|
+
|
|
155
|
+
## Debugging
|
|
156
|
+
|
|
157
|
+
### Console Logging
|
|
158
|
+
```javascript
|
|
159
|
+
window.turnstile.render('#container', {
|
|
160
|
+
sitekey: 'YOUR_SITE_KEY',
|
|
161
|
+
callback: (token) => console.log('✓ Token:', token),
|
|
162
|
+
'error-callback': (code) => console.error('✗ Error:', code),
|
|
163
|
+
'expired-callback': () => console.warn('⏱ Expired'),
|
|
164
|
+
'timeout-callback': () => console.warn('⏱ Timeout')
|
|
165
|
+
});
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### Check Token State
|
|
169
|
+
```javascript
|
|
170
|
+
const token = window.turnstile.getResponse(widgetId);
|
|
171
|
+
console.log('Token:', token || 'NOT READY');
|
|
172
|
+
console.log('Expired:', window.turnstile.isExpired(widgetId));
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Test Keys (Use First)
|
|
176
|
+
Always develop with test keys before production:
|
|
177
|
+
- Site: `1x00000000000000000000AA`
|
|
178
|
+
- Secret: `1x0000000000000000000000000000000AA`
|
|
179
|
+
|
|
180
|
+
### Network Tab
|
|
181
|
+
- Verify `api.js` loads (200 OK)
|
|
182
|
+
- Check siteverify request/response
|
|
183
|
+
- Look for 4xx/5xx errors
|
|
184
|
+
|
|
185
|
+
## Misconfigurations
|
|
186
|
+
|
|
187
|
+
### Wrong Key Pairing
|
|
188
|
+
**Problem:** Site key from one widget, secret from another.
|
|
189
|
+
|
|
190
|
+
**Solution:** Verify site key and secret are from same widget in dashboard.
|
|
191
|
+
|
|
192
|
+
### Test Keys in Production
|
|
193
|
+
**Problem:** Using test keys in production.
|
|
194
|
+
|
|
195
|
+
**Solution:** Environment-based keys.
|
|
196
|
+
```javascript
|
|
197
|
+
const SITE_KEY = process.env.NODE_ENV === 'production'
|
|
198
|
+
? process.env.TURNSTILE_SITE_KEY
|
|
199
|
+
: '1x00000000000000000000AA';
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### Missing Environment Variables
|
|
203
|
+
**Problem:** Secret undefined on server.
|
|
204
|
+
|
|
205
|
+
**Solution:** Check .env and verify loading.
|
|
206
|
+
```bash
|
|
207
|
+
# .env
|
|
208
|
+
TURNSTILE_SECRET=your_secret_here
|
|
209
|
+
|
|
210
|
+
# Verify
|
|
211
|
+
console.log('Secret loaded:', !!process.env.TURNSTILE_SECRET);
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
## Reference
|
|
215
|
+
|
|
216
|
+
- [Turnstile Docs](https://developers.cloudflare.com/turnstile/)
|
|
217
|
+
- [Dashboard](https://dash.cloudflare.com/?to=/:account/turnstile)
|
|
218
|
+
- [Error Codes](https://developers.cloudflare.com/turnstile/troubleshooting/)
|