@swetrix/captcha 2.0.2 → 2.3.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.
Files changed (46) hide show
  1. package/README.md +72 -5
  2. package/dist/captcha-loader.cjs +333 -0
  3. package/dist/captcha-loader.cjs.map +1 -0
  4. package/dist/captcha-loader.esm.js +327 -0
  5. package/dist/captcha-loader.esm.js.map +1 -0
  6. package/dist/captcha-loader.js +1 -1
  7. package/dist/captcha-loader.js.map +1 -1
  8. package/dist/captcha.js +1 -1
  9. package/dist/captcha.js.map +1 -1
  10. package/dist/esnext/captcha-loader.d.ts +10 -0
  11. package/dist/esnext/captcha-loader.js +315 -0
  12. package/dist/esnext/captcha-loader.js.map +1 -0
  13. package/dist/esnext/captcha.d.ts +10 -0
  14. package/dist/esnext/captcha.js +491 -0
  15. package/dist/esnext/captcha.js.map +1 -0
  16. package/dist/esnext/i18n.d.ts +22 -0
  17. package/dist/esnext/i18n.js +110 -0
  18. package/dist/esnext/i18n.js.map +1 -0
  19. package/dist/esnext/index.d.ts +7 -0
  20. package/dist/esnext/index.js +7 -0
  21. package/dist/esnext/index.js.map +1 -0
  22. package/dist/esnext/logger.d.ts +6 -0
  23. package/dist/esnext/logger.js +8 -0
  24. package/dist/esnext/logger.js.map +1 -0
  25. package/dist/esnext/pow-worker.d.ts +1 -0
  26. package/dist/esnext/pow-worker.js +127 -0
  27. package/dist/esnext/pow-worker.js.map +1 -0
  28. package/dist/pages/dark.html +461 -276
  29. package/dist/pages/light.html +463 -278
  30. package/dist/pages/test.html +26 -27
  31. package/package.json +58 -32
  32. package/.nvmrc +0 -1
  33. package/.prettierrc.js +0 -13
  34. package/dist/assets/logo_blue.png +0 -0
  35. package/dist/assets/logo_white.png +0 -0
  36. package/rollup.config.mjs +0 -83
  37. package/src/assets/logo_blue.png +0 -0
  38. package/src/assets/logo_white.png +0 -0
  39. package/src/captcha-loader.ts +0 -212
  40. package/src/captcha.ts +0 -358
  41. package/src/pages/dark.html +0 -284
  42. package/src/pages/light.html +0 -286
  43. package/src/pages/test.html +0 -33
  44. package/src/pow-worker.ts +0 -178
  45. package/tsconfig.esnext.json +0 -15
  46. package/tsconfig.json +0 -14
package/README.md CHANGED
@@ -1,4 +1,8 @@
1
- <img src="/src/assets/logo_blue.png" alt="" height="80" />
1
+ <picture>
2
+ <source media="(prefers-color-scheme: dark)" srcset="https://swetrix.com/assets/logo_white.png?v=2">
3
+ <img alt="Swetrix" src="https://swetrix.com/assets/logo_blue.png?v=2" height="80">
4
+ </picture>
5
+ <br /><br />
2
6
 
3
7
  ## Description
4
8
 
@@ -6,6 +10,73 @@ Swetrix CAPTCHA is a privacy-oriented, simple and opensource CAPTCHA service.
6
10
 
7
11
  See the full documentation at https://docs.swetrix.com/captcha/introduction
8
12
 
