@dropins/tools 1.3.1-alpha012 → 1.3.1-alpha013
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/chunks/Image.js +1 -1
- package/chunks/icons/Add.js +1 -1
- package/components.js +1 -1
- package/components.js.map +1 -1
- package/lib/aem/assets.js +1 -1
- package/lib/aem/assets.js.map +1 -1
- package/package.json +1 -1
- package/preact-compat.js +1 -1
- package/preact-hooks.js +1 -1
- package/recaptcha.js +2 -2
- package/recaptcha.js.map +1 -1
- package/types/elsie/src/lib/aem/assets.d.ts +77 -30
- package/lib/aem/assets.test.d.ts +0 -1
- package/lib/aem/assets.test.js +0 -4
- package/lib/aem/assets.test.js.map +0 -1
- package/lib/aem/configs.test.d.ts +0 -1
- package/lib/aem/configs.test.js +0 -4
- package/lib/aem/configs.test.js.map +0 -1
- package/types/fetch-graphql/src/index.d.ts +0 -166
- package/types/recaptcha/src/configs/index.d.ts +0 -12
- package/types/recaptcha/src/configs/message.config.d.ts +0 -16
- package/types/recaptcha/src/configs/recaptchaBadgeSelector.config.d.ts +0 -10
- package/types/recaptcha/src/configs/typeForms.config.d.ts +0 -10
- package/types/recaptcha/src/graphql/recaptchaConfig.graphql.d.ts +0 -10
- package/types/recaptcha/src/index.d.ts +0 -44
- package/types/recaptcha/src/lib/_checkRecaptchaBadge.d.ts +0 -10
- package/types/recaptcha/src/lib/_convertKeysToCamelCase.d.ts +0 -14
- package/types/recaptcha/src/lib/_extendConfig.d.ts +0 -4
- package/types/recaptcha/src/lib/_storageConfig.d.ts +0 -6
- package/types/recaptcha/src/lib/index.d.ts +0 -13
- package/types/recaptcha/src/services/recaptcha.service.d.ts +0 -6
package/lib/aem/assets.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{getConfigValue as
|
|
3
|
+
import{getConfigValue as O}from"./configs.js";import{p as f,I as g}from"../../chunks/Image.js";import"../../chunks/cjs.js";import"../../chunks/get-path-value.js";import"../../preact-jsx-runtime.js";import"../../chunks/icons/Add.js";import"../../i18n.js";import"../../chunks/vcomponent.js";import"../../chunks/image-params-keymap.js";import"../../signals.js";const b=["gif","jpg","jpeg","png","webp"],v=[90,180,270],U=["h","v","hv"];function l(e){let t=e;if(t.startsWith("//")){const{protocol:s}=window.location;t=s+t}return t}function I(e){return U.includes(e)}function L(e){return v.includes(e)}function y(e){return b.includes(e)}function u(e,t,s){if(e!==void 0&&!t(e))throw new Error(s)}function h(){const e=O("commerce-assets-enabled");return e&&(typeof e=="string"&&e.toLowerCase()==="true"||typeof e=="boolean"&&e===!0)}function R(){return{quality:80,format:"webp"}}function A(e){return!!(typeof e=="string"?new URL(l(e)):e).pathname.startsWith("/adobe/assets/urn:aaid:aem")}function w(e,t,s={}){const r={...R(),...s},{format:i,crop:n,...o}=r;u(i,y,"Invalid format"),u(o.flip,I,"Invalid flip"),u(o.rotate,L,"Invalid rotation");const a=Object.fromEntries(Object.entries(o).map(([p,d])=>[p,String(d)])),c=new URLSearchParams(a);if(n){const[p,d]=[n.xOrigin||0,n.yOrigin||0],[P,E]=[n.width||100,n.height||100],S=`${p}p,${d}p,${P}p,${E}p`;c.set("crop",S)}return`${e}/as/${t}.${i}?${c.toString()}`}function q(e,t,s={}){if(!h())return e;const r=new URL(l(e));if(!A(r))return e;const i=r.origin+r.pathname;return w(i,t,s)}function _(e){return t=>{const{wrapper:s,alias:m,params:r,imageProps:i}=e;if(!i.src)throw new Error("An image source is required. Please provide a `src` or `imageProps.src`.");const n=s??document.createElement("div"),o=w(i.src,m,r),a={width:r.width,height:r.height,crop:void 0,fit:void 0,auto:void 0},c={...i,width:r.width,height:r.height,src:o,params:a};f.render(g,c)(n),t.replaceWith(n)}}function x(e,t){function s(){const i=t.wrapper??document.createElement("div"),{imageProps:n,params:o}=t,a={...n,width:o.width,height:o.height};f.render(g,a)(i),e.replaceWith(i)}if(!h()){s();return}if(!t.imageProps.src)throw new Error("An image source is required. Please provide a `src` or `imageProps.src`.");const r=new URL(l(t.imageProps.src));if(!A(r)){s();return}_(t)(e)}export{w as generateAemAssetsOptimizedUrl,R as getDefaultAemAssetsOptimizationParams,h as isAemAssetsEnabled,A as isAemAssetsUrl,_ as makeAemAssetsImageSlot,q as tryGenerateAemAssetsOptimizedUrl,x as tryRenderAemAssetsImage};
|
|
4
4
|
//# sourceMappingURL=assets.js.map
|
package/lib/aem/assets.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assets.js","sources":["/@dropins/tools/src/lib/aem/assets.ts"],"sourcesContent":["import { provider as UI, Image } from '@adobe-commerce/elsie/components';\nimport { getConfigValue } from '@adobe-commerce/elsie/lib/aem/configs';\n\ninterface AemAssetsParams {\n quality?: number;\n format?: string;\n crop?: {\n xOrigin?: number;\n yOrigin?: number;\n width?: number;\n height?: number;\n };\n size?: {\n width?: number;\n height?: number;\n };\n width?: number;\n height?: number;\n [key: string]: any;\n}\n\ninterface AemAssetsImageConfig {\n wrapper?: HTMLElement;\n alias: string;\n params: AemAssetsParams;\n imageProps: {\n src: string;\n width?: number;\n height?: number;\n [key: string]: any;\n };\n src?: string;\n}\n\ninterface RenderContext {\n replaceWith: (element: HTMLElement) => void;\n}\n\nexport function isAemAssetsEnabled(): boolean {\n const config = getConfigValue('commerce-assets-enabled');\n\n return config && (\n (typeof config === 'string' && config.toLowerCase() === 'true')\n || (typeof config === 'boolean' && config === true)\n );\n}\n\nexport function getDefaultAemAssetsOptimizationParams(): { quality: number; format: string } {\n // See: https://adobe-aem-assets-delivery-experimental.redoc.ly/\n return {\n quality: 80,\n format: 'webp',\n };\n}\n\n/**\n * Normalizes the given URL to ensure it is a valid URL.\n * @param {string} url - The URL to normalize.\n * @returns {string} The normalized URL.\n */\nfunction normalizeUrl(url: string): string {\n let imageUrl = url;\n\n if (imageUrl.startsWith('//')) {\n // Use current window's protocol.\n const { protocol } = window.location;\n console.log('protocol', protocol);\n imageUrl = protocol + imageUrl;\n }\n\n return imageUrl;\n}\n\nexport function isAemAssetsUrl(url: string | URL): boolean {\n const assetsUrl = typeof url === 'string' ? new URL(normalizeUrl(url)) : url;\n\n if (!assetsUrl.pathname.startsWith('/adobe/assets/urn:aaid:aem')) {\n return false;\n }\n\n return true;\n}\n\nexport function generateAemAssetsOptimizedUrl(url: string, alias: string, params: AemAssetsParams = {}): string {\n const defaultParams = getDefaultAemAssetsOptimizationParams();\n const mergedParams: AemAssetsParams = { ...defaultParams, ...params };\n\n // Destructure the ones that need special handling\n const {\n format,\n crop,\n size,\n ...optimizedParams\n } = mergedParams;\n\n const searchParams = new URLSearchParams(optimizedParams);\n\n if (crop) {\n const [xOrigin, yOrigin] = [crop.xOrigin || 0, crop.yOrigin || 0];\n const [width, height] = [crop.width || 100, crop.height || 100];\n\n const cropTransform = `${xOrigin}p,${yOrigin}p,${width}p,${height}p`;\n searchParams.set('crop', cropTransform);\n }\n\n // Both values must be present\n if (size && size.width && size.height) {\n searchParams.set('size', `${size.width},${size.height}`);\n }\n\n return `${url}/as/${alias}.${format}?${searchParams.toString()}`;\n}\n\nexport function tryGenerateAemAssetsOptimizedUrl(url: string, alias: string, params: AemAssetsParams = {}): string {\n const assetsEnabled = isAemAssetsEnabled();\n\n if (!(assetsEnabled)) {\n // No-op, doesn't do anything.\n return url;\n }\n\n const assetsUrl = new URL(normalizeUrl(url));\n\n if (!isAemAssetsUrl(assetsUrl)) {\n // Not an AEM Assets URL, so no-op.\n return url;\n }\n\n const base = assetsUrl.origin + assetsUrl.pathname;\n return generateAemAssetsOptimizedUrl(base, alias, params);\n}\n\nexport function makeAemAssetsImageSlot(\n config: AemAssetsImageConfig,\n) {\n return (ctx: RenderContext) => {\n const {\n wrapper,\n alias,\n params,\n imageProps,\n src,\n } = config;\n\n const container = wrapper ?? document.createElement('div');\n const imageSrc = generateAemAssetsOptimizedUrl(src || imageProps.src, alias, params);\n\n UI.render(Image as any, {\n ...imageProps,\n\n src: imageSrc,\n params: {\n width: params.width,\n\n // If not null, they will be applied by default.\n // And they are not compatible with the AEM Assets API.\n crop: null,\n fit: null,\n auto: null,\n },\n })(container);\n\n ctx.replaceWith(container);\n };\n}\n\nexport function tryRenderAemAssetsImage(ctx: RenderContext, config: AemAssetsImageConfig): void {\n // Renders an equivalent of the default image.\n function renderDefaultImage(): void {\n const container = config.wrapper ?? document.createElement('div');\n const { imageProps } = config;\n\n (UI.render as any)(Image, imageProps)(container);\n ctx.replaceWith(container);\n }\n\n const assetsEnabled = isAemAssetsEnabled();\n\n if (!(assetsEnabled)) {\n // No-op, render the default image.\n renderDefaultImage();\n return;\n }\n\n const { imageProps, src, ...slotConfig } = config;\n const assetsUrl = new URL(normalizeUrl(src ?? imageProps.src));\n\n if (!isAemAssetsUrl(assetsUrl)) {\n // Not an AEM Assets URL, so render the default image.\n renderDefaultImage();\n return;\n }\n\n makeAemAssetsImageSlot({\n // Use the default image props for params and src.\n // Unless overriden by the slot config.\n src: assetsUrl.toString(),\n params: {\n width: imageProps.width,\n height: imageProps.height,\n ...slotConfig.params,\n },\n imageProps,\n alias: slotConfig.alias,\n wrapper: slotConfig.wrapper,\n })(ctx);\n}\n"],"names":["isAemAssetsEnabled","config","getConfigValue","getDefaultAemAssetsOptimizationParams","normalizeUrl","url","imageUrl","protocol","isAemAssetsUrl","generateAemAssetsOptimizedUrl","alias","params","mergedParams","format","crop","size","optimizedParams","searchParams","xOrigin","yOrigin","width","height","cropTransform","tryGenerateAemAssetsOptimizedUrl","assetsUrl","base","makeAemAssetsImageSlot","ctx","wrapper","imageProps","src","container","imageSrc","UI","Image","tryRenderAemAssetsImage","renderDefaultImage","slotConfig"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"assets.js","sources":["/@dropins/tools/src/lib/aem/assets.ts"],"sourcesContent":["import {\n provider as UI,\n Image,\n type ImageProps,\n} from '@adobe-commerce/elsie/components';\n\nimport { getConfigValue } from '@adobe-commerce/elsie/lib/aem/configs';\nimport type { ResolveImageUrlOptions } from '../resolve-image';\n\nconst AEM_ASSETS_FORMATS = ['gif', 'jpg', 'jpeg', 'png', 'webp'] as const;\nconst AEM_ASSETS_ALLOWED_ROTATIONS = [90, 180, 270] as const;\nconst AEM_ASSETS_ALLOWED_FLIPS = ['h', 'v', 'hv'] as const;\n\n/** The allowed formats for the `AEM Assets` image optimization API. */\nexport type AemAssetsFormat = (typeof AEM_ASSETS_FORMATS)[number];\n\n/** The allowed rotations for the `AEM Assets` image optimization API. */\nexport type AemAssetsRotation = (typeof AEM_ASSETS_ALLOWED_ROTATIONS)[number];\n\n/** The allowed flips for the `AEM Assets` image optimization API. */\nexport type AemAssetsFlip = (typeof AEM_ASSETS_ALLOWED_FLIPS)[number];\n\n/**\n * Defines a crop region of an image.\n * @example\n * ```ts\n * // Crop the image to a 80% width and height, starting at 10% from the top and left.\n * const cropSettings: AemAssetsCropSettings = {\n * xOrigin: 10,\n * yOrigin: 10,\n * width: 80,\n * height: 80,\n * };\n */\nexport interface AemAssetsCropSettings {\n /** The (relative) x origin of the crop (between 0 and 100) */\n xOrigin?: number;\n\n /** The (relative) y origin of the crop (between 0 and 100) */\n yOrigin?: number;\n\n /** The width of the crop (between 0 and 100) */\n width?: number;\n\n /** The height of the crop (between 0 and 100) */\n height?: number;\n}\n\n/**\n * The parameters accepted by the `AEM Assets` image optimization API.\n * @see https://adobe-aem-assets-delivery-experimental.redoc.ly/\n */\nexport interface AemAssetsParams {\n format: AemAssetsFormat;\n rotate?: AemAssetsRotation;\n flip?: AemAssetsFlip;\n crop?: AemAssetsCropSettings;\n\n width?: number;\n height?: number;\n quality?: number;\n\n attachment?: boolean;\n sharpen?: boolean;\n blur?: number;\n dpr?: number;\n smartCrop?: string;\n\n // For future updates we may miss.\n [key: string]: unknown;\n}\n\ntype WithRequired<T, K extends keyof T> = T & { [P in K]-?: T[P] };\n\n/** The parameters to be applied to the asset (known width required when using a slot) */\nexport type AemAssetsImageSlotConfigParams = WithRequired<\n Partial<AemAssetsParams>,\n 'width'\n>;\n\n/** The configuration for an image slot. */\nexport interface AemAssetsImageSlotConfig {\n /** The alias (i.e. seoName) of the image */\n alias: string;\n\n /** The props to be applied to the underlying {@link Image} component */\n imageProps: Partial<Omit<ImageProps, 'params' | 'width' | 'height'>> & {\n src: string;\n };\n\n /** The parameters to be applied to the asset (known width required when using a slot) */\n params: AemAssetsImageSlotConfigParams;\n\n /** The element that will contain the image in the slot */\n wrapper?: HTMLElement;\n}\n\ninterface RenderContext {\n replaceWith: (element: HTMLElement) => void;\n}\n\n/**\n * Normalizes the given URL to ensure it is a valid URL.\n * @param {string} url - The URL to normalize.\n * @returns {string} The normalized URL.\n */\nfunction normalizeUrl(url: string): string {\n let imageUrl = url;\n\n if (imageUrl.startsWith('//')) {\n // Use current window's protocol.\n const { protocol } = window.location;\n imageUrl = protocol + imageUrl;\n }\n\n return imageUrl;\n}\n\n/** Returns whether the given value is a valid flip. */\nfunction isValidFlip(flip: unknown): flip is AemAssetsFlip {\n return AEM_ASSETS_ALLOWED_FLIPS.includes(flip as AemAssetsFlip);\n}\n\n/** Returns whether the given value is a valid rotation. */\nfunction isValidRotation(rotation: unknown): rotation is AemAssetsRotation {\n return AEM_ASSETS_ALLOWED_ROTATIONS.includes(rotation as AemAssetsRotation);\n}\n\n/** Returns whether the given value is a valid format. */\nfunction isValidFormat(format: unknown): format is AemAssetsFormat {\n return AEM_ASSETS_FORMATS.includes(format as AemAssetsFormat);\n}\n\n/** Asserts that the given value is valid. */\nfunction assertUnionParameter(\n value: unknown,\n validator: (value: unknown) => boolean,\n errorMessage: string\n): void {\n if (value !== undefined && !validator(value)) {\n throw new Error(errorMessage);\n }\n}\n\n/** Returns whether AEM Assets is enabled in the Storefront. */\nexport function isAemAssetsEnabled(): boolean {\n const config = getConfigValue('commerce-assets-enabled');\n\n return (\n config &&\n ((typeof config === 'string' && config.toLowerCase() === 'true') ||\n (typeof config === 'boolean' && config === true))\n );\n}\n\n/** The default optimization parameters used globally, unless overriden (per use). */\nexport function getDefaultAemAssetsOptimizationParams(): AemAssetsParams {\n // See: https://adobe-aem-assets-delivery-experimental.redoc.ly/\n return {\n quality: 80,\n format: 'webp',\n };\n}\n\n/** Returns true if the given URL is an AEM Assets URL. */\nexport function isAemAssetsUrl(url: string | URL): boolean {\n const assetsUrl = typeof url === 'string' ? new URL(normalizeUrl(url)) : url;\n\n if (!assetsUrl.pathname.startsWith('/adobe/assets/urn:aaid:aem')) {\n return false;\n }\n\n return true;\n}\n\n/** Generates an optimized URL for AEM Assets. */\nexport function generateAemAssetsOptimizedUrl(\n assetUrl: string,\n alias: string,\n params: Partial<AemAssetsParams> = {}\n): string {\n const defaultParams = getDefaultAemAssetsOptimizationParams();\n const mergedParams: AemAssetsParams = { ...defaultParams, ...params };\n\n // Destructure the ones that need special handling/validation.\n const { format, crop, ...optimizedParams } = mergedParams;\n assertUnionParameter(format, isValidFormat, 'Invalid format');\n assertUnionParameter(optimizedParams.flip, isValidFlip, 'Invalid flip');\n assertUnionParameter(\n optimizedParams.rotate,\n isValidRotation,\n 'Invalid rotation'\n );\n\n const stringifiedParams = Object.fromEntries(\n Object.entries(optimizedParams).map(([key, value]) => [key, String(value)])\n );\n\n const searchParams = new URLSearchParams(stringifiedParams);\n\n if (crop) {\n const [xOrigin, yOrigin] = [crop.xOrigin || 0, crop.yOrigin || 0];\n const [width, height] = [crop.width || 100, crop.height || 100];\n\n const cropTransform = `${xOrigin}p,${yOrigin}p,${width}p,${height}p`;\n searchParams.set('crop', cropTransform);\n }\n\n return `${assetUrl}/as/${alias}.${format}?${searchParams.toString()}`;\n}\n\n/**\n * Tries to generate an optimized URL for AEM Assets. Returns the given\n * url if AEM Assets is not enabled or is not an AEM Assets URL.\n */\nexport function tryGenerateAemAssetsOptimizedUrl(\n assetUrl: string,\n alias: string,\n params: Partial<AemAssetsParams> = {}\n): string {\n const assetsEnabled = isAemAssetsEnabled();\n\n if (!assetsEnabled) {\n // No-op, doesn't do anything.\n return assetUrl;\n }\n\n const assetsUrl = new URL(normalizeUrl(assetUrl));\n\n if (!isAemAssetsUrl(assetsUrl)) {\n // Not an AEM Assets URL, so no-op.\n return assetUrl;\n }\n\n const base = assetsUrl.origin + assetsUrl.pathname;\n return generateAemAssetsOptimizedUrl(base, alias, params);\n}\n\n/** Creates a slot that renders an AEM Assets image. */\nexport function makeAemAssetsImageSlot(config: AemAssetsImageSlotConfig) {\n return (ctx: RenderContext) => {\n const { wrapper, alias, params, imageProps } = config;\n\n if (!imageProps.src) {\n throw new Error(\n 'An image source is required. Please provide a `src` or `imageProps.src`.'\n );\n }\n\n const container = wrapper ?? document.createElement('div');\n const imageSrc = generateAemAssetsOptimizedUrl(\n imageProps.src,\n alias,\n params\n );\n\n const imageComponentParams: ResolveImageUrlOptions = {\n width: params.width,\n height: params.height,\n\n // If this is not done, they will be applied by default.\n // And they are not compatible with the AEM Assets API.\n crop: undefined,\n fit: undefined,\n auto: undefined,\n };\n\n const imageComponentProps: ImageProps = {\n ...imageProps,\n width: params.width,\n height: params.height,\n\n src: imageSrc,\n params: imageComponentParams,\n };\n\n UI.render(Image, imageComponentProps)(container);\n ctx.replaceWith(container);\n };\n}\n\nexport function tryRenderAemAssetsImage(\n ctx: RenderContext,\n config: AemAssetsImageSlotConfig\n): void {\n // Renders an equivalent of the default image.\n function renderDefaultImage(): void {\n const container = config.wrapper ?? document.createElement('div');\n const { imageProps, params } = config;\n const imageComponentProps: ImageProps = {\n ...imageProps,\n width: params.width,\n height: params.height,\n };\n\n UI.render(Image, imageComponentProps)(container);\n ctx.replaceWith(container);\n }\n\n const assetsEnabled = isAemAssetsEnabled();\n\n if (!assetsEnabled) {\n // No-op, render the default image.\n renderDefaultImage();\n return;\n }\n\n if (!config.imageProps.src) {\n throw new Error(\n 'An image source is required. Please provide a `src` or `imageProps.src`.'\n );\n }\n\n const assetsUrl = new URL(normalizeUrl(config.imageProps.src));\n\n if (!isAemAssetsUrl(assetsUrl)) {\n // Not an AEM Assets URL, so render the default image.\n renderDefaultImage();\n return;\n }\n\n makeAemAssetsImageSlot(config)(ctx);\n}\n"],"names":["AEM_ASSETS_FORMATS","AEM_ASSETS_ALLOWED_ROTATIONS","AEM_ASSETS_ALLOWED_FLIPS","normalizeUrl","url","imageUrl","protocol","isValidFlip","flip","isValidRotation","rotation","isValidFormat","format","assertUnionParameter","value","validator","errorMessage","isAemAssetsEnabled","config","getConfigValue","getDefaultAemAssetsOptimizationParams","isAemAssetsUrl","generateAemAssetsOptimizedUrl","assetUrl","alias","params","mergedParams","crop","optimizedParams","stringifiedParams","key","searchParams","xOrigin","yOrigin","width","height","cropTransform","tryGenerateAemAssetsOptimizedUrl","assetsUrl","base","makeAemAssetsImageSlot","ctx","wrapper","imageProps","container","imageSrc","imageComponentParams","imageComponentProps","UI","Image","tryRenderAemAssetsImage","renderDefaultImage"],"mappings":"sWASA,MAAMA,EAAqB,CAAC,MAAO,MAAO,OAAQ,MAAO,MAAM,EACzDC,EAA+B,CAAC,GAAI,IAAK,GAAG,EAC5CC,EAA2B,CAAC,IAAK,IAAK,IAAI,EA+FhD,SAASC,EAAaC,EAAqB,CACzC,IAAIC,EAAWD,EAEX,GAAAC,EAAS,WAAW,IAAI,EAAG,CAEvB,KAAA,CAAE,SAAAC,GAAa,OAAO,SAC5BD,EAAWC,EAAWD,CAAA,CAGjB,OAAAA,CACT,CAGA,SAASE,EAAYC,EAAsC,CAClD,OAAAN,EAAyB,SAASM,CAAqB,CAChE,CAGA,SAASC,EAAgBC,EAAkD,CAClE,OAAAT,EAA6B,SAASS,CAA6B,CAC5E,CAGA,SAASC,EAAcC,EAA4C,CAC1D,OAAAZ,EAAmB,SAASY,CAAyB,CAC9D,CAGA,SAASC,EACPC,EACAC,EACAC,EACM,CACN,GAAIF,IAAU,QAAa,CAACC,EAAUD,CAAK,EACnC,MAAA,IAAI,MAAME,CAAY,CAEhC,CAGO,SAASC,GAA8B,CACtC,MAAAC,EAASC,EAAe,yBAAyB,EAGrD,OAAAD,IACE,OAAOA,GAAW,UAAYA,EAAO,gBAAkB,QACtD,OAAOA,GAAW,WAAaA,IAAW,GAEjD,CAGO,SAASE,GAAyD,CAEhE,MAAA,CACL,QAAS,GACT,OAAQ,MACV,CACF,CAGO,SAASC,EAAejB,EAA4B,CAGzD,MAAK,GAFa,OAAOA,GAAQ,SAAW,IAAI,IAAID,EAAaC,CAAG,CAAC,EAAIA,GAE1D,SAAS,WAAW,4BAA4B,CAKjE,CAGO,SAASkB,EACdC,EACAC,EACAC,EAAmC,CAAA,EAC3B,CAER,MAAMC,EAAgC,CAAE,GADlBN,EAAsC,EACF,GAAGK,CAAO,EAG9D,CAAE,OAAAb,EAAQ,KAAAe,EAAM,GAAGC,CAAoB,EAAAF,EACxBb,EAAAD,EAAQD,EAAe,gBAAgB,EACvCE,EAAAe,EAAgB,KAAMrB,EAAa,cAAc,EACtEM,EACEe,EAAgB,OAChBnB,EACA,kBACF,EAEA,MAAMoB,EAAoB,OAAO,YAC/B,OAAO,QAAQD,CAAe,EAAE,IAAI,CAAC,CAACE,EAAKhB,CAAK,IAAM,CAACgB,EAAK,OAAOhB,CAAK,CAAC,CAAC,CAC5E,EAEMiB,EAAe,IAAI,gBAAgBF,CAAiB,EAE1D,GAAIF,EAAM,CACF,KAAA,CAACK,EAASC,CAAO,EAAI,CAACN,EAAK,SAAW,EAAGA,EAAK,SAAW,CAAC,EAC1D,CAACO,EAAOC,CAAM,EAAI,CAACR,EAAK,OAAS,IAAKA,EAAK,QAAU,GAAG,EAExDS,EAAgB,GAAGJ,CAAO,KAAKC,CAAO,KAAKC,CAAK,KAAKC,CAAM,IACpDJ,EAAA,IAAI,OAAQK,CAAa,CAAA,CAGjC,MAAA,GAAGb,CAAQ,OAAOC,CAAK,IAAIZ,CAAM,IAAImB,EAAa,SAAA,CAAU,EACrE,CAMO,SAASM,EACdd,EACAC,EACAC,EAAmC,CAAA,EAC3B,CAGR,GAAI,CAFkBR,EAAmB,EAIhC,OAAAM,EAGT,MAAMe,EAAY,IAAI,IAAInC,EAAaoB,CAAQ,CAAC,EAE5C,GAAA,CAACF,EAAeiB,CAAS,EAEpB,OAAAf,EAGH,MAAAgB,EAAOD,EAAU,OAASA,EAAU,SACnC,OAAAhB,EAA8BiB,EAAMf,EAAOC,CAAM,CAC1D,CAGO,SAASe,EAAuBtB,EAAkC,CACvE,OAAQuB,GAAuB,CAC7B,KAAM,CAAE,QAAAC,EAAS,MAAAlB,EAAO,OAAAC,EAAQ,WAAAkB,CAAe,EAAAzB,EAE3C,GAAA,CAACyB,EAAW,IACd,MAAM,IAAI,MACR,0EACF,EAGF,MAAMC,EAAYF,GAAW,SAAS,cAAc,KAAK,EACnDG,EAAWvB,EACfqB,EAAW,IACXnB,EACAC,CACF,EAEMqB,EAA+C,CACnD,MAAOrB,EAAO,MACd,OAAQA,EAAO,OAIf,KAAM,OACN,IAAK,OACL,KAAM,MACR,EAEMsB,EAAkC,CACtC,GAAGJ,EACH,MAAOlB,EAAO,MACd,OAAQA,EAAO,OAEf,IAAKoB,EACL,OAAQC,CACV,EAEAE,EAAG,OAAOC,EAAOF,CAAmB,EAAEH,CAAS,EAC/CH,EAAI,YAAYG,CAAS,CAC3B,CACF,CAEgB,SAAAM,EACdT,EACAvB,EACM,CAEN,SAASiC,GAA2B,CAClC,MAAMP,EAAY1B,EAAO,SAAW,SAAS,cAAc,KAAK,EAC1D,CAAE,WAAAyB,EAAY,OAAAlB,CAAA,EAAWP,EACzB6B,EAAkC,CACtC,GAAGJ,EACH,MAAOlB,EAAO,MACd,OAAQA,EAAO,MACjB,EAEAuB,EAAG,OAAOC,EAAOF,CAAmB,EAAEH,CAAS,EAC/CH,EAAI,YAAYG,CAAS,CAAA,CAK3B,GAAI,CAFkB3B,EAAmB,EAErB,CAECkC,EAAA,EACnB,MAAA,CAGE,GAAA,CAACjC,EAAO,WAAW,IACrB,MAAM,IAAI,MACR,0EACF,EAGF,MAAMoB,EAAY,IAAI,IAAInC,EAAae,EAAO,WAAW,GAAG,CAAC,EAEzD,GAAA,CAACG,EAAeiB,CAAS,EAAG,CAEXa,EAAA,EACnB,MAAA,CAGqBX,EAAAtB,CAAM,EAAEuB,CAAG,CACpC"}
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name": "@dropins/tools", "version": "1.3.1-
|
|
1
|
+
{"name": "@dropins/tools", "version": "1.3.1-alpha013", "license": "SEE LICENSE IN LICENSE.md"}
|
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,
|
|
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};
|
|
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,
|
|
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};
|
|
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
|
-
|
|
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 {
|
|
4
4
|
recaptchaV3Config {
|
|
5
5
|
is_enabled
|
|
6
6
|
website_key
|
|
@@ -11,5 +11,5 @@ import{FetchGraphQL as l}from"./fetch-graphql.js";const n={failedFetch:"Failed t
|
|
|
11
11
|
forms
|
|
12
12
|
theme
|
|
13
13
|
}
|
|
14
|
-
}`,
|
|
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};
|
|
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/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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"}
|
|
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,44 +1,91 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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) */
|
|
14
30
|
width?: number;
|
|
31
|
+
/** The height of the crop (between 0 and 100) */
|
|
15
32
|
height?: number;
|
|
16
|
-
[key: string]: any;
|
|
17
33
|
}
|
|
18
|
-
|
|
19
|
-
|
|
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 */
|
|
20
61
|
alias: string;
|
|
21
|
-
|
|
22
|
-
imageProps: {
|
|
62
|
+
/** The props to be applied to the underlying {@link Image} component */
|
|
63
|
+
imageProps: Partial<Omit<ImageProps, 'params' | 'width' | 'height'>> & {
|
|
23
64
|
src: string;
|
|
24
|
-
width?: number;
|
|
25
|
-
height?: number;
|
|
26
|
-
[key: string]: any;
|
|
27
65
|
};
|
|
28
|
-
|
|
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;
|
|
29
70
|
}
|
|
30
71
|
interface RenderContext {
|
|
31
72
|
replaceWith: (element: HTMLElement) => void;
|
|
32
73
|
}
|
|
74
|
+
/** Returns whether AEM Assets is enabled in the Storefront. */
|
|
33
75
|
export declare function isAemAssetsEnabled(): boolean;
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
};
|
|
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. */
|
|
38
79
|
export declare function isAemAssetsUrl(url: string | URL): boolean;
|
|
39
|
-
|
|
40
|
-
export declare function
|
|
41
|
-
|
|
42
|
-
|
|
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;
|
|
43
90
|
export {};
|
|
44
91
|
//# sourceMappingURL=assets.d.ts.map
|
package/lib/aem/assets.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from '../../types/elsie/src/lib/aem/assets.test'
|
package/lib/aem/assets.test.js
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
/*! Copyright 2025 Adobe
|
|
2
|
-
All Rights Reserved. */
|
|
3
|
-
import{isAemAssetsEnabled as m,getDefaultAemAssetsOptimizationParams as n,isAemAssetsUrl as l,generateAemAssetsOptimizedUrl as o,tryGenerateAemAssetsOptimizedUrl as i,makeAemAssetsImageSlot as c,tryRenderAemAssetsImage as p}from"./assets.js";import{getConfigValue as r}from"./configs.js";import"../../chunks/Image.js";import"../../preact-jsx-runtime.js";import"../../chunks/icons/Add.js";import"../../i18n.js";import"../../chunks/cjs.js";import"../../chunks/vcomponent.js";import"../../chunks/image-params-keymap.js";import"../../signals.js";import"../../chunks/get-path-value.js";jest.mock("./configs",()=>({getConfigValue:jest.fn().mockImplementation(e=>{if(e==="commerce-assets-enabled")return!0})}));Object.defineProperty(window,"location",{value:{pathname:"/",origin:"https://example.com",protocol:"https:"}});describe("AEM Assets",()=>{beforeEach(()=>{jest.clearAllMocks()}),test("should be enabled",()=>{expect(m()).toBe(!0),r.mockReturnValueOnce("true"),expect(m()).toBe(!0)}),test("should be disabled",()=>{r.mockReturnValueOnce(!1),expect(m()).toBe(!1)}),test("should return default optimization params",()=>{const e=n();expect(e).toEqual({quality:80,format:"webp"})}),test("should return true if url is aem assets url",()=>{expect(l("https://example.com/adobe/assets/urn:aaid:aem:1234567890")).toBe(!0)}),test("should return false if url is not aem assets url",()=>{expect(l("https://example.com/image.jpg")).toBe(!1)}),test("should return true if url is aem assets url with protocol relative path",()=>{expect(l("//example.com/adobe/assets/urn:aaid:aem:1234567890")).toBe(!0)}),test("should generate aem assets optimized url",()=>{const t=o("https://example.com/adobe/assets/urn:aaid:aem:1234567890","test",{quality:80,format:"webp"});expect(t).toBe("https://example.com/adobe/assets/urn:aaid:aem:1234567890/as/test.webp?quality=80")}),test("should generate aem assets optimized url with default params",()=>{const a=o("https://example.com/adobe/assets/urn:aaid:aem:1234567890","test");expect(a).toBe("https://example.com/adobe/assets/urn:aaid:aem:1234567890/as/test.webp?quality=80")}),test("should generate aem assets optimized url with crop",()=>{const t=o("https://example.com/adobe/assets/urn:aaid:aem:1234567890","test",{quality:80,format:"webp",crop:{xOrigin:0,yOrigin:0}});expect(t).toBe("https://example.com/adobe/assets/urn:aaid:aem:1234567890/as/test.webp?quality=80&crop=0p%2C0p%2C100p%2C100p")}),test("should generate aem assets optimized url with size",()=>{const t=o("https://example.com/adobe/assets/urn:aaid:aem:1234567890","test",{quality:80,format:"webp",size:{width:100,height:100}});expect(t).toBe("https://example.com/adobe/assets/urn:aaid:aem:1234567890/as/test.webp?quality=80&size=100%2C100")}),test("should generate aem assets optimized url with width and height",()=>{const t=o("https://example.com/adobe/assets/urn:aaid:aem:1234567890","test",{quality:80,format:"webp",width:100,height:100});expect(t).toBe("https://example.com/adobe/assets/urn:aaid:aem:1234567890/as/test.webp?quality=80&width=100&height=100")}),test("should try generate aem assets optimized url",()=>{const t=i("https://example.com/adobe/assets/urn:aaid:aem:1234567890","test",{quality:80,format:"webp",width:100,height:100});expect(t).toBe("https://example.com/adobe/assets/urn:aaid:aem:1234567890/as/test.webp?quality=80&width=100&height=100")}),test("should try generate aem assets optimized url with default params",()=>{const a=i("https://example.com/adobe/assets/urn:aaid:aem:1234567890","test");expect(a).toBe("https://example.com/adobe/assets/urn:aaid:aem:1234567890/as/test.webp?quality=80")}),test("should try generate aem assets optimized url with crop",()=>{const t=i("https://example.com/adobe/assets/urn:aaid:aem:1234567890","test",{quality:80,format:"webp",crop:{xOrigin:0,yOrigin:0,width:100,height:100}});expect(t).toBe("https://example.com/adobe/assets/urn:aaid:aem:1234567890/as/test.webp?quality=80&crop=0p%2C0p%2C100p%2C100p")}),test("should return original url if aem assets is disabled",()=>{r.mockReturnValueOnce(!1);const e="https://example.com/adobe/assets/urn:aaid:aem:1234567890",t=i(e,"test",{quality:80,format:"webp"});expect(t).toBe(e)}),test("should return original url if url is not aem assets url",()=>{const e="https://example.com/image.jpg",t=i(e,"test",{quality:80,format:"webp"});expect(t).toBe(e)}),test("should make aem assets image slot",()=>{const e=c({alias:"test",params:{},imageProps:{src:"https://example.com/adobe/assets/urn:aaid:aem:1234567890"}}),s=document.createElement("div");e({replaceWith:a=>{s.appendChild(a)}})}),test("should try render aem assets image",()=>{const e=document.createElement("div");p({replaceWith:t=>{e.appendChild(t)}},{alias:"test",params:{},imageProps:{src:"https://example.com/adobe/assets/urn:aaid:aem:1234567890"}})}),test("should render default image if aem assets is disabled",()=>{r.mockReturnValueOnce(!1);const e=document.createElement("div");p({replaceWith:t=>{e.appendChild(t)}},{alias:"test",params:{},imageProps:{src:"https://example.com/adobe/assets/urn:aaid:aem:1234567890"}})}),test("should render default image if url is not aem assets url",()=>{const e=document.createElement("div");p({replaceWith:t=>{e.appendChild(t)}},{alias:"test",params:{},imageProps:{src:"https://example.com/image.jpg"}})})});
|
|
4
|
-
//# sourceMappingURL=assets.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"assets.test.js","sources":["/@dropins/tools/src/lib/aem/assets.test.ts"],"sourcesContent":["import {\n isAemAssetsEnabled,\n getDefaultAemAssetsOptimizationParams,\n isAemAssetsUrl,\n generateAemAssetsOptimizedUrl,\n tryGenerateAemAssetsOptimizedUrl,\n makeAemAssetsImageSlot,\n tryRenderAemAssetsImage,\n} from './assets';\n\nimport { getConfigValue } from './configs';\n\n// Mock the config\njest.mock('./configs', () => ({\n getConfigValue: jest.fn().mockImplementation((key: string) => {\n if (key === 'commerce-assets-enabled') {\n return true;\n }\n return undefined;\n }),\n}));\n\n// Mock window.location\nObject.defineProperty(window, 'location', {\nvalue: {\n pathname: '/',\n origin: 'https://example.com',\n protocol: 'https:',\n},\n});\n\ndescribe('AEM Assets', () => {\n beforeEach(() => {\n jest.clearAllMocks();\n });\n\n test('should be enabled', () => {\n expect(isAemAssetsEnabled()).toBe(true);\n\n (getConfigValue as jest.Mock).mockReturnValueOnce('true');\n expect(isAemAssetsEnabled()).toBe(true);\n });\n\n test('should be disabled', () => {\n (getConfigValue as jest.Mock).mockReturnValueOnce(false);\n expect(isAemAssetsEnabled()).toBe(false);\n });\n\n test('should return default optimization params', () => {\n const params = getDefaultAemAssetsOptimizationParams();\n expect(params).toEqual({\n quality: 80,\n format: 'webp',\n });\n });\n\n test('should return true if url is aem assets url', () => {\n const url = 'https://example.com/adobe/assets/urn:aaid:aem:1234567890';\n expect(isAemAssetsUrl(url)).toBe(true);\n });\n\n test('should return false if url is not aem assets url', () => {\n const url = 'https://example.com/image.jpg';\n expect(isAemAssetsUrl(url)).toBe(false);\n });\n\n test('should return true if url is aem assets url with protocol relative path', () => {\n const url = '//example.com/adobe/assets/urn:aaid:aem:1234567890';\n expect(isAemAssetsUrl(url)).toBe(true);\n });\n\n test('should generate aem assets optimized url', () => {\n const url = 'https://example.com/adobe/assets/urn:aaid:aem:1234567890';\n const alias = 'test';\n const params = {\n quality: 80,\n format: 'webp',\n };\n const optimizedUrl = generateAemAssetsOptimizedUrl(url, alias, params);\n expect(optimizedUrl).toBe('https://example.com/adobe/assets/urn:aaid:aem:1234567890/as/test.webp?quality=80');\n });\n\n test('should generate aem assets optimized url with default params', () => {\n const url = 'https://example.com/adobe/assets/urn:aaid:aem:1234567890';\n const alias = 'test';\n const optimizedUrl = generateAemAssetsOptimizedUrl(url, alias);\n expect(optimizedUrl).toBe('https://example.com/adobe/assets/urn:aaid:aem:1234567890/as/test.webp?quality=80');\n });\n\n test('should generate aem assets optimized url with crop', () => {\n const url = 'https://example.com/adobe/assets/urn:aaid:aem:1234567890';\n const alias = 'test';\n const params = {\n quality: 80,\n format: 'webp',\n crop: {\n xOrigin: 0,\n yOrigin: 0,\n },\n };\n const optimizedUrl = generateAemAssetsOptimizedUrl(url, alias, params);\n expect(optimizedUrl).toBe('https://example.com/adobe/assets/urn:aaid:aem:1234567890/as/test.webp?quality=80&crop=0p%2C0p%2C100p%2C100p');\n });\n\n test('should generate aem assets optimized url with size', () => {\n const url = 'https://example.com/adobe/assets/urn:aaid:aem:1234567890';\n const alias = 'test';\n const params = {\n quality: 80,\n format: 'webp',\n size: {\n width: 100,\n height: 100,\n },\n };\n const optimizedUrl = generateAemAssetsOptimizedUrl(url, alias, params);\n expect(optimizedUrl).toBe('https://example.com/adobe/assets/urn:aaid:aem:1234567890/as/test.webp?quality=80&size=100%2C100');\n });\n\n test('should generate aem assets optimized url with width and height', () => {\n const url = 'https://example.com/adobe/assets/urn:aaid:aem:1234567890';\n const alias = 'test';\n const params = {\n quality: 80,\n format: 'webp',\n width: 100,\n height: 100,\n };\n const optimizedUrl = generateAemAssetsOptimizedUrl(url, alias, params);\n expect(optimizedUrl).toBe('https://example.com/adobe/assets/urn:aaid:aem:1234567890/as/test.webp?quality=80&width=100&height=100');\n });\n\n test('should try generate aem assets optimized url', () => {\n const url = 'https://example.com/adobe/assets/urn:aaid:aem:1234567890';\n const alias = 'test';\n const params = {\n quality: 80,\n format: 'webp',\n width: 100,\n height: 100,\n };\n const optimizedUrl = tryGenerateAemAssetsOptimizedUrl(url, alias, params);\n expect(optimizedUrl).toBe('https://example.com/adobe/assets/urn:aaid:aem:1234567890/as/test.webp?quality=80&width=100&height=100');\n });\n\n test('should try generate aem assets optimized url with default params', () => {\n const url = 'https://example.com/adobe/assets/urn:aaid:aem:1234567890';\n const alias = 'test';\n const optimizedUrl = tryGenerateAemAssetsOptimizedUrl(url, alias);\n expect(optimizedUrl).toBe('https://example.com/adobe/assets/urn:aaid:aem:1234567890/as/test.webp?quality=80');\n });\n\n test('should try generate aem assets optimized url with crop', () => {\n const url = 'https://example.com/adobe/assets/urn:aaid:aem:1234567890';\n const alias = 'test';\n const params = {\n quality: 80,\n format: 'webp',\n crop: {\n xOrigin: 0,\n yOrigin: 0,\n width: 100,\n height: 100,\n },\n };\n const optimizedUrl = tryGenerateAemAssetsOptimizedUrl(url, alias, params);\n expect(optimizedUrl).toBe('https://example.com/adobe/assets/urn:aaid:aem:1234567890/as/test.webp?quality=80&crop=0p%2C0p%2C100p%2C100p');\n }); \n\n test('should return original url if aem assets is disabled', () => {\n (getConfigValue as jest.Mock).mockReturnValueOnce(false);\n const url = 'https://example.com/adobe/assets/urn:aaid:aem:1234567890';\n const alias = 'test';\n const params = {\n quality: 80,\n format: 'webp',\n };\n const optimizedUrl = tryGenerateAemAssetsOptimizedUrl(url, alias, params); \n expect(optimizedUrl).toBe(url);\n });\n\n test('should return original url if url is not aem assets url', () => {\n const url = 'https://example.com/image.jpg';\n const alias = 'test';\n const params = {\n quality: 80,\n format: 'webp',\n };\n const optimizedUrl = tryGenerateAemAssetsOptimizedUrl(url, alias, params);\n expect(optimizedUrl).toBe(url);\n });\n\n test('should make aem assets image slot', () => {\n const slot = makeAemAssetsImageSlot({\n alias: 'test',\n params: {},\n imageProps: {\n src: 'https://example.com/adobe/assets/urn:aaid:aem:1234567890',\n },\n });\n const container = document.createElement('div');\n slot({ replaceWith: (element: HTMLElement) => {\n container.appendChild(element);\n } });\n });\n\n test('should try render aem assets image', () => {\n const container = document.createElement('div');\n const ctx = {\n replaceWith: (element: HTMLElement) => {\n container.appendChild(element);\n },\n };\n const config = {\n alias: 'test',\n params: {},\n imageProps: {\n src: 'https://example.com/adobe/assets/urn:aaid:aem:1234567890',\n },\n };\n tryRenderAemAssetsImage(ctx, config);\n });\n\n test('should render default image if aem assets is disabled', () => {\n (getConfigValue as jest.Mock).mockReturnValueOnce(false);\n const container = document.createElement('div');\n const ctx = {\n replaceWith: (element: HTMLElement) => {\n container.appendChild(element);\n },\n };\n const config = {\n alias: 'test',\n params: {},\n imageProps: {\n src: 'https://example.com/adobe/assets/urn:aaid:aem:1234567890',\n },\n };\n tryRenderAemAssetsImage(ctx, config);\n });\n\n test('should render default image if url is not aem assets url', () => {\n const container = document.createElement('div');\n const ctx = {\n replaceWith: (element: HTMLElement) => {\n container.appendChild(element);\n },\n };\n const config = {\n alias: 'test',\n params: {},\n imageProps: {\n src: 'https://example.com/image.jpg',\n },\n };\n tryRenderAemAssetsImage(ctx, config);\n });\n});"],"names":["key","isAemAssetsEnabled","getConfigValue","params","getDefaultAemAssetsOptimizationParams","isAemAssetsUrl","optimizedUrl","generateAemAssetsOptimizedUrl","tryGenerateAemAssetsOptimizedUrl","url","slot","makeAemAssetsImageSlot","container","element","tryRenderAemAssetsImage"],"mappings":"qkBAaA,KAAK,KAAK,YAAa,KAAO,CAC5B,eAAgB,KAAK,GAAK,EAAA,mBAAoBA,GAAgB,CAC5D,GAAIA,IAAQ,0BACH,MAAA,EAGV,CAAA,CACH,EAAE,EAGF,OAAO,eAAe,OAAQ,WAAY,CAC1C,MAAO,CACH,SAAU,IACV,OAAQ,sBACR,SAAU,QAAA,CAEd,CAAC,EAED,SAAS,aAAc,IAAM,CAC3B,WAAW,IAAM,CACf,KAAK,cAAc,CAAA,CACpB,EAED,KAAK,oBAAqB,IAAM,CAC9B,OAAOC,EAAmB,CAAC,EAAE,KAAK,EAAI,EAErCC,EAA6B,oBAAoB,MAAM,EACxD,OAAOD,EAAmB,CAAC,EAAE,KAAK,EAAI,CAAA,CACvC,EAED,KAAK,qBAAsB,IAAM,CAC9BC,EAA6B,oBAAoB,EAAK,EACvD,OAAOD,EAAmB,CAAC,EAAE,KAAK,EAAK,CAAA,CACxC,EAED,KAAK,4CAA6C,IAAM,CACtD,MAAME,EAASC,EAAsC,EAC9C,OAAAD,CAAM,EAAE,QAAQ,CACrB,QAAS,GACT,OAAQ,MAAA,CACT,CAAA,CACF,EAED,KAAK,8CAA+C,IAAM,CAExD,OAAOE,EADK,0DACa,CAAC,EAAE,KAAK,EAAI,CAAA,CACtC,EAED,KAAK,mDAAoD,IAAM,CAE7D,OAAOA,EADK,+BACa,CAAC,EAAE,KAAK,EAAK,CAAA,CACvC,EAED,KAAK,0EAA2E,IAAM,CAEpF,OAAOA,EADK,oDACa,CAAC,EAAE,KAAK,EAAI,CAAA,CACtC,EAED,KAAK,2CAA4C,IAAM,CAOrD,MAAMC,EAAeC,EANT,2DACE,OACC,CACb,QAAS,GACT,OAAQ,MACV,CACqE,EAC9D,OAAAD,CAAY,EAAE,KAAK,kFAAkF,CAAA,CAC7G,EAED,KAAK,+DAAgE,IAAM,CAGnE,MAAAA,EAAeC,EAFT,2DACE,MAC+C,EACtD,OAAAD,CAAY,EAAE,KAAK,kFAAkF,CAAA,CAC7G,EAED,KAAK,qDAAsD,IAAM,CAW/D,MAAMA,EAAeC,EAVT,2DACE,OACC,CACb,QAAS,GACT,OAAQ,OACR,KAAM,CACJ,QAAS,EACT,QAAS,CAAA,CAEb,CACqE,EAC9D,OAAAD,CAAY,EAAE,KAAK,6GAA6G,CAAA,CACxI,EAED,KAAK,qDAAsD,IAAM,CAW/D,MAAMA,EAAeC,EAVT,2DACE,OACC,CACb,QAAS,GACT,OAAQ,OACR,KAAM,CACJ,MAAO,IACP,OAAQ,GAAA,CAEZ,CACqE,EAC9D,OAAAD,CAAY,EAAE,KAAK,iGAAiG,CAAA,CAC5H,EAED,KAAK,iEAAkE,IAAM,CAS3E,MAAMA,EAAeC,EART,2DACE,OACC,CACb,QAAS,GACT,OAAQ,OACR,MAAO,IACP,OAAQ,GACV,CACqE,EAC9D,OAAAD,CAAY,EAAE,KAAK,uGAAuG,CAAA,CAClI,EAED,KAAK,+CAAgD,IAAM,CASzD,MAAMA,EAAeE,EART,2DACE,OACC,CACb,QAAS,GACT,OAAQ,OACR,MAAO,IACP,OAAQ,GACV,CACwE,EACjE,OAAAF,CAAY,EAAE,KAAK,uGAAuG,CAAA,CAClI,EAED,KAAK,mEAAoE,IAAM,CAGvE,MAAAA,EAAeE,EAFT,2DACE,MACkD,EACzD,OAAAF,CAAY,EAAE,KAAK,kFAAkF,CAAA,CAC7G,EAED,KAAK,yDAA0D,IAAM,CAanE,MAAMA,EAAeE,EAZT,2DACE,OACC,CACb,QAAS,GACT,OAAQ,OACR,KAAM,CACJ,QAAS,EACT,QAAS,EACT,MAAO,IACP,OAAQ,GAAA,CAEZ,CACwE,EACjE,OAAAF,CAAY,EAAE,KAAK,6GAA6G,CAAA,CACxI,EAED,KAAK,uDAAwD,IAAM,CAChEJ,EAA6B,oBAAoB,EAAK,EACvD,MAAMO,EAAM,2DAMNH,EAAeE,EAAiCC,EALxC,OACC,CACb,QAAS,GACT,OAAQ,MACV,CACwE,EACjE,OAAAH,CAAY,EAAE,KAAKG,CAAG,CAAA,CAC9B,EAED,KAAK,0DAA2D,IAAM,CACpE,MAAMA,EAAM,gCAMNH,EAAeE,EAAiCC,EALxC,OACC,CACb,QAAS,GACT,OAAQ,MACV,CACwE,EACjE,OAAAH,CAAY,EAAE,KAAKG,CAAG,CAAA,CAC9B,EAED,KAAK,oCAAqC,IAAM,CAC9C,MAAMC,EAAOC,EAAuB,CAClC,MAAO,OACP,OAAQ,CAAC,EACT,WAAY,CACV,IAAK,0DAAA,CACP,CACD,EACKC,EAAY,SAAS,cAAc,KAAK,EACzCF,EAAA,CAAE,YAAcG,GAAyB,CAC5CD,EAAU,YAAYC,CAAO,CAAA,EAC5B,CAAA,CACJ,EAED,KAAK,qCAAsC,IAAM,CACzC,MAAAD,EAAY,SAAS,cAAc,KAAK,EAa9CE,EAZY,CACV,YAAcD,GAAyB,CACrCD,EAAU,YAAYC,CAAO,CAAA,CAEjC,EACe,CACb,MAAO,OACP,OAAQ,CAAC,EACT,WAAY,CACV,IAAK,0DAAA,CAET,CACmC,CAAA,CACpC,EAED,KAAK,wDAAyD,IAAM,CACjEX,EAA6B,oBAAoB,EAAK,EACjD,MAAAU,EAAY,SAAS,cAAc,KAAK,EAa9CE,EAZY,CACV,YAAcD,GAAyB,CACrCD,EAAU,YAAYC,CAAO,CAAA,CAEjC,EACe,CACb,MAAO,OACP,OAAQ,CAAC,EACT,WAAY,CACV,IAAK,0DAAA,CAET,CACmC,CAAA,CACpC,EAED,KAAK,2DAA4D,IAAM,CAC/D,MAAAD,EAAY,SAAS,cAAc,KAAK,EAa9CE,EAZY,CACV,YAAcD,GAAyB,CACrCD,EAAU,YAAYC,CAAO,CAAA,CAEjC,EACe,CACb,MAAO,OACP,OAAQ,CAAC,EACT,WAAY,CACV,IAAK,+BAAA,CAET,CACmC,CAAA,CACpC,CACH,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from '../../types/elsie/src/lib/aem/configs.test'
|
package/lib/aem/configs.test.js
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
/*! Copyright 2025 Adobe
|
|
2
|
-
All Rights Reserved. */
|
|
3
|
-
import{initializeConfig as o,getConfigValue as s,getRootPath as n,getListOfRootPaths as c,isMultistore as u,getHeaders as a,resetConfig as f}from"./configs.js";import"../../chunks/cjs.js";import"../../chunks/get-path-value.js";describe("AEM Config",()=>{const t={public:{default:{headers:{all:{"x-test":"test"},commerce:{"x-commerce":"commerce"}}}}};beforeEach(()=>{i("/"),f()}),afterEach(()=>{jest.clearAllMocks(),jest.restoreAllMocks()}),test("should initialize config (default)",()=>{const e={public:{default:{foo:"bar"}}},l=o(e);expect(l).toEqual(e.public.default)}),test("should initialize config with default config if root path is not found",()=>{i("/not-found/");const e=o(t);expect(e).toEqual(t.public.default)}),test("should initialize config with default config if root path is empty",()=>{i("/sub-path/");const e=o({...t,public:{...t.public,"/sub-path/":{}}});expect(e).toEqual(t.public.default)}),test("should initialize config with overrides if root path is not empty",()=>{i("/sub-path/");const e=o({...t,public:{...t.public,"/sub-path/":{headers:{all:{"x-test":"test2"}}}}});expect(e).toEqual({headers:{all:{"x-test":"test2"},commerce:{"x-commerce":"commerce"}}})}),test("should throw error if no config is initialized",async()=>{expect(()=>s("foo")).toThrow("Configuration not initialized. Call initializeConfig() first.")}),test("should get config value",async()=>{o({public:{default:{foo:"bar"}}}),expect(s("foo")).toBe("bar")}),test("should get config value from root path",()=>{i("/sub-path/"),o({...t,public:{...t.public,"/sub-path/":{foo:"baz",nested:{foo:"nested"}}}}),expect(s("headers.all.x-test")).toBe("test"),expect(s("foo")).toBe("baz"),expect(s("nested.foo")).toBe("nested")}),test("should warn if value is not found",async()=>{const e=jest.spyOn(console,"warn").mockImplementation(()=>{});o(t),s("foo.bar"),expect(e).toHaveBeenCalledWith("Property foo.bar does not exist in the object")}),test("should warn if the root path has no config",async()=>{const e=jest.spyOn(console,"warn").mockImplementation(()=>{}),l=n(null);expect(l).toBe("/"),expect(e).toHaveBeenCalledWith("No config found. Please call initializeConfig() first.")}),test("should warn if the root path is not found",async()=>{i("/no-found/");const e=n({public:{default:{}}});expect(e).toBe("/")}),test("should get default root path",async()=>{i("/path/"),o(t),expect(n()).toBe("/")}),test("should get root path from public config",async()=>{i("/test/"),o({...t,public:{...t.public,"/test/":{}}}),expect(n()).toBe("/test/")}),test("should get list of root paths",async()=>{o({...t,public:{...t.public,"/test/":{},"/test2/":{}}}),expect(c()).toEqual(["/test/","/test2/"])}),test("should warn if list of root paths has no config",async()=>{const e=jest.spyOn(console,"warn").mockImplementation(()=>{}),l=c();expect(e).toHaveBeenCalledWith("No config found. Please call initializeConfig() first."),expect(l).toEqual([])}),test("should check if multistore",async()=>{o(t),expect(u()).toBe(!1),o({...t,public:{...t.public,"/test/":{}}}),expect(u()).toBe(!0)}),test("should throw error if headers are not initialized",async()=>{expect(()=>a("all")).toThrow("Configuration not initialized. Call initializeConfig() first.")}),test("should get headers",async()=>{o(t),expect(a("all")).toEqual(t.public.default.headers.all),expect(a("commerce")).toEqual({...t.public.default.headers.all,...t.public.default.headers.commerce})}),test('should get "all" headers if no config is found',async()=>{o(t),expect(a("not-found")).toEqual({...t.public.default.headers.all})}),test("should get empty headers if no config is found",async()=>{o({public:{default:{}}}),expect(a("not-found")).toEqual({})})});function i(t){Object.defineProperty(window,"location",{value:{pathname:t,origin:"http://localhost"}})}
|
|
4
|
-
//# sourceMappingURL=configs.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"configs.test.js","sources":["/@dropins/tools/src/lib/aem/configs.test.ts"],"sourcesContent":["import {\n resetConfig,\n getRootPath,\n getListOfRootPaths,\n isMultistore,\n getConfigValue,\n getHeaders,\n initializeConfig,\n} from './configs';\n\ndescribe('AEM Config', () => {\n const mockConfig = {\n public: {\n default: {\n headers: {\n all: {\n 'x-test': 'test',\n },\n commerce: {\n 'x-commerce': 'commerce',\n },\n },\n },\n },\n };\n\n beforeEach(() => {\n mockLocation('/');\n resetConfig();\n });\n\n afterEach(() => {\n jest.clearAllMocks();\n jest.restoreAllMocks();\n });\n\n test('should initialize config (default)', () => {\n const mockConfig = {\n public: {\n default: {\n foo: 'bar',\n },\n },\n };\n\n const rootConfig = initializeConfig(mockConfig);\n\n // Test config value retrieval\n expect(rootConfig).toEqual(mockConfig.public.default);\n });\n\n test('should initialize config with default config if root path is not found', () => {\n mockLocation('/not-found/');\n\n const rootConfig = initializeConfig(mockConfig);\n\n // Test config value retrieval\n expect(rootConfig).toEqual(mockConfig.public.default);\n });\n\n test('should initialize config with default config if root path is empty', () => {\n mockLocation('/sub-path/');\n\n const rootConfig = initializeConfig({\n ...mockConfig,\n public: {\n ...mockConfig.public,\n '/sub-path/': {},\n },\n });\n\n // Test config value retrieval\n expect(rootConfig).toEqual(mockConfig.public.default);\n });\n\n test('should initialize config with overrides if root path is not empty', () => {\n mockLocation('/sub-path/');\n\n const rootConfig = initializeConfig({\n ...mockConfig,\n public: {\n ...mockConfig.public,\n '/sub-path/': {\n headers: {\n all: {\n 'x-test': 'test2',\n },\n },\n },\n },\n });\n\n // Test config value retrieval\n expect(rootConfig).toEqual({\n headers: {\n all: {\n 'x-test': 'test2',\n },\n commerce: {\n 'x-commerce': 'commerce',\n },\n },\n });\n });\n\n test('should throw error if no config is initialized', async () => {\n expect(() => getConfigValue('foo')).toThrow(\n 'Configuration not initialized. Call initializeConfig() first.'\n );\n });\n\n test('should get config value', async () => {\n initializeConfig({\n public: {\n default: {\n foo: 'bar',\n },\n },\n });\n\n expect(getConfigValue('foo')).toBe('bar');\n });\n\n test('should get config value from root path', () => {\n mockLocation('/sub-path/');\n\n initializeConfig({\n ...mockConfig,\n public: {\n ...mockConfig.public,\n '/sub-path/': {\n foo: 'baz',\n nested: {\n foo: 'nested',\n },\n },\n },\n });\n\n expect(getConfigValue('headers.all.x-test')).toBe('test');\n expect(getConfigValue('foo')).toBe('baz');\n expect(getConfigValue('nested.foo')).toBe('nested');\n });\n\n test('should warn if value is not found', async () => {\n const consoleSpy = jest.spyOn(console, 'warn').mockImplementation(() => {});\n initializeConfig(mockConfig);\n\n getConfigValue('foo.bar');\n\n expect(consoleSpy).toHaveBeenCalledWith(\n 'Property foo.bar does not exist in the object'\n );\n });\n\n test('should warn if the root path has no config', async () => {\n const consoleSpy = jest.spyOn(console, 'warn').mockImplementation(() => {});\n\n const rootPath = getRootPath(null);\n\n expect(rootPath).toBe('/');\n\n expect(consoleSpy).toHaveBeenCalledWith(\n 'No config found. Please call initializeConfig() first.'\n );\n });\n\n test('should warn if the root path is not found', async () => {\n mockLocation('/no-found/');\n\n const rootPath = getRootPath({\n public: {\n default: {},\n },\n });\n\n expect(rootPath).toBe('/');\n });\n\n test('should get default root path', async () => {\n mockLocation('/path/');\n\n initializeConfig(mockConfig);\n\n expect(getRootPath()).toBe('/');\n });\n\n test('should get root path from public config', async () => {\n mockLocation('/test/');\n\n initializeConfig({\n ...mockConfig,\n public: {\n ...mockConfig.public,\n '/test/': {},\n },\n });\n\n expect(getRootPath()).toBe('/test/');\n });\n\n test('should get list of root paths', async () => {\n initializeConfig({\n ...mockConfig,\n public: {\n ...mockConfig.public,\n '/test/': {},\n '/test2/': {},\n },\n });\n\n expect(getListOfRootPaths()).toEqual(['/test/', '/test2/']);\n });\n\n test('should warn if list of root paths has no config', async () => {\n const consoleSpy = jest.spyOn(console, 'warn').mockImplementation(() => {});\n\n const rootPaths = getListOfRootPaths();\n\n expect(consoleSpy).toHaveBeenCalledWith(\n 'No config found. Please call initializeConfig() first.'\n );\n\n expect(rootPaths).toEqual([]);\n });\n\n test('should check if multistore', async () => {\n initializeConfig(mockConfig);\n\n expect(isMultistore()).toBe(false);\n\n initializeConfig({\n ...mockConfig,\n public: {\n ...mockConfig.public,\n '/test/': {},\n },\n });\n\n expect(isMultistore()).toBe(true);\n });\n\n test('should throw error if headers are not initialized', async () => {\n expect(() => getHeaders('all')).toThrow(\n 'Configuration not initialized. Call initializeConfig() first.'\n );\n });\n\n test('should get headers', async () => {\n initializeConfig(mockConfig);\n\n // All headers\n expect(getHeaders('all')).toEqual(mockConfig.public.default.headers.all);\n expect(getHeaders('commerce')).toEqual({\n ...mockConfig.public.default.headers.all,\n ...mockConfig.public.default.headers.commerce,\n });\n });\n\n test('should get \"all\" headers if no config is found', async () => {\n initializeConfig(mockConfig);\n\n expect(getHeaders('not-found')).toEqual({\n ...mockConfig.public.default.headers.all,\n });\n });\n\n test('should get empty headers if no config is found', async () => {\n initializeConfig({\n public: {\n default: {},\n },\n });\n\n expect(getHeaders('not-found')).toEqual({});\n });\n});\n\nfunction mockLocation(pathname: string) {\n Object.defineProperty(window, 'location', {\n value: {\n pathname,\n origin: 'http://localhost',\n },\n });\n}\n"],"names":["mockConfig","mockLocation","resetConfig","rootConfig","initializeConfig","getConfigValue","consoleSpy","rootPath","getRootPath","getListOfRootPaths","rootPaths","isMultistore","getHeaders","pathname"],"mappings":"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"}
|