UNPKG

@semantic-components/re-captcha

Version:

**@semantic-components/re-captcha** is an Angular library designed to simplify the integration of Google reCAPTCHA into your Angular applications. It supports reCAPTCHA v2 and v3, providing an easy-to-use API and seamless setup for enhancing your app's se

1 lines 29.9 kB
{"version":3,"file":"semantic-components-re-captcha.mjs","sources":["../../../../libs/re-captcha/src/lib/re-captcha/re-captcha-config.ts","../../../../libs/re-captcha/src/lib/re-captcha/re-captcha-provider.ts","../../../../libs/re-captcha/src/lib/re-captcha/re-captcha.service.ts","../../../../libs/re-captcha/src/lib/re-captcha/score-re-captcha.ts","../../../../libs/re-captcha/src/lib/re-captcha/id-generator.ts","../../../../libs/re-captcha/src/lib/re-captcha/re-captcha-base.ts","../../../../libs/re-captcha/src/lib/re-captcha/checkbox-re-captcha.ts","../../../../libs/re-captcha/src/lib/re-captcha/invisible-re-captcha.ts","../../../../libs/re-captcha/src/semantic-components-re-captcha.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport const SC_RE_CAPTCHA_V2_SITE_KEY = new InjectionToken<string>('SC_RE_CAPTCHA_V2_SITE_KEY');\n\nexport const SC_RE_CAPTCHA_V3_SITE_KEY = new InjectionToken<string>('SC_RE_CAPTCHA_V3_SITE_KEY');\n\nexport const SC_RE_CAPTCHA_LANGUAGE_CODE = new InjectionToken<string>(\n 'SC_RE_CAPTCHA_LANGUAGE_CODE',\n);\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\n\nimport {\n SC_RE_CAPTCHA_LANGUAGE_CODE,\n SC_RE_CAPTCHA_V2_SITE_KEY,\n SC_RE_CAPTCHA_V3_SITE_KEY,\n} from './re-captcha-config';\n\ninterface ScReCaptchaSettings {\n v2SiteKey?: string;\n v3SiteKey?: string;\n languageCode?: string;\n}\n\nexport function provideScReCaptchaSettings(settings: ScReCaptchaSettings): EnvironmentProviders {\n const providers = [];\n\n if (settings.v2SiteKey) {\n providers.push({\n provide: SC_RE_CAPTCHA_V2_SITE_KEY,\n useValue: settings.v2SiteKey,\n });\n }\n\n if (settings.v3SiteKey) {\n providers.push({\n provide: SC_RE_CAPTCHA_V3_SITE_KEY,\n useValue: settings.v3SiteKey,\n });\n }\n\n if (settings.languageCode) {\n providers.push({\n provide: SC_RE_CAPTCHA_LANGUAGE_CODE,\n useValue: settings.languageCode,\n });\n }\n\n return makeEnvironmentProviders(providers);\n}\n","import { Injectable, NgZone, inject } from '@angular/core';\n\nimport { filter, take } from 'rxjs/operators';\n\nimport { BehaviorSubject, Observable } from 'rxjs';\n\nimport { SC_RE_CAPTCHA_LANGUAGE_CODE, SC_RE_CAPTCHA_V3_SITE_KEY } from './re-captcha-config';\n\n// Extend the Window interface to include custom reCAPTCHA properties\ndeclare global {\n interface Window {\n onRecaptchaError?: () => void;\n onRecaptchaSuccess?: (token: string) => void;\n onRecaptchaExpired?: () => void;\n onRecaptchaLoaded?: () => void;\n grecaptcha?: any;\n }\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ScReCaptchaService {\n private readonly zone = inject(NgZone);\n\n private readonly v3SiteKey = inject<string>(SC_RE_CAPTCHA_V3_SITE_KEY, { optional: true });\n private readonly languageCode = inject<string>(SC_RE_CAPTCHA_LANGUAGE_CODE, { optional: true });\n\n private readonly scriptId = 'recaptcha-script';\n private readonly apiUrl = 'https://www.google.com/recaptcha/api.js';\n\n // Use BehaviorSubject with three states: null (initial), true (loaded), false (error)\n private readonly scriptStatus$ = new BehaviorSubject<boolean | null>(null);\n private scriptLoading = false;\n\n constructor() {\n // Check if script already exists on page load\n this.checkScriptExists();\n }\n\n /**\n * Check if the script already exists in the document\n */\n private checkScriptExists(): void {\n const existingScript = document.getElementById(this.scriptId);\n if (existingScript) {\n // Check if grecaptcha is actually available in window object\n if (window['grecaptcha'] && typeof window['grecaptcha'].render === 'function') {\n this.scriptStatus$.next(true);\n }\n }\n }\n\n /**\n * Load the reCAPTCHA script dynamically\n * @param onload Optional callback function name for script load\n * @returns Observable that emits true when script is loaded\n */\n loadScript(onload?: string): Observable<boolean> {\n // First check if script exists and is loaded\n this.checkScriptExists();\n\n // If script is already loaded, return success immediately\n if (this.scriptStatus$.value === true) {\n return this.scriptStatus$.pipe(\n filter((status) => status === true),\n take(1),\n ) as Observable<boolean>;\n }\n\n // If script is currently loading, return the observable without creating a new script\n if (this.scriptLoading) {\n return this.scriptStatus$.pipe(\n filter((status) => status !== null),\n take(1),\n );\n }\n\n this.scriptLoading = true;\n\n // Build URL with parameters if provided\n let url = this.apiUrl;\n const params: string[] = [];\n\n if (this.v3SiteKey) {\n params.push(`render=${this.v3SiteKey}`);\n } else {\n params.push(`render=explicit`);\n }\n\n if (this.languageCode) {\n params.push(`hl=${this.languageCode}`);\n }\n\n if (onload) {\n params.push(`onload=${onload}`);\n }\n\n if (params.length > 0) {\n url = `${url}?${params.join('&')}`;\n }\n\n // Create script element\n const script = document.createElement('script');\n script.id = this.scriptId;\n script.src = url;\n script.async = true;\n script.defer = true;\n\n // Set up load and error handlers\n script.onload = () => {\n this.zone.run(() => {\n this.scriptLoading = false;\n // Wait a brief moment to ensure grecaptcha is fully initialized\n setTimeout(() => {\n if (window['grecaptcha'] && typeof window['grecaptcha'].render === 'function') {\n this.scriptStatus$.next(true);\n } else {\n console.error('reCAPTCHA script loaded but grecaptcha object not available');\n this.scriptStatus$.next(false);\n }\n }, 100);\n });\n };\n\n script.onerror = () => {\n this.zone.run(() => {\n this.scriptLoading = false;\n console.error('Error loading reCAPTCHA script');\n this.scriptStatus$.next(false);\n });\n };\n\n // Add script to document\n document.head.appendChild(script);\n\n return this.scriptStatus$.pipe(\n filter((status) => status !== null),\n take(1),\n );\n }\n\n /**\n * Remove the reCAPTCHA script from the DOM\n */\n removeScript(): void {\n const script = document.getElementById(this.scriptId);\n if (script) {\n script.remove();\n delete window['grecaptcha'];\n this.scriptStatus$.next(null);\n this.scriptLoading = false;\n }\n }\n\n /**\n * Check if the script is loaded\n */\n isLoaded(): Observable<boolean | null> {\n return this.scriptStatus$.asObservable();\n }\n\n /**\n * Reset all reCAPTCHA instances on the page\n */\n resetAll(): void {\n if (this.scriptStatus$.value === true && window['grecaptcha']) {\n try {\n window['grecaptcha'].reset();\n } catch (e) {\n console.warn('Error resetting reCAPTCHA:', e);\n }\n }\n }\n}\n","import { Injectable, inject } from '@angular/core';\n\nimport { SC_RE_CAPTCHA_V3_SITE_KEY } from './re-captcha-config';\nimport { ScReCaptchaService } from './re-captcha.service';\n\ndeclare let grecaptcha: any;\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ScScoreReCaptcha {\n private readonly v3SiteKey = inject<string>(SC_RE_CAPTCHA_V3_SITE_KEY);\n\n private readonly scReCaptchaService = inject(ScReCaptchaService);\n\n async execute(actionName: string): Promise<string> {\n return new Promise((resolve) => {\n grecaptcha.ready(() => {\n grecaptcha.execute(this.v3SiteKey, { action: actionName }).then((token: string) => {\n resolve(token);\n });\n });\n });\n }\n}\n","import { APP_ID, Injectable, inject } from '@angular/core';\n\n/**\n * Keeps track of the ID count per prefix. This helps us make the IDs a bit more deterministic\n * like they were before the service was introduced. Note that ideally we wouldn't have to do\n * this, but there are some internal tests that rely on the IDs.\n */\nconst counters: Record<string, number> = {};\n\n/** Service that generates unique IDs for DOM nodes. */\n@Injectable({ providedIn: 'root' })\nexport class IdGenerator {\n private readonly appId = inject(APP_ID);\n\n /**\n * Generates a unique ID with a specific prefix.\n * @param prefix Prefix to add to the ID.\n */\n getId(prefix: string): string {\n // Omit the app ID if it's the default `ng`. Since the vast majority of pages have one\n // Angular app on them, we can reduce the amount of breakages by not adding it.\n if (this.appId !== 'ng') {\n prefix += this.appId;\n }\n\n // eslint-disable-next-line no-prototype-builtins\n if (!counters.hasOwnProperty(prefix)) {\n counters[prefix] = 0;\n }\n\n return `${prefix}${counters[prefix]++}`;\n }\n}\n","import {\n ChangeDetectorRef,\n Directive,\n ElementRef,\n OnDestroy,\n OnInit,\n computed,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor } from '@angular/forms';\nimport { Router } from '@angular/router';\n\nimport { Subscription } from 'rxjs';\n\nimport { IdGenerator } from './id-generator';\nimport { SC_RE_CAPTCHA_V2_SITE_KEY } from './re-captcha-config';\nimport { ScReCaptchaService } from './re-captcha.service';\n\ndeclare let grecaptcha: any;\n\ntype CallbackFn = (token: string) => void;\ntype ExpiredCallbackFn = () => void;\ntype ErrorCallbackFn = () => void;\n\n@Directive({\n host: {\n '[id]': 'id',\n '[class.g-recaptcha]': 'true',\n },\n})\nexport class ScReCaptchaBase implements OnInit, OnDestroy, ControlValueAccessor {\n private readonly id = inject(IdGenerator).getId('sc-re-captcha-');\n protected widgetId = '';\n\n private readonly changeDetectorRef = inject(ChangeDetectorRef);\n private readonly scReCaptchaService = inject(ScReCaptchaService);\n\n private readonly v2SiteKey = inject<string>(SC_RE_CAPTCHA_V2_SITE_KEY, {\n optional: true,\n });\n readonly siteKeyInput = input<string>('', {\n alias: 'siteKey',\n });\n\n private readonly siteKey = computed(() => {\n if (this.siteKeyInput()) {\n return this.siteKeyInput();\n }\n\n return this.v2SiteKey ?? '';\n });\n\n readonly tabindex = input<string>('0');\n readonly callback = input<CallbackFn | undefined>(undefined);\n readonly expiredCallback = input<ExpiredCallbackFn | undefined>(undefined, {\n alias: 'expired-callback',\n });\n readonly errorCallback = input<ErrorCallbackFn | undefined>(undefined, {\n alias: 'error-callback',\n });\n\n private readonly value = signal<string | null>(null);\n private readonly disabledByCva = signal(false);\n\n scriptLoaded = false;\n private readonly router = inject(Router);\n private readonly recaptchaContainer = inject(ElementRef);\n private readonly subscriptions: Subscription[] = [];\n\n scriptLoadError = output<void>();\n\n ngOnInit(): void {\n // this.registerCallbacks();\n this.loadRecaptcha();\n }\n\n ngOnDestroy(): void {\n // Clean up all subscriptions\n this.subscriptions.forEach((sub) => sub.unsubscribe());\n }\n\n // Check if widget is actually rendered in the DOM\n private isWidgetRendered(): boolean {\n if (!this.recaptchaContainer?.nativeElement) {\n return false;\n }\n\n // Check if iframe exists inside the container (reCAPTCHA creates an iframe when rendered)\n return this.recaptchaContainer.nativeElement.querySelector('iframe') !== null;\n }\n\n private loadRecaptcha(): void {\n const scriptSub = this.scReCaptchaService.loadScript().subscribe((loaded) => {\n this.scriptLoaded = loaded;\n\n if (!loaded) {\n this.scriptLoadError.emit();\n return;\n }\n\n // If callbacks aren't registered yet, do it now\n // if (!this.callbacksRegistered) {\n // this.registerCallbacks();\n // }\n\n // If container is available (view initialized), render widget\n if (this.recaptchaContainer) {\n setTimeout(() => this.render(), 0);\n }\n });\n\n this.subscriptions.push(scriptSub);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n render() {}\n\n protected renderWidget(themeOrBadge: string, themeOrBadgeValue: string, size: string) {\n this.widgetId = grecaptcha.render(\n this.id,\n {\n sitekey: this.siteKey(),\n [themeOrBadge]: themeOrBadgeValue,\n size: size,\n tabindex: this.tabindex(),\n callback: this.callback() ? this.callback() : this.defaultCallback.bind(this),\n 'expired-callback': this.expiredCallback()\n ? this.expiredCallback()\n : this.defaultExpiredCallback.bind(this),\n 'error-callback': this.errorCallback()\n ? this.errorCallback()\n : this.defaultErrorCallback.bind(this),\n },\n true,\n );\n }\n\n private defaultCallback(token: string) {\n this.setValue(token);\n }\n\n private defaultExpiredCallback() {\n this.setValue(null);\n }\n\n private defaultErrorCallback() {\n console.error('error');\n this.setValue(null);\n }\n\n getResponse() {\n grecaptcha.getResponse(this.widgetId);\n }\n\n reset() {\n grecaptcha.reset(this.widgetId);\n }\n\n private setValue(newValue: string | null) {\n this.value.set(newValue);\n this.onChange(newValue);\n this.changeDetectorRef.markForCheck();\n }\n\n writeValue(obj: any): void {\n this.value.set(obj);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n onChange: any = () => {};\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n onTouch: any = () => {};\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouch = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabledByCva.set(isDisabled);\n }\n}\n","import { Directive, ElementRef, effect, forwardRef, inject, input } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nimport { ScReCaptchaBase } from './re-captcha-base';\n\n@Directive({\n selector: 'div[sc-checkbox-re-captcha]',\n exportAs: 'scCheckboxReCaptcha',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => ScCheckboxReCaptcha),\n multi: true,\n },\n ],\n})\nexport class ScCheckboxReCaptcha extends ScReCaptchaBase implements ControlValueAccessor {\n private readonly host = inject(ElementRef);\n\n readonly theme = input<'dark' | 'light'>('light');\n\n readonly size = input<'normal' | 'compact'>('normal');\n\n override render() {\n this.renderWidget('theme', this.theme(), this.size());\n }\n\n private isFirstRun = true;\n\n constructor() {\n super();\n\n effect(() => {\n this.updateRecaptchaTheme(this.theme());\n });\n }\n\n updateRecaptchaTheme(newTheme: 'dark' | 'light') {\n if (this.isFirstRun) {\n this.isFirstRun = false;\n return;\n }\n\n // Find the reCAPTCHA iframe\n const recaptchaFrame = this.host.nativeElement.querySelector(\n 'iframe[src*=\"recaptcha\"]',\n ) as HTMLIFrameElement;\n\n if (recaptchaFrame) {\n // Get the iframe URL\n let frameSource = recaptchaFrame.src;\n\n // Replace the theme parameter in the URL\n if (frameSource.includes('theme=')) {\n frameSource = frameSource.replace(/theme=(light|dark)/, `theme=${newTheme}`);\n } else {\n frameSource += `&theme=${newTheme}`;\n }\n\n // Update the iframe source\n recaptchaFrame.src = frameSource;\n }\n }\n}\n","import { Directive, forwardRef, input, signal } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nimport { ScReCaptchaBase } from './re-captcha-base';\n\ndeclare let grecaptcha: any;\n\n@Directive({\n selector: 'div[sc-invisible-re-captcha], button[sc-invisible-re-captcha]',\n exportAs: 'scInvisibleReCaptcha',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => ScInvisibleReCaptcha),\n multi: true,\n },\n ],\n})\nexport class ScInvisibleReCaptcha extends ScReCaptchaBase implements ControlValueAccessor {\n readonly badge = input<'bottomright' | 'bottomleft' | 'inline'>('bottomright');\n\n private readonly size = signal<'invisible'>('invisible');\n\n override render() {\n this.renderWidget('badge', this.badge(), this.size());\n }\n\n execute() {\n grecaptcha.execute(this.widgetId);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}