{"_id":"@battlefieldduck/turnstile-svelte","_rev":"4-e86eac5886d48169777431d5348b3f38","name":"@battlefieldduck/turnstile-svelte","dist-tags":{"latest":"1.0.1"},"versions":{"0.0.1":{"name":"@battlefieldduck/turnstile-svelte","version":"0.0.1","keywords":["svelte","sveltekit","turnstile","cloudflare","captcha"],"license":"MIT","_id":"@battlefieldduck/turnstile-svelte@0.0.1","maintainers":[{"name":"battlefieldduck","email":"hkdsethomas@gmail.com"}],"homepage":"https://battlefieldduck.github.io/turnstile-svelte","bugs":{"url":"https://github.com/BattlefieldDuck/turnstile-svelte/issues"},"dist":{"shasum":"c70344d22369623ce5dfb48976befb81cbdc648f","tarball":"https://registry.npmjs.org/@battlefieldduck/turnstile-svelte/-/turnstile-svelte-0.0.1.tgz","fileCount":11,"integrity":"sha512-7zTAmxxpVpziaWfiIzas1aw/8N3/iMkxoLDR3Djf/OAGddMh93Yj7Fp8Wu7N7PFV+KUK3d2lVNbNf//bkoQ9rA==","signatures":[{"sig":"MEUCIH5qc7UulyEVLujcchI18ekeqPOLs/tS4PAzVEBqvGyKAiEAwi7dkFJFZ6ARBjLdCOMGetuyE1+r4ROrE6Qd+GJoQI4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@battlefieldduck%2fturnstile-svelte@0.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":15890},"type":"module","types":"./dist/index.d.ts","svelte":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","svelte":"./dist/index.js","default":"./dist/index.js"},"./server":{"types":"./dist/server.d.ts","default":"./dist/server.js"}},"gitHead":"14694f0bbffaf44f2736815ebead5007c9f103b4","scripts":{"dev":"vite dev","lint":"prettier --check . && eslint .","test":"npm run test:unit -- --run && npm run test:e2e","build":"vite build && npm run prepack","check":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json","format":"prettier --write .","prepack":"svelte-kit sync && svelte-package && publint","prepare":"svelte-kit sync || echo ''","preview":"vite preview","test:e2e":"playwright test","test:unit":"vitest","check:watch":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch"},"_npmUser":{"name":"battlefieldduck","email":"hkdsethomas@gmail.com"},"repository":{"url":"git+https://github.com/BattlefieldDuck/turnstile-svelte.git","type":"git"},"_npmVersion":"10.8.2","description":"Simple and declarative Cloudflare Turnstile integration for Svelte & SvelteKit.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"20.19.3","_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.4","eslint":"^9.18.0","svelte":"^5.0.0","vitest":"^3.2.3","globals":"^16.0.0","publint":"^0.3.2","prettier":"^3.4.2","@eslint/js":"^9.18.0","playwright":"^1.53.0","typescript":"^5.0.0","svelte-check":"^4.0.0","@sveltejs/kit":"^2.22.0","@eslint/compat":"^1.2.5","@vitest/browser":"^3.2.3","@playwright/test":"^1.49.1","@sveltejs/package":"^2.0.0","typescript-eslint":"^8.20.0","eslint-plugin-svelte":"^3.0.0","vitest-browser-svelte":"^0.1.0","@sveltejs/adapter-auto":"^6.0.0","eslint-config-prettier":"^10.0.1","prettier-plugin-svelte":"^3.3.3","@sveltejs/adapter-static":"^3.0.8","vite-plugin-devtools-json":"^0.2.0","@sveltejs/vite-plugin-svelte":"^6.0.0"},"peerDependencies":{"svelte":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/turnstile-svelte_0.0.1_1753054709890_0.9550702245921798","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@battlefieldduck/turnstile-svelte","version":"0.0.2","keywords":["svelte","sveltekit","turnstile","cloudflare","captcha"],"license":"MIT","_id":"@battlefieldduck/turnstile-svelte@0.0.2","maintainers":[{"name":"battlefieldduck","email":"hkdsethomas@gmail.com"}],"homepage":"https://battlefieldduck.github.io/turnstile-svelte","bugs":{"url":"https://github.com/BattlefieldDuck/turnstile-svelte/issues"},"dist":{"shasum":"3feac107ff6f131bf70c2646d22e9142501d8108","tarball":"https://registry.npmjs.org/@battlefieldduck/turnstile-svelte/-/turnstile-svelte-0.0.2.tgz","fileCount":15,"integrity":"sha512-sRoi57A/JPOxGbx8FeMjRfeRCScGlZ01INg5J8I2xAZuzRpKuY1lntEVswBggHV0Ma50ZjWLQEJDhQ4rkvBZJw==","signatures":[{"sig":"MEUCIQCQEjPVTtQCX5NJVApxnavsdqdUsmSux28bSZbw4qWqXwIgEZyzS8xG2/4AvYwMp7Hr2hlUWVdC1HdUQsG9ZWJ5LgY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@battlefieldduck%2fturnstile-svelte@0.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":16325},"type":"module","types":"./dist/index.d.ts","svelte":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","svelte":"./dist/index.js","default":"./dist/index.js"},"./server":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.js"}},"gitHead":"df2234ba5cf36f6c20f7387cdf4ae3b909d79d1f","scripts":{"dev":"vite dev","lint":"prettier --check . && eslint .","test":"npm run test:unit -- --run && npm run test:e2e","build":"vite build && npm run prepack","check":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json","format":"prettier --write .","prepack":"svelte-kit sync && svelte-package && publint","prepare":"svelte-kit sync || echo ''","preview":"vite preview","test:e2e":"playwright test","test:unit":"vitest","check:watch":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch"},"_npmUser":{"name":"battlefieldduck","email":"hkdsethomas@gmail.com"},"repository":{"url":"git+https://github.com/BattlefieldDuck/turnstile-svelte.git","type":"git"},"_npmVersion":"10.8.2","description":"Simple and declarative Cloudflare Turnstile integration for Svelte & SvelteKit.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"20.19.3","_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.4","eslint":"^9.18.0","svelte":"^5.0.0","vitest":"^3.2.3","globals":"^16.0.0","publint":"^0.3.2","prettier":"^3.4.2","@eslint/js":"^9.18.0","playwright":"^1.53.0","typescript":"^5.0.0","svelte-check":"^4.0.0","@sveltejs/kit":"^2.22.0","@eslint/compat":"^1.2.5","@vitest/browser":"^3.2.3","@playwright/test":"^1.49.1","@sveltejs/package":"^2.0.0","typescript-eslint":"^8.20.0","eslint-plugin-svelte":"^3.0.0","vitest-browser-svelte":"^0.1.0","@sveltejs/adapter-auto":"^6.0.0","eslint-config-prettier":"^10.0.1","prettier-plugin-svelte":"^3.3.3","@sveltejs/adapter-static":"^3.0.8","vite-plugin-devtools-json":"^0.2.0","@sveltejs/vite-plugin-svelte":"^6.0.0"},"peerDependencies":{"svelte":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/turnstile-svelte_0.0.2_1753059311108_0.5812337134165044","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@battlefieldduck/turnstile-svelte","version":"1.0.0","keywords":["svelte","sveltekit","turnstile","cloudflare","captcha"],"license":"MIT","_id":"@battlefieldduck/turnstile-svelte@1.0.0","maintainers":[{"name":"battlefieldduck","email":"hkdsethomas@gmail.com"}],"homepage":"https://battlefieldduck.github.io/turnstile-svelte","bugs":{"url":"https://github.com/BattlefieldDuck/turnstile-svelte/issues"},"dist":{"shasum":"bfbec09234fa6669556a209e0d63fced3b71418e","tarball":"https://registry.npmjs.org/@battlefieldduck/turnstile-svelte/-/turnstile-svelte-1.0.0.tgz","fileCount":15,"integrity":"sha512-YwqCRAFQx41gxPiCS5E0q4/e/7tW9S0+b1FBdAFHn2Kj5Kny/BguL71PXfQT7u7cWt2m7vT7V2WhjQmSeT4LZw==","signatures":[{"sig":"MEYCIQDRN/TgElHUrWJg5WKMs42ZZM2JDj0HlpAAyO/fYUwwJAIhAJ5GTurSSRnhm7WaYO3gDvLFLMRjfG2m6MZ3P24wJddF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@battlefieldduck%2fturnstile-svelte@1.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":17603},"type":"module","types":"./dist/index.d.ts","svelte":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","svelte":"./dist/index.js","default":"./dist/index.js"},"./server":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.js"}},"gitHead":"fedd61addd96b44d6bcf0518fdbe807c5c327b1c","scripts":{"dev":"vite dev","lint":"prettier --check . && eslint .","test":"npm run test:unit -- --run && npm run test:e2e","build":"vite build && npm run prepack","check":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json","format":"prettier --write .","prepack":"svelte-kit sync && svelte-package && publint","prepare":"svelte-kit sync || echo ''","preview":"vite preview","test:e2e":"playwright test","test:unit":"vitest","check:watch":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8b6ec221-2b56-4972-b6bc-07a766670c18"}},"repository":{"url":"git+https://github.com/BattlefieldDuck/turnstile-svelte.git","type":"git"},"_npmVersion":"11.6.1","description":"Simple and declarative Cloudflare Turnstile integration for Svelte & SvelteKit.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.19.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^7.1.7","eslint":"^9.36.0","svelte":"^5.39.6","vitest":"^3.2.4","globals":"^16.4.0","publint":"^0.3.13","prettier":"^3.6.2","@eslint/js":"^9.36.0","playwright":"^1.55.1","typescript":"^5.9.2","svelte-check":"^4.3.2","@sveltejs/kit":"^2.43.5","@eslint/compat":"^1.4.0","@vitest/browser":"^3.2.4","@playwright/test":"^1.55.1","@sveltejs/package":"^2.5.4","typescript-eslint":"^8.44.1","eslint-plugin-svelte":"^3.12.4","vitest-browser-svelte":"^0.1.0","@sveltejs/adapter-auto":"^6.1.0","eslint-config-prettier":"^10.1.8","prettier-plugin-svelte":"^3.4.0","@sveltejs/adapter-static":"^3.0.9","vite-plugin-devtools-json":"^0.2.1","@sveltejs/vite-plugin-svelte":"^6.2.1"},"peerDependencies":{"svelte":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/turnstile-svelte_1.0.0_1759106741876_0.5463615483801203","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@battlefieldduck/turnstile-svelte","version":"1.0.1","description":"Simple and declarative Cloudflare Turnstile integration for Svelte & SvelteKit.","license":"MIT","repository":{"type":"git","url":"git+https://github.com/BattlefieldDuck/turnstile-svelte.git"},"bugs":{"url":"https://github.com/BattlefieldDuck/turnstile-svelte/issues"},"homepage":"https://battlefieldduck.github.io/turnstile-svelte","scripts":{"dev":"vite dev","build":"vite build && npm run prepack","preview":"vite preview","prepare":"svelte-kit sync || echo ''","prepack":"svelte-kit sync && svelte-package && publint","check":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json","check:watch":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch","format":"prettier --write .","lint":"prettier --check . && eslint .","test:unit":"vitest","test":"npm run test:unit -- --run && npm run test:e2e","test:e2e":"playwright test"},"sideEffects":["**/*.css"],"svelte":"./dist/index.js","types":"./dist/index.d.ts","type":"module","exports":{".":{"types":"./dist/index.d.ts","svelte":"./dist/index.js","default":"./dist/index.js"},"./server":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.js"}},"peerDependencies":{"svelte":"^5.0.0"},"devDependencies":{"@eslint/compat":"^2.0.1","@eslint/js":"^9.38.0","@playwright/test":"^1.56.1","@sveltejs/adapter-auto":"^7.0.0","@sveltejs/adapter-static":"^3.0.10","@sveltejs/kit":"^2.49.5","@sveltejs/package":"^2.5.4","@sveltejs/vite-plugin-svelte":"^6.2.1","@vitest/browser":"^4.0.17","@vitest/browser-playwright":"^4.0.17","eslint":"^9.38.0","eslint-config-prettier":"^10.1.8","eslint-plugin-svelte":"^3.12.5","globals":"^17.0.0","playwright":"^1.55.1","prettier":"^3.6.2","prettier-plugin-svelte":"^3.4.0","publint":"^0.3.15","svelte":"^5.42.2","svelte-check":"^4.3.3","typescript":"^5.9.3","typescript-eslint":"^8.46.2","vite":"^7.3.1","vite-plugin-devtools-json":"^1.0.0","vitest":"^4.0.17","vitest-browser-svelte":"^2.0.1"},"keywords":["svelte","sveltekit","turnstile","cloudflare","captcha","svelte-turnstile","turnstile-svelte"],"gitHead":"988451a666d0dbb59d332897f54d5e0bce287532","_id":"@battlefieldduck/turnstile-svelte@1.0.1","_nodeVersion":"22.21.1","_npmVersion":"11.7.0","dist":{"integrity":"sha512-v1jbzHx5bYOwFD0olhkKeYOLl9myh9LQMv+QCIBqXY6prY6STo/jRYWIItx9PINCWRwWMwR8gLSWhxvL1aBHuA==","shasum":"3fd60d568303b5f9e4070ef721d1b7cb9237420b","tarball":"https://registry.npmjs.org/@battlefieldduck/turnstile-svelte/-/turnstile-svelte-1.0.1.tgz","fileCount":15,"unpackedSize":17694,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@battlefieldduck%2fturnstile-svelte@1.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAOK9FuThMxjJRps0bZf8SJGIVzsNLudX8iKuCUY351QAiEA8p3q7VZIjKjtXhwx7Lk2F52dmPNM5/9kQ3gIIRqqDEI="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8b6ec221-2b56-4972-b6bc-07a766670c18"}},"directories":{},"maintainers":[{"name":"battlefieldduck","email":"hkdsethomas@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/turnstile-svelte_1.0.1_1768766198360_0.6092816091867144"},"_hasShrinkwrap":false}},"time":{"created":"2025-07-20T23:38:29.809Z","modified":"2026-01-18T19:56:38.817Z","0.0.1":"2025-07-20T23:38:30.063Z","0.0.2":"2025-07-21T00:55:11.298Z","1.0.0":"2025-09-29T00:45:42.069Z","1.0.1":"2026-01-18T19:56:38.523Z"},"bugs":{"url":"https://github.com/BattlefieldDuck/turnstile-svelte/issues"},"license":"MIT","homepage":"https://battlefieldduck.github.io/turnstile-svelte","keywords":["svelte","sveltekit","turnstile","cloudflare","captcha","svelte-turnstile","turnstile-svelte"],"repository":{"type":"git","url":"git+https://github.com/BattlefieldDuck/turnstile-svelte.git"},"description":"Simple and declarative Cloudflare Turnstile integration for Svelte & SvelteKit.","maintainers":[{"name":"battlefieldduck","email":"hkdsethomas@gmail.com"}],"readme":"# turnstile-svelte\n\n<img align=\"right\" width=\"100\" height=\"100\" src=\"https://github.com/BattlefieldDuck/turnstile-svelte/blob/main/static/favicon-96x96.png?raw=true\">\n\n[![Node.js Build](https://github.com/BattlefieldDuck/turnstile-svelte/actions/workflows/node.js.yml/badge.svg)](https://github.com/BattlefieldDuck/turnstile-svelte/actions/workflows/node.js.yml)\n![NPM Type Definitions](https://img.shields.io/npm/types/%40battlefieldduck%2Fturnstile-svelte)\n[![NPM Version](https://img.shields.io/npm/v/%40battlefieldduck%2Fturnstile-svelte)](https://www.npmjs.com/package/@battlefieldduck/turnstile-svelte)\n![NPM Downloads](https://img.shields.io/npm/dw/%40battlefieldduck%2Fturnstile-svelte)\n![NPM Downloads](https://img.shields.io/npm/d18m/%40battlefieldduck%2Fturnstile-svelte)\n![NPM License](https://img.shields.io/npm/l/%40battlefieldduck%2Fturnstile-svelte)\n\nA lightweight and declarative [Cloudflare Turnstile](https://developers.cloudflare.com/turnstile/) integration for Svelte and SvelteKit.\n\n**Live playground**: [battlefieldduck.github.io/turnstile-svelte](https://battlefieldduck.github.io/turnstile-svelte)\n\n## Installation\n\n```bash\nnpm install @battlefieldduck/turnstile-svelte\n```\n\n## Example\n\n### `+page.svelte`\n\n```svelte\n<script lang=\"ts\">\n    import { turnstile } from \"@battlefieldduck/turnstile-svelte\";\n</script>\n\n<form method=\"POST\">\n    <label>\n        Email\n        <input name=\"email\" type=\"email\" />\n    </label>\n    <label>\n        Password\n        <input name=\"password\" type=\"password\" />\n    </label>\n    <div {@attach turnstile({ sitekey: \"1x00000000000000000000AA\" })}></div>\n    <button>Log in</button>\n</form>\n```\n\n### `+page.server.ts`\n\n```ts\nimport { fail } from '@sveltejs/kit';\nimport type { Actions } from './$types';\nimport { validateTurnstile } from \"@battlefieldduck/turnstile-svelte/server\";\n\nexport const actions = {\n    default: async (event) => {\n        const data = await event.request.formData();\n        const email = String(data.get(\"email\") ?? \"\");\n        const password = String(data.get(\"password\") ?? \"\");\n        const token = String(data.get(\"cf-turnstile-response\") ?? \"\");\n        const ip = event.getClientAddress();\n\n        const validation = await validateTurnstile({\n            secret: \"1x0000000000000000000000000000000AA\", // <- replace with your secret key\n            response: token,\n            remoteip: ip\n        });\n\n        if (!validation.success) {\n            console.warn(\"Turnstile failed\", { errors: validation[\"error-codes\"] });\n            return fail(400, { error: \"Invalid verification\" });\n        }\n\n        console.log(\"Valid Turnstile for\", { email, ip });\n\n        // Token is valid - process the form\n\n        return { success: true };\n    }\n} satisfies Actions;\n```\n\n## Docs\n\n* [Live Examples & Playground](https://battlefieldduck.github.io/turnstile-svelte)\n* [Cloudflare Turnstile Docs](https://developers.cloudflare.com/turnstile/)\n\n## Contributing\nContributions are welcome! Please feel free to submit pull requests or open issues.\n\n![https://github.com/BattlefieldDuck/turnstile-svelte/graphs/contributors](https://contrib.rocks/image?repo=BattlefieldDuck/turnstile-svelte)\n\n## License\nturnstile-svelte is licensed under the MIT License. See the `LICENSE` file for more details.\n\n## Stargazers over time\n[![Stargazers over time](https://starchart.cc/BattlefieldDuck/turnstile-svelte.svg?variant=adaptive)](https://starchart.cc/BattlefieldDuck/turnstile-svelte)\n","readmeFilename":"README.md"}