Full plugins and server redesign

- Languages, issues and pr are now plugins (but enabled by default for retro-compatibility)
- Query parameters are now parsed correctly
- Redesigned server index with vue.js
This commit is contained in:
lowlighter
2020-10-20 21:56:05 +02:00
parent 69e63541dc
commit 9bd7da1740
20 changed files with 718 additions and 394 deletions

View File

@@ -0,0 +1,41 @@
//Setup
export default function ({login, data, computed, pending, q}, {enabled = true} = {}) {
//Check if plugin is enabled and requirements are met
if (!enabled)
return computed.plugins.followup = null
if (("followup" in q)&&(!q.followup))
return computed.plugins.followup = null
console.debug(`metrics/compute/${login}/plugins > followup`)
computed.svg.height += 70
//Plugin execution
pending.push(new Promise(async solve => {
try {
//Define getters
const followup = {
issues:{
get count() { return this.open + this.closed },
get open() { return computed.repositories.issues_open },
get closed() { return computed.repositories.issues_closed },
},
pr:{
get count() { return this.open + this.merged },
get open() { return computed.repositories.pr_open },
get merged() { return computed.repositories.pr_merged }
}
}
//Save results
computed.plugins.followup = followup
console.debug(`metrics/compute/${login}/plugins > followup > success`)
console.debug(JSON.stringify(computed.plugins.followup))
solve()
}
catch (error) {
//Generic error
computed.plugins.followup = {error:`An error occured`}
console.debug(`metrics/compute/${login}/plugins > followup > error`)
console.debug(error)
solve()
}
}))
}

View File

@@ -1,5 +1,7 @@
//Imports
import followup from "./followup/index.mjs"
import habits from "./habits/index.mjs"
import languages from "./languages/index.mjs"
import lines from "./lines/index.mjs"
import pagespeed from "./pagespeed/index.mjs"
import selfskip from "./selfskip/index.mjs"
@@ -7,7 +9,9 @@
//Exports
export default {
followup,
habits,
languages,
lines,
pagespeed,
selfskip,

View File

@@ -0,0 +1,42 @@
//Setup
export default function ({login, data, computed, pending, q}, {enabled = true} = {}) {
//Check if plugin is enabled and requirements are met
if (!enabled)
return computed.plugins.languages = null
if (("languages" in q)&&(!q.languages))
return computed.plugins.languages = null
console.debug(`metrics/compute/${login}/plugins > languages`)
computed.svg.height += 90
//Plugin execution
pending.push(new Promise(async solve => {
try {
//Iterate through user's repositories and retrieve languages data
const languages = {colors:{}, total:0, stats:{}}
for (const repository of data.user.repositories.nodes) {
for (const {size, node:{color, name}} of Object.values(repository.languages.edges)) {
languages.stats[name] = (languages.stats[name] || 0) + size
languages.colors[name] = color || "#ededed"
languages.total += size
}
}
//Compute languages stats
Object.keys(languages.stats).map(name => languages.stats[name] /= languages.total)
languages.favorites = Object.entries(languages.stats).sort(([an, a], [bn, b]) => b - a).slice(0, 8).map(([name, value]) => ({name, value, color:languages.colors[name], x:0}))
for (let i = 1; i < languages.favorites.length; i++)
languages.favorites[i].x = languages.favorites[i-1].x + languages.favorites[i-1].value
//Save results
computed.plugins.languages = languages
console.debug(`metrics/compute/${login}/plugins > languages > success`)
console.debug(JSON.stringify(computed.plugins.languages))
solve()
}
catch (error) {
//Generic error
computed.plugins.languages = {error:`An error occured`}
console.debug(`metrics/compute/${login}/plugins > languages > error`)
console.debug(error)
solve()
}
}))
}

View File

@@ -20,6 +20,7 @@
}
//Save results
computed.plugins.selfskip = {commits}
computed.commits -= commits
console.debug(`metrics/compute/${login}/plugins > selfskip > success`)
console.debug(JSON.stringify(computed.plugins.selfskip))
solve()

View File

@@ -14,7 +14,7 @@
if (!q.traffic)
return computed.plugins.traffic = null
console.debug(`metrics/compute/${login}/plugins > traffic`)
computed.svg.height += 20
computed.svg.height += !q.lines ? 20 : 0
//Plugin execution
pending.push(new Promise(async solve => {