From 62dfa1aa057a11c96d774dd26f2bff5c4433f420 Mon Sep 17 00:00:00 2001 From: Ketaki Deshwandikar Date: Thu, 18 Dec 2025 11:30:05 +0530 Subject: [PATCH 1/7] brokenlink details in SEO --- libs/blocks/preflight/checks/seo.js | 74 +++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/libs/blocks/preflight/checks/seo.js b/libs/blocks/preflight/checks/seo.js index b1294933ded..f0a9ff29f2c 100644 --- a/libs/blocks/preflight/checks/seo.js +++ b/libs/blocks/preflight/checks/seo.js @@ -262,11 +262,71 @@ function compareResults(result, link) { return true; } +//helper functions for SEO checks +export function getElementPosition(element) { + if (element.closest('header nav')) return 'NAV'; + if (element.closest('footer')) return 'FOOTER'; + if (element.closest('main')) return 'CONTENT'; + return 'OTHER'; +} + +export function getTagType(element) { + if (element.tagName === 'A') return 'Anchor'; + if (element.tagName === 'IMG') return 'Image'; + if (element.tagName === 'IFRAME') return 'IFrame'; + return element.tagName; +} + +export function isElementVisible(element) { + const style = window.getComputedStyle(element); + return style.display !== 'none' && + style.visibility !== 'hidden' && + style.opacity !== '0'; +} + +export function extractLocaleFromUrl(url) { + const match = url.match(/\/([a-z]{2}_[a-z]{2})\//i); + return match ? match[1] : 'en_us'; +} + +/*export async function validLinkFilter(area = document, envName = null) { + const { preflight } = await getServiceConfig(window.location.origin, envName); + const knownBadUrls = preflight?.ignoreDomains + ? preflight?.ignoreDomains.split(',').map((url) => url.trim()) + : KNOWN_BAD_URLS; + const links = [...area.querySelectorAll('a')] + .filter((link) => { + if ( + link.href + // Added extra checks because Spidy misidentifies these URL schemes as faulty. + // Can be removed once we stop using Spidy. + && !link.href.includes('tel:') + && !link.href.includes('mailto:') + && !link.href.startsWith('#') + && !link.href.startsWith('https://#') + && !link.href.includes('bookmark://') + && !link.href.includes('local') + && !link.closest('.preflight') + && !knownBadUrls.some((url) => url === link.hostname) + ) { + link.liveHref = link.href; + if (link.href.includes('hlx.page')) link.liveHref = link.href.replace('hlx.page', 'hlx.live'); + if (link.href.includes('aem.page')) link.liveHref = link.href.replace('aem.page', 'aem.live'); + return true; + } + return false; + }); + return links; +}*/ export async function validLinkFilter(area = document, envName = null) { const { preflight } = await getServiceConfig(window.location.origin, envName); const knownBadUrls = preflight?.ignoreDomains ? preflight?.ignoreDomains.split(',').map((url) => url.trim()) : KNOWN_BAD_URLS; + + const sourceUrl = window.location.href; + const locale = extractLocaleFromUrl(sourceUrl); + const links = [...area.querySelectorAll('a')] .filter((link) => { if ( @@ -288,7 +348,21 @@ export async function validLinkFilter(area = document, envName = null) { return true; } return false; + }) + .map((link) => { + // Add broken link report metadata to each link + return { + ...link, + sourceUrl, + locale, + brokenLink: link.liveHref || link.href, + tagType: getTagType(link), + position: getElementPosition(link), + linkTextOrImgAlt: link.textContent?.trim() || link.alt || link.title || '', + visibility: isElementVisible(link), + }; }); + return links; } From a0c00aad98b9b33dcd0ab1944cd521a48fb2aab5 Mon Sep 17 00:00:00 2001 From: Ketaki Deshwandikar Date: Thu, 18 Dec 2025 16:27:38 +0530 Subject: [PATCH 2/7] SEO report details --- libs/blocks/preflight/checks/seo.js | 54 +++-------------------------- 1 file changed, 5 insertions(+), 49 deletions(-) diff --git a/libs/blocks/preflight/checks/seo.js b/libs/blocks/preflight/checks/seo.js index f0a9ff29f2c..f4fde34474e 100644 --- a/libs/blocks/preflight/checks/seo.js +++ b/libs/blocks/preflight/checks/seo.js @@ -284,49 +284,13 @@ export function isElementVisible(element) { style.opacity !== '0'; } -export function extractLocaleFromUrl(url) { - const match = url.match(/\/([a-z]{2}_[a-z]{2})\//i); - return match ? match[1] : 'en_us'; -} -/*export async function validLinkFilter(area = document, envName = null) { - const { preflight } = await getServiceConfig(window.location.origin, envName); - const knownBadUrls = preflight?.ignoreDomains - ? preflight?.ignoreDomains.split(',').map((url) => url.trim()) - : KNOWN_BAD_URLS; - const links = [...area.querySelectorAll('a')] - .filter((link) => { - if ( - link.href - // Added extra checks because Spidy misidentifies these URL schemes as faulty. - // Can be removed once we stop using Spidy. - && !link.href.includes('tel:') - && !link.href.includes('mailto:') - && !link.href.startsWith('#') - && !link.href.startsWith('https://#') - && !link.href.includes('bookmark://') - && !link.href.includes('local') - && !link.closest('.preflight') - && !knownBadUrls.some((url) => url === link.hostname) - ) { - link.liveHref = link.href; - if (link.href.includes('hlx.page')) link.liveHref = link.href.replace('hlx.page', 'hlx.live'); - if (link.href.includes('aem.page')) link.liveHref = link.href.replace('aem.page', 'aem.live'); - return true; - } - return false; - }); - return links; -}*/ export async function validLinkFilter(area = document, envName = null) { const { preflight } = await getServiceConfig(window.location.origin, envName); const knownBadUrls = preflight?.ignoreDomains ? preflight?.ignoreDomains.split(',').map((url) => url.trim()) : KNOWN_BAD_URLS; - const sourceUrl = window.location.href; - const locale = extractLocaleFromUrl(sourceUrl); - const links = [...area.querySelectorAll('a')] .filter((link) => { if ( @@ -350,20 +314,12 @@ export async function validLinkFilter(area = document, envName = null) { return false; }) .map((link) => { - // Add broken link report metadata to each link - return { - ...link, - sourceUrl, - locale, - brokenLink: link.liveHref || link.href, - tagType: getTagType(link), - position: getElementPosition(link), - linkTextOrImgAlt: link.textContent?.trim() || link.alt || link.title || '', - visibility: isElementVisible(link), - }; + link.tagType = getTagType(link); + link.position = getElementPosition(link); + link.linkTextOrImgAlt = link.textContent?.trim() || link.alt || link.title || ''; + link.visibility = isElementVisible(link); + return link; }); - - return links; } export async function checkLinks({ area, urlHash, envName }) { From abedbcef6d7282e436d576eb33e626f70d41718e Mon Sep 17 00:00:00 2001 From: Ketaki Deshwandikar Date: Thu, 18 Dec 2025 16:31:06 +0530 Subject: [PATCH 3/7] minor fix --- libs/blocks/preflight/checks/seo.js | 1 + 1 file changed, 1 insertion(+) diff --git a/libs/blocks/preflight/checks/seo.js b/libs/blocks/preflight/checks/seo.js index f4fde34474e..41f98498697 100644 --- a/libs/blocks/preflight/checks/seo.js +++ b/libs/blocks/preflight/checks/seo.js @@ -320,6 +320,7 @@ export async function validLinkFilter(area = document, envName = null) { link.visibility = isElementVisible(link); return link; }); + return links; } export async function checkLinks({ area, urlHash, envName }) { From fa51316ac8be6d921d0427301dfe2c1f770f27e9 Mon Sep 17 00:00:00 2001 From: Ketaki Deshwandikar Date: Thu, 18 Dec 2025 18:27:40 +0530 Subject: [PATCH 4/7] comment removal --- libs/blocks/preflight/checks/seo.js | 1 - 1 file changed, 1 deletion(-) diff --git a/libs/blocks/preflight/checks/seo.js b/libs/blocks/preflight/checks/seo.js index 41f98498697..0be5c866b51 100644 --- a/libs/blocks/preflight/checks/seo.js +++ b/libs/blocks/preflight/checks/seo.js @@ -262,7 +262,6 @@ function compareResults(result, link) { return true; } -//helper functions for SEO checks export function getElementPosition(element) { if (element.closest('header nav')) return 'NAV'; if (element.closest('footer')) return 'FOOTER'; From 1c6847b51494af3bbd066115c04fb1414598919a Mon Sep 17 00:00:00 2001 From: Ketaki Deshwandikar <2106ketaki@gmail.com> Date: Fri, 19 Dec 2025 10:53:45 +0530 Subject: [PATCH 5/7] Update seo.js --- libs/blocks/preflight/checks/seo.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/blocks/preflight/checks/seo.js b/libs/blocks/preflight/checks/seo.js index 0be5c866b51..b061bda35fb 100644 --- a/libs/blocks/preflight/checks/seo.js +++ b/libs/blocks/preflight/checks/seo.js @@ -319,7 +319,7 @@ export async function validLinkFilter(area = document, envName = null) { link.visibility = isElementVisible(link); return link; }); - return links; +return links; } export async function checkLinks({ area, urlHash, envName }) { From 4c3adef47ebef9fbf7a85b7150b3225dd3ede026 Mon Sep 17 00:00:00 2001 From: Ketaki Deshwandikar <2106ketaki@gmail.com> Date: Fri, 19 Dec 2025 10:57:35 +0530 Subject: [PATCH 6/7] Update seo.js --- libs/blocks/preflight/checks/seo.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/blocks/preflight/checks/seo.js b/libs/blocks/preflight/checks/seo.js index b061bda35fb..8e30b4937f9 100644 --- a/libs/blocks/preflight/checks/seo.js +++ b/libs/blocks/preflight/checks/seo.js @@ -319,7 +319,7 @@ export async function validLinkFilter(area = document, envName = null) { link.visibility = isElementVisible(link); return link; }); -return links; + return links; } export async function checkLinks({ area, urlHash, envName }) { From 882411fa0ee514f164fe9b0727fd6fc8afbf8394 Mon Sep 17 00:00:00 2001 From: Ketaki Deshwandikar Date: Fri, 19 Dec 2025 14:16:40 +0530 Subject: [PATCH 7/7] fix linting errors --- libs/blocks/preflight/checks/seo.js | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/libs/blocks/preflight/checks/seo.js b/libs/blocks/preflight/checks/seo.js index 0be5c866b51..6480e84286b 100644 --- a/libs/blocks/preflight/checks/seo.js +++ b/libs/blocks/preflight/checks/seo.js @@ -278,18 +278,17 @@ export function getTagType(element) { export function isElementVisible(element) { const style = window.getComputedStyle(element); - return style.display !== 'none' && - style.visibility !== 'hidden' && - style.opacity !== '0'; + return style.display !== 'none' + && style.visibility !== 'hidden' + && style.opacity !== '0'; } - export async function validLinkFilter(area = document, envName = null) { const { preflight } = await getServiceConfig(window.location.origin, envName); const knownBadUrls = preflight?.ignoreDomains ? preflight?.ignoreDomains.split(',').map((url) => url.trim()) : KNOWN_BAD_URLS; - + const links = [...area.querySelectorAll('a')] .filter((link) => { if ( @@ -317,9 +316,9 @@ export async function validLinkFilter(area = document, envName = null) { link.position = getElementPosition(link); link.linkTextOrImgAlt = link.textContent?.trim() || link.alt || link.title || ''; link.visibility = isElementVisible(link); - return link; + return link; }); - return links; + return links; } export async function checkLinks({ area, urlHash, envName }) {