@thind9xdev/react-turnstile 1.0.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 ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 thind9xdev
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,369 @@
1
+ # React Cloudflare Turnstile
2
+
3
+ A clean, modern React hook for Cloudflare Turnstile integration.
4
+
5
+ ## Install:
6
+
7
+ ```bash
8
+ npm i @thind9xdev/react-turnstile
9
+ ```
10
+
11
+ ## Import to React:
12
+
13
+ ```tsx
14
+ import { useTurnstile } from "@thind9xdev/react-turnstile";
15
+ ```
16
+
17
+ ## Basic Usage
18
+
19
+ ```tsx
20
+ import React from "react";
21
+ import { useTurnstile } from "@thind9xdev/react-turnstile";
22
+
23
+ const YourComponent = () => {
24
+ const siteKey = "YOUR_SITE_KEY";
25
+ const { ref, token, error, isLoading } = useTurnstile(siteKey);
26
+
27
+ if (isLoading) {
28
+ return <div>Loading Turnstile...</div>;
29
+ }
30
+
31
+ if (error) {
32
+ return <div>Error: {error}</div>;
33
+ }
34
+
35
+ // You can use token to send request to API
36
+ return (
37
+ <div>
38
+ <div ref={ref}></div>
39
+ {token && <p>Turnstile token generated successfully!</p>}
40
+ </div>
41
+ );
42
+ };
43
+
44
+ export default YourComponent;
45
+ ```
46
+
47
+ ## Advanced Usage
48
+
49
+ ```tsx
50
+ import React from "react";
51
+ import { useTurnstile, TurnstileOptions } from "@thind9xdev/react-turnstile";
52
+
53
+ const YourComponent = () => {
54
+ const siteKey = "YOUR_SITE_KEY";
55
+ const options: TurnstileOptions = {
56
+ theme: "light",
57
+ size: "normal",
58
+ language: "en",
59
+ retry: "auto",
60
+ "refresh-expired": "auto",
61
+ appearance: "always"
62
+ };
63
+
64
+ const {
65
+ ref,
66
+ token,
67
+ error,
68
+ isLoading,
69
+ reset,
70
+ execute,
71
+ getResponse
72
+ } = useTurnstile(siteKey, options);
73
+
74
+ const handleSubmit = async () => {
75
+ try {
76
+ const currentToken = getResponse();
77
+ if (currentToken) {
78
+ // Send request to your API with the token
79
+ console.log("Current token:", currentToken);
80
+ } else {
81
+ // Execute Turnstile if no token available
82
+ execute();
83
+ }
84
+ } catch (err) {
85
+ console.error("Failed to get Turnstile token:", err);
86
+ }
87
+ };
88
+
89
+ const handleReset = () => {
90
+ reset();
91
+ };
92
+
93
+ return (
94
+ <div>
95
+ <div ref={ref}></div>
96
+ <button onClick={handleSubmit} disabled={isLoading}>
97
+ {isLoading ? "Loading..." : "Submit"}
98
+ </button>
99
+ <button onClick={handleReset} disabled={isLoading}>
100
+ Reset Turnstile
101
+ </button>
102
+ {error && <p style={{ color: "red" }}>Error: {error}</p>}
103
+ {token && <p style={{ color: "green" }}>Token ready!</p>}
104
+ </div>
105
+ );
106
+ };
107
+
108
+ export default YourComponent;
109
+ ```
110
+
111
+ ## Invisible/Execute Mode Usage
112
+
113
+ ```tsx
114
+ import React from "react";
115
+ import { useTurnstile, TurnstileOptions } from "@thind9xdev/react-turnstile";
116
+
117
+ const InvisibleTurnstile = () => {
118
+ const siteKey = "YOUR_SITE_KEY";
119
+ const options: TurnstileOptions = {
120
+ appearance: "execute", // Invisible mode
121
+ execution: "execute"
122
+ };
123
+
124
+ const { ref, token, error, isLoading, execute } = useTurnstile(siteKey, options);
125
+
126
+ const handleFormSubmit = async (e: React.FormEvent) => {
127
+ e.preventDefault();
128
+
129
+ if (!token) {
130
+ // Execute Turnstile verification
131
+ execute();
132
+ return;
133
+ }
134
+
135
+ // Proceed with form submission using the token
136
+ console.log("Submitting with token:", token);
137
+ };
138
+
139
+ return (
140
+ <form onSubmit={handleFormSubmit}>
141
+ <div ref={ref}></div>
142
+ <input type="email" placeholder="Your email" required />
143
+ <button type="submit" disabled={isLoading}>
144
+ {isLoading ? "Verifying..." : "Submit"}
145
+ </button>
146
+ {error && <p style={{ color: "red" }}>{error}</p>}
147
+ </form>
148
+ );
149
+ };
150
+
151
+ export default InvisibleTurnstile;
152
+ ```
153
+
154
+ ## API Reference
155
+
156
+ ### `useTurnstile(siteKey, options?)`
157
+
158
+ #### Parameters:
159
+ - `siteKey` (string): Your Cloudflare Turnstile site key
160
+ - `options` (TurnstileOptions, optional): Configuration options
161
+
162
+ #### Options (TurnstileOptions):
163
+ - `theme` ('light' | 'dark' | 'auto', optional): Widget theme (default: 'auto')
164
+ - `size` ('normal' | 'compact', optional): Widget size (default: 'normal')
165
+ - `language` (string, optional): Language code (default: 'auto')
166
+ - `retry` ('auto' | 'never', optional): Retry behavior (default: 'auto')
167
+ - `retry-interval` (number, optional): Retry interval in milliseconds
168
+ - `refresh-expired` ('auto' | 'manual' | 'never', optional): Token refresh behavior (default: 'auto')
169
+ - `appearance` ('always' | 'execute' | 'interaction-only', optional): When to show the widget (default: 'always')
170
+ - `execution` ('render' | 'execute', optional): Execution mode (default: 'render')
171
+
172
+ #### Returns:
173
+ - `ref` (React.RefObject): Ref to attach to the container div element
174
+ - `token` (string | null): The Turnstile token
175
+ - `error` (string | null): Error message if something went wrong
176
+ - `isLoading` (boolean): Loading state
177
+ - `reset` (function): Function to reset the widget
178
+ - `execute` (function): Function to manually execute Turnstile (for invisible mode)
179
+ - `getResponse` (function): Function to get the current token
180
+ - `widgetId` (string | null): The widget ID returned by Turnstile
181
+
182
+ ## TypeScript Support
183
+
184
+ This package includes full TypeScript support with exported interfaces:
185
+
186
+ ```tsx
187
+ import { useTurnstile, TurnstileResponse, TurnstileOptions } from "@thind9xdev/react-turnstile";
188
+ ```
189
+
190
+ ## Widget Themes and Appearance
191
+
192
+ ### Themes
193
+ - `light`: Light theme
194
+ - `dark`: Dark theme
195
+ - `auto`: Automatically matches user's system preference
196
+
197
+ ### Sizes
198
+ - `normal`: Standard size widget
199
+ - `compact`: Smaller, compact widget
200
+
201
+ ### Appearance Modes
202
+ - `always`: Widget is always visible (default)
203
+ - `execute`: Invisible mode - widget only appears during execution
204
+ - `interaction-only`: Widget appears only when user interaction is required
205
+
206
+ ## Features
207
+
208
+ - ✅ Clean and modern React hook
209
+ - ✅ Full TypeScript support
210
+ - ✅ Automatic script loading and cleanup
211
+ - ✅ Error handling
212
+ - ✅ Loading states
213
+ - ✅ Manual token refresh and reset
214
+ - ✅ Support for invisible mode
215
+ - ✅ Theme and size customization
216
+ - ✅ Language support
217
+ - ✅ Comprehensive widget lifecycle management
218
+ - ✅ Zero dependencies (peer dependency: React >=16.8.0)
219
+
220
+ # Backend Integration
221
+
222
+ ## Verify Turnstile token from React with Node.js/Express Back-End:
223
+
224
+ ```javascript
225
+ const express = require('express');
226
+ const axios = require('axios');
227
+ const app = express();
228
+
229
+ app.use(express.json());
230
+
231
+ const TURNSTILE_SECRET_KEY = 'YOUR_SECRET_KEY';
232
+
233
+ app.post('/verify-turnstile', async (req, res) => {
234
+ const { token, remoteip } = req.body;
235
+
236
+ if (!token) {
237
+ return res.status(400).json({ success: false, message: 'Missing token' });
238
+ }
239
+
240
+ try {
241
+ const response = await axios.post('https://challenges.cloudflare.com/turnstile/v0/siteverify', {
242
+ secret: TURNSTILE_SECRET_KEY,
243
+ response: token,
244
+ remoteip: remoteip // optional
245
+ });
246
+
247
+ const { success, error_codes } = response.data;
248
+
249
+ if (success) {
250
+ res.json({ success: true, message: 'Verification successful' });
251
+ } else {
252
+ res.status(400).json({
253
+ success: false,
254
+ message: 'Verification failed',
255
+ error_codes
256
+ });
257
+ }
258
+ } catch (error) {
259
+ console.error('Turnstile verification error:', error);
260
+ res.status(500).json({ success: false, message: 'Internal server error' });
261
+ }
262
+ });
263
+ ```
264
+
265
+ ## Verify Turnstile token with NestJS Back-End:
266
+
267
+ ### Create TurnstileMiddleware:
268
+ ```bash
269
+ nest generate middleware turnstile
270
+ ```
271
+
272
+ ### Add middleware code:
273
+ ```typescript
274
+ import { Injectable, NestMiddleware } from '@nestjs/common';
275
+ import { Request, Response, NextFunction } from 'express';
276
+ import axios from 'axios';
277
+
278
+ @Injectable()
279
+ export class TurnstileMiddleware implements NestMiddleware {
280
+ private secretKey = 'YOUR_SECRET_KEY';
281
+
282
+ async use(req: Request, res: Response, next: NextFunction) {
283
+ const turnstileToken = req.body.turnstileToken;
284
+
285
+ if (!turnstileToken) {
286
+ return res.status(400).json({ message: 'Missing turnstileToken' });
287
+ }
288
+
289
+ try {
290
+ const response = await axios.post(
291
+ 'https://challenges.cloudflare.com/turnstile/v0/siteverify',
292
+ {
293
+ secret: this.secretKey,
294
+ response: turnstileToken,
295
+ remoteip: req.ip
296
+ }
297
+ );
298
+
299
+ const { success, error_codes } = response.data;
300
+
301
+ if (!success) {
302
+ return res.status(401).json({
303
+ message: 'Invalid turnstileToken',
304
+ error_codes
305
+ });
306
+ }
307
+
308
+ next();
309
+ } catch (error) {
310
+ console.error('Turnstile verification error:', error);
311
+ return res.status(500).json({ message: 'Internal Server Error' });
312
+ }
313
+ }
314
+ }
315
+ ```
316
+
317
+ ## Getting Started with Cloudflare Turnstile
318
+
319
+ 1. **Sign up for Cloudflare**: Visit [Cloudflare Dashboard](https://dash.cloudflare.com/)
320
+ 2. **Navigate to Turnstile**: Go to "Turnstile" in the sidebar
321
+ 3. **Create a Site**: Click "Add Site" and configure your domain
322
+ 4. **Get your keys**: Copy your Site Key and Secret Key
323
+ 5. **Configure your site**: Set up allowed domains and other settings
324
+
325
+ ## Error Handling
326
+
327
+ Common error codes and their meanings:
328
+
329
+ - `missing-input-secret`: The secret parameter is missing
330
+ - `invalid-input-secret`: The secret parameter is invalid or malformed
331
+ - `missing-input-response`: The response parameter is missing
332
+ - `invalid-input-response`: The response parameter is invalid or malformed
333
+ - `bad-request`: The request is invalid or malformed
334
+ - `timeout-or-duplicate`: The response parameter has already been validated before
335
+
336
+ ## Browser Support
337
+
338
+ Cloudflare Turnstile works in all modern browsers that support:
339
+ - ES6 Promises
340
+ - Fetch API or XMLHttpRequest
341
+ - Modern JavaScript features
342
+
343
+ ## Migration from reCAPTCHA
344
+
345
+ If you're migrating from Google reCAPTCHA, the main differences are:
346
+
347
+ 1. **Script URL**: Uses Cloudflare's CDN instead of Google's
348
+ 2. **API Methods**: Different method names and parameters
349
+ 3. **Verification endpoint**: Uses Cloudflare's verification API
350
+ 4. **Configuration options**: Different theme and customization options
351
+ 5. **Privacy**: Better privacy protection as Cloudflare doesn't track users
352
+
353
+ ## Contributing
354
+
355
+ Contributions are welcome! Please feel free to submit a Pull Request.
356
+
357
+ ## License
358
+
359
+ This project is licensed under the MIT License.
360
+
361
+ ## Author
362
+
363
+ Copyright 2024 thind9xdev
364
+
365
+ ## Links
366
+
367
+ - [Cloudflare Turnstile Documentation](https://developers.cloudflare.com/turnstile/)
368
+ - [GitHub Repository](https://github.com/thind9xdev/react-turnstile1)
369
+ - [NPM Package](https://www.npmjs.com/package/@thind9xdev/react-turnstile)
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ import { TurnstileOptions } from '../hooks/useTurnstile';
3
+ export interface TurnstileComponentProps extends TurnstileOptions {
4
+ siteKey: string;
5
+ className?: string;
6
+ style?: React.CSSProperties;
7
+ }
8
+ export interface TurnstileComponentRef {
9
+ reset: () => void;
10
+ execute: () => void;
11
+ getResponse: () => string | null;
12
+ }
13
+ export declare const TurnstileComponent: React.ForwardRefExoticComponent<TurnstileComponentProps & React.RefAttributes<TurnstileComponentRef>>;
14
+ //# sourceMappingURL=TurnstileComponent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TurnstileComponent.d.ts","sourceRoot":"","sources":["../../src/components/TurnstileComponent.tsx"],"names":[],"mappings":"AAGA,OAAO,KAA0C,MAAM,OAAO,CAAC;AAC/D,OAAqB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEvE,MAAM,WAAW,uBAAwB,SAAQ,gBAAgB;IAC/D,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,WAAW,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,eAAO,MAAM,kBAAkB,uGAY9B,CAAC"}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ "use client";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ var __rest = (this && this.__rest) || function (s, e) {
37
+ var t = {};
38
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
39
+ t[p] = s[p];
40
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
41
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
42
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
43
+ t[p[i]] = s[p[i]];
44
+ }
45
+ return t;
46
+ };
47
+ var __importDefault = (this && this.__importDefault) || function (mod) {
48
+ return (mod && mod.__esModule) ? mod : { "default": mod };
49
+ };
50
+ Object.defineProperty(exports, "__esModule", { value: true });
51
+ exports.TurnstileComponent = void 0;
52
+ var react_1 = __importStar(require("react"));
53
+ var useTurnstile_1 = __importDefault(require("../hooks/useTurnstile"));
54
+ exports.TurnstileComponent = (0, react_1.forwardRef)(function (_a, ref) {
55
+ var siteKey = _a.siteKey, className = _a.className, style = _a.style, options = __rest(_a, ["siteKey", "className", "style"]);
56
+ var _b = (0, useTurnstile_1.default)(siteKey, options), turnstileRef = _b.ref, reset = _b.reset, execute = _b.execute, getResponse = _b.getResponse;
57
+ (0, react_1.useImperativeHandle)(ref, function () { return ({
58
+ reset: reset,
59
+ execute: execute,
60
+ getResponse: getResponse,
61
+ }); }, [reset, execute, getResponse]);
62
+ return react_1.default.createElement("div", { ref: turnstileRef, className: className, style: style });
63
+ });
64
+ exports.TurnstileComponent.displayName = 'TurnstileComponent';
65
+ //# sourceMappingURL=TurnstileComponent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TurnstileComponent.js","sourceRoot":"","sources":["../../src/components/TurnstileComponent.tsx"],"names":[],"mappings":";AACA,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEb,6CAA+D;AAC/D,uEAAuE;AAc1D,QAAA,kBAAkB,GAAG,IAAA,kBAAU,EAC1C,UAAC,EAAyC,EAAE,GAAG;IAA5C,IAAA,OAAO,aAAA,EAAE,SAAS,eAAA,EAAE,KAAK,WAAA,EAAK,OAAO,cAAvC,iCAAyC,CAAF;IAChC,IAAA,KAAqD,IAAA,sBAAY,EAAC,OAAO,EAAE,OAAO,CAAC,EAA5E,YAAY,SAAA,EAAE,KAAK,WAAA,EAAE,OAAO,aAAA,EAAE,WAAW,iBAAmC,CAAC;IAE1F,IAAA,2BAAmB,EAAC,GAAG,EAAE,cAAM,OAAA,CAAC;QAC9B,KAAK,OAAA;QACL,OAAO,SAAA;QACP,WAAW,aAAA;KACZ,CAAC,EAJ6B,CAI7B,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;IAEnC,OAAO,uCAAK,GAAG,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,GAAI,CAAC;AACxE,CAAC,CACF,CAAC;AAEF,0BAAkB,CAAC,WAAW,GAAG,oBAAoB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './TurnstileComponent';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.tsx"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./TurnstileComponent"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/components/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uDAAqC"}
@@ -0,0 +1,3 @@
1
+ export { default as useTurnstile } from "./useTurnstile";
2
+ export type { TurnstileResponse, TurnstileOptions } from "./useTurnstile";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.useTurnstile = void 0;
7
+ var useTurnstile_1 = require("./useTurnstile");
8
+ Object.defineProperty(exports, "useTurnstile", { enumerable: true, get: function () { return __importDefault(useTurnstile_1).default; } });
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.tsx"],"names":[],"mappings":";;;;;;AAAA,+CAAyD;AAAhD,6HAAA,OAAO,OAAgB"}
@@ -0,0 +1,35 @@
1
+ export interface TurnstileResponse {
2
+ success: boolean;
3
+ error_codes?: string[];
4
+ challenge_ts?: string;
5
+ hostname?: string;
6
+ action?: string;
7
+ cdata?: string;
8
+ }
9
+ export interface TurnstileOptions {
10
+ onLoad?: () => void;
11
+ onSuccess?: (token: string) => void;
12
+ onError?: (errorCode?: string) => void;
13
+ onExpire?: () => void;
14
+ onTimeout?: () => void;
15
+ theme?: 'light' | 'dark' | 'auto';
16
+ size?: 'normal' | 'compact';
17
+ language?: string;
18
+ retry?: 'auto' | 'never';
19
+ 'retry-interval'?: number;
20
+ 'refresh-expired'?: 'auto' | 'manual' | 'never';
21
+ appearance?: 'always' | 'execute' | 'interaction-only';
22
+ execution?: 'render' | 'execute';
23
+ }
24
+ declare const useTurnstile: (siteKey: string, options?: TurnstileOptions) => {
25
+ ref: import("react").MutableRefObject<HTMLDivElement | null>;
26
+ token: string | null;
27
+ error: string | null;
28
+ isLoading: boolean;
29
+ reset: () => void;
30
+ execute: () => void;
31
+ getResponse: () => string | null;
32
+ widgetId: string | null;
33
+ };
34
+ export default useTurnstile;
35
+ //# sourceMappingURL=useTurnstile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTurnstile.d.ts","sourceRoot":"","sources":["../../src/hooks/useTurnstile.tsx"],"names":[],"mappings":"AAGA,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,OAAO,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IAClC,IAAI,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IAChD,UAAU,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,kBAAkB,CAAC;IACvD,SAAS,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;CAClC;AAeD,QAAA,MAAM,YAAY,GAChB,SAAS,MAAM,EACf,UAAS,gBAAqB;;;;;;;;;CA8L/B,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -0,0 +1,164 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var react_1 = require("react");
4
+ var useTurnstile = function (siteKey, options) {
5
+ if (options === void 0) { options = {}; }
6
+ var _a = (0, react_1.useState)(null), token = _a[0], setToken = _a[1];
7
+ var _b = (0, react_1.useState)(null), error = _b[0], setError = _b[1];
8
+ var _c = (0, react_1.useState)(true), isLoading = _c[0], setIsLoading = _c[1];
9
+ var _d = (0, react_1.useState)(null), widgetId = _d[0], setWidgetId = _d[1];
10
+ var containerRef = (0, react_1.useRef)(null);
11
+ var scriptRef = (0, react_1.useRef)(null);
12
+ var _e = options.theme, theme = _e === void 0 ? 'auto' : _e, _f = options.size, size = _f === void 0 ? 'normal' : _f, _g = options.language, language = _g === void 0 ? 'auto' : _g, _h = options.retry, retry = _h === void 0 ? 'auto' : _h, retryInterval = options["retry-interval"], _j = options["refresh-expired"], refreshExpired = _j === void 0 ? 'auto' : _j, _k = options.appearance, appearance = _k === void 0 ? 'always' : _k, _l = options.execution, execution = _l === void 0 ? 'render' : _l, userOnSuccess = options.onSuccess, userOnError = options.onError, userOnExpire = options.onExpire, userOnTimeout = options.onTimeout, userOnLoad = options.onLoad;
13
+ var onSuccess = (0, react_1.useCallback)(function (token) {
14
+ setToken(token);
15
+ setError(null);
16
+ setIsLoading(false);
17
+ userOnSuccess === null || userOnSuccess === void 0 ? void 0 : userOnSuccess(token);
18
+ }, [userOnSuccess]);
19
+ var onError = (0, react_1.useCallback)(function (errorCode) {
20
+ setError(errorCode || 'Turnstile verification failed');
21
+ setToken(null);
22
+ setIsLoading(false);
23
+ userOnError === null || userOnError === void 0 ? void 0 : userOnError(errorCode);
24
+ }, [userOnError]);
25
+ var onExpired = (0, react_1.useCallback)(function () {
26
+ setToken(null);
27
+ setError('Turnstile token expired');
28
+ setIsLoading(false);
29
+ userOnExpire === null || userOnExpire === void 0 ? void 0 : userOnExpire();
30
+ }, [userOnExpire]);
31
+ var onTimeout = (0, react_1.useCallback)(function () {
32
+ setError('Turnstile verification timed out');
33
+ setToken(null);
34
+ setIsLoading(false);
35
+ userOnTimeout === null || userOnTimeout === void 0 ? void 0 : userOnTimeout();
36
+ }, [userOnTimeout]);
37
+ var renderTurnstile = (0, react_1.useCallback)(function () {
38
+ if (!window.turnstile || !containerRef.current) {
39
+ return;
40
+ }
41
+ try {
42
+ setIsLoading(true);
43
+ setError(null);
44
+ var renderOptions_1 = {
45
+ sitekey: siteKey,
46
+ theme: theme,
47
+ size: size,
48
+ language: language,
49
+ retry: retry,
50
+ 'retry-interval': retryInterval,
51
+ 'refresh-expired': refreshExpired,
52
+ appearance: appearance,
53
+ execution: execution,
54
+ callback: onSuccess,
55
+ 'error-callback': onError,
56
+ 'expired-callback': onExpired,
57
+ 'timeout-callback': onTimeout,
58
+ };
59
+ Object.keys(renderOptions_1).forEach(function (key) {
60
+ return renderOptions_1[key] === undefined &&
61
+ delete renderOptions_1[key];
62
+ });
63
+ var id = window.turnstile.render(containerRef.current, renderOptions_1);
64
+ setWidgetId(id);
65
+ userOnLoad === null || userOnLoad === void 0 ? void 0 : userOnLoad();
66
+ }
67
+ catch (err) {
68
+ var errorMessage = err instanceof Error ? err.message : 'Failed to render Turnstile';
69
+ setError(errorMessage);
70
+ setIsLoading(false);
71
+ }
72
+ }, [
73
+ siteKey, theme, size, language, retry, retryInterval,
74
+ refreshExpired, appearance, execution, onSuccess, onError, onExpired, onTimeout, userOnLoad
75
+ ]);
76
+ (0, react_1.useEffect)(function () {
77
+ if (widgetId) {
78
+ return;
79
+ }
80
+ var scriptId = 'cloudflare-turnstile-script';
81
+ var onloadCallbackName = 'cfTurnstileOnload';
82
+ window[onloadCallbackName] = renderTurnstile;
83
+ if (document.getElementById(scriptId)) {
84
+ if (window.turnstile) {
85
+ renderTurnstile();
86
+ }
87
+ return;
88
+ }
89
+ var script = document.createElement('script');
90
+ script.id = scriptId;
91
+ script.src = "https://challenges.cloudflare.com/turnstile/v0/api.js?onload=".concat(onloadCallbackName);
92
+ script.async = false;
93
+ script.defer = false;
94
+ script.onerror = function () {
95
+ setError('Failed to load Turnstile script');
96
+ setIsLoading(false);
97
+ };
98
+ document.head.appendChild(script);
99
+ scriptRef.current = script;
100
+ return function () {
101
+ if (widgetId && window.turnstile) {
102
+ try {
103
+ window.turnstile.remove(widgetId);
104
+ }
105
+ catch (err) {
106
+ console.warn('Failed to remove Turnstile widget:', err);
107
+ }
108
+ }
109
+ delete window[onloadCallbackName];
110
+ };
111
+ }, [renderTurnstile, widgetId]);
112
+ var reset = (0, react_1.useCallback)(function () {
113
+ if (widgetId && window.turnstile) {
114
+ try {
115
+ setToken(null);
116
+ setError(null);
117
+ setIsLoading(true);
118
+ window.turnstile.reset(widgetId);
119
+ }
120
+ catch (err) {
121
+ setError('Failed to reset Turnstile');
122
+ setIsLoading(false);
123
+ }
124
+ }
125
+ }, [widgetId]);
126
+ var execute = (0, react_1.useCallback)(function () {
127
+ if (containerRef.current && window.turnstile) {
128
+ try {
129
+ setToken(null);
130
+ setError(null);
131
+ setIsLoading(true);
132
+ window.turnstile.execute(containerRef.current);
133
+ }
134
+ catch (err) {
135
+ setError('Failed to execute Turnstile');
136
+ setIsLoading(false);
137
+ }
138
+ }
139
+ }, []);
140
+ var getResponse = (0, react_1.useCallback)(function () {
141
+ if (widgetId && window.turnstile) {
142
+ try {
143
+ return window.turnstile.getResponse(widgetId);
144
+ }
145
+ catch (err) {
146
+ console.warn('Failed to get Turnstile response:', err);
147
+ return null;
148
+ }
149
+ }
150
+ return null;
151
+ }, [widgetId]);
152
+ return {
153
+ ref: containerRef,
154
+ token: token,
155
+ error: error,
156
+ isLoading: isLoading,
157
+ reset: reset,
158
+ execute: execute,
159
+ getResponse: getResponse,
160
+ widgetId: widgetId
161
+ };
162
+ };
163
+ exports.default = useTurnstile;
164
+ //# sourceMappingURL=useTurnstile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTurnstile.js","sourceRoot":"","sources":["../../src/hooks/useTurnstile.tsx"],"names":[],"mappings":";;AACA,+BAAiE;AAwCjE,IAAM,YAAY,GAAG,UACnB,OAAe,EACf,OAA8B;IAA9B,wBAAA,EAAA,YAA8B;IAExB,IAAA,KAAoB,IAAA,gBAAQ,EAAgB,IAAI,CAAC,EAAhD,KAAK,QAAA,EAAE,QAAQ,QAAiC,CAAC;IAClD,IAAA,KAAoB,IAAA,gBAAQ,EAAgB,IAAI,CAAC,EAAhD,KAAK,QAAA,EAAE,QAAQ,QAAiC,CAAC;IAClD,IAAA,KAA4B,IAAA,gBAAQ,EAAU,IAAI,CAAC,EAAlD,SAAS,QAAA,EAAE,YAAY,QAA2B,CAAC;IACpD,IAAA,KAA0B,IAAA,gBAAQ,EAAgB,IAAI,CAAC,EAAtD,QAAQ,QAAA,EAAE,WAAW,QAAiC,CAAC;IAC9D,IAAM,YAAY,GAAG,IAAA,cAAM,EAAwB,IAAI,CAAC,CAAC;IACzD,IAAM,SAAS,GAAG,IAAA,cAAM,EAA2B,IAAI,CAAC,CAAC;IAGvD,IAAA,KAaE,OAAO,MAbK,EAAd,KAAK,mBAAG,MAAM,KAAA,EACd,KAYE,OAAO,KAZM,EAAf,IAAI,mBAAG,QAAQ,KAAA,EACf,KAWE,OAAO,SAXQ,EAAjB,QAAQ,mBAAG,MAAM,KAAA,EACjB,KAUE,OAAO,MAVK,EAAd,KAAK,mBAAG,MAAM,KAAA,EACI,aAAa,GAS7B,OAAO,kBATsB,EAC/B,KAQE,OAAO,mBARiC,EAAvB,cAAc,mBAAG,MAAM,KAAA,EAC1C,KAOE,OAAO,WAPY,EAArB,UAAU,mBAAG,QAAQ,KAAA,EACrB,KAME,OAAO,UANW,EAApB,SAAS,mBAAG,QAAQ,KAAA,EACT,aAAa,GAKtB,OAAO,UALe,EACf,WAAW,GAIlB,OAAO,QAJW,EACV,YAAY,GAGpB,OAAO,SAHa,EACX,aAAa,GAEtB,OAAO,UAFe,EAChB,UAAU,GAChB,OAAO,OADS,CACR;IAEZ,IAAM,SAAS,GAAG,IAAA,mBAAW,EAAC,UAAC,KAAa;QAC1C,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAG,KAAK,CAAC,CAAC;IACzB,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpB,IAAM,OAAO,GAAG,IAAA,mBAAW,EAAC,UAAC,SAAkB;QAC7C,QAAQ,CAAC,SAAS,IAAI,+BAA+B,CAAC,CAAC;QACvD,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAG,SAAS,CAAC,CAAC;IAC3B,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAElB,IAAM,SAAS,GAAG,IAAA,mBAAW,EAAC;QAC5B,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,QAAQ,CAAC,yBAAyB,CAAC,CAAC;QACpC,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,YAAY,aAAZ,YAAY,uBAAZ,YAAY,EAAI,CAAC;IACnB,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,IAAM,SAAS,GAAG,IAAA,mBAAW,EAAC;QAC5B,QAAQ,CAAC,kCAAkC,CAAC,CAAC;QAC7C,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,aAAa,aAAb,aAAa,uBAAb,aAAa,EAAI,CAAC;IACpB,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpB,IAAM,eAAe,GAAG,IAAA,mBAAW,EAAC;QAClC,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;YAC/C,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,YAAY,CAAC,IAAI,CAAC,CAAC;YACnB,QAAQ,CAAC,IAAI,CAAC,CAAC;YAEf,IAAM,eAAa,GAAG;gBACpB,OAAO,EAAE,OAAO;gBAChB,KAAK,OAAA;gBACL,IAAI,MAAA;gBACJ,QAAQ,UAAA;gBACR,KAAK,OAAA;gBACL,gBAAgB,EAAE,aAAa;gBAC/B,iBAAiB,EAAE,cAAc;gBACjC,UAAU,YAAA;gBACV,SAAS,WAAA;gBACT,QAAQ,EAAE,SAAS;gBACnB,gBAAgB,EAAE,OAAO;gBACzB,kBAAkB,EAAE,SAAS;gBAC7B,kBAAkB,EAAE,SAAS;aAC9B,CAAC;YAEF,MAAM,CAAC,IAAI,CAAC,eAAa,CAAC,CAAC,OAAO,CAAC,UAAA,GAAG;gBACpC,OAAA,eAAa,CAAC,GAAiC,CAAC,KAAK,SAAS;oBAC9D,OAAO,eAAa,CAAC,GAAiC,CAAC;YADvD,CACuD,CACxD,CAAC;YAEF,IAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,eAAa,CAAC,CAAC;YACxE,WAAW,CAAC,EAAE,CAAC,CAAC;YAEhB,UAAU,aAAV,UAAU,uBAAV,UAAU,EAAI,CAAC;QACjB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAM,YAAY,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,4BAA4B,CAAC;YACvF,QAAQ,CAAC,YAAY,CAAC,CAAC;YACvB,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,EAAE;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa;QACpD,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU;KAC5F,CAAC,CAAC;IAEH,IAAA,iBAAS,EAAC;QACR,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,IAAM,QAAQ,GAAG,6BAA6B,CAAC;QAC/C,IAAM,kBAAkB,GAAG,mBAAmB,CAAC;QAE9C,MAAc,CAAC,kBAAkB,CAAC,GAAG,eAAe,CAAC;QAEtD,IAAI,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtC,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBACrB,eAAe,EAAE,CAAC;YACpB,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,CAAC,EAAE,GAAG,QAAQ,CAAC;QACrB,MAAM,CAAC,GAAG,GAAG,uEAAgE,kBAAkB,CAAE,CAAC;QAClG,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;QACrB,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;QAErB,MAAM,CAAC,OAAO,GAAG;YACf,QAAQ,CAAC,iCAAiC,CAAC,CAAC;YAC5C,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC,CAAC;QAEF,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAClC,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC;QAE3B,OAAO;YACL,IAAI,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBACjC,IAAI,CAAC;oBACH,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACpC,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,IAAI,CAAC,oCAAoC,EAAE,GAAG,CAAC,CAAC;gBAC1D,CAAC;YACH,CAAC;YACD,OAAQ,MAAc,CAAC,kBAAkB,CAAC,CAAC;QAC7C,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEhC,IAAM,KAAK,GAAG,IAAA,mBAAW,EAAC;QACxB,IAAI,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACf,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACf,YAAY,CAAC,IAAI,CAAC,CAAC;gBACnB,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACnC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,QAAQ,CAAC,2BAA2B,CAAC,CAAC;gBACtC,YAAY,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,IAAM,OAAO,GAAG,IAAA,mBAAW,EAAC;QAC1B,IAAI,YAAY,CAAC,OAAO,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YAC7C,IAAI,CAAC;gBACH,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACf,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACf,YAAY,CAAC,IAAI,CAAC,CAAC;gBACnB,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACjD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,QAAQ,CAAC,6BAA6B,CAAC,CAAC;gBACxC,YAAY,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,IAAM,WAAW,GAAG,IAAA,mBAAW,EAAC;QAC9B,IAAI,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,OAAO,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YAChD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,mCAAmC,EAAE,GAAG,CAAC,CAAC;gBACvD,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,OAAO;QACL,GAAG,EAAE,YAAY;QACjB,KAAK,OAAA;QACL,KAAK,OAAA;QACL,SAAS,WAAA;QACT,KAAK,OAAA;QACL,OAAO,SAAA;QACP,WAAW,aAAA;QACX,QAAQ,UAAA;KACT,CAAC;AACJ,CAAC,CAAC;AAEF,kBAAe,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from "./hooks";
2
+ export * from "./components";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./hooks"), exports);
18
+ __exportStar(require("./components"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,+CAA6B"}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@thind9xdev/react-turnstile",
3
+ "version": "1.0.0",
4
+ "description": "A React hook for Cloudflare Turnstile integration",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "clean": "rm -rf dist",
10
+ "prebuild": "npm run clean",
11
+ "prepare": "npm run build"
12
+ },
13
+ "keywords": [
14
+ "react",
15
+ "cloudflare",
16
+ "turnstile",
17
+ "cloudflare-turnstile",
18
+ "react-turnstile",
19
+ "captcha",
20
+ "hook",
21
+ "typescript"
22
+ ],
23
+ "author": "thind9xdev",
24
+ "homepage": "https://github.com/thind9xdev/react-turnstile",
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "https://github.com/thind9xdev/react-turnstile.git"
28
+ },
29
+ "bugs": {
30
+ "url": "https://github.com/thind9xdev/react-turnstile/issues"
31
+ },
32
+ "license": "MIT",
33
+ "peerDependencies": {
34
+ "react": ">=16.8.0"
35
+ },
36
+ "devDependencies": {
37
+ "@types/react": "^18.3.24",
38
+ "@types/react-dom": "^18.3.7",
39
+ "typescript": "^5.9.2"
40
+ },
41
+ "files": [
42
+ "dist",
43
+ "README.md",
44
+ "LICENSE"
45
+ ]
46
+ }