{"version":3,"sources":["https://lively-kernel.org/lively4/swd21-event-sourcing/src/client/files.js"],"names":["generateUuid","uuid","_","sourcemap","Files","fillCachedFileMap","root","lively4url","filelist","fetch","method","headers","then","r","json","contents","map","ea","name","replace","url","cachedFileMap","set","exists","self","lively4cacheFiles","Map","parseSourceReference","ref","match","args","split","m","lineAndColumn","moduleData","System","metadata","load","sourceMap","smc","SourceMapConsumer","originalPositionFor","line","Number","column","toString","fetchChunks","fetchPromise","eachChunkCB","doneCB","response","reader","body","getReader","decoder","TextDecoder","all","read","result","text","decode","value","Uint8Array","stream","done","loadFileResponse","version","resolve","fileversion","loadFile","console","log","loadJSON","copyURLtoURL","fromURL","toURL","getResp","e","lively4serverurl","blob","saveFile","data","urlString","options","moveFile","newURL","fromServerURL","serverURL","toServerURL","resp","destination","lively","notify","content","putResponse","status","confirm","delResponse","getResponse","putAgainResponse","statFile","walkDir","dir","existFile","stats","type","cachedInfo","get","window","__karma__","error","isURL","isFile","isDirectory","directory","string","location","href","extension","undefined","toLowerCase","tempfile","files","stringToBlob","encoded","encodeURIComponent","readBlobAsText","fileOrBlob","Promise","FileReader","onload","event","target","readAsText","readBlobAsDataURL","readAsDataURL","versionHistoriesLoaded","_versionHistoriesLoaded","loadVersions","cached","useCached","maxCacheTime","lastLoaded","Date","now","versionscache","caches","open","showversions","put","clone","_sortIntoFileTree","path","element","next","shift","children","push","find","fileTree","tree","list","filter","absolute","modified","size","visualizeFileTreeMap","openComponentInWindow","tm","setTreeData","isVideo","isAudio","isPicture","generateMarkdownFileListing","anchors","Array","from","querySelectorAll","imgs","links","getAttribute","concat","document","createElement","source","fileNames","query","getURL","forEach","includes","item","textContent","appendChild","code","length","checkoutGithubFile","withSynctoolDo","syncTool","respository","branch","getServerURL","gitControl","gitfilepath","func","container","create","setServerURL","repository","setRepository","updateLoginStatus","getBranch","remove","unzip","JSZip","loadAsync","githubFileInfo","remoteURL","userAndRepository","user","repo","rawURL","warn","JSON","stringify","getEnding","knownServers","startsWith","repositoryName","setURLAsBackground","back","hasGitMergeConflict","extractGitMergeConflictVersions","sourceWithConflict","versions","uniq","chooseFile","ui","chooseFiles"],"mappings":"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","file":"files.js","sourcesContent":["/*MD \n# Files API\n\nMD*/\n\n\nimport { uuid as generateUuid } from 'utils';\nimport _ from 'src/external/lodash/lodash.js'\nimport sourcemap from 'src/external/source-map.min.js';\n\nexport default class Files {\n\n  static async fillCachedFileMap() {\n    var root = lively4url +  \"/\"\n    var filelist =   await fetch(root, {\n      method: \"OPTIONS\",\n      headers: {\n        filelist: true\n      }\n    }).then(r => r.json()).then(r => r.contents.map(ea => ea.name.replace(/^\\.\\//,url)))\n    var map = this.cachedFileMap()\n    for(var url of filelist) {\n      map.set(url, {exists: true})\n    }\n  }\n  \n  static cachedFileMap() {\n    \n    if (!self.lively4cacheFiles) {\n      self.lively4cacheFiles = new Map()  // indexDB or dexie are to slow (60ms for simple checking if it is there #TODO)\n    } \n    return self.lively4cacheFiles \n  }\n  \n  static parseSourceReference(ref) {\n    if(ref.match(\"!\")) {\n      var url = ref.replace(/!.*/,\"\")\n      var args = ref.replace(/.*!/,\"\").split(/:/)\n    } else {\n      var m = ref.match(/(.*):([0-9]+):([0-9]+)$/)\n      args = [m[2], m[3]]\n      url = m[1]\n    }\n    \n    var lineAndColumn\n    if (args[0] == \"transpiled\") {\n      // hide transpilation in display and links\n      var moduleData = System[\"@@registerRegistry\"][url]\n      if (moduleData) {\n      var map = moduleData.metadata.load.sourceMap\n      var smc =  new sourcemap.SourceMapConsumer(map)\n      lineAndColumn = smc.originalPositionFor({\n          line: Number(args[1]),\n          column: Number(args[2])\n        })\n      } else {\n        lineAndColumn = {line: args[1], column: args[2]}\n      }\n    } else {\n      lineAndColumn = {line: args[0], column: args[1]}\n    }\n    lineAndColumn.url = url\n    lineAndColumn.toString = function() {\n        return \"\" + this.url.replace(lively4url, \"\") + \":\" + this.line + \":\" + this.column\n    }\n    return lineAndColumn\n  }\n  \n  \n  static fetchChunks(fetchPromise, eachChunkCB, doneCB) {\n    fetchPromise.then(function(response) {\n        var reader = response.body.getReader();\n        var decoder = new TextDecoder();\n        var all = \"\";\n        (function read() {\n          reader.read().then(function(result) {\n            var text = decoder.decode(result.value || new Uint8Array, {\n              stream: !result.done\n            });\n            all += text\n            if (eachChunkCB) eachChunkCB(text, result)\n            if (result.done) {\n              if (doneCB) doneCB(all, result)\n            } else {\n              read() // fetch next chunk\n            }\n          })\n        })()\n      })\n  }\n\n  static async loadFileResponse(url, version) {\n    url = this.resolve(url.toString())\n    return fetch(url, {\n      headers: {\n        fileversion: version\n      }\n    })\n  }\n\n  static async loadFile(url, version) {\n    return this.loadFileResponse(url, version).then(response => {\n      console.log(\"file \" + url + \" read.\");\n      return response.text();\n    })\n  }\n\n  static async loadJSON(url) {\n    return fetch(url, {\n      method: \"GET\",\n      headers: {\n        \"content-type\": \"application/json\"\n      }\n    }).then(response => {\n      return response.json();\n    })\n  }\n\n  \n  \n  static async copyURLtoURL(fromURL, toURL) {\n    try {\n      var getResp = await fetch(fromURL, {method: 'GET'})\n    } catch(e) {\n      console.log(\"[files] copyURLtoURL... falling back to server side download for: \" + fromURL)\n      var lively4serverurl = lively4url.replace(/[^/]*$/,\"\")\n      getResp = await fetch(lively4serverurl = \"/_curl/?target=\" + fromURL)\n      // Error maybe due to CORS?\n    }\n    var blob = await getResp.blob()\n    return fetch(toURL, {method: 'PUT', body: blob})\n  }\n  \n  static async saveFile(url, data){\n    var urlString = url.toString();\n    urlString = this.resolve(urlString)\n    if (urlString.match(/\\/$/)) {\n      return fetch(urlString, {method: 'MKCOL'});\n    } else {\n      var options = {method: 'PUT', headers: {}, body: data}\n      if (url.match && url.match(/\\.svg$/)) {\n        options.headers['Content-Type'] = 'image/svg+xml'\n      }\n      return fetch(urlString, options);\n    }\n  }\n  \n  static async moveFile(url, newURL) {\n    let fromServerURL = this.serverURL(url)\n    let toServerURL = this.serverURL(url)\n    if (fromServerURL && (fromServerURL == toServerURL)) {\n      \n      // use special server MOVE/RENAME method\n      var resp = await fetch(url, {\n        method: \"MOVE\",\n        headers: {\n          destination: newURL\n        }\n      })\n      var result = await resp.text()\n      lively.notify(\"MOVE\", result)\n      return resp\n    }\n    \n    var content = await fetch(url).then(r => r.blob())\n\n    // first, save the content...\n    var putResponse = await fetch(newURL, {\n      method: 'PUT',\n      body: content\n    })\n\n    if (putResponse.status !== 200) {\n      lively.confirm(\"could not move file to \" + newURL)\n      return putResponse\n    }\n\n    // ok, lets be crazy... we first delete\n    var delResponse = await fetch(url, {method: 'DELETE'})\n    if (delResponse.status !== 200) {\n      lively.notify(\"could not properly delete \" + url, await delResponse.text())\n    }\n\n    var getResponse = await fetch(newURL)\n    if (getResponse.status !== 200) {\n      lively.notify(\"save again, because we might need to...\")\n      var putAgainResponse = await fetch(newURL, {\n        method: 'PUT',\n        body: content\n      })\n      return putAgainResponse\n    }\n    return getResponse\n  }\n  \n  static async statFile(urlString){\n    urlString = this.resolve(urlString)\n    return fetch(urlString, {method: 'OPTIONS'}).then(resp => resp.text())\n  }\n\n  /**\n   * Recursively walks a directory path given as string.\n   * @returns an array of files\n   */\n  static async walkDir(dir) {\n    \n    var url = dir.replace(/\\/?$/,\"/\")\n    \n    // iterate on the server vs client (is 400ms vs 4000ms)\n    var result = await fetch(url, {\n      method: \"OPTIONS\",\n      headers: {\n        filelist: true\n      }\n    }).then(r => r.json()).then(r => r.contents.map(ea => ea.name.replace(/^\\.\\//,url)))\n    return result\n\n//     if(dir.endsWith('/')) { dir = dir.slice(0, -1); }\n//     const json = await lively.files.statFile(dir).then(JSON.parse);\n//     if(json.type !== 'directory') {\n//       throw new Error('Cannot walkDir. Given path is not a directory.')\n//     }\n\n//     let files = json.contents\n//       .filter(entry => entry.type === 'file')\n//       .map(entry => dir + '/' + entry.name);\n\n//     let folders = json.contents\n//       .filter(entry => entry.type === 'directory')\n//       .map(entry => dir + '/' + entry.name);\n\n//     let subfolderResults = await Promise.all(folders.map(folder => this.walkDir(folder)));\n//     subfolderResults.forEach(filesInSubfolder => files.push(...filesInSubfolder));\n\n//     return files;\n  }\n\n  // #Depricated\n  static async existFile(urlString){\n    return this.exists(urlString)\n  }\n\n  static async stats(url) {\n    return fetch(url, {method: \"OPTIONS\"}).then(r => r.json())\n  }\n\n  static async type(url) {\n    return (await this.stats(url)).type\n  }\n\n  static async exists(urlString) {\n    var cachedInfo = this.cachedFileMap().get(urlString)\n    if (cachedInfo) {\n      return cachedInfo.exists\n    }\n    \n    // karma / travis cannot handle option requests\n    if (window.__karma__) { \n      return fetch(urlString, { \n          method: 'HEAD' \n        }).then(resp => resp.status == 200); \n    }  \n  \n    try {      \n      var resp = (await fetch(urlString, {method: \"OPTIONS\"}))\n      if (resp.status != 200) return false\n      var stats = await resp.json()\n      return stats.error ? false : true\n    } catch (e) {\n      return false;\n    }\n  }\n  \n\n  static isURL(urlString) {\n    return (\"\" + urlString).match(/^([a-z]+:)?\\/\\//) ? true : false;\n  }\n  \n  static async isFile(url) {\n    return (await this.type(url)) == \"file\"\n  }\n\n  static async isDirectory(url) {\n    return (await this.type(url)) == \"directory\"\n  }\n\n  static directory(string) {\n    string = string.toString()\n    return string.replace(/([^/]+|\\/)$/,\"\")\n  }\n\n  \n  // #Depricated    \n  static resolve(string) {\n    if (!this.isURL(string)) {\n      var result = lively.location.href.replace(/[^/]*$/, string)\n    } else {\n      result = string.toString()\n    }\n    // get rid of ..\n    result = result.replace(/[^/]+\\/\\.\\.\\//g,\"\")\n    // and .\n    result = result.replace(/\\/\\.\\//g,\"/\")\n    \n    return result\n  }\n\n  /* \n   * #Meta An inline test is a line that evaluates to true?\n   * #Meta We coould parse those lines, and generate better feedback, e.g. not just that it does not evaluate to true, but what are the values that are not equal?\n   * #Meta Could we run those inline tests in #Travis, too? \n   TESTS:\n      lively.files.name(\"https://foo/bar/bla.txt\") == \"bla.txt\" \n  */\n  static name(url) {\n    return url.toString().replace(/.*\\//,\"\")\n  }\n  \n /* \n  TESTS:\n      lively.files.extension(\"https://foo/bar/bla.txt\") == \"txt\" \n      lively.files.extension(\"https://foo/bar/bla.PNG\") == \"png\"\n      lively.files.extension(\"https://foo/bar/bla\") === undefined\n   */  \n  static extension(url) {\n    var name = this.name(url)\n    if (!name.match(/\\./)) return undefined\n    return name.toLowerCase().replace(/.*\\./,\"\")    \n  }\n  \n  \n  /*# Generate tmpfile url for lively4 server\n   *\n   * lively.files.tempfile() // e.g. https://lively-kernel.org/lively4/_tmp/3b8a7fcc-11dd-463e-8d32-dcc46575a4fd\n   *\n   */\n  static tempfile() {\n    // #Dependency to #Lively4Server \n    return  lively.files.directory(lively4url) + \"_tmp/\" + generateUuid()  \n  }\n\n  /*\n    lively.files.stringToBlob(\"hello world\")\n   */\n  static stringToBlob(string) {\n    var encoded = encodeURIComponent(string)\n    return fetch(`data:text/plain;charset=utf-8,${encoded}`).then(r => r.blob())\n  }\n  \n  /* \n    lively.files.stringToBlob(\"hello world\").then(b => lively.files.readBlobAsText(b))\n   */ \n  static readBlobAsText(fileOrBlob) {\n    return new Promise(resolve => {        \n      const reader = new FileReader();\n      reader.onload = event => {\n        resolve(event.target.result)\n      }\n      reader.readAsText(fileOrBlob); \n    })\n  }\n\n  static readBlobAsDataURL(fileOrBlob) {\n    return new Promise(resolve => {        \n      const reader = new FileReader();\n      reader.onload = event => {\n        resolve(event.target.result)\n      }\n      reader.readAsDataURL(fileOrBlob); \n    })\n  }  \n  \n  static get versionHistoriesLoaded() {\n    if (!this._versionHistoriesLoaded) this._versionHistoriesLoaded = new Map();\n    return this._versionHistoriesLoaded\n  }\n  \n  static async loadVersions(url, cached) {\n    \n    var useCached  = cached || false;\n    // Fuck... some custom clever chaching logic? Should we generalize it?\n    if (cached === undefined) {\n      var maxCacheTime = 1000 * 60 * 5; // 5min in ms\n      var lastLoaded = this.versionHistoriesLoaded.get(url)\n      if (lastLoaded && ((Date.now() - lastLoaded)  < maxCacheTime)) {\n        useCached = true\n        // lively.notify(\"use cached version history\")\n      } else {\n        this.versionHistoriesLoaded.set(url, Date.now())\n        // lively.notify(\"update version history\")\n      }\n    } else if (!cached) {\n        this.versionHistoriesLoaded.set(url, Date.now())\n    }\n    \n    var versionscache = await caches.open(\"file_versions\")\n    if (cached) {\n      var resp = await versionscache.match(url)\n      if (resp) return resp      \n    }\n    resp = await fetch(url, {\n      method: \"OPTIONS\",\n      headers: {\n         showversions: true   \n      }      \n    })\n    versionscache.put(url, resp.clone())\n    return resp\n  }\n  \n  \n  static async _sortIntoFileTree(root, path, element) {\n    // console.log(\"sort into \" + path + \" \" + element.name )\n    var next = path.shift()\n    if (!next) {      \n      root.children.push(element)\n      return\n    }\n    var dir = root.children.find(ea => ea.name == next)\n    if (!dir) {\n      dir = {\n        name: next,\n        children: []\n      }\n      root.children.push(dir)\n    }\n    this._sortIntoFileTree(dir, path, element)\n  }\n  \n  static async fileTree(url) {\n    var tree = {\n      name: url,\n      children: []\n    }\n    var list = (await fetch(url, {\n      method: \"OPTIONS\",\n      headers: {\n        filelist: true\n      }\n    }).then(r => r.json())).contents\n    if (!list) return;\n    \n    for(var ea of list) {\n      if (ea.name !== \".\") {\n        var path = ea.name.replace(/^\\.\\//,\"\").replace(/[^/]*$/,\"\").split(\"/\").filter(ea => ea)\n        var absolute = ea.name.replace(/^\\.\\//, url)\n        var element = {\n            name: ea.name.replace(/.*\\//,\"\"),\n            modified: ea.modified,\n            url: absolute,\n            size: ea.size,\n            type: ea.type\n          }\n        if (element.type == \"directory\") element.children = [];\n        this._sortIntoFileTree(tree, path, element)        \n      }\n    }\n    return tree\n  }\n  \n  // Files.visualizeFileTreeMap(lively4url )\n  static async visualizeFileTreeMap(url) {\n    var tree = await lively.files.fileTree(url)\n    if (tree) {\n      lively.openComponentInWindow(\"d3-treemap\").then( async tm => {\n        tm.setTreeData(tree)\n      })\n    } else {\n      lively.notify(\"Could not create tree for \" + url)\n    }\n  }\n  \n  static isVideo(url) {\n    return url.toString().match(/((ogm)|(m4v)|(mp4)|(mov)|(avi)|(flv)|(mpe?g)|(mkv)|(ogv))$/i)\n  }\n  \n  static isAudio(url) {\n    return url.toString().match(/((mp3)|(m4a)|(ogg))$/i)\n  }\n\n  static isPicture(url) {\n    return url.toString().match(/((svg)|(png)|(jpe?g)|(gif))$/i)\n  }\n  \n  static async generateMarkdownFileListing(root) { \n    var anchors = Array.from(root.querySelectorAll(\"a\"))\n    var imgs = Array.from(root.querySelectorAll(\"[src]\"))\n    \n    var links = anchors.map(ea => ea.getAttribute(\"href\")).filter(ea => !ea.match(/search:/)).concat(\n          imgs.map(ea => ea.getAttribute(\"src\")))\n    \n    var result = document.createElement(\"div\")\n\n    var source = \"\" // the generated markdown source that should be added\n    var fileNames = [];\n\n    var list = document.createElement(\"ul\")\n    var url = (\"\" + lively.query(root, \"lively-container\").getURL()).replace(/[^/]+$/,\"\");\n    \n    var files = (await fetch(url, {\n      method: \"OPTIONS\"\n    }).then(r => r.json())).contents\n    files.forEach(ea => {\n      // var item = document.createElement(\"li\")\n      var name =  ea.type == \"directory\" ? \n        ea.name + \"/\" :\n        ea.name\n      \n      var ref = name.replace(/ /g, \"%20\")\n      if (name == \"index.md\") return // don't include yourself\n      \n      fileNames.push(ref)\n      // item.textContent = name\n      if (!links.includes(ref)) {\n        // list.appendChild(item)  \n        source += `  - [${name}](${ref})\\n`\n      }\n    })\n\n    links.filter(ea => !fileNames.includes(ea) && !ea.match(\"/\")).forEach(ea => {\n      var item = document.createElement(\"li\")\n       if (ea == \"index.md\") return // don't include yourself\n      item.textContent = \"Missing \" + ea\n      list.appendChild(item)\n    })\n    result.appendChild(list)\n\n    var code = document.createElement(\"pre\")\n    code.textContent = source.length > 0 ? \"## Please Insert Me\\n\" + source : \"\"\n    result.appendChild(code)\n\n    return result\n  }\n  \n  static async checkoutGithubFile(url) {\n    return await this.withSynctoolDo(async (syncTool, respository, branch, path ) => {\n      var serverURL = syncTool.getServerURL()    \n      if (!url.match(serverURL)) { // we are in a checked out repo....\n        return undefined // not information for files we do not manage...\n      }\n      return await syncTool.gitControl(\"checkout\", undefined, {\n        gitfilepath: path.replace(/^\\//,\"\") // no leading / expected....\n      })\n    }, url) \n  }\n\n  static async withSynctoolDo(func, url) {     \n    // #Idea, could't we ask the server for this set directly, since we ask it indirectly anyway? as special OPTIONS request #TODO\n    try {\n      var container = <div style=\"display:none\"></div> // hide the uglyness, at least in the UI\n      document.body.appendChild(container)\n      var syncTool = await lively.create(\"lively-sync\", container); // #Hack #Ugly\n      \n      var serverURL = this.serverURL(url) \n      if (!serverURL) return\n      syncTool.setServerURL(serverURL) \n\n      var m = url.replace(serverURL,\"\").replace(/^\\//,\"\").match(/([^/]*)(\\/*.*)/)\n      var repository = m[1]\n      var path = m[2]\n      console.log(\"set repository: \"  + repository)\n      syncTool.setRepository(repository)\n      await syncTool.updateLoginStatus()\n      var branch = syncTool.getBranch()\n      return await func(syncTool, repository, branch, path)\n    } finally {\n      container.remove() // we really opened a graphical object for this\n    }\n  }\n  \n  static async unzip(url) {\n    var blob = fetch(url).then(r => r.blob())\n    return  JSZip.loadAsync(blob)\n  }\n  \n  \n  static async githubFileInfo(url) {\n    return await this.withSynctoolDo(async (syncTool, respository, branch, path ) => {\n      var serverURL = syncTool.getServerURL()      \n      var remoteURL = await syncTool.gitControl(\"remoteurl\")\n      remoteURL = remoteURL.replace(/\\n/,\"\")\n      \n      var userAndRepository = remoteURL.replace(/https:\\/\\/github.com\\//,\"\").replace(/git@github.com:/,\"\").replace(/\\.git/,\"\")\n      var [user, repo] = userAndRepository.split(\"/\")\n      \n      var result =  {\n        url,\n        user,\n        repo,\n        serverURL,\n        respository,\n        path: path && path.replace(/^\\//,\"\"),\n        remoteURL,\n        branch,\n        rawURL: remoteURL + \"/raw/\" + branch + path\n      }\n      \n      if (!remoteURL || !branch || !path) {\n        console.warn(\"Github fileInfo not complete: \" + JSON.stringify(result))\n        return null\n      }\n      \n      return result  \n    }, url) \n  }\n  \n  static getEnding(path) {\n    return path.toString().replace(/[#?].*/,\"\").replace(/.*\\./,\"\");\n  }\n  \n  \n  static serverURL(url) {\n    // #TODO to replace this static list, we could add this info OPTION requests... \n    \n  \n    var knownServers = [\n      lively4url.replace(/\\/[^/]+$/,\"\"),\n      \"https://lively-kernel.org/voices\",\n      \"https://lively-kernel.org/research\",\n      \"https://lively-kernel.org/lively4S2\",\n      \"https://lively-kernel.org/lively4\",\n      \"http://localhost:9005\",\n      \"http://localhost:9006\",\n    ]\n    \n    for(var ea of knownServers) {\n      if (url.startsWith(ea)) {\n        return ea        \n      }\n      \n    }\n    return null // don't know?\n  }\n\n  static repositoryName(url) {  \n    var serverURL = this.serverURL(url)\n    if (!serverURL) return null\n    var repo =  url.replace(serverURL +\"/\", \"\").replace(/\\/.*/,\"\");\n    return repo\n  }\n  \n  static async setURLAsBackground(url) {\n    document.querySelectorAll(\"lively-background\").forEach(ea => ea.remove())\n\n    var back = await (<lively-background class=\"lively-content\" ></lively-background>) \n    document.body.appendChild(back)\n    back.url = url\n  }\n  \n  \n  /*MD ## Git Infos MD*/\n  static hasGitMergeConflict(source) {\n    return source.match(/<<<<<<<(.|\\n)*=======(.|\\n)*>>>>>>>/m)\n  }\n  \n  static extractGitMergeConflictVersions(sourceWithConflict) {\n     var versions = _.uniq(sourceWithConflict.split(\"\\n\")\n      .filter(ea => ea.match(/^(<<<<<<<)|(>>>>>>>) /))\n      .map(ea => ea.replace(/^(<<<<<<<)|(>>>>>>>) /, \"\")))\n     return versions\n  }\n  \n  /*MD ## File Chooser MD*/\n    \n  static async chooseFile(url = lively4url + \"/\") {\n    var ui = await lively.openComponentInWindow(\"file-chooser\")\n    return ui.chooseFile(url)\n  }\n\n  static async chooseFiles(url = lively4url + \"/\") {\n    var ui = await lively.openComponentInWindow(\"file-chooser\")\n    return ui.chooseFiles(url)\n  }\n\n  \n  \n}\n\n\n\n\n"]}