@dropins/tools 1.3.1-alpha013 → 1.3.1-alpha014

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/chunks/Image.js +1 -1
  2. package/chunks/icons/Add.js +1 -1
  3. package/chunks/initializer.js +2 -2
  4. package/components.js +1 -1
  5. package/components.js.map +1 -1
  6. package/initializer.js +2 -2
  7. package/lib/aem/assets.js +1 -1
  8. package/lib/aem/assets.js.map +1 -1
  9. package/lib/aem/assets.test.d.ts +1 -0
  10. package/lib/aem/assets.test.js +4 -0
  11. package/lib/aem/assets.test.js.map +1 -0
  12. package/lib/aem/configs.js +1 -1
  13. package/lib/aem/configs.test.d.ts +1 -0
  14. package/lib/aem/configs.test.js +4 -0
  15. package/lib/aem/configs.test.js.map +1 -0
  16. package/package.json +1 -1
  17. package/preact-compat.js +1 -1
  18. package/preact-hooks.js +1 -1
  19. package/recaptcha.js +2 -2
  20. package/recaptcha.js.map +1 -1
  21. package/types/elsie/src/components/Icon/Icon.d.ts +2 -2
  22. package/types/elsie/src/lib/aem/assets.d.ts +30 -77
  23. package/types/fetch-graphql/src/index.d.ts +166 -0
  24. package/types/recaptcha/src/configs/index.d.ts +12 -0
  25. package/types/recaptcha/src/configs/message.config.d.ts +16 -0
  26. package/types/recaptcha/src/configs/recaptchaBadgeSelector.config.d.ts +10 -0
  27. package/types/recaptcha/src/configs/typeForms.config.d.ts +10 -0
  28. package/types/recaptcha/src/graphql/recaptchaConfig.graphql.d.ts +10 -0
  29. package/types/recaptcha/src/index.d.ts +44 -0
  30. package/types/recaptcha/src/lib/_checkRecaptchaBadge.d.ts +10 -0
  31. package/types/recaptcha/src/lib/_convertKeysToCamelCase.d.ts +14 -0
  32. package/types/recaptcha/src/lib/_extendConfig.d.ts +4 -0
  33. package/types/recaptcha/src/lib/_storageConfig.d.ts +6 -0
  34. package/types/recaptcha/src/lib/index.d.ts +13 -0
  35. package/types/recaptcha/src/services/recaptcha.service.d.ts +6 -0
package/preact-compat.js CHANGED
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2025 Adobe
2
2
  All Rights Reserved. */
3
- import{N as a,b as t,k as n,C as r,e as u,L as o,U as d,o as l,f as c,G as i,_ as m,i as f,j as E,m as _,R as S,n as p,r as C,s as R,u as y,v as I,w as L,z as N,I as O,F as T,J as b,K as h,M as x,O as D,Q as F,q as M,x as g,P as U,V,y as v,c as A,g as P,d as k,W as w,a as z,T as B,p as W,A as Y,h as j,X as q,Y as G,Z as H}from"./chunks/icons/Add.js";export{a as Children,t as Component,n as Fragment,r as PureComponent,u as StrictMode,o as Suspense,d as SuspenseList,l as __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,c as cloneElement,i as createContext,m as createElement,f as createFactory,E as createPortal,_ as createRef,S as default,p as findDOMNode,C as flushSync,R as forwardRef,y as hydrate,I as isElement,L as isFragment,N as isMemo,O as isValidElement,T as lazy,b as memo,h as render,x as startTransition,D as unmountComponentAtNode,F as unstable_batchedUpdates,M as useCallback,g as useContext,U as useDebugValue,V as useDeferredValue,v as useEffect,A as useErrorBoundary,P as useId,k as useImperativeHandle,w as useInsertionEffect,z as useLayoutEffect,B as useMemo,W as useReducer,Y as useRef,j as useState,q as useSyncExternalStore,G as useTransition,H as version};
3
+ import{N as a,b as t,k as n,C as r,e as u,L as o,U as d,o as l,f as c,G as i,_ as m,i as f,j as E,m as _,R as S,n as p,r as C,s as R,u as y,v as I,w as L,z as N,I as O,F as T,J as b,K as h,M as x,O as D,Q as F,q as M,x as g,P as U,V,y as v,a as A,g as P,c as k,W as w,d as z,T as B,p as W,A as Y,h as j,X as q,Y as G,Z as H}from"./chunks/icons/Add.js";export{a as Children,t as Component,n as Fragment,r as PureComponent,u as StrictMode,o as Suspense,d as SuspenseList,l as __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,c as cloneElement,i as createContext,m as createElement,f as createFactory,E as createPortal,_ as createRef,S as default,p as findDOMNode,C as flushSync,R as forwardRef,y as hydrate,I as isElement,L as isFragment,N as isMemo,O as isValidElement,T as lazy,b as memo,h as render,x as startTransition,D as unmountComponentAtNode,F as unstable_batchedUpdates,M as useCallback,g as useContext,U as useDebugValue,V as useDeferredValue,v as useEffect,A as useErrorBoundary,P as useId,k as useImperativeHandle,w as useInsertionEffect,z as useLayoutEffect,B as useMemo,W as useReducer,Y as useRef,j as useState,q as useSyncExternalStore,G as useTransition,H as version};
4
4
  //# sourceMappingURL=preact-compat.js.map
package/preact-hooks.js CHANGED
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2025 Adobe
2
2
  All Rights Reserved. */
3
- import{q as a,x as u,P as t,y as r,c as o,g as f,d as c,a as d,T as l,p as m,A as n,h as p}from"./chunks/icons/Add.js";export{a as useCallback,u as useContext,t as useDebugValue,r as useEffect,o as useErrorBoundary,f as useId,c as useImperativeHandle,d as useLayoutEffect,l as useMemo,m as useReducer,n as useRef,p as useState};
3
+ import{q as a,x as u,P as t,y as r,a as o,g as f,c,d,T as l,p as m,A as n,h as p}from"./chunks/icons/Add.js";export{a as useCallback,u as useContext,t as useDebugValue,r as useEffect,o as useErrorBoundary,f as useId,c as useImperativeHandle,d as useLayoutEffect,l as useMemo,m as useReducer,n as useRef,p as useState};
4
4
  //# sourceMappingURL=preact-hooks.js.map
package/recaptcha.js CHANGED
@@ -1,6 +1,6 @@
1
1
  /*! Copyright 2025 Adobe
2
2
  All Rights Reserved. */
