From 130c74b2665ec406ba6da3273f49d35958b4ed55 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Wed, 6 Jul 2022 04:37:39 +0200
Subject: [PATCH] refactor(app/web): new features (#1124) [skip ci]
---
.github/config/label.yml | 2 +-
.../readme/partials/templated/introduction.md | 4 +-
.../partials/templated/plugins.community.md | 5 +-
.github/scripts/preview.mjs | 21 +-
.github/scripts/quickstart/plugin/index.mjs | 6 +-
source/app/metrics/index.mjs | 10 +-
source/app/metrics/metadata.mjs | 80 ++--
source/app/metrics/setup.mjs | 117 +++--
source/app/metrics/utils.mjs | 43 ++
source/app/web/instance.mjs | 428 ++++++++++--------
source/app/web/settings.example.json | 63 ++-
source/app/web/statics/app.js | 231 +---------
source/app/web/statics/embed/app.js | 328 ++++++++++++++
.../statics/{ => embed}/app.placeholder.js | 0
source/app/web/statics/embed/index.html | 201 ++++++++
.../placeholders/isocalendar.full-year.svg | 0
.../placeholders/isocalendar.half-year.svg | 0
.../{ => embed}/placeholders/screenshot.png | Bin
.../{ => embed}/placeholders/skyline.png | Bin
.../{ => embed}/placeholders/stock.svg | 0
source/app/web/statics/index.html | 173 +------
.../statics/{about => insights}/index.html | 4 +-
.../web/statics/{about => insights}/script.js | 8 +-
.../web/statics/{about => insights}/style.css | 0
source/app/web/statics/style.css | 2 +-
source/plugins/achievements/index.mjs | 6 +-
source/plugins/achievements/metadata.yml | 2 +
source/plugins/activity/index.mjs | 6 +-
source/plugins/anilist/index.mjs | 13 +-
source/plugins/anilist/metadata.yml | 2 +
source/plugins/base/index.mjs | 3 +-
source/plugins/base/metadata.yml | 1 -
source/plugins/calendar/index.mjs | 6 +-
source/plugins/code/index.mjs | 6 +-
source/plugins/community/README.md | 3 +-
source/plugins/community/fortune/index.mjs | 6 +-
source/plugins/community/nightscout/index.mjs | 10 +-
source/plugins/community/poopmap/index.mjs | 6 +-
source/plugins/community/screenshot/index.mjs | 10 +-
.../plugins/community/screenshot/metadata.yml | 2 +
source/plugins/community/stock/index.mjs | 17 +-
source/plugins/contributors/index.mjs | 6 +-
source/plugins/core/metadata.yml | 10 +-
source/plugins/discussions/index.mjs | 6 +-
source/plugins/followup/index.mjs | 57 ++-
source/plugins/gists/index.mjs | 8 +-
source/plugins/habits/index.mjs | 10 +-
source/plugins/introduction/index.mjs | 6 +-
source/plugins/isocalendar/index.mjs | 8 +-
source/plugins/languages/index.mjs | 79 ++--
source/plugins/languages/metadata.yml | 22 +-
source/plugins/licenses/index.mjs | 4 +-
source/plugins/licenses/metadata.yml | 1 +
source/plugins/lines/index.mjs | 6 +-
source/plugins/music/index.mjs | 49 +-
source/plugins/music/metadata.yml | 2 +
source/plugins/notable/index.mjs | 125 +++--
source/plugins/pagespeed/index.mjs | 24 +-
source/plugins/people/index.mjs | 6 +-
source/plugins/posts/index.mjs | 10 +-
source/plugins/projects/index.mjs | 13 +-
source/plugins/reactions/index.mjs | 6 +-
source/plugins/repositories/index.mjs | 6 +-
source/plugins/rss/index.mjs | 10 +-
source/plugins/skyline/index.mjs | 6 +-
source/plugins/skyline/metadata.yml | 2 +
source/plugins/sponsors/index.mjs | 6 +-
source/plugins/stackoverflow/index.mjs | 10 +-
source/plugins/stargazers/index.mjs | 8 +-
source/plugins/starlists/index.mjs | 6 +-
source/plugins/starlists/metadata.yml | 2 +
source/plugins/stars/index.mjs | 8 +-
source/plugins/support/index.mjs | 10 +-
source/plugins/support/metadata.yml | 4 +-
source/plugins/topics/index.mjs | 8 +-
source/plugins/topics/metadata.yml | 2 +
source/plugins/traffic/index.mjs | 9 +-
source/plugins/tweets/index.mjs | 13 +-
source/plugins/wakatime/index.mjs | 12 +-
vercel.json | 2 +
80 files changed, 1304 insertions(+), 1103 deletions(-)
create mode 100644 source/app/web/statics/embed/app.js
rename source/app/web/statics/{ => embed}/app.placeholder.js (100%)
create mode 100644 source/app/web/statics/embed/index.html
rename source/app/web/statics/{ => embed}/placeholders/isocalendar.full-year.svg (100%)
rename source/app/web/statics/{ => embed}/placeholders/isocalendar.half-year.svg (100%)
rename source/app/web/statics/{ => embed}/placeholders/screenshot.png (100%)
rename source/app/web/statics/{ => embed}/placeholders/skyline.png (100%)
rename source/app/web/statics/{ => embed}/placeholders/stock.svg (100%)
rename source/app/web/statics/{about => insights}/index.html (99%)
rename source/app/web/statics/{about => insights}/script.js (97%)
rename source/app/web/statics/{about => insights}/style.css (100%)
diff --git a/.github/config/label.yml b/.github/config/label.yml
index bbba6ab1..f4f16be4 100644
--- a/.github/config/label.yml
+++ b/.github/config/label.yml
@@ -2,7 +2,7 @@
- source/app/action/**
- source/app/web/**
✨ metrics insights:
- - source/app/web/statics/about/**
+ - source/app/web/statics/insights/**
🧩 plugins:
- source/plugins/**
diff --git a/.github/readme/partials/templated/introduction.md b/.github/readme/partials/templated/introduction.md
index 89473dbe..bbe2c3ef 100644
--- a/.github/readme/partials/templated/introduction.md
+++ b/.github/readme/partials/templated/introduction.md
@@ -79,8 +79,8 @@ Generate metrics that can be embedded everywhere, including your GitHub profile
|
diff --git a/.github/readme/partials/templated/plugins.community.md b/.github/readme/partials/templated/plugins.community.md
index 45c398c2..24f76243 100644
--- a/.github/readme/partials/templated/plugins.community.md
+++ b/.github/readme/partials/templated/plugins.community.md
@@ -220,7 +220,8 @@ export default async function(
},
//Settings and tokens
{
- enabled = false
+ enabled = false,
+ extras = false,
} = {}) {
//Plugin execution
try {
@@ -241,7 +242,7 @@ export default async function(
}
//Handle errors
catch (error) {
- throw {error:{message:"An error occured", instance:error}}
+ throw imports.format.error(error)
}
}
```
diff --git a/.github/scripts/preview.mjs b/.github/scripts/preview.mjs
index e7021115..8763bec7 100644
--- a/.github/scripts/preview.mjs
+++ b/.github/scripts/preview.mjs
@@ -9,14 +9,12 @@ const __metrics = paths.join(paths.dirname(url.fileURLToPath(import.meta.url)),
const __templates = paths.join(paths.join(__metrics, "source/templates/"))
const __node_modules = paths.join(paths.join(__metrics, "node_modules"))
const __web = paths.join(paths.join(__metrics, "source/app/web/statics"))
-const __web_about = paths.join(paths.join(__web, "about"))
const __preview = paths.join(paths.join(__web, "preview"))
const __preview_js = paths.join(__preview, ".js")
const __preview_css = paths.join(__preview, ".css")
const __preview_templates = paths.join(__preview, ".templates")
const __preview_templates_ = paths.join(__preview, ".templates_")
-const __preview_about = paths.join(__preview, "about/.statics")
//Extract from web server
const {conf, Templates} = await setup({log: false})
@@ -34,7 +32,6 @@ await fs.mkdir(__preview_js, {recursive: true})
await fs.mkdir(__preview_css, {recursive: true})
await fs.mkdir(__preview_templates, {recursive: true})
await fs.mkdir(__preview_templates_, {recursive: true})
-await fs.mkdir(__preview_about, {recursive: true})
//Web
fs.copyFile(paths.join(__web, "index.html"), paths.join(__preview, "index.html"))
@@ -81,9 +78,15 @@ fs.copyFile(paths.join(__node_modules, "clipboard/dist/clipboard.min.js"), paths
//Meta
fs.writeFile(paths.join(__preview, ".version"), JSON.stringify(`${conf.package.version}-preview`))
fs.writeFile(paths.join(__preview, ".hosted"), JSON.stringify({by: "metrics", link: "https://github.com/lowlighter/metrics"}))
-//About
-fs.copyFile(paths.join(__web, "about", "index.html"), paths.join(__preview, "about", "index.html"))
-for (const file of await fs.readdir(__web_about)) {
- if (file !== ".statics")
- fs.copyFile(paths.join(__web_about, file), paths.join(__preview_about, file))
-}
+//Insights
+for (const insight of ["insights", "about"]) {
+ const __web_insights = paths.join(paths.join(__web, insight))
+ const __preview_insights = paths.join(__preview, `${insight}/.statics`)
+ await fs.mkdir(__preview_insights, {recursive: true})
+
+ fs.copyFile(paths.join(__web, insight, "index.html"), paths.join(__preview, insight, "index.html"))
+ for (const file of await fs.readdir(__web_insights)) {
+ if (file !== ".statics")
+ fs.copyFile(paths.join(__web_insights, file), paths.join(__preview_insights, file))
+ }
+}
\ No newline at end of file
diff --git a/.github/scripts/quickstart/plugin/index.mjs b/.github/scripts/quickstart/plugin/index.mjs
index defb82a8..7f956c21 100644
--- a/.github/scripts/quickstart/plugin/index.mjs
+++ b/.github/scripts/quickstart/plugin/index.mjs
@@ -1,15 +1,15 @@
//Setup
-export default async function({login, q, imports, data, computed, rest, graphql, queries, account}, {enabled = false} = {}) {
+export default async function({login, q, imports, data, computed, rest, graphql, queries, account}, {enabled = false, extras = false} = {}) {
//Plugin execution
try {
//Check if plugin is enabled and requirements are met
- if ((!enabled)||(!q.<%= name %>))
+ if ((!enabled) || (!q.<%= name %>) || (!imports.metadata.plugins.<%= name %>.extras("enabled", {extras})))
return null
//Results
return {}
}
//Handle errors
catch (error) {
- throw {error:{message:"An error occured", instance:error}}
+ throw imports.format.error(error)
}
}
\ No newline at end of file
diff --git a/source/app/metrics/index.mjs b/source/app/metrics/index.mjs
index 463191ce..e1f07278 100644
--- a/source/app/metrics/index.mjs
+++ b/source/app/metrics/index.mjs
@@ -24,7 +24,7 @@ export default async function metrics({login, q}, {graphql, rest, plugins, conf,
//Initialization
const pending = []
const {queries} = conf
- const extras = {css: (conf.settings.extras?.css ?? conf.settings.extras?.default) ? q["extras.css"] ?? "" : "", js: (conf.settings.extras?.js ?? conf.settings.extras?.default) ? q["extras.js"] ?? "" : ""}
+ const extras = {css: imports.metadata.plugins.core.extras("extras_css", {...conf.settings, error:false}) ? q["extras.css"] ?? "" : "", js: imports.metadata.plugins.core.extras("extras_js", {...conf.settings, error:false}) ? q["extras.js"] ?? "" : ""}
const data = {q, animated: true, large: false, base: {}, config: {}, errors: [], plugins: {}, computed: {}, extras, postscripts: []}
const imports = {
plugins: Plugins,
@@ -184,7 +184,7 @@ export default async function metrics({login, q}, {graphql, rest, plugins, conf,
if ((conf.settings?.optimize === true) || (conf.settings?.optimize?.includes?.("svg")))
rendered = await imports.svg.optimize.svg(rendered, q, experimental)
//Verify svg
- if (verify) {
+ if ((verify)&&(imports.metadata.plugins.core.extras("verify", {...conf.settings, error:false}))) {
console.debug(`metrics/compute/${login} > verify SVG`)
let libxmljs = null
try {
@@ -281,9 +281,9 @@ metrics.insights.output = async function({login, imports, conf}, {graphql, rest,
console.debug(`metrics/compute/${login} > insights > generating data`)
const result = await metrics.insights({login}, {graphql, rest, conf}, {Plugins, Templates})
const json = JSON.stringify(result)
- await page.goto(`${server}/about/${login}?embed=1&localstorage=1`)
+ await page.goto(`${server}/insights/${login}?embed=1&localstorage=1`)
await page.evaluate(async json => localStorage.setItem("local.metrics", json), json) //eslint-disable-line no-undef
- await page.goto(`${server}/about/${login}?embed=1&localstorage=1`)
+ await page.goto(`${server}/insights/${login}?embed=1&localstorage=1`)
await page.waitForSelector(".container .user", {timeout: 10 * 60 * 1000})
//Rendering
@@ -297,7 +297,7 @@ metrics.insights.output = async function({login, imports, conf}, {graphql, rest,
${await page.evaluate(() => document.querySelector("main").outerHTML)}
- ${(await Promise.all([".css/style.vars.css", ".css/style.css", "about/.statics/style.css"].map(path => utils.axios.get(`${server}/${path}`)))).map(({data: style}) => ``).join("\n")}
+ ${(await Promise.all([".css/style.vars.css", ".css/style.css", "insights/.statics/style.css"].map(path => utils.axios.get(`${server}/${path}`)))).map(({data: style}) => ``).join("\n")}
|