@prosopo/procaptcha-react 2.11.2 → 2.12.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/.turbo/turbo-build$colon$cjs.log +13 -13
- package/.turbo/turbo-build$colon$tsc.log +21 -21
- package/.turbo/turbo-build.log +14 -13
- package/CHANGELOG.md +50 -0
- package/dist/cjs/components/button.cjs +100 -0
- package/dist/cjs/components/captchaComponent.cjs +210 -0
- package/dist/cjs/components/captchaWidget.cjs +203 -0
- package/dist/cjs/components/collector.cjs +49 -0
- package/dist/cjs/components/index.cjs +15 -6
- package/dist/cjs/components/modal.cjs +35 -0
- package/dist/cjs/components/procaptcha.cjs +23 -0
- package/dist/cjs/components/procaptchaWidget.cjs +166 -0
- package/dist/cjs/index.cjs +15 -6
- package/dist/cjs/util/index.cjs +6 -4
- package/dist/components/button.d.ts +9 -0
- package/dist/components/button.d.ts.map +1 -0
- package/dist/components/button.js +100 -0
- package/dist/components/button.js.map +1 -0
- package/dist/components/{CaptchaComponent.d.ts → captchaComponent.d.ts} +5 -3
- package/dist/components/captchaComponent.d.ts.map +1 -0
- package/dist/components/captchaComponent.js +210 -0
- package/dist/components/captchaComponent.js.map +1 -0
- package/dist/components/{CaptchaWidget.d.ts → captchaWidget.d.ts} +3 -2
- package/dist/components/captchaWidget.d.ts.map +1 -0
- package/dist/components/captchaWidget.js +203 -0
- package/dist/components/captchaWidget.js.map +1 -0
- package/dist/components/collector.d.ts +5 -4
- package/dist/components/collector.d.ts.map +1 -1
- package/dist/components/collector.js +46 -24
- package/dist/components/collector.js.map +1 -1
- package/dist/components/index.d.ts +7 -5
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +8 -4
- package/dist/components/index.js.map +1 -1
- package/dist/components/modal.d.ts +14 -0
- package/dist/components/modal.d.ts.map +1 -0
- package/dist/components/modal.js +35 -0
- package/dist/components/modal.js.map +1 -0
- package/dist/components/procaptcha.d.ts +7 -0
- package/dist/components/procaptcha.d.ts.map +1 -0
- package/dist/components/procaptcha.js +22 -0
- package/dist/components/procaptcha.js.map +1 -0
- package/dist/components/procaptchaWidget.d.ts +7 -0
- package/dist/components/procaptchaWidget.d.ts.map +1 -0
- package/dist/components/procaptchaWidget.js +166 -0
- package/dist/components/procaptchaWidget.js.map +1 -0
- package/dist/index.js +8 -4
- package/dist/tests/button.unit.test.d.ts.map +1 -1
- package/dist/tests/button.unit.test.js +69 -49
- package/dist/tests/button.unit.test.js.map +1 -1
- package/dist/tests/captchaComponent.unit.test.d.ts.map +1 -1
- package/dist/tests/captchaComponent.unit.test.js +31 -9
- package/dist/tests/captchaComponent.unit.test.js.map +1 -1
- package/dist/tests/captchaWidget.unit.test.d.ts.map +1 -1
- package/dist/tests/captchaWidget.unit.test.js +55 -9
- package/dist/tests/captchaWidget.unit.test.js.map +1 -1
- package/dist/tests/collector.unit.test.d.ts.map +1 -1
- package/dist/tests/collector.unit.test.js +43 -10
- package/dist/tests/collector.unit.test.js.map +1 -1
- package/dist/tests/harness.d.ts +2 -0
- package/dist/tests/harness.d.ts.map +1 -1
- package/dist/tests/harness.js +7 -0
- package/dist/tests/harness.js.map +1 -1
- package/dist/tests/modal.unit.test.d.ts.map +1 -1
- package/dist/tests/modal.unit.test.js +20 -7
- package/dist/tests/modal.unit.test.js.map +1 -1
- package/dist/tests/procaptcha.unit.test.d.ts.map +1 -1
- package/dist/tests/procaptcha.unit.test.js +37 -15
- package/dist/tests/procaptcha.unit.test.js.map +1 -1
- package/dist/tests/procaptchaReact.test-d.js +8 -6
- package/dist/tests/procaptchaReact.test-d.js.map +1 -1
- package/dist/tests/procaptchaWidget.unit.test.d.ts.map +1 -1
- package/dist/tests/procaptchaWidget.unit.test.js +112 -89
- package/dist/tests/procaptchaWidget.unit.test.js.map +1 -1
- package/dist/tests/render.d.ts +6 -7
- package/dist/tests/render.d.ts.map +1 -1
- package/dist/tests/render.js +23 -30
- package/dist/tests/render.js.map +1 -1
- package/dist/util/index.d.ts +8 -7
- package/dist/util/index.d.ts.map +1 -1
- package/dist/util/index.js +6 -4
- package/dist/util/index.js.map +1 -1
- package/package.json +8 -13
- package/vite.test.config.ts +1 -2
- package/dist/cjs/_virtual/_rolldown/runtime.cjs +0 -23
- package/dist/cjs/components/Button.cjs +0 -81
- package/dist/cjs/components/CaptchaComponent.cjs +0 -171
- package/dist/cjs/components/CaptchaWidget.cjs +0 -129
- package/dist/cjs/components/Modal.cjs +0 -35
- package/dist/cjs/components/Procaptcha.cjs +0 -7
- package/dist/cjs/components/ProcaptchaWidget.cjs +0 -168
- package/dist/components/Button.d.ts +0 -11
- package/dist/components/Button.d.ts.map +0 -1
- package/dist/components/Button.js +0 -81
- package/dist/components/Button.js.map +0 -1
- package/dist/components/CaptchaComponent.d.ts.map +0 -1
- package/dist/components/CaptchaComponent.js +0 -171
- package/dist/components/CaptchaComponent.js.map +0 -1
- package/dist/components/CaptchaWidget.d.ts.map +0 -1
- package/dist/components/CaptchaWidget.js +0 -129
- package/dist/components/CaptchaWidget.js.map +0 -1
- package/dist/components/Modal.d.ts +0 -13
- package/dist/components/Modal.d.ts.map +0 -1
- package/dist/components/Modal.js +0 -33
- package/dist/components/Modal.js.map +0 -1
- package/dist/components/Procaptcha.d.ts +0 -4
- package/dist/components/Procaptcha.d.ts.map +0 -1
- package/dist/components/Procaptcha.js +0 -7
- package/dist/components/Procaptcha.js.map +0 -1
- package/dist/components/ProcaptchaWidget.d.ts +0 -4
- package/dist/components/ProcaptchaWidget.d.ts.map +0 -1
- package/dist/components/ProcaptchaWidget.js +0 -168
- package/dist/components/ProcaptchaWidget.js.map +0 -1
- package/dist/tests/setup.d.ts +0 -5
- package/dist/tests/setup.d.ts.map +0 -1
- package/dist/tests/setup.js +0 -3
- package/dist/tests/setup.js.map +0 -1
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { applyStyles, createElement, mountChallengeSurface } from "@prosopo/procaptcha-common";
|
|
2
|
+
//#region src/components/modal.ts
|
|
3
|
+
/**
|
|
4
|
+
* The image captcha's dialog frame; positioning lives in `ChallengeSurface`.
|
|
5
|
+
*/
|
|
6
|
+
var mountModal = (initialProps) => {
|
|
7
|
+
const inner = createElement("div", { className: "prosopo-modalInner" });
|
|
8
|
+
applyStyles(inner, {
|
|
9
|
+
maxWidth: "500px",
|
|
10
|
+
maxHeight: "100%",
|
|
11
|
+
backgroundColor: "transparent",
|
|
12
|
+
border: "none",
|
|
13
|
+
borderRadius: "28px",
|
|
14
|
+
alignSelf: "center",
|
|
15
|
+
boxSizing: "border-box"
|
|
16
|
+
});
|
|
17
|
+
const surfaceProps = (props) => ({
|
|
18
|
+
show: props.show,
|
|
19
|
+
placement: props.placement,
|
|
20
|
+
anchor: props.anchor,
|
|
21
|
+
onDismiss: props.onDismiss,
|
|
22
|
+
scrim: "none",
|
|
23
|
+
className: "prosopo-modalOuter",
|
|
24
|
+
dialogLabel: props.dialogLabel
|
|
25
|
+
});
|
|
26
|
+
const surface = mountChallengeSurface(surfaceProps(initialProps));
|
|
27
|
+
surface.content.appendChild(inner);
|
|
28
|
+
return {
|
|
29
|
+
content: inner,
|
|
30
|
+
update: (props) => surface.update(surfaceProps(props)),
|
|
31
|
+
destroy: () => surface.destroy()
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
//#endregion
|
|
35
|
+
export { mountModal };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modal.js","sourceRoot":"","sources":["../../src/components/modal.ts"],"names":[],"mappings":"AAcA,OAAO,EAEN,WAAW,EACX,aAAa,EACb,qBAAqB,GACrB,MAAM,4BAA4B,CAAC;AAoBpC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,YAAwB,EAAkB,EAAE;IACtE,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,oBAAoB,EAAE,CAAC,CAAC;IAExE,WAAW,CAAC,KAAK,EAAE;QAClB,QAAQ,EAAE,OAAO;QACjB,SAAS,EAAE,MAAM;QACjB,eAAe,EAAE,aAAa;QAC9B,MAAM,EAAE,MAAM;QACd,YAAY,EAAE,MAAM;QACpB,SAAS,EAAE,QAAQ;QACnB,SAAS,EAAE,YAAY;KACvB,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,CAAC,KAAiB,EAAE,EAAE,CAAC,CAAC;QAC5C,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,KAAK,EAAE,MAAe;QACtB,SAAS,EAAE,oBAAoB;QAC/B,WAAW,EAAE,KAAK,CAAC,WAAW;KAC9B,CAAC,CAAC;IAEH,MAAM,OAAO,GAA8B,qBAAqB,CAC/D,YAAY,CAAC,YAAY,CAAC,CAC1B,CAAC;IACF,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAEnC,OAAO;QACN,OAAO,EAAE,KAAK;QACd,MAAM,EAAE,CAAC,KAAiB,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAClE,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;KAChC,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ProcaptchaProps } from "@prosopo/types";
|
|
2
|
+
import type { ProcaptchaWidgetHandle } from "./procaptchaWidget.js";
|
|
3
|
+
export type { ProcaptchaWidgetHandle };
|
|
4
|
+
export type ProcaptchaMountFn = (container: HTMLElement, props: ProcaptchaProps) => ProcaptchaWidgetHandle;
|
|
5
|
+
export declare const loadProcaptcha: () => Promise<ProcaptchaMountFn>;
|
|
6
|
+
export declare const mountProcaptcha: (container: HTMLElement, props: ProcaptchaProps) => ProcaptchaWidgetHandle;
|
|
7
|
+
//# sourceMappingURL=procaptcha.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"procaptcha.d.ts","sourceRoot":"","sources":["../../src/components/procaptcha.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAEpE,YAAY,EAAE,sBAAsB,EAAE,CAAC;AAOvC,MAAM,MAAM,iBAAiB,GAAG,CAC/B,SAAS,EAAE,WAAW,EACtB,KAAK,EAAE,eAAe,KAClB,sBAAsB,CAAC;AAE5B,eAAO,MAAM,cAAc,QAAa,OAAO,CAAC,iBAAiB,CACE,CAAC;AAOpE,eAAO,MAAM,eAAe,cAChB,WAAW,SACf,eAAe,KACpB,sBAkBF,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
//#region src/components/procaptcha.ts
|
|
2
|
+
var loadProcaptcha = async () => (await import("./procaptchaWidget.js")).mountProcaptchaImageWidget;
|
|
3
|
+
/**
|
|
4
|
+
* Mount without awaiting the chunk. Nothing renders until the import lands,
|
|
5
|
+
* matching `<Suspense>` with no fallback; destroying before then cancels the
|
|
6
|
+
* mount rather than leaving an orphan behind.
|
|
7
|
+
*/
|
|
8
|
+
var mountProcaptcha = (container, props) => {
|
|
9
|
+
let destroyed = false;
|
|
10
|
+
let inner;
|
|
11
|
+
loadProcaptcha().then((mount) => {
|
|
12
|
+
if (destroyed) return;
|
|
13
|
+
inner = mount(container, props);
|
|
14
|
+
});
|
|
15
|
+
return { destroy: () => {
|
|
16
|
+
destroyed = true;
|
|
17
|
+
inner?.destroy();
|
|
18
|
+
inner = void 0;
|
|
19
|
+
} };
|
|
20
|
+
};
|
|
21
|
+
//#endregion
|
|
22
|
+
export { loadProcaptcha, mountProcaptcha };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"procaptcha.js","sourceRoot":"","sources":["../../src/components/procaptcha.ts"],"names":[],"mappings":"AA6BA,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,IAAgC,EAAE,CACpE,CAAC,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC,0BAA0B,CAAC;AAOpE,MAAM,CAAC,MAAM,eAAe,GAAG,CAC9B,SAAsB,EACtB,KAAsB,EACG,EAAE;IAC3B,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,KAAyC,CAAC;IAE9C,KAAK,cAAc,EAAE,CAAC,IAAI,CAAC,CAAC,KAAwB,EAAE,EAAE;QACvD,IAAI,SAAS,EAAE,CAAC;YACf,OAAO;QACR,CAAC;QACD,KAAK,GAAG,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,OAAO;QACN,OAAO,EAAE,GAAG,EAAE;YACb,SAAS,GAAG,IAAI,CAAC;YACjB,KAAK,EAAE,OAAO,EAAE,CAAC;YACjB,KAAK,GAAG,SAAS,CAAC;QACnB,CAAC;KACD,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type ProcaptchaProps } from "@prosopo/types";
|
|
2
|
+
export interface ProcaptchaWidgetHandle {
|
|
3
|
+
destroy(): void;
|
|
4
|
+
}
|
|
5
|
+
export declare const mountProcaptchaImageWidget: (container: HTMLElement, props: ProcaptchaProps) => ProcaptchaWidgetHandle;
|
|
6
|
+
export default mountProcaptchaImageWidget;
|
|
7
|
+
//# sourceMappingURL=procaptchaWidget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"procaptchaWidget.d.ts","sourceRoot":"","sources":["../../src/components/procaptchaWidget.ts"],"names":[],"mappings":"AA8BA,OAAO,EAEN,KAAK,eAAe,EAEpB,MAAM,gBAAgB,CAAC;AAWxB,MAAM,WAAW,sBAAsB;IACtC,OAAO,IAAI,IAAI,CAAC;CAChB;AAED,eAAO,MAAM,0BAA0B,cAC3B,WAAW,SACf,eAAe,KACpB,sBAuQF,CAAC;AAEF,eAAe,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import "../_virtual/_rolldown/runtime.js";
|
|
2
|
+
import { mountModal } from "./modal.js";
|
|
3
|
+
import { mountCaptchaComponent } from "./captchaComponent.js";
|
|
4
|
+
import { Teardown, createElement, createProcaptchaState, createRenderScheduler, isEventTrusted, mountCheckbox, mountHoneypot, mountTestModeBanner } from "@prosopo/procaptcha-common";
|
|
5
|
+
import { darkTheme, lightTheme } from "@prosopo/widget-skeleton";
|
|
6
|
+
import { Manager } from "@prosopo/procaptcha";
|
|
7
|
+
import { createTranslator, loadI18next } from "@prosopo/locale";
|
|
8
|
+
import { ProcaptchaConfigSchema } from "@prosopo/types";
|
|
9
|
+
//#region src/components/procaptchaWidget.ts
|
|
10
|
+
var PROCAPTCHA_EXECUTE_EVENT = "procaptcha:execute";
|
|
11
|
+
var mountProcaptchaImageWidget = (container, props) => {
|
|
12
|
+
const teardown = new Teardown();
|
|
13
|
+
const config = ProcaptchaConfigSchema.parse(props.config);
|
|
14
|
+
const frictionlessState = props.frictionlessState;
|
|
15
|
+
const i18n = props.i18n;
|
|
16
|
+
const callbacks = props.callbacks || {};
|
|
17
|
+
const translator = createTranslator(i18n);
|
|
18
|
+
const isInvisible = "invisible" === config.mode;
|
|
19
|
+
const store = createProcaptchaState();
|
|
20
|
+
let loading = false;
|
|
21
|
+
let lastError = store.state.error;
|
|
22
|
+
let lastCoords = null;
|
|
23
|
+
let sessionInvalidatedFired = false;
|
|
24
|
+
let honeypot;
|
|
25
|
+
let captcha;
|
|
26
|
+
let checkbox;
|
|
27
|
+
const delegatesReload = Boolean(props.onReload);
|
|
28
|
+
const manager = Manager(config, store.state, store.update, callbacks, frictionlessState, () => honeypot?.getValue(), delegatesReload ? (x, y) => props.onReload?.(x, y) : void 0);
|
|
29
|
+
const root = createElement("div", { className: isInvisible ? void 0 : "image-captcha" });
|
|
30
|
+
container.appendChild(root);
|
|
31
|
+
if (frictionlessState?.hp) honeypot = mountHoneypot(root, { encodedQuestion: frictionlessState.hp });
|
|
32
|
+
const modalProps = () => ({
|
|
33
|
+
show: store.state.showModal,
|
|
34
|
+
placement: config.placement,
|
|
35
|
+
anchor: props.container,
|
|
36
|
+
onDismiss: manager.cancel,
|
|
37
|
+
dialogLabel: translator.t("WIDGET.IMAGE_DIALOG_LABEL", { defaultValue: "Image challenge" })
|
|
38
|
+
});
|
|
39
|
+
const modal = mountModal(modalProps());
|
|
40
|
+
const emptyChallenge = createElement("div", { text: "No challenge set." });
|
|
41
|
+
const banner = isInvisible ? void 0 : mountTestModeBanner(root, { siteKey: config.account.address ?? "" });
|
|
42
|
+
const captchaProps = (challenge) => ({
|
|
43
|
+
challenge,
|
|
44
|
+
index: store.state.index,
|
|
45
|
+
solutions: store.state.solutions,
|
|
46
|
+
onSubmit: manager.submit,
|
|
47
|
+
onCancel: manager.cancel,
|
|
48
|
+
onClick: manager.select,
|
|
49
|
+
onNext: manager.nextRound,
|
|
50
|
+
onReload: manager.reload,
|
|
51
|
+
themeColor: config.theme ?? "light",
|
|
52
|
+
translator
|
|
53
|
+
});
|
|
54
|
+
const renderModal = () => {
|
|
55
|
+
modal.update(modalProps());
|
|
56
|
+
const challenge = store.state.challenge;
|
|
57
|
+
if (void 0 !== challenge) {
|
|
58
|
+
emptyChallenge.parentNode?.removeChild(emptyChallenge);
|
|
59
|
+
if (void 0 === captcha) captcha = mountCaptchaComponent(modal.content, captchaProps(challenge));
|
|
60
|
+
else captcha.update(captchaProps(challenge));
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
captcha?.destroy();
|
|
64
|
+
captcha = void 0;
|
|
65
|
+
if (!isInvisible && emptyChallenge.parentNode !== modal.content) modal.content.appendChild(emptyChallenge);
|
|
66
|
+
};
|
|
67
|
+
const runErrorEffect = () => {
|
|
68
|
+
if (store.state.error === lastError) return;
|
|
69
|
+
lastError = store.state.error;
|
|
70
|
+
if (!store.state.error) return;
|
|
71
|
+
loading = false;
|
|
72
|
+
if ("CAPTCHA.NO_SESSION_FOUND" !== store.state.error.key) return;
|
|
73
|
+
if (props.onSessionInvalidated && !sessionInvalidatedFired) {
|
|
74
|
+
sessionInvalidatedFired = true;
|
|
75
|
+
props.onSessionInvalidated(lastCoords?.x, lastCoords?.y);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (frictionlessState) {
|
|
79
|
+
const timer = setTimeout(() => {
|
|
80
|
+
frictionlessState.restart();
|
|
81
|
+
}, 100);
|
|
82
|
+
teardown.add(() => clearTimeout(timer));
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
const render = () => {
|
|
86
|
+
runErrorEffect();
|
|
87
|
+
renderModal();
|
|
88
|
+
checkbox?.update(checkboxProps());
|
|
89
|
+
};
|
|
90
|
+
const scheduler = createRenderScheduler(render);
|
|
91
|
+
const checkboxProps = () => ({
|
|
92
|
+
theme: "light" === props.config.theme ? lightTheme : darkTheme,
|
|
93
|
+
checked: store.state.isHuman,
|
|
94
|
+
labelText: translator.isReady() ? translator.t("WIDGET.I_AM_HUMAN") : "",
|
|
95
|
+
error: store.state.error?.message,
|
|
96
|
+
loadingText: translator.t("WIDGET.CHECKING", { defaultValue: "Checking that you are human" }),
|
|
97
|
+
loading,
|
|
98
|
+
onChange: async (event) => {
|
|
99
|
+
if (!isEventTrusted(event)) return;
|
|
100
|
+
if (loading) return;
|
|
101
|
+
loading = true;
|
|
102
|
+
scheduler.schedule();
|
|
103
|
+
let x = 0;
|
|
104
|
+
let y = 0;
|
|
105
|
+
if ("clientX" in event && "clientY" in event) {
|
|
106
|
+
x = event.clientX;
|
|
107
|
+
y = event.clientY;
|
|
108
|
+
}
|
|
109
|
+
lastCoords = {
|
|
110
|
+
x,
|
|
111
|
+
y
|
|
112
|
+
};
|
|
113
|
+
try {
|
|
114
|
+
await manager.start(x, y);
|
|
115
|
+
} catch (error) {
|
|
116
|
+
console.error("Error starting verification:", error);
|
|
117
|
+
} finally {
|
|
118
|
+
loading = false;
|
|
119
|
+
scheduler.schedule();
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
if (!isInvisible) checkbox = mountCheckbox(root, checkboxProps());
|
|
124
|
+
teardown.add(scheduler.cancel);
|
|
125
|
+
teardown.add(store.subscribe(scheduler.schedule));
|
|
126
|
+
teardown.add(translator.subscribe(scheduler.schedule));
|
|
127
|
+
const handleExecute = () => {
|
|
128
|
+
store.update({ showModal: true });
|
|
129
|
+
if (!store.state.challenge) {
|
|
130
|
+
console.log("No challenge set, attempting to start verification");
|
|
131
|
+
try {
|
|
132
|
+
manager.start();
|
|
133
|
+
} catch (error) {
|
|
134
|
+
console.error("Error starting verification:", error);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
teardown.addEventListener(document, PROCAPTCHA_EXECUTE_EVENT, handleExecute);
|
|
139
|
+
if (props.container) teardown.addEventListener(props.container, PROCAPTCHA_EXECUTE_EVENT, handleExecute);
|
|
140
|
+
if (config.language) if (i18n) {
|
|
141
|
+
if (i18n.language !== config.language) i18n.changeLanguage(config.language);
|
|
142
|
+
} else loadI18next(false, config.language);
|
|
143
|
+
if (props.autoStart) {
|
|
144
|
+
loading = true;
|
|
145
|
+
const coords = props.startCoords;
|
|
146
|
+
lastCoords = coords ?? null;
|
|
147
|
+
scheduler.schedule();
|
|
148
|
+
const clearLoading = () => {
|
|
149
|
+
loading = false;
|
|
150
|
+
scheduler.schedule();
|
|
151
|
+
};
|
|
152
|
+
manager.start(coords?.x ?? 0, coords?.y ?? 0).then(clearLoading, clearLoading);
|
|
153
|
+
}
|
|
154
|
+
render();
|
|
155
|
+
return { destroy: () => {
|
|
156
|
+
teardown.run();
|
|
157
|
+
captcha?.destroy();
|
|
158
|
+
modal.destroy();
|
|
159
|
+
checkbox?.destroy();
|
|
160
|
+
banner?.destroy();
|
|
161
|
+
honeypot?.destroy();
|
|
162
|
+
root.parentNode?.removeChild(root);
|
|
163
|
+
} };
|
|
164
|
+
};
|
|
165
|
+
//#endregion
|
|
166
|
+
export { mountProcaptchaImageWidget as default, mountProcaptchaImageWidget };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"procaptchaWidget.js","sourceRoot":"","sources":["../../src/components/procaptchaWidget.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import "./_virtual/_rolldown/runtime.js";
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
|
|
2
|
+
import { mountButton } from "./components/button.js";
|
|
3
|
+
import { mountModal } from "./components/modal.js";
|
|
4
|
+
import { mountCaptchaWidget } from "./components/captchaWidget.js";
|
|
5
|
+
import { mountCaptchaComponent } from "./components/captchaComponent.js";
|
|
6
|
+
import mountCollector from "./components/collector.js";
|
|
7
|
+
import mountProcaptchaImageWidget from "./components/procaptchaWidget.js";
|
|
8
|
+
import { loadProcaptcha, mountProcaptcha } from "./components/procaptcha.js";
|
|
9
|
+
export { loadProcaptcha, mountButton, mountCaptchaComponent, mountCaptchaWidget, mountCollector, mountModal, mountProcaptcha, mountProcaptchaImageWidget };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"button.unit.test.d.ts","sourceRoot":"","sources":["../../src/tests/button.unit.test.
|
|
1
|
+
{"version":3,"file":"button.unit.test.d.ts","sourceRoot":"","sources":["../../src/tests/button.unit.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,93 +1,106 @@
|
|
|
1
|
-
import { jsx as _jsx } from "@emotion/react/jsx-runtime";
|
|
2
1
|
import { darkTheme, lightTheme, withAlpha } from "@prosopo/widget-skeleton";
|
|
3
2
|
import { afterEach, beforeEach, describe, expect, test, vi } from "vitest";
|
|
4
|
-
import
|
|
5
|
-
import { asRgb, fire, fireAndReturn, mount } from "./render.js";
|
|
3
|
+
import { mountButton } from "../components/button.js";
|
|
4
|
+
import { asRgb, fire, fireAndReturn, mount, styleSnapshot, } from "./render.js";
|
|
6
5
|
let mounted;
|
|
6
|
+
let button;
|
|
7
7
|
const onClick = vi.fn();
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
const props = (overrides = {}) => ({
|
|
9
|
+
themeColor: overrides.themeColor ?? "light",
|
|
10
|
+
buttonType: overrides.buttonType ?? "next",
|
|
11
|
+
text: overrides.text ?? "Next",
|
|
12
|
+
onClick,
|
|
13
|
+
});
|
|
14
|
+
const render = (overrides = {}) => {
|
|
15
|
+
if (button) {
|
|
16
|
+
button.update(props(overrides));
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
button = mountButton(mounted.container, props(overrides));
|
|
20
|
+
}
|
|
21
|
+
const element = mounted.container.querySelector("button");
|
|
22
|
+
if (!element)
|
|
12
23
|
throw new Error("expected a button to be rendered");
|
|
13
|
-
return
|
|
24
|
+
return element;
|
|
14
25
|
};
|
|
15
26
|
beforeEach(() => {
|
|
16
27
|
vi.clearAllMocks();
|
|
17
28
|
process.env.NODE_ENV = "test";
|
|
18
29
|
mounted = mount();
|
|
30
|
+
button = undefined;
|
|
19
31
|
});
|
|
20
32
|
afterEach(() => {
|
|
33
|
+
button?.destroy();
|
|
21
34
|
mounted.unmount();
|
|
22
35
|
});
|
|
23
36
|
describe("what the button renders", () => {
|
|
24
37
|
test("shows its text and labels itself with it", () => {
|
|
25
|
-
const
|
|
26
|
-
expect(
|
|
27
|
-
expect(
|
|
38
|
+
const element = render({ text: "Submit" });
|
|
39
|
+
expect(element.textContent).toBe("Submit");
|
|
40
|
+
expect(element.getAttribute("aria-label")).toBe("Submit");
|
|
28
41
|
});
|
|
29
42
|
test("renders an empty label without falling over", () => {
|
|
30
|
-
const
|
|
31
|
-
expect(
|
|
43
|
+
const element = render({ text: "" });
|
|
44
|
+
expect(element.textContent).toBe("");
|
|
32
45
|
});
|
|
33
46
|
test("carries the test hook naming its role", () => {
|
|
34
|
-
const
|
|
35
|
-
expect(
|
|
47
|
+
const element = render({ buttonType: "cancel" });
|
|
48
|
+
expect(element.getAttribute("data-cy")).toBe("button-cancel");
|
|
36
49
|
});
|
|
37
50
|
test("drops the test hook in a production build", () => {
|
|
38
51
|
process.env.NODE_ENV = "production";
|
|
39
|
-
const
|
|
40
|
-
expect(
|
|
52
|
+
const element = render({ buttonType: "cancel" });
|
|
53
|
+
expect(element.getAttribute("data-cy")).toBeNull();
|
|
41
54
|
});
|
|
42
55
|
});
|
|
43
56
|
describe("theming", () => {
|
|
44
57
|
test("is a borderless pill, not an outlined box", () => {
|
|
45
|
-
const
|
|
46
|
-
expect(
|
|
47
|
-
expect(
|
|
48
|
-
expect(
|
|
58
|
+
const element = render();
|
|
59
|
+
expect(element.style.borderRadius).toBe(lightTheme.shape.button);
|
|
60
|
+
expect(element.style.borderColor).toBe("");
|
|
61
|
+
expect(element.style.borderWidth).toBe("");
|
|
49
62
|
});
|
|
50
63
|
test("a cancel button is transparent until it is hovered", () => {
|
|
51
|
-
const
|
|
52
|
-
expect(
|
|
64
|
+
const element = render({ buttonType: "cancel" });
|
|
65
|
+
expect(element.style.backgroundColor).toBe("transparent");
|
|
53
66
|
});
|
|
54
67
|
test("a next button is filled with the brand primary", () => {
|
|
55
|
-
const
|
|
56
|
-
expect(
|
|
68
|
+
const element = render({ buttonType: "next" });
|
|
69
|
+
expect(element.style.backgroundColor).toBe(asRgb(lightTheme.palette.primary.main));
|
|
57
70
|
});
|
|
58
71
|
test("a dark next button takes its fill from the dark theme", () => {
|
|
59
|
-
const
|
|
60
|
-
expect(
|
|
72
|
+
const element = render({ buttonType: "next", themeColor: "dark" });
|
|
73
|
+
expect(element.style.backgroundColor).toBe(asRgb(darkTheme.palette.primary.main));
|
|
61
74
|
});
|
|
62
75
|
test("hovering a cancel button reveals the primary state layer", () => {
|
|
63
|
-
const
|
|
64
|
-
fire(
|
|
65
|
-
expect(
|
|
76
|
+
const element = render({ buttonType: "cancel" });
|
|
77
|
+
fire(element, "mouseenter");
|
|
78
|
+
expect(element.style.backgroundColor).toBe(withAlpha(lightTheme.palette.primary.main, lightTheme.stateLayer.hover));
|
|
66
79
|
});
|
|
67
80
|
test("hovering a next button composites a state layer over its fill", () => {
|
|
68
|
-
const
|
|
69
|
-
fire(
|
|
70
|
-
expect(
|
|
71
|
-
expect(
|
|
81
|
+
const element = render({ buttonType: "next" });
|
|
82
|
+
fire(element, "mouseenter");
|
|
83
|
+
expect(element.style.backgroundColor).toBe(asRgb(lightTheme.palette.primary.main));
|
|
84
|
+
expect(element.style.boxShadow).toContain(withAlpha(lightTheme.palette.primary.contrastText, lightTheme.stateLayer.hover));
|
|
72
85
|
});
|
|
73
86
|
test("leaving the button drops the state layer again", () => {
|
|
74
|
-
const
|
|
75
|
-
fire(
|
|
76
|
-
fire(
|
|
77
|
-
expect(
|
|
78
|
-
expect(
|
|
87
|
+
const element = render({ buttonType: "next" });
|
|
88
|
+
fire(element, "mouseenter");
|
|
89
|
+
fire(element, "mouseleave");
|
|
90
|
+
expect(element.style.backgroundColor).toBe(asRgb(lightTheme.palette.primary.main));
|
|
91
|
+
expect(element.style.boxShadow).not.toContain("inset");
|
|
79
92
|
});
|
|
80
93
|
test("a filled button keeps its on-primary text throughout", () => {
|
|
81
|
-
const
|
|
82
|
-
expect(
|
|
83
|
-
fire(
|
|
84
|
-
expect(
|
|
94
|
+
const element = render();
|
|
95
|
+
expect(element.style.color).toBe(asRgb(lightTheme.palette.primary.contrastText));
|
|
96
|
+
fire(element, "mouseenter");
|
|
97
|
+
expect(element.style.color).toBe(asRgb(lightTheme.palette.primary.contrastText));
|
|
85
98
|
});
|
|
86
99
|
test("re-rendering with the same theme keeps the styling stable", () => {
|
|
87
|
-
const
|
|
88
|
-
const before =
|
|
100
|
+
const element = render({ themeColor: "dark" });
|
|
101
|
+
const before = styleSnapshot(element);
|
|
89
102
|
render({ themeColor: "dark" });
|
|
90
|
-
expect(
|
|
103
|
+
expect(styleSnapshot(element)).toEqual(before);
|
|
91
104
|
});
|
|
92
105
|
});
|
|
93
106
|
describe("clicking", () => {
|
|
@@ -108,10 +121,17 @@ describe("clicking", () => {
|
|
|
108
121
|
expect(event.defaultPrevented).toBe(false);
|
|
109
122
|
});
|
|
110
123
|
test("every click is reported, not just the first", () => {
|
|
111
|
-
const
|
|
112
|
-
fire(
|
|
113
|
-
fire(
|
|
124
|
+
const element = render();
|
|
125
|
+
fire(element, "click");
|
|
126
|
+
fire(element, "click");
|
|
114
127
|
expect(onClick).toHaveBeenCalledTimes(2);
|
|
115
128
|
});
|
|
129
|
+
test("a destroyed button stops listening", () => {
|
|
130
|
+
const element = render();
|
|
131
|
+
button?.destroy();
|
|
132
|
+
button = undefined;
|
|
133
|
+
element.dispatchEvent(new MouseEvent("click", { bubbles: true }));
|
|
134
|
+
expect(onClick).not.toHaveBeenCalled();
|
|
135
|
+
});
|
|
116
136
|
});
|
|
117
137
|
//# sourceMappingURL=button.unit.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"button.unit.test.js","sourceRoot":"","sources":["../../src/tests/button.unit.test.
|
|
1
|
+
{"version":3,"file":"button.unit.test.js","sourceRoot":"","sources":["../../src/tests/button.unit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"captchaComponent.unit.test.d.ts","sourceRoot":"","sources":["../../src/tests/captchaComponent.unit.test.
|
|
1
|
+
{"version":3,"file":"captchaComponent.unit.test.d.ts","sourceRoot":"","sources":["../../src/tests/captchaComponent.unit.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,14 +1,10 @@
|
|
|
1
|
-
import { jsx as _jsx } from "@emotion/react/jsx-runtime";
|
|
2
1
|
import { darkTheme, lightTheme } from "@prosopo/widget-skeleton";
|
|
3
2
|
import { afterEach, beforeEach, describe, expect, test, vi } from "vitest";
|
|
4
|
-
import
|
|
5
|
-
import { captcha, challengeResponse } from "./harness.js";
|
|
3
|
+
import { mountCaptchaComponent, } from "../components/captchaComponent.js";
|
|
4
|
+
import { captcha, challengeResponse, translator } from "./harness.js";
|
|
6
5
|
import { asRgb, fire, mount } from "./render.js";
|
|
7
|
-
vi.mock("@prosopo/locale", async (importOriginal) => {
|
|
8
|
-
const actual = await importOriginal();
|
|
9
|
-
return { ...actual, useTranslation: () => ({ t: (key) => key }) };
|
|
10
|
-
});
|
|
11
6
|
let mounted;
|
|
7
|
+
let component;
|
|
12
8
|
const onSubmit = vi.fn();
|
|
13
9
|
const onCancel = vi.fn();
|
|
14
10
|
const onClick = vi.fn();
|
|
@@ -20,8 +16,25 @@ const twoRoundChallenge = () => challengeResponse({
|
|
|
20
16
|
captcha({ captchaId: "captcha-id-2", target: "train" }),
|
|
21
17
|
],
|
|
22
18
|
});
|
|
23
|
-
const
|
|
24
|
-
|
|
19
|
+
const props = (overrides = {}) => ({
|
|
20
|
+
challenge: overrides.challenge ?? challengeResponse(),
|
|
21
|
+
index: overrides.index ?? 0,
|
|
22
|
+
solutions: overrides.solutions ?? [[]],
|
|
23
|
+
onSubmit,
|
|
24
|
+
onCancel,
|
|
25
|
+
onClick,
|
|
26
|
+
onNext,
|
|
27
|
+
onReload,
|
|
28
|
+
themeColor: overrides.themeColor ?? "light",
|
|
29
|
+
translator: translator(),
|
|
30
|
+
});
|
|
31
|
+
const render = (overrides = {}) => {
|
|
32
|
+
if (component) {
|
|
33
|
+
component.update(props(overrides));
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
component = mountCaptchaComponent(mounted.container, props(overrides));
|
|
37
|
+
}
|
|
25
38
|
};
|
|
26
39
|
const buttonLabelled = (label) => {
|
|
27
40
|
const button = mounted.container.querySelector(`button[aria-label="${label}"]`);
|
|
@@ -33,8 +46,10 @@ const text = () => mounted.container.textContent ?? "";
|
|
|
33
46
|
beforeEach(() => {
|
|
34
47
|
vi.clearAllMocks();
|
|
35
48
|
mounted = mount();
|
|
49
|
+
component = undefined;
|
|
36
50
|
});
|
|
37
51
|
afterEach(() => {
|
|
52
|
+
component?.destroy();
|
|
38
53
|
mounted.unmount();
|
|
39
54
|
});
|
|
40
55
|
describe("the prompt", () => {
|
|
@@ -116,6 +131,13 @@ describe("the controls", () => {
|
|
|
116
131
|
render({ challenge: twoRoundChallenge(), index: 1, solutions: [[], []] });
|
|
117
132
|
expect(buttonLabelled("WIDGET.SUBMIT")).toBeDefined();
|
|
118
133
|
});
|
|
134
|
+
test("advancing a round swaps next for submit in place", () => {
|
|
135
|
+
const challenge = twoRoundChallenge();
|
|
136
|
+
render({ challenge, index: 0, solutions: [[], []] });
|
|
137
|
+
const next = buttonLabelled("WIDGET.NEXT");
|
|
138
|
+
render({ challenge, index: 1, solutions: [[], []] });
|
|
139
|
+
expect(buttonLabelled("WIDGET.SUBMIT")).toBe(next);
|
|
140
|
+
});
|
|
119
141
|
test("a synthetic click on cancel is ignored", () => {
|
|
120
142
|
render();
|
|
121
143
|
fire(buttonLabelled("WIDGET.CANCEL"), "click", { trusted: false });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"captchaComponent.unit.test.js","sourceRoot":"","sources":["../../src/tests/captchaComponent.unit.test.
|
|
1
|
+
{"version":3,"file":"captchaComponent.unit.test.js","sourceRoot":"","sources":["../../src/tests/captchaComponent.unit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"captchaWidget.unit.test.d.ts","sourceRoot":"","sources":["../../src/tests/captchaWidget.unit.test.
|
|
1
|
+
{"version":3,"file":"captchaWidget.unit.test.d.ts","sourceRoot":"","sources":["../../src/tests/captchaWidget.unit.test.ts"],"names":[],"mappings":""}
|