{"version":3,"file":"dnstradamus.mjs","sources":["../src/lib/constants.ts","../src/lib/query-dom.ts","../src/lib/build-link-tag.ts","../src/lib/get-origin-from-href.ts","../src/lib/include-origin.ts","../src/dnstradamus.ts"],"sourcesContent":["export const INTERSECTIONOBSERVER_SUPPORTED:boolean = \"IntersectionObserver\" in window && \"IntersectionObserverEntry\" in window;\nexport const REQUESTIDLECALLBACK_SUPPORTED:boolean = \"requestIdleCallback\" in window;\nexport const MUTATIONOBSERVER_SUPPORTED:boolean = \"MutationObserver\" in window;\n","export function queryDOM (selectorString:string): Array<HTMLAnchorElement> {\n  return Array.prototype.slice.call(document.querySelectorAll(selectorString));\n}\n","export function buildLinkTag (origin:string):void {\n  const linkEl:HTMLLinkElement = document.createElement(\"link\");\n  linkEl.href = origin;\n  linkEl.rel = \"dns-prefetch\";\n\n  document.head.appendChild(linkEl);\n}\n","export function getOriginFromHref (href:string):string {\n  const pathArray:Array<string> = href.split(\"/\");\n\n  return `${pathArray[0]}//${pathArray[2]}/`;\n}\n","export function includeOrigin (anchor:HTMLAnchorElement, origin:string):boolean {\n  return true;\n}\n","// Interface declarations\nimport type { Options } from \"./interfaces/Options\";\n\n// Constants\nimport { INTERSECTIONOBSERVER_SUPPORTED, REQUESTIDLECALLBACK_SUPPORTED, MUTATIONOBSERVER_SUPPORTED } from \"./lib/constants\";\n\n// App-specific\nimport { queryDOM } from \"./lib/query-dom\";\nimport { buildLinkTag } from \"./lib/build-link-tag\";\nimport { getOriginFromHref } from \"./lib/get-origin-from-href\";\nimport { includeOrigin } from \"./lib/include-origin\";\n\nexport function dnstradamus (options: Options = {}):void {\n  const context = options.context || \"body\";\n  const include = options.include || includeOrigin;\n  const observeChanges = options.observeChanges || false;\n\n  if (INTERSECTIONOBSERVER_SUPPORTED) {\n    const resolvedOrigins:Array<string> = [];\n    let anchors = queryDOM(`${context} a[href^=\"http://\"],a[href^=\"https://\"]`);\n\n    const intersectionListener = new IntersectionObserver((entries, observer) => {\n      for (const entry of entries) {\n        if (entry.intersectionRatio) {\n          const anchor = entry.target as HTMLAnchorElement;\n          const origin = getOriginFromHref(anchor.href);\n\n          if (resolvedOrigins.indexOf(origin) < 0 && origin.indexOf(`${document.location.protocol}//${document.location.host}`) < 0 && include(anchor, origin)) {\n            if (REQUESTIDLECALLBACK_SUPPORTED) {\n              requestIdleCallback(() => {\n                buildLinkTag(origin);\n              });\n            } else {\n              buildLinkTag(origin);\n            }\n\n            resolvedOrigins.push(origin);\n          }\n\n          observer.unobserve(anchor);\n          anchors = anchors.filter(anchorElement => anchorElement !== anchor);\n\n          if (!anchors.length && !observeChanges) {\n            intersectionListener.disconnect();\n          }\n        }\n      }\n    });\n\n    for (const anchor of anchors) {\n      intersectionListener.observe(anchor);\n    }\n\n    if (MUTATIONOBSERVER_SUPPORTED && observeChanges) {\n      new MutationObserver(mutations => {\n        for (const mutation of mutations) {\n          if (mutation.type === \"childList\") {\n            const newAnchors:Array<HTMLAnchorElement> = [].slice.call(mutation.addedNodes);\n\n            for (const newAnchor of newAnchors) {\n              if (resolvedOrigins.indexOf(getOriginFromHref(newAnchor.href)) < 0) {\n                anchors.push(newAnchor);\n                intersectionListener.observe(newAnchor);\n              }\n            }\n          }\n        }\n      }).observe(queryDOM(context)[0], {\n        childList: true,\n        subtree: true\n      });\n    }\n  }\n}\n"],"names":["INTERSECTIONOBSERVER_SUPPORTED","window","REQUESTIDLECALLBACK_SUPPORTED","MUTATIONOBSERVER_SUPPORTED","queryDOM","selectorString","Array","prototype","slice","call","document","querySelectorAll","buildLinkTag","origin","linkEl","createElement","href","rel","head","appendChild","getOriginFromHref","pathArray","split","includeOrigin","anchor","dnstradamus","options","context","include","observeChanges","resolvedOrigins","anchors","intersectionListener","IntersectionObserver","entries","observer","entry","intersectionRatio","target","indexOf","location","protocol","host","requestIdleCallback","push","unobserve","filter","anchorElement","length","disconnect","observe","MutationObserver","mutations","mutation","type","newAnchors","addedNodes","newAnchor","childList","subtree"],"mappings":"MAAaA,EAAyC,yBAA0BC,QAAU,8BAA+BA,OAC5GC,EAAwC,wBAAyBD,OACjEE,EAAqC,qBAAsBF,gBCFxDG,EAAUC,GACxB,OAAOC,MAAMC,UAAUC,MAAMC,KAAKC,SAASC,iBAAiBN,aCD9CO,EAAcC,GAC5B,MAAMC,EAAyBJ,SAASK,cAAc,QACtDD,EAAOE,KAAOH,EACdC,EAAOG,IAAM,eAEbP,SAASQ,KAAKC,YAAYL,YCLZM,EAAmBJ,GACjC,MAAMK,EAA0BL,EAAKM,MAAM,KAE3C,SAAUD,EAAU,OAAOA,EAAU,eCHvBE,EAAeC,EAA0BX,GACvD,kBCWcY,EAAaC,EAAmB,IAC9C,MAAMC,EAAUD,EAAQC,SAAW,OAC7BC,EAAUF,EAAQE,SAAWL,EAC7BM,EAAiBH,EAAQG,iBAAkB,EAEjD,GAAI7B,EAAgC,CAClC,MAAM8B,EAAgC,GACtC,IAAIC,EAAU3B,KAAYuB,4CAE1B,MAAMK,EAAuB,IAAIC,qBAAqB,CAACC,EAASC,KAC9D,IAAK,MAAMC,KAASF,EAClB,GAAIE,EAAMC,kBAAmB,CAC3B,MAAMb,EAASY,EAAME,OACfzB,EAASO,EAAkBI,EAAOR,MAEpCc,EAAgBS,QAAQ1B,GAAU,GAAKA,EAAO0B,WAAW7B,SAAS8B,SAASC,aAAa/B,SAAS8B,SAASE,QAAU,GAAKd,EAAQJ,EAAQX,KACvIX,EACFyC,oBAAoB,KAClB/B,EAAaC,KAGfD,EAAaC,GAGfiB,EAAgBc,KAAK/B,IAGvBsB,EAASU,UAAUrB,GACnBO,EAAUA,EAAQe,OAAOC,GAAiBA,IAAkBvB,GAEvDO,EAAQiB,QAAWnB,GACtBG,EAAqBiB,gBAM7B,IAAK,MAAMzB,KAAUO,EACnBC,EAAqBkB,QAAQ1B,GAG3BrB,GAA8B0B,GAChC,IAAIsB,iBAAiBC,IACnB,IAAK,MAAMC,KAAYD,EACrB,GAAsB,cAAlBC,EAASC,KAAsB,CACjC,MAAMC,EAAsC,GAAG/C,MAAMC,KAAK4C,EAASG,YAEnE,IAAK,MAAMC,KAAaF,EAClBzB,EAAgBS,QAAQnB,EAAkBqC,EAAUzC,OAAS,IAC/De,EAAQa,KAAKa,GACbzB,EAAqBkB,QAAQO,OAKpCP,QAAQ9C,EAASuB,GAAS,GAAI,CAC/B+B,WAAW,EACXC,SAAS"}