13
+ ## Features
14
+
15
+ - **Privacy-focused**: No tracking, no cookies
16
+ - **Accessible**: Full keyboard navigation, ARIA support, screen reader announcements, respects `prefers-reduced-motion`
17
+ - **Progress indicator**: Visual progress bar during verification
18
+ - **Auto theme detection**: Automatically matches browser's light/dark mode preference
19
+ - **Lightweight**: Minimal footprint, fast loading
20
+
21
+ ## Usage
22
+
23
+ ### Script tag
24
+
25
+ ```html
26
+ <div class="swecaptcha"
27
+ data-project-id="YOUR_PROJECT_ID"
28
+ data-theme="auto">
29
+ </div>
30
+ <script src="https://cdn.swetrixcaptcha.com/captcha-loader.js" defer></script>
31
+ ```
32
+
33
+ ### npm
34
+
35
+ ```bash
36
+ npm install @swetrix/captcha
37
+ ```
38
+
39
+ ```javascript
40
+ import '@swetrix/captcha'
41
+ ```
42
+
43
+ The package automatically renders `.swecaptcha` elements when the DOM is ready. You can also trigger a reload manually:
44
+
45
+ ```javascript
46
+ import { forceLoadCaptcha, loadCaptcha } from '@swetrix/captcha'
47
+
48
+ // Render any .swecaptcha elements that are not initialised yet.
49
+ loadCaptcha()
50
+
51
+ // Re-render all .swecaptcha elements, replacing existing widgets.
52
+ forceLoadCaptcha()
53
+ ```
54
+
55
+ ### Options
56
+
57
+ | Attribute | Description | Values | Default |
58
+ |-----------|-------------|--------|---------|
59
+ | `data-project-id` | Your project ID | Valid project ID | Required |
60
+ | `data-theme` | Color theme | `auto`, `light`, `dark` | `auto` |
61
+ | `data-response-input-name` | Hidden input name | Any string | `swetrix-captcha-response` |
62
+ | `data-lang` | Force a specific language | `en`, `de`, `fr`, `pl`, `uk`, `hu` | Auto-detected |
63
+ | `data-asset-url` | Custom URL for CAPTCHA package assets | Any absolute or relative URL | `https://cdn.swetrixcaptcha.com/dist/` |
64
+
65
+ ### Language Support
66
+
67
+ The widget supports **English**, **German**, **French**, **Polish**, **Ukrainian**, and **Hungarian**.
68
+
69
+ Language is detected automatically in this order:
70
+ 1. `data-lang` attribute on the widget element
71
+ 2. `lang` attribute on parent elements (e.g., `<html lang="de">`)
72
+ 3. Browser's preferred language
73
+
74
+ ### Theme Options
75
+
76
+ - `auto`: Automatically detects user's browser theme preference using `prefers-color-scheme`
77
+ - `light`: Forces light theme
78
+ - `dark`: Forces dark theme
79
+
9
80
  ## Development
10
81
 
11
82
  To build the captcha run:
@@ -27,7 +98,3 @@ For severe security issues, please contact us at security@swetrix.com
27
98
  ## Contact
28
99
 
29
100
  You can contact us via email at contact@swetrix.com
