{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-augment/src/client/fileindex.js"],"names":["Dexie","Strings","babelDefault","cop","Files","Paths","babelPluginSyntaxJSX","babelPluginSyntaxDoExpressions","babelPluginSyntaxFunctionBind","babelPluginSyntaxGenerators","Bibliography","BibtexParser","Markdown","diff","wait","babel","dmp","diff_match_patch","syntaxPlugins","FETCH_TIMEOUT","t","types","getBaseURL","url","replace","FileIndex","current","_current","toString","name","clear","db","files","modules","links","classes","versions","exports","constructor","fileCacheDB","version","stores","history","commits","upgrade","bibliography","bibref","toArray","where","notEqual","update","updateTitleAndTags","updateAllModuleSemantics","updateAllLinks","updateAllLatestVersionHistories","showProgress","modify","ea","extractTitleAndTags","file","content","title","split","tags","matchAll","map","updateAllBibkeys","result","transaction","equals","each","match","bibkey","urlToKey","put","push","addBibrefs","console","log","bib","toJSON","forEach","entry","refentry","key","citationKey","source","toBibtex","type","entryType","references","entryTags","authors","splitAuthors","author","Author","cleanTitle","Title","year","Year","keywords","Keywords","organization","Organization","updateAllBibrefs","addModuleSemantics","extractModuleSemantics","updateModule","updateClasses","updateExportEntry","updateUnboundIdentifiers","ast","parseSource","info","results","parseModuleSemantics","e","warn","semantics","classNames","eaClass","superClassName","superClassUrl","superClass","find","item","System","resolve","nom","methods","length","addClass","allClasses","obsoleteClasses","filter","includes","delete","clazz","functionExports","classExports","exportEntry","functions","addExportEntry","unboundIdentifiers","value","index","self","indexOf","fileUrl","dependencies","resolvedDependencies","ModuleDependencyAnalysis","resolveModuleDependencies","addLinks","BrokenLinkAnalysis","extractLinks","then","bulkPut","checkLink","link","statusCache","Map","normalizedLink","normalizePath","status","get","validateLink","set","checkLinks","checkLinksFile","checkAllLinks","updateAllVersions","addVersions","loadVersions","response","fetch","method","headers","showversions","text","JSON","parse","error","historicFileResult","parents","Error","parentVersionHash","historicFile","previous","modifications","findModifiedClassesAndMethods","loadVersion","window","FileIndexFileCache","cached","loadFile","findSameMethodInClass","aClass","aMethod","static","kind","findSameClassInModule","aModule","createModification","action","previousVersionHash","class","date","user","commitId","previousCommitId","start","end","latestVersion","Array","latestContent","previousContent","astLastest","astPrevious","latest","classLatest","previousClass","methodLastest","latestSource","substring","modification","methodPreviousClass","prevSource","diff1","diff_main","patch","patch_toText","patch_make","previousSource","latestClassMethod","importDeclarations","traverse","ImportDeclaration","path","node","specifierNames","moduleUrl","specifiers","local","dependency","names","ClassDeclaration","id","loc","line","body","leadingComments","ExportNamedDeclaration","isFunctionDeclaration","declaration","isClassDeclaration","Identifier","hasASTBinding","getBindingDeclarationIdentifierPath","binding","getFirstSelectedIdentifierWithName","identifier","startPath","isIdentifier","first","stop","scope","hasBinding","getBinding","identifierPaths","Set","referencePaths","constantViolations","cv","label","func","ShowDexieProgress","currentLabel","withLayers","filename","transform","babelrc","plugins","presets","sourceFileName","moduleIds","sourceMaps","compact","comments","code","resolveModuleSource","undefined","updateFile","stats","r","clone","json","addFile","size","modified","performance","now","fileType","extractReferences","Math","round","dropFile","updateDirectory","baseURL","updateDeleted","filelist","progress","lively","total","contents","i","lastModified","visited","all","add","eaURL","startsWith","has","remove","addDirectory","showAsTable","slice","sorted","_","sortBy","Number","reverse","openComponentInWindow","table","setFromJSO","style","overflow","column","cell","classList","extractedLinks","extractedLink","location","mode","redirect","referrer","ok","options","timeout","Promise","race","reject","setTimeout","resolvedDependency","layer","refineClass","Collection","count","textContent","innerFunc","withoutLayers","lively4fetchHandlers","isFileIndexHandler","unshift","handle","request","finsihed","extraSearchRoots","preferences","serverURL","lively4url","fileIndexWorker","postMessage","message"],"mappings":"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","file":"fileindex.js","sourcesContent":["/*\n * File Index for Static Analys and Searching\n *\n */\n\nimport Dexie from \"src/external/dexie.js\"\nimport Strings from \"src/client/strings.js\"\nimport babelDefault from 'systemjs-babel-build';\nconst babel = babelDefault.babel;\nimport * as cop from \"src/client/ContextJS/src/contextjs.js\";\nimport Files from \"src/client/files.js\"\nimport Paths from \"src/client/paths.js\"\n\nimport babelPluginSyntaxJSX from 'babel-plugin-syntax-jsx'\nimport babelPluginSyntaxDoExpressions from  'babel-plugin-syntax-do-expressions'\nimport babelPluginSyntaxFunctionBind from 'babel-plugin-syntax-function-bind'\nimport babelPluginSyntaxGenerators from 'babel-plugin-syntax-async-generators'\n\nimport Bibliography from 'src/client/bibliography.js'\nimport BibtexParser from 'src/external/bibtexParse.js'\nimport Markdown from \"src/client/markdown.js\"\n\n// import moment from \"src/external/moment.js\";  \nimport diff from 'src/external/diff-match-patch.js';\n\nconst dmp = new diff.diff_match_patch();\n\nconst syntaxPlugins = [babelPluginSyntaxJSX, babelPluginSyntaxDoExpressions, babelPluginSyntaxFunctionBind, babelPluginSyntaxGenerators]\n\nconst FETCH_TIMEOUT = 5000\n\nconst t = babel.types;\n\nimport { wait } from 'utils';\n\n\nfunction getBaseURL(url) {\n  return url.replace(/[#?].*/,\"\")\n}\n\nexport default class FileIndex {\n\n  static current() {\n    // FileIndex._current = null\n    if (!this._current) {\n      this._current = new FileIndex(\"file_index\")\n    }\n    return this._current\n  }\n\n  toString() {\n    return \"[\"+this.name+\":FileIndex]\"\n  }\n\n  clear() {\n    this.db.files.clear()   \n    this.db.modules.clear()\n    this.db.links.clear()\n    this.db.classes.clear()\n    this.db.versions.clear()\n    this.db.exports.clear()\n    // this.db.delete() \n  }\n\n  constructor(name) {\n    this.name = name\n    this.db = this.fileCacheDB()\n  }\n\n  fileCacheDB() {\n    var db = new Dexie(this.name);\n\n    db.version(1).stores({\n        files: 'url,name,type,version,modified,options,title,tags,versions',\n        history: '[url+version],url,name,type,version,modified,options,title,tags',\n        commits: 'hash,message,date',\n        links: '[link+url], link, url, location, status',\n        modules: 'url, *dependencies',\n        classes: '[name+url], name, url, loc, start, end, superClassName, superClassUrl, [superClassName+superClassUrl], *methods', \n        versions: '[class+url+method+commitId+date], [class+method], [class+url+action], [class+url+method], class, url, method, commitId, date, action, user'\n    }).upgrade(function () {\n    })\n    \n    db.version(2).stores({\n        files: 'url,name,type,version,modified,options,title,tags,versions',\n        history: '[url+version],url,name,type,version,modified,options,title,tags',\n        commits: 'hash,message,date',\n        links: '[link+url], link, url, location, status',\n        modules: 'url, *dependencies',\n        classes: '[name+url], name, url, loc, start, end, superClassName, superClassUrl, [superClassName+superClassUrl], *methods', \n        versions: '[class+url+method+commitId+date], [class+method], [class+url+action], [class+url+method], class, url, method, commitId, date, action, user',\n        exports: 'url,*functions,*classes'\n    }).upgrade(function () {\n    })\n     db.version(3).stores({\n        files: 'url,name,type,version,modified,options,title,tags,versions',\n        bibliography: 'key, type, title, author, year, references, organization',\n        history: '[url+version],url,name,type,version,modified,options,title,tags',\n        commits: 'hash,message,date',\n        links: '[link+url], link, url, location, status',\n        modules: 'url, *dependencies',\n        classes: '[name+url], name, url, loc, start, end, superClassName, superClassUrl, [superClassName+superClassUrl], *methods', \n        versions: '[class+url+method+commitId+date], [class+method], [class+url+action], [class+url+method], class, url, method, commitId, date, action, user',\n        exports: 'url,*functions,*classes'\n    }).upgrade(function () {\n    })\n   \n    db.version(4).stores({\n        files: 'url,name,type,version,modified,options,title,tags,versions,bibkey',\n        bibliography: 'key, type, title, author, year, references, organization',\n        history: '[url+version],url,name,type,version,modified,options,title,tags',\n        commits: 'hash,message,date',\n        links: '[link+url], link, url, location, status',\n        modules: 'url, *dependencies',\n        classes: '[name+url], name, url, loc, start, end, superClassName, superClassUrl, [superClassName+superClassUrl], *methods', \n        versions: '[class+url+method+commitId+date], [class+method], [class+url+action], [class+url+method], class, url, method, commitId, date, action, user',\n        exports: 'url,*functions,*classes'\n    }).upgrade(function () {\n    })\n\n    \n    db.version(5).stores({\n        files: 'url,name,type,version,modified,options,title,*tags,*versions,bibkey',  // references\n        bibref: '[url+key], key, url, type, title, author, year, *references, organization',\n        history: '[url+version],url,name,type,version,modified,options,title,*tags',\n        commits: 'hash,message,date',\n        links: '[link+url], link, url, location, status',\n        modules: 'url, *dependencies',\n        classes: '[name+url], name, url, loc, start, end, superClassName, superClassUrl, [superClassName+superClassUrl], *methods', \n        versions: '[class+url+method+commitId+date], [class+method], [class+url+action], [class+url+method], class, url, method, commitId, date, action, user',\n        exports: 'url,*functions,*classes'\n    }).upgrade(function () {    })\n    \n    db.version(6).stores({\n      files: \"url,name,type,version,modified,options,title,*tags,*versions,bibkey,*references\"\n    }).upgrade(function () {    })\n    \n    db.version(7).stores( {\n      bibref: '[url+key], key, url, type, title, *authors, year, *references, organization'\n    }).upgrade(function () {    })\n    db.version(8).stores({\n      \n    }).upgrade(function () {    })\n    db.version(9).stores({\n      bibliography: null\n    }).upgrade(function () {    })\n    db.version(10).stores({\n      bibref: null,\n    }).upgrade(function () {    })\n    db.version(11).stores({\n      bibliography: '[url+key], key, url, type, title, *authors, year, *references, organization'\n    }).upgrade(function () {    })\n    db.version(12).stores({\n      bibliography: '[url+key], key, url, type, title, *authors,*keywords, year, *references, organization'\n    }).upgrade(function () {    })\n    db.version(13).stores({\n      files: \"url,name,type,version,modified,options,title,*tags,*versions,bibkey,*references, *unboundIdentifiers\"\n    }).upgrade(function () {    })\n    return db \n  }\n\n  async toArray() {\n    return this.db.files.where(\"name\").notEqual(\"\").toArray()\n  }\n\n  async update() {\n    await this.updateTitleAndTags()\n    await this.updateAllModuleSemantics()\n    await this.updateAllLinks()\n    await this.updateAllLatestVersionHistories() \n  }\n  \n  async updateTitleAndTags() {\n    return this.showProgress(\"update title\", () => {\n      return this.db.files.where(\"name\").notEqual(\"\").modify((ea) => {\n         this.extractTitleAndTags(ea)\n      });\n    })\n  }\n\n  extractTitleAndTags(file) {\n    if (!file.content) return;\n    file.title = file.content.split(\"\\n\")[0].replace(/## /,\"\")\n    file.tags = Strings.matchAll('(?: )(#[A-Za-z0-9]+)(?=[ \\n])(?! ?{)', file.content)\n      .map(ea => ea[1])\n  }\n  \n  async updateAllBibkeys() {\n    var result = []\n    await this.db.transaction('rw', this.db.files, () => {\n      this.db.files.where(\"type\").equals(\"file\").each((file) => {\n        if (file.url.match(/\\.pdf$/)) {\n          file.bibkey = Bibliography.urlToKey(file.url)\n          this.db.files.put(file)\n          result.push(file)\n        }\n      })\n    })\n    return result\n  }\n\n  \n  addBibrefs(file) {\n    if (file.url.match(/\\.bib$/) && file.content) {    \n      console.log('[fileindex] addBibrefs')\n      var bib = BibtexParser.toJSON(file.content)\n      bib.forEach(entry => {\n        var refentry = {\n              key: entry.citationKey  || \"undefined\",\n              url: file.url,\n              source: BibtexParser.toBibtex([entry], false),\n              type: entry.entryType,\n              references: []\n         }\n        \n          if (entry.entryTags) {\n              refentry.authors = Bibliography.splitAuthors(entry.entryTags.author || entry.entryTags.Author)\n              refentry.title = Bibliography.cleanTitle(entry.entryTags.title || entry.entryTags.Title)\n              refentry.year = entry.entryTags.year || entry.entryTags.Year\n              refentry.keywords = (entry.entryTags.keywords || entry.entryTags.Keywords || \"\").split(\", \")\n              refentry.organization = entry.entryTags.organization || entry.entryTags.Organization\n              \n          }\n         this.db.bibliography.put(refentry)\n      })\n    }\n  }\n  \n  async updateAllBibrefs() {\n    var result = []\n    await this.db.transaction('rw', this.db.files, this.db.bibliography, () => {\n      this.db.files.where(\"type\").equals(\"file\").each((file) => {\n        this.addBibrefs(file)\n      })\n    })\n    return result\n  }\n\n  \n  \n  async updateAllModuleSemantics() {\n    await this.db.transaction('rw', this.db.files,  this.db.classes, this.db.modules, () => {\n      this.db.files.where(\"type\").equals(\"file\").each((file) => {\n        this.addModuleSemantics(file)\n      })\n    })\n  }\n  \n  async addModuleSemantics(file) {\n    if (file.name && file.name.match(/\\.js$/)) { \n      var result = this.extractModuleSemantics(file)\n      this.updateModule(file.url, result)\n      this.updateClasses(file, result)\n      this.updateExportEntry(file.url, result)\n      this.updateUnboundIdentifiers(file, result)\n    }\n  }\n  \n  extractModuleSemantics(file) {\n    try {\n      var ast = this.parseSource(file.url, file.content)\n      if(!ast) {\n        console.info('Could not parse file:', file.url)\n        return []\n      }\n      var results = this.parseModuleSemantics(ast)\n     } catch(e) {\n      console.warn('[fileindex] extractModuleSemantics ', e)\n    }\n    return results;\n  }\n  \n  async updateClasses(file, semantics) {\n    if (!semantics || !semantics.classes) {\n      return\n    }\n    var classNames = []\n    for (var eaClass of semantics.classes) {\n      if (eaClass.superClassName && !eaClass.superClassUrl) {\n        let superClass = semantics.classes.find(item => item.name == eaClass.superClassName)\n        eaClass.superClassName = (superClass) ? superClass.superClassName : ''\n        eaClass.superClassUrl = (superClass) ? file.url : ''\n      } else if (eaClass.superClassName && eaClass.superClassUrl) {\n        eaClass.superClassUrl = await System.resolve(eaClass.superClassUrl, file.url)\n      }\n      eaClass.url = file.url\n      eaClass.nom = eaClass.methods ? eaClass.methods.length : 0\n      classNames.push(eaClass.name)\n      await this.addClass(eaClass)\n    }\n    var allClasses = await this.db.classes.where({url: file.url}).toArray()\n    \n    // deleted obsolete classes\n    var obsoleteClasses = allClasses.filter(ea => !classNames.includes(ea.name))\n    for(let eaClass of obsoleteClasses) {\n     await this.db.classes.where({name: eaClass.name, url: eaClass.url}).delete() \n    }\n  } \n  \n  async addClass(clazz) {\n    await this.db.classes.where({name: clazz.name, url: clazz.url}).delete()\n    this.db.classes.put(clazz)\n  }\n  \n  async updateExportEntry(url, semantics) {\n    if (!semantics || (!semantics.functionExports && !semantics.classExports)) {\n      return\n    }\n    if (semantics.functionExports.length > 0 || semantics.classExports.length > 0) {\n      let exportEntry = {\n        url: url,\n        functions: semantics.functionExports,\n        classes: semantics.classExports\n      }\n      await this.addExportEntry(exportEntry)\n    }\n  }\n  \n  async addExportEntry(exportEntry) {\n    await this.db.exports.where({url: exportEntry.url}).delete()\n    this.db.exports.put(exportEntry)\n  }\n  \n  async updateUnboundIdentifiers(file, semantics) {\n    if (!semantics || (!semantics.unboundIdentifiers)) {\n      return\n    }\n    if (semantics.unboundIdentifiers.length > 0) {\n      file.unboundIdentifiers = semantics.unboundIdentifiers\n        .filter((value, index, self) => self.indexOf(value) === index);\n      this.db.files.put(file);\n    }\n  }\n\n  async updateModule(fileUrl, semantics) {\n    if (!semantics || !semantics.dependencies) {\n      return\n    }\n   \n    let resolvedDependencies = await ModuleDependencyAnalysis.resolveModuleDependencies(fileUrl, semantics.dependencies)\n    this.db.transaction(\"rw\", this.db.modules, () => {\n      this.db.modules.put(resolvedDependencies)\n    })\n  }\n  \n  /* extract links and check status */\n  async updateAllLinks() {\n    await this.db.transaction('rw', this.db.files, this.db.links, () => {\n      this.db.files.where(\"type\").equals(\"file\").each((file) => {\n        this.addLinks(file) \n      })\n    })\n    console.log('updateAllLinks() finished.')\n  }\n  \n  async addLinks(file) {\n    BrokenLinkAnalysis.extractLinks(file).then(links => {\n      this.db.transaction(\"rw!\", this.db.links, async () => {\n        this.db.links.where(\"url\").equals(file.url).delete()\n        if (links) {\n          this.db.links.bulkPut(links)\n        }\n      })\n    })\n  }\n  \n  \n  /* checks status of links */\n  async checkLink(link, statusCache=new Map()) {\n    var normalizedLink = Paths.normalizePath(link.link, link.url)\n    console.log(\"[fileindex] checkLink \" + link.url + \" -> \" +normalizedLink)\n    var status = statusCache.get(normalizedLink)\n    if (!status) {\n      status = await this.validateLink(normalizedLink)\n      statusCache.set(normalizedLink, status)\n    }\n    if (status == \"broken\") {\n      console.warn(\"[fileindex ] broken link \" + link.url + \" -> \" + link.link)\n    }\n    await this.db.transaction(\"rw\", this.db.links, () => {\n      this.db.links.where({url: link.url, link: link.link}).modify({status:  status})\n    })\n    return status\n  }\n\n  async checkLinks(links) {\n    var statusCache = new Map()\n    for(var link of links) {\n      await this.checkLink(link, statusCache)\n      console.log(\"[fileindex] updated status \" + link.link + \" \" + link.status )\n    }\n  }\n  \n  async checkLinksFile(url) {\n    return this.checkLinks(await this.db.links.where({url: url}).toArray())\n  }\n\n  async checkAllLinks() {\n    return this.checkLinks(await this.db.links.toArray())\n  }\n  \n  async extractLinks(file) { \n   return BrokenLinkAnalysis.extractLinks(file)\n  }\n  \n  async validateLink(link) { \n    return BrokenLinkAnalysis.validateLink(link)\n  }\n    \n  async updateAllVersions() {\n     await this.db.transaction('rw', this.db.files, this.db.versions, () => {\n      return this.db.files.where(\"type\").equals(\"file\").toArray()\n    }).then((files) => {\n      files.forEach(file => {\n        if (file.name && file.name.match(/\\.js$/))\n          this.addVersions(file)\n      })\n    }) \n  }\n  \n  async loadVersions(url) {\n    try {\n      let response = await await fetch(url, {\n            method: \"OPTIONS\",\n            headers: {\n              showversions: true,\n              \"debug-initiator\": \"fileindex.js#loadVersions\"\n            }\n          })\n      let text = await response.text()\n      return JSON.parse(text).versions\n    }  catch(e) {\n      console.error(\"[fileindex] could not parse versions for \" + url, e) \n      // throw new Error(\"[fileindex] could not parse versions for \" + url, e) \n    }\n    return []\n  }\n  \n  \n  async addVersions(file) {\n\n    let versions = (await this.loadVersions(file.url)).filter(ea => ea)\n    \n    for (let version of versions) {\n      var historicFileResult  = await this.db.history.where({\n        'url': \"\" + file.url, \n        'version': \"\" + version.version}).toArray()\n      if (historicFileResult.length > 0) {\n        // console.log(\"[fileindex] found \", historicFileResult)\n      } else {\n        // console.log(\"[fileindex] NEW VERSION \" + file.url)\n        \n        if (!version.parents) throw new Error(\"parents missing\")\n        var parentVersionHash = version.parents.split(\" \")[0]\n        \n        var historicFile = {\n          url: file.url,\n          type: file.type,\n          name: file.name,\n          version: version.version,\n          previous: parentVersionHash\n        }\n        // console.log(\"[fileindex] add history\", historicFile)\n        await this.db.transaction(\"rw\", this.db.history, () => { \n          this.db.history.put(historicFile) \n        })\n\n        var modifications = await this.findModifiedClassesAndMethods(file.url, version, parentVersionHash)\n        // console.log(\"[fileindex] add method modifications \", modifications)\n        this.db.transaction(\"rw\", this.db.versions, () => {\n          this.db.versions.bulkPut(modifications)\n        })          \n        \n        \n        // if (i >= 9) break; // consider latest ten versions        \n      }\n    }\n  } \n  \n  async loadVersion(url, version) {\n    if (!window.FileIndexFileCache) {\n      window.FileIndexFileCache = new Map()\n    }\n    var key = url + \"@\" +version\n    var cached = window.FileIndexFileCache.get(key)\n    if (!cached) {\n      cached =  await Files.loadFile(url, version)\n      window.FileIndexFileCache.set(key, cached)\n    }\n    return cached\n  }\n  \n  findSameMethodInClass(aClass, aMethod) {\n    return aClass.methods.find(method => \n        method.name == aMethod.name \n        && method.static == aMethod.static\n        && method.kind == aMethod.kind)\n  }\n  \n  findSameClassInModule(aModule, aClass) {\n    return aModule.classes.find(ea => ea.name == aClass.name)\n  }\n  \n  createModification(fileUrl, action, version, previousVersionHash, aClass, aMethod, source=\"\") {\n    var result =  {\n        url: fileUrl,\n        class: aClass.name,\n        method: \"+null+\",\n        date: version.date,\n        user: version.author,\n        commitId: version.version,\n        previousCommitId: previousVersionHash,\n        action: action,\n        source: source\n    }\n    if (aMethod) {\n      result.method = aMethod.name\n      result.static = aMethod.static,\n      result.kind = aMethod.kind\n      result.start = aMethod.start\n      result.end = aMethod.end\n    }\n    return result\n  }\n  \n  \n  async findModifiedClassesAndMethods(fileUrl, latestVersion, previousVersionHash) {\n    console.log(\"findModifiedClassesAndMethods \", fileUrl, latestVersion, previousVersionHash)\n    let modifications = new Array()\n    let latestContent = await this.loadVersion(fileUrl, latestVersion.version)\n    let previousContent = await this.loadVersion(fileUrl, previousVersionHash)\n    let astLastest = await this.parseSource(fileUrl, latestContent)\n    let astPrevious = await this.parseSource(fileUrl, previousContent)\n\n    \n    if (!astLastest || !astPrevious) {\n      return modifications\n    }\n\n    let latest = await this.parseModuleSemantics(astLastest)\n    let previous = await this.parseModuleSemantics(astPrevious)\n    // classes\n    for (let classLatest of latest.classes) {\n      try {\n        let previousClass = this.findSameClassInModule(previous, classLatest)\n        if (!previousClass) { // added class\n          modifications.push(this.createModification(\n            fileUrl,\n            (!previousClass) ? \"added\" : \"modified\", \n            latestVersion,  previousVersionHash, \n            classLatest))\n        }\n        // methods\n        for (let methodLastest of classLatest.methods) {\n          var latestSource = latestContent.substring(methodLastest.start, methodLastest.end)\n          var modification = this.createModification(fileUrl, \"added\", latestVersion,  previousVersionHash, classLatest, methodLastest, latestSource)\n         \n          if (!previousClass) { // added method\n            modifications.push(modification)\n          } else {\n            let methodPreviousClass = this.findSameMethodInClass(previousClass, methodLastest)\n            if (methodPreviousClass) {\n              var prevSource = previousContent.substring(methodPreviousClass.start, methodPreviousClass.end)\n              if (prevSource != latestSource) {\n                modification.action = \"modified\"\n                var diff1 = dmp.diff_main(prevSource, latestSource);\n                modification.patch = dmp.patch_toText(dmp.patch_make(diff1))\n                modification.previousSource = prevSource\n                modifications.push(modification) \n              } else {\n                // the source was the same in the previous version\n              }\n            } else  {\n              // method was not there in previous version\n              modification.action = \"added\"\n              modifications.push(modification) \n            }\n          }\n        }\n      \n        if (!previousClass) continue;\n        for (let methodPreviousClass of previousClass.methods) {\n          let latestClassMethod =  this.findSameMethodInClass(classLatest, methodPreviousClass) \n          if (!latestClassMethod) { // deleted method\n            modifications.push(\n              this.createModification(fileUrl, \"deleted\", latestVersion,  previousVersionHash, classLatest, methodPreviousClass, \"\"))\n          }\n        }\n      } catch(error) {\n        console.error(\"Version history couldn't created for class: \", classLatest, error)\n      }\n    }\n    return modifications \n  }\n  \n  parseModuleSemantics(ast) {\n    let classes = [];\n    let dependencies = [];\n    let importDeclarations = new Map();\n    let functionExports = [];\n    let classExports = [];\n    let unboundIdentifiers = [];\n    babel.traverse(ast,{\n      ImportDeclaration(path) {\n        if (path.node.source && path.node.source.value) {\n          let specifierNames = []\n          let moduleUrl = path.node.source.value\n          if (path.node.specifiers) { \n            path.node.specifiers.forEach(function(item) {\n              if (item.type === \"ImportNamespaceSpecifier\") {\n                specifierNames.push('*')\n                importDeclarations.set('*', moduleUrl)\n              } else {\n                specifierNames.push(item.local.name)\n                importDeclarations.set(item.local.name, moduleUrl)\n              }\n            })\n          }\n          let dependency = {\n            url: path.node.source.value,\n            names: specifierNames\n          }\n           dependencies.push(dependency)\n        }\n      },\n      ClassDeclaration(path) {\n        let superClassName = ''\n        let superClassUrl = ''\n        if (path.node.id) {\n          let clazz = {\n            name: path.node.id.name,\n            start: path.node.start, // start byte \n            end: path.node.end,     // end byte\n            loc: path.node.loc.end.line - path.node.loc.start.line + 1\n          }\n          superClassName = (path.node.superClass) ? path.node.superClass.name : ''\n          superClassUrl = importDeclarations.get(superClassName)\n          let methods = []\n          \n          if (path.node.body.body) {\n            path.node.body.body.forEach(function(item) {\n              if(item.type === \"ClassMethod\") {\n                let method = {\n                  name: item.key.name,\n                  loc: item.loc.end.line - item.loc.start.line + 1,\n                  start: item.start,\n                  kind: item.kind,\n                  static: item.static,\n                  end: item.end,\n                  leadingComments: item.leadingComments\n                }\n                methods.push(method)\n              }              \n            })\n          }\n          clazz.methods = methods\n          clazz.superClassName = superClassName\n          clazz.superClassUrl = superClassUrl\n          classes.push(clazz)\n        } \n      },\n      ExportNamedDeclaration(path) {\n        if(t.isFunctionDeclaration(path.node.declaration)) {\n          functionExports.push(path.node.declaration.id.name)\n        }\n        if(t.isClassDeclaration(path.node.declaration)) {\n          classExports.push(path.node.declaration.id.name)\n        }\n      },\n      Identifier(path) {\n        if (!(FileIndex.hasASTBinding(path))) {\n          unboundIdentifiers.push(path.node.name);\n        }\n      }\n    })\n    return {classes, dependencies, functionExports, classExports, unboundIdentifiers}\n  }\n  \n  static getBindingDeclarationIdentifierPath(binding) {\n    return this.getFirstSelectedIdentifierWithName(binding.path, binding.identifier.name);\n  }\n  \n  static getFirstSelectedIdentifierWithName(startPath, name) {\n    if (t.isIdentifier(startPath.node, { name: name })) {\n      return startPath;\n    }\n    var first;\n    startPath.traverse({\n      Identifier(path) {\n        if (!first && t.isIdentifier(path.node, { name: name })) {\n          first = path;\n          path.stop();\n        }\n      }\n    });\n    return first;\n  }\n  \n  static hasASTBinding(identifier) {\n    if (!identifier.scope.hasBinding(identifier.node.name)) return false;\n\n    const binding = identifier.scope.getBinding(identifier.node.name);\n    if (!binding) return false;\n    \n    const identifierPaths = [...new Set([FileIndex.getBindingDeclarationIdentifierPath(binding), ...binding.referencePaths, ...binding.constantViolations.map(cv => FileIndex.getFirstSelectedIdentifierWithName(cv, binding.identifier.name))])];\n    return identifierPaths.includes(identifier);\n  }\n  \n  // ********************************************************\n\n  showProgress(label, func) {\n    ShowDexieProgress.currentLabel = label\n    return cop.withLayers([ShowDexieProgress], () => {\n        return func()\n    })\n  }\n  \n  parseSource(filename, source) {\n    try {\n      return babel.transform(source, {\n          babelrc: false,\n          plugins: [...syntaxPlugins],\n          presets: [],\n          filename: filename,\n          sourceFileName: filename,\n          moduleIds: false,\n          sourceMaps: true,\n          compact: false,\n          comments: true,\n          code: true,\n          ast: true,\n          resolveModuleSource: undefined\n      }).ast\n    } catch(e) {\n      console.log('FileIndex, could not parse: ' + filename, e)\n      return undefined\n    }\n  }\n  \n  async updateFile(url) {\n    url = getBaseURL(url)\n    console.log(\"[fileindex] updateFile \" + url)\n    var stats = await fetch(url, {\n      method: \"OPTIONS\", \n      headers: {\n        \"debug-initiator\": \"fileindex.js#updateFile\"\n      }\n    }).then(r => r.clone().json())\n    \n    if (!stats.error) {\n      await this.addFile(url, stats.name, stats.type, stats.size, stats.modified)\n    }\n  } \n    \n  async addFile(url, name=\"\", type, size, modified) {\n    var start = performance.now()\n    if (url.match(\"/node_modules\") || url.match(/\\/\\./) ) {\n      // console.log(\"FileIndex ignore  \" + url)\n      return\n    }    \n    console.log(\"[fileindex] addFile \" + url)\n\n    if (type == \"file\") {\n      var json = (await this.loadVersions(url))\n      if (json) {\n        var versions = json.map(ea => ea && ea.version).filter(ea => ea)  \n      } else {\n        console.warn(\"[lively-index] could not addFile \" +url)\n      }\n       \n    }\n    \n    var file = {\n      url: url,\n      name: name,\n      size: size,\n      modified: modified,\n      versions: versions\n    }\n  \n    if (name.match(/\\.((css)|(js)|(md)|(txt)|(bib)|(x?html))$/)) {\n      if (size < 100000) {\n        let response = await fetch(url, {\n          method: \"GET\",\n          headers: {\n            \"debug-initiator\": \"fileindex.js#addFile\"\n          }\n        })\n        file.version = response.clone().headers.get(\"fileversion\")\n        file.content = await response.clone().text()    \n      }\n    }\n\n    let fileType = url.replace(/.*\\./,\"\")\n    if(type == \"directory\") {\n      type = \"directory\"\n    }\n    file.type = type\n    \n    if (file.content) {\n      this.extractTitleAndTags(file) \n      this.addLinks(file)\n      if (file.name.match(/\\.md$/)) {\n        file.references = Markdown.extractReferences(file.content)\n      }\n    }\n    \n    if (file.name.match(/\\.pdf$/)) {\n      file.bibkey = Bibliography.urlToKey(file.url)\n    }\n    \n    file.unboundIdentifiers = []\n    \n    \n    await this.db.transaction(\"rw\", this.db.files, () => { \n      this.db.files.put(file) \n    })\n    \n    if (file.name.match(/\\.bib$/)) {\n      await this.db.transaction(\"rw\", this.db.bibliography, () => { \n        this.addBibrefs(file)\n      })\n    }\n\n    if (file.name.match(/\\.js$/)) {\n      await this.addModuleSemantics(file)\n      // await this.addVersions(file) // #Disabled for now, this is expensive!\n    }\n    \n    console.log(\"[fileindex] addFile \"+ url + \" FINISHED (\" + Math.round(performance.now() - start) + \"ms)\")\n  }\n\n  async dropFile(url) {\n    console.log(\"FileIndex drop \" + url + \" from index\")\n    this.db.transaction(\"rw\", this.db.files, () => {\n      this.db.files.delete(url)\n    })\n  }\n  \n  async updateDirectory(baseURL, showProgress, updateDeleted) {\n    var json = await fetch(baseURL, {\n      method: \"OPTIONS\",\n      headers: {\n        filelist  : true,\n        \"debug-initiator\": \"fileindex.js#updateDirectory\"\n      }\n    }).then(r => {\n      if (r.status == 200) {\n        return r.json()\n      } else {\n        console.log(\"FileIndex fetch failed \", baseURL, r)\n      }\n    })\n    if (!json) {\n      console.log(\"FileIndex could not update \" + baseURL)\n      return\n    }\n    \n    if (showProgress) {\n      var progress = await lively.showProgress(\"add \" + baseURL.replace(/\\/$/,\"\").replace(/.*\\//,\"\"))\n      var total = json.contents.length\n      var i=0\n    }\n\n    var lastModified= new Map()\n    var visited = new Set()\n    var all = new Set()\n    await this.db.files.each(file => {\n      all.add(file.url)\n      lastModified.set(file.url, file.modified) // #Workaround #PerformanceBug in #IndexDB \n    })\n    \n    try {\n      for(let ea of json.contents) {\n          if (showProgress) progress.value = i++ / total;\n\n          await wait(1000) // slow down the indexing\n        \n          let eaURL = baseURL.replace(/\\/$/,\"\") + ea.name.replace(/^\\./,\"\")\n          let name = eaURL.replace(/.*\\//,\"\")\n          if (lastModified.get(eaURL) !== ea.modified) {\n            await this.addFile(eaURL, name, ea.type, ea.size, ea.modified)\n          }\n          visited.add(eaURL)\n      }\n      all.forEach(eaURL => {\n        if (eaURL.startsWith(baseURL) && !visited.has(eaURL)) {\n          this.dropFile(eaURL)\n        }\n      }) \n    } finally {\n      if (showProgress) progress.remove()\n    } \n    console.log(\"FileIndex updateDirectory finished\")\n  }\n\n  async addDirectory(baseURL) {\n    this.updateDirectory(baseURL, true) // much faster and better\n  }\n  showAsTable() {\n    var result= []\n    this.db.files.each(ea => {\n      result.push({\n        url:ea.url,\n        size: ea.size,\n        title: (ea.title) ? ea.title.replace(/</g, \"&lt;\").slice(0,100) : \"\",\n        tags: ea.tags,\n        classes: ea.classes,\n        functions: ea.functions\n        })\n    }).then(() => {\n      var sorted = _.sortBy(result, ea => Number(ea.size)).reverse()\n\n      lively.openComponentInWindow(\"lively-table\").then(table => {\n        table.setFromJSO(sorted)\n        table.style.overflow = \"auto\"\n        table.column(\"size\").forEach(cell => cell.classList.add(\"number\"))\n      })\n    })\n  }\n}\n\nclass 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\nclass 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\ncop.layer(self, \"ShowDexieProgress\").refineClass(FileIndex.current().db.Collection, {\n  async modify(func) {\n    var i = 0\n    var total = await this.count()\n    var progress = await lively.showProgress(\"update\");\n    if (ShowDexieProgress.currentLabel) {\n      progress.textContent = ShowDexieProgress.currentLabel\n    }\n    var innerFunc = function(ea)  {\n      progress.value = i++ / total\n      func(ea)\n    }\n    // #TODO 'cop.proceed' does not work in the async setting...\n    var result = await cop.withoutLayers([ShowDexieProgress], async () => {\n      return this.modify(innerFunc)\n    })\n    progress.remove()\n    return result\n  }\n})\n\n\nif (self.lively4fetchHandlers) {  \n  \n  // remove old instances of me\n  self.lively4fetchHandlers = self.lively4fetchHandlers.filter(ea => !ea.isFileIndexHandler);\n  self.lively4fetchHandlers.unshift({\n    isFileIndexHandler: true,\n    handle(request, options) {\n      // do nothing\n    },\n    async finsihed(request, options) {\n      var url = (request.url || request).toString()\n      var method = \"GET\"\n      if (options && options.method) method = options.method;\n      \n      var extraSearchRoots = []    \n      if (window.lively && lively.preferences) {\n        extraSearchRoots = lively.preferences.get(\"ExtraSearchRoots\")  \n      }\n    \n      var serverURL = lively4url.replace(/\\/[^/]*$/,\"\")\n      if (url.match(serverURL) || extraSearchRoots.find(ea => url.match(ea))) {\n        if (method == \"PUT\") {\n         //  \n          // #TODO #PerformanceBug move this to worker and do it async....\n          // await FileIndex.current().updateFile(url)\n          if (lively.fileIndexWorker) {\n            lively.fileIndexWorker.postMessage({message: \"updateFile\", url: url})\n          }\n          \n        }\n        if (method == \"DELETE\") {\n          //\n          // await FileIndex.current().dropFile(url)   \n          if (lively.fileIndexWorker) {\n            lively.fileIndexWorker.postMessage({message: \"dropFile\", url: url})\n          }\n        }\n      }\n    }\n  })\n  \n}\n"]}