@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 +21 -0
- package/README.md +369 -0
- package/dist/components/TurnstileComponent.d.ts +14 -0
- package/dist/components/TurnstileComponent.d.ts.map +1 -0
- package/dist/components/TurnstileComponent.js +65 -0
- package/dist/components/TurnstileComponent.js.map +1 -0
- package/dist/components/index.d.ts +2 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +18 -0
- package/dist/components/index.js.map +1 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +9 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/useTurnstile.d.ts +35 -0
- package/dist/hooks/useTurnstile.d.ts.map +1 -0
- package/dist/hooks/useTurnstile.js +164 -0
- package/dist/hooks/useTurnstile.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/package.json +46 -0
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 @@
|
|
|
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 @@
|
|
|
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":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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
|
+
}
|