3
- const n={failedFetch:"Failed to fetch config from backend with status:",failedSetStorageConfig:"Failed to set storage config",failedGetStorageConfig:"Configuration could not be loaded.",failedExecutionRecaptcha:"Recaptcha execution failed",failedInitializing:"An error occurred while initializing ReCaptcha:"},S={PLACE_ORDER:"placeOrder",CONTACT:"contactUs",CUSTOMER_LOGIN:"generateCustomerToken",CUSTOMER_FORGOT_PASSWORD:"requestPasswordResetEmail",CUSTOMER_CREATE:"createCustomerV2",CUSTOMER_EDIT:"updateCustomerV2",NEWSLETTER:"subscribeEmailToNewsletter",PRODUCT_REVIEW:"createProductReview",SENDFRIEND:"SENDFRIEND",BRAINTREE:"BRAINTREE"},m=".grecaptcha-badge iframe",H=(i,e)=>{if(i&&i.forms){const t=i.forms.concat(e).map(r=>typeof r!="string"?{...r,enabledBadgePlace:!1}:{badgeId:S[r],enabledBadgePlace:!1});return{...i,forms:[...new Set(t)]}}},b=async(i,e=1,t=1e3)=>{const r=sessionStorage.getItem(i);return r!==null?JSON.parse(r):e>0?(await new Promise(a=>setTimeout(a,t)),b(i,e-1,t)):null},G=(i,e,t)=>{if(!i||!e.websiteKey)return null;try{sessionStorage.setItem(i,JSON.stringify(e))}catch(r){return t&&console.error(n.failedSetStorageConfig,r),null}},R=i=>new Promise((e,t)=>{try{if(document.querySelector(i)){e();return}const r=new MutationObserver(()=>{document.querySelector(i)&&(e(),r.disconnect())});r.observe(document.body,{childList:!0,subtree:!1})}catch(r){t(r)}}),Q=async()=>{try{return await R(m),!0}catch{return!1}},P=i=>{const e=t=>t.replace(/_([a-z])/g,(r,a)=>a.toUpperCase());return Object.keys(i).reduce((t,r)=>{const a=e(r);return t[a]=i[r],t},{})},{failedExecutionRecaptcha:u}=n,T=async i=>{if(!window.grecaptcha)return Promise.reject(u);try{return await window.grecaptcha.execute(i,{action:"click"})}catch(e){return Promise.reject(`${u} : ${e}`)}},v=()=>new Promise(i=>{const e=new MutationObserver((r,a)=>{window.grecaptcha&&(a.disconnect(),i(!0))}),t={childList:!0,subtree:!0,attributes:!0};e.observe(document.body,t)}),F=async(i,e,t)=>(window.grecaptcha||await v(),grecaptcha.ready(()=>{const r=document.querySelectorAll(`#${i}`);r.length&&(r.forEach(a=>a.id=`${a.id}_${Math.random().toString(36)}`),r.forEach(a=>{if(a.innerHTML==="")try{grecaptcha.render(a.id,{sitekey:e.websiteKey,badge:e.badgePosition,size:"invisible",theme:e.theme??"light"})}catch(s){t&&console.error(s)}}))})),k=`query {
3
+ import{FetchGraphQL as l}from"./fetch-graphql.js";const n={failedFetch:"Failed to fetch config from backend with status:",failedSetStorageConfig:"Failed to set storage config",failedGetStorageConfig:"Configuration could not be loaded.",failedExecutionRecaptcha:"Recaptcha execution failed",failedInitializing:"An error occurred while initializing ReCaptcha:"},u={PLACE_ORDER:"placeOrder",CONTACT:"contactUs",CUSTOMER_LOGIN:"generateCustomerToken",CUSTOMER_FORGOT_PASSWORD:"requestPasswordResetEmail",CUSTOMER_CREATE:"createCustomerV2",CUSTOMER_EDIT:"updateCustomerV2",NEWSLETTER:"subscribeEmailToNewsletter",PRODUCT_REVIEW:"createProductReview",SENDFRIEND:"SENDFRIEND",BRAINTREE:"BRAINTREE"},h=".grecaptcha-badge iframe",f=(o,e)=>{if(o&&o.forms){const t=o.forms.concat(e).map(a=>typeof a!="string"?{...a,enabledBadgePlace:!1}:{badgeId:u[a],enabledBadgePlace:!1});return{...o,forms:[...new Set(t)]}}},g=async(o,e=1,t=1e3)=>{const a=sessionStorage.getItem(o);return a!==null?JSON.parse(a):e>0?(await new Promise(r=>setTimeout(r,t)),g(o,e-1,t)):null},p=(o,e,t)=>{if(!o||!e.websiteKey)return null;try{sessionStorage.setItem(o,JSON.stringify(e))}catch(a){return t&&console.error(n.failedSetStorageConfig,a),null}},C=o=>new Promise((e,t)=>{try{if(document.querySelector(o)){e();return}const a=new MutationObserver(()=>{document.querySelector(o)&&(e(),a.disconnect())});a.observe(document.body,{childList:!0,subtree:!1})}catch(a){t(a)}}),m=async()=>{try{return await C(h),!0}catch{return!1}},b=o=>{const e=t=>t.replace(/_([a-z])/g,(a,r)=>r.toUpperCase());return Object.keys(o).reduce((t,a)=>{const r=e(a);return t[r]=o[a],t},{})},{failedExecutionRecaptcha:d}=n,y=async o=>{if(!window.grecaptcha)return Promise.reject(d);try{return await window.grecaptcha.execute(o,{action:"click"})}catch(e){return Promise.reject(`${d} : ${e}`)}},_=()=>new Promise(o=>{const e=new MutationObserver((a,r)=>{window.grecaptcha&&(r.disconnect(),o(!0))}),t={childList:!0,subtree:!0,attributes:!0};e.observe(document.body,t)}),w=async(o,e,t)=>(window.grecaptcha||await _(),grecaptcha.ready(()=>{const a=document.querySelectorAll(`#${o}`);a.length&&(a.forEach(r=>r.id=`${r.id}_${Math.random().toString(36)}`),a.forEach(r=>{if(r.innerHTML==="")try{grecaptcha.render(r.id,{sitekey:e.websiteKey,badge:e.badgePosition,size:"invisible",theme:e.theme??"light"})}catch(i){t&&console.error(i)}}))})),S=`query {
4
4
  recaptchaV3Config {
5
5
  is_enabled
6
6
  website_key
@@ -11,5 +11,5 @@ const n={failedFetch:"Failed to fetch config from backend with status:",failedSe
11
11
  forms
12
12
  theme
13
13
  }
14
- }`,A={"Content-Type":"application/json",Accept:"application/json"};class _{constructor(){this._fetchGraphQlHeaders={},this._beforeHooks=[],this._afterHooks=[]}get endpoint(){return this._endpoint}get fetchGraphQlHeaders(){return this._fetchGraphQlHeaders}setEndpoint(e){this._endpoint=e}setFetchGraphQlHeader(e,t){this._fetchGraphQlHeaders={...this.fetchGraphQlHeaders,[e]:t}}removeFetchGraphQlHeader(e){delete this._fetchGraphQlHeaders[e]}setFetchGraphQlHeaders(e){typeof e=="function"?this._fetchGraphQlHeaders={...this._fetchGraphQlHeaders,...e(this._fetchGraphQlHeaders)}:this._fetchGraphQlHeaders={...e}}addBeforeHook(e){this._beforeHooks.push(e)}addAfterHook(e){this._afterHooks.push(e)}async fetchGraphQl(e,t){const r=this.endpoint,a=this.fetchGraphQlHeaders;if(!r)throw Error('Missing "url"');const s=(t==null?void 0:t.method)??"POST",o=t==null?void 0:t.cache,C=t==null?void 0:t.signal;let p;const h=new URL(r),w={...A,...a};s==="POST"&&(p=JSON.stringify({query:e,variables:t==null?void 0:t.variables})),s==="GET"&&(h.searchParams.append("query",I(e)),t!=null&&t.variables&&h.searchParams.append("variables",JSON.stringify(t.variables)));let c={method:s,headers:w,body:p,cache:o,signal:C};return c=await this._beforeHooks.reduce(async(d,l)=>l(await d),Promise.resolve(c)),await fetch(h,c).then(d=>d.json().then(l=>this._afterHooks.reduce(async(y,E)=>E(c,await y),Promise.resolve(l))))}getConfig(){return{endpoint:this.endpoint,fetchGraphQlHeaders:this.fetchGraphQlHeaders}}getMethods(){return{setEndpoint:this.setEndpoint.bind(this),setFetchGraphQlHeader:this.setFetchGraphQlHeader.bind(this),removeFetchGraphQlHeader:this.removeFetchGraphQlHeader.bind(this),setFetchGraphQlHeaders:this.setFetchGraphQlHeaders.bind(this),fetchGraphQl:this.fetchGraphQl.bind(this),getConfig:this.getConfig.bind(this),addBeforeHook:this.addBeforeHook.bind(this),addAfterHook:this.addAfterHook.bind(this)}}}const f=new _;class O extends _{get endpoint(){return this._endpoint??f.endpoint}get fetchGraphQlHeaders(){return this._endpoint?this._fetchGraphQlHeaders:{...this._fetchGraphQlHeaders,...f.fetchGraphQlHeaders}}}function I(i){return i=i.replace(/#.*/g,""),i=i.replace(/\s+/g," "),i.trim()}const{setEndpoint:L,setFetchGraphQlHeaders:N,setFetchGraphQlHeader:$,removeFetchGraphQlHeader:U,fetchGraphQl:K,getConfig:D,addBeforeHook:x,addAfterHook:V}=f.getMethods(),g=new O().getMethods();class B{constructor(){var e;this._enableReCAPTCHA=!1,this._recaptchaBackendEndpoint=((e=g.getConfig())==null?void 0:e.endpoint)||"",this._recaptchaScriptUrl="https://www.google.com/recaptcha/api.js",this._configStorageKey="recaptchaConfig",this._logger=!1}async _updateBadgePosition(e,t){if(t)if((t==null?void 0:t.badgePosition)==="inline")await F(e,t,this._logger);else{if(!await Q())return;const a=document.querySelector(m);t.theme&&a&&!a.src.includes("theme=dark")&&!a.src.includes("theme=light")&&a.setAttribute("src",`${a.src}&theme=${t.theme}`)}}async _addRecaptchaScript(){const e=await this._loadConfig();if(!document.getElementById("recaptchaId")&&e){const t=e.websiteKey,r=e.badgePosition==="inline",a=e.languageCode;if(!t)return;const s=document.createElement("script");s.setAttribute("id","recaptchaId"),s.defer=!0,s.src=r?`${this._recaptchaScriptUrl}?render=${t}&badge=none&hl=${a}`:`${this._recaptchaScriptUrl}?render=${t}&badge=${e.badgePosition}&hl=${a}`,document.head.appendChild(s)}}async _fetchStoreConfig(){var e;try{const t=await g.fetchGraphQl(k,{method:"GET",cache:"force-cache"});if((e=t==null?void 0:t.errors)!=null&&e.length){this._logger&&console.error(t.errors[0].message);return}return t}catch(t){this._logger&&console.error(`${n.failedFetch}:`,t)}}async _loadConfig(){const e=await b(this._configStorageKey);return e?(this._enableReCAPTCHA=!!e.isEnabled,e):(this._logger&&console.error(n.failedGetStorageConfig),null)}setEndpoint(e){e&&(this._recaptchaBackendEndpoint=e,g.setEndpoint(e))}async setConfig(e){var t,r;try{const a=await this._fetchStoreConfig();if(!((t=a==null?void 0:a.data)!=null&&t.recaptchaV3Config)){sessionStorage.removeItem(this._configStorageKey);return}const s=P((r=a==null?void 0:a.data)==null?void 0:r.recaptchaV3Config),o=H(s,e);o&&G(this._configStorageKey,o,this._logger)}catch(a){this._logger&&console.error(n.failedSetStorageConfig,a),sessionStorage.removeItem(this._configStorageKey)}}async initReCaptcha(e=3e3){setTimeout(()=>{(async()=>{try{const t=await this._loadConfig();if(!(t!=null&&t.forms)||!t.isEnabled)return;await this._addRecaptchaScript(),t.badgePosition==="inline"?await Promise.all(t.forms.map(r=>this._updateBadgePosition(r.badgeId,t))):await this._updateBadgePosition("",t)}catch(t){this._logger&&console.error(n.failedInitializing,t)}})()},e)}async verifyReCaptcha(){try{const e=await this._loadConfig();return!(e!=null&&e.forms)||!e.websiteKey||!e.isEnabled?void 0:await T(e.websiteKey)}catch(e){this._logger&&console.error(e)}}enableLogger(e){this._logger=e}getMethods(){return{enableLogger:this.enableLogger.bind(this),setEndpoint:this.setEndpoint.bind(this),setConfig:this.setConfig.bind(this),initReCaptcha:this.initReCaptcha.bind(this),verifyReCaptcha:this.verifyReCaptcha.bind(this)}}}const M=new B,{initReCaptcha:j,verifyReCaptcha:z,setEndpoint:J,setConfig:q,enableLogger:W}=M.getMethods();export{B as RecaptchaModule,W as enableLogger,j as initReCaptcha,g as recaptchaFetchApi,q as setConfig,J as setEndpoint,z as verifyReCaptcha};
14
+ }`,c=new l().getMethods();class R{constructor(){var e;this._enableReCAPTCHA=!1,this._recaptchaBackendEndpoint=((e=c.getConfig())==null?void 0:e.endpoint)||"",this._recaptchaScriptUrl="https://www.google.com/recaptcha/api.js",this._configStorageKey="recaptchaConfig",this._logger=!1}async _updateBadgePosition(e,t){if(t)if((t==null?void 0:t.badgePosition)==="inline")await w(e,t,this._logger);else{if(!await m())return;const r=document.querySelector(h);t.theme&&r&&!r.src.includes("theme=dark")&&!r.src.includes("theme=light")&&r.setAttribute("src",`${r.src}&theme=${t.theme}`)}}async _addRecaptchaScript(){const e=await this._loadConfig();if(!document.getElementById("recaptchaId")&&e){const t=e.websiteKey,a=e.badgePosition==="inline",r=e.languageCode;if(!t)return;const i=document.createElement("script");i.setAttribute("id","recaptchaId"),i.defer=!0,i.src=a?`${this._recaptchaScriptUrl}?render=${t}&badge=none&hl=${r}`:`${this._recaptchaScriptUrl}?render=${t}&badge=${e.badgePosition}&hl=${r}`,document.head.appendChild(i)}}async _fetchStoreConfig(){var e;try{const t=await c.fetchGraphQl(S,{method:"GET",cache:"force-cache"});if((e=t==null?void 0:t.errors)!=null&&e.length){this._logger&&console.error(t.errors[0].message);return}return t}catch(t){this._logger&&console.error(`${n.failedFetch}:`,t)}}async _loadConfig(){const e=await g(this._configStorageKey);return e?(this._enableReCAPTCHA=!!e.isEnabled,e):(this._logger&&console.error(n.failedGetStorageConfig),null)}setEndpoint(e){e&&(this._recaptchaBackendEndpoint=e,c.setEndpoint(e))}async setConfig(e){var t,a;try{const r=await this._fetchStoreConfig();if(!((t=r==null?void 0:r.data)!=null&&t.recaptchaV3Config)){sessionStorage.removeItem(this._configStorageKey);return}const i=b((a=r==null?void 0:r.data)==null?void 0:a.recaptchaV3Config),s=f(i,e);s&&p(this._configStorageKey,s,this._logger)}catch(r){this._logger&&console.error(n.failedSetStorageConfig,r),sessionStorage.removeItem(this._configStorageKey)}}async initReCaptcha(e=3e3){setTimeout(()=>{(async()=>{try{const t=await this._loadConfig();if(!(t!=null&&t.forms)||!t.isEnabled)return;await this._addRecaptchaScript(),t.badgePosition==="inline"?await Promise.all(t.forms.map(a=>this._updateBadgePosition(a.badgeId,t))):await this._updateBadgePosition("",t)}catch(t){this._logger&&console.error(n.failedInitializing,t)}})()},e)}async verifyReCaptcha(){try{const e=await this._loadConfig();return!(e!=null&&e.forms)||!e.websiteKey||!e.isEnabled?void 0:await y(e.websiteKey)}catch(e){this._logger&&console.error(e)}}enableLogger(e){this._logger=e}getMethods(){return{enableLogger:this.enableLogger.bind(this),setEndpoint:this.setEndpoint.bind(this),setConfig:this.setConfig.bind(this),initReCaptcha:this.initReCaptcha.bind(this),verifyReCaptcha:this.verifyReCaptcha.bind(this)}}}const E=new R,{initReCaptcha:P,verifyReCaptcha:I,setEndpoint:O,setConfig:A,enableLogger:v}=E.getMethods();export{R as RecaptchaModule,v as enableLogger,P as initReCaptcha,c as recaptchaFetchApi,A as setConfig,O as setEndpoint,I as verifyReCaptcha};
15
15
  //# sourceMappingURL=recaptcha.js.map