30
-
31
- ## Donate
32
- You can support the project by donating us at https://ko-fi.com/andriir \
33
- We can only run our services by once again asking for your financial support!
@@ -0,0 +1,333 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ const CAPTCHA_SELECTOR = '.swecaptcha';
6
+ const SUPPORTED_LOCALES = ['en', 'de', 'fr', 'pl', 'uk', 'hu'];
7
+ const DEFAULT_LOCALE = 'en';
8
+ const DEFAULT_ASSET_BASE_URL = 'https://cdn.swetrixcaptcha.com/dist/';
9
+ const DEFAULT_RESPONSE_INPUT_NAME = 'swetrix-captcha-response';
10
+ const MESSAGE_IDENTIFIER = 'swetrix-captcha';
11
+ const ID_PREFIX = 'swetrix-captcha-';
12
+ const THEMES = ['light', 'dark', 'auto'];
13
+ const DEFAULT_THEME = 'auto';
14
+ const PID_REGEX = /^(?!.*--)[a-zA-Z0-9-]{12}$/;
15
+ const SCRIPT_NAME_REGEX = /(?:^|\/)captcha-loader(?:\.[\w-]+)?\.js(?:[?#]|$)/;
16
+ const LEGACY_CDN_HOST = 'cdn.swetrixcaptcha.com';
17
+ var LOG_ACTIONS;
18
+ (function (LOG_ACTIONS) {
19
+ LOG_ACTIONS["log"] = "log";
20
+ LOG_ACTIONS["error"] = "error";
21
+ LOG_ACTIONS["warn"] = "warn";
22
+ LOG_ACTIONS["info"] = "info";
23
+ })(LOG_ACTIONS || (LOG_ACTIONS = {}));
24
+ const DUMMY_PIDS = ['AP00000000000', 'FAIL000000000'];
25
+ const isValidPID = (pid) => DUMMY_PIDS.includes(pid) || PID_REGEX.test(pid);
26
+ const FRAME_HEIGHT = '66px';
27
+ const getFrameID = (cid) => `${cid}-frame`;
28
+ const ids = [];
29
+ const captchaFrameOrigins = new Map();
30
+ const captchaFrameSources = new Map();
31
+ let messageListenerRegistered = false;
32
+ const log = (status, text) => {
33
+ console[status](`[Swetrix Captcha] ${text}`);
34
+ };
35
+ const getWindow = () => (typeof window === 'undefined' ? undefined : window);
36
+ const getDocument = () => (typeof document === 'undefined' ? undefined : document);
37
+ const normalizeAssetBaseURL = (assetBaseUrl) => {
38
+ var _a;
39
+ const fallbackBase = (_a = getWindow()) === null || _a === void 0 ? void 0 : _a.location.href;
40
+ try {
41
+ const url = fallbackBase ? new URL(assetBaseUrl, fallbackBase) : new URL(assetBaseUrl);
42
+ return url.href.endsWith('/') ? url.href : `${url.href}/`;
43
+ }
44
+ catch (_b) {
45
+ return DEFAULT_ASSET_BASE_URL;
46
+ }
47
+ };
48
+ const getScriptAssetBaseURL = () => {
49
+ const doc = getDocument();
50
+ if (!doc) {
51
+ return DEFAULT_ASSET_BASE_URL;
52
+ }
53
+ const currentScript = doc.currentScript;
54
+ const scripts = [
55
+ ...((currentScript === null || currentScript === void 0 ? void 0 : currentScript.src) ? [currentScript] : []),
56
+ ...Array.from(doc.scripts).reverse(),
57
+ ];
58
+ const loaderScript = scripts.find((script) => SCRIPT_NAME_REGEX.test(script.src));
59
+ if (!(loaderScript === null || loaderScript === void 0 ? void 0 : loaderScript.src)) {
60
+ return DEFAULT_ASSET_BASE_URL;
61
+ }
62
+ if (new URL(loaderScript.src).hostname === LEGACY_CDN_HOST) {
63
+ return DEFAULT_ASSET_BASE_URL;
64
+ }
65
+ return normalizeAssetBaseURL(new URL('.', loaderScript.src).href);
66
+ };
67
+ const resolveAssetBaseURL = (container) => {
68
+ var _a;
69
+ const configuredAssetBaseURL = container.getAttribute('data-asset-url') ||
70
+ container.getAttribute('data-assets-url') ||
71
+ ((_a = getWindow()) === null || _a === void 0 ? void 0 : _a.__SWETRIX_CAPTCHA_ASSET_URL);
72
+ return normalizeAssetBaseURL(configuredAssetBaseURL || getScriptAssetBaseURL());
73
+ };
74
+ const detectPreferredTheme = () => {
75
+ var _a;
76
+ const win = getWindow();
77
+ if ((_a = win === null || win === void 0 ? void 0 : win.matchMedia) === null || _a === void 0 ? void 0 : _a.call(win, '(prefers-color-scheme: dark)').matches) {
78
+ return 'dark';
79
+ }
80
+ return 'light';
81
+ };
82
+ const isSupportedLocale = (locale) => {
83
+ return SUPPORTED_LOCALES.includes(locale);
84
+ };
85
+ const normalizeLocale = (locale) => {
86
+ const lowered = locale.toLowerCase();
87
+ const primary = lowered.split('-')[0].split('_')[0];
88
+ if (isSupportedLocale(primary)) {
89
+ return primary;
90
+ }
91
+ return DEFAULT_LOCALE;
92
+ };
93
+ const detectBrowserLocale = () => {
94
+ if (typeof navigator === 'undefined') {
95
+ return DEFAULT_LOCALE;
96
+ }
97
+ const languages = navigator.languages || [navigator.language];
98
+ for (const lang of languages) {
99
+ const normalized = normalizeLocale(lang);
100
+ if (normalized !== DEFAULT_LOCALE || lang.toLowerCase().startsWith('en')) {
101
+ return normalized;
102
+ }
103
+ }
104
+ return DEFAULT_LOCALE;
105
+ };
106
+ const findHtmlLangAttribute = (element) => {
107
+ let current = element;
108
+ while (current) {
109
+ const lang = current.getAttribute('lang');
110
+ if (lang) {
111
+ return lang;
112
+ }
113
+ current = current.parentElement;
114
+ }
115
+ return null;
116
+ };
117
+ const detectLanguage = (container) => {
118
+ const forcedLang = container.getAttribute('data-lang');
119
+ if (forcedLang) {
120
+ return normalizeLocale(forcedLang);
121
+ }
122
+ const ancestorLang = findHtmlLangAttribute(container.parentElement);
123
+ if (ancestorLang) {
124
+ return normalizeLocale(ancestorLang);
125
+ }
126
+ return detectBrowserLocale();
127
+ };
128
+ const resolveTheme = (theme) => {
129
+ if (theme === 'light' || theme === 'dark') {
130
+ return theme;
131
+ }
132
+ return detectPreferredTheme();
133
+ };
134
+ const appendParamsToURL = (url, params) => {
135
+ var _a;
136
+ const urlObject = new URL(url, (_a = getWindow()) === null || _a === void 0 ? void 0 : _a.location.href);
137
+ Object.entries(params).forEach(([key, value]) => {
138
+ if (value !== null && value !== undefined) {
139
+ urlObject.searchParams.set(key, value);
140
+ }
141
+ });
142
+ return urlObject.toString();
143
+ };
144
+ const clearExistingCaptcha = (container) => {
145
+ const existingFrames = container.querySelectorAll('iframe[id^="swetrix-captcha-"]');
146
+ existingFrames.forEach((frame) => {
147
+ const cid = frame.id.replace('-frame', '');
148
+ const input = container.querySelector(`input[id="${cid}"]`);
149
+ input === null || input === void 0 ? void 0 : input.remove();
150
+ captchaFrameOrigins.delete(cid);
151
+ captchaFrameSources.delete(cid);
152
+ const cidIndex = ids.indexOf(cid);
153
+ if (cidIndex > -1) {
154
+ ids.splice(cidIndex, 1);
155
+ }
156
+ frame.remove();
157
+ });
158
+ };
159
+ const renderCaptcha = (container, params) => {
160
+ clearExistingCaptcha(container);
161
+ const cParams = {
162
+ ...params,
163
+ cid: generateRandomID(),
164
+ };
165
+ const frame = generateCaptchaFrame(cParams);
166
+ const input = generateHiddenInput(cParams);
167
+ container.appendChild(frame);
168
+ captchaFrameSources.set(cParams.cid, frame.contentWindow);
169
+ container.appendChild(input);
170
+ };
171
+ const generateRandomID = () => {
172
+ const randomID = ID_PREFIX + Math.random().toString(36).substr(2, 6);
173
+ if (ids.includes(randomID)) {
174
+ return generateRandomID();
175
+ }
176
+ ids.push(randomID);
177
+ return randomID;
178
+ };
179
+ const postMessageCallback = (pmEvent) => {
180
+ var _a;
181
+ const data = pmEvent.data;
182
+ if (!data) {
183
+ return;
184
+ }
185
+ const { type, cid, event } = data;
186
+ if (type !== MESSAGE_IDENTIFIER) {
187
+ return;
188
+ }
189
+ if (!cid || !ids.includes(cid)) {
190
+ return;
191
+ }
192
+ const expectedOrigin = captchaFrameOrigins.get(cid);
193
+ const expectedSource = captchaFrameSources.get(cid);
194
+ if ((!expectedOrigin || pmEvent.origin !== expectedOrigin) &&
195
+ (!expectedSource || pmEvent.source !== expectedSource)) {
196
+ log(LOG_ACTIONS.error, `[PM -> ${event}] Unexpected origin: ${pmEvent.origin}`);
197
+ return;
198
+ }
199
+ const input = (_a = getDocument()) === null || _a === void 0 ? void 0 : _a.getElementById(cid);
200
+ const inputExists = input !== null;
201
+ switch (event) {
202
+ case 'success': {
203
+ const { token } = data;
204
+ if (!inputExists) {
205
+ log(LOG_ACTIONS.error, '[PM -> success] Input element does not exist.');
206
+ return;
207
+ }
208
+ input.value = token || '';
209
+ break;
210
+ }
211
+ case 'failure':
212
+ case 'tokenExpired': {
213
+ if (!inputExists) {
214
+ log(LOG_ACTIONS.error, '[PM -> failure] Input element does not exist.');
215
+ return;
216
+ }
217
+ input.value = '';
218
+ break;
219
+ }
220
+ }
221
+ };
222
+ const generateCaptchaFrame = (params) => {
223
+ const { assetBaseUrl, cid, theme: rawTheme, ...queryParams } = params;
224
+ const theme = resolveTheme(rawTheme);
225
+ const captchaFrame = document.createElement('iframe');
226
+ const captchaPage = theme === 'dark' ? 'pages/dark.html' : 'pages/light.html';
227
+ captchaFrame.id = getFrameID(cid);
228
+ captchaFrame.src = appendParamsToURL(new URL(captchaPage, assetBaseUrl).toString(), {
229
+ ...queryParams,
230
+ cid,
231
+ theme: rawTheme,
232
+ });
233
+ captchaFrameOrigins.set(cid, new URL(captchaFrame.src).origin);
234
+ captchaFrame.style.height = FRAME_HEIGHT;
235
+ captchaFrame.title = 'Swetrix Captcha - Human verification';
236
+ captchaFrame.style.border = 'none';
237
+ captchaFrame.style.width = '302px';
238
+ captchaFrame.style.overflow = 'visible';
239
+ captchaFrame.setAttribute('role', 'presentation');
240
+ captchaFrame.setAttribute('aria-label', 'Human verification widget');
241
+ return captchaFrame;
242
+ };
243
+ const generateHiddenInput = (params) => {
244
+ const { cid } = params;
245
+ const input = document.createElement('input');
246
+ input.type = 'hidden';
247
+ input.name = params.respName;
248
+ input.value = '';
249
+ input.id = cid;
250
+ input.setAttribute('aria-hidden', 'true');
251
+ return input;
252
+ };
253
+ const validateParams = (params) => {
254
+ const { theme, pid } = params;
255
+ if (theme && !THEMES.includes(theme)) {
256
+ log(LOG_ACTIONS.error, `Invalid data-theme parameter: ${theme}. Valid options are: ${THEMES.join(', ')}`);
257
+ return false;
258
+ }
259
+ if (!pid || !isValidPID(pid)) {
260
+ log(LOG_ACTIONS.error, `Invalid data-project-id parameter: ${pid}`);
261
+ return false;
262
+ }
263
+ return true;
264
+ };
265
+ const parseParams = (container) => {
266
+ const params = {
267
+ pid: container.getAttribute('data-project-id'),
268
+ respName: container.getAttribute('data-response-input-name') || DEFAULT_RESPONSE_INPUT_NAME,
269
+ theme: container.getAttribute('data-theme') || DEFAULT_THEME,
270
+ lang: detectLanguage(container),
271
+ assetBaseUrl: resolveAssetBaseURL(container),
272
+ };
273
+ const apiUrl = container.getAttribute('data-api-url');
274
+ if (apiUrl) {
275
+ params.apiUrl = apiUrl;
276
+ }
277
+ return params;
278
+ };
279
+ const isCaptchaRendered = (container) => container.querySelector('iframe[id^="swetrix-captcha-"]') !== null;
280
+ const registerMessageListener = () => {
281
+ const win = getWindow();
282
+ if (!win || messageListenerRegistered) {
283
+ return;
284
+ }
285
+ win.addEventListener('message', postMessageCallback);
286
+ messageListenerRegistered = true;
287
+ };
288
+ const loadCaptcha = (forced = false) => {
289
+ const win = getWindow();
290
+ const doc = getDocument();
291
+ if (!win || !doc) {
292
+ return;
293
+ }
294
+ win.swecaptcha = true;
295
+ registerMessageListener();
296
+ const containers = Array.from(doc.querySelectorAll(CAPTCHA_SELECTOR));
297
+ for (const container of containers) {
298
+ if (!forced && isCaptchaRendered(container)) {
299
+ continue;
300
+ }
301
+ const params = parseParams(container);
302
+ if (!validateParams(params)) {
303
+ log(LOG_ACTIONS.error, 'Aborting captcha rendering due to invalid parameters.');
304
+ return;
305
+ }
306
+ renderCaptcha(container, params);
307
+ }
308
+ };
309
+ const forceLoadCaptcha = () => loadCaptcha(true);
310
+ const setupCaptcha = () => {
311
+ const win = getWindow();
312
+ const doc = getDocument();
313
+ if (!win || !doc) {
314
+ return;
315
+ }
316
+ win.swetrixCaptchaForceLoad = forceLoadCaptcha;
317
+ if (doc.readyState === 'loading') {
318
+ doc.addEventListener('DOMContentLoaded', () => loadCaptcha(), { once: true });
319
+ return;
320
+ }
321
+ loadCaptcha();
322
+ };
323
+ setupCaptcha();
324
+
325
+ var index = {
326
+ forceLoadCaptcha,
327
+ loadCaptcha,
328
+ };
329
+
330
+ exports.default = index;
331
+ exports.forceLoadCaptcha = forceLoadCaptcha;
332
+ exports.loadCaptcha = loadCaptcha;
333
+ //# sourceMappingURL=captcha-loader.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"captcha-loader.cjs","sources":["../src/captcha-loader.ts","../src/index.ts"],"sourcesContent":[null,null],"names":[],"mappings":"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"}