Refactor source paths
This commit is contained in:
15
source/templates/terminal/fonts.css
Normal file
15
source/templates/terminal/fonts.css
Normal file
File diff suppressed because one or more lines are too long
180
source/templates/terminal/image.svg
Normal file
180
source/templates/terminal/image.svg
Normal file
@@ -0,0 +1,180 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="480" height="<%= 48
|
||||
+ (!!base.header)*62
|
||||
+ (!!base.metadata)*108
|
||||
+ (!!base.activity)*108
|
||||
+ (!!base.community)*94
|
||||
+ (!!base.repositories)*142
|
||||
+ ((!!base.repositories)*(!!plugins.traffic))*18
|
||||
+ ((!!base.repositories)*(!!plugins.followup))*102
|
||||
+ ((!!base.repositories)*(!!plugins.lines))*34
|
||||
+ (!!plugins.pagespeed)*110 + (plugins.pagespeed?.detailed ?? 0)*6*16
|
||||
+ (!!plugins.languages)*124
|
||||
+ (!!plugins.gists)*58
|
||||
+ Math.max(0, (((!!base.metadata)+(!!base.header)+((!!base.activity)||(!!base.community))+(!!base.repositories)+(!!plugins.pagespeed)+(!!plugins.languages)+(!!plugins.gists))-1))*20
|
||||
%>">
|
||||
<%
|
||||
meta.$ = `<span class="ps1-path">${`${user.login}`.toLocaleLowerCase()}@metrics</span>:<span class="ps1-location">~</span>${computed.token.scopes.includes("repo") ? "#" : "$"}`
|
||||
meta.animations = !meta.placeholder ? {stdin:.16, stdout:.28, length:(2+Object.keys(base).length+Object.keys(plugins).length)} : {stdin:0, stdout:0, length:0}
|
||||
%>
|
||||
|
||||
<defs><style><%= fonts %></style></defs>
|
||||
|
||||
<style>
|
||||
<%= style %>
|
||||
.stdin, .stdout {
|
||||
animation-duration: <%= meta.animations.stdin %>s;
|
||||
}
|
||||
.stdout {
|
||||
animation-duration: <%= meta.animations.stdout %>s;
|
||||
}
|
||||
<% for (let i = 0, d = 0; i < meta.animations.length; i++, d+=meta.animations.stdin+meta.animations.stdout) { %>
|
||||
.stdin:nth-of-type(<%= i+1 %>) {
|
||||
animation-delay: <%= d %>s;
|
||||
}
|
||||
.stdout:nth-of-type(<%= i+2 %>) {
|
||||
animation-delay: <%= d+meta.animations.stdin %>s;
|
||||
}
|
||||
<% if (i === meta.animations.length-1) { %>
|
||||
footer {
|
||||
animation-delay: <%= d %>s;
|
||||
}
|
||||
<% } %>
|
||||
<% } %>
|
||||
</style>
|
||||
|
||||
<foreignObject x="0" y="0" width="100%" height="100%">
|
||||
<div xmlns="http://www.w3.org/1999/xhtml" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
|
||||
<div class="header">
|
||||
<span class="title"></span>
|
||||
<div class="buttons">
|
||||
<div class="button">─</div>
|
||||
<div class="button">□</div>
|
||||
<div class="button exit">✕</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<pre><%# -%>
|
||||
<% if (base.metadata) { %>
|
||||
<div class="banner"><%# -%>
|
||||
GitHub metrics generator <%= meta.version %>
|
||||
These generated metrics comes with ABSOLUTELY NO
|
||||
WARRANTY, to the extent permitted by applicable law.
|
||||
|
||||
Last generated: <%= new Date().toGMTString() %>
|
||||
</div><% } -%>
|
||||
<%# ============================================================= -%>
|
||||
<% if (base.header) { %>
|
||||
<div class="stdin"><%- meta.$ %> whoami</div><%# -%>
|
||||
<div class="stdout"><%# -%>
|
||||
<b><%= user.name || user.login %></b> registered=<%= computed.registration.match(/^.+? [ym]/)[0].replace(/ /g, "") %>, uid=<%= `${user.databaseId}`.substr(-4) %>, gid=<%= user.organizations.totalCount %>
|
||||
contributed to <%= user.repositoriesContributedTo.totalCount %> repositor<%= s(user.repositoriesContributedTo.totalCount, "y") %> <b><% for (const [x, {color}] of Object.entries(computed.calendar)) { -%><span style="color:<%= color %>">#</span><% } %></b>
|
||||
followed by <b><%= user.followers.totalCount %></b> user<%= s(user.followers.totalCount) %>
|
||||
</div><% } -%>
|
||||
<%# ============================================================= -%>
|
||||
<% if ((base.activity)||(base.community)) { %>
|
||||
<div class="stdin"><%- meta.$ %> git status</div><%# -%>
|
||||
<div class="stdout"><%# -%>
|
||||
<% if (base.activity) { -%>
|
||||
<b>Recent activity</b>
|
||||
<b><%= `${computed.commits}`.padStart(5) %></b> commit<%= s(computed.commits) %>
|
||||
<b><%= `${user.contributionsCollection.totalPullRequestReviewContributions}`.padStart(5) %></b> pull request<%= s(user.contributionsCollection.totalPullRequestReviewContributions) %> reviewed
|
||||
<b><%= `${user.contributionsCollection.totalPullRequestContributions}`.padStart(5) %></b> pull request<%= s(user.contributionsCollection.totalPullRequestContributions) %> opened
|
||||
<b><%= `${user.contributionsCollection.totalIssueContributions}`.padStart(5) %></b> issue<%= s(user.contributionsCollection.totalIssueContributions) %> opened
|
||||
<b><%= `${user.issueComments.totalCount}`.padStart(5) %></b> issue comment<%= s(user.issueComments.totalCount) %>
|
||||
<% } -%>
|
||||
<% if ((base.activity)&&(base.community)) { -%>
|
||||
|
||||
<% } -%>
|
||||
<% if (base.community) { -%>
|
||||
<b>Tracked activity</b>
|
||||
<b><%= `${user.following.totalCount}`.padStart(5) %></b> user<%= s(user.followers.totalCount) %> followed
|
||||
<b><%= `${user.sponsorshipsAsSponsor.totalCount}`.padStart(5) %></b> repositor<%= s(user.sponsorshipsAsSponsor.totalCount, "y") %> sponsored
|
||||
<b><%= `${user.starredRepositories.totalCount}`.padStart(5) %></b> repositor<%= s(user.starredRepositories.totalCount, "y") %> starred
|
||||
<b><%= `${user.watching.totalCount}`.padStart(5) %></b> repositor<%= s(user.watching.totalCount, "y") %> watched
|
||||
<% } -%>
|
||||
</div><% } -%>
|
||||
<%# ============================================================= -%>
|
||||
<% if (base.repositories) { %>
|
||||
<div class="stdin"><%- meta.$ %> ls -lh github/repositories</div><%# -%>
|
||||
<div class="stdout"><%# -%>
|
||||
Total <%= user.repositories.totalCount %> repositor<%= s(user.repositories.totalCount, "y") %> - <%= computed.diskUsage %>
|
||||
<% if (plugins.traffic) { if (plugins.traffic.error) { -%>
|
||||
---- <b> </b> views <span class="error">(<%= plugins.traffic.error.message %>)</span>
|
||||
<% } else { -%>
|
||||
-r-- <b><%= `${plugins.traffic.views.count}`.padStart(5) %></b> views
|
||||
<% }} -%>
|
||||
-r-- <b><%= `${computed.repositories.stargazers}`.padStart(5) %></b> stargazer<%= s(computed.repositories.stargazers) %>
|
||||
-r-- <b><%= `${computed.repositories.forks}`.padStart(5) %></b> fork<%= s(computed.repositories.forks) %>
|
||||
-r-- <b><%= `${computed.repositories.watchers}`.padStart(5) %></b> watcher<%= s(computed.repositories.watchers) %>
|
||||
dr-x <b><%= `${user.packages.totalCount}`.padStart(5) %></b> package<%= s(user.packages.totalCount) %>
|
||||
<% if (plugins.followup) { if (plugins.followup.error) { -%>
|
||||
d--- <b> </b> ISSUES <span class="error">(<%= plugins.followup.error.message %>)</span>
|
||||
d--- <b> </b> PULL_REQUESTS <span class="error">(<%= plugins.followup.error.message %>)</span>
|
||||
<% } else { -%>
|
||||
dr-x <b><%= `${plugins.followup.issues.count}`.padStart(5) %></b> ISSUES
|
||||
-r-- <b><%= `${plugins.followup.issues.open}`.padStart(5) %></b> ├── open
|
||||
-r-- <b><%= `${plugins.followup.issues.closed}`.padStart(5) %></b> └── closed
|
||||
dr-x <b><%= `${plugins.followup.issues.count}`.padStart(5) %></b> PULL_REQUESTS
|
||||
-r-- <b><%= `${plugins.followup.pr.open}`.padStart(5) %></b> ├── open
|
||||
-r-- <b><%= `${plugins.followup.pr.merged}`.padStart(5) %></b> └── merged
|
||||
<% }} -%>
|
||||
<% if (computed.licenses.favorite.length) { -%>
|
||||
dr-x LICENSE
|
||||
-r-- └── <%= computed.licenses.favorite %>
|
||||
<% } -%>
|
||||
<% if (plugins.lines) { if (plugins.lines.error) { %>
|
||||
<span class="diff error">@@ <%= plugins.lines.error.message %> @@</span><% } else { %>
|
||||
<span class="diff">@@ -<%= plugins.lines.deleted %> +<%= plugins.lines.added %> @@</span>
|
||||
<% }} -%>
|
||||
</div><% } -%>
|
||||
<%# ============================================================= -%>
|
||||
<% if (plugins.gists) { %>
|
||||
<div class="stdin"><%- meta.$ %> ls -lh github/gists</div><%# -%>
|
||||
<div class="stdout"><%# -%>
|
||||
Total <%= plugins.gists.totalCount %> gist<%= s(plugins.gists.totalCount) %>
|
||||
-r-- <b><%= `${plugins.gists.stargazers}`.padStart(5) %></b> stargazer<%= s(plugins.gists.stargazers) %>
|
||||
-r-- <b><%= `${plugins.gists.forks}`.padStart(5) %></b> fork<%= s(plugins.gists.forks) %>
|
||||
</div><% } -%>
|
||||
<%# ============================================================= -%>
|
||||
<% if (plugins.languages) { %>
|
||||
<div class="stdin"><%- meta.$ %> locale</div><%# -%>
|
||||
<div class="stdout"><%# -%>
|
||||
<% if (plugins.languages.error) { -%>
|
||||
<span class="error"><%= plugins.languages.error.message %></span><%# -%>
|
||||
<% } else { for (const {name, value} of plugins.languages.favorites) { -%>
|
||||
<b><%= name.toLocaleUpperCase().padEnd(12) %></b> [<%= "#".repeat(Math.ceil(100*value/5)).padEnd(20) %>] <%= (100*value).toFixed(2).padEnd(5) %>%
|
||||
<% }} -%>
|
||||
</div><% } -%>
|
||||
<%# ============================================================= -%>
|
||||
<% if (plugins.pagespeed) { %>
|
||||
<div class="stdin"><%- meta.$ %> curl -<%= plugins.pagespeed.detailed ? "v" : "" %>I <%= user.websiteUrl %></div><%# -%>
|
||||
<div class="stdout"><%# -%>
|
||||
<% if (plugins.pagespeed.error) { -%>
|
||||
<span class="error"><%= plugins.pagespeed.error.message %></span><% } else { -%>
|
||||
<b>User-Agent</b>: Google PageSpeed API
|
||||
<b>Location</b>: <%= user.websiteUrl %>
|
||||
<% for (const {score, title} of plugins.pagespeed.scores) { -%>
|
||||
<b><%= `X-${title.replace(/ /g, "-")}` %></b>: <%= !Number.isNaN(score) ? Math.round(score*100) : "-" %>%
|
||||
<% } -%>
|
||||
<% if (plugins.pagespeed.detailed) { for (const {name, score, suffix = "", threshold} of [
|
||||
{name:"Time to interactive", score:plugins.pagespeed.metrics.interactive/1000, suffix:"s", threshold:[3.785, 7.3]},
|
||||
{name:"Speed Index", score:plugins.pagespeed.metrics.speedIndex/1000, suffix:"s", threshold:[3.387, 5.8]},
|
||||
{name:"Total Blocking Time", score:plugins.pagespeed.metrics.totalBlockingTime/1000, suffix:"s", threshold:[.287, .6]},
|
||||
{name:"First Contentful Paint", score:plugins.pagespeed.metrics.firstContentfulPaint/1000, suffix:"s", threshold:[2.336, 4]},
|
||||
{name:"Largest Contentful Paint", score:plugins.pagespeed.metrics.largestContentfulPaint/1000, suffix:"s", threshold:[2.5, 4]},
|
||||
{name:"Cumulative Layout Shift", score:+plugins.pagespeed.metrics.cumulativeLayoutShift, threshold:[.1, .25]}
|
||||
]) { -%>
|
||||
<b>> <%= name %></b>: <%= !Number.isNaN(score) ? score : "-" %><%= suffix %> <% if (Number.isNaN(score)) { %><% } else if (score <= threshold[0]) { %>(ok +)<% } else if (score <= threshold[1]) { %>(ok)<% } else { %>(bad)<% } %>
|
||||
<% }}} -%>
|
||||
</div><% } -%>
|
||||
<%# ============================================================= -%>
|
||||
<% if (base.metadata) { -%>
|
||||
|
||||
<footer>Connection reset by <%= Math.floor(256*Math.random()) %>.<%= Math.floor(256*Math.random()) %>.<%= Math.floor(256*Math.random()) %>.<%= Math.floor(256*Math.random()) %></footer><%# -%>
|
||||
<% } -%></pre>
|
||||
|
||||
</div>
|
||||
</foreignObject>
|
||||
</svg>
|
||||
|
||||
|
After Width: | Height: | Size: 9.8 KiB |
127
source/templates/terminal/style.css
Normal file
127
source/templates/terminal/style.css
Normal file
@@ -0,0 +1,127 @@
|
||||
/* SVG global context */
|
||||
svg {
|
||||
font-family: 'Courier Prime';
|
||||
font-size: 14px;
|
||||
color: #777777;
|
||||
}
|
||||
|
||||
/* Title bar */
|
||||
.header {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
width: 100%;
|
||||
height: 20px;
|
||||
align-items: center;
|
||||
padding: 0 8px;
|
||||
box-sizing: border-box;
|
||||
border-top-left-radius: 5px;
|
||||
border-top-right-radius: 5px;
|
||||
background: linear-gradient(#504b45 0%,#3c3b37 100%);
|
||||
}
|
||||
|
||||
.title {
|
||||
color: #d5d0ce;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.buttons {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.button {
|
||||
color: black;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
margin-right: 5px;
|
||||
font-size: 8px;
|
||||
height: 12px;
|
||||
width: 12px;
|
||||
border-radius: 100%;
|
||||
background: linear-gradient(#7d7871 0%, #595953 100%);
|
||||
text-shadow: 0px 1px 0px rgba(255,255,255,0.2);
|
||||
}
|
||||
|
||||
.button.exit {
|
||||
background: linear-gradient(#f37458 0%, #de4c12 100%);
|
||||
}
|
||||
|
||||
/* Terminal */
|
||||
pre, .banner, footer {
|
||||
margin: 0;
|
||||
font-family: 'Courier Prime';
|
||||
color: #DDDDDD;
|
||||
}
|
||||
pre {
|
||||
background: #42092B;
|
||||
padding: 12px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
.banner, footer {
|
||||
color: #AE9DA7;
|
||||
}
|
||||
|
||||
/* Prompt */
|
||||
.ps1-path {
|
||||
color: #7EDA29;
|
||||
}
|
||||
|
||||
.ps1-location {
|
||||
color: #4878c0;
|
||||
}
|
||||
|
||||
/* Diff */
|
||||
.diff {
|
||||
color: #3A96DD;
|
||||
}
|
||||
|
||||
/* Error */
|
||||
.error {
|
||||
color: #cb2431;
|
||||
}
|
||||
|
||||
/* Animations */
|
||||
.stdin, footer {
|
||||
width: 0%;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
animation-name: stdin-animation;
|
||||
animation-fill-mode: both;
|
||||
}
|
||||
|
||||
.stdout {
|
||||
max-height: 0%;
|
||||
overflow: hidden;
|
||||
animation-name: stdout-animation;
|
||||
animation-fill-mode: both;
|
||||
}
|
||||
|
||||
@keyframes stdin-animation {
|
||||
0% { width: 0%; }
|
||||
100% { width: 100%; }
|
||||
}
|
||||
|
||||
@keyframes stdout-animation {
|
||||
0% { max-height: 0; }
|
||||
100% { max-height: 360px; }
|
||||
}
|
||||
|
||||
/* Calendar */
|
||||
:root {
|
||||
--color-calendar-graph-day-bg: #ebedf0;
|
||||
--color-calendar-graph-day-border: rgba(27,31,35,0.06);
|
||||
--color-calendar-graph-day-L1-bg: #9be9a8;
|
||||
--color-calendar-graph-day-L2-bg: #40c463;
|
||||
--color-calendar-graph-day-L3-bg: #30a14e;
|
||||
--color-calendar-graph-day-L4-bg: #216e39;
|
||||
--color-calendar-halloween-graph-day-L1-bg: #ffee4a;
|
||||
--color-calendar-halloween-graph-day-L2-bg: #ffc501;
|
||||
--color-calendar-halloween-graph-day-L3-bg: #fe9600;
|
||||
--color-calendar-halloween-graph-day-L4-bg: #03001c;
|
||||
--color-calendar-graph-day-L4-border: rgba(27,31,35,0.06);
|
||||
--color-calendar-graph-day-L3-border: rgba(27,31,35,0.06);
|
||||
--color-calendar-graph-day-L2-border: rgba(27,31,35,0.06);
|
||||
--color-calendar-graph-day-L1-border: rgba(27,31,35,0.06);
|
||||
}
|
||||
10
source/templates/terminal/template.mjs
Normal file
10
source/templates/terminal/template.mjs
Normal file
@@ -0,0 +1,10 @@
|
||||
//Imports
|
||||
import common from "./../common.mjs"
|
||||
|
||||
/** Template processor */
|
||||
export default async function ({login, q}, {conf, data, rest, graphql, plugins, queries}, {s, pending, imports}) {
|
||||
//Common
|
||||
await common(...arguments)
|
||||
//Disable optimization to keep white-spaces
|
||||
q.raw = true
|
||||
}
|
||||
Reference in New Issue
Block a user