{
  "version": 3,
  "sources": ["../src/catch-links.ts"],
  "sourcesContent": ["/**\n * Callback on any link click that is local to the server.\n *\n * @param {HTMLElement} root The root element to listen on.\n * @param {(href:string)=>void} cb The function to call on link click.\n */\nexport function CatchLinks (\n    root:HTMLElement,\n    cb:(href:string) => void,\n    opts:{\n        handleAnchor?:boolean|((href:string)=>boolean),\n        handleLink?:(href:string)=>boolean,\n    } = {},\n):()=>void {\n    root.addEventListener('click', onClick)\n\n    function onClick (ev:MouseEvent) {\n        // if command click, do nothing\n        if (ev.altKey || ev.ctrlKey || ev.metaKey || ev.shiftKey ||\n            ev.defaultPrevented) {\n            return true\n        }\n\n        let anchor:null|HTMLElement = null\n        for (\n            let n = (ev.target as HTMLElement|null);\n            n && n.parentNode;\n            n = n.parentElement\n        ) {\n            if (n!.nodeName === 'A') {\n                anchor = n\n                break\n            }\n        }\n\n        // if not a link click, do nothing\n        if (!anchor) return true\n\n        const url = new URL(anchor.getAttribute('href')!, location.origin)\n        const urlPath = url.pathname + url.search\n\n        // if not local, do nothing\n        if (url.host !== location.host) return true\n\n        // if we were given a function to check, call it\n        if (opts.handleLink) {\n            if (!opts.handleLink(urlPath)) return\n        }\n\n        const handleAnchor = opts.handleAnchor === undefined ? true : opts.handleAnchor\n\n        // else, handle the click\n        if (url.href.includes('#')) {\n            if (typeof handleAnchor === 'function') {\n                // do we want to handle this?\n                const handle = handleAnchor(url.href)\n                if (handle) {\n                    ev.preventDefault()\n                    cb(resolve(location.pathname, urlPath || '') +\n                        (url.hash || ''))\n                    return false\n                }\n            } else {\n                if (handleAnchor) {\n                    ev.preventDefault()\n                    cb(resolve(location.pathname, urlPath || '') +\n                        (url.hash || ''))\n                    return false\n                }\n            }\n        } else {\n            ev.preventDefault()\n            cb(resolve(location.pathname, urlPath || '') + (url.hash || ''))\n            return false\n        }\n    }\n\n    return function unlisten () {\n        root.removeEventListener('click', onClick)\n    }\n}\n\nCatchLinks.resolve = resolve\n\nexport default CatchLinks\n\n/**\n * Resolve a local link to a full local path.\n *\n * @param {string} from\n * @param {string} to\n */\nexport function resolve (from:string, to:string):string {\n    const isRelative = (to.charAt(0) !== '/')\n    if (!isRelative) return to\n\n    const fromArr = from.split('/')\n        .map(path => path.replaceAll('/', ''))\n        .filter(Boolean)\n    const toArr = to.split('/').map(path => path.replaceAll('/', ''))\n\n    const str = fromArr.concat(toArr).join('/')\n    return str.charAt(0) === '/' ? str : '/' + str\n}\n"],
  "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMO,SAAS,WACZ,MACA,IACA,OAGI,CAAC,GACE;AACP,OAAK,iBAAiB,SAAS,OAAO;AAEtC,WAAS,QAAS,IAAe;AAE7B,QAAI,GAAG,UAAU,GAAG,WAAW,GAAG,WAAW,GAAG,YAC5C,GAAG,kBAAkB;AACrB,aAAO;AAAA,IACX;AAEA,QAAI,SAA0B;AAC9B,aACQ,IAAK,GAAG,QACZ,KAAK,EAAE,YACP,IAAI,EAAE,eACR;AACE,UAAI,EAAG,aAAa,KAAK;AACrB,iBAAS;AACT;AAAA,MACJ;AAAA,IACJ;AAGA,QAAI,CAAC,OAAQ,QAAO;AAEpB,UAAM,MAAM,IAAI,IAAI,OAAO,aAAa,MAAM,GAAI,SAAS,MAAM;AACjE,UAAM,UAAU,IAAI,WAAW,IAAI;AAGnC,QAAI,IAAI,SAAS,SAAS,KAAM,QAAO;AAGvC,QAAI,KAAK,YAAY;AACjB,UAAI,CAAC,KAAK,WAAW,OAAO,EAAG;AAAA,IACnC;AAEA,UAAM,eAAe,KAAK,iBAAiB,SAAY,OAAO,KAAK;AAGnE,QAAI,IAAI,KAAK,SAAS,GAAG,GAAG;AACxB,UAAI,OAAO,iBAAiB,YAAY;AAEpC,cAAM,SAAS,aAAa,IAAI,IAAI;AACpC,YAAI,QAAQ;AACR,aAAG,eAAe;AAClB,aAAG,QAAQ,SAAS,UAAU,WAAW,EAAE,KACtC,IAAI,QAAQ,GAAG;AACpB,iBAAO;AAAA,QACX;AAAA,MACJ,OAAO;AACH,YAAI,cAAc;AACd,aAAG,eAAe;AAClB,aAAG,QAAQ,SAAS,UAAU,WAAW,EAAE,KACtC,IAAI,QAAQ,GAAG;AACpB,iBAAO;AAAA,QACX;AAAA,MACJ;AAAA,IACJ,OAAO;AACH,SAAG,eAAe;AAClB,SAAG,QAAQ,SAAS,UAAU,WAAW,EAAE,KAAK,IAAI,QAAQ,GAAG;AAC/D,aAAO;AAAA,IACX;AAAA,EACJ;AA3DS;AA6DT,SAAO,gCAAS,WAAY;AACxB,SAAK,oBAAoB,SAAS,OAAO;AAAA,EAC7C,GAFO;AAGX;AA1EgB;AA4EhB,WAAW,UAAU;AAErB,IAAO,sBAAQ;AAQR,SAAS,QAAS,MAAa,IAAkB;AACpD,QAAM,aAAc,GAAG,OAAO,CAAC,MAAM;AACrC,MAAI,CAAC,WAAY,QAAO;AAExB,QAAM,UAAU,KAAK,MAAM,GAAG,EACzB,IAAI,UAAQ,KAAK,WAAW,KAAK,EAAE,CAAC,EACpC,OAAO,OAAO;AACnB,QAAM,QAAQ,GAAG,MAAM,GAAG,EAAE,IAAI,UAAQ,KAAK,WAAW,KAAK,EAAE,CAAC;AAEhE,QAAM,MAAM,QAAQ,OAAO,KAAK,EAAE,KAAK,GAAG;AAC1C,SAAO,IAAI,OAAO,CAAC,MAAM,MAAM,MAAM,MAAM;AAC/C;AAXgB;",
  "names": []
}
