{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-drawio/src/client/fileindex.js"],"names":["Dexie","Strings","babelDefault","cop","babel","FileIndex","current","_current","toString","name","clear","db","files","constructor","fileCacheDB","version","stores","modules","classes","methods","upgrade","toArray","where","notEqual","update","updateTitleAndTags","updateFunctionAndClasses","showProgress","modify","file","match","extractFunctionsAndClasses","ea","extractTitleAndTags","label","func","ShowDexieProgress","currentLabel","withLayers","content","title","split","replace","tags","matchAll","map","ast","parseSource","url","result","parseFunctionsAndClasses","functions","traverse","Function","path","node","key","push","id","ClassDeclaration","filename","source","transform","babelrc","plugins","presets","sourceFileName","moduleIds","sourceMaps","compact","comments","code","resolveModuleSource","undefined","e","console","log","updateFile","stats","fetch","method","then","r","json","addFile","type","size","modified","warn","response","headers","get","text","fileType","transaction","put","dropFile","delete","updateDirectory","baseURL","updateDeleted","filelist","status","progress","lively","total","contents","length","i","lastModified","Map","visited","Set","all","each","add","set","value","eaURL","forEach","startsWith","has","remove","addDirectory","showAsTable","slice","sorted","_","sortBy","Number","reverse","openComponentInWindow","table","setFromJSO","style","overflow","column","cell","classList","layer","self","refineClass","Collection","count","textContent","innerFunc","withoutLayers","lively4fetchHandlers","filter","isFileIndexHandler","unshift","handle","request","options","finsihed","serverURL","lively4url"],"mappings":"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","file":"fileindex.js","sourcesContent":["/*\n * File Index for Static Analys and Searching\n *\n * #TODO How do we get this a) into a web worker and b) trigger this for changed files\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\";\n\nexport default class FileIndex {\n\n  static current() {\n    // FileIndex._current = null\n    if (!this._current) {\n      this._current = new FileIndex(\"file_cache\")\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.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,classes,functions',\n        modules: '++id,url,name,dependencies',\n        classes: '++id,url,name,methods',\n        methods: '++id,url,name'\n    }).upgrade(function () {\n    })\n\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.updateFunctionAndClasses()\n  }\n\n  async updateFunctionAndClasses() {\n    return this.showProgress(\"extract functions and classes\", () => {\n      this.db.files.where(\"name\").notEqual(\"\").modify((file) => {\n        if (file.name && file.name.match(/\\.js$/)) {\n          this.extractFunctionsAndClasses(file)\n        }\n      })\n    })\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  showProgress(label, func) {\n    ShowDexieProgress.currentLabel = label\n    return cop.withLayers([ShowDexieProgress], () => {\n        return func()\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  extractFunctionsAndClasses(file) {\n    var ast = this.parseSource(file.url, file.content)\n    var result = this.parseFunctionsAndClasses(ast)\n//     console.log(file.url + \" functions: \" + result.functions)\n//     console.log(file.url + \" classes: \" + file.classes)\n    \n    file.classes = result.classes\n    file.functions =  result.functions\n  }\n  \n \n  parseFunctionsAndClasses(ast) {\n    var functions = []\n    var classes = []\n    babel.traverse(ast,{\n      Function(path) {\n        if (path.node.key) {\n          functions.push(path.node.key.name)\n        } else if (path.node.id) {\n          functions.push(path.node.id.name)\n        }\n      },\n      ClassDeclaration(path) {\n        if (path.node.id) {\n          classes.push(path.node.id.name)\n        }\n      }\n    })\n    return {functions, classes}\n  }\n\n  parseSource(filename, source) {\n    try {\n      return babel.transform(source, {\n          babelrc: false,\n          plugins: [],\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)\n      return undefined\n    }\n  }\n\n  async updateFile(url) {\n    console.log(\"FileCache updateFile \" + url)\n    var stats = await fetch(url, {\n      method: \"OPTIONS\"\n    }).then(r => r.json())\n    this.addFile(url, stats.name, stats.type, stats.size, stats.modified)\n  }\n    \n  async addFile(url, name, type, size, modified) {\n    \n    if (url.match(\"/node_modules\") || url.match(/\\/\\./) ) {\n      // console.log(\"FileIndex ignore  \" + url)\n      return\n    }\n    if (!name) {\n      console.warn(\"FileIndex addFile failed because no name for  \" + url)\n      return\n    }\n    \n    console.log(\"FileIndex update  \" + url)\n\n    var file = {\n      url: url,\n      name: name,\n      size: size,\n      modified: modified\n    }\n    \n    if (name.match(/\\.((css)|(js)|(md)|(txt)|(x?html))$/)) {\n      if (size < 100000) {\n        let response = await fetch(url)\n        file.version = response.headers.get(\"fileversion\")\n        file.content = await response.text()    \n      }\n    };\n\n\n    // await new Promise(resolve => setTimeout(resolve, 100))\n\n    // let options = await fetch(url,\n    //  {method: \"OPTIONS\", headers: {showversions: true}}).then(resp => resp.json())\n    //  versions: options.versions\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      if (type == \"js\") {\n        this.extractFunctionsAndClasses(file)\n      }      \n    }\n    this.db.transaction(\"rw\", this.db.files, () => {\n      this.db.files.put(file)\n    })\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  \n  \n  async updateDirectory(baseURL, showProgress, updateDeleted) {\n    var json = await fetch(baseURL, {\n      method: \"OPTIONS\",\n      headers: {\n        filelist  : true\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          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    \n    console.log(\"FileIndex updateDirectory finished\")\n  }\n\n  async addDirectory(baseURL) {\n    \n\n    \n    this.updateDirectory(baseURL, true) // much faster and better\n  }\n    \n//   async addDirectory(baseURL, depth) {\n//     console.log(\"addDirectory \" + baseURL + \" \"  + depth)\n//     var contents = (await fetch(baseURL, {method: \"OPTIONS\"}).then( resp => resp.json())).contents\n//     var progress = await lively.showProgress(\"add \" + baseURL.replace(/.*\\//,\"\"))\n//     var total = contents.length\n//     var i=0\n//     try {\n//       for(let ea of contents) {\n//         progress.value = i++ / total;\n//         let eaURL = baseURL.replace(/\\/$/,\"\")  + \"/\" + ea.name\n//         let name = eaURL.replace(/.*\\//,\"\")\n//         let size = ea.size;\n//         if (name.match(/^\\./)) {\n//           console.log(\"ignore hidden file \" + eaURL)\n//           continue\n//         };\n\n//         if (ea.type == \"directory\" && (depth > 0)) {\n//           console.log(\"[file cache] decent recursively: \" + eaURL )\n//           this.addDirectory(eaURL, depth - 1)\n//         }\n//         if (await this.db.files.where(\"url\").equals(eaURL).first()) {\n//           console.log(\"already in cache: \" + eaURL)\n//         } else {\n//           this.addFile(eaURL, name, ea.type,  size, ea.modified /* may be be set */)\n//         }\n//       }\n//     } finally {\n//       progress.remove()\n//     }\n//   }\n\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      console.log(\"result: \" + result.length)\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    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 serverURL = lively4url.replace(/\\/[^/]*$/,\"\")\n      if (url.match(serverURL)) {\n        if (method == \"PUT\") {\n         //  \n          FileIndex.current().updateFile(url)\n        }\n        if (method == \"DELETE\") {\n          //\n          FileIndex.current().dropFile(url)   \n        }\n      }\n    }\n  })\n  \n}\n\n\n\n"]}