harshapitla/github-actions-analytics
0
1export function formatSI(v){2 if (v === null || v === undefined) return "";3 const n = Number(v);4 if (isNaN(n)) return String(v);5 const abs = Math.abs(n);6 if (abs >= 1e9) return (n/1e9).toFixed(1)+'B';7 if (abs >= 1e6) return (n/1e6).toFixed(1)+'M';8 if (abs >= 1e3) return (n/1e3).toFixed(1)+'k';9 return String(n);10}11 12export function formatNumberPrecise(v, digits=1){13 if (v === null || v === undefined) return "";14 const n = Number(v);15 if (!Number.isFinite(n)) return String(v);16 if (Math.abs(n) < 1000) return n.toFixed(0);17 return formatSI(n);18}19 20export function formatRating(v){21 const n = Number(v);22 if (!Number.isFinite(n)) return "";23 return n.toFixed(1);24}25 26export function truncateLabel(s, max=20){27 if(!s && s !== 0) return "";28 const str = String(s);29 if (str.length <= max) return str;30 return str.slice(0, max-1).trim() + "…";31}32 33export function tokensFromField(s){34 if(!s) return [];35 const replaced = String(s).replace(/[|/\\]+/g, ",").replace(/;/g,",");36 const parts = replaced.split(",").map(p => p.trim()).filter(Boolean);37 const out = [];38 parts.forEach(p => {39 p.split(/(?=[A-Z][a-z])|[_\-\s]+|(?=[0-9])|(?<=[a-z])(?=[A-Z])|[:.]+/).forEach(q=>{40 const t = q.trim();41 if(t) out.push(t);42 });43 });44 return [...new Set(out)]; 45}46 