package/recaptcha.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"recaptcha.js","sources":["@dropins/tools/src/recaptcha/configs/message.config.ts","@dropins/tools/src/recaptcha/configs/typeForms.config.ts","@dropins/tools/src/recaptcha/configs/recaptchaBadgeSelector.config.ts","@dropins/tools/src/recaptcha/lib/_extendConfig.ts","@dropins/tools/src/recaptcha/lib/_storageConfig.ts","@dropins/tools/src/recaptcha/lib/_checkRecaptchaBadge.ts","@dropins/tools/src/recaptcha/lib/_convertKeysToCamelCase.ts","@dropins/tools/src/recaptcha/services/recaptcha.service.ts","@dropins/tools/src/recaptcha/graphql/recaptchaConfig.graphql.ts","@dropins/tools/src/fetch-graphql/index.ts","@dropins/tools/src/recaptcha/index.ts"],"sourcesContent":["/********************************************************************\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nexport const recaptchaMessage = {\n failedFetch: 'Failed to fetch config from backend with status:',\n failedSetStorageConfig: 'Failed to set storage config',\n failedGetStorageConfig: 'Configuration could not be loaded.',\n failedExecutionRecaptcha: 'Recaptcha execution failed',\n failedInitializing: 'An error occurred while initializing ReCaptcha:',\n};\n","/********************************************************************\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nexport const typeDefaultForm: Record<string, string> = {\n PLACE_ORDER: 'placeOrder',\n CONTACT: 'contactUs',\n CUSTOMER_LOGIN: 'generateCustomerToken',\n CUSTOMER_FORGOT_PASSWORD: 'requestPasswordResetEmail',\n CUSTOMER_CREATE: 'createCustomerV2',\n CUSTOMER_EDIT: 'updateCustomerV2',\n NEWSLETTER: 'subscribeEmailToNewsletter',\n PRODUCT_REVIEW: 'createProductReview',\n SENDFRIEND: 'SENDFRIEND',\n BRAINTREE: 'BRAINTREE',\n};\n","/********************************************************************\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nexport const recaptchaBadgeSelector = '.grecaptcha-badge iframe';","/********************************************************************\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { ReCaptchaV3Model } from '../types/recaptcha.types';\nimport { typeDefaultForm } from '../configs/typeForms.config';\n\nexport const extendConfig = (\n config: ReCaptchaV3Model,\n modifyParams: any[]\n): ReCaptchaV3Model | undefined => {\n if (config && config.forms) {\n const modifyForm = config.forms.concat(modifyParams).map((el) => {\n if (typeof el !== 'string') return { ...el, enabledBadgePlace: false };\n\n return {\n badgeId: typeDefaultForm[el],\n enabledBadgePlace: false,\n };\n });\n\n return { ...config, forms: [...new Set(modifyForm)] };\n }\n};\n","/********************************************************************\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { recaptchaMessage } from '../configs';\nimport { ReCaptchaV3Model } from '../types/recaptcha.types';\n\nconst getConfigStorage = async (\n storageKey: string,\n retries = 1,\n delay = 1000\n): Promise<ReCaptchaV3Model | null> => {\n const storedConfig = sessionStorage.getItem(storageKey);\n\n if (storedConfig !== null) {\n return JSON.parse(storedConfig);\n } else if (retries > 0) {\n await new Promise((resolve) => setTimeout(resolve, delay));\n\n return getConfigStorage(storageKey, retries - 1, delay);\n }\n\n return null;\n};\n\nconst setConfigStorage = (\n storageKey: string,\n config: ReCaptchaV3Model,\n logger: boolean\n) => {\n if (!storageKey || !config.websiteKey) return null;\n\n try {\n sessionStorage.setItem(storageKey, JSON.stringify(config));\n } catch (error) {\n logger && console.error(recaptchaMessage.failedSetStorageConfig, error);\n return null;\n }\n};\n\nexport { getConfigStorage, setConfigStorage };\n","/********************************************************************\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { recaptchaBadgeSelector } from '../configs';\n\nconst waitForElement = (selector: string): Promise<void> => {\n return new Promise((resolve, reject) => {\n try {\n // Check if the element is already in the DOM\n if (document.querySelector(selector)) {\n resolve();\n return;\n }\n\n // Create an observer to watch for changes\n const observer = new MutationObserver(() => {\n if (document.querySelector(selector)) {\n resolve();\n observer.disconnect();\n }\n });\n\n // Start observing the body for child changes only\n observer.observe(document.body, {\n childList: true,\n subtree: false,\n });\n } catch (error) {\n reject(error);\n }\n });\n};\n\nexport const checkRecaptchaBadge = async (): Promise<boolean> => {\n try {\n await waitForElement(recaptchaBadgeSelector);\n return true;\n } catch (error) {\n return false;\n }\n};\n","/********************************************************************\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nexport const convertKeysToCamelCase = (obj: {\n [key: string]: any;\n}): { [key: string]: string | number | boolean } => {\n const camelCaseKey = (key: string): string => {\n return key.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\n };\n\n return Object.keys(obj).reduce((result, key) => {\n const newKey = camelCaseKey(key);\n result[newKey] = obj[key];\n return result;\n }, {} as { [key: string]: any });\n};\n","/********************************************************************\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { recaptchaMessage } from '../configs';\nimport {\n MutationObserverInit,\n ReCaptchaV3Model,\n} from '../types/recaptcha.types';\nconst { failedExecutionRecaptcha } = recaptchaMessage;\n\nexport const getRecaptchaToken = async (\n websiteKey: string\n): Promise<string> => {\n if (!(window as any).grecaptcha) {\n return Promise.reject(failedExecutionRecaptcha);\n }\n\n try {\n const token = await window.grecaptcha.execute(websiteKey, {\n action: 'click',\n });\n\n return token;\n } catch (error) {\n return Promise.reject(`${failedExecutionRecaptcha} : ${error}`);\n }\n};\n\nexport const waitForReCaptcha = () => {\n return new Promise((resolve) => {\n const observer = new MutationObserver((_, obs) => {\n if (window.grecaptcha) {\n obs.disconnect();\n resolve(true);\n }\n });\n\n const observerOptions: MutationObserverInit = {\n childList: true,\n subtree: true,\n attributes: true,\n };\n\n observer.observe(document.body, observerOptions);\n });\n};\n\nexport const verifyReCaptchaLoad = async (\n badgeId: string,\n config: ReCaptchaV3Model,\n logger: boolean\n): Promise<void> => {\n if (!window.grecaptcha) {\n await waitForReCaptcha();\n }\n\n return grecaptcha.ready(() => {\n const badgeContainers = document.querySelectorAll(`#${badgeId}`);\n\n if (!badgeContainers.length) return;\n\n // Handle the case when multiple instances of the drop-in container rendered on the same page\n\n badgeContainers.forEach(\n (element) => (element.id = `${element.id}_${Math.random().toString(36)}`) // NOSONAR\n );\n\n badgeContainers.forEach((element) => {\n if (element.innerHTML === '') {\n try {\n grecaptcha.render(element.id, {\n sitekey: config.websiteKey as string,\n badge: config.badgePosition,\n size: 'invisible',\n theme: config.theme ?? 'light',\n });\n } catch (error) {\n logger && console.error(error);\n }\n }\n });\n });\n};\n","/********************************************************************\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nexport const RECAPTCHA_CONFIGURATION_V3 = `query {\n recaptchaV3Config {\n is_enabled\n website_key\n minimum_score\n badge_position\n language_code\n failure_message\n forms\n theme\n } \n}`;\n","/********************************************************************\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nexport type Header = { [key: string]: string | null };\n\nexport type FetchOptions = {\n method?: 'GET' | 'POST';\n variables?: { [key: string]: any };\n signal?: AbortSignal;\n cache?:\n | 'default'\n | 'no-store'\n | 'reload'\n | 'no-cache'\n | 'force-cache'\n | 'only-if-cached';\n};\n\nexport type FetchQueryError = Array<{\n message: string;\n extensions: { category: string };\n}>;\n\nexport type BeforeHook = (requestInit: RequestInit) => RequestInit;\nexport type AfterHook<T = any> = (\n requestInit: RequestInit,\n response: { errors?: FetchQueryError; data: T }\n) => { errors?: FetchQueryError; data: T };\n\nconst defaultHeaders = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n};\n\nclass FetchGraphQLMesh {\n public _endpoint?: string;\n\n get endpoint() {\n return this._endpoint;\n }\n\n get fetchGraphQlHeaders() {\n return this._fetchGraphQlHeaders;\n }\n\n public _fetchGraphQlHeaders: Header = {};\n\n public _beforeHooks: BeforeHook[] = [];\n\n public _afterHooks: AfterHook[] = [];\n\n /**\n * Sets the GraphQL endpoint.\n * @param endpoint - The GraphQL endpoint.\n */\n public setEndpoint(endpoint: string) {\n this._endpoint = endpoint;\n }\n\n /**\n * Sets the GraphQL headers.\n * @param key - The key of the header.\n * @param value - The value of the header.\n */\n public setFetchGraphQlHeader(key: string, value: string | null) {\n this._fetchGraphQlHeaders = {\n ...this.fetchGraphQlHeaders,\n [key]: value,\n };\n }\n /**\n * Removes a specific GraphQL header.\n * @param key - The key of the header.\n */\n public removeFetchGraphQlHeader(key: string) {\n delete this._fetchGraphQlHeaders[key];\n }\n /**\n * Sets the GraphQL headers.\n * @param header - The header object or a function that returns a header object.\n * If a function is provided, it will be called with the previous headers.\n * The returned object will be merged with the previous headers.\n * @example\n * ```js\n * // set headers\n * setFetchGraphQlHeaders({ test: 'test' });\n * \n * // merge with previous headers\n * setFetchGraphQlHeaders((prev) => ({\n * ...prev,\n * test: 'test2',\n * }));\n * ```\n */\n public setFetchGraphQlHeaders(header: Header | ((prev: Header) => Header)) {\n if (typeof header === 'function') {\n this._fetchGraphQlHeaders = {\n ...this._fetchGraphQlHeaders,\n ...header(this._fetchGraphQlHeaders),\n };\n } else {\n this._fetchGraphQlHeaders = { ...header };\n }\n }\n /**\n * Adds a hook executed before the GraphQL call.\n * @param hook - The hook function.\n * @example\n * ```js\n * // add before hook\n * addBeforeHook((requestInit) => console.log('About to execute ' + requestInit.method + ' call.'));\n *\n * // modify the requestInit before executing the request\n * addBeforeHook((requestInit) => {method: requestInit.method, body: 'new body'});\n * ```\n */\n public addBeforeHook(hook: BeforeHook): void {\n this._beforeHooks.push(hook);\n }\n /**\n * Adds a hook executed before the GraphQL call.\n * @param hook - The hook function.\n * @example\n * ```js\n * // add before hook\n * addAfterHook((requestInit, response) => console.log(\n * 'The result of ' + requestInit.method + ' call is ' + response.json().body\n * ));\n *\n * // modify the response\n * addAfterHook((requestInit, response) => new Response(JSON.stringify({ ...response, modified: true }));\n * ```\n */\n public addAfterHook(hook: AfterHook): void {\n this._afterHooks.push(hook);\n }\n /**\n * Fetches GraphQL data.\n * @param query - The GraphQL query.\n * @param options - Optional configuration for the fetch request.\n * @returns\n */\n public async fetchGraphQl<T = any>(\n query: string,\n options?: FetchOptions\n ): Promise<{ errors?: FetchQueryError; data: T }> {\n const endpoint = this.endpoint;\n const fetchGraphQlHeaders = this.fetchGraphQlHeaders;\n\n if (!endpoint) throw Error('Missing \"url\"');\n\n const method = options?.method ?? 'POST';\n const cache = options?.cache;\n const signal = options?.signal;\n\n let body;\n const url = new URL(endpoint);\n const headers = {\n ...defaultHeaders,\n ...fetchGraphQlHeaders,\n };\n\n if (method === 'POST') {\n body = JSON.stringify({\n query,\n variables: options?.variables,\n });\n }\n\n if (method === 'GET') {\n url.searchParams.append('query', minimizeGraphQlQuery(query));\n\n if (options?.variables)\n url.searchParams.append('variables', JSON.stringify(options.variables));\n }\n\n let requestInit: RequestInit = {\n method,\n headers,\n body,\n cache,\n signal,\n };\n\n requestInit = await this._beforeHooks.reduce(\n async (prev, hook) => hook(await prev),\n Promise.resolve(requestInit)\n );\n\n return await fetch(url, requestInit).then((r) => r.json().then(\n (response) => this._afterHooks.reduce(\n async (result, hook) => hook(requestInit, await result),\n Promise.resolve(response)\n )\n ));\n }\n /**\n * Gets the configuration.\n */\n public getConfig() {\n return {\n endpoint: this.endpoint,\n fetchGraphQlHeaders: this.fetchGraphQlHeaders,\n };\n }\n\n public getMethods() {\n return {\n setEndpoint: this.setEndpoint.bind(this),\n setFetchGraphQlHeader: this.setFetchGraphQlHeader.bind(this),\n removeFetchGraphQlHeader: this.removeFetchGraphQlHeader.bind(this),\n setFetchGraphQlHeaders: this.setFetchGraphQlHeaders.bind(this),\n fetchGraphQl: this.fetchGraphQl.bind(this),\n getConfig: this.getConfig.bind(this),\n addBeforeHook: this.addBeforeHook.bind(this),\n addAfterHook: this.addAfterHook.bind(this),\n };\n }\n}\n\nconst mesh = new FetchGraphQLMesh();\n\n/**\n * `FetchGraphQL` is a class that extends `FetchGraphQLMesh`.\n * It provides methods to get the GraphQL endpoint and headers.\n *\n * @class\n *\n */\nexport class FetchGraphQL extends FetchGraphQLMesh {\n get endpoint() {\n return this._endpoint ?? mesh.endpoint;\n }\n\n get fetchGraphQlHeaders() {\n return (\n (this._endpoint\n ? this._fetchGraphQlHeaders\n : { ...this._fetchGraphQlHeaders, ...mesh.fetchGraphQlHeaders })\n );\n }\n}\n\nfunction minimizeGraphQlQuery(query: string) {\n // Remove comments\n query = query.replace(/#.*/g, '');\n\n // Remove extra spaces, tabs, and line breaks\n query = query.replace(/\\s+/g, ' ');\n\n return query.trim();\n}\n/**\n * Exports several methods from the `mesh` object.\n *\n * @property {Function} setEndpoint - Sets the GraphQL endpoint.\n * @property {Function} setFetchGraphQlHeaders - Sets the GraphQL headers.\n * @property {Function} setFetchGraphQlHeader - Sets a specific GraphQL header.\n * @property {Function} removeFetchGraphQlHeader - Removes a specific GraphQL header.\n * @property {Function} fetchGraphQl - Fetches GraphQL data.\n * @property {Function} getConfig - Gets the configuration.\n */\n\n// Global Mesh instance\nexport const {\n setEndpoint,\n setFetchGraphQlHeaders,\n setFetchGraphQlHeader,\n removeFetchGraphQlHeader,\n fetchGraphQl,\n getConfig,\n addBeforeHook,\n addAfterHook,\n} = mesh.getMethods();\n","/********************************************************************\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport {\n ReCaptchaV3Response,\n PropsFormTypes,\n ReCaptchaV3Model,\n} from './types/recaptcha.types';\nimport { recaptchaMessage, recaptchaBadgeSelector } from './configs';\nimport {\n extendConfig,\n setConfigStorage,\n getConfigStorage,\n checkRecaptchaBadge,\n convertKeysToCamelCase,\n} from './lib';\nimport {\n getRecaptchaToken,\n verifyReCaptchaLoad,\n} from './services/recaptcha.service';\nimport { RECAPTCHA_CONFIGURATION_V3 } from './graphql/recaptchaConfig.graphql';\n\nimport { FetchGraphQL } from '@adobe-commerce/fetch-graphql';\n\nexport const recaptchaFetchApi = new FetchGraphQL().getMethods();\n\nexport class RecaptchaModule {\n _enableReCAPTCHA: boolean = false;\n _recaptchaBackendEndpoint: string =\n recaptchaFetchApi.getConfig()?.endpoint || '';\n _recaptchaScriptUrl: string = 'https://www.google.com/recaptcha/api.js';\n _configStorageKey: string = 'recaptchaConfig';\n _logger: boolean = false;\n\n async _updateBadgePosition(\n badgeId: string,\n config: ReCaptchaV3Model\n ): Promise<void | null> {\n if (!config) return;\n\n if (config?.badgePosition === 'inline') {\n await verifyReCaptchaLoad(badgeId, config, this._logger);\n } else {\n const isBadgeLoaded = await checkRecaptchaBadge();\n\n if (!isBadgeLoaded) return;\n\n const recaptchaBadge = document.querySelector(\n recaptchaBadgeSelector\n ) as HTMLIFrameElement;\n\n const shouldUpdateSrc =\n config.theme &&\n recaptchaBadge &&\n !recaptchaBadge.src.includes('theme=dark') &&\n !recaptchaBadge.src.includes('theme=light');\n\n if (shouldUpdateSrc) {\n recaptchaBadge.setAttribute(\n 'src',\n `${recaptchaBadge.src}&theme=${config.theme}`\n );\n }\n }\n }\n\n async _addRecaptchaScript(): Promise<void> {\n const config = await this._loadConfig();\n\n if (!document.getElementById('recaptchaId') && config) {\n const webApiKey = config.websiteKey;\n const isBadgeGlobal = config.badgePosition === 'inline';\n const languageCode = config.languageCode;\n\n if (!webApiKey) return;\n\n const script = document.createElement('script');\n script.setAttribute('id', 'recaptchaId');\n script.defer = true;\n script.src = isBadgeGlobal\n ? `${this._recaptchaScriptUrl}?render=${webApiKey}&badge=none&hl=${languageCode}`\n : `${this._recaptchaScriptUrl}?render=${webApiKey}&badge=${config.badgePosition}&hl=${languageCode}`;\n\n document.head.appendChild(script);\n }\n }\n\n async _fetchStoreConfig(): Promise<ReCaptchaV3Response | undefined> {\n try {\n const response = await recaptchaFetchApi.fetchGraphQl(\n RECAPTCHA_CONFIGURATION_V3,\n {\n method: 'GET',\n cache: 'force-cache',\n }\n );\n\n if (response?.errors?.length) {\n this._logger && console.error(response.errors[0].message);\n\n return;\n }\n\n return response;\n } catch (error) {\n this._logger && console.error(`${recaptchaMessage.failedFetch}:`, error);\n }\n }\n\n async _loadConfig(): Promise<ReCaptchaV3Model | null> {\n const config = await getConfigStorage(this._configStorageKey);\n\n if (!config) {\n this._logger && console.error(recaptchaMessage.failedGetStorageConfig);\n\n return null;\n }\n\n this._enableReCAPTCHA = !!config.isEnabled;\n\n return config;\n }\n\n setEndpoint(url: string) {\n if (!url) return;\n\n this._recaptchaBackendEndpoint = url;\n recaptchaFetchApi.setEndpoint(url);\n }\n\n async setConfig(configList: PropsFormTypes[]) {\n try {\n const config = await this._fetchStoreConfig();\n\n if (!config?.data?.recaptchaV3Config) {\n sessionStorage.removeItem(this._configStorageKey);\n return;\n }\n\n const transformConfig: ReCaptchaV3Model = convertKeysToCamelCase(\n config?.data?.recaptchaV3Config\n );\n\n const extendedRecaptchaConfig = extendConfig(transformConfig, configList);\n\n if (extendedRecaptchaConfig) {\n setConfigStorage(\n this._configStorageKey,\n extendedRecaptchaConfig,\n this._logger\n );\n }\n } catch (error) {\n this._logger &&\n console.error(recaptchaMessage.failedSetStorageConfig, error);\n\n sessionStorage.removeItem(this._configStorageKey);\n }\n }\n\n async initReCaptcha(lazyLoadTimeout = 3000) {\n // IIFE added to fix SonarQube error \"Promise returned in function argument where a void return was expected\"\n setTimeout(() => {\n (async () => {\n try {\n const config = await this._loadConfig();\n\n if (!config?.forms || !config.isEnabled) {\n return;\n }\n\n await this._addRecaptchaScript();\n\n if (config.badgePosition === 'inline') {\n await Promise.all(\n (config.forms as PropsFormTypes[]).map((element) =>\n this._updateBadgePosition(element.badgeId, config)\n )\n );\n } else {\n await this._updateBadgePosition('', config);\n }\n } catch (error) {\n this._logger &&\n console.error(recaptchaMessage.failedInitializing, error);\n }\n })();\n }, lazyLoadTimeout);\n }\n\n async verifyReCaptcha(): Promise<string | undefined> {\n try {\n const config = await this._loadConfig();\n\n if (!config?.forms || !config.websiteKey || !config.isEnabled) {\n return undefined;\n }\n\n return await getRecaptchaToken(config.websiteKey);\n } catch (error) {\n this._logger && console.error(error);\n }\n }\n\n enableLogger(logger: boolean) {\n this._logger = logger;\n }\n\n getMethods() {\n return {\n enableLogger: this.enableLogger.bind(this),\n setEndpoint: this.setEndpoint.bind(this),\n setConfig: this.setConfig.bind(this),\n initReCaptcha: this.initReCaptcha.bind(this),\n verifyReCaptcha: this.verifyReCaptcha.bind(this),\n };\n }\n}\n\nconst recaptcha = new RecaptchaModule();\n\nconst { initReCaptcha, verifyReCaptcha, setEndpoint, setConfig, enableLogger } =\n recaptcha.getMethods();\n\nexport { setEndpoint, setConfig, initReCaptcha, verifyReCaptcha, enableLogger };\n"],"names":["recaptchaMessage","typeDefaultForm","recaptchaBadgeSelector","extendConfig","config","modifyParams","modifyForm","el","getConfigStorage","storageKey","retries","delay","storedConfig","resolve","setConfigStorage","logger","error","waitForElement","selector","reject","observer","checkRecaptchaBadge","convertKeysToCamelCase","obj","camelCaseKey","key","_","letter","result","newKey","failedExecutionRecaptcha","getRecaptchaToken","websiteKey","waitForReCaptcha","obs","observerOptions","verifyReCaptchaLoad","badgeId","badgeContainers","element","RECAPTCHA_CONFIGURATION_V3","defaultHeaders","FetchGraphQLMesh","endpoint","value","header","hook","query","options","fetchGraphQlHeaders","method","cache","signal","body","url","headers","minimizeGraphQlQuery","requestInit","prev","r","response","mesh","FetchGraphQL","setEndpoint","setFetchGraphQlHeaders","setFetchGraphQlHeader","removeFetchGraphQlHeader","fetchGraphQl","getConfig","addBeforeHook","addAfterHook","recaptchaFetchApi","RecaptchaModule","_a","recaptchaBadge","webApiKey","isBadgeGlobal","languageCode","script","configList","_b","transformConfig","extendedRecaptchaConfig","lazyLoadTimeout","recaptcha","initReCaptcha","verifyReCaptcha","setConfig","enableLogger"],"mappings":"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","x_google_ignoreList":[9]}
1
+ {"version":3,"file":"recaptcha.js","sources":["@dropins/tools/src/recaptcha/configs/message.config.ts","@dropins/tools/src/recaptcha/configs/typeForms.config.ts","@dropins/tools/src/recaptcha/configs/recaptchaBadgeSelector.config.ts","@dropins/tools/src/recaptcha/lib/_extendConfig.ts","@dropins/tools/src/recaptcha/lib/_storageConfig.ts","@dropins/tools/src/recaptcha/lib/_checkRecaptchaBadge.ts","@dropins/tools/src/recaptcha/lib/_convertKeysToCamelCase.ts","@dropins/tools/src/recaptcha/services/recaptcha.service.ts","@dropins/tools/src/recaptcha/graphql/recaptchaConfig.graphql.ts","@dropins/tools/src/recaptcha/index.ts"],"sourcesContent":["/********************************************************************\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nexport const recaptchaMessage = {\n failedFetch: 'Failed to fetch config from backend with status:',\n failedSetStorageConfig: 'Failed to set storage config',\n failedGetStorageConfig: 'Configuration could not be loaded.',\n failedExecutionRecaptcha: 'Recaptcha execution failed',\n failedInitializing: 'An error occurred while initializing ReCaptcha:',\n};\n","/********************************************************************\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nexport const typeDefaultForm: Record<string, string> = {\n PLACE_ORDER: 'placeOrder',\n CONTACT: 'contactUs',\n CUSTOMER_LOGIN: 'generateCustomerToken',\n CUSTOMER_FORGOT_PASSWORD: 'requestPasswordResetEmail',\n CUSTOMER_CREATE: 'createCustomerV2',\n CUSTOMER_EDIT: 'updateCustomerV2',\n NEWSLETTER: 'subscribeEmailToNewsletter',\n PRODUCT_REVIEW: 'createProductReview',\n SENDFRIEND: 'SENDFRIEND',\n BRAINTREE: 'BRAINTREE',\n};\n","/********************************************************************\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nexport const recaptchaBadgeSelector = '.grecaptcha-badge iframe';","/********************************************************************\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { ReCaptchaV3Model } from '../types/recaptcha.types';\nimport { typeDefaultForm } from '../configs/typeForms.config';\n\nexport const extendConfig = (\n config: ReCaptchaV3Model,\n modifyParams: any[]\n): ReCaptchaV3Model | undefined => {\n if (config && config.forms) {\n const modifyForm = config.forms.concat(modifyParams).map((el) => {\n if (typeof el !== 'string') return { ...el, enabledBadgePlace: false };\n\n return {\n badgeId: typeDefaultForm[el],\n enabledBadgePlace: false,\n };\n });\n\n return { ...config, forms: [...new Set(modifyForm)] };\n }\n};\n","/********************************************************************\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { recaptchaMessage } from '../configs';\nimport { ReCaptchaV3Model } from '../types/recaptcha.types';\n\nconst getConfigStorage = async (\n storageKey: string,\n retries = 1,\n delay = 1000\n): Promise<ReCaptchaV3Model | null> => {\n const storedConfig = sessionStorage.getItem(storageKey);\n\n if (storedConfig !== null) {\n return JSON.parse(storedConfig);\n } else if (retries > 0) {\n await new Promise((resolve) => setTimeout(resolve, delay));\n\n return getConfigStorage(storageKey, retries - 1, delay);\n }\n\n return null;\n};\n\nconst setConfigStorage = (\n storageKey: string,\n config: ReCaptchaV3Model,\n logger: boolean\n) => {\n if (!storageKey || !config.websiteKey) return null;\n\n try {\n sessionStorage.setItem(storageKey, JSON.stringify(config));\n } catch (error) {\n logger && console.error(recaptchaMessage.failedSetStorageConfig, error);\n return null;\n }\n};\n\nexport { getConfigStorage, setConfigStorage };\n","/********************************************************************\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { recaptchaBadgeSelector } from '../configs';\n\nconst waitForElement = (selector: string): Promise<void> => {\n return new Promise((resolve, reject) => {\n try {\n // Check if the element is already in the DOM\n if (document.querySelector(selector)) {\n resolve();\n return;\n }\n\n // Create an observer to watch for changes\n const observer = new MutationObserver(() => {\n if (document.querySelector(selector)) {\n resolve();\n observer.disconnect();\n }\n });\n\n // Start observing the body for child changes only\n observer.observe(document.body, {\n childList: true,\n subtree: false,\n });\n } catch (error) {\n reject(error);\n }\n });\n};\n\nexport const checkRecaptchaBadge = async (): Promise<boolean> => {\n try {\n await waitForElement(recaptchaBadgeSelector);\n return true;\n } catch (error) {\n return false;\n }\n};\n","/********************************************************************\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nexport const convertKeysToCamelCase = (obj: {\n [key: string]: any;\n}): { [key: string]: string | number | boolean } => {\n const camelCaseKey = (key: string): string => {\n return key.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\n };\n\n return Object.keys(obj).reduce((result, key) => {\n const newKey = camelCaseKey(key);\n result[newKey] = obj[key];\n return result;\n }, {} as { [key: string]: any });\n};\n","/********************************************************************\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { recaptchaMessage } from '../configs';\nimport {\n MutationObserverInit,\n ReCaptchaV3Model,\n} from '../types/recaptcha.types';\nconst { failedExecutionRecaptcha } = recaptchaMessage;\n\nexport const getRecaptchaToken = async (\n websiteKey: string\n): Promise<string> => {\n if (!(window as any).grecaptcha) {\n return Promise.reject(failedExecutionRecaptcha);\n }\n\n try {\n const token = await window.grecaptcha.execute(websiteKey, {\n action: 'click',\n });\n\n return token;\n } catch (error) {\n return Promise.reject(`${failedExecutionRecaptcha} : ${error}`);\n }\n};\n\nexport const waitForReCaptcha = () => {\n return new Promise((resolve) => {\n const observer = new MutationObserver((_, obs) => {\n if (window.grecaptcha) {\n obs.disconnect();\n resolve(true);\n }\n });\n\n const observerOptions: MutationObserverInit = {\n childList: true,\n subtree: true,\n attributes: true,\n };\n\n observer.observe(document.body, observerOptions);\n });\n};\n\nexport const verifyReCaptchaLoad = async (\n badgeId: string,\n config: ReCaptchaV3Model,\n logger: boolean\n): Promise<void> => {\n if (!window.grecaptcha) {\n await waitForReCaptcha();\n }\n\n return grecaptcha.ready(() => {\n const badgeContainers = document.querySelectorAll(`#${badgeId}`);\n\n if (!badgeContainers.length) return;\n\n // Handle the case when multiple instances of the drop-in container rendered on the same page\n\n badgeContainers.forEach(\n (element) => (element.id = `${element.id}_${Math.random().toString(36)}`) // NOSONAR\n );\n\n badgeContainers.forEach((element) => {\n if (element.innerHTML === '') {\n try {\n grecaptcha.render(element.id, {\n sitekey: config.websiteKey as string,\n badge: config.badgePosition,\n size: 'invisible',\n theme: config.theme ?? 'light',\n });\n } catch (error) {\n logger && console.error(error);\n }\n }\n });\n });\n};\n","/********************************************************************\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nexport const RECAPTCHA_CONFIGURATION_V3 = `query {\n recaptchaV3Config {\n is_enabled\n website_key\n minimum_score\n badge_position\n language_code\n failure_message\n forms\n theme\n } \n}`;\n","/********************************************************************\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport {\n ReCaptchaV3Response,\n PropsFormTypes,\n ReCaptchaV3Model,\n} from './types/recaptcha.types';\nimport { recaptchaMessage, recaptchaBadgeSelector } from './configs';\nimport {\n extendConfig,\n setConfigStorage,\n getConfigStorage,\n checkRecaptchaBadge,\n convertKeysToCamelCase,\n} from './lib';\nimport {\n getRecaptchaToken,\n verifyReCaptchaLoad,\n} from './services/recaptcha.service';\nimport { RECAPTCHA_CONFIGURATION_V3 } from './graphql/recaptchaConfig.graphql';\n\nimport { FetchGraphQL } from '@adobe-commerce/fetch-graphql';\n\nexport const recaptchaFetchApi = new FetchGraphQL().getMethods();\n\nexport class RecaptchaModule {\n _enableReCAPTCHA: boolean = false;\n _recaptchaBackendEndpoint: string =\n recaptchaFetchApi.getConfig()?.endpoint || '';\n _recaptchaScriptUrl: string = 'https://www.google.com/recaptcha/api.js';\n _configStorageKey: string = 'recaptchaConfig';\n _logger: boolean = false;\n\n async _updateBadgePosition(\n badgeId: string,\n config: ReCaptchaV3Model\n ): Promise<void | null> {\n if (!config) return;\n\n if (config?.badgePosition === 'inline') {\n await verifyReCaptchaLoad(badgeId, config, this._logger);\n } else {\n const isBadgeLoaded = await checkRecaptchaBadge();\n\n if (!isBadgeLoaded) return;\n\n const recaptchaBadge = document.querySelector(\n recaptchaBadgeSelector\n ) as HTMLIFrameElement;\n\n const shouldUpdateSrc =\n config.theme &&\n recaptchaBadge &&\n !recaptchaBadge.src.includes('theme=dark') &&\n !recaptchaBadge.src.includes('theme=light');\n\n if (shouldUpdateSrc) {\n recaptchaBadge.setAttribute(\n 'src',\n `${recaptchaBadge.src}&theme=${config.theme}`\n );\n }\n }\n }\n\n async _addRecaptchaScript(): Promise<void> {\n const config = await this._loadConfig();\n\n if (!document.getElementById('recaptchaId') && config) {\n const webApiKey = config.websiteKey;\n const isBadgeGlobal = config.badgePosition === 'inline';\n const languageCode = config.languageCode;\n\n if (!webApiKey) return;\n\n const script = document.createElement('script');\n script.setAttribute('id', 'recaptchaId');\n script.defer = true;\n script.src = isBadgeGlobal\n ? `${this._recaptchaScriptUrl}?render=${webApiKey}&badge=none&hl=${languageCode}`\n : `${this._recaptchaScriptUrl}?render=${webApiKey}&badge=${config.badgePosition}&hl=${languageCode}`;\n\n document.head.appendChild(script);\n }\n }\n\n async _fetchStoreConfig(): Promise<ReCaptchaV3Response | undefined> {\n try {\n const response = await recaptchaFetchApi.fetchGraphQl(\n RECAPTCHA_CONFIGURATION_V3,\n {\n method: 'GET',\n cache: 'force-cache',\n }\n );\n\n if (response?.errors?.length) {\n this._logger && console.error(response.errors[0].message);\n\n return;\n }\n\n return response;\n } catch (error) {\n this._logger && console.error(`${recaptchaMessage.failedFetch}:`, error);\n }\n }\n\n async _loadConfig(): Promise<ReCaptchaV3Model | null> {\n const config = await getConfigStorage(this._configStorageKey);\n\n if (!config) {\n this._logger && console.error(recaptchaMessage.failedGetStorageConfig);\n\n return null;\n }\n\n this._enableReCAPTCHA = !!config.isEnabled;\n\n return config;\n }\n\n setEndpoint(url: string) {\n if (!url) return;\n\n this._recaptchaBackendEndpoint = url;\n recaptchaFetchApi.setEndpoint(url);\n }\n\n async setConfig(configList: PropsFormTypes[]) {\n try {\n const config = await this._fetchStoreConfig();\n\n if (!config?.data?.recaptchaV3Config) {\n sessionStorage.removeItem(this._configStorageKey);\n return;\n }\n\n const transformConfig: ReCaptchaV3Model = convertKeysToCamelCase(\n config?.data?.recaptchaV3Config\n );\n\n const extendedRecaptchaConfig = extendConfig(transformConfig, configList);\n\n if (extendedRecaptchaConfig) {\n setConfigStorage(\n this._configStorageKey,\n extendedRecaptchaConfig,\n this._logger\n );\n }\n } catch (error) {\n this._logger &&\n console.error(recaptchaMessage.failedSetStorageConfig, error);\n\n sessionStorage.removeItem(this._configStorageKey);\n }\n }\n\n async initReCaptcha(lazyLoadTimeout = 3000) {\n // IIFE added to fix SonarQube error \"Promise returned in function argument where a void return was expected\"\n setTimeout(() => {\n (async () => {\n try {\n const config = await this._loadConfig();\n\n if (!config?.forms || !config.isEnabled) {\n return;\n }\n\n await this._addRecaptchaScript();\n\n if (config.badgePosition === 'inline') {\n await Promise.all(\n (config.forms as PropsFormTypes[]).map((element) =>\n this._updateBadgePosition(element.badgeId, config)\n )\n );\n } else {\n await this._updateBadgePosition('', config);\n }\n } catch (error) {\n this._logger &&\n console.error(recaptchaMessage.failedInitializing, error);\n }\n })();\n }, lazyLoadTimeout);\n }\n\n async verifyReCaptcha(): Promise<string | undefined> {\n try {\n const config = await this._loadConfig();\n\n if (!config?.forms || !config.websiteKey || !config.isEnabled) {\n return undefined;\n }\n\n return await getRecaptchaToken(config.websiteKey);\n } catch (error) {\n this._logger && console.error(error);\n }\n }\n\n enableLogger(logger: boolean) {\n this._logger = logger;\n }\n\n getMethods() {\n return {\n enableLogger: this.enableLogger.bind(this),\n setEndpoint: this.setEndpoint.bind(this),\n setConfig: this.setConfig.bind(this),\n initReCaptcha: this.initReCaptcha.bind(this),\n verifyReCaptcha: this.verifyReCaptcha.bind(this),\n };\n }\n}\n\nconst recaptcha = new RecaptchaModule();\n\nconst { initReCaptcha, verifyReCaptcha, setEndpoint, setConfig, enableLogger } =\n recaptcha.getMethods();\n\nexport { setEndpoint, setConfig, initReCaptcha, verifyReCaptcha, enableLogger };\n"],"names":["recaptchaMessage","typeDefaultForm","recaptchaBadgeSelector","extendConfig","config","modifyParams","modifyForm","el","getConfigStorage","storageKey","retries","delay","storedConfig","resolve","setConfigStorage","logger","error","waitForElement","selector","reject","observer","checkRecaptchaBadge","convertKeysToCamelCase","obj","camelCaseKey","key","_","letter","result","newKey","failedExecutionRecaptcha","getRecaptchaToken","websiteKey","waitForReCaptcha","obs","observerOptions","verifyReCaptchaLoad","badgeId","badgeContainers","element","RECAPTCHA_CONFIGURATION_V3","recaptchaFetchApi","FetchGraphQL","RecaptchaModule","_a","recaptchaBadge","webApiKey","isBadgeGlobal","languageCode","script","response","url","configList","transformConfig","_b","extendedRecaptchaConfig","lazyLoadTimeout","recaptcha","initReCaptcha","verifyReCaptcha","setEndpoint","setConfig","enableLogger"],"mappings":"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"}
@@ -3,9 +3,9 @@ import { SVGProps } from 'preact/compat';
3
3
 
