{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-mpm-debugging/src/client/github.js"],"names":["authGithub","Strings","LivelyWebhookService","Issue","constructor","props","ea","Project","toString","project","Story","title","Item","item","Comment","comment","GitHub","current","force","_current","storagePrefix","storeValue","key","value","lively","focalStorage","setItem","loadValue","getItem","githubApi","path","token","fetch","headers","Headers","Authorization","then","r","json","loadCredentials","Promise","resolve","reject","challengeForAuth","Date","now","user","username","login","emails","email","find","primary","repo","loaded","getToken","ensureBranch","name","original","info","getBranch","ref","originalInfo","Error","method","body","JSON","stringify","object","sha","apiFetch","api","options","baseHeaders","baseOptions","composedOptions","Object","assign","getFile","branch","result","listWebhooks","hooks","ensureWebhook","url","found","config","createWebhook","fixPath","replace","setFile","content","message","file","btoa","deleteFile","getContent","atob","issueByTitle","searchInTitle","issues","match","issueByNumber","number","create","patch","issuePatch","parseLinkHeader","header","parts","split","links","i","length","section","trim","getURLAuthorized","_issues","resp","get","concat","parseMarkdownStories","source","recursive","lines","stories","map","matchDo","isProject","comments","prefix","issue","rest","state","a","labels","tags","b","matchAllDo","tag","label","tagToLabel","includes","push","forEach","RegExp","isStory","parseInt","undefined","items","isItem","isComment","lastProject","lastStory","story","filter","stringifyMarkdownStoriesDebug","join","labelToTag","l","toUpperCaseFirst","toCamelCase","toLowerCase","stringifyMarkdownStories","syncMarkdownStories","projectLabel","notify","updateMarkdownFile","files","loadFile","updateContent","saveFile"],"mappings":"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","file":"github.js","sourcesContent":["\nimport authGithub from \"src/client/auth-github.js\"\nimport Strings from \"src/client/strings.js\"\n\nconst LivelyWebhookService = \"https://lively-kernel.org/lively4/_webhook/signal\"\n\nexport class Issue {\n  constructor(props) {\n    for(var ea in props) {\n      this[ea] = props[ea]\n    }\n  }\n}\n\nexport class Project extends Issue {\n  toString() {\n    return \"Project: \" + this.project\n  }\n}\n\nexport class Story extends Issue {\n  toString() {\n    return \"Story: \" + this.title\n  }\n}\n\nexport class Item extends Issue {\n  toString() {\n    return \"Items: \" + this.item\n  }\n}\n\nexport class Comment extends Issue {\n  toString() {\n    return \"Comment: \" + this.comment\n  }\n}\n\nexport default class GitHub {\n   \n  static current(force) {\n    if (!this._current || force) {\n      this._current = new GitHub()\n    }\n    return this._current\n  }\n  \n  get storagePrefix() {\n    return \"LivelySync_\"\n  }\n  \n  \n  async storeValue(key, value) {\n    return  lively.focalStorage.setItem(this.storagePrefix + key, value)\n  }\n  \n  async loadValue(key) {\n    return lively.focalStorage.getItem(this.storagePrefix + key)\n  }\n  \n  githubApi(path, token) {\n    return fetch(\"https://api.github.com\" + path, {\n      headers: new Headers({\n        Authorization: \"token \" + token\n    })}).then(r => r.json());\n  }\n  \n  async loadCredentials() {\n    // this.updateLoginStatus()\n    this.token = await this.loadValue(\"githubToken\")\n    if (!this.token) {\n       this.token = await new Promise((resolve, reject) => {\n          authGithub.challengeForAuth(Date.now(), async (token) => {\n              var user = await this.githubApi(\"/user\", token);\n              var username = user.login;\n              var emails =  await this.githubApi(\"/user/emails\", token);\n              var email = emails.find(ea => ea.primary).email;\n              this.storeValue(\"githubUsername\", username);\n              this.storeValue(\"githubEmail\", email);\n              this.storeValue(\"githubToken\", token);\n              resolve(token);\n        });\n       })\n    }\n    this.username = await this.loadValue(\"githubUsername\");\n    this.email = await this.loadValue(\"githubEmail\");\n  }\n  \n  \n  constructor(user= \"LivelyKernel\", repo= \"lively4-core\") {\n    this.user = user\n    this.repo = repo\n    this.loaded = this.loadCredentials()\n  }\n\n  async getToken() {\n    if (!this.token ) {\n      this.loaded = this.loadCredentials()\n      await this.loaded\n    }\n    return this.token\n  }\n  \n  async ensureBranch(name, original=\"master\") {\n    await this.loaded\n    \n    var info = await this.getBranch(name)\n    if (info.ref) return info\n    \n    var originalInfo = await this.getBranch(original)\n    if (!originalInfo.ref) throw new Error(\"Could not find original branch \" + original)\n    \n    return fetch(`https://api.github.com/repos/${this.user}/${this.repo}/git/refs`, {\n      method: \"POST\",\n      headers: {\n       Authorization: \"token \" + this.token \n      },\n      body: JSON.stringify({\n        \"ref\": `refs/heads/${name}` ,\n        \"sha\": originalInfo.object.sha\n      })\n    }).then(r => r.json())\n  }\n  \n  async apiFetch(api, options={}) {\n    await this.loaded\n    var baseHeaders =  {\n      Authorization: \"token \" + this.token\n    }\n    var baseOptions = {\n      method: \"GET\"\n    }\n    var composedOptions = Object.assign(baseOptions, options)\n    composedOptions.headers = Object.assign(baseHeaders, options.headers || {})\n    return fetch(`https://api.github.com/repos/${this.user}/${this.repo}` + api, composedOptions).then(r => r.json())\n  }\n  \n  \n  async getBranch(name) {\n    return this.apiFetch(`/git/refs/heads/${name}`)\n  }\n\n  async getFile(path, branch) {\n    await this.loaded\n    var result = await fetch(`https://api.github.com/repos/${this.user}/${this.repo}/contents/${path}` \n                 + (branch  ? `?ref=${branch}` : \"\"), {\n      headers: {\n       Authorization: \"token \" + this.token \n      }\n    }).then(r => r.json())\n    return result\n  }\n  \n  async listWebhooks() {\n    var hooks = await this.apiFetch(`/hooks`)\n    return hooks\n  }  \n\n  async ensureWebhook(url=LivelyWebhookService) {\n    var hooks = await this.listWebhooks()\n    if (!hooks || !hooks.find) return\n    var found = hooks.find(ea => ea.config.url == url)\n    if (found) {\n      return found\n    } else {\n      return this.createWebhook(url)\n    }\n  }\n\n  async createWebhook(url=LivelyWebhookService) {\n    return await this.apiFetch(`/hooks`, {\n      method: \"POST\",\n      body: JSON.stringify({\n        \"name\": \"web\",\n        \"active\": true,\n        \"events\": [\n          \"push\"\n        ],\n        \"config\": {\n          \"url\": url,\n          \"content_type\": \"json\",\n          \"insecure_ssl\": \"0\"\n        }\n      })\n    })\n  }\n  \n  fixPath(path) {\n   return path && path.replace(/^\\//,\"\") // do not start with /\n  }\n\n  async setFile(path, branch, content, message=\"LIVELY COMMIT\") {\n    path = this.fixPath(path) \n    await this.loaded\n    var file = await this.getFile(path, branch)\n    var body = {\n        \"message\": message,\n        \"committer\": {\n          \"name\": this.user,\n          \"email\": this.email\n        },\n        \"content\": btoa(content),\n        \n      }\n    if (file.sha)  body.sha = file.sha\n    if (branch) body.branch = branch\n    return fetch(`https://api.github.com/repos/${this.user}/${this.repo}/contents/${path}`, {\n      method: \"PUT\",\n      headers: {\n       Authorization: \"token \" + this.token \n      }, \n      body: JSON.stringify(body)\n    }).then(r => r.json())\n  }\n  \n  async deleteFile(path, branch, message=\"LIVELY COMMIT DELETE\") {\n    await this.loaded\n    var file = await this.getFile(path, branch)\n    if (!file.sha) throw new Error(\"File not found\")\n    \n    var body = {\n        \"message\": message,\n        \"committer\": {\n          \"name\": this.user,\n          \"email\": this.email\n        },\n      }\n    body.sha = file.sha\n    if (branch) body.branch = branch\n    return fetch(`https://api.github.com/repos/${this.user}/${this.repo}/contents/${path}`, {\n      method: \"DELETE\",\n      headers: {\n       Authorization: \"token \" + this.token \n      }, \n      body: JSON.stringify(body)\n    }).then(r => r.json())\n  }\n\n  async getContent(path, branch) {\n    var file = await this.getFile(path, branch)\n    if (file.content) return atob(file.content)\n  }\n\n  async issueByTitle(searchInTitle) {\n    var issues = await this.issues()\n    return issues.find(ea => ea.title.match(searchInTitle))\n  }\n  \n  async issueByNumber(number) {\n    var issues = await this.issues()\n    return issues.find(ea => ea.number == number)\n  }\n  \n  \n  async create(title, body) {\n    await this.loaded\n    if (!title) throw new Error(\"title is missing\") \n    if (!body) throw new Error(\"body is missing\") \n    return fetch(\"https://api.github.com/repos/\" \n        + this.user+ \"/\" + this.repo + \"/issues\", {\n        method: \"POST\",\n        body: JSON.stringify({\n          title: title,\n          body: body\n        }),\n        headers: {\n          Authorization: \"token \" + this.token,\n          'Content-Type': 'application/json'\n        }\n      }).then(r => r.json())\n  }\n  \n  async patch(number, issuePatch) {\n    await this.loaded\n    if (!number) throw new Error(\"number is missing\") \n    if (!issuePatch) throw new Error(\"issuePatch is missing\") \n\n    return fetch(\"https://api.github.com/repos/\" \n        + this.user+ \"/\" + this.repo + \"/issues/\" + number, {\n        method: \"PATCH\",\n        body: JSON.stringify(issuePatch),\n        headers: {\n          Authorization: \"token \" + this.token,\n          'Content-Type': 'application/json'\n        }\n      }).then(r => r.json())\n  }\n\n  \n  parseLinkHeader(header) {\n    var parts = header.split(',');\n    var links = {};\n    for(var i=0; i<parts.length; i++) {\n        var section = parts[i].split(';');\n        if (section.length !== 2) {\n            throw new Error(\"section could not be split on ';'\");\n        }\n        var url = section[0].replace(/<(.*)>/, '$1').trim();\n        var name = section[1].replace(/rel=\"(.*)\"/, '$1').trim();\n        links[name] = url;\n    }\n    return links;\n  }\n  \n\n  async getURLAuthorized(url, force) {\n    // force not used...\n    await this.loaded\n    return fetch(url, {\n        method: \"GET\",\n        headers: {\n          Authorization: \"token \" + this.token\n        }\n      })\n  }\n  \n  \n  async issues(force) {\n    if (!this._issues || force) {\n      this._issues = []\n      \n      var url = \"https://api.github.com/repos/\" \n        + this.user+ \"/\" + this.repo + \"/issues\" + \"?per_page=100&state=all\"\n      \n      // retrieve all pages\n      while(url) {\n        var resp = await this.getURLAuthorized(url, force)\n        var links = this.parseLinkHeader(resp.headers.get(\"link\"))\n        url = links[\"next\"]\n        this._issues = this._issues.concat(await resp.json())\n      }\n\n    }\n    return this._issues\n  }\n  /*\n   * source    ... stories in markdown list item syntax \n   * recursive ... items are only referenced in their parent projects, otherwise it is a flat list\n   */\n  parseMarkdownStories(source, recursive) {\n    var lines = source.split(/\\r?\\n/)\n    var stories = lines.map((ea) => {\n      var result =  Strings.matchDo(/^## +(.*)/, ea, title => \n        new Project({isProject: true, project: title, stories: [], comments: []}))\n      if (!result) result = Strings.matchDo(/^(- )(.*)/, ea, (prefix, issue) => {\n        var title, rest, state;\n        Strings.matchDo(/ ((#|(?:[0-9]+P)|(?:\\?+P)).*)$/, issue, (a) => {\n          rest = a\n        })\n        if (!title) title = issue.replace(rest, \"\")\n        var number;\n        var labels = []\n        var tags = []\n        if (rest) {\n          Strings.matchDo(/(#([0-9]+))/, rest, (a,b) => {\n            rest = rest.replace(a,\"\") \n            number = b\n          })\n          }\n        if (rest) {\n          Strings.matchDo(/(#((open)|(closed)))/, rest, (a,b) => {\n            rest = rest.replace(a,\"\") \n            state = b\n          })\n        }\n        if (rest) {\n          // lively.notify(\"rest \" + rest)\n          Strings.matchAllDo(/(#[A-Za-z]+)/, rest, (tag) => {\n            var label = this.tagToLabel(tag)\n            if (label && !labels.includes(label)) {\n              labels.push(label)\n            }\n            tags.push(tag)\n\n          })\n          tags.forEach(tag => {\n            // lively.notify(\"replace tag \" + tag)\n            rest = rest.replace(new RegExp(\" ?\" + tag, \"g\"),\"\")\n          })\n\n        }\n\n        return   new Story({\n          isStory: true,\n          title: title.replace(/ *$/,\"\"), \n          rest: rest && rest.replace(/ *$/,\"\"),\n          number: number ? parseInt(number) : undefined,\n          state: state,\n          labels: labels,\n          items: []\n        })\n      })\n      if (!result) result = Strings.matchDo(/^ +(- .*)/, ea, item => \n        new Item({isItem: true, item: item}))\n    \n      if (!result) result = new Comment({isComment: true, comment: ea})\n      return result\n    })\n    \n    // now, make sense of the parsing...\n    var lastProject\n    var lastStory\n    \n    stories.forEach(ea => {\n      if (ea.isProject) {\n        lastProject = ea;\n        lastStory = null;\n      }\n      if (ea.isStory) {\n        lastStory = ea\n      }\n      if (ea.isStory && lastProject) {\n        lastProject.stories.push(ea)\n        lastStory.project = lastProject.project\n      }\n      if (ea.isItem && lastStory) {\n        ea.story = lastStory; // it is not a tree any more...\n        lastStory.items.push(ea)\n      }\n      if (ea.isComment && lastProject) {\n        ea.project = lastProject\n        lastProject.comments.push(ea)\n      }\n      if (ea.comment == \"<!--NoProject-->\") {\n        ea.project = undefined;\n        lastProject = undefined\n      }\n    })\n    if (recursive) {\n      stories = stories.filter(ea => \n        ea.isProject ||\n          (ea.isStory && !ea.project) ||\n          (ea.isItem && !ea.story) ||\n          ea.isComment && !ea.project\n      ); // get rid of the global itmes\n    }\n    return stories\n  }\n  \n  stringifyMarkdownStoriesDebug(stories) {\n    return stories.map(ea => JSON.stringify(ea)).join(\"\\n\")\n  }\n  \n  labelToTag(l) {\n    var tag = l\n        .replace(\"type: \", \"\")\n        .replace(/P[0-9]\\: /, \"\")\n        .replace(/effort[0-9]\\: /, \"\")\n        .replace(/ \\(hour\\)/, \"\")\n        .replace(/ \\(day\\)/, \"\")\n        .replace(/ \\(week\\)/, \"\")\n        .replace(\"RFC / discussion / question\", \"discussion\")\n        .replace(/comp\\: /, \"\")\n    if (tag.match(\" \")) {\n      tag = Strings.toUpperCaseFirst(Strings.toCamelCase(tag, \" \"))\n    }\n    return \"#\" + tag\n  }\n  \n  tagToLabel(tag) {\n    if (!tag) return \n    var label = tag.replace(\"#\", \"\")\n    if (label == \"bug\") return \"type: bug\"\n    if (label == \"chore\") return \"type: chore\"\n    if (label == \"feature\") return \"type: feature\"\n    if (label == \"performance\") return \"type: performance\"\n    if (label == \"refactor\") return \"type: refactor\"\n    if (label == \"discussion\") return \"type: RFC / discussion / question\"\n    \n    if (label == \"easy\") return \"effort1: easy (hour)\"\n    if (label == \"medium\") return \"effort2: medium (day)\"\n    if (label == \"hard\") return \"effort3: hard (week)\"\n     \n    if (label == \"critical\") return \"P0: critical\"\n    if (label == \"critical\") return \"P0: critical\"\n    if (label == \"critical\") return \"P0: critical\"\n    if (label == \"critical\") return \"P0: critical\"\n    if (label == \"critical\") return \"P0: critical\"\n    \n    if (label == \"urgent\") return \"P1: urgent\"\n    if (label == \"required\") return \"P2: required\"\n    if (label == \"important\") return \"P3: important\"\n    if (label == \"NiceToHave\") return \"P4: nice to have\"\n\n\n    if (label == \"duplicate\") return \"duplicate\"\n    if (label == \"FollowUp\") return \"follow up\"\n    if (label == \"HelpWanted\") return \"help wanted\"\n\n    if (label.match(/[A-Z][a-z]+[A-Z]/)) \n      return \"comp: \" + label.split(/(?=[A-Z])/).map(ea => ea.toLowerCase()).join(\" \")\n    return label\n  }\n  \n  stringifyMarkdownStories(stories, recursive) {\n    return stories.map(ea => {\n      if (ea.title  !== undefined) \n        return \"- \" + ea.title + \n          (ea.rest ? \" \" + ea.rest : \"\") + \n          (ea.labels ? \" \" +ea.labels\n            .filter(l => l !== (\"comp: \" + ea.project).toLowerCase())\n            .map(l => this.labelToTag(l)).join(\" \")  : \"\") + \n          (ea.state ? \" #\" + ea.state : \"\") + \n          (ea.number ? \" #\" + ea.number : \"\") +\n          (recursive && ea.items && ea.items.length > 0 ? \n            \"\\n\" + this.stringifyMarkdownStories(ea.items, true) : \"\")\n      if (ea.comment !== undefined) return  ea.comment;\n      if (ea.project  !== undefined) \n        return \"## \" + ea.project + \n          (recursive && ea.comments && ea.comments.length > 0 ? \n            \"\\n\" + this.stringifyMarkdownStories(ea.comments, true) : \"\") + \n          (recursive && ea.stories && ea.stories.length > 0 ? \n            \"\\n\" + this.stringifyMarkdownStories(ea.stories, true) : \"\")\n          \n      if (ea.item) return \"  \" + ea.item;\n      throw new Error(\"Could not stringify parsed line: \" + JSON.stringify(ea))\n    }).join(\"\\n\")\n  }\n  \n  async syncMarkdownStories(stories) {\n    var issues = await this.issues(true)\n    // lively.notify(\"found \" + issues.length + \" issues\")\n    for(var ea of stories){\n      var issue = null\n      if (ea.title && ea.number === undefined) {\n        issue = issues.find(issue => ea.title == issue.title)\n        if (!issue) {\n          issue = await this.create(ea.title, ea.body || \"<no description>\")\n        }\n        ea.number = issue.number;\n        // #TODO add maybe github flags too?\n      }\n      if (ea.title) {\n        if (!issue) {\n          issue = issues.find(issue => ea.number == issue.number)\n        }\n        \n        if (issue && issue.state) {\n          ea.state = issue.state\n        }\n        \n        if (ea && issue && issue.labels) {\n          if (!ea.labels) ea.labels = []; \n          issue.labels.forEach(l => {\n            if (!ea.labels.includes(l.name)) {\n              \n              // lively.notify(\"add \" + l.name)\n              ea.labels.push(l.name)\n            }\n          })\n          if (ea.project) {\n            var projectLabel = \"comp: \"+ ea.project.trim().replace(/[^A-Za-z0-9 ]/g,\"\").toLowerCase()\n            if (!issue.labels.find(ea => ea.name.toLowerCase() == projectLabel)) {\n              lively.notify(\"labeled \" + issue.number  + \" as \" + projectLabel )\n              var patch = {labels: issue.labels.map(ea => ea.name).concat([projectLabel])};\n              var result = await this.patch(issue.number, patch)\n              \n            }\n          }\n          \n          // local labels are thrown away... ?\n          // #TODO what about labels that are not in github?\n        }\n        \n      }\n    }\n    for(var issue of issues) {\n      if (issue.state == \"open\" && !stories.find(ea => ea.number == issue.number)) {\n        var story = {title: issue.title, state: issue.state, body: issue.body, number: issue.number}; // Project, Tags?\n        stories.push(story) // just append, #TODO find a proper place in the list? \n      }\n    }\n    return stories\n  }\n  \n  async updateMarkdownFile(url) {\n    var content = await lively.files.loadFile(url)\n    var stories = this.parseMarkdownStories(content)\n    await this.syncMarkdownStories(stories)\n    var updateContent = this.stringifyMarkdownStories(stories)\n    return lively.files.saveFile(url, updateContent)\n  }\n}"]}