{"version":3,"mappings":"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","names":["TurboFormController","Controller","e","form","formData","params","value","name","loadingButton","submitButtons","i","button","el","loadingController","onLoadingError","onLoadingFinally","resp","axios","progressEventHandler","redirect_uri","action","cache","visit","handleAxiosError","LoadingController","_a","disableAllButtons","cssVarsToAttrs","injectCSSAttrs","fn","cssVar","attr","_OtpInputController","event","input","text","_event","index","isFocused","isNextBox","digitsContainer","textContent","classes","isLastDigit","isBlurred","span","OtpInputController","checkPasswordLength","minLength","codePoints","isViolated","checkPasswordUppercase","checkPasswordLowercase","checkPasswordAlphabet","checkPasswordDigit","checkPasswordSymbol","checkPasswordStrength","currentMeter","minLevel","result","zxcvbn","score","_PasswordPolicyController","violatedPolicies","PasswordPolicyController","updateMeterDescription","currentMeterDescription","ariaValueNow","_PasswordStrengthMeterController","callback","PasswordStrengthMeterController","UNICODE_BASE","COUNTRY_CODE_REGEX","getEmojiFlag","countryCode","letter","CLDR_TERRITORIES_JSON","__vitePreload","territories","CountryCodes","metadata","defaultCountryForDuplicatedCountryCodes","getOnlyCountryCodes","getPreferredCountryCodes","compileDefaultCountryList","compileCountryList","CLDR_TERRITORIES_JSON_EN","compileLocalizedCountryList","lang","localizedTerritories","onlyCountryCodes","preferredCountryCodes","countryCodeToCountry","countryName","countryLocalizedName","countryFlag","countryCallingCode","getCountryCallingCode","onlyCountries","preferredCountries","a","b","countries","seen","c","_PhoneInputController","inputValue","maybeCountry","remainings","newValue","countryValue","rawValue","combinedValue","parsed","parsePhoneNumber","asYouType","AsYouType","countryCodeFromPartialNumber","callingCode","_remainings","countryListSources","source","options","country","geoIPCountryCode","o","initialValue","PhoneInputController","_CustomSelectController","preventAndStop","idx","_idx","computePosition","flip","x","y","option","autoUpdate","item","indexFn","optionEl","container","containerPadding","padding","itemPosition","scrollPosition","template","fragment","visibleOptions","visibleOptionsIndexByValue","_arr","clone","isVisible","selected","prefixEl","labelEl","emptyTemplate","CustomSelectController","_CountdownController","scheduledAt","cooldown","label","labelUnit","format","tick","timeElapsed","seconds","formatted","Duration","CountdownController","_TextFieldController","TextFieldController","_OverlayController","OverlayController","_NewPasswordFieldController","violated","NewPasswordFieldController","DismissKeyboardOnScrollController","BodyScrollLockController","height","parsePreviewCustomisationMessage","message","_InlinePreviewController","customisationMessage","key","outlet","windowMessageAllowedOrigins","meta","origin","InlinePreviewController","_PreviewableResourceController","valueToSet","PreviewableResourceController","getColorScheme","queryResult","htmlElement","darkThemeEnabled","lightThemeEnabled","explicitColorScheme","metaElement","queryParam","implicitColorScheme","colorScheme","dispatchBotProtectionWidgetEventRender","dispatchBotProtectionWidgetEventUndoRender","dispatchBotProtectionWidgetEventReadyForRender","dispatchDialogOpen","dialogID","dispatchDialogClose","dispatchDialogOpenStart","dispatchDialogCloseEnd","DialogController","DIALOG_ID","dispatchBotProtectionDialogOpen","dispatchBotProtectionDialogClose","BotProtectionDialogController","dispatchBotProtectionEventVerified","token","dispatchBotProtectionEventFailed","errMsg","dispatchBotProtectionEventExpired","BotProtectionController","CLOUDFLARE_TURNSTILE_ERROR_INVALID_SITE_KEY","CLOUDFLARE_TURNSTILE_ERROR_DOMAIN_NOT_ALLOWED","CLOUDFLARE_TURNSTILE_ERROR_UNUSUAL_VISITOR_BEHAVIOR","CLOUDFLARE_TURNSTILE_ERROR_UNSUPPORTED_BROWSER","CLOUDFLARE_TURNSTILE_ERROR_TIMEOUT","CLOUDFLARE_TURNSTILE_ERROR_UNKNOWN","parseCloudflareTurnstileErrorCode","errCode","parseTheme","theme","CLOUDFLARE_TURNSTILE_ERROR_MSG_ID","_CloudflareTurnstileController","widgetContainer","widgetID","parsedError","shouldRetry","shouldDisplayErrMsg","setErrorMessage","CloudflareTurnstileController","RECAPTCHA_V2_ERROR_MSG_ID","_RecaptchaV2Controller","RecaptchaV2Controller","BotProtectionTokenInputController","BotProtectionStandalonePageSubmitBtnController","BotProtectionStandalonePageController","_SelectInputController","SelectInputController","_FormStateController","values","changed","FormStateController","DATE_TYPES","DATE_STYLES","TIME_STYLES","parseDateType","s","variant","parseDateStyle","parseTimeStyle","formatLuxonRelativeDuration","dt","base","duration","opts","getTimezoneFromMetaTag","metaTag","timezone","_FormatDateController","hasAbs","intlDateTimeFormatIsSupported","hasRel","intlRelativeTimeFormatIsSupported","relativeBase","DateTime","dateSpans","dateSpan","rfc3339","dateType","dateStyle","timeStyle","luxonDatetime","abs","rel","_b","FormatDateController","_FormatInputDateController","jsDate","FormatInputDateController","errorMessages","isNetworkError","error","match","m","sentryDSN","SentryInit","browserTracingIntegration","ev","hint","start","Stimulus","Application","RestoreFormController","RetainFormFormController","RetainFormInputController","PreventDoubleTapController","LockoutController","PasswordVisibilityToggleController","ResendButtonController","CopyButtonController","ImagePickerController","AuthflowWebsocketController","AuthflowPollingController","AuthflowPasskeyRequestController","AuthflowPasskeyCreationController","AuthflowV2PasskeyErrorController","AlertMessageController","ClickToSwitchController","AccountDeletionController"],"ignoreList":[],"sources":["../../../../authui/src/authflowv2/turboForm.ts","../../../../authui/src/authflowv2/loading.ts","../../../../authui/src/cssattrs.ts","../../../../authui/src/authflowv2/otpInput.ts","../../../../authui/src/authflowv2/password-policy.ts","../../../../authui/src/authflowv2/password-strength-meter.ts","../../../../authui/src/authflowv2/getEmojiFlag.ts","../../../../authui/src/authflowv2/phoneInput.ts","../../../../authui/src/authflowv2/customSelect.ts","../../../../authui/src/countdown.ts","../../../../authui/src/authflowv2/text-field.ts","../../../../authui/src/authflowv2/overlay.ts","../../../../authui/src/authflowv2/new-password-field.ts","../../../../authui/src/authflowv2/dismissKeyboard.ts","../../../../authui/src/authflowv2/bodyScrollLock.ts","../../../../authui/src/inline-preview.ts","../../../../authui/src/previewable-resource.ts","../../../../authui/src/getColorScheme.ts","../../../../authui/src/authflowv2/botprotection/botProtectionWidget.ts","../../../../authui/src/authflowv2/dialog.ts","../../../../authui/src/authflowv2/botprotection/botProtectionDialog.ts","../../../../authui/src/authflowv2/botprotection/botProtection.ts","../../../../authui/src/authflowv2/botprotection/cloudflareTurnstileError.ts","../../../../authui/src/authflowv2/botprotection/cloudflareTurnstile.ts","../../../../authui/src/authflowv2/botprotection/recaptchav2.ts","../../../../authui/src/authflowv2/botprotection/botProtectionTokenInput.ts","../../../../authui/src/authflowv2/botprotection/botProtectionStandalonePageSubmitBtn.ts","../../../../authui/src/authflowv2/botprotection/botProtectionStandalonePage.ts","../../../../authui/src/authflowv2/selectInput.ts","../../../../authui/src/authflowv2/formState.ts","../../../../authui/src/authflowv2/date.ts","../../../../authui/src/errors.ts","../../../../authui/src/authflowv2.ts"],"sourcesContent":["import { visit, cache } from \"@hotwired/turbo\";\nimport { Controller } from \"@hotwired/stimulus\";\nimport axios, { Method } from \"axios\";\nimport { progressEventHandler } from \"../loading\";\nimport { LoadingController } from \"./loading\";\nimport { handleAxiosError } from \"./alert-message\";\n\n// Turbo has builtin support for form submission.\n// We once migrated to use it.\n// However, redirect to external is broken because\n// the redirect is made with fetch, which is subject to CORS.\n// A typical problem is the support for the post login redirect URI.\n// The post login redirect URI is usually an external link that\n// the origin of the link does not list our origin as allowed origin.\n// If we rely on Turbo to handle form submission,\n// the post login redirect URI will be broken.\n// Therefore, we reverted to handle form submission ourselves.\n// To disable the builtin form submission of Turbo,\n// I studied its source code and discovered that\n// Turbo checked in the bubble event listener to see if\n// the event is prevented.\n// So I added a capture event listener to call preventDefault()\n// to stop Turbo from submitting forms.\n//\n// See https://github.com/authgear/authgear-server/issues/2333\nexport class TurboFormController extends Controller {\n forms: HTMLFormElement[] = [];\n\n // eslint-disable-next-line complexity\n async submitForm(e: Event) {\n e.preventDefault();\n const form = e.currentTarget as HTMLFormElement;\n\n if (form.querySelector('[data-turbo=\"false\"]')) {\n return;\n }\n\n // Do not stop propagation so that GTM can recognize the event as Form Submission trigger.\n // e.stopPropagation();\n\n const formData = new FormData(form);\n\n const params = new URLSearchParams();\n formData.forEach((value, name) => {\n params.set(name, value as string);\n });\n let loadingButton: HTMLButtonElement | null = null;\n // FormData does not include any submit button's data:\n // include them manually, since we have at most one submit button per form.\n const submitButtons = form.querySelectorAll('button[type=\"submit\"]');\n for (let i = 0; i < submitButtons.length; i++) {\n const button = submitButtons[i] as HTMLButtonElement;\n params.set(button.name, button.value);\n loadingButton = button;\n }\n if (form.id) {\n const el = document.querySelector(\n `button[type=\"submit\"][form=\"${form.id}\"]`\n );\n if (el) {\n const button = el as HTMLButtonElement;\n params.set(button.name, button.value);\n loadingButton = button;\n }\n }\n const loadingController: LoadingController | null =\n this.application.getControllerForElementAndIdentifier(\n document.body,\n \"loading\"\n ) as LoadingController | null;\n const { onError: onLoadingError, onFinally: onLoadingFinally } =\n loadingController?.startLoading(loadingButton) ?? {};\n try {\n const resp = await axios(form.action, {\n method: form.method as Method,\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded;charset=UTF-8\",\n \"X-Authgear-XHR\": \"true\",\n },\n data: params,\n onUploadProgress: progressEventHandler,\n onDownloadProgress: progressEventHandler,\n });\n\n const { redirect_uri, action } = resp.data;\n\n // Without excempting current page from cache, it will still be cached\n // right after cache.clear() is called and before the redirect is performed.\n //\n // see https://github.com/hotwired/turbo/issues/193\n cache.exemptPageFromCache();\n cache.clear();\n\n switch (action) {\n case \"redirect\":\n // Perform full redirect.\n window.location = redirect_uri;\n break;\n\n case \"replace\":\n case \"advance\":\n // We assume the URL returned by the server have query preserved.\n visit(redirect_uri, { action });\n break;\n }\n } catch (e: unknown) {\n handleAxiosError(e);\n onLoadingError?.();\n } finally {\n onLoadingFinally?.();\n form.dispatchEvent(new CustomEvent(`turbo-form:submit-end`, {}));\n }\n }\n}\n","import { Controller } from \"@hotwired/stimulus\";\nimport { disableAllButtons } from \"../loading\";\n\ninterface LoadingHandle {\n onError: () => void;\n onFinally: () => void;\n}\n\nexport class LoadingController extends Controller {\n revert: (() => void) | null = null;\n\n // Revert disabled buttons before Turbo caches the page\n // To avoid flickering in the UI\n beforeCache = () => {\n this.revert?.();\n this.revert = null;\n };\n\n startLoading(e: HTMLElement | null): LoadingHandle {\n this.revert = disableAllButtons();\n e?.setAttribute(\"data-loading\", \"true\");\n\n return {\n onError: () => {\n this.revert?.();\n this.revert = null;\n e?.removeAttribute(\"data-loading\");\n },\n onFinally: () => {\n e?.removeAttribute(\"data-loading\");\n },\n };\n }\n\n connect() {\n document.addEventListener(\"turbo:before-cache\", this.beforeCache);\n }\n\n disconnect() {\n document.removeEventListener(\"turbo:before-cache\", this.beforeCache);\n }\n}\n","const cssVarsToAttrs = {\n \"--alignment-logo\": \"alignment-logo\",\n \"--alignment-card\": \"alignment-card\",\n \"--alignment-content\": \"alignment-content\",\n};\n\nexport function injectCSSAttrs(el: HTMLElement) {\n const fn = () => {\n for (const [cssVar, attr] of Object.entries(cssVarsToAttrs)) {\n const value = getComputedStyle(el).getPropertyValue(cssVar).trim();\n el.setAttribute(attr, value);\n }\n };\n fn();\n window.addEventListener(\"load\", fn);\n}\n","import { Controller } from \"@hotwired/stimulus\";\n\nexport class OtpInputController extends Controller {\n static targets = [\"input\", \"submit\", \"digitsContainer\"];\n\n declare readonly inputTarget: HTMLInputElement;\n declare readonly submitTarget: HTMLButtonElement;\n declare readonly digitsContainerTarget: HTMLElement;\n\n spans: HTMLElement[] = [];\n\n get maxLength(): number {\n if (this.inputTarget.maxLength) {\n return this.inputTarget.maxLength;\n }\n\n return 6;\n }\n\n get value(): string {\n return this.inputTarget.value;\n }\n\n beforeCache = () => {\n this.inputTarget.value = \"\";\n };\n\n connect(): void {\n this.inputTarget.classList.remove(\"input\");\n this.inputTarget.classList.add(\"with-js\");\n this.inputTarget.addEventListener(\"input\", this.handleInput);\n this.inputTarget.addEventListener(\"paste\", this.handlePaste);\n this.inputTarget.addEventListener(\"focus\", this.handleFocus);\n this.inputTarget.addEventListener(\"blur\", this.handleBlur);\n this.submitTarget.disabled = true;\n // element.selectionchange is NOT the same as document.selectionchange\n // element.selectionchange is an experimental technology.\n window.document.addEventListener(\n \"selectionchange\",\n this.handleSelectionChange\n );\n document.addEventListener(\"turbo:before-cache\", this.beforeCache);\n this.render();\n }\n\n disconnect(): void {\n this.inputTarget.classList.add(\"input\");\n this.inputTarget.classList.remove(\"with-js\");\n this.inputTarget.removeEventListener(\"input\", this.handleInput);\n this.inputTarget.removeEventListener(\"paste\", this.handlePaste);\n this.inputTarget.removeEventListener(\"focus\", this.handleFocus);\n this.inputTarget.removeEventListener(\"blur\", this.handleBlur);\n window.document.removeEventListener(\n \"selectionchange\",\n this.handleSelectionChange\n );\n document.removeEventListener(\"turbo:before-cache\", this.beforeCache);\n this.submitTarget.disabled = false;\n }\n\n _setValue = (value: string): void => {\n this.inputTarget.value = value\n .replace(/[^0-9]/g, \"\")\n .slice(0, this.maxLength);\n\n const reachedMaxDigits = this.value.length === this.maxLength;\n if (reachedMaxDigits) {\n this.submitTarget.disabled = false;\n this.submitTarget.click();\n }\n\n this.render();\n };\n\n handleInput = (event: Event): void => {\n const input = event.target as HTMLInputElement;\n this._setValue(input.value);\n };\n\n handlePaste = (event: ClipboardEvent): void => {\n event.preventDefault();\n const text = event.clipboardData?.getData(\"text/plain\");\n if (text) {\n this._setValue(text);\n }\n };\n\n handleFocus = (event: FocusEvent): void => {\n const input = event.target as HTMLInputElement;\n input.setSelectionRange(input.value.length, input.value.length);\n this.render();\n };\n\n handleBlur = (): void => {\n this.render();\n };\n\n handleSelectionChange = (_event: Event): void => {\n if (this.inputTarget === document.activeElement) {\n this.inputTarget.setSelectionRange(\n this.inputTarget.value.length,\n this.inputTarget.value.length\n );\n }\n };\n\n isSpanSelected = (index: number): boolean => {\n const isFocused = this.inputTarget === document.activeElement;\n const isNextBox = this.value.length === index;\n return isFocused && isNextBox;\n };\n\n render = (): void => {\n const digitsContainer = this.digitsContainerTarget;\n if (this.spans.length !== this.maxLength) {\n digitsContainer.innerHTML = \"\";\n }\n\n for (let i = 0; i < this.maxLength; i++) {\n let textContent = this.value.slice(i, i + 1) || \"\";\n const classes = this.isSpanSelected(i)\n ? [\"otp-input__digit\", \"otp-input__digit--focus\"]\n : [\"otp-input__digit\"];\n\n const isLastDigit = i < this.value.length - 1;\n const isBlurred = this.inputTarget !== document.activeElement;\n if (textContent && (isLastDigit || isBlurred)) {\n textContent = \" \";\n classes.push(\"otp-input__digit--masked\");\n }\n\n this.inputTarget.style.letterSpacing = `calc(${this.inputTarget.offsetWidth}px / ${this.maxLength})`;\n\n let span = this.spans[i];\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!span) {\n span = document.createElement(\"span\");\n digitsContainer.appendChild(span);\n this.spans[i] = span;\n }\n\n span.textContent = textContent;\n span.className = classes.join(\" \");\n }\n };\n}\n","import { Controller } from \"@hotwired/stimulus\";\nimport zxcvbn from \"zxcvbn\";\n\nenum PasswordPolicyName {\n Strength = \"strength\",\n Length = \"length\",\n Uppercase = \"uppercase\",\n Lowercase = \"lowercase\",\n Alphabet = \"alphabet\",\n Digit = \"digit\",\n Symbol = \"symbol\",\n}\n\ninterface ValidationResult {\n policy: PasswordPolicyName;\n isViolated: boolean;\n}\n\nfunction checkPasswordLength(value: string, el: HTMLElement): ValidationResult {\n const minLength = Number(el.getAttribute(\"data-min-length\"));\n const codePoints = Array.from(value);\n let isViolated = false;\n if (codePoints.length >= minLength) {\n el.setAttribute(\"data-state\", \"pass\");\n } else {\n el.setAttribute(\"data-state\", \"fail\");\n isViolated = true;\n }\n return {\n policy: PasswordPolicyName.Length,\n isViolated,\n };\n}\n\nfunction checkPasswordUppercase(\n value: string,\n el: HTMLElement\n): ValidationResult {\n let isViolated = false;\n if (/[A-Z]/.test(value)) {\n el.setAttribute(\"data-state\", \"pass\");\n } else {\n el.setAttribute(\"data-state\", \"fail\");\n isViolated = true;\n }\n return {\n policy: PasswordPolicyName.Uppercase,\n isViolated,\n };\n}\n\nfunction checkPasswordLowercase(\n value: string,\n el: HTMLElement\n): ValidationResult {\n let isViolated = false;\n if (/[a-z]/.test(value)) {\n el.setAttribute(\"data-state\", \"pass\");\n } else {\n el.setAttribute(\"data-state\", \"fail\");\n isViolated = true;\n }\n return {\n policy: PasswordPolicyName.Lowercase,\n isViolated,\n };\n}\n\nfunction checkPasswordAlphabet(value: string, el: HTMLElement) {\n let isViolated = false;\n if (/[a-zA-Z]/.test(value)) {\n el.setAttribute(\"data-state\", \"pass\");\n } else {\n el.setAttribute(\"data-state\", \"fail\");\n isViolated = true;\n }\n return {\n policy: PasswordPolicyName.Alphabet,\n isViolated,\n };\n}\n\nfunction checkPasswordDigit(value: string, el: HTMLElement) {\n let isViolated = false;\n if (/[0-9]/.test(value)) {\n el.setAttribute(\"data-state\", \"pass\");\n } else {\n el.setAttribute(\"data-state\", \"fail\");\n isViolated = true;\n }\n return {\n policy: PasswordPolicyName.Digit,\n isViolated,\n };\n}\n\nfunction checkPasswordSymbol(value: string, el: HTMLElement) {\n let isViolated = false;\n if (/[^a-zA-Z0-9]/.test(value)) {\n el.setAttribute(\"data-state\", \"pass\");\n } else {\n el.setAttribute(\"data-state\", \"fail\");\n isViolated = true;\n }\n return {\n policy: PasswordPolicyName.Symbol,\n isViolated,\n };\n}\n\nfunction checkPasswordStrength(\n value: string,\n el: HTMLElement,\n currentMeter: HTMLElement\n) {\n let isViolated = false;\n const minLevel = Number(el.getAttribute(\"data-min-level\"));\n const result = zxcvbn(value);\n const score = Math.min(5, Math.max(1, result.score + 1));\n currentMeter.setAttribute(\"aria-valuenow\", String(score));\n if (score >= minLevel) {\n el.setAttribute(\"data-state\", \"pass\");\n } else {\n el.setAttribute(\"data-state\", \"fail\");\n isViolated = true;\n }\n return {\n policy: PasswordPolicyName.Strength,\n isViolated,\n };\n}\n\nexport class PasswordPolicyController extends Controller {\n static targets = [\"input\", \"currentMeter\", \"policy\"];\n static ATTR_POLICY_VIOLATED = \"data-password-policy-violated\";\n\n declare inputTarget: HTMLInputElement;\n declare hasCurrentMeterTarget: boolean;\n declare currentMeterTarget: HTMLElement;\n declare policyTargets: HTMLElement[];\n\n connect() {\n void this.check();\n }\n\n async check() {\n const value = this.inputTarget.value;\n if (value === \"\") {\n if (this.hasCurrentMeterTarget) {\n this.currentMeterTarget.setAttribute(\"aria-valuenow\", \"0\");\n }\n this.policyTargets.forEach((e) => {\n e.setAttribute(\"data-state\", \"\");\n });\n\n return;\n }\n const violatedPolicies: PasswordPolicyName[] = [];\n // eslint-disable-next-line sonarjs/cognitive-complexity,complexity\n this.policyTargets.forEach((e) => {\n switch (e.getAttribute(\"data-password-policy-name\")) {\n case PasswordPolicyName.Strength:\n if (this.hasCurrentMeterTarget) {\n const result = checkPasswordStrength(\n value,\n e,\n this.currentMeterTarget\n );\n if (result.isViolated) {\n violatedPolicies.push(result.policy);\n }\n }\n break;\n case PasswordPolicyName.Length: {\n const result = checkPasswordLength(value, e);\n if (result.isViolated) {\n violatedPolicies.push(result.policy);\n }\n break;\n }\n case PasswordPolicyName.Uppercase: {\n const result = checkPasswordUppercase(value, e);\n if (result.isViolated) {\n violatedPolicies.push(result.policy);\n }\n break;\n }\n case PasswordPolicyName.Lowercase: {\n const result = checkPasswordLowercase(value, e);\n if (result.isViolated) {\n violatedPolicies.push(result.policy);\n }\n break;\n }\n case PasswordPolicyName.Alphabet: {\n const result = checkPasswordAlphabet(value, e);\n if (result.isViolated) {\n violatedPolicies.push(result.policy);\n }\n break;\n }\n case PasswordPolicyName.Digit: {\n const result = checkPasswordDigit(value, e);\n if (result.isViolated) {\n violatedPolicies.push(result.policy);\n }\n break;\n }\n case PasswordPolicyName.Symbol: {\n const result = checkPasswordSymbol(value, e);\n if (result.isViolated) {\n violatedPolicies.push(result.policy);\n }\n break;\n }\n default:\n break;\n }\n });\n if (violatedPolicies.length > 0) {\n this.inputTarget.setAttribute(\n PasswordPolicyController.ATTR_POLICY_VIOLATED,\n violatedPolicies.join(\" \")\n );\n } else {\n this.inputTarget.removeAttribute(\n PasswordPolicyController.ATTR_POLICY_VIOLATED\n );\n }\n }\n}\n","import { Controller } from \"@hotwired/stimulus\";\n\nfunction updateMeterDescription(\n currentMeter: HTMLElement,\n currentMeterDescription: HTMLElement\n) {\n const ariaValueNow = currentMeter.getAttribute(\"aria-valuenow\");\n if (!ariaValueNow) {\n return;\n }\n\n currentMeterDescription.textContent = currentMeter.getAttribute(\n \"data-desc-\" + ariaValueNow\n );\n}\n\nexport class PasswordStrengthMeterController extends Controller {\n static targets = [\"currentMeterDescription\"];\n\n declare currentMeterDescriptionTarget: HTMLElement;\n\n observer: MutationObserver | null = null;\n\n connect() {\n const callback = () => {\n this.update();\n };\n this.observer = new MutationObserver(callback);\n this.observer.observe(this.element, {\n attributes: true,\n });\n this.update();\n }\n disconnect() {\n this.observer?.disconnect();\n this.observer = null;\n }\n\n update() {\n updateMeterDescription(\n this.element as HTMLElement,\n this.currentMeterDescriptionTarget\n );\n }\n}\n","// Ref: https://github.com/annexare/Countries/blob/d92daf336b0d71cf265c5689e7a2b789832bf3bc/packages/countries/src/getEmojiFlag.ts\n\n// \"Regional Indicator Symbol Letter A\" - \"Latin Capital Letter A\"\nconst UNICODE_BASE = 127462 - \"A\".charCodeAt(0);\n\n// Country code should contain exactly 2 uppercase characters from A..Z\nconst COUNTRY_CODE_REGEX = /^[A-Z]{2}$/;\n\nexport function getEmojiFlag(countryCode: string): string {\n if (COUNTRY_CODE_REGEX.test(countryCode)) {\n return String.fromCodePoint(\n ...countryCode\n .split(\"\")\n .map((letter) => UNICODE_BASE + letter.toUpperCase().charCodeAt(0))\n );\n }\n\n return \"\";\n}\n","import { Controller } from \"@hotwired/stimulus\";\nimport {\n CountryCode,\n getCountryCallingCode,\n AsYouType,\n default as parsePhoneNumber,\n} from \"libphonenumber-js\";\nimport CLDR_TERRITORIES_JSON_EN from \"cldr-localenames-full/main/en/territories.json\";\n// @ts-expect-error import.meta.glob is a Vite-specific feature.\nconst CLDR_TERRITORIES_JSON = import.meta.glob(\n \"../../node_modules/cldr-localenames-full/main/*/territories.json\"\n);\nimport { getEmojiFlag } from \"./getEmojiFlag\";\nimport { CustomSelectController } from \"./customSelect\";\nimport metadata from \"libphonenumber-js/metadata.min.json\";\nconst CountryCodes = metadata.country_calling_codes;\n// Duplicated country codes\n// {\n// \"1\": [ \"US\", \"AG\", \"AI\", \"AS\", \"BB\", \"BM\", \"BS\", \"CA\", \"DM\", \"DO\", \"GD\", \"GU\", \"JM\", \"KN\", \"KY\", \"LC\", \"MP\", \"MS\", \"PR\", \"SX\", \"TC\", \"TT\", \"VC\", \"VG\", \"VI\" ],\n// \"7\": [ \"RU\", \"KZ\" ],\n// \"39\": [ \"IT\", \"VA\" ],\n// \"44\": [ \"GB\", \"GG\", \"IM\", \"JE\" ],\n// \"47\": [ \"NO\", \"SJ\" ],\n// \"61\": [ \"AU\", \"CC\", \"CX\" ],\n// \"212\": [ \"MA\", \"EH\" ],\n// \"262\": [ \"RE\", \"YT\" ],\n// \"290\": [ \"SH\", \"TA\" ],\n// \"358\": [ \"FI\", \"AX\" ],\n// \"590\": [ \"GP\", \"BL\", \"MF\" ],\n// \"599\": [ \"CW\", \"BQ\" ]\n// }\n\nconst defaultCountryForDuplicatedCountryCodes: Record<\n string,\n CountryCode | undefined\n> = {\n \"1\": \"US\",\n \"7\": \"RU\",\n \"39\": \"IT\",\n \"44\": \"GB\",\n \"47\": \"NO\",\n \"61\": \"AU\",\n \"212\": \"MA\",\n \"262\": \"RE\",\n \"290\": \"SH\",\n \"358\": \"FI\",\n \"590\": \"GP\",\n \"599\": \"CW\",\n};\n\ninterface PhoneInputCountry {\n flagEmoji: string;\n localizedName: string;\n name: string;\n iso2: string;\n phone: string;\n}\n\ntype Territories =\n typeof CLDR_TERRITORIES_JSON_EN.main.en.localeDisplayNames.territories;\n\nfunction getOnlyCountryCodes(): CountryCode[] {\n const onlyCountries: CountryCode[] =\n JSON.parse(\n document\n .querySelector(\"meta[name=x-phone-input-only-countries]\")\n ?.getAttribute(\"content\") ?? \"null\"\n ) ?? [];\n return onlyCountries;\n}\n\nfunction getPreferredCountryCodes(): CountryCode[] {\n const preferredCountries: CountryCode[] =\n JSON.parse(\n document\n .querySelector(\"meta[name=x-phone-input-preferred-countries]\")\n ?.getAttribute(\"content\") ?? \"null\"\n ) ?? [];\n return preferredCountries;\n}\n\nasync function compileDefaultCountryList() {\n return compileCountryList(\n CLDR_TERRITORIES_JSON_EN.main.en.localeDisplayNames.territories\n );\n}\n\nasync function compileLocalizedCountryList() {\n const lang =\n (document\n .querySelector(\"meta[name=x-cldr-locale]\")\n ?.getAttribute(\"content\") ??\n \"\") ||\n document.documentElement.lang ||\n \"en\";\n const localizedTerritories = await CLDR_TERRITORIES_JSON[\n `../../node_modules/cldr-localenames-full/main/${lang}/territories.json`\n ]().catch(() => null);\n const territories =\n localizedTerritories?.main[lang].localeDisplayNames.territories;\n\n if (territories == null) {\n return compileDefaultCountryList();\n }\n\n return compileCountryList(territories);\n}\n\nasync function compileCountryList(\n territories: Territories\n): Promise {\n const onlyCountryCodes = getOnlyCountryCodes();\n const preferredCountryCodes = getPreferredCountryCodes();\n\n function countryCodeToCountry(countryCode: CountryCode): PhoneInputCountry {\n const countryName =\n CLDR_TERRITORIES_JSON_EN.main.en.localeDisplayNames.territories[\n countryCode\n ];\n const countryLocalizedName = territories[countryCode] || countryName;\n const countryFlag = getEmojiFlag(countryCode);\n const countryCallingCode = getCountryCallingCode(countryCode);\n return {\n flagEmoji: `${countryFlag}`,\n localizedName: countryLocalizedName,\n name: countryName,\n iso2: countryCode,\n phone: countryCallingCode,\n };\n }\n\n const onlyCountries = onlyCountryCodes.map(countryCodeToCountry);\n const preferredCountries = preferredCountryCodes.map(countryCodeToCountry);\n\n onlyCountries.sort((a, b) => {\n return a.localizedName.localeCompare(b.localizedName);\n });\n\n const countries = [];\n const seen = new Set();\n\n for (const c of preferredCountries) {\n if (seen.has(c.iso2)) {\n continue;\n }\n seen.add(c.iso2);\n countries.push(c);\n }\n for (const c of onlyCountries) {\n if (seen.has(c.iso2)) {\n continue;\n }\n seen.add(c.iso2);\n countries.push(c);\n }\n return countries;\n}\n\nexport class PhoneInputController extends Controller {\n static targets = [\n \"countrySelect\",\n \"input\",\n \"phoneInput\",\n \"phoneInputContainer\",\n \"countrySelectInput\",\n ];\n\n declare readonly countrySelectTarget: HTMLElement;\n declare readonly inputTarget: HTMLInputElement;\n declare readonly phoneInputTarget: HTMLInputElement;\n declare readonly phoneInputContainerTarget: HTMLElement;\n declare readonly countrySelectInputTarget: HTMLInputElement;\n\n get countrySelect(): CustomSelectController | null {\n const ctr = this.application.getControllerForElementAndIdentifier(\n this.countrySelectTarget,\n \"custom-select\"\n );\n return ctr as CustomSelectController | null;\n }\n\n get value(): string {\n return this.inputTarget.value;\n }\n\n set value(newValue: string) {\n this.inputTarget.value = newValue;\n this.inputTarget.dispatchEvent(\n new InputEvent(\"input\", {\n bubbles: true,\n inputType: \"insertText\",\n data: newValue,\n })\n );\n }\n\n private isReady: boolean = false;\n\n // countrySelect, phoneInputTarget -> inputTarget\n updateValue(): void {\n const countryValue = this.countrySelect?.value;\n const rawValue = this.phoneInputTarget.value;\n let combinedValue: string = rawValue;\n\n if (rawValue.startsWith(\"+\")) {\n combinedValue = rawValue;\n } else if (rawValue === \"\") {\n // If input is empty, the combined value should be empty too\n combinedValue = \"\";\n } else if (countryValue != null) {\n combinedValue = `+${getCountryCallingCode(\n countryValue as CountryCode\n )}${rawValue}`;\n }\n\n const parsed = parsePhoneNumber(combinedValue);\n if (parsed != null) {\n combinedValue = parsed.format(\"E.164\");\n }\n\n this.value = combinedValue;\n }\n\n decomposeValue(\n value: string\n ): [countryCode: CountryCode | null, remainings: string] {\n const asYouType = new AsYouType();\n asYouType.input(value);\n let inputValue = value;\n let countryCodeFromPartialNumber: CountryCode | undefined;\n const callingCode = asYouType.getCallingCode();\n if (callingCode != null) {\n countryCodeFromPartialNumber =\n defaultCountryForDuplicatedCountryCodes[callingCode] ??\n CountryCodes[callingCode][0];\n }\n\n let countryCode = asYouType.getCountry() ?? null;\n\n // Determine country code in the following order\n // 1. asYouType.getCountry()\n // 2. asYouType.getCallingCode() and map with defaultCountryForDuplicatedCountryCodes\n if (!countryCode && countryCodeFromPartialNumber) {\n countryCode = countryCodeFromPartialNumber;\n }\n\n if (countryCode) {\n const callingCode = \"+\" + getCountryCallingCode(countryCode);\n inputValue = value.replace(callingCode, \"\");\n }\n\n return [countryCode, inputValue];\n }\n\n // phoneInputTarget -> countrySelect AND inputTarget.\n handleNumberInput(event: Event): void {\n const target = event.target as HTMLInputElement;\n const value = target.value;\n const [maybeCountry, _remainings] = this.decomposeValue(value);\n if (maybeCountry) {\n this.setCountrySelectValue(maybeCountry);\n }\n this.updateValue();\n }\n\n // countrySelect -> inputTarget.\n handleCountryInput(_event: Event): void {\n this.updateValue();\n }\n\n // eslint-disable-next-line sonarjs/cognitive-complexity\n private async initPhoneCode() {\n const countryListSources = [\n compileDefaultCountryList,\n compileLocalizedCountryList,\n ];\n\n for (const source of countryListSources) {\n try {\n const countries = await source();\n const options = countries.map((country) => {\n return {\n triggerLabel: `${country.flagEmoji} +${country.phone}`,\n prefix: `${country.flagEmoji} +${country.phone}`,\n searchLabel: `+${country.phone} ${country.name}`,\n label: country.localizedName,\n value: country.iso2,\n };\n });\n this.countrySelectTarget.setAttribute(\n \"data-custom-select-options-value\",\n JSON.stringify(options)\n );\n\n // 1. If this.inputTarget.value has something.\n // 2. x-geoip-country-code.\n // 3. If countryCode is invalid, reset to empty.\n // 4. Select the first one if countryCode is empty.\n\n const geoIPCountryCode: CountryCode | null =\n (document\n .querySelector(\"meta[name=x-geoip-country-code]\")\n ?.getAttribute(\"content\") as CountryCode | undefined) ?? null;\n\n let countryCode: CountryCode | null = null;\n // eslint-disable-next-line no-useless-assignment\n let inputValue: string = this.phoneInputTarget.value;\n\n if (this.inputTarget.value !== \"\") {\n [countryCode, inputValue] = this.decomposeValue(\n this.inputTarget.value\n );\n this.phoneInputTarget.value = inputValue;\n }\n\n this.isReady = true;\n\n // countryCode is still null.\n if (countryCode == null && geoIPCountryCode != null) {\n countryCode = geoIPCountryCode;\n }\n\n // The detected country is not allowed.\n if (options.find((o) => o.value === countryCode) == null) {\n countryCode = null;\n }\n\n const initialValue = countryCode ?? options[0].value;\n this.setCountrySelectValue(initialValue);\n } catch (e: unknown) {\n console.error(e);\n }\n }\n }\n\n connect() {\n void this.initPhoneCode();\n this.phoneInputTarget.addEventListener(\"blur\", this.handleInputBlur);\n this.phoneInputContainerTarget.classList.remove(\"hidden\");\n this.countrySelectTarget.classList.remove(\"hidden\");\n this.inputTarget.classList.add(\"hidden\");\n\n window.addEventListener(\"pageshow\", this.handlePageShow);\n }\n\n disconnect() {\n this.phoneInputTarget.removeEventListener(\"blur\", this.handleInputBlur);\n window.removeEventListener(\"pageshow\", this.handlePageShow);\n }\n\n handlePageShow = () => {\n // Restore the value from bfcache\n const restoredValue = this.inputTarget.value;\n if (!restoredValue) {\n return;\n }\n\n const [countryCode, inputValue] = this.decomposeValue(\n this.inputTarget.value\n );\n this.phoneInputTarget.value = inputValue;\n\n if (countryCode != null) {\n this.setCountrySelectValue(countryCode);\n }\n };\n\n handleInputBlur = () => {\n const [maybeCountry, remainings] = this.decomposeValue(\n this.inputTarget.value\n );\n if (maybeCountry) {\n this.setCountrySelectValue(maybeCountry);\n this.phoneInputTarget.value = remainings;\n }\n };\n\n private setCountrySelectValue(newValue: string) {\n if (!this.isReady) {\n return;\n }\n if (this.countrySelect != null) {\n this.countrySelect.select(newValue);\n } else {\n this.countrySelectTarget.setAttribute(\n \"data-custom-select-initial-value-value\",\n newValue\n );\n }\n }\n}\n","import { Controller } from \"@hotwired/stimulus\";\nimport { autoUpdate, computePosition, flip } from \"@floating-ui/dom\";\n\nexport interface SearchSelectOption {\n triggerLabel?: string;\n prefix?: string;\n label: string;\n searchLabel?: string;\n value: string;\n}\n\nexport class CustomSelectController extends Controller {\n static targets = [\n \"input\",\n \"trigger\",\n \"dropdownContainer\",\n \"dropdown\",\n \"search\",\n \"clearSearch\",\n \"options\",\n \"searchTemplate\",\n \"itemTemplate\",\n \"emptyTemplate\",\n ];\n static values = {\n options: Array,\n initialValue: String,\n };\n\n declare readonly inputTarget: HTMLInputElement;\n declare readonly triggerTarget: HTMLButtonElement;\n declare readonly dropdownTarget: HTMLElement;\n declare readonly dropdownContainerTarget: HTMLElement;\n declare readonly searchTarget: HTMLInputElement;\n declare readonly clearSearchTarget: HTMLElement;\n declare readonly optionsTarget: HTMLElement;\n declare readonly searchTemplateTarget?: HTMLTemplateElement;\n declare readonly itemTemplateTarget: HTMLTemplateElement;\n declare readonly emptyTemplateTarget?: HTMLTemplateElement;\n\n declare readonly hasSearchTarget: boolean;\n\n declare readonly optionsValue: SearchSelectOption[];\n declare readonly initialValueValue: string;\n\n private _highlightIndex: number = 0;\n private set highlightIndex(value: number) {\n this._highlightIndex = Math.max(\n 0,\n Math.min(value, this.filteredOptions.length - 1)\n );\n }\n private get highlightIndex(): number {\n return this._highlightIndex;\n }\n\n private isInitialized: boolean = false;\n\n get filteredOptions(): SearchSelectOption[] {\n if (!this.keyword) {\n return this.optionsValue;\n }\n return this.optionsValue.filter((option) => {\n return `${option.label} ${option.value} ${option.searchLabel}`\n .toLocaleLowerCase()\n .includes(this.keyword.toLocaleLowerCase());\n });\n }\n\n get isOpen(): boolean {\n return !this.dropdownContainerTarget.classList.contains(\"hidden\");\n }\n\n get value() {\n return this.inputTarget.value;\n }\n\n get keyword() {\n if (!this.hasSearchTarget) {\n return \"\";\n }\n\n return this.searchTarget.value;\n }\n\n get highlightedValue() {\n return (\n this.filteredOptions[this.highlightIndex] as\n | undefined\n | SearchSelectOption\n )?.value;\n }\n\n _computePositionCleanup = () => {};\n\n connect(): void {\n if (this.inputTarget.value === \"\") {\n this.inputTarget.value = this.initialValueValue;\n }\n this._computePositionCleanup = autoUpdate(\n this.triggerTarget,\n this.dropdownTarget,\n this._updateDropdownPosition\n );\n\n this.dropdownContainerTarget.classList.add(\"hidden\");\n this.renderTrigger();\n this.renderSearch();\n this.renderItems();\n\n this.triggerTarget.addEventListener(\"keydown\", this.handleKeyDown);\n this.dropdownTarget.addEventListener(\"keydown\", this.handleKeyDown);\n document.addEventListener(\"click\", this.handleClickOutside);\n\n this.isInitialized = true;\n }\n\n disconnect(): void {\n this._computePositionCleanup();\n\n this.triggerTarget.removeEventListener(\"keydown\", this.handleKeyDown);\n this.dropdownTarget.removeEventListener(\"keydown\", this.handleKeyDown);\n document.removeEventListener(\"click\", this.handleClickOutside);\n }\n\n optionsValueChanged() {\n if (!this.isInitialized) {\n return;\n }\n this.renderTrigger();\n this.renderItems();\n }\n\n open() {\n if (!this.dropdownContainerTarget.classList.contains(\"hidden\")) return;\n\n this.dropdownContainerTarget.classList.remove(\"hidden\");\n this.triggerTarget.setAttribute(\"aria-expanded\", \"true\");\n this.triggerTarget.classList.add(\"select__trigger--expanded\");\n\n this.resetHightlightIndex();\n this.clearSearch();\n this.resetScroll();\n\n if (this.hasSearchTarget) {\n this.searchTarget.focus();\n }\n\n this.dispatch(\"open\");\n }\n\n close() {\n if (this.dropdownContainerTarget.classList.contains(\"hidden\")) return;\n\n this.dropdownContainerTarget.classList.add(\"hidden\");\n this.triggerTarget.setAttribute(\"aria-expanded\", \"false\");\n this.triggerTarget.classList.remove(\"select__trigger--expanded\");\n\n this.dispatch(\"close\");\n }\n\n private resetHightlightIndex() {\n if (this.keyword) {\n this.highlightIndex = 0;\n } else {\n this.highlightIndex = this.optionsValue.findIndex(\n (o) => o.value === this.value\n );\n }\n }\n\n toggle() {\n const willExpand =\n this.dropdownContainerTarget.classList.contains(\"hidden\");\n if (willExpand) {\n this.open();\n } else {\n this.close();\n }\n }\n\n search() {\n this.resetHightlightIndex();\n this.renderItems();\n this.resetScroll();\n }\n\n clearSearch() {\n if (!this.hasSearchTarget) return;\n\n this.searchTarget.value = \"\";\n this.renderItems();\n }\n\n resetScroll() {\n const item = this.optionsTarget.querySelector(\n `[data-value=\"${this.highlightedValue ?? this.value}\"]`\n );\n if (item) {\n item.scrollIntoView({ block: \"center\" });\n }\n }\n\n navigate(indexFn: (index: number) => number) {\n this.highlightIndex = indexFn(this.highlightIndex);\n const item = this.optionsTarget.querySelector(\n `[data-value=\"${this.highlightedValue}\"]`\n );\n\n if (!item) return;\n this._updateAriaSelected(item);\n }\n\n handleSelect(event: MouseEvent) {\n const item = event.target as HTMLLIElement | undefined;\n if (!item) return;\n\n const value = item.dataset.value;\n this._selectValue(value);\n }\n\n // eslint-disable-next-line complexity\n handleKeyDown = (event: KeyboardEvent) => {\n let preventAndStop = true;\n switch (event.key) {\n case \"ArrowDown\":\n this.navigate((idx) => idx + 1);\n break;\n case \"ArrowUp\":\n this.navigate((idx) => idx - 1);\n break;\n case \"PageDown\":\n this.navigate((idx) => idx + 10);\n break;\n case \"PageUp\":\n this.navigate((idx) => idx - 10);\n break;\n case \"Home\":\n this.navigate((_idx) => 0);\n break;\n case \"End\":\n this.navigate((_idx) => this.filteredOptions.length - 1);\n break;\n case \"Enter\":\n this._selectValue(this.highlightedValue ?? this.value);\n break;\n case \"Escape\":\n this.close();\n preventAndStop = false;\n break;\n default:\n preventAndStop = false;\n }\n\n if (preventAndStop) {\n event.preventDefault();\n event.stopPropagation();\n }\n };\n\n handleClickOutside = (event: MouseEvent) => {\n if (!this.element.contains(event.target as Node)) {\n this.close();\n }\n };\n\n _updateDropdownPosition = () => {\n void computePosition(this.triggerTarget, this.dropdownTarget, {\n placement: \"bottom-start\",\n middleware: [\n flip({\n fallbackPlacements: [\"top-start\"],\n fallbackStrategy: \"initialPlacement\",\n }),\n ],\n }).then(({ x, y }) => {\n Object.assign(this.dropdownTarget.style, {\n left: `${x}px`,\n top: `${y}px`,\n });\n });\n };\n\n _selectValue(value: string | undefined) {\n const option = this.optionsValue.find((o) => o.value === value);\n if (option == null) {\n console.warn(\"Trying to select an option which does not exist\");\n return;\n }\n const optionEl = this.optionsTarget.querySelector(\n `[data-value=\"${option.value}\"]`\n );\n if (optionEl != null) {\n this._updateAriaSelected(optionEl);\n }\n this.inputTarget.value = value ?? \"\";\n this.inputTarget.dispatchEvent(new Event(\"input\", { bubbles: true }));\n\n this.renderTrigger();\n this.close();\n }\n\n _updateAriaSelected(item: HTMLLIElement) {\n this.optionsTarget.querySelectorAll('[role=\"option\"]').forEach((option) => {\n option.setAttribute(\"aria-selected\", \"false\");\n });\n item.setAttribute(\"aria-selected\", \"true\");\n this._scrollIntoNearestView(item);\n }\n\n // Default `scrollIntoView({ block: \"nearest\" })` does not keep padding\n // into account, which makes the selected item stick to the top/bottom of the\n // dropdown.\n _scrollIntoNearestView(item: HTMLLIElement) {\n const container = this.optionsTarget;\n const containerPadding = parseFloat(getComputedStyle(container).paddingTop);\n const padding = parseFloat(getComputedStyle(item).paddingTop);\n const itemPosition =\n item.offsetTop -\n (this.hasSearchTarget ? this.searchTarget.offsetHeight : 0);\n\n let scrollPosition: number | undefined;\n\n switch (true) {\n case container.firstElementChild === item:\n scrollPosition = 0;\n break;\n case container.lastElementChild === item:\n scrollPosition = container.scrollHeight;\n break;\n case itemPosition < container.scrollTop + padding - containerPadding:\n scrollPosition = itemPosition - padding;\n break;\n case itemPosition + item.offsetHeight + padding >\n container.scrollTop + container.offsetHeight - containerPadding:\n scrollPosition =\n itemPosition + item.offsetHeight + padding - container.offsetHeight;\n break;\n default:\n break;\n }\n\n if (scrollPosition !== undefined) {\n requestAnimationFrame(() => {\n container.scrollTo({ top: scrollPosition });\n });\n }\n }\n\n renderTrigger() {\n const option =\n this.optionsValue.find((option) => option.value === this.value) ??\n (this.optionsValue[0] as SearchSelectOption | undefined);\n\n if (!option) {\n return;\n }\n\n this.triggerTarget.innerHTML = option.triggerLabel ?? option.label;\n if (this.value) {\n this.triggerTarget.classList.remove(\"custom-select__trigger-no-value\");\n } else {\n this.triggerTarget.classList.add(\"custom-select__trigger-no-value\");\n }\n }\n\n renderSearch() {\n if (!this.searchTemplateTarget) {\n return;\n }\n\n const container = this.dropdownTarget;\n const template = this.searchTemplateTarget.content;\n container.prepend(document.importNode(template, true));\n }\n\n renderItems() {\n const container = this.optionsTarget;\n const template = this.itemTemplateTarget.content;\n\n const fragment = document.createDocumentFragment();\n\n const visibleOptions = this.filteredOptions;\n\n const visibleOptionsIndexByValue = visibleOptions.reduce<\n Map\n >((result, option, idx, _arr): Map => {\n result.set(option.value, idx);\n return result;\n }, new Map());\n\n this.optionsValue.forEach((item, index) => {\n const clone = document.importNode(template, true);\n const option = clone.querySelector(\"li\");\n if (option == null) {\n return;\n }\n const isVisible = visibleOptionsIndexByValue.get(item.value) != null;\n const selected =\n visibleOptionsIndexByValue.get(item.value) === this.highlightIndex;\n const prefixEl = option.querySelector(\n '[data-label=\"prefix\"]'\n );\n const labelEl = option.querySelector(\n '[data-label=\"content\"]'\n );\n if (prefixEl) {\n prefixEl.style.pointerEvents = \"none\";\n prefixEl.innerHTML = item.prefix ?? \"\";\n }\n if (labelEl) {\n labelEl.style.pointerEvents = \"none\";\n labelEl.innerHTML = item.label;\n }\n if (!prefixEl && !labelEl) {\n option.innerHTML = item.label;\n }\n option.dataset.index = index.toString();\n option.setAttribute(\"data-value\", item.value);\n option.setAttribute(\"aria-selected\", selected.toString());\n if (!isVisible) {\n option.classList.add(\"hidden\");\n }\n fragment.appendChild(clone);\n });\n\n if (visibleOptions.length === 0 && this.emptyTemplateTarget) {\n const emptyTemplate = this.emptyTemplateTarget.content;\n const clone = document.importNode(emptyTemplate, true);\n fragment.appendChild(clone);\n }\n\n this.optionsTarget.innerHTML = \"\";\n container.appendChild(fragment);\n }\n\n public select(value: string | undefined) {\n this._selectValue(value);\n }\n}\n","import { Controller } from \"@hotwired/stimulus\";\nimport { Duration } from \"luxon\";\n\nexport class CountdownController extends Controller {\n static targets = [\"button\"];\n static values = {\n cooldown: Number,\n cooldownUntil: String,\n label: String,\n labelUnit: String,\n format: String,\n };\n\n declare readonly buttonTarget: HTMLButtonElement;\n\n declare cooldownValue?: number;\n declare cooldownUntilValue?: string;\n declare labelValue: string;\n declare labelUnitValue: string;\n declare formatValue?: string;\n\n animHandle: number | null = null;\n\n connect() {\n this.validateValues();\n\n const button = this.buttonTarget;\n\n const scheduledAt = new Date();\n const cooldown = this.cooldownValue\n ? this.cooldownValue * 1000\n : new Date(this.cooldownUntilValue!).getTime() - scheduledAt.getTime();\n const label = this.labelValue;\n const labelUnit = this.labelUnitValue;\n const format = this.formatValue || \"mm:ss\";\n\n const tick = () => {\n const now = new Date();\n const timeElapsed = now.getTime() - scheduledAt.getTime();\n\n let seconds = 0;\n if (timeElapsed <= cooldown) {\n seconds = Math.round((cooldown - timeElapsed) / 1000);\n }\n const duration = Duration.fromObject({ seconds });\n const formatted = duration.toFormat(format);\n\n if (seconds === 0) {\n button.disabled = false;\n button.textContent = label;\n this.animHandle = null;\n } else {\n button.disabled = true;\n button.textContent = labelUnit.replace(\"%s\", formatted);\n this.animHandle = requestAnimationFrame(tick);\n }\n };\n\n this.animHandle = requestAnimationFrame(tick);\n }\n\n disconnect() {\n if (this.animHandle != null) {\n cancelAnimationFrame(this.animHandle);\n this.animHandle = null;\n }\n }\n\n private validateValues() {\n if (this.cooldownValue && isNaN(this.cooldownValue)) {\n throw new Error(\"cooldown must be a valid number\");\n }\n\n if (\n this.cooldownUntilValue &&\n isNaN(new Date(this.cooldownUntilValue).getTime())\n ) {\n throw new Error(\"cooldownUntil must be a valid date\");\n }\n }\n}\n","import { Controller } from \"@hotwired/stimulus\";\n\nexport class TextFieldController extends Controller {\n static values = {\n inputContainerErrorClass: { type: String },\n inputErrorClass: { type: String, default: \"input--error\" },\n };\n static targets = [\"inputContainer\", \"input\", \"errorMessage\"];\n\n declare inputContainerErrorClassValue: string;\n declare inputErrorClassValue: string;\n declare hasInputContainerTarget: boolean;\n declare inputContainerTarget: HTMLElement;\n declare hasErrorMessageTarget: boolean;\n declare errorMessageTarget: HTMLElement;\n declare inputTarget: HTMLInputElement;\n\n connect() {\n this.inputTarget.addEventListener(\"input\", this.onInput);\n }\n\n disconnect() {\n this.inputTarget.removeEventListener(\"input\", this.onInput);\n }\n\n onInput = () => {\n if (this.hasInputContainerTarget) {\n this.inputContainerTarget.classList.remove(\n this.inputContainerErrorClassValue\n );\n }\n\n if (this.inputTarget.classList.contains(this.inputErrorClassValue)) {\n this.inputTarget.classList.remove(this.inputErrorClassValue);\n }\n\n if (this.hasErrorMessageTarget) {\n this.errorMessageTarget.classList.add(\"hidden\");\n }\n };\n}\n","import { Controller } from \"@hotwired/stimulus\";\n\nexport class OverlayController extends Controller {\n static values = { defaultOpen: Boolean };\n\n declare readonly defaultOpenValue: boolean;\n\n connect(): void {\n if (this.defaultOpenValue) {\n this.open();\n }\n }\n\n open() {\n this.element.classList.add(\"open\");\n }\n\n close() {\n this.element.classList.remove(\"open\");\n }\n}\n","import { Controller } from \"@hotwired/stimulus\";\nimport { PasswordPolicyController } from \"./password-policy\";\n\nexport class NewPasswordFieldController extends Controller {\n static values = {\n inputErrorClass: { type: String, default: \"input--error\" },\n confirmPasswordErrorMessage: { type: String },\n };\n static targets = [\n \"newPasswordInput\",\n \"confirmPasswordInput\",\n \"confirmPasswordError\",\n ];\n\n declare inputErrorClassValue: string;\n declare confirmPasswordErrorMessageValue: string;\n declare newPasswordInputTarget: HTMLInputElement;\n declare confirmPasswordInputTarget: HTMLInputElement;\n declare confirmPasswordErrorTarget: HTMLElement;\n\n newPasswordInputTargetConnected(el: HTMLInputElement) {\n el.addEventListener(\"blur\", this.handlePasswordInputBlur);\n }\n\n newPasswordInputTargetDisconnected(el: HTMLInputElement) {\n el.removeEventListener(\"blur\", this.handlePasswordInputBlur);\n }\n\n confirmPasswordInputTargetConnected(el: HTMLInputElement) {\n el.addEventListener(\"blur\", this.handleConfirmPasswordInputBlur);\n }\n\n confirmPasswordInputTargetDisconnected(el: HTMLInputElement) {\n el.removeEventListener(\"blur\", this.handleConfirmPasswordInputBlur);\n }\n\n handlePasswordInputBlur = () => {\n if (this.isNewPasswordInputEmpty()) {\n return;\n }\n const violated = this.newPasswordInputTarget.getAttribute(\n PasswordPolicyController.ATTR_POLICY_VIOLATED\n );\n if (violated != null && violated !== \"\") {\n this.newPasswordInputTarget.classList.add(this.inputErrorClassValue);\n }\n if (this.isConfirmPasswordInputEmpty()) {\n return;\n }\n if (!this.isConfirmPasswordCorrect()) {\n this.confirmPasswordInputTarget.classList.add(this.inputErrorClassValue);\n this.confirmPasswordErrorTarget.classList.remove(\"hidden\");\n this.confirmPasswordErrorTarget.innerHTML =\n this.confirmPasswordErrorMessageValue;\n } else {\n this.confirmPasswordInputTarget.classList.remove(\n this.inputErrorClassValue\n );\n this.confirmPasswordErrorTarget.classList.add(\"hidden\");\n }\n };\n\n handleConfirmPasswordInputBlur = () => {\n if (this.isConfirmPasswordInputEmpty()) {\n return;\n }\n this.handlePasswordInputBlur();\n };\n\n private isNewPasswordInputEmpty(): boolean {\n return this.newPasswordInputTarget.value === \"\";\n }\n private isConfirmPasswordInputEmpty(): boolean {\n return this.confirmPasswordInputTarget.value === \"\";\n }\n\n private isConfirmPasswordCorrect(): boolean {\n return (\n this.newPasswordInputTarget.value ===\n this.confirmPasswordInputTarget.value\n );\n }\n}\n","import { Controller } from \"@hotwired/stimulus\";\n\n/**\n * On iOS, the keyboard is treated as overlay rather than part of the viewport.\n * This causes an extra padding to be added to the bottom of the viewport when the keyboard is open.\n *\n * This controller listens for scroll events and dismisses the keyboard when user scrolls on\n * the body or non-`overflow:auto/scroll` element.\n */\nexport class DismissKeyboardOnScrollController extends Controller {\n connect() {\n window.addEventListener(\"scroll\", this.dismissKeyboard);\n }\n\n disconnect() {\n window.removeEventListener(\"scroll\", this.dismissKeyboard);\n }\n\n dismissKeyboard = () => {\n if (\n document.activeElement instanceof HTMLElement &&\n document.activeElement === this.element\n ) {\n document.activeElement.blur();\n }\n };\n}\n","import { Controller } from \"@hotwired/stimulus\";\n\nexport class BodyScrollLockController extends Controller {\n scrollPosition = 0;\n styleElement: HTMLStyleElement | null = null;\n\n get style() {\n const height = window.visualViewport\n ? `${window.visualViewport.height}px`\n : \"100vh\";\n\n return `\n body {\n position: fixed;\n top: -${this.scrollPosition}px;\n left: 0;\n right: 0;\n width: 100%;\n height: ${height};\n }\n `;\n }\n\n lock() {\n this.scrollPosition = document.documentElement.scrollTop;\n\n this.styleElement = document.createElement(\"style\");\n document.head.appendChild(this.styleElement);\n this.styleElement.sheet?.insertRule(this.style, 0);\n }\n\n unlock() {\n if (this.styleElement) {\n document.head.removeChild(this.styleElement);\n this.styleElement = null;\n }\n\n window.scrollTo(0, this.scrollPosition);\n }\n}\n","import { Controller } from \"@hotwired/stimulus\";\nimport { PreviewableResourceController } from \"./previewable-resource\";\nimport { injectCSSAttrs } from \"./cssattrs\";\n\ninterface PreviewCustomisationMessage {\n theme: string;\n cssVars: Record;\n images: Record;\n translations: Record;\n}\n\nfunction parsePreviewCustomisationMessage(\n message: any\n): PreviewCustomisationMessage | null {\n if (message.type !== \"PreviewCustomisationMessage\") {\n return null;\n }\n return {\n theme: message.theme ?? \"\",\n cssVars: message.cssVars ?? {},\n images: message.images ?? {},\n translations: message.translations ?? {},\n };\n}\n\nexport class InlinePreviewController extends Controller {\n static outlets = [\"previewable-resource\"];\n static values = {\n isInlinePreview: Boolean,\n };\n\n declare previewableResourceOutlets: PreviewableResourceController[];\n declare isInlinePreviewValue: boolean;\n\n windowMessageAllowedOrigins!: string[];\n\n connect(): void {\n if (!this.isInlinePreviewValue) {\n return;\n }\n const windowMessageAllowedOrigins = ((): string[] => {\n const meta: HTMLMetaElement | null = document.querySelector(\n \"meta[name=x-window-message-allowed-origins]\"\n );\n const content = meta?.content ?? \"\";\n return content.split(\",\").map((origin) => origin.trim());\n })();\n this.windowMessageAllowedOrigins = windowMessageAllowedOrigins;\n if (windowMessageAllowedOrigins.length === 0) {\n return;\n }\n window.addEventListener(\"message\", this.onReceiveMessage);\n }\n\n disconnect(): void {\n window.removeEventListener(\"message\", this.onReceiveMessage);\n }\n\n onReceiveMessage = (e: MessageEvent): void => {\n if (!this.windowMessageAllowedOrigins.includes(e.origin)) {\n return;\n }\n const customisationMessage = parsePreviewCustomisationMessage(e.data);\n if (customisationMessage == null) {\n return;\n }\n const el = this.element as HTMLElement;\n for (const [name, value] of Object.entries(customisationMessage.cssVars)) {\n const currentStyle = el.style.getPropertyValue(name);\n if (currentStyle !== value) {\n el.style.setProperty(name, value);\n }\n }\n\n for (const [key, value] of Object.entries(\n customisationMessage.translations\n )) {\n for (const outlet of this.previewableResourceOutlets) {\n if (outlet.keyValue === key) {\n outlet?.setValue(value);\n }\n }\n }\n\n for (const [key, value] of Object.entries(customisationMessage.images)) {\n for (const outlet of this.previewableResourceOutlets) {\n if (outlet.keyValue === key) {\n outlet?.setValue(value);\n }\n }\n }\n\n el.classList.remove(\"dark\");\n if (customisationMessage.theme === \"dark\") {\n el.classList.add(\"dark\");\n }\n\n injectCSSAttrs(document.documentElement);\n };\n}\n","import { Controller } from \"@hotwired/stimulus\";\n\nexport class PreviewableResourceController extends Controller {\n static values = {\n key: String,\n changableAttribute: String,\n original: String,\n };\n\n declare keyValue: string;\n declare changableAttributeValue: string;\n declare originalValue: string;\n\n setMessage(message: string): void {\n this.element.innerHTML = message;\n }\n\n setValue(value: string | null): void {\n const valueToSet = value != null ? value : this.originalValue;\n if (this.changableAttributeValue === \"innerHTML\") {\n this.element.innerHTML = valueToSet;\n } else {\n this.element.setAttribute(this.changableAttributeValue, valueToSet);\n }\n }\n}\n","/**\n * This code duplicates with authui/src/colorscheme.ts. However, colorscheme.ts cannot import other modules because it is commonjs script instead\n * Please help keep code in `getColorScheme.ts` and `colorscheme.ts` sync if you are to make any changes\n */\n\n/**\n * Get color scheme from html element\n */\nexport function getColorScheme(): string {\n const queryResult = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const htmlElement = document.documentElement;\n const darkThemeEnabled =\n htmlElement.getAttribute(\"data-dark-theme-enabled\") === \"true\";\n const lightThemeEnabled =\n htmlElement.getAttribute(\"data-light-theme-enabled\") === \"true\";\n\n let explicitColorScheme = \"\";\n const metaElement = document.querySelector(\"meta[name=x-color-scheme]\");\n if (metaElement instanceof HTMLMetaElement) {\n explicitColorScheme = metaElement.content;\n }\n const queryParam = new URLSearchParams(window.location.search).get(\n \"x_color_scheme\"\n );\n if (queryParam != null) {\n explicitColorScheme = queryParam;\n }\n\n const implicitColorScheme = queryResult.matches ? \"dark\" : \"light\";\n\n let colorScheme = \"light\";\n // First of all, respect project configuration\n if (lightThemeEnabled && !darkThemeEnabled) {\n colorScheme = \"light\";\n } else if (!lightThemeEnabled && darkThemeEnabled) {\n colorScheme = \"dark\";\n } else {\n // !lightThemeEnabled && !darkThemeEnabled is treated as both enabled\n if (explicitColorScheme !== \"\") {\n colorScheme = explicitColorScheme;\n } else {\n colorScheme = implicitColorScheme;\n }\n }\n return colorScheme;\n}\n","/**\n * Dispatch a custom event to render bot protection widget\n */\nexport function dispatchBotProtectionWidgetEventRender() {\n document.dispatchEvent(new CustomEvent(\"bot-protection-widget:render\"));\n}\n\n/**\n * Dispatch a custom event to set captcha failed\n */\nexport function dispatchBotProtectionWidgetEventUndoRender() {\n document.dispatchEvent(new CustomEvent(\"bot-protection-widget:undo-render\"));\n}\n\n/**\n * Dispatch a custom event to publish `readyForRender` message\n */\nexport function dispatchBotProtectionWidgetEventReadyForRender() {\n document.dispatchEvent(\n new CustomEvent(\"bot-protection-widget:ready-for-render\")\n );\n}\n","import { Controller } from \"@hotwired/stimulus\";\n\n/**\n * Dispatch a custom event to set target dialog open\n */\nexport function dispatchDialogOpen(dialogID: string) {\n document.dispatchEvent(\n new CustomEvent(`dialog:open`, { detail: { id: dialogID } })\n );\n}\n\n/**\n * Dispatch a custom event to set target dialog close\n */\nexport function dispatchDialogClose(dialogID: string) {\n document.dispatchEvent(\n new CustomEvent(`dialog:close`, { detail: { id: dialogID } })\n );\n}\n\n/**\n * Dispatch a custom event to publish target dialog open event\n */\nfunction dispatchDialogOpenStart(dialogID: string) {\n document.dispatchEvent(\n new CustomEvent(`dialog:open-start`, { detail: { id: dialogID } })\n );\n}\n\n/**\n * Dispatch a custom event to publish target dialog close event\n */\nfunction dispatchDialogCloseEnd(dialogID: string) {\n document.dispatchEvent(\n new CustomEvent(`dialog:close-end`, { detail: { id: dialogID } })\n );\n}\n\n/**\n * Controller for dialog display\n *\n * Expected usage:\n * - Add `data-controller=\"dialog\"` to a dialog\n * - Specific `id` attribute to that HTML element\n *\n * @listens dialog:open\n * @listens dialog:close\n * @fires dialog:opened\n * @fires dialog:closed\n *\n * @example // To open a dialog, dispatch below event\n * new CustomEvent(\"dialog:open\", {detail: {id: \"foobar\"}})\n * @example // To close a dialog, dispatch below event\n * new CustomEvent(\"dialog:close\", {detail: {id: \"foobar\"}})\n * @example // To receive a callback when the dialog is opened, listen to following event\n * new CustomEvent(\"dialog:opened\", {detail: {id: \"foobar\"}})\n * @example // To receive a callback when the dialog is closed, listen to following event\n * new CustomEvent(\"dialog:closed\", {detail: {id: \"foobar\"}})\n */\nexport class DialogController extends Controller {\n open() {\n dispatchDialogOpen(this.element.id);\n }\n\n close() {\n dispatchDialogClose(this.element.id);\n }\n\n private openFromEvent = (e: Event) => {\n if (!(e instanceof CustomEvent)) {\n return;\n }\n if (this.element.id !== e.detail.id) {\n // open event targets other dialog\n return;\n }\n this.element.classList.add(\"open\");\n (document.activeElement as HTMLElement | null)?.blur();\n };\n\n private closeFromEvent = (e: Event) => {\n if (!(e instanceof CustomEvent)) {\n return;\n }\n if (this.element.id !== e.detail.id) {\n // close event targets other dialog\n return;\n }\n this.element.classList.remove(\"open\");\n };\n\n get isOpened() {\n return this.element.classList.contains(\"open\");\n }\n\n get isClosed() {\n return !this.isOpened;\n }\n\n openStart = (e: Event) => {\n const isVisibilityEvent =\n (e as TransitionEvent).propertyName === \"visibility\";\n if (isVisibilityEvent && this.isOpened) {\n dispatchDialogOpenStart(this.element.id);\n }\n };\n\n closeEnd = (e: Event) => {\n const isVisibilityEvent =\n (e as TransitionEvent).propertyName === \"visibility\";\n\n if (isVisibilityEvent && this.isClosed) {\n dispatchDialogCloseEnd(this.element.id);\n }\n };\n\n closeOnCrossBtnClick = () => {\n dispatchDialogClose(this.element.id);\n };\n\n closeOnBackgroundClick = (e: Event) => {\n if (e.target !== this.element) {\n // Clicked descendants instead of background\n return;\n }\n dispatchDialogClose(this.element.id);\n };\n\n connect() {\n document.addEventListener(`dialog:open`, this.openFromEvent);\n document.addEventListener(`dialog:close`, this.closeFromEvent);\n this.element.addEventListener(\"transitionstart\", this.openStart);\n this.element.addEventListener(\"transitionend\", this.closeEnd);\n }\n\n disconnect() {\n document.removeEventListener(`dialog:open`, this.openFromEvent);\n document.removeEventListener(`dialog:close`, this.closeFromEvent);\n this.element.removeEventListener(\"transitionstart\", this.openStart);\n this.element.removeEventListener(\"transitionend\", this.closeEnd);\n }\n}\n","import { Controller } from \"@hotwired/stimulus\";\nimport {\n dispatchBotProtectionWidgetEventRender,\n dispatchBotProtectionWidgetEventUndoRender,\n} from \"./botProtectionWidget\";\nimport { dispatchDialogClose, dispatchDialogOpen } from \"../dialog\";\n\n// Assume globally only have ONE single dialog\nconst DIALOG_ID = \"bot-protection-dialog\";\n\n/**\n * Dispatch a custom event to set captcha dialog open\n */\nexport function dispatchBotProtectionDialogOpen() {\n dispatchDialogOpen(DIALOG_ID);\n}\n\n/**\n * Dispatch a custom event to set captcha dialog close\n */\nexport function dispatchBotProtectionDialogClose() {\n dispatchDialogClose(DIALOG_ID);\n}\n\n/**\n * Controller for bot protection dialog display\n *\n * Expected usage:\n * - Add `data-controller=\"bot-protection-dialog\"` to a dialog\n * - Specify id=\"bot-protection-dialog\" to that dialog\n */\nexport class BotProtectionDialogController extends Controller {\n onOpenStart = (e: Event) => {\n if (!(e instanceof CustomEvent)) {\n return;\n }\n if (e.detail.id !== DIALOG_ID) {\n // event targets other dialog\n return;\n }\n dispatchBotProtectionWidgetEventRender();\n };\n\n onCloseEnd = (e: Event) => {\n if (!(e instanceof CustomEvent)) {\n return;\n }\n if (e.detail.id !== DIALOG_ID) {\n // event targets other dialog\n return;\n }\n dispatchBotProtectionWidgetEventUndoRender();\n };\n\n connect() {\n if (this.element.id !== DIALOG_ID) {\n console.error(`bot-protection-dialog must have id=\"${DIALOG_ID}\"`);\n return;\n }\n document.addEventListener(`dialog:open-start`, this.onOpenStart);\n document.addEventListener(`dialog:close-end`, this.onCloseEnd);\n }\n\n disconnect() {\n document.removeEventListener(`dialog:open-start`, this.onOpenStart);\n document.removeEventListener(`dialog:close-end`, this.onCloseEnd);\n }\n}\n","import { Controller } from \"@hotwired/stimulus\";\nimport {\n dispatchBotProtectionDialogClose,\n dispatchBotProtectionDialogOpen,\n} from \"./botProtectionDialog\";\n\n/**\n * Dispatch a custom event to set captcha verified with success token\n *\n * @param {string} token - success token\n */\nexport function dispatchBotProtectionEventVerified(token: string) {\n document.dispatchEvent(\n new CustomEvent(\"bot-protection:verify-success\", {\n detail: {\n token,\n },\n })\n );\n}\n\n/**\n * Dispatch a custom event to set captcha failed\n *\n * @param {string | undefined} errMsg - error message\n */\nexport function dispatchBotProtectionEventFailed(errMsg?: string) {\n document.dispatchEvent(\n new CustomEvent(\"bot-protection:verify-failed\", {\n detail: {\n errMsg,\n },\n })\n );\n}\n\n/**\n * Dispatch a custom event to set captcha expired\n *\n * @param {string | undefined} token - expired token\n */\nexport function dispatchBotProtectionEventExpired(token?: string) {\n document.dispatchEvent(\n new CustomEvent(\"bot-protection:verify-expired\", {\n detail: {\n token,\n },\n })\n );\n}\n\n/**\n * Controller for bot protection verification\n * - `verifyFormSubmit` by intercepting form submission\n * - re-submit the intercepted form\n *\n * Expected usage:\n * - Add `data-controller=\"bot-protection\"` to a top-level element like body\n * - Add `data-action=\"submit->bot-protection#verifyFormSubmit\"` to any `
` in body\n */\nexport class BotProtectionController extends Controller {\n declare isVerified: boolean;\n declare formSubmitTarget: HTMLElement | null;\n verifyFormSubmit(e: Event) {\n if (!(e instanceof SubmitEvent)) {\n throw new Error(\"verifyFormSubmit must be triggered on submit events\");\n }\n\n if (this.isVerified) {\n return;\n }\n\n e.preventDefault();\n e.stopImmediatePropagation();\n this.formSubmitTarget = e.submitter;\n dispatchBotProtectionDialogOpen();\n }\n\n onVerifySuccess = () => {\n this.isVerified = true;\n // Wait for bot-protection-token-input to process \"bot-protection:verify-success\" event\n // so that the form submission will have bot protection token injected.\n setTimeout(() => {\n this.formSubmitTarget?.click();\n dispatchBotProtectionDialogClose();\n }, 0);\n };\n\n onVerifyFailed = () => {\n this.isVerified = false;\n };\n\n onVerifyExpired = () => {\n this.isVerified = false;\n };\n\n connect() {\n document.addEventListener(\n \"bot-protection:verify-success\",\n this.onVerifySuccess\n );\n document.addEventListener(\n \"bot-protection:verify-failed\",\n this.onVerifyFailed\n );\n document.addEventListener(\n \"bot-protection:verify-expired\",\n this.onVerifyExpired\n );\n }\n disconnect() {\n document.removeEventListener(\n \"bot-protection:verify-success\",\n this.onVerifySuccess\n );\n document.removeEventListener(\n \"bot-protection:verify-failed\",\n this.onVerifyFailed\n );\n document.removeEventListener(\n \"bot-protection:verify-expired\",\n this.onVerifyExpired\n );\n }\n}\n","// These are meaningful errors types for handling, which originated from actual cloudflare turnstile error codes\nexport enum CloudflareTurnstileError {\n InvalidSiteKey = \"invalid-sitekey\",\n DomainNotAllowed = \"domain-not-allowed\",\n UnusualVisitorBehavior = \"unusual-visitor-behavior\",\n UnsupportedBrowser = \"unsupported-browser\",\n Timeout = \"timeout\",\n Unknown = \"unknown\",\n}\n\nexport interface CloudflareTurnstileErrorCodeParseResult {\n error: CloudflareTurnstileError;\n shouldRetry: boolean;\n shouldDisplayErrMsg: boolean;\n}\n\nconst CLOUDFLARE_TURNSTILE_ERROR_INVALID_SITE_KEY: CloudflareTurnstileErrorCodeParseResult =\n {\n error: CloudflareTurnstileError.InvalidSiteKey,\n shouldRetry: false,\n shouldDisplayErrMsg: false, // cloudflare will render the error message inside its widget\n };\n\nconst CLOUDFLARE_TURNSTILE_ERROR_DOMAIN_NOT_ALLOWED: CloudflareTurnstileErrorCodeParseResult =\n {\n error: CloudflareTurnstileError.DomainNotAllowed,\n shouldRetry: false,\n shouldDisplayErrMsg: false, // cloudflare will render the error message inside its widget\n };\nconst CLOUDFLARE_TURNSTILE_ERROR_UNUSUAL_VISITOR_BEHAVIOR: CloudflareTurnstileErrorCodeParseResult =\n {\n error: CloudflareTurnstileError.UnusualVisitorBehavior,\n shouldRetry: false,\n shouldDisplayErrMsg: false,\n };\nconst CLOUDFLARE_TURNSTILE_ERROR_UNSUPPORTED_BROWSER: CloudflareTurnstileErrorCodeParseResult =\n {\n error: CloudflareTurnstileError.UnsupportedBrowser,\n shouldRetry: false,\n shouldDisplayErrMsg: false, // cloudflare will render the error message inside its widget\n };\nconst CLOUDFLARE_TURNSTILE_ERROR_TIMEOUT: CloudflareTurnstileErrorCodeParseResult =\n {\n error: CloudflareTurnstileError.Timeout,\n shouldRetry: true,\n shouldDisplayErrMsg: false, // auto retry, no need err message\n };\nconst CLOUDFLARE_TURNSTILE_ERROR_UNKNOWN: CloudflareTurnstileErrorCodeParseResult =\n {\n error: CloudflareTurnstileError.Unknown,\n shouldRetry: false,\n shouldDisplayErrMsg: true,\n };\n\n/**\n * @see https://developers.cloudflare.com/turnstile/troubleshooting/client-side-errors/error-codes/\n */\nexport function parseCloudflareTurnstileErrorCode(\n errCode: string\n): CloudflareTurnstileErrorCodeParseResult {\n switch (errCode) {\n case \"110100\":\n case \"110110\": {\n return CLOUDFLARE_TURNSTILE_ERROR_INVALID_SITE_KEY;\n }\n\n case \"110200\": {\n return CLOUDFLARE_TURNSTILE_ERROR_DOMAIN_NOT_ALLOWED;\n }\n\n case \"110500\": {\n return CLOUDFLARE_TURNSTILE_ERROR_UNSUPPORTED_BROWSER;\n }\n\n default: {\n if (errCode.startsWith(\"1106\")) {\n return CLOUDFLARE_TURNSTILE_ERROR_TIMEOUT;\n }\n if (errCode.startsWith(\"300\") || errCode.startsWith(\"600\")) {\n return CLOUDFLARE_TURNSTILE_ERROR_UNUSUAL_VISITOR_BEHAVIOR;\n }\n return CLOUDFLARE_TURNSTILE_ERROR_UNKNOWN;\n }\n }\n}\n","/* global Turnstile */\nimport { Controller } from \"@hotwired/stimulus\";\nimport { getColorScheme } from \"../../getColorScheme\";\nimport {\n dispatchBotProtectionEventExpired,\n dispatchBotProtectionEventFailed,\n dispatchBotProtectionEventVerified,\n} from \"./botProtection\";\nimport { parseCloudflareTurnstileErrorCode } from \"./cloudflareTurnstileError\";\nimport { setErrorMessage } from \"../alert-message\";\nimport { dispatchBotProtectionWidgetEventReadyForRender } from \"./botProtectionWidget\";\n\nfunction parseTheme(theme: string): Turnstile.Theme {\n switch (theme) {\n case \"light\":\n return \"light\";\n case \"dark\":\n return \"dark\";\n case \"auto\":\n return \"auto\";\n default:\n return \"auto\";\n }\n}\n\nconst CLOUDFLARE_TURNSTILE_ERROR_MSG_ID = \"data-bot-protection-cloudflare\";\nexport class CloudflareTurnstileController extends Controller {\n static values = {\n siteKey: { type: String },\n lang: { type: String },\n };\n\n static targets = [\"widget\"];\n\n declare siteKeyValue: string;\n declare langValue: string;\n declare widgetTarget: HTMLDivElement;\n declare widgetContainer: HTMLDivElement | undefined;\n declare widgetID: string | undefined;\n declare isReadyForRendering: boolean;\n\n hasExistingWidget = () => {\n return this.widgetContainer != null && this.widgetID != null;\n };\n resetWidget = () => {\n if (!this.hasExistingWidget()) {\n return;\n }\n window.turnstile.reset(this.widgetID);\n };\n\n renderWidget = () => {\n if (!this.isReadyForRendering) {\n throw new Error(\"turnstile target is not ready for rendering\");\n }\n if (this.hasExistingWidget()) {\n return;\n }\n const colorScheme = getColorScheme();\n\n // Note how we wrap an extra layer of div here, because on cleanup we can just remove this extra layer of div.\n // container-container\n // container <-- can just remove this on cleanup\n // widget\n const widgetContainer = document.createElement(\"div\");\n this.widgetContainer = widgetContainer;\n this.widgetTarget.appendChild(widgetContainer);\n const widgetID = window.turnstile.render(widgetContainer, {\n sitekey: this.siteKeyValue,\n theme: parseTheme(colorScheme),\n language: this.langValue,\n callback: (token: string) => {\n dispatchBotProtectionEventVerified(token);\n },\n \"error-callback\": (errCode: string) => {\n const {\n error: parsedError,\n shouldRetry,\n shouldDisplayErrMsg,\n } = parseCloudflareTurnstileErrorCode(errCode);\n console.error(\n `Cloudflare Turnstile failed with error code \"${errCode}\". Authgear parsed it as \"${parsedError}\".`\n );\n dispatchBotProtectionEventFailed(errCode);\n\n if (shouldRetry) {\n this.resetWidget();\n }\n if (shouldDisplayErrMsg) {\n setErrorMessage(CLOUDFLARE_TURNSTILE_ERROR_MSG_ID);\n }\n return true; // return non-falsy value to tell cloudflare we handled error already\n },\n \"expired-callback\": (token: string) => {\n dispatchBotProtectionEventExpired(token);\n },\n \"timeout-callback\": () => {\n // reset the widget to allow a visitor to solve the challenge again\n this.resetWidget();\n },\n \"response-field\": false,\n\n // below are default values, added for clarity\n size: \"normal\",\n appearance: \"always\",\n action: undefined, // no need differentiate widgets under same site key\n cData: undefined, // no need customer data, already available server-side\n \"before-interactive-callback\": undefined, // we do not track interactive callback\n \"after-interactive-callback\": undefined, // we do not track interactive callback\n \"unsupported-callback\": undefined, // we handled unsupported browser in error-callback by code 110500\n tabindex: 0, // a11y\n retry: \"auto\", // automatically retry to obtain a token on unsuccessful attempts\n \"retry-interval\": 8000, // default\n \"refresh-expired\": \"auto\", // automatically refresh expired token\n \"refresh-timeout\": \"auto\", // automatically refreshes upon encountering an interactive timeout\n\n // below fields are not available in @types/cloudflare-turnstile package yet, submitting a PR for it ref https://github.com/DefinitelyTyped/DefinitelyTyped/pull/70139\n // execution: \"render\", // render is default, challenge runs automatically after calling the render() function.\n });\n this.widgetID = widgetID ?? undefined;\n };\n\n undoRenderWidget = () => {\n if (this.widgetID != null) {\n window.turnstile.remove(this.widgetID);\n }\n this.widgetID = undefined;\n\n if (this.widgetContainer != null) {\n this.widgetTarget.removeChild(this.widgetContainer);\n }\n this.widgetContainer = undefined;\n };\n\n connect() {\n window.turnstile.ready(() => {\n this.isReadyForRendering = true;\n // Use setTimeout to prevent isReadyForRendering not changed to True yet\n setTimeout(() => dispatchBotProtectionWidgetEventReadyForRender(), 0);\n });\n document.addEventListener(\n \"bot-protection-widget:render\",\n this.renderWidget\n );\n document.addEventListener(\n \"bot-protection-widget:undo-render\",\n this.undoRenderWidget\n );\n }\n\n disconnect() {\n document.removeEventListener(\n \"bot-protection-widget:render\",\n this.renderWidget\n );\n document.removeEventListener(\n \"bot-protection-widget:undo-render\",\n this.undoRenderWidget\n );\n this.undoRenderWidget();\n }\n}\n","/* global ReCaptchaV2 */\nimport { Controller } from \"@hotwired/stimulus\";\nimport { getColorScheme } from \"../../getColorScheme\";\nimport {\n dispatchBotProtectionEventExpired,\n dispatchBotProtectionEventFailed,\n dispatchBotProtectionEventVerified,\n} from \"./botProtection\";\nimport { setErrorMessage } from \"../alert-message\";\nimport { dispatchBotProtectionWidgetEventReadyForRender } from \"./botProtectionWidget\";\n\nfunction parseTheme(theme: string): ReCaptchaV2.Theme | undefined {\n switch (theme) {\n case \"light\":\n return \"light\";\n case \"dark\":\n return \"dark\";\n default:\n return undefined;\n }\n}\n\nconst RECAPTCHA_V2_ERROR_MSG_ID = \"data-bot-protection-recaptcha-v2\";\n\nexport class RecaptchaV2Controller extends Controller {\n static values = {\n siteKey: { type: String },\n };\n\n static targets = [\"widget\"];\n\n declare siteKeyValue: string;\n declare widgetTarget: HTMLDivElement;\n declare widgetContainer: HTMLDivElement | undefined;\n declare widgetID: number | undefined;\n declare isReadyForRendering: boolean;\n\n hasExistingWidget = () => {\n return this.widgetContainer != null && this.widgetID != null;\n };\n resetWidget = () => {\n if (!this.hasExistingWidget()) {\n return;\n }\n window.grecaptcha.reset(this.widgetID); // default to first widget created\n };\n\n renderWidget = () => {\n if (!this.isReadyForRendering) {\n throw new Error(\"recaptchav2 target is not ready for rendering\");\n }\n\n if (this.hasExistingWidget()) {\n return;\n }\n const colorScheme = getColorScheme();\n\n // Note how we wrap an extra layer of div here, because on cleanup we can just remove this extra layer of div.\n // container-container\n // container <-- can just remove this on cleanup\n // widget\n const widgetContainer = document.createElement(\"div\");\n this.widgetContainer = widgetContainer;\n this.widgetTarget.appendChild(widgetContainer);\n const widgetID = window.grecaptcha.render(widgetContainer, {\n sitekey: this.siteKeyValue,\n theme: parseTheme(colorScheme),\n callback: (token: string) => {\n dispatchBotProtectionEventVerified(token);\n },\n \"error-callback\": () => {\n // Tested, error-callback does not have error message/error code as params\n // Will simply fire failed event, instead of graceful handling in cloudflare\n console.error(\n \"Something went wrong with Google RecaptchaV2. Please check widget for error hint.\"\n );\n setErrorMessage(RECAPTCHA_V2_ERROR_MSG_ID);\n dispatchBotProtectionEventFailed();\n },\n \"expired-callback\": () => {\n this.resetWidget();\n dispatchBotProtectionEventExpired();\n },\n\n // below are default values, added for clarity\n size: \"normal\",\n tabindex: 0,\n type: \"image\",\n badge: \"bottomright\",\n });\n this.widgetID = widgetID;\n };\n\n undoRenderWidget = () => {\n this.widgetID = undefined;\n if (this.widgetContainer != null) {\n this.widgetTarget.removeChild(this.widgetContainer);\n }\n this.widgetContainer = undefined;\n };\n\n connect() {\n window.grecaptcha.ready(() => {\n this.isReadyForRendering = true;\n // Use setTimeout to prevent isReadyForRendering not changed to True yet\n setTimeout(() => dispatchBotProtectionWidgetEventReadyForRender(), 0);\n });\n document.addEventListener(\n \"bot-protection-widget:render\",\n this.renderWidget\n );\n document.addEventListener(\n \"bot-protection-widget:undo-render\",\n this.undoRenderWidget\n );\n }\n\n disconnect() {\n document.removeEventListener(\n \"bot-protection-widget:render\",\n this.renderWidget\n );\n document.removeEventListener(\n \"bot-protection-widget:undo-render\",\n this.undoRenderWidget\n );\n this.undoRenderWidget();\n }\n}\n","import { Controller } from \"@hotwired/stimulus\";\n\n/**\n * Controller for bot protection input\n * - listen to captcha widget provider events\n * - update form inputs for submission\n *\n * Expected usage:\n * - Add `data-controller=\"bot-protection-token-input\"` to an `` element inside `` that requires bot protection verification\n */\nexport class BotProtectionTokenInputController extends Controller {\n getInputElement = (): HTMLInputElement => {\n if (!(this.element instanceof HTMLInputElement)) {\n throw new Error(\n \"bot-protection-token-input must be used on `` elements\"\n );\n }\n return this.element;\n };\n onVerifySuccess = (e: Event) => {\n if (!(e instanceof CustomEvent)) {\n throw new Error(\"Unexpected non-CustomEvent\");\n }\n this.getInputElement().value = e.detail.token;\n };\n\n onVerifyFailed = () => {\n this.getInputElement().value = \"\";\n };\n\n onVerifyExpired = () => {\n this.getInputElement().value = \"\";\n };\n\n connect() {\n document.addEventListener(\n \"bot-protection:verify-success\",\n this.onVerifySuccess\n );\n document.addEventListener(\n \"bot-protection:verify-failed\",\n this.onVerifyFailed\n );\n document.addEventListener(\n \"bot-protection:verify-expired\",\n this.onVerifyExpired\n );\n }\n\n disconnect() {\n document.removeEventListener(\n \"bot-protection:verify-success\",\n this.onVerifySuccess\n );\n document.removeEventListener(\n \"bot-protection:verify-failed\",\n this.onVerifyFailed\n );\n document.removeEventListener(\n \"bot-protection:verify-expired\",\n this.onVerifyExpired\n );\n }\n}\n","import { Controller } from \"@hotwired/stimulus\";\n\n/**\n * Controller for button that should be clicked on bot protection verification success\n * - listen to captcha widget provider events\n * - click target button\n *\n * Expected usage:\n * - Add `data-controller=\"bot-protection-standalone-page-submit-btn\"` to a `