{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-markus/src/components/tools/lively-search.js"],"names":["Morph","lively","Search","initialize","windowTitle","container","get","registerButtons","html","registerInputs","roots","value","lively4url","replace","forEach","selector","addEventListener","evt","keyCode","onSearchButton","e","console","error","search","getAttribute","searchFile","focus","clearLog","s","innerHTML","browseSearchResult","url","pattern","openBrowser","undefined","onSearchResults","list","ea","text","item","document","createElement","filename","file","link","querySelector","href","title","self","onclick","appendChild","setAttribute","onReplaceButton","replaceInFiles","onEnableReplaceButton","getSearchURL","location","host","searchRoot","length","log","searchInProgres","JSON","stringify","start","Date","now","searchFilesList","root","exclude","result","fetch","headers","then","r","split","map","line","match","filter","files","entry","getRequest","lastVersion","contents","newcontents","RegExp","lastversion","putRequest","method","body","status","notify","livelyMigrate","other"],"mappings":"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","file":"lively-search.js","sourcesContent":["/* Lively Server-side Search */\n\nimport Morph from 'src/components/widgets/lively-morph.js';\nimport lively from 'src/client/lively.js';\n\n\nexport default class Search extends Morph {\n  initialize() {\n    this.windowTitle = \"File Search\";\n    var container = this.get(\".container\");\n    this.registerButtons();\n    lively.html.registerInputs(this);\n    \n    var roots = this.get(\"#rootsInput\").value \n    if (!roots || roots == \"\") {\n      this.get(\"#rootsInput\").value = lively4url.replace(/.*\\//,\"\");\n    }\n\n    ['#rootsInput', '#excludesInput', '#searchInput'].forEach(selector => {\n      lively.addEventListener(\"lively-search\", this.get(selector), \"keyup\", (evt) => { \n          if(evt.keyCode == 13) { \n            try {\n              this.onSearchButton(); \n            } catch(e) {\n              console.error(e);\n            }\n          }\n      });\n    });\n      \n    var search = this.getAttribute(\"search\");\n    if(search) {\n      this.get(\"#searchInput\").value = search;\n      this.searchFile();\n    }\n  }\n\n  focus() {\n    this.get(\"#searchInput\").focus();\n  }\n  clearLog(s) {\n    this.get(\"#searchResults\").innerHTML=\"\";\n  }\n\n  browseSearchResult(url, pattern) {\n    return lively.openBrowser(url, true, pattern, undefined, /* lively.findWorldContext(this)*/);\n  }\n\n  onSearchResults(list) {\n    for (var ea of list) {\n      let pattern = ea.text;\n      let url = ea.url;\n      let item = document.createElement(\"tr\");\n      let filename = ea.file.replace(/.*\\//,\"\")\n      item.innerHTML = `<td class=\"filename\"><a>${filename}</a></td><td><span =\"pattern\">${\n        pattern.replace(/</g,\"&lt;\")}</span></td>`;\n      let link = item.querySelector(\"a\");\n      link.href = ea.file;\n      link.url = url\n      link.title = ea.file\n      var self = this\n      link.onclick = () => {\n        this.browseSearchResult(url, pattern);\n        return false;\n      };\n      this.get(\"#searchResults\").appendChild(item);\n    }\n  }\n\n  onSearchButton() {\n    this.setAttribute(\"search\", this.get(\"#searchInput\").value);\n    this.searchFile();\n  }\n  \n  onReplaceButton() {\n    this.replaceInFiles(\n      this.get(\"#searchInput\").value,\n      this.get(\"#replaceInput\").value)\n  }\n  \n  onEnableReplaceButton() {\n    if (this.getAttribute(\"replace\") == \"true\") {\n      this.setAttribute(\"replace\", \"false\")\n    } else {\n      this.setAttribute(\"replace\", \"true\")\n    }\n  }\n  \n  getSearchURL() {\n    // return \"https://lively-kernel.org/lively4S2/_search/files\" // #DEV\n    if (document.location.host == \"livelykernel.github.io\")\n      return \"https://lively-kernel.org/lively4/_search/files\";\n    else\n      return lively4url + \"/../_search/files\";\n  }\n  \n  get searchRoot() {\n    return this.get(\"#rootsInput\").value\n  }\n\n  set searchRoot(value) {\n    return this.get(\"#rootsInput\").value = value\n  }\n\n  async searchFile(text) {\n    this.clearLog()\n    if (text) {\n      this.setAttribute(\"search\", text); // #TODO how to specify data-flow / connections...\n      this.get(\"#searchInput\").value = text;\n    }\n    // if (this.searchInProgres) return;\n    var search = this.get(\"#searchInput\").value;\n    if (search.length < 2) {\n      this.log(\"please enter a longer search string\");\n      this.searchInProgres = false;\n      return; \n    }\n    this.clearLog();\n    this.get(\"#searchResults\").innerHTML = \"searching ...\" + JSON.stringify(search);\n    let start = Date.now();\n    var list = await this.searchFilesList(this.searchRoot, search, this.get(\"#excludesInput\").value )\n    this.searchInProgres = false;\n    this.clearLog();\n    //this.log('found');\n    this.log(`finished in ${Date.now() - start}ms`);\n    this.onSearchResults(list);\n  }\n\n  async searchFilesList(root, pattern, exclude) {\n    this.searchInProgres = true;\n    var result = await fetch(this.getSearchURL(), {\n    headers:  { \n         \"searchpattern\": pattern,\n         \"rootdirs\": root,\n         \"excludes\": exclude,\n      }\n    }).then(r => r.text())\n    var list = result.split(\"\\n\").map( ea => {\n      console.log(\"ea \" + ea)\n      var line = ea.match(/([^:]*):(.*)/)\n      return line && {\n        file: line[1], \n        url: lively4url.replace(/[^/]*$/,\"\") + line[1],\n        text: line[2] \n      }\n    }).filter(ea => ea)\n    this.files = list\n    this.searchInProgres = false;\n    return list\n  }\n\n  log(s) {\n    var entry = <tr><td class=\"logentry\" colspan=\"2\">{s}</td></tr>\n    this.get(\"#searchResults\").appendChild(entry)\n  }\n  \n  async replaceInFiles(pattern, replace) {\n    this.clearLog()\n    // var root = \"https://lively-kernel.org/lively4/\"\n    // var pattern = \"src/external/chai.js\"\n    // var replace = \"src/external/chai.js\"\n    if(this.searchInProgres || !this.files) {\n      this.log(\"please search files first\")\n    }\n    for (var file of this.files) {\n      let url = file.url\n      var getRequest = await fetch(url)\n      var lastVersion = getRequest.headers.get(\"fileversion\")\n      debugger\n      let contents = await getRequest.text()\n      let newcontents = contents.replace(new RegExp(pattern), replace)\n      if (contents == newcontents) {\n        this.log(\"pattern did not match \" + pattern)\n        return \n      }\n      var headers = {}\n      if (lastVersion) {\n        headers.lastversion = lastVersion\n      }\n      let putRequest = await fetch(url, {\n        method: \"PUT\",\n        body: newcontents,\n        headers: headers\n      })\n      this.log(\"replaced in \" + pattern + \" with \"+ replace + \" in \" +url)\n      if (putRequest.status == 200) {\n        // #Idea: show diff?\n        lively.notify(\"Replaced in \" + file.file)\n      } else {\n        console.log(\"could not change \" + file + \", because \" + putRequest )\n      }  \n    }  \n  }\n  \n  livelyMigrate(other) {\n    this.get(\"#rootsInput\").value =  other.get(\"#rootsInput\").value\n    this.get(\"#searchInput\").value =  other.get(\"#searchInput\").value\n    this.get(\"#replaceInput\").value =  other.get(\"#replaceInput\").value\n    this.get(\"#excludesInput\").value =  other.get(\"#excludesInput\").value\n  }\n  \n}\n"]}