{"version":3,"file":"1342.d259f4676588fdd92fff.bundle.mjs","mappings":"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","sources":["webpack://socialUX/./ldDebugger/cwvChecklist/utils.js","webpack://socialUX/./ldDebugger/cwvChecklist/looseScripts.js","webpack://socialUX/./ldDebugger/cwvChecklist/nonLazyMedia.js","webpack://socialUX/./ldDebugger/cwvChecklist/dangerousLoadBlockingJavascript.js","webpack://socialUX/./ldDebugger/cwvChecklist/stylesChecker.js","webpack://socialUX/./ldDebugger/cwvChecklist/fonts.js","webpack://socialUX/./ldDebugger/cwvChecklist/loadedPosts.js","webpack://socialUX/./ldDebugger/cwvChecklist/index.js","webpack://socialUX/./ldDebugger/cwvChecklist/pageSize.js","webpack://socialUX/./ldDebugger/cwvChecklist/headersDebug.js"],"sourcesContent":["export function makeCheckListObject(title, priority, description, items, itemProperties) {\r\n    return { title, priority, description, items, itemProperties };\r\n}\r\n\r\nfunction dangerousTagName(tagName) {\r\n    return [`\\`${tagName}\\``, `\"${tagName}\"`, `'${tagName}'`, `<${tagName}`];\r\n}\r\n\r\nconst DANGEROUS_STRINGS = [\r\n    ...dangerousTagName(\"script\"),\r\n    ...dangerousTagName(\"link\"),\r\n    ...dangerousTagName(\"img\"),\r\n    ...dangerousTagName(\"iframe\"),\r\n    ...dangerousTagName(\"style\"),\r\n    \".createElement(\",\r\n    \"fetch(\",\r\n    \"loadExternalScript\",\r\n    \"loadExternalStylesheet\",\r\n    \"new XMLHttpRequest\",\r\n];\r\n\r\nexport function doesItIncludeDangerousCalls(textContent) {\r\n    return !!DANGEROUS_STRINGS.some(textContent.includes.bind(textContent));\r\n}\r\n\r\nexport function reduceElements(elements, reducer, init) {\r\n    return Array.from(elements).reduce(reducer, init);\r\n}\r\n","import { makeCheckListObject, doesItIncludeDangerousCalls } from \"./utils.js\";\r\n\r\nconst SCRIPT_TYPES = [\r\n    \"text/javascript\",\r\n    \"application/javascript\",\r\n    \"application/ecmascript\",\r\n    \"application/x-ecmascript\",\r\n    \"application/x-javascript\",\r\n    \"text/ecmascript\",\r\n    \"text/javascript1.0\",\r\n    \"text/javascript1.1\",\r\n    \"text/javascript1.2\",\r\n    \"text/javascript1.3\",\r\n    \"text/javascript1.4\",\r\n    \"text/javascript1.5\",\r\n    \"text/jscript\",\r\n    \"text/livescript\",\r\n    \"text/x-ecmascript\",\r\n    \"text/x-javascript\",\r\n];\r\n\r\nfunction isItJs(script) {\r\n    if (!script.type) {\r\n        return true;\r\n    }\r\n\r\n    const normalizedType = script.type.toLowerCase();\r\n\r\n    return !script.type || !!SCRIPT_TYPES.some(normalizedType.includes.bind(normalizedType));\r\n}\r\n\r\nfunction isItDangerous(script) {\r\n    if (script.src) {\r\n        return true;\r\n    }\r\n\r\n    if (!script.textContent) {\r\n        return false;\r\n    }\r\n\r\n    const { textContent } = script;\r\n\r\n    return doesItIncludeDangerousCalls(textContent);\r\n}\r\n\r\nexport default function looseScripts(dom, _html) {\r\n    const scripts = Array.from(dom.querySelectorAll(\"script:not(.rm-i-script)\"));\r\n    const looseScripts = scripts.filter(isItJs);\r\n    const dangerousScripts = looseScripts.filter(isItDangerous);\r\n\r\n    function filterOutDangerours(script) {\r\n        return !dangerousScripts.includes(script);\r\n    }\r\n\r\n    const nonDangerousLooseScripts = looseScripts.filter(filterOutDangerours);\r\n\r\n    return [\r\n        makeCheckListObject(\r\n            \"Dangerous loose scripts\",\r\n            4,\r\n            \"The following scripts include code that will make additional HTTP calls, that can dynamically include more javascript or iframes, this is actively hurtful for LCP\",\r\n            dangerousScripts,\r\n            [\"src\", \"text\"]\r\n        ),\r\n        makeCheckListObject(\r\n            \"Loose scripts\",\r\n            2,\r\n            \"The following scripts are loose on the page, performance can be improved by moving them to the Javascript element on l&d\",\r\n            nonDangerousLooseScripts,\r\n            [\"text\"]\r\n        ),\r\n    ];\r\n}\r\n","import { makeCheckListObject } from \"./utils.js\";\r\n\r\nfunction isInNoScript(element) {\r\n    return !!element.closest(\"noscript\");\r\n}\r\n\r\nfunction isItEagerImage(element) {\r\n    const { loading, src } = element;\r\n\r\n    if (isInNoScript(element)) {\r\n        return false;\r\n    }\r\n\r\n    if (loading && loading === \"lazy\") {\r\n        return false;\r\n    }\r\n\r\n    if (!src) {\r\n        return false;\r\n    }\r\n\r\n    return !src.includes(`svg xmlns='http://www.w3.org/2000/svg' viewBox=`);\r\n}\r\n\r\nfunction isItEagerIframe(element) {\r\n    return element.src && !isInNoScript(element) && element.loading !== \"lazy\";\r\n}\r\n\r\nfunction isItEgarVideo(video) {\r\n    return !isInNoScript(video) && (video.autoplay || video.preload !== \"none\");\r\n}\r\n\r\nexport default function nonLazyMedia(dom, _html) {\r\n    const nonLazyImages = Array.from(dom.querySelectorAll(\"img:not(.rm-hero-media)\")).filter(\r\n        isItEagerImage\r\n    );\r\n\r\n    const nonLazyIframes = Array.from(dom.querySelectorAll(\"iframe\")).filter(isItEagerIframe);\r\n\r\n    const nonLazyVideos = Array.from(dom.querySelectorAll(\"video:not(.rm-hero-media)\")).filter(\r\n        isItEgarVideo\r\n    );\r\n\r\n    return [\r\n        makeCheckListObject(\r\n            \"Eager images\",\r\n            3,\r\n            \"The following images are loading eagerly thus fighting for network resources, please lazy load them\",\r\n            nonLazyImages,\r\n            [\"src\", \"id\", \"className\"]\r\n        ),\r\n        makeCheckListObject(\r\n            \"Eager iframes\",\r\n            4,\r\n            \"The following iframes are loading eagerly thus fighting for network resources, they should be lazy loaded\",\r\n            nonLazyIframes,\r\n            [\"src\", \"id\", \"className\"]\r\n        ),\r\n        makeCheckListObject(\r\n            \"Eager videos\",\r\n            4,\r\n            \"The following videos are loading eagerly thus fighting for network resources, please lazy load them\",\r\n            nonLazyVideos,\r\n            [\"id\", \"className\", \"poster\"]\r\n        ),\r\n    ];\r\n}\r\n","import { makeCheckListObject, doesItIncludeDangerousCalls } from \"./utils.js\";\r\n\r\nfunction toString(fun) {\r\n    return fun.toString();\r\n}\r\n\r\nexport default function dangerousLoadBlockingJavascript(_dom, _html) {\r\n    const loadBlockingJavascript = (window.REBELMOUSE_TASKS_QUEUE || []).map(toString);\r\n    const dangerousFunctions = loadBlockingJavascript.filter(doesItIncludeDangerousCalls);\r\n    return [\r\n        makeCheckListObject(\r\n            \"Dangerous javascript on load blocking queue\",\r\n            3,\r\n            \"There is dangerous javascript on the load blocking priority. These functions invoke code that can dynamically insert elements that are dangerous for LCP or FID. The load blocking queue should be used for safe operations such as adding event listeners, defining ad slots (without calling the ad provider library) or providing basic user interaction\",\r\n            dangerousFunctions,\r\n            []\r\n        ),\r\n    ];\r\n}\r\n","import { makeCheckListObject, reduceElements } from \"./utils.js\";\r\n\r\nfunction accumulateProblematicCssProperties(acum, propertyValue) {\r\n    if (!propertyValue) {\r\n        return acum;\r\n    }\r\n\r\n    let lastFound = 0;\r\n    let iter = 0;\r\n    while (lastFound !== -1 && iter < 100) {\r\n        lastFound = propertyValue.indexOf(\"url(\", lastFound);\r\n        if (lastFound >= 0) {\r\n            lastFound += 4;\r\n            const url = propertyValue.substring(lastFound, propertyValue.indexOf(\")\", lastFound));\r\n            acum.push(url.replace(/\"/g, \"\").replace(/'/g, \"\"));\r\n        }\r\n        iter++;\r\n    }\r\n\r\n    return acum;\r\n}\r\n\r\nfunction accumulateProblematicCssRules(acum, cssRule) {\r\n    if (cssRule instanceof CSSStyleRule || cssRule instanceof CSSKeyframeRule) {\r\n        const {\r\n            background,\r\n            backgroundImage,\r\n            listStyleImage,\r\n            content,\r\n            cursor,\r\n            borderImageSource,\r\n            offsetPath,\r\n            maskImage,\r\n        } = cssRule.style;\r\n\r\n        return [\r\n            background,\r\n            backgroundImage,\r\n            listStyleImage,\r\n            content,\r\n            cursor,\r\n            borderImageSource,\r\n            offsetPath,\r\n            maskImage,\r\n        ].reduce(accumulateProblematicCssProperties, acum);\r\n    } else if (cssRule instanceof CSSMediaRule || cssRule instanceof CSSKeyframesRule) {\r\n        return reduceElements(cssRule.cssRules, accumulateProblematicCssRules, acum);\r\n    }\r\n\r\n    return acum;\r\n}\r\n\r\nfunction resourceDownloadingStylesReducer(acum, styleElement) {\r\n    const { sheet } = styleElement;\r\n\r\n    const cssRules = sheet.cssRules;\r\n\r\n    return reduceElements(cssRules, accumulateProblematicCssRules, acum);\r\n}\r\n\r\nfunction isDangeroursProp([_propName, propValue]) {\r\n    return Boolean(propValue);\r\n}\r\n\r\nfunction problematicRulesReducer(acum, cssRule) {\r\n    if (cssRule instanceof CSSStyleRule || cssRule instanceof CSSKeyframeRule) {\r\n        const { style, selectorText } = cssRule;\r\n        const { top, left, right, bottom, position } = style;\r\n\r\n        const dangerousProps = Object.entries({ top, left, right, bottom, position }).filter(\r\n            isDangeroursProp\r\n        );\r\n\r\n        if (dangerousProps.length > 0) {\r\n            return [...acum, { selectorText, ...Object.fromEntries(dangerousProps) }];\r\n        }\r\n    } else if (cssRule instanceof CSSMediaRule || cssRule instanceof CSSKeyframesRule) {\r\n        return reduceElements(cssRule.cssRules, problematicRulesReducer, acum);\r\n    }\r\n\r\n    return acum;\r\n}\r\n\r\nfunction clsHurtingReducer(acum, styleElement) {\r\n    const { sheet } = styleElement;\r\n\r\n    const cssRules = sheet.cssRules;\r\n\r\n    return reduceElements(cssRules, problematicRulesReducer, acum);\r\n}\r\n\r\nfunction getClsHurtingSelectors(elements) {\r\n    return reduceElements(elements, clsHurtingReducer, []);\r\n}\r\n\r\nfunction getDangerousUrlsInStyles(elements) {\r\n    return reduceElements(elements, resourceDownloadingStylesReducer, []);\r\n}\r\n\r\nexport default function stylesChecker(dom, _html) {\r\n    const looseStyles = Array.from(dom.querySelectorAll(\"style:not(.rm-i-styles)\"));\r\n    const dangerousUrls = getDangerousUrlsInStyles(dom.querySelectorAll(\"style\"));\r\n    const linkStyles = Array.from(dom.querySelectorAll(`link[rel=\"stylesheet\"]`));\r\n    const clsHurtingSelectors = getClsHurtingSelectors(dom.querySelectorAll(\"style\"));\r\n\r\n    return [\r\n        makeCheckListObject(\r\n            \"Loose style tags\",\r\n            1,\r\n            \"Please move all CSS related code to the Style element on l&d tool\",\r\n            looseStyles,\r\n            [\"textContent\"]\r\n        ),\r\n        makeCheckListObject(\r\n            \"Resource loading with CSS\",\r\n            2,\r\n            \"The following resources are being downloaded through CSS' url function, if possibly lazy load these features unless they are intended as LCP element. Aditionally if an image is being embed encoded with the data: prefix, it may be better to host it somewhere and then serve it as an URL\",\r\n            dangerousUrls,\r\n            []\r\n        ),\r\n        makeCheckListObject(\r\n            \"Potentially dangerous selectors\",\r\n            1,\r\n            `The following CSS selectors are modifying the position, top, left, right and bottom properties. This can have a negative impact on CLS if done dynamically without user interaction. Please review the implementation and make sure these styles are being applied without hurting CLS\r\nTip: You can use css transform to achieve similar results without hurting CLS`,\r\n            clsHurtingSelectors,\r\n            []\r\n        ),\r\n        makeCheckListObject(\r\n            \"Eagerly loaded external CSS\",\r\n            3,\r\n            \"The following styleets are being loaded in a blocking fashion, this affects both LCP and FID, please inline the styles that are needed for the initial render of the page and lazy load everything else\",\r\n            linkStyles,\r\n            [\"href\"]\r\n        ),\r\n    ];\r\n}\r\n","import { makeCheckListObject, reduceElements } from \"./utils.js\";\r\n\r\nconst VIEWPORT_HEIGHT = window.innerHeight || document.documentElement.clientHeight;\r\nconst VIEWPORT_WIDTH = window.innerWidth || document.documentElement.clientWidth;\r\n\r\nfunction isInViewport(element) {\r\n    const rect = element.getBoundingClientRect();\r\n    const inView =\r\n        rect.top >= 0 &&\r\n        rect.left >= 0 &&\r\n        rect.bottom <= VIEWPORT_HEIGHT &&\r\n        rect.right <= VIEWPORT_WIDTH;\r\n    return inView;\r\n}\r\n\r\nfunction getTextNodes() {\r\n    const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT);\r\n    const nodeList = [];\r\n    let currentNode = walker.currentNode;\r\n\r\n    while (currentNode) {\r\n        nodeList.push(currentNode);\r\n        currentNode = walker.nextNode();\r\n    }\r\n    return nodeList;\r\n}\r\n\r\nfunction textNodesCandidatesReducer(acum, node) {\r\n    if (\r\n        //we dont care about body,empty text elements or about text nodes without parents (since we cannot check if they are visible)\r\n        node === document.body ||\r\n        !node.parentElement ||\r\n        node.parentElement === document.body ||\r\n        node.textContent.trim().length === 0\r\n    ) {\r\n        return acum;\r\n    }\r\n\r\n    const parent = node.parentElement;\r\n\r\n    const inView = isInViewport(parent);\r\n\r\n    if (inView) {\r\n        return [...acum, parent];\r\n    } else {\r\n        return acum;\r\n    }\r\n}\r\n\r\nfunction usedFontsReducer(acum, node) {\r\n    const fontFamily = window.getComputedStyle(node).getPropertyValue(\"font-family\");\r\n    const fontWeight = window.getComputedStyle(node).getPropertyValue(\"font-weight\");\r\n\r\n    function fontFamilyReducer(acum, fontFamily) {\r\n        const computedFontName = `${fontFamily}:${fontWeight}`;\r\n        if (!(computedFontName in acum)) {\r\n            acum[computedFontName] = 1;\r\n        }\r\n\r\n        return acum;\r\n    }\r\n\r\n    return fontFamily.split(\",\").reduce(fontFamilyReducer, acum);\r\n}\r\n\r\nfunction getUrlValue(src) {\r\n    let urlIndex = src.indexOf(\"url(\");\r\n    if (urlIndex >= 0) {\r\n        urlIndex += 4;\r\n        const url = src.substring(urlIndex, src.indexOf(\")\", urlIndex));\r\n        return url.replace(/\"/g, \"\").replace(/'/g, \"\");\r\n    }\r\n    return null;\r\n}\r\n\r\nfunction accumulateDeclareFontFaces(acum, cssRule) {\r\n    if (cssRule instanceof CSSMediaRule || cssRule instanceof CSSKeyframesRule) {\r\n        return Array.from(cssRule.cssRules).reduce(accumulateDeclareFontFaces, acum);\r\n    } else if (cssRule instanceof CSSFontFaceRule) {\r\n        const { fontFamily, fontWeight, src } = cssRule.style;\r\n\r\n        const url = getUrlValue(src);\r\n        if (url) {\r\n            return {\r\n                ...acum,\r\n                [`${fontFamily}:${fontWeight}`]: { fontFamily, fontWeight, url },\r\n            };\r\n        } else {\r\n            return acum;\r\n        }\r\n    }\r\n\r\n    return acum;\r\n}\r\n\r\nfunction declaredFontFacesReducer(acum, styleElement) {\r\n    const { sheet } = styleElement;\r\n\r\n    const cssRules = Array.from(sheet.cssRules);\r\n\r\n    return cssRules.reduce(accumulateDeclareFontFaces, acum);\r\n}\r\n\r\nfunction getDeclaredFonts(dom) {\r\n    return reduceElements(dom.querySelectorAll(\"style\"), declaredFontFacesReducer, {});\r\n}\r\n\r\nfunction getUnUsedFonts(usedFonts, initialPayloadDeclaredFonts) {\r\n    function usedFontReducer(acum, fontEntry) {\r\n        const [fontKey, fontData] = fontEntry;\r\n\r\n        if (fontKey in usedFonts) {\r\n            return acum;\r\n        } else {\r\n            return [...acum, fontData];\r\n        }\r\n    }\r\n\r\n    return Object.entries(initialPayloadDeclaredFonts).reduce(usedFontReducer, []);\r\n}\r\n\r\nfunction isPreloaded(links, url) {\r\n    function isPreloadForUrl(link) {\r\n        return link.href === url;\r\n    }\r\n\r\n    return links.some(isPreloadForUrl);\r\n}\r\n\r\nfunction getNonPreloadedUsedFonts(dom, usedFonts, initialPayloadDeclaredFonts) {\r\n    const fontPreloadLinks = Array.from(dom.querySelectorAll(`link[rel=\"preload\"][as=\"font\"]`));\r\n\r\n    function usedFontReducer(acum, fontEntry) {\r\n        const [fontKey, fontData] = fontEntry;\r\n\r\n        if (fontKey in usedFonts && isPreloaded(fontPreloadLinks, fontData)) {\r\n            return;\r\n        } else {\r\n            return acum;\r\n        }\r\n    }\r\n\r\n    return Object.entries(initialPayloadDeclaredFonts).reduce(usedFontReducer, []);\r\n}\r\n\r\nexport default function fonts(dom, _html) {\r\n    const textNodesInView = getTextNodes().reduce(textNodesCandidatesReducer, []);\r\n    const usedFontsMap = textNodesInView.reduce(usedFontsReducer, {});\r\n\r\n    const initialPayloadDeclaredFonts = getDeclaredFonts(dom);\r\n\r\n    const unusedFonts = getUnUsedFonts(usedFontsMap, initialPayloadDeclaredFonts);\r\n\r\n    const nonPreloadedFonts = getNonPreloadedUsedFonts(\r\n        dom,\r\n        usedFontsMap,\r\n        initialPayloadDeclaredFonts\r\n    );\r\n\r\n    return [\r\n        makeCheckListObject(\r\n            \"Eagerly loaded font is unused\",\r\n            3,\r\n            \"The following font was declared on the page's stylesheet yet it is not used on the first viewport, this means it can be lazy loaded\",\r\n            unusedFonts,\r\n            []\r\n        ),\r\n        makeCheckListObject(\r\n            \"Viewport fonts is not preloaded\",\r\n            3,\r\n            \"The following fonts are used in the first viewport yet they are not preloaded, this can affect LCP\",\r\n            nonPreloadedFonts,\r\n            []\r\n        ),\r\n    ];\r\n}\r\n","import { makeCheckListObject } from \"./utils.js\";\r\n\r\nconst VIEWPORT_HEIGHT = window.innerHeight || document.documentElement.clientHeight;\r\nconst VIEWPORT_WIDTH = window.innerWidth || document.documentElement.clientWidth;\r\n\r\nfunction isInViewport(element) {\r\n    const rect = element.getBoundingClientRect();\r\n    const inView =\r\n        rect.top >= 0 &&\r\n        rect.left >= 0 &&\r\n        rect.top <= VIEWPORT_HEIGHT &&\r\n        rect.left <= VIEWPORT_WIDTH;\r\n    return inView && element.offsetParent !== null;\r\n}\r\n\r\nfunction isNotInViewport(element) {\r\n    return !isInViewport(element);\r\n}\r\n\r\nfunction postToSelector(post) {\r\n    return `article[elid=\"${post.getAttribute(\"elid\")}\"]`;\r\n}\r\n\r\nfunction composeSelectorFromServedPosts(serverPosts) {\r\n    return serverPosts.map(postToSelector).join(\",\");\r\n}\r\n\r\nexport default function loadedPosts(dom, _html) {\r\n    const serverPosts = Array.from(dom.querySelectorAll(\"article\"));\r\n\r\n    const serverPostsSelector = composeSelectorFromServedPosts(serverPosts);\r\n\r\n    const samePostsInActiveDom = Array.from(document.querySelectorAll(serverPostsSelector)).filter(\r\n        isNotInViewport\r\n    );\r\n\r\n    return [\r\n        makeCheckListObject(\r\n            \"Loaded posts outside of the viewport\",\r\n            2,\r\n            \"The following posts were served from the server yet they are not in view. They should be lazy loaded\",\r\n            samePostsInActiveDom,\r\n            [\"elid\", \"className\"]\r\n        ),\r\n    ];\r\n}\r\n","import curry from \"../../lib/core/functional/curry.js\";\r\n\r\nimport looseScripts from \"./looseScripts\";\r\nimport nonLazyMedia from \"./nonLazyMedia\";\r\nimport dangerousLoadBlockingJavascript from \"./dangerousLoadBlockingJavascript\";\r\nimport stylesChecker from \"./stylesChecker\";\r\nimport fonts from \"./fonts\";\r\nimport loadedPosts from \"./loadedPosts\";\r\nimport pageSize from \"./pageSize\";\r\nimport headersDebug from \"./headersDebug\";\r\n\r\nconst CHECKLIST_PRODUCERS = [\r\n    looseScripts,\r\n    nonLazyMedia,\r\n    dangerousLoadBlockingJavascript,\r\n    stylesChecker,\r\n    fonts,\r\n    loadedPosts,\r\n    pageSize,\r\n    headersDebug,\r\n];\r\n\r\nconst PARSER = new DOMParser();\r\n\r\nasync function getRawDom(url) {\r\n    const response = await fetch(url);\r\n    const html = await response.text();\r\n    return [PARSER.parseFromString(html, \"text/html\"), html, response.headers];\r\n}\r\n\r\nconst PRIORITY_STYLES = {\r\n    0: \"font-size: 1em; color: CornflowerBlue;\",\r\n    1: \"font-size: 1.5em; color: yellow;\",\r\n    2: \"font-size: 2em; color: orange;\",\r\n    3: \"font-size: 2.5em; color: red;\",\r\n    4: \"font-size: 3em; color: red; background: black;\",\r\n};\r\n\r\nfunction renderChecklist(checkListObject) {\r\n    const { title, priority, description, items, itemProperties } = checkListObject;\r\n\r\n    const tableItems = items.length;\r\n    if (tableItems === 0) {\r\n        return;\r\n    }\r\n\r\n    if (tableItems <= 50) {\r\n        console.group(`%c${title}`, PRIORITY_STYLES[priority]);\r\n    } else {\r\n        console.groupCollapsed(`%c${title}`, PRIORITY_STYLES[priority]);\r\n    }\r\n    console.log(description);\r\n    console.table(items, itemProperties);\r\n    console.groupEnd();\r\n}\r\n\r\nfunction sortByPriority(checkListA, checkListB) {\r\n    return checkListB.priority - checkListA.priority;\r\n}\r\n\r\nfunction renderChecklists(checkLists) {\r\n    console.clear();\r\n    console.log(`%cHighest priority`, PRIORITY_STYLES[4]);\r\n    console.log(`%cHigh priority`, PRIORITY_STYLES[3]);\r\n    console.log(`%cmedium priority`, PRIORITY_STYLES[2]);\r\n    console.log(`%cLow priority/Validate Implementation`, PRIORITY_STYLES[1]);\r\n    console.log(`%cDebug information`, PRIORITY_STYLES[0]);\r\n    checkLists.sort(sortByPriority).forEach(renderChecklist);\r\n}\r\n\r\nconst runChecklist = curry(function runChecklist(dom, html, headers, checklistFun) {\r\n    return checklistFun(dom, html, headers);\r\n});\r\n\r\nexport default function cwvChecklist(_options) {\r\n    console.log(\r\n        `%cCWV checklist is being prepared, please do not scroll away from the first viewport and make sure you are in a private window as a logged out user`,\r\n        `font-size: 2em; color: CornflowerBlue; background: black;`\r\n    );\r\n    function onPage([dom, html, headers]) {\r\n        return CHECKLIST_PRODUCERS.flatMap(runChecklist(dom, html, headers));\r\n    }\r\n\r\n    getRawDom(document.location.href).then(onPage).then(renderChecklists);\r\n}\r\n","import { makeCheckListObject } from \"./utils.js\";\r\n\r\nexport default function pageSize(_dom, html) {\r\n    const pageSize = new Blob([html]).size / 1024;\r\n    if (pageSize < 400) {\r\n        return [];\r\n    } else {\r\n        return makeCheckListObject(\r\n            \"Uncompressed page size in kb is too big\",\r\n            2,\r\n            \"The page size once uncompressed is too big, consider lazy loading more resources or moving scripts that are too big to their own file\",\r\n            [{ html, pageSize }],\r\n            []\r\n        );\r\n    }\r\n}\r\n","import { makeCheckListObject } from \"./utils.js\";\r\n\r\nfunction checkIfViaIsWarehouse(via) {\r\n    if (!via) {\r\n        return false;\r\n    } else {\r\n        return via.toLowerCase().includes(\"warehouse\");\r\n    }\r\n}\r\n\r\nfunction checkIfWarehouse(headers) {\r\n    const { via } = headers;\r\n    const isItWarehouse = checkIfViaIsWarehouse(via);\r\n    return isItWarehouse ? [] : [{ via: via || \"\" }];\r\n}\r\n\r\nexport default function headerDebug(_dom, _html, headers) {\r\n    const headersAsObject = Object.fromEntries(headers.entries());\r\n\r\n    const isItNotWarehouse = checkIfWarehouse(headersAsObject);\r\n\r\n    return [\r\n        makeCheckListObject(\r\n            \"Request not served from Telaria\",\r\n            2,\r\n            \"This request was not served from telaria. Please check if this site is scheduled to be enabled or if there are any issues prevenging it\",\r\n            isItNotWarehouse,\r\n            []\r\n        ),\r\n        makeCheckListObject(\r\n            \"Headers information\",\r\n            0,\r\n            `This are the headers used in the response for this page`,\r\n            headersAsObject,\r\n            []\r\n        ),\r\n    ];\r\n}\r\n"],"names":["makeCheckListObject","title","priority","description","items","itemProperties","dangerousTagName","tagName","DANGEROUS_STRINGS","doesItIncludeDangerousCalls","textContent","some","includes","bind","reduceElements","elements","reducer","init","Array","from","reduce","SCRIPT_TYPES","isItJs","script","type","normalizedType","toLowerCase","isItDangerous","src","isInNoScript","element","closest","isItEagerImage","loading","isItEagerIframe","isItEgarVideo","video","autoplay","preload","fun","toString","accumulateProblematicCssProperties","acum","propertyValue","lastFound","iter","indexOf","url","substring","push","replace","accumulateProblematicCssRules","cssRule","CSSStyleRule","CSSKeyframeRule","background","backgroundImage","listStyleImage","content","cursor","borderImageSource","offsetPath","maskImage","style","CSSMediaRule","CSSKeyframesRule","cssRules","resourceDownloadingStylesReducer","styleElement","sheet","isDangeroursProp","_propName","propValue","Boolean","problematicRulesReducer","selectorText","top","left","right","bottom","position","dangerousProps","Object","entries","filter","length","fromEntries","clsHurtingReducer","VIEWPORT_HEIGHT","window","innerHeight","document","documentElement","clientHeight","VIEWPORT_WIDTH","innerWidth","clientWidth","textNodesCandidatesReducer","node","body","parentElement","trim","parent","rect","getBoundingClientRect","isInViewport","usedFontsReducer","fontFamily","getComputedStyle","getPropertyValue","fontWeight","split","computedFontName","accumulateDeclareFontFaces","CSSFontFaceRule","urlIndex","getUrlValue","declaredFontFacesReducer","isNotInViewport","offsetParent","postToSelector","post","getAttribute","CHECKLIST_PRODUCERS","dom","_html","looseScripts","querySelectorAll","dangerousScripts","nonDangerousLooseScripts","nonLazyImages","nonLazyIframes","nonLazyVideos","_dom","REBELMOUSE_TASKS_QUEUE","map","looseStyles","dangerousUrls","linkStyles","clsHurtingSelectors","usedFontsMap","walker","createTreeWalker","NodeFilter","SHOW_TEXT","nodeList","currentNode","nextNode","getTextNodes","initialPayloadDeclaredFonts","getDeclaredFonts","unusedFonts","usedFonts","fontEntry","fontKey","fontData","getUnUsedFonts","nonPreloadedFonts","fontPreloadLinks","link","href","getNonPreloadedUsedFonts","serverPostsSelector","join","html","pageSize","Blob","size","headers","headersAsObject","via","checkIfViaIsWarehouse","checkIfWarehouse","PARSER","DOMParser","PRIORITY_STYLES","renderChecklist","checkListObject","tableItems","console","group","groupCollapsed","log","table","groupEnd","sortByPriority","checkListA","checkListB","renderChecklists","checkLists","clear","sort","forEach","runChecklist","curry","checklistFun","cwvChecklist","_options","async","response","fetch","text","parseFromString","getRawDom","location","then","flatMap"],"sourceRoot":""}