From 4048627bfa3a22a92f3768bdbade3ecdd5365cf5 Mon Sep 17 00:00:00 2001 From: James Tsay Date: Tue, 14 Jul 2026 12:36:19 -0700 Subject: [PATCH 1/7] Parallel loading of dependent scripts --- libs/blocks/merch/merch.js | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/libs/blocks/merch/merch.js b/libs/blocks/merch/merch.js index 07946e22a6..3b4b57d7ad 100644 --- a/libs/blocks/merch/merch.js +++ b/libs/blocks/merch/merch.js @@ -1116,27 +1116,25 @@ export async function initService(force = false, attributes = {}) { }); initService.promise = initService.promise ?? polyfills().then(async () => { - await loadMasComponent(COMMERCE_LIBRARY); + const useGeoMarket = isMasGeoDetectionEnabled(); - // Load fragment-client.js when maslibs is present + // Load all independent resources in parallel const fragmentClientUrl = getFragmentClientUrl(); - if (fragmentClientUrl) { - const { loadScript: loadScriptUtil } = await import('../../utils/utils.js'); - try { - await loadScriptUtil(fragmentClientUrl, 'module'); - } catch (e) { - log?.error('Failed to load fragment-client.js:', e); - } - } + const [, , { language, locale, country }, validatedMarket] = await Promise.all([ + loadMasComponent(COMMERCE_LIBRARY), + fragmentClientUrl + ? loadScript(fragmentClientUrl, 'module').catch((e) => { + log?.error('Failed to load fragment-client.js:', e); + }) + : Promise.resolve(), + getLocaleSettings(miloLocale), + useGeoMarket + ? import('../../utils/market.js').then(({ getValidatedMarket }) => getValidatedMarket()) + : Promise.resolve(null), + ]); - const { language, locale, country } = await getLocaleSettings(miloLocale); - const useGeoMarket = isMasGeoDetectionEnabled(); let countryFromMarket = country; - if (useGeoMarket) { - const { getValidatedMarket } = await import('../../utils/market.js'); - const validatedMarket = await getValidatedMarket(); - if (validatedMarket) countryFromMarket = validatedMarket.toUpperCase(); - } + if (useGeoMarket && validatedMarket) countryFromMarket = validatedMarket.toUpperCase(); let service = document.head.querySelector('mas-commerce-service'); if (!service) { setPreview(attributes); From eecab24e564a4980f8654bc32a4c07c39c000f0d Mon Sep 17 00:00:00 2001 From: James Tsay Date: Wed, 15 Jul 2026 11:14:30 -0700 Subject: [PATCH 2/7] dynamic import mas-mep-utils.js --- libs/blocks/merch/merch.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/blocks/merch/merch.js b/libs/blocks/merch/merch.js index 3b4b57d7ad..1f5585d7b6 100644 --- a/libs/blocks/merch/merch.js +++ b/libs/blocks/merch/merch.js @@ -3,7 +3,6 @@ import { shouldAllowKrTrial, getCountry, } from '../../utils/utils.js'; import { replaceKey } from '../../features/placeholders.js'; -import { mepMasStudioUrls } from './mas-mep-utils.js'; // MAS Component Names export const COMMERCE_LIBRARY = 'commerce'; @@ -1621,6 +1620,7 @@ export default async function init(el) { // Rebuilt merch href keeps only the OSI; stash the original for // the "Edit OSI" badge. if (getConfig()?.mep?.preview) { + const { mepMasStudioUrls } = await import('./mas-mep-utils.js'); mepMasStudioUrls.set(merch, el.href); merch.dataset.masBlock = 'ost'; } From f0f88ec216e11d26142a7cc9fb31891230f13a80 Mon Sep 17 00:00:00 2001 From: James Tsay Date: Thu, 16 Jul 2026 14:07:43 -0700 Subject: [PATCH 3/7] Optimize merch-card-autoblock.js --- libs/blocks/merch-card-autoblock/merch-card-autoblock.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libs/blocks/merch-card-autoblock/merch-card-autoblock.js b/libs/blocks/merch-card-autoblock/merch-card-autoblock.js index 6aca7f4418..974ec5394a 100644 --- a/libs/blocks/merch-card-autoblock/merch-card-autoblock.js +++ b/libs/blocks/merch-card-autoblock/merch-card-autoblock.js @@ -1,7 +1,6 @@ import { createTag, getConfig } from '../../utils/utils.js'; import { decorateButtons, getBlockSize } from '../../utils/decorate.js'; import { postProcessAutoblock } from '../merch/autoblock.js'; -import { mepMasStudioUrls } from '../merch/mas-mep-utils.js'; import { initService, createAemFragment, @@ -152,6 +151,7 @@ export async function createCard(el, options) { const merchCard = createTag('merch-card', { consonant: '' }, aemFragment); // For the "Edit Card" mep preview badge. if (getConfig()?.mep?.preview) { + const { mepMasStudioUrls } = await import('../merch/mas-mep-utils.js'); mepMasStudioUrls.set(merchCard, el.href); merchCard.dataset.masBlock = 'card'; } @@ -176,6 +176,7 @@ async function createInline(el, options) { const aemFragment = createAemFragment(options, seenFragments); const masField = createTag('mas-field', { field: options.field }, aemFragment); if (getConfig()?.mep?.preview) { + const { mepMasStudioUrls } = await import('../merch/mas-mep-utils.js'); mepMasStudioUrls.set(masField, el.href); masField.dataset.masBlock = 'inline'; } From f135f3aaba73441aabc4917f5253fcf1e9789565 Mon Sep 17 00:00:00 2001 From: James Tsay Date: Thu, 16 Jul 2026 23:10:34 -0700 Subject: [PATCH 4/7] re: Axel's comment --- libs/blocks/merch/merch.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libs/blocks/merch/merch.js b/libs/blocks/merch/merch.js index 1f5585d7b6..b697cdc67b 100644 --- a/libs/blocks/merch/merch.js +++ b/libs/blocks/merch/merch.js @@ -1119,6 +1119,7 @@ export async function initService(force = false, attributes = {}) { // Load all independent resources in parallel const fragmentClientUrl = getFragmentClientUrl(); + const localeSettingsPromise = getLocaleSettings(miloLocale); const [, , { language, locale, country }, validatedMarket] = await Promise.all([ loadMasComponent(COMMERCE_LIBRARY), fragmentClientUrl @@ -1126,7 +1127,7 @@ export async function initService(force = false, attributes = {}) { log?.error('Failed to load fragment-client.js:', e); }) : Promise.resolve(), - getLocaleSettings(miloLocale), + localeSettingsPromise, useGeoMarket ? import('../../utils/market.js').then(({ getValidatedMarket }) => getValidatedMarket()) : Promise.resolve(null), From ee68042260eafd4a87402af03ccf93b96da6a94e Mon Sep 17 00:00:00 2001 From: James Tsay Date: Fri, 17 Jul 2026 11:20:47 -0700 Subject: [PATCH 5/7] Add static preloads hints --- libs/utils/utils.js | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/libs/utils/utils.js b/libs/utils/utils.js index fe7f90cb39..39e0097848 100644 --- a/libs/utils/utils.js +++ b/libs/utils/utils.js @@ -2670,6 +2670,24 @@ export function partition(arr, fn) { ); } +const STATIC_BLOCK_DEPS = { + 'merch-card-autoblock': [ + '/mas/libs/lit-all.min.js', + '/mas/libs/merch-card.js', + '/mas/libs/merch-quantity-select.js', + '/mas/libs/mas-field.js', + ], + merch: [ + '/mas/libs/commerce.js', + ], +}; + +const blockDeps = new Map(Object.entries(STATIC_BLOCK_DEPS)); + +export function registerBlockDeps(blockName, ...deps) { + blockDeps.set(blockName, deps); +} + const preloadBlockResources = (blocks = []) => blocks.map((block) => { if (block.classList.contains('hide-block')) return null; const { blockPath, hasStyles, name } = getBlockData(block); @@ -2677,6 +2695,9 @@ const preloadBlockResources = (blocks = []) => blocks.map((block) => { loadLink(`${getConfig().base}/utils/decorate.js`, { rel: 'preload', as: 'script', crossorigin: 'anonymous' }); } loadLink(`${blockPath}.js`, { rel: 'preload', as: 'script', crossorigin: 'anonymous' }); + (blockDeps.get(name) ?? []).forEach((dep) => { + if (typeof dep === 'string') loadLink(dep, { rel: 'preload', as: 'script', crossorigin: 'anonymous' }); + }); return hasStyles && new Promise((resolve) => { loadStyle(`${blockPath}.css`, resolve); }); }).filter(Boolean); From a3d3fb92e718e8b564219b685f02c0c4b029d539 Mon Sep 17 00:00:00 2001 From: James Tsay Date: Fri, 17 Jul 2026 12:31:38 -0700 Subject: [PATCH 6/7] Support lower environments --- libs/utils/utils.js | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/libs/utils/utils.js b/libs/utils/utils.js index 39e0097848..02d9d3ca1f 100644 --- a/libs/utils/utils.js +++ b/libs/utils/utils.js @@ -2670,15 +2670,34 @@ export function partition(arr, fn) { ); } +function getMasDepUrl(component) { + const { hostname } = window.location; + if (hostname === 'www.adobe.com') return `https://www.adobe.com/mas/libs/${component}`; + + const masLibs = new URLSearchParams(window.location.search).get('maslibs')?.trim().toLowerCase(); + if (masLibs) { + let baseUrl; + if (masLibs === 'local') baseUrl = 'http://localhost:3000'; + else if (masLibs === 'main') baseUrl = 'https://main--mas--adobecom.aem.live'; + else { + const branch = masLibs.includes('--') ? masLibs : `${masLibs}--mas--adobecom`; + baseUrl = `https://${branch}.aem.live`; + } + return `${baseUrl}/web-components/dist/${component}`; + } + + return `https://main--mas--adobecom.aem.live/web-components/dist/${component}`; +} + const STATIC_BLOCK_DEPS = { 'merch-card-autoblock': [ - '/mas/libs/lit-all.min.js', - '/mas/libs/merch-card.js', - '/mas/libs/merch-quantity-select.js', - '/mas/libs/mas-field.js', + getMasDepUrl('lit-all.min.js'), + getMasDepUrl('merch-card.js'), + getMasDepUrl('merch-quantity-select.js'), + getMasDepUrl('mas-field.js'), ], merch: [ - '/mas/libs/commerce.js', + getMasDepUrl('commerce.js'), ], }; From fa9d510c15b16d4d169ae27630319babf22c7e0b Mon Sep 17 00:00:00 2001 From: James Tsay Date: Mon, 20 Jul 2026 10:35:20 -0700 Subject: [PATCH 7/7] Fix config bleed --- test/blocks/merch-card-autoblock/merch-card-autoblock.test.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/blocks/merch-card-autoblock/merch-card-autoblock.test.js b/test/blocks/merch-card-autoblock/merch-card-autoblock.test.js index 4c5ec5a1cc..ec4fabf95a 100644 --- a/test/blocks/merch-card-autoblock/merch-card-autoblock.test.js +++ b/test/blocks/merch-card-autoblock/merch-card-autoblock.test.js @@ -331,6 +331,7 @@ describe('merch-card-autoblock autoblock', () => { }); it('decorates two CTAs in the same paragraph correctly when processed concurrently', async () => { + setConfig({ codeRoot: '/libs' }); const section = document.createElement('div'); const siblingBtn = document.createElement('a'); siblingBtn.classList.add('con-button', 'blue', 'button-l');