demozap
Version:
Create demo components in a zap
2 lines (1 loc) • 5.17 kB
JavaScript
import{cac as L}from"cac";import{formatDuration as $,intervalToDuration as k}from"date-fns";var g=({startTime:e,endTime:t,shouldCalculateMs:a})=>{let o=new Date(e),r=new Date(t),i=k({start:o,end:r}),m=$(i,{zero:!1,format:["years","months","weeks","days","hours","minutes","seconds"]}),n=m===""?"0s":m;if(!a)return n;let c=(r.getTime()-o.getTime())%1e3;return m===""?`${c.toString()}ms`:c>0?`${n} ${c.toString()}ms`:n};import f from"chalk";var d=console.log,I=e=>d(f.blue(e)),A=e=>d(f.gray(e)),_=e=>d(f.bold.green(e)),M=e=>d(f.red(e)),s={info:I,infoSecondary:A,success:_,error:M};var y="v1.3.83";var h=["react","vue","svelte"];var l={prefix:{nameLong:"prefix",nameShort:"p",default:"_",description:"Generate demos with filename prefix"},framework:{nameLong:"framework",default:"react",description:`Generate demos for preferred framework ${h.join("|")}`},help:{nameLong:"help",nameShort:"h"},version:{nameLong:"version",nameShort:"v"}},D=()=>{let e=L("demozap");e.option(`-${l.prefix.nameShort}, --${l.prefix.nameLong} <prefix>`,l.prefix.description,{default:l.prefix.default}),e.option(`--${l.framework.nameLong} <type>`,l.framework.description,{default:l.framework.default}),e.help(),e.version(y);let t=e.parse(),a=N({cliOptions:l,options:Object.keys(t.options).filter(o=>o!=="--")});if(a.length>0)throw new Error(`Unknown ${a.length===1?"option":"options"} passed to CLI: ${a.join(", ")}.`);return{shouldExitCli:t.options.help||t.options.version,prefix:t.options.prefix,framework:t.options.framework}},N=({cliOptions:e,options:t})=>{let a=Object.values(e).map(r=>[r.nameLong,r.nameShort]).flat().filter(r=>r);return t.filter(r=>!a.includes(r))};import{globSync as v}from"glob";var U=["jsx","tsx"],G=["css","scss"],F=()=>{let e=v(`${process.cwd()}/**/*.demozap.*`,{}),t=e.filter(o=>{let r=P(o);return r===void 0?!1:U.includes(r)}),a=e.filter(o=>{let r=P(o);return r===void 0?!1:G.includes(r)});return{demoZapCodeFilePaths:t,demoZapStyleFilePaths:a}},P=e=>e.split(".").pop();import x from"path";var u=({demoZapCodeFilePath:e})=>{let t=x.dirname(e),o=x.basename(e).split(".");return{dirname:t,filename:{base:o[0],ext:o[2]}}};import j from"path";var T=(e,t)=>{let a=e.filter(o=>{if(j.basename(o).split(".")[0]===t)return!0});return a.length>0?a:null};var C=({demoZapCodeFilePath:e,demoZapStyleFilePaths:t,prefix:a})=>{let o=u({demoZapCodeFilePath:e}),r=`${a}${o.filename.base}.${o.filename.ext}`,i=`${a}${o.filename.base}`,n={path:`${o.dirname}/${r}`,filename:r,componentName:i,code:{path:e,dirname:o.dirname,filename:{base:o.filename.base,ext:o.filename.ext}},style:{path:null,dirname:null,filename:{base:null,ext:null}}},p=T(t,n.code.filename.base);if(p){let c=u({demoZapCodeFilePath:p[0]});n.style.path=p[0],n.style.dirname=c.dirname,n.style.filename.base=c.filename.base,n.style.filename.ext=c.filename.ext}return n};var S=({demoZapCodeFilePaths:e,demoZapStyleFilePaths:t,prefix:a})=>e.map(r=>C({demoZapCodeFilePath:r,demoZapStyleFilePaths:t,prefix:a}));import{cp as X}from"node:fs/promises";import{dirname as Y}from"path";import{fileURLToPath as z}from"url";var B=z(import.meta.url),K=Y(B),b=async e=>{let t=0,a=`${K}/../bin/templates/react-demo-tab/template`;return await Promise.all(e.map(async o=>{let r=`${a}.${o.code.filename.ext}`;await X(r,o.path,{recursive:!0,force:!0}),t++})),t};import{readFile as w}from"node:fs/promises";import{replaceInFile as V}from"replace-in-file";var E=e=>{let t=/`/g,a=e.replace(t,"\\`");return t=/\$/g,a.replace(t,"\\$")};var O=async e=>{let t=` codeExt="${e.code.filename.ext}"`,a=e.style.path?" style={style}":"",o=e.style.filename.ext?` styleExt="${e.style.filename.ext}"`:"",r=await w(e.code.path,"utf8"),i=E(r),m="";e.style.path&&(m=`const style = \`${await w(e.style.path,"utf8")}\`;`);let n=[{files:e.path,from:"@FILENAME",to:e.code.filename.base},{files:e.path,from:"@CODE",to:i},{files:e.path,from:"@STYLE",to:m},{files:e.path,from:/@COMPONENT_NAME/g,to:e.componentName},{files:e.path,from:"@PROP_STYLE",to:a},{files:e.path,from:"@PROP_CODE_EXT",to:t},{files:e.path,from:"@PROP_STYLE_EXT",to:o}];for(let p of n)await V(p)};var Z=async e=>{let t=0;return await Promise.all(e.map(async a=>{await O(a),t++})),t};var R=async({flags:{framework:e="react",prefix:t="_"}})=>{let a=performance.now();switch(e){case"react":break;case"vue":break;case"svelte":break;default:throw Error(`Framework ${e} not supported`)}s.info("Generating demos...");let{demoZapCodeFilePaths:o,demoZapStyleFilePaths:r}=F();s.info(`Found ${(o.length+r.length).toString()} DemoZap files (code: ${o.length.toString()}, style: ${r.length.toString()})`);let i=S({demoZapCodeFilePaths:o,demoZapStyleFilePaths:r,prefix:t});try{let n=await b(i);s.info(`Created ${n.toString()} DemoZap templates`)}catch(n){s.error(`Error occurred: ${n}`);return}try{let n=await Z(i);s.info(`Content replaced in ${n.toString()} DemoZap templates`)}catch(n){s.error(`Error occurred: ${n}`);return}let m=performance.now();s.success(`Completed (${g({startTime:a,endTime:m,shouldCalculateMs:!0})})`)};var W=async()=>{s.info(`##### \u26A1 DemoZap ${y} #####`);try{let{shouldExitCli:e,prefix:t,framework:a}=D();if(e)return;await R({flags:{prefix:t,framework:a}})}catch(e){s.error(e)}};W();