{"version":3,"sources":["https://lively-kernel.org/lively4/composed-offset/src/client/analysis.js"],"names":["Paths","FETCH_TIMEOUT","BrokenLinkAnalysis","extractLinks","file","content","url","includes","match","links","Array","statusCache","Map","extractedLinks","extractedLink","normalizedLink","normalizePath","status","get","validateLink","set","link","location","push","console","log","response","fetch","method","mode","redirect","referrer","type","ok","e","options","timeout","Promise","race","_","reject","setTimeout","Error","ModuleDependencyAnalysis","resolveModuleDependencies","fileUrl","dependencies","resolvedDependencies","dependency","resolvedDependency","System","resolve"],"mappings":";;;;;;AAAOA,W;;;;;;;;;;;AAAAA,gD;;;;;;;;;AAEP,YAAMC,gBAAgB,IAAtB;;;;;;;;AAAMA,wD;;;;;;;AAEC,YAAMC,kBAAN,CAAyB;;AAE9B,qBAAaC,YAAb,CAA0BC,IAA1B,EAAgC;AAC9B,cAAI,CAACA,IAAD,IAAS,CAACA,KAAKC,OAAf,IAA0BD,KAAKE,GAAL,CAASC,QAAT,CAAkB,gBAAlB,CAA1B,IAAiEH,KAAKE,GAAL,CAASE,KAAT,CAAe,OAAf,CAArE,EAA8F;AAC5F,mBAAO,EAAP;AACD;;AAED,cAAIC,QAAQ,IAAIC,KAAJ,EAAZ;AACA,cAAIC,cAAc,IAAIC,GAAJ,EAAlB;AACA,cAAIC,iBAAkB,IAAIH,KAAJ,EAAtB;;AAEA,cAAIN,KAAKE,GAAL,CAASE,KAAT,CAAe,OAAf,CAAJ,EAA6B;AAC3B;AACA;AACA;;AAEA;AACA;AACA;;;AAGD,WAVD,MAUO,IAAIJ,KAAKE,GAAL,CAASE,KAAT,CAAe,mBAAf,CAAJ,EAAyC;;AAE9C;;AAEA;AACA;AACD;AACD,cAAG,CAACK,cAAJ,EAAoB;AAClB,mBAAO,EAAP;AACD;AACD,eAAK,MAAMC,aAAX,IAA4BD,cAA5B,EAA4C;AAC1C,gBAAIE,iBAAiBf,MAAMgB,aAAN,CAAoBF,aAApB,EAAmCV,KAAKE,GAAxC,CAArB;AACA,gBAAIW,SAASN,YAAYO,GAAZ,CAAgBH,cAAhB,CAAb;AACA,gBAAI,CAACE,MAAL,EAAa;AACXA,uBAAS,MAAM,KAAKE,YAAL,CAAkBJ,cAAlB,CAAf;AACAJ,0BAAYS,GAAZ,CAAgBL,cAAhB,EAAgCE,MAAhC;AACD;;AAED,gBAAII,OAAO;AACTA,oBAAMP,aADG;AAETQ,wBAAUR,cAAcP,QAAd,CAAuB,mBAAvB,IAA8C,UAA9C,GAA2D,UAF5D;AAGTD,mBAAKF,KAAKE,GAHD;AAITW,sBAAQA;AAJC,aAAX;AAMAR,kBAAMc,IAAN,CAAWF,IAAX;AACD;AACD,iBAAOZ,KAAP;AACD;;AAED,qBAAaU,YAAb,CAA0Bb,GAA1B,EAA+B;AAC7BkB,kBAAQC,GAAR,CAAY,8BAA8BnB,GAA1C;AACA,cAAI;AACF,gBAAIoB,WAAW,MAAOxB,mBAAmByB,KAAnB,CAAyBrB,GAAzB,EAA8B;AAClDsB,sBAAQ,KAD0C,EACnC;AACfC,oBAAM,SAF4C;AAGlDC,wBAAU,QAHwC;AAIlDC,wBAAU,aAJwC,CAIzB;AAJyB,aAA9B,EAKnB9B,aALmB,CAAtB;;AAOA,gBAAIyB,SAASM,IAAT,KAAkB,OAAtB,EAA+B;AAAE;AAC/B,kBAAIN,SAASO,EAAb,EAAiB;AACf,uBAAO,OAAP;AACD,eAFD,MAEO;AACL,uBAAO,QAAP;AACD;AACF,aAND,MAMO,IAAIP,SAASM,IAAT,KAAkB,QAAtB,EAAgC;AAAE;AACvC,qBAAO,OAAP;AACD;AACF,WAjBD,CAiBE,OAAME,CAAN,EAAS;AACT,mBAAO,QAAP;AACD;AACD,iBAAO,OAAP,CAtB6B,CAsBd;AAChB;;AAED,qBAAaP,KAAb,CAAmBrB,GAAnB,EAAwB6B,OAAxB,EAAiCC,OAAjC,EAA0C;AACxC,iBAAOC,QAAQC,IAAR,CAAa,CAChBX,MAAMrB,GAAN,EAAW6B,OAAX,CADgB,EAEhB,IAAIE,OAAJ,CAAY,CAACE,CAAD,EAAIC,MAAJ,KACRC,WAAW,MAAM;AACfD,mBAAO,IAAIE,KAAJ,CAAU,oBAAoBpC,GAA9B,CAAP;AACL,WAFG,EAED8B,OAFC,CADJ,CAFgB,CAAb,CAAP;AAQD;AApF6B;;;;;;;;;;wCAAnBlC,mD;;;;;;;;AAwFN,YAAMyC,wBAAN,CAA+B;;AAEnC,qBAAaC,yBAAb,CAAuCC,OAAvC,EAAgDC,YAAhD,EAA8D;AAC7D,cAAIC,uBAAuB,IAAIrC,KAAJ,EAA3B;AACA,eAAK,MAAMsC,UAAX,IAAyBF,YAAzB,EAAuC;AACrC,gBAAIG,qBAAqB,MAAMC,OAAOC,OAAP,CAAeH,WAAW1C,GAA1B,EAA+BuC,OAA/B,CAA/B;AACA,gBAAI,CAACI,kBAAL,EAAyB;AACvBF,mCAAqBxB,IAArB,CAA0ByB,WAAW1C,GAArC;AACD,aAFD,MAEO;AACLyC,mCAAqBxB,IAArB,CAA0B0B,kBAA1B;AACD;AACF;;AAED,iBAAO;AACL3C,iBAAKuC,OADA;AAELC,0BAAcC;AAFT,WAAP;AAID;AAjBmC;;;;;;;;;;8CAAzBJ,yD","file":"analysis.js","sourcesContent":["import Paths from \"src/client/paths.js\"\n\nconst FETCH_TIMEOUT = 5000\n\nexport class BrokenLinkAnalysis {\n\n  static async extractLinks(file) {\n    if (!file || !file.content || file.url.includes(\"/src/external/\") || file.url.match(/\\.js$/)) {\n      return [];\n    }\n  \n    var links = new Array()\n    var statusCache = new Map()\n    var extractedLinks =  new Array()\n    \n    if (file.url.match(/\\.md$/)) {\n      // #BUG prevents loading in #FireFox due to invalid regexp group\n      // FF RegExp version does not support lookbehinds. https://stackoverflow.com/questions/49816707/firefox-invalid-regex-group\n      // #TODO Refactor\n\n      // let patternMdFiles = /(?<=(\\]:\\s*)|(\\]\\s*\\())((http(s)?:\\/\\/(w{3}[.])?([a-z0-9.-]{1,63}(([:]{1}[0-9]{4,})|([.]{1}){1,}([a-z]{2,})){1,})([a-zA-Z0-9\\/\\.\\-\\_#.?=%;]*))|((([./]+|[a-zA-Z\\-_]))([a-zA-Z0-9\\-_]+\\.|[a-zA-Z0-9\\-_]+\\/)+([a-zA-Z0-9\\-_#.?=%;]+)?))/gm\n      //      // /(?<=<|\\[.*\\]:\\s*|\\[.*\\]\\)|src\\s*=\\s*('|\")|href\\s*=\\s*('|\"))((((http(s)?:\\/\\/)(w{3}[.])?)([a-z0-9-]{1,63}(([:]{1}[0-9]{4,})|([.]{1}){1,}([a-z]{2,})){1,}))|([./]+|[a-zA-Z_-]))([a-zA-Z0-9\\-_]+\\.|[a-zA-Z0-9\\-_]+\\/)+((\\.)?[a-zA-Z0-9\\-_#.?=%;]+(\\/)?)/gm\n      // extractedLinks = file.content.match(patternMdFiles)\n      \n      \n    } else if (file.url.match(/\\.(css|(x)?html)$/)) {\n      \n      // #TODO Refactor\n      \n      // let patternHtmlCssFiles = /(?<=(src\\s*=\\s*|href\\s*=\\s*|[a-zA-Z0-9\\-_]+\\s*\\{\\s*.*\\s*:\\s*)('|\"))((((http(s)?:\\/\\/)(w{3}[.])?)([a-z0-9-]{1,63}(([:]{1}[0-9]{4,})|([.]{1}){1,}([a-z]{2,})){1,}))|([./]+|[a-zA-Z\\-_]))([a-zA-Z0-9\\-_]+\\.|[a-zA-Z0-9\\-_]+\\/)+((\\.)?[a-zA-Z0-9\\-_#.?=%;]+(\\/)?)/gm\n      // extractedLinks = file.content.match(patternHtmlCssFiles)\n    }\n    if(!extractedLinks) {\n      return [];\n    }\n    for (const extractedLink of extractedLinks) {\n      var normalizedLink = Paths.normalizePath(extractedLink, file.url)\n      var status = statusCache.get(normalizedLink)\n      if (!status) {\n        status = await this.validateLink(normalizedLink)\n        statusCache.set(normalizedLink, status)\n      }\n      \n      let link = {\n        link: extractedLink,\n        location: extractedLink.includes('lively-kernel.org') ? \"internal\" : \"external\",\n        url: file.url,\n        status: status,\n      }\n      links.push(link)  \n    }\n    return links\n  }\n   \n  static async validateLink(url) { \n    console.log(\"[fileindex] validateLink \" + url)  \n    try {\n      var response = await  BrokenLinkAnalysis.fetch(url, { \n        method: \"GET\", // \"GET\" or \"HEAD\" or \"OPTIONS\" \n        mode: 'no-cors', \n        redirect: \"follow\",\n        referrer: \"no-referrer\", // no-referrer, *client\n      }, FETCH_TIMEOUT) \n\n      if (response.type === \"basic\") { // internal link\n        if (response.ok) {\n          return \"alive\"\n        } else {\n          return \"broken\"\n        } \n      } else if (response.type === \"opaque\") { // external link\n        return \"alive\"\n      }\n    } catch(e) {\n      return \"broken\"\n    } \n    return \"alive\" // at least nothing went wrong?\n  }\n\n  static async fetch(url, options, timeout) {\n    return Promise.race([\n        fetch(url, options),\n        new Promise((_, reject) =>\n            setTimeout(() => {\n              reject(new Error('Fetch timeout: ' + url))\n        }, timeout)\n        )\n    ]);\n  }\n}\n\n\nexport class ModuleDependencyAnalysis {\n  \n   static async resolveModuleDependencies(fileUrl, dependencies) {\n    let resolvedDependencies = new Array()\n    for (const dependency of dependencies) {\n      let resolvedDependency = await System.resolve(dependency.url, fileUrl)\n      if (!resolvedDependency) {\n        resolvedDependencies.push(dependency.url)  \n      } else {\n        resolvedDependencies.push(resolvedDependency)\n      }\n    }\n     \n    return {\n      url: fileUrl,\n      dependencies: resolvedDependencies\n    }\n  }\n}\n\n\n"]}