UNPKG

typescript-migration-report

Version:

An npm library that helps you calculate the percentage of TypeScript and JavaScript files in your codebase, assisting in tracking progress during migration from JavaScript to TypeScript.

2 lines (1 loc) 4.21 kB
"use strict";var t=require("fs"),e=require("glob"),o=require("path");function s(t){var e=Object.create(null);return t&&Object.keys(t).forEach((function(o){if("default"!==o){var s=Object.getOwnPropertyDescriptor(t,o);Object.defineProperty(e,o,s.get?s:{enumerable:!0,get:function(){return t[o]}})}})),e.default=t,Object.freeze(e)}var i=s(t),l=s(o);const r="",c="",a="",n="",p="",_="",d="",g="";const f=async(t,o,s)=>{const r=await e.glob(t,{cwd:o.rootDir,ignore:o.exclude});if(0===r.length)return[r.length,0];let c=0;return r.forEach((t=>{s&&console.log(`⤷ ${t}`);const e=l.join(o.rootDir,t),r=i.readFileSync(e,"utf-8");c+=r.split("\n").length})),[r.length,c]},v=t=>t>=75?p:t>=40?n:_,u=t=>`${t.toFixed(2)} %`;exports.calculateMetrics=async function(t,e){var o,s,p,_,y,$,j,m;!function(t){if(!(t.rootDir&&t.patterns&&t.patterns.typescript&&t.patterns.typescriptTests&&t.patterns.javascript&&t.patterns.javascriptTests&&t.exclude&&Array.isArray(t.exclude)))throw new Error("Invalid configuration format")}(t),(null===(o=t.logFiles)||void 0===o?void 0:o.typescript)&&console.log(`\n${c}Scanning typescript files${r}`);const[F,T]=await f(t.patterns.typescript,t,null===(s=t.logFiles)||void 0===s?void 0:s.typescript);(null===(p=t.logFiles)||void 0===p?void 0:p.typescriptTests)&&console.log(`\n${c}Scanning typescript test files${r}`);const[S,h]=await f(t.patterns.typescriptTests,t,null===(_=t.logFiles)||void 0===_?void 0:_.typescriptTests),b=F-S,w=T-h;(null===(y=t.logFiles)||void 0===y?void 0:y.javascript)&&console.log(`\n${c}Scanning javascript files${r}`);const[O,P]=await f(t.patterns.javascript,t,null===($=t.logFiles)||void 0===$?void 0:$.javascript);(null===(j=t.logFiles)||void 0===j?void 0:j.javascriptTests)&&console.log(`\n${c}Scanning javascript test files${r}`);const[x,D]=await f(t.patterns.javascriptTests,t,null===(m=t.logFiles)||void 0===m?void 0:m.javascriptTests),L=O-x,q=P-D,A=F+O,E=L+b,J=x+S,C=T+P,N=h+D,R=w+q;if(0===C)return void console.log("No JavaScript or TypeScript code found.");const k=100*b/E||0,z=100*S/J||0,I=100*h/N||0,M=100*w/R||0,B=100*T/C||0,G=100*F/A||0,H=[" ".repeat(12),"Code files","Test files","Code lines","Test lines"],K=[{title:{data:"JavaScript",color:n},code_files:{data:L,color:d},test_files:{data:x,color:d},code_lines:{data:q,color:d},test_lines:{data:D,color:d}},{title:{data:"TypeScript",color:a},code_files:{data:b,color:d},test_files:{data:S,color:d},code_lines:{data:w,color:d},test_lines:{data:h,color:d}},{title:{data:"All",color:d},code_files:{data:E,color:d},test_files:{data:J,color:d},code_lines:{data:R,color:d},test_lines:{data:N,color:d}},{title:{data:"TypeScript %",color:n},code_files:{data:u(k),color:v(k)},test_files:{data:u(z),color:v(z)},code_lines:{data:u(M),color:v(M)},test_lines:{data:u(I),color:v(I)}}].map((t=>[t.title,t.code_files,t.test_files,t.code_lines,t.test_lines]));if(console.log("\n _____ _ _ \n |_ _| _ _ __ ___ ___ __ _ _(_)_ __| |_ \n | || || | '_ \\/ -_|_-</ _| '_| | '_ \\ _|\n |_| \\_, | .__/\\___/__/\\__|_| |_| .__/\\__|\n |__/|_| |_| \n"),function(t,e){const o=t.map((t=>t.length+4)),s=(t,e)=>t.padStart(e),i=`${g}|${r}`,l=`${g}+`+t.map(((t,e)=>`${"-".repeat(o[e])}`)).join("+")+`+${r}`;console.log(l),console.log(i+t.map(((t,e)=>`${c}${a} ${s(t,o[e]-2)} ${r}`)).join(i)+i),console.log(l);for(const t of e){const e=t.map(((t,e)=>`${c}${t.color} ${s(t.data.toString(),o[e]-2)} ${r}`)).join(i);console.log(i+e+i),console.log(l)}}(H,K),console.log(`${c}Overall Typescript (Lines) %: \t${v(B)}${u(B)}${r}`),console.log(`${c}Overall Typescript (Files) %: \t${v(G)}${u(G)}${r}\n`),t.generateReport){((t,e)=>{const o="typescript-migration-report.json",s=l.join(e,o),r=JSON.stringify(t,null,2);i.writeFileSync(s,r,"utf8"),console.log(`Report file generated: ${o}`)})({codeFiles:{javascript:L,typescript:b,both:E,typescriptPercentage:k},testFiles:{javascript:x,typescript:S,both:J,typescriptPercentage:z},codeLines:{javascript:q,typescript:w,both:R,typescriptPercentage:M},testLines:{javascript:D,typescript:h,both:N,typescriptPercentage:I},overall:{typescriptLinesPercentage:B,typescriptFilesPercentage:G}},e)}};