vue-recaptcha
Version:
ReCAPTCHA vue component
50 lines (49 loc) • 1.59 kB
JavaScript
import pDefer from "p-defer";
import defu from "defu";
import { warn } from "../utils.mjs";
export function defineScriptLoader(fn) {
return (options) => {
return fn(normalizeScriptLoaderOptions(options));
};
}
export function normalizeScriptLoaderOptions(options) {
return {
...options,
recaptchaApiURL: options.recaptchaApiURL ?? (options.useRecaptchaNet ? "https://www.recaptcha.net/recaptcha/api.js" : "https://www.google.com/recaptcha/api.js")
};
}
export const recaptchaLoaded = pDefer();
const ONLOAD_KEY = "__vueRecaptchaLoaded";
if (typeof window !== "undefined") {
window[ONLOAD_KEY] = () => {
recaptchaLoaded.resolve();
};
}
export function toQueryString(params) {
return new URLSearchParams(normalizeParams(params)).toString();
}
export function normalizeParams(raw) {
const params = defu(raw, { onload: ONLOAD_KEY, render: "explicit" });
if (params.render === "onload") {
warn("passing `onload` as `render` param is not allowed");
params.render = "explicit";
}
if (params.onload !== ONLOAD_KEY) {
warn("passing `onload` param with other value is not allowed");
params.onload = ONLOAD_KEY;
}
return toStringPair(params);
}
export function toStringPair(params) {
return Object.entries(params).filter((pair) => typeof pair[1] === "string");
}
export function checkRecaptchaLoad() {
if (typeof window === "undefined") {
return false;
}
const isLoaded = Object.hasOwn(window, "grecaptcha") && Object.hasOwn(window.grecaptcha, "execute");
if (isLoaded) {
recaptchaLoaded.resolve();
}
return isLoaded;
}