4
4
  export type IconType = keyof typeof import('@adobe-commerce/elsie/icons');
5
5
  export interface IconProps extends Omit<SVGProps<SVGSVGElement>, 'size'> {
6
- source: FunctionComponent<SVGProps<SVGSVGElement> & {
6
+ source?: FunctionComponent<SVGProps<SVGSVGElement> & {
7
7
  title?: string;
8
- }> | IconType;
8
+ }> | IconType | string;
9
9
  size?: '12' | '16' | '24' | '32' | '64' | '80';
10
10
  stroke?: '1' | '2' | '3' | '4';
11
11
  className?: string;
@@ -1,91 +1,44 @@
1
- import { ImageProps } from '../../components';
2
-
3
- declare const AEM_ASSETS_FORMATS: readonly ["gif", "jpg", "jpeg", "png", "webp"];
4
- declare const AEM_ASSETS_ALLOWED_ROTATIONS: readonly [90, 180, 270];
5
- declare const AEM_ASSETS_ALLOWED_FLIPS: readonly ["h", "v", "hv"];
6
- /** The allowed formats for the `AEM Assets` image optimization API. */
7
- export type AemAssetsFormat = (typeof AEM_ASSETS_FORMATS)[number];
8
- /** The allowed rotations for the `AEM Assets` image optimization API. */
9
- export type AemAssetsRotation = (typeof AEM_ASSETS_ALLOWED_ROTATIONS)[number];
10
- /** The allowed flips for the `AEM Assets` image optimization API. */
11
- export type AemAssetsFlip = (typeof AEM_ASSETS_ALLOWED_FLIPS)[number];
12
- /**
13
- * Defines a crop region of an image.
14
- * @example
15
- * ```ts
16
- * // Crop the image to a 80% width and height, starting at 10% from the top and left.
17
- * const cropSettings: AemAssetsCropSettings = {
18
- * xOrigin: 10,
19
- * yOrigin: 10,
20
- * width: 80,
21
- * height: 80,
22
- * };
23
- */
24
- export interface AemAssetsCropSettings {
25
- /** The (relative) x origin of the crop (between 0 and 100) */
26
- xOrigin?: number;
27
- /** The (relative) y origin of the crop (between 0 and 100) */
28
- yOrigin?: number;
29
- /** The width of the crop (between 0 and 100) */
1
+ interface AemAssetsParams {
2
+ quality?: number;
3
+ format?: string;
4
+ crop?: {
5
+ xOrigin?: number;
6
+ yOrigin?: number;
7
+ width?: number;
8
+ height?: number;
9
+ };
10
+ size?: {
11
+ width?: number;
12
+ height?: number;
13
+ };
30
14
  width?: number;
31
- /** The height of the crop (between 0 and 100) */
32
15
  height?: number;
16
+ [key: string]: any;
33
17
  }
34
- /**
35
- * The parameters accepted by the `AEM Assets` image optimization API.
36
- * @see https://adobe-aem-assets-delivery-experimental.redoc.ly/
37
- */
38
- export interface AemAssetsParams {
39
- format: AemAssetsFormat;
40
- rotate?: AemAssetsRotation;
41
- flip?: AemAssetsFlip;
42
- crop?: AemAssetsCropSettings;
43
- width?: number;
44
- height?: number;
45
- quality?: number;
46
- attachment?: boolean;
47
- sharpen?: boolean;
48
- blur?: number;
49
- dpr?: number;
50
- smartCrop?: string;
51
- [key: string]: unknown;
52
- }
53
- type WithRequired<T, K extends keyof T> = T & {
54
- [P in K]-?: T[P];
55
- };
56
- /** The parameters to be applied to the asset (known width required when using a slot) */
57
- export type AemAssetsImageSlotConfigParams = WithRequired<Partial<AemAssetsParams>, 'width'>;
58
- /** The configuration for an image slot. */
59
- export interface AemAssetsImageSlotConfig {
60
- /** The alias (i.e. seoName) of the image */
18
+ interface AemAssetsImageConfig {
19
+ wrapper?: HTMLElement;
61
20
  alias: string;
62
- /** The props to be applied to the underlying {@link Image} component */
63
- imageProps: Partial<Omit<ImageProps, 'params' | 'width' | 'height'>> & {
21
+ params: AemAssetsParams;
22
+ imageProps: {
64
23
  src: string;
24
+ width?: number;
25
+ height?: number;
26
+ [key: string]: any;
65
27
  };
66
- /** The parameters to be applied to the asset (known width required when using a slot) */
67
- params: AemAssetsImageSlotConfigParams;
68
- /** The element that will contain the image in the slot */
69
- wrapper?: HTMLElement;
28
+ src?: string;
70
29
  }
71
30
  interface RenderContext {
72
31
  replaceWith: (element: HTMLElement) => void;
73
32
  }
74
- /** Returns whether AEM Assets is enabled in the Storefront. */
75
33
  export declare function isAemAssetsEnabled(): boolean;
76
- /** The default optimization parameters used globally, unless overriden (per use). */
77
- export declare function getDefaultAemAssetsOptimizationParams(): AemAssetsParams;
78
- /** Returns true if the given URL is an AEM Assets URL. */
34
+ export declare function getDefaultAemAssetsOptimizationParams(): {
35
+ quality: number;
36
+ format: string;
37
+ };
79
38
  export declare function isAemAssetsUrl(url: string | URL): boolean;
80
- /** Generates an optimized URL for AEM Assets. */
81
- export declare function generateAemAssetsOptimizedUrl(assetUrl: string, alias: string, params?: Partial<AemAssetsParams>): string;
82
- /**
83
- * Tries to generate an optimized URL for AEM Assets. Returns the given
84
- * url if AEM Assets is not enabled or is not an AEM Assets URL.
85
- */
86
- export declare function tryGenerateAemAssetsOptimizedUrl(assetUrl: string, alias: string, params?: Partial<AemAssetsParams>): string;
87
- /** Creates a slot that renders an AEM Assets image. */
88
- export declare function makeAemAssetsImageSlot(config: AemAssetsImageSlotConfig): (ctx: RenderContext) => void;
89
- export declare function tryRenderAemAssetsImage(ctx: RenderContext, config: AemAssetsImageSlotConfig): void;
39
+ export declare function generateAemAssetsOptimizedUrl(url: string, alias: string, params?: AemAssetsParams): string;
40
+ export declare function tryGenerateAemAssetsOptimizedUrl(url: string, alias: string, params?: AemAssetsParams): string;
41
+ export declare function makeAemAssetsImageSlot(config: AemAssetsImageConfig): (ctx: RenderContext) => void;
42
+ export declare function tryRenderAemAssetsImage(ctx: RenderContext, config: AemAssetsImageConfig): void;
90
43
  export {};
91
44
  //# sourceMappingURL=assets.d.ts.map
@@ -0,0 +1,166 @@
1
+ /********************************************************************
2
+ * Copyright 2024 Adobe
3
+ * All Rights Reserved.
4
+ *
5
+ * NOTICE: Adobe permits you to use, modify, and distribute this
6
+ * file in accordance with the terms of the Adobe license agreement
7
+ * accompanying it.
8
+ *******************************************************************/
9
+ export type Header = {
10
+ [key: string]: string | null;
11
+ };
12
+ export type FetchOptions = {
13
+ method?: 'GET' | 'POST';
14
+ variables?: {
15
+ [key: string]: any;
16
+ };
17
+ signal?: AbortSignal;
18
+ cache?: 'default' | 'no-store' | 'reload' | 'no-cache' | 'force-cache' | 'only-if-cached';
19
+ };
20
+ export type FetchQueryError = Array<{
21
+ message: string;
22
+ extensions: {
23
+ category: string;
24
+ };
25
+ }>;
26
+ export type BeforeHook = (requestInit: RequestInit) => RequestInit;
27
+ export type AfterHook<T = any> = (requestInit: RequestInit, response: {
28
+ errors?: FetchQueryError;
29
+ data: T;
30
+ }) => {
31
+ errors?: FetchQueryError;
32
+ data: T;
33
+ };
34
+ declare class FetchGraphQLMesh {
35
+ _endpoint?: string;
36
+ get endpoint(): string | undefined;
37
+ get fetchGraphQlHeaders(): Header;
38
+ _fetchGraphQlHeaders: Header;
39
+ _beforeHooks: BeforeHook[];
40
+ _afterHooks: AfterHook[];
41
+ /**
42
+ * Sets the GraphQL endpoint.
43
+ * @param endpoint - The GraphQL endpoint.
44
+ */
45
+ setEndpoint(endpoint: string): void;
46
+ /**
47
+ * Sets the GraphQL headers.
48
+ * @param key - The key of the header.
49
+ * @param value - The value of the header.
50
+ */
51
+ setFetchGraphQlHeader(key: string, value: string | null): void;
52
+ /**
53
+ * Removes a specific GraphQL header.
54
+ * @param key - The key of the header.
55
+ */
56
+ removeFetchGraphQlHeader(key: string): void;
57
+ /**
58
+ * Sets the GraphQL headers.
59
+ * @param header - The header object or a function that returns a header object.
60
+ * If a function is provided, it will be called with the previous headers.
61
+ * The returned object will be merged with the previous headers.
62
+ * @example
63
+ * ```js
64
+ * // set headers
65
+ * setFetchGraphQlHeaders({ test: 'test' });
66
+ *
67
+ * // merge with previous headers
68
+ * setFetchGraphQlHeaders((prev) => ({
69
+ * ...prev,
70
+ * test: 'test2',
71
+ * }));
72
+ * ```
73
+ */
74
+ setFetchGraphQlHeaders(header: Header | ((prev: Header) => Header)): void;
75
+ /**
76
+ * Adds a hook executed before the GraphQL call.
77
+ * @param hook - The hook function.
78
+ * @example
79
+ * ```js
80
+ * // add before hook
81
+ * addBeforeHook((requestInit) => console.log('About to execute ' + requestInit.method + ' call.'));
82
+ *
83
+ * // modify the requestInit before executing the request
84
+ * addBeforeHook((requestInit) => {method: requestInit.method, body: 'new body'});
85
+ * ```
86
+ */
87
+ addBeforeHook(hook: BeforeHook): void;
88
+ /**
89
+ * Adds a hook executed before the GraphQL call.
90
+ * @param hook - The hook function.
91
+ * @example
92
+ * ```js
93
+ * // add before hook
94
+ * addAfterHook((requestInit, response) => console.log(
95
+ * 'The result of ' + requestInit.method + ' call is ' + response.json().body
96
+ * ));
97
+ *
98
+ * // modify the response
99
+ * addAfterHook((requestInit, response) => new Response(JSON.stringify({ ...response, modified: true }));
100
+ * ```
101
+ */
102
+ addAfterHook(hook: AfterHook): void;
103
+ /**
104
+ * Fetches GraphQL data.
105
+ * @param query - The GraphQL query.
106
+ * @param options - Optional configuration for the fetch request.
107
+ * @returns
108
+ */
109
+ fetchGraphQl<T = any>(query: string, options?: FetchOptions): Promise<{
110
+ errors?: FetchQueryError;
111
+ data: T;
112
+ }>;
113
+ /**
114
+ * Gets the configuration.
115
+ */
116
+ getConfig(): {
117
+ endpoint: string | undefined;
118
+ fetchGraphQlHeaders: Header;
119
+ };
120
+ getMethods(): {
121
+ setEndpoint: (endpoint: string) => void;
122
+ setFetchGraphQlHeader: (key: string, value: string | null) => void;
123
+ removeFetchGraphQlHeader: (key: string) => void;
124
+ setFetchGraphQlHeaders: (header: Header | ((prev: Header) => Header)) => void;
125
+ fetchGraphQl: <T = any>(query: string, options?: FetchOptions | undefined) => Promise<{
126
+ errors?: FetchQueryError | undefined;
127
+ data: T;
128
+ }>;
129
+ getConfig: () => {
130
+ endpoint: string | undefined;
131
+ fetchGraphQlHeaders: Header;
132
+ };
133
+ addBeforeHook: (hook: BeforeHook) => void;
134
+ addAfterHook: (hook: AfterHook<any>) => void;
135
+ };
136
+ }
137
+ /**
138
+ * `FetchGraphQL` is a class that extends `FetchGraphQLMesh`.
139
+ * It provides methods to get the GraphQL endpoint and headers.
140
+ *
141
+ * @class
142
+ *
143
+ */
144
+ export declare class FetchGraphQL extends FetchGraphQLMesh {
145
+ get endpoint(): string | undefined;
146
+ get fetchGraphQlHeaders(): Header;
147
+ }
148
+ /**
149
+ * Exports several methods from the `mesh` object.
150
+ *
151
+ * @property {Function} setEndpoint - Sets the GraphQL endpoint.
152
+ * @property {Function} setFetchGraphQlHeaders - Sets the GraphQL headers.
153
+ * @property {Function} setFetchGraphQlHeader - Sets a specific GraphQL header.
154
+ * @property {Function} removeFetchGraphQlHeader - Removes a specific GraphQL header.
155
+ * @property {Function} fetchGraphQl - Fetches GraphQL data.
156
+ * @property {Function} getConfig - Gets the configuration.
157
+ */
158
+ export declare const setEndpoint: (endpoint: string) => void, setFetchGraphQlHeaders: (header: Header | ((prev: Header) => Header)) => void, setFetchGraphQlHeader: (key: string, value: string | null) => void, removeFetchGraphQlHeader: (key: string) => void, fetchGraphQl: <T = any>(query: string, options?: FetchOptions) => Promise<{
159
+ errors?: FetchQueryError | undefined;
160
+ data: T;
161
+ }>, getConfig: () => {
162
+ endpoint: string | undefined;
163
+ fetchGraphQlHeaders: Header;
164
+ }, addBeforeHook: (hook: BeforeHook) => void, addAfterHook: (hook: AfterHook) => void;
165
+ export {};
166
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,12 @@
1
+ /********************************************************************
2
+ * Copyright 2024 Adobe
3
+ * All Rights Reserved.
4
+ *
5
+ * NOTICE: Adobe permits you to use, modify, and distribute this
6
+ * file in accordance with the terms of the Adobe license agreement
7
+ * accompanying it.
8
+ *******************************************************************/
9
+ export * from './message.config';
10
+ export * from './typeForms.config';
11
+ export * from './types/recaptchaBadgeSelector.config';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,16 @@
1
+ /********************************************************************
2
+ * Copyright 2024 Adobe
3
+ * All Rights Reserved.
4
+ *
5
+ * NOTICE: Adobe permits you to use, modify, and distribute this
6
+ * file in accordance with the terms of the Adobe license agreement
7
+ * accompanying it.
8
+ *******************************************************************/
9
+ export declare const recaptchaMessage: {
10
+ failedFetch: string;
11
+ failedSetStorageConfig: string;
12
+ failedGetStorageConfig: string;
13
+ failedExecutionRecaptcha: string;
14
+ failedInitializing: string;
15
+ };
16
+ //# sourceMappingURL=message.config.d.ts.map
@@ -0,0 +1,10 @@
1
+ /********************************************************************
2
+ * Copyright 2024 Adobe
3
+ * All Rights Reserved.
4
+ *
5
+ * NOTICE: Adobe permits you to use, modify, and distribute this
6
+ * file in accordance with the terms of the Adobe license agreement
7
+ * accompanying it.
8
+ *******************************************************************/
9
+ export declare const recaptchaBadgeSelector = ".grecaptcha-badge iframe";
10
+ //# sourceMappingURL=recaptchaBadgeSelector.config.d.ts.map
@@ -0,0 +1,10 @@
1
+ /********************************************************************
2
+ * Copyright 2024 Adobe
3
+ * All Rights Reserved.
4
+ *
5
+ * NOTICE: Adobe permits you to use, modify, and distribute this
6
+ * file in accordance with the terms of the Adobe license agreement
7
+ * accompanying it.
8
+ *******************************************************************/
9
+ export declare const typeDefaultForm: Record<string, string>;
10
+ //# sourceMappingURL=typeForms.config.d.ts.map
@@ -0,0 +1,10 @@
1
+ /********************************************************************
2
+ * Copyright 2024 Adobe
3
+ * All Rights Reserved.
4
+ *
5
+ * NOTICE: Adobe permits you to use, modify, and distribute this
6
+ * file in accordance with the terms of the Adobe license agreement
7
+ * accompanying it.
8
+ *******************************************************************/
9
+ export declare const RECAPTCHA_CONFIGURATION_V3 = "query {\n recaptchaV3Config {\n is_enabled\n website_key\n minimum_score\n badge_position\n language_code\n failure_message\n forms\n theme\n } \n}";
10
+ //# sourceMappingURL=recaptchaConfig.graphql.d.ts.map
@@ -0,0 +1,44 @@
1
+ import { ReCaptchaV3Response, PropsFormTypes, ReCaptchaV3Model } from './types/recaptcha.types';
2
+
3
+ export declare const recaptchaFetchApi: {
4
+ setEndpoint: (endpoint: string) => void;
5
+ setFetchGraphQlHeader: (key: string, value: string | null) => void;
6
+ removeFetchGraphQlHeader: (key: string) => void;
7
+ setFetchGraphQlHeaders: (header: import('@adobe-commerce/fetch-graphql').Header | ((prev: import('@adobe-commerce/fetch-graphql').Header) => import('@adobe-commerce/fetch-graphql').Header)) => void;
8
+ fetchGraphQl: <T = any>(query: string, options?: import('@adobe-commerce/fetch-graphql').FetchOptions | undefined) => Promise<{
9
+ errors?: import('@adobe-commerce/fetch-graphql').FetchQueryError | undefined;
10
+ data: T;
11
+ }>;
12
+ getConfig: () => {
13
+ endpoint: string | undefined;
14
+ fetchGraphQlHeaders: import('@adobe-commerce/fetch-graphql').Header;
15
+ };
16
+ addBeforeHook: (hook: import('@adobe-commerce/fetch-graphql').BeforeHook) => void;
17
+ addAfterHook: (hook: import('@adobe-commerce/fetch-graphql').AfterHook<any>) => void;
18
+ };
19
+ export declare class RecaptchaModule {
20
+ _enableReCAPTCHA: boolean;
21
+ _recaptchaBackendEndpoint: string;
22
+ _recaptchaScriptUrl: string;
23
+ _configStorageKey: string;
24
+ _logger: boolean;
25
+ _updateBadgePosition(badgeId: string, config: ReCaptchaV3Model): Promise<void | null>;
26
+ _addRecaptchaScript(): Promise<void>;
27
+ _fetchStoreConfig(): Promise<ReCaptchaV3Response | undefined>;
28
+ _loadConfig(): Promise<ReCaptchaV3Model | null>;
29
+ setEndpoint(url: string): void;
30
+ setConfig(configList: PropsFormTypes[]): Promise<void>;
31
+ initReCaptcha(lazyLoadTimeout?: number): Promise<void>;
32
+ verifyReCaptcha(): Promise<string | undefined>;
33
+ enableLogger(logger: boolean): void;
34
+ getMethods(): {
35
+ enableLogger: (logger: boolean) => void;
36
+ setEndpoint: (url: string) => void;
37
+ setConfig: (configList: PropsFormTypes[]) => Promise<void>;
38
+ initReCaptcha: (lazyLoadTimeout?: number) => Promise<void>;
39
+ verifyReCaptcha: () => Promise<string | undefined>;
40
+ };
41
+ }
42
+ declare const initReCaptcha: (lazyLoadTimeout?: number) => Promise<void>, verifyReCaptcha: () => Promise<string | undefined>, setEndpoint: (url: string) => void, setConfig: (configList: PropsFormTypes[]) => Promise<void>, enableLogger: (logger: boolean) => void;
43
+ export { setEndpoint, setConfig, initReCaptcha, verifyReCaptcha, enableLogger };
44
+ //# sourceMappingURL=index.d.ts.map