From 5ad0831465fb065b0319299bea9658a6dd50c546 Mon Sep 17 00:00:00 2001 From: linguist <22963968+lowlighter@users.noreply.github.com> Date: Sun, 27 Dec 2020 23:12:25 +0100 Subject: [PATCH] Add timezone support for web instance --- action/dist/index.js | 2 +- action/index.mjs | 2 +- src/html/app.js | 17 ++++++++++++++--- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/action/dist/index.js b/action/dist/index.js index e2fd2077..736e15fb 100644 --- a/action/dist/index.js +++ b/action/dist/index.js @@ -63,7 +63,7 @@ module.exports=(()=>{var _Mathhypot=Math.hypot,_Mathacos=Math.acos,_Mathtan=Math } } } - `);console.debug(`metrics/compute/${e}/plugins > posts > processing ${o.nodes.length} projects`);const i=[];for(const e of o.nodes){const t=(Date.now()-new Date(e.updatedAt).getTime())/86400000;let r=1>t?"less than 1 day ago":30>t?`${_Mathfloor(t)} day${2<=t?"s":""} ago`:new Date(e.updatedAt).toDateString().substring(4);const{enabled:n,todoCount:a,inProgressCount:o,doneCount:s}=e.progress;i.push({name:e.name,updated:r,progress:{enabled:n,todo:a,doing:o,done:s,total:a+o+s}})}return{list:i,totalCount:o.totalCount}}catch(e){let t="An error occured";throw e.errors?.map(({type:e})=>e)?.includes("INSUFFICIENT_SCOPES")&&(t="Insufficient token rights"),{error:{message:t,instance:e}}}},topics:async function({login:e,imports:t,q:r},{enabled:n=!1}={}){try{if(!n||!r.topics)return null;let{"topics.sort":a="stars","topics.limit":o=15}=r;const i="random"===a;a={starred:"created",activity:"updated",stars:"stars",random:"created"}[a]??"starred",o=_Mathmax(1,_Mathmin(20,+o)),console.debug(`metrics/compute/${e}/plugins > topics > searching starred topics`);let s=[];console.debug(`metrics/compute/${e}/plugins > topics > starting browser`);const l=await t.puppeteer.launch({headless:!0,executablePath:process.env.PUPPETEER_BROWSER_PATH,args:["--no-sandbox","--disable-extensions","--disable-setuid-sandbox","--disable-dev-shm-usage"]});console.debug(`metrics/compute/${e}/plugins > topics > started ${await l.version()}`);const d=await l.newPage();for(let t=1;100>=t;t++){console.debug(`metrics/compute/${e}/plugins > topics > loading page ${t}`),await d.goto(`https://github.com/stars/${e}/topics?direction=desc&page=${t}&sort=${a}`);const r=d.mainFrame();await Promise.race([r.waitForSelector("ul.repo-list"),r.waitForSelector(".blankslate")]);const n=await r.evaluate(()=>[...document.querySelectorAll("ul.repo-list li")].map(e=>({name:e.querySelector(".f3").innerText,description:e.querySelector(".f5").innerText,icon:e.querySelector("img")?.src??null})));if(console.debug(`metrics/compute/${e}/plugins > topics > extracted ${n.length} starred topics`),!n.length){console.debug(`metrics/compute/${e}/plugins > topics > no more page to load`);break}s.push(...n)}if(console.debug(`metrics/compute/${e}/plugins > music > closing browser`),await l.close(),i&&(console.debug(`metrics/compute/${e}/plugins > topics > shuffling topics`),s=t.shuffle(s)),0 topics > keeping only ${o} topics`);const t=s.slice(o);s=s.slice(0,o),s.push({name:`And ${t.length} more...`,description:t.map(({name:e})=>e).join(", "),icon:null})}console.debug(`metrics/compute/${e}/plugins > topics > loading artworks`);for(const r of s)r.icon&&(console.debug(`metrics/compute/${e}/plugins > topics > processing ${r.name}`),r.icon=await t.imgb64(r.icon)),r.description=t.htmlescape(r.description);return{list:s}}catch(e){throw{error:{message:"An error occured",instance:e}}}},traffic:async function({login:e,imports:t,data:r,rest:n,q:a},{enabled:o=!1}={}){try{if(!o||!a.traffic)return null;const i=r.user.repositories.nodes.map(({name:e})=>e)??[];console.debug(`metrics/compute/${e}/plugins > traffic > querying api`);const s={count:0,uniques:0},l=await Promise.all(i.map(async t=>await n.repos.getViews({owner:e,repo:t})));return console.debug(`metrics/compute/${e}/plugins > traffic > computing stats`),l.filter(({data:e})=>e).map(({data:{count:e,uniques:t}})=>(s.count+=e,s.uniques+=t)),s.count=t.format(s.count),s.uniques=t.format(s.uniques),{views:s}}catch(e){let t="An error occured";throw 403===e.status&&(t="Insufficient token rights"),{error:{message:t,instance:e}}}},tweets:async function({login:e,imports:t,data:r,q:n},{enabled:a=!1,token:o=null}={}){try{if(!a||!n.tweets)return null;let{"tweets.limit":i=2}=n;i=_Mathmax(1,_Mathmin(10,+i));const s=r.user.twitterUsername;console.debug(`metrics/compute/${e}/plugins > tweets > loading twitter profile (@${s})`);const{data:{data:l=null}}=await t.axios.get(`https://api.twitter.com/2/users/by/username/${s}?user.fields=profile_image_url,verified`,{headers:{Authorization:`Bearer ${o}`}});console.debug(`metrics/compute/${e}/plugins > tweets > querying api`);const{data:{data:d=[]}}=await t.axios.get(`https://api.twitter.com/2/tweets/search/recent?query=from:${s}&tweet.fields=created_at&expansions=entities.mentions.username`,{headers:{Authorization:`Bearer ${o}`}});return l?.profile_image_url&&(console.debug(`metrics/compute/${e}/plugins > tweets > loading profile image`),l.profile_image=await t.imgb64(l.profile_image_url)),0 tweets > keeping only ${i} tweets`),d.splice(i)),await Promise.all(d.map(async r=>{r.mentions=r.entities?.mentions.map(({username:e})=>e)??[],console.debug(`metrics/compute/${e}/plugins > tweets > formatting tweet ${r.id}`),r.text=t.htmlescape(t.htmlescape(r.text,{"<":!0,">":!0}).replace(new RegExp(`@(${r.mentions.join("|")})`,"gi"),` @$1 `).replace(/(?#$1 `).replace(/\n/g,"
").replace(/https?:[/][/](t.co[/]\w+)/g,` $1 `),{"&":!0})})),{username:s,profile:l,list:d}}catch(e){let t="An error occured";if(e.isAxiosError){const r=e.response?.status,n=e.response?.data?.errors?.[0]?.message??null;t=`API returned ${r}${n?` (${n})`:""}`,e=e.response?.data??null}throw{error:{message:t,instance:e}}}}},E={classic:async function({login:e,q:t},{conf:r,data:n,rest:a,graphql:i,plugins:l},{s:d,pending:s,imports:p}){await o(...arguments)},terminal:async function({login:e,q:t},{conf:r,data:n,rest:a,graphql:i,plugins:l},{s:d,pending:s,imports:p}){await o(...arguments),t.raw=!0}};var A=r(34651),O=r(78835),P=r(63129);const L=require("fs/promises");var z=r(12087),R=r(3584),I=r.t(R),M=r(32882),W=r.t(M),q=r(29483),B=r.t(q);(async function(){const[e,t,n,a,o]=[W,B,I,h,f].map(e=>e&&e.default?e.default:e),i=(e,t=!1)=>"string"==typeof e?/^(?:[Tt]rue|[Oo]n|[Yy]es)$/.test(e):t,s=[];try{console.log(`GitHub metrics`),console.log(`========================================================`),console.log(`Version | 2.9.0`),process.on("unhandledRejection",e=>{throw e}),"push"===t.context.eventName&&t.context.payload&&t.context.payload.head_commit&&/\[Skip GitHub Action\]/.test(t.context.payload.head_commit.message)&&(console.log(`Skipped because [Skip GitHub Action] is in commit message`),process.exit(0));const l=await a({log:!1});console.log(`Configuration | loaded`);const d=e.getInput("template")||"classic";console.log(`Template to use | ${d}`);const p=e.getInput("token")||"";if(console.log(`Github token | ${p?"provided":"missing"}`),!p)throw new Error("You must provide a valid GitHub token to gather your metrics");const c=n.graphql.defaults({headers:{authorization:`token ${p}`}});console.log(`Github GraphQL API | ok`);const u=t.getOctokit(p);console.log(`Github REST API | ok`);const m=e.getInput("filename")||"github-metrics.svg";console.log(`SVG output file | ${m}`);const g=i(e.getInput("optimize"),!0);l.optimize=g,console.log(`SVG optimization | ${g}`);let h;try{h=(await u.users.getAuthenticated()).data.login}catch{h=t.context.repo.owner}const f=e.getInput("user")||h;console.log(`GitHub user | ${f}`);const y=i(e.getInput("debug"));y||(console.debug=e=>s.push(e)),console.log(`Debug mode | ${y}`);const b=(e.getInput("debug_flags")||"").split(" ").filter(e=>e);console.log(`Debug flags | ${b.join(" ")}`);const S={};let x=(e.getInput("base")||"").split(",").map(e=>e.trim());for(const e of l.settings.plugins.base.parts)S[`base.${e}`]=x.includes(e);console.log(`Base parts | ${x.join(", ")||"(none)"}`);const v={"config.timezone":e.getInput("config_timezone")||""};console.log(`Timezone | ${v.timezone||"(none)"}`);const k={lines:{enabled:i(e.getInput("plugin_lines"))},traffic:{enabled:i(e.getInput("plugin_traffic"))},pagespeed:{enabled:i(e.getInput("plugin_pagespeed"))},habits:{enabled:i(e.getInput("plugin_habits"))},languages:{enabled:i(e.getInput("plugin_languages"))},followup:{enabled:i(e.getInput("plugin_followup"))},music:{enabled:i(e.getInput("plugin_music"))},posts:{enabled:i(e.getInput("plugin_posts"))},isocalendar:{enabled:i(e.getInput("plugin_isocalendar"))},gists:{enabled:i(e.getInput("plugin_gists"))},topics:{enabled:i(e.getInput("plugin_topics"))},projects:{enabled:i(e.getInput("plugin_projects"))},tweets:{enabled:i(e.getInput("plugin_tweets"))}};let C=Object.fromEntries(Object.entries(k).filter(([e,t])=>t.enabled).map(([e])=>[e,!0]));if(console.log(`Plugins enabled | ${Object.entries(k).filter(([e,t])=>t.enabled).map(([e])=>e).join(", ")}`),k.pagespeed.enabled&&(k.pagespeed.token=e.getInput("plugin_pagespeed_token")||"",C[`pagespeed.detailed`]=i(e.getInput(`plugin_pagespeed_detailed`)),console.log(`Pagespeed token | ${k.pagespeed.token?"provided":"missing"}`),console.log(`Pagespeed detailed | ${C["pagespeed.detailed"]}`)),k.languages.enabled){for(const t of["ignored","skipped"])C[`languages.${t}`]=e.getInput(`plugin_languages_${t}`)||null;console.log(`Languages ignored | ${C["languages.ignored"]}`),console.log(`Languages skipped repos | ${C["languages.skipped"]}`)}if(k.habits.enabled){for(const t of["from","days"])C[`habits.${t}`]=e.getInput(`plugin_habits_${t}`)||null;C[`habits.facts`]=i(e.getInput(`plugin_habits_facts`)),C[`habits.charts`]=i(e.getInput(`plugin_habits_charts`)),console.log(`Habits facts | ${C["habits.facts"]}`),console.log(`Habits charts | ${C["habits.charts"]}`),console.log(`Habits events to use | ${C["habits.from"]}`),console.log(`Habits days to keep | ${C["habits.days"]}`)}if(k.music.enabled){k.music.token=e.getInput("plugin_music_token")||"";for(const t of["provider","mode","playlist","limit"])C[`music.${t}`]=e.getInput(`plugin_music_${t}`)||null;console.log(`Music provider | ${C["music.provider"]}`),console.log(`Music plugin mode | ${C["music.mode"]}`),console.log(`Music playlist | ${C["music.playlist"]}`),console.log(`Music tracks limit | ${C["music.limit"]}`),console.log(`Music token | ${k.music.token?"provided":"missing"}`)}if(k.posts.enabled){for(const t of["source","limit"])C[`posts.${t}`]=e.getInput(`plugin_posts_${t}`)||null;console.log(`Posts provider | ${C["posts.provider"]}`),console.log(`Posts limit | ${C["posts.limit"]}`)}if(k.isocalendar.enabled&&(C["isocalendar.duration"]=e.getInput("plugin_isocalendar_duration")||"half-year",console.log(`Isocalendar duration | ${C["isocalendar.duration"]}`)),k.topics.enabled){for(const t of["sort","limit"])C[`topics.${t}`]=e.getInput(`plugin_topics_${t}`)||null;console.log(`Topics sort mode | ${C["topics.sort"]}`),console.log(`Topics limit | ${C["topics.limit"]}`)}if(k.projects.enabled){for(const t of["limit"])C[`projects.${t}`]=e.getInput(`plugin_projects_${t}`)||null;console.log(`Projects limit | ${C["projects.limit"]}`)}if(k.tweets.enabled){k.tweets.token=e.getInput("plugin_tweets_token")||null;for(const t of["limit"])C[`tweets.${t}`]=e.getInput(`plugin_tweets_${t}`)||null;console.log(`Twitter token | ${k.tweets.token?"provided":"missing"}`),console.log(`Tweets limit | ${C["tweets.limit"]}`)}const _=+e.getInput("repositories")||100;console.log(`Repositories to use | ${_}`);const w=i(e.getInput("plugins_errors_fatal"));console.log(`Plugin errors | ${w?"die":"ignore"}`),C={...C,base:!1,...S,...v,repositories:_,template:d};const T=await o({login:f,q:C,dflags:b},{graphql:c,rest:u,plugins:k,conf:l,die:w});console.log(`Render | complete`);const E=i(e.getInput("verify"));if(console.log(`Verify SVG | ${E}`),E){const[e]=[await r.e(344).then(r.t.bind(r,53344,1))].map(e=>e&&e.default?e.default:e),t=e.parseXml(T);if(t.errors.length)throw new Error(`Malformed SVG : \n${t.errors.join("\n")}`);console.log(`SVG valid | yes`)}const A=i(e.getInput("dryrun"));if(A)console.log(`Dry-run | complete`);else{const r=t.context.ref.replace(/^refs[/]heads[/]/,"");console.log(`Repository | ${t.context.repo.owner}/${t.context.repo.repo}`),console.log(`Branch | ${r}`);const n=e.getInput("committer_token")||e.getInput("token")||"";if(console.log(`Committer token | ${n?"provided":"missing"}`),!n)throw new Error("You must provide a valid GitHub token to commit your metrics");const a=t.getOctokit(n);console.log(`Committer REST API | ok`);try{console.log(`Committer | ${(await a.users.getAuthenticated()).data.login}`)}catch{console.log(`Committer | (unknown)`)}let o=null;try{const{repository:{object:{oid:e}}}=await c(` + `);console.debug(`metrics/compute/${e}/plugins > posts > processing ${o.nodes.length} projects`);const i=[];for(const e of o.nodes){const t=(Date.now()-new Date(e.updatedAt).getTime())/86400000;let r=1>t?"less than 1 day ago":30>t?`${_Mathfloor(t)} day${2<=t?"s":""} ago`:new Date(e.updatedAt).toDateString().substring(4);const{enabled:n,todoCount:a,inProgressCount:o,doneCount:s}=e.progress;i.push({name:e.name,updated:r,progress:{enabled:n,todo:a,doing:o,done:s,total:a+o+s}})}return{list:i,totalCount:o.totalCount}}catch(e){let t="An error occured";throw e.errors?.map(({type:e})=>e)?.includes("INSUFFICIENT_SCOPES")&&(t="Insufficient token rights"),{error:{message:t,instance:e}}}},topics:async function({login:e,imports:t,q:r},{enabled:n=!1}={}){try{if(!n||!r.topics)return null;let{"topics.sort":a="stars","topics.limit":o=15}=r;const i="random"===a;a={starred:"created",activity:"updated",stars:"stars",random:"created"}[a]??"starred",o=_Mathmax(1,_Mathmin(20,+o)),console.debug(`metrics/compute/${e}/plugins > topics > searching starred topics`);let s=[];console.debug(`metrics/compute/${e}/plugins > topics > starting browser`);const l=await t.puppeteer.launch({headless:!0,executablePath:process.env.PUPPETEER_BROWSER_PATH,args:["--no-sandbox","--disable-extensions","--disable-setuid-sandbox","--disable-dev-shm-usage"]});console.debug(`metrics/compute/${e}/plugins > topics > started ${await l.version()}`);const d=await l.newPage();for(let t=1;100>=t;t++){console.debug(`metrics/compute/${e}/plugins > topics > loading page ${t}`),await d.goto(`https://github.com/stars/${e}/topics?direction=desc&page=${t}&sort=${a}`);const r=d.mainFrame();await Promise.race([r.waitForSelector("ul.repo-list"),r.waitForSelector(".blankslate")]);const n=await r.evaluate(()=>[...document.querySelectorAll("ul.repo-list li")].map(e=>({name:e.querySelector(".f3").innerText,description:e.querySelector(".f5").innerText,icon:e.querySelector("img")?.src??null})));if(console.debug(`metrics/compute/${e}/plugins > topics > extracted ${n.length} starred topics`),!n.length){console.debug(`metrics/compute/${e}/plugins > topics > no more page to load`);break}s.push(...n)}if(console.debug(`metrics/compute/${e}/plugins > music > closing browser`),await l.close(),i&&(console.debug(`metrics/compute/${e}/plugins > topics > shuffling topics`),s=t.shuffle(s)),0 topics > keeping only ${o} topics`);const t=s.slice(o);s=s.slice(0,o),s.push({name:`And ${t.length} more...`,description:t.map(({name:e})=>e).join(", "),icon:null})}console.debug(`metrics/compute/${e}/plugins > topics > loading artworks`);for(const r of s)r.icon&&(console.debug(`metrics/compute/${e}/plugins > topics > processing ${r.name}`),r.icon=await t.imgb64(r.icon)),r.description=t.htmlescape(r.description);return{list:s}}catch(e){throw{error:{message:"An error occured",instance:e}}}},traffic:async function({login:e,imports:t,data:r,rest:n,q:a},{enabled:o=!1}={}){try{if(!o||!a.traffic)return null;const i=r.user.repositories.nodes.map(({name:e})=>e)??[];console.debug(`metrics/compute/${e}/plugins > traffic > querying api`);const s={count:0,uniques:0},l=await Promise.all(i.map(async t=>await n.repos.getViews({owner:e,repo:t})));return console.debug(`metrics/compute/${e}/plugins > traffic > computing stats`),l.filter(({data:e})=>e).map(({data:{count:e,uniques:t}})=>(s.count+=e,s.uniques+=t)),s.count=t.format(s.count),s.uniques=t.format(s.uniques),{views:s}}catch(e){let t="An error occured";throw 403===e.status&&(t="Insufficient token rights"),{error:{message:t,instance:e}}}},tweets:async function({login:e,imports:t,data:r,q:n},{enabled:a=!1,token:o=null}={}){try{if(!a||!n.tweets)return null;let{"tweets.limit":i=2}=n;i=_Mathmax(1,_Mathmin(10,+i));const s=r.user.twitterUsername;console.debug(`metrics/compute/${e}/plugins > tweets > loading twitter profile (@${s})`);const{data:{data:l=null}}=await t.axios.get(`https://api.twitter.com/2/users/by/username/${s}?user.fields=profile_image_url,verified`,{headers:{Authorization:`Bearer ${o}`}});console.debug(`metrics/compute/${e}/plugins > tweets > querying api`);const{data:{data:d=[]}}=await t.axios.get(`https://api.twitter.com/2/tweets/search/recent?query=from:${s}&tweet.fields=created_at&expansions=entities.mentions.username`,{headers:{Authorization:`Bearer ${o}`}});return l?.profile_image_url&&(console.debug(`metrics/compute/${e}/plugins > tweets > loading profile image`),l.profile_image=await t.imgb64(l.profile_image_url)),0 tweets > keeping only ${i} tweets`),d.splice(i)),await Promise.all(d.map(async r=>{r.mentions=r.entities?.mentions.map(({username:e})=>e)??[],console.debug(`metrics/compute/${e}/plugins > tweets > formatting tweet ${r.id}`),r.text=t.htmlescape(t.htmlescape(r.text,{"<":!0,">":!0}).replace(new RegExp(`@(${r.mentions.join("|")})`,"gi"),` @$1 `).replace(/(?#$1 `).replace(/\n/g,"
").replace(/https?:[/][/](t.co[/]\w+)/g,` $1 `),{"&":!0})})),{username:s,profile:l,list:d}}catch(e){let t="An error occured";if(e.isAxiosError){const r=e.response?.status,n=e.response?.data?.errors?.[0]?.message??null;t=`API returned ${r}${n?` (${n})`:""}`,e=e.response?.data??null}throw{error:{message:t,instance:e}}}}},E={classic:async function({login:e,q:t},{conf:r,data:n,rest:a,graphql:i,plugins:l},{s:d,pending:s,imports:p}){await o(...arguments)},terminal:async function({login:e,q:t},{conf:r,data:n,rest:a,graphql:i,plugins:l},{s:d,pending:s,imports:p}){await o(...arguments),t.raw=!0}};var A=r(34651),O=r(78835),P=r(63129);const L=require("fs/promises");var z=r(12087),R=r(3584),I=r.t(R),M=r(32882),W=r.t(M),q=r(29483),B=r.t(q);(async function(){const[e,t,n,a,o]=[W,B,I,h,f].map(e=>e&&e.default?e.default:e),i=(e,t=!1)=>"string"==typeof e?/^(?:[Tt]rue|[Oo]n|[Yy]es)$/.test(e):t,s=[];try{console.log(`GitHub metrics`),console.log(`========================================================`),console.log(`Version | 2.9.0`),process.on("unhandledRejection",e=>{throw e}),"push"===t.context.eventName&&t.context.payload&&t.context.payload.head_commit&&/\[Skip GitHub Action\]/.test(t.context.payload.head_commit.message)&&(console.log(`Skipped because [Skip GitHub Action] is in commit message`),process.exit(0));const l=await a({log:!1});console.log(`Configuration | loaded`);const d=e.getInput("template")||"classic";console.log(`Template to use | ${d}`);const p=e.getInput("token")||"";if(console.log(`Github token | ${p?"provided":"missing"}`),!p)throw new Error("You must provide a valid GitHub token to gather your metrics");const c=n.graphql.defaults({headers:{authorization:`token ${p}`}});console.log(`Github GraphQL API | ok`);const u=t.getOctokit(p);console.log(`Github REST API | ok`);const m=e.getInput("filename")||"github-metrics.svg";console.log(`SVG output file | ${m}`);const g=i(e.getInput("optimize"),!0);l.optimize=g,console.log(`SVG optimization | ${g}`);let h;try{h=(await u.users.getAuthenticated()).data.login}catch{h=t.context.repo.owner}const f=e.getInput("user")||h;console.log(`GitHub user | ${f}`);const y=i(e.getInput("debug"));y||(console.debug=e=>s.push(e)),console.log(`Debug mode | ${y}`);const b=(e.getInput("debug_flags")||"").split(" ").filter(e=>e);console.log(`Debug flags | ${b.join(" ")}`);const S={};let x=(e.getInput("base")||"").split(",").map(e=>e.trim());for(const e of l.settings.plugins.base.parts)S[`base.${e}`]=x.includes(e);console.log(`Base parts | ${x.join(", ")||"(none)"}`);const v={"config.timezone":e.getInput("config_timezone")||""};console.log(`Timezone | ${v["config.timezone"]||"(none)"}`);const k={lines:{enabled:i(e.getInput("plugin_lines"))},traffic:{enabled:i(e.getInput("plugin_traffic"))},pagespeed:{enabled:i(e.getInput("plugin_pagespeed"))},habits:{enabled:i(e.getInput("plugin_habits"))},languages:{enabled:i(e.getInput("plugin_languages"))},followup:{enabled:i(e.getInput("plugin_followup"))},music:{enabled:i(e.getInput("plugin_music"))},posts:{enabled:i(e.getInput("plugin_posts"))},isocalendar:{enabled:i(e.getInput("plugin_isocalendar"))},gists:{enabled:i(e.getInput("plugin_gists"))},topics:{enabled:i(e.getInput("plugin_topics"))},projects:{enabled:i(e.getInput("plugin_projects"))},tweets:{enabled:i(e.getInput("plugin_tweets"))}};let C=Object.fromEntries(Object.entries(k).filter(([e,t])=>t.enabled).map(([e])=>[e,!0]));if(console.log(`Plugins enabled | ${Object.entries(k).filter(([e,t])=>t.enabled).map(([e])=>e).join(", ")}`),k.pagespeed.enabled&&(k.pagespeed.token=e.getInput("plugin_pagespeed_token")||"",C[`pagespeed.detailed`]=i(e.getInput(`plugin_pagespeed_detailed`)),console.log(`Pagespeed token | ${k.pagespeed.token?"provided":"missing"}`),console.log(`Pagespeed detailed | ${C["pagespeed.detailed"]}`)),k.languages.enabled){for(const t of["ignored","skipped"])C[`languages.${t}`]=e.getInput(`plugin_languages_${t}`)||null;console.log(`Languages ignored | ${C["languages.ignored"]}`),console.log(`Languages skipped repos | ${C["languages.skipped"]}`)}if(k.habits.enabled){for(const t of["from","days"])C[`habits.${t}`]=e.getInput(`plugin_habits_${t}`)||null;C[`habits.facts`]=i(e.getInput(`plugin_habits_facts`)),C[`habits.charts`]=i(e.getInput(`plugin_habits_charts`)),console.log(`Habits facts | ${C["habits.facts"]}`),console.log(`Habits charts | ${C["habits.charts"]}`),console.log(`Habits events to use | ${C["habits.from"]}`),console.log(`Habits days to keep | ${C["habits.days"]}`)}if(k.music.enabled){k.music.token=e.getInput("plugin_music_token")||"";for(const t of["provider","mode","playlist","limit"])C[`music.${t}`]=e.getInput(`plugin_music_${t}`)||null;console.log(`Music provider | ${C["music.provider"]}`),console.log(`Music plugin mode | ${C["music.mode"]}`),console.log(`Music playlist | ${C["music.playlist"]}`),console.log(`Music tracks limit | ${C["music.limit"]}`),console.log(`Music token | ${k.music.token?"provided":"missing"}`)}if(k.posts.enabled){for(const t of["source","limit"])C[`posts.${t}`]=e.getInput(`plugin_posts_${t}`)||null;console.log(`Posts provider | ${C["posts.provider"]}`),console.log(`Posts limit | ${C["posts.limit"]}`)}if(k.isocalendar.enabled&&(C["isocalendar.duration"]=e.getInput("plugin_isocalendar_duration")||"half-year",console.log(`Isocalendar duration | ${C["isocalendar.duration"]}`)),k.topics.enabled){for(const t of["sort","limit"])C[`topics.${t}`]=e.getInput(`plugin_topics_${t}`)||null;console.log(`Topics sort mode | ${C["topics.sort"]}`),console.log(`Topics limit | ${C["topics.limit"]}`)}if(k.projects.enabled){for(const t of["limit"])C[`projects.${t}`]=e.getInput(`plugin_projects_${t}`)||null;console.log(`Projects limit | ${C["projects.limit"]}`)}if(k.tweets.enabled){k.tweets.token=e.getInput("plugin_tweets_token")||null;for(const t of["limit"])C[`tweets.${t}`]=e.getInput(`plugin_tweets_${t}`)||null;console.log(`Twitter token | ${k.tweets.token?"provided":"missing"}`),console.log(`Tweets limit | ${C["tweets.limit"]}`)}const _=+e.getInput("repositories")||100;console.log(`Repositories to use | ${_}`);const w=i(e.getInput("plugins_errors_fatal"));console.log(`Plugin errors | ${w?"die":"ignore"}`),C={...C,base:!1,...S,...v,repositories:_,template:d};const T=await o({login:f,q:C,dflags:b},{graphql:c,rest:u,plugins:k,conf:l,die:w});console.log(`Render | complete`);const E=i(e.getInput("verify"));if(console.log(`Verify SVG | ${E}`),E){const[e]=[await r.e(344).then(r.t.bind(r,53344,1))].map(e=>e&&e.default?e.default:e),t=e.parseXml(T);if(t.errors.length)throw new Error(`Malformed SVG : \n${t.errors.join("\n")}`);console.log(`SVG valid | yes`)}const A=i(e.getInput("dryrun"));if(A)console.log(`Dry-run | complete`);else{const r=t.context.ref.replace(/^refs[/]heads[/]/,"");console.log(`Repository | ${t.context.repo.owner}/${t.context.repo.repo}`),console.log(`Branch | ${r}`);const n=e.getInput("committer_token")||e.getInput("token")||"";if(console.log(`Committer token | ${n?"provided":"missing"}`),!n)throw new Error("You must provide a valid GitHub token to commit your metrics");const a=t.getOctokit(n);console.log(`Committer REST API | ok`);try{console.log(`Committer | ${(await a.users.getAuthenticated()).data.login}`)}catch{console.log(`Committer | (unknown)`)}let o=null;try{const{repository:{object:{oid:e}}}=await c(` query Sha { repository(owner: "${t.context.repo.owner}", name: "${t.context.repo.repo}") { object(expression: "${r}:${m}") { ... on Blob { oid } } diff --git a/action/index.mjs b/action/index.mjs index 8dd04847..dec1bec9 100644 --- a/action/index.mjs +++ b/action/index.mjs @@ -85,7 +85,7 @@ const config = { "config.timezone":core.getInput("config_timezone") || "" } - console.log(`Timezone | ${config.timezone || "(none)"}`) + console.log(`Timezone | ${config["config.timezone"] || "(none)"}`) //Additional plugins const plugins = { diff --git a/src/html/app.js b/src/html/app.js index 6115a016..084167ac 100644 --- a/src/html/app.js +++ b/src/html/app.js @@ -10,7 +10,12 @@ //Initialization el:"main", async mounted() { - await this.load() + //Load instance + await this.load() + //Interpolate config from browser + try { + this.config.timezone = Intl.DateTimeFormat().resolvedOptions().timeZone + } catch (error) {} }, components:{Prism:PrismComponent}, //Data initialization @@ -19,6 +24,9 @@ user:url.get("user") || "", palette:url.get("palette") || (window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light") || "light", requests:{limit:0, used:0, remaining:0, reset:0}, + config:{ + timezone:"", + }, plugins:{ base, list:plugins, @@ -96,10 +104,12 @@ .filter(([key, value]) => `${value}`.length) .filter(([key, value]) => this.plugins.enabled[key.split(".")[0]]) .map(([key, value]) => `${key}=${encodeURIComponent(value)}`) + //Config + const config = Object.entries(this.config).filter(([key, value]) => value).map(([key, value]) => `config.${key}=${encodeURIComponent(value)}`) //Template const template = (this.templates.selected !== templates[0]) ? [`template=${this.templates.selected}`] : [] //Generated url - const params = [...template, ...plugins, ...options].join("&") + const params = [...template, ...plugins, ...options, ...config].join("&") return `${window.location.protocol}//${window.location.host}/${this.user}${params.length ? `?${params}` : ""}` }, //Embedded generated code @@ -132,7 +142,8 @@ ` base: ${Object.entries(this.plugins.enabled.base).filter(([key, value]) => value).map(([key]) => key).join(", ")||'""'}`, ...[ ...Object.entries(this.plugins.enabled).filter(([key, value]) => (key !== "base")&&(value)).map(([key]) => ` plugin_${key}: yes`), - ...Object.entries(this.plugins.options).filter(([key, value]) => value).filter(([key, value]) => this.plugins.enabled[key.split(".")[0]]).map(([key, value]) => ` plugin_${key.replace(/[.]/, "_")}: ${typeof value === "boolean" ? {true:"yes", false:"no"}[value] : value}`) + ...Object.entries(this.plugins.options).filter(([key, value]) => value).filter(([key, value]) => this.plugins.enabled[key.split(".")[0]]).map(([key, value]) => ` plugin_${key.replace(/[.]/, "_")}: ${typeof value === "boolean" ? {true:"yes", false:"no"}[value] : value}`), + ...Object.entries(this.config).filter(([key, value]) => value).map(([key, value]) => ` config_${key.replace(/[.]/, "_")}: ${typeof value === "boolean" ? {true:"yes", false:"no"}[value] : value}`), ].sort(), ].join("\n") }