create-flowbite-react
Version:
Quickly scaffold Flowbite React application
13 lines (10 loc) • 9.4 kB
JavaScript
import*as j from"@clack/prompts";import{$ as k}from"execa";import D from"picocolors";async function x({projectName:t,template:r}){let e=j.spinner();r.url||(e.stop("Invalid template configuration: missing URL"),process.exit(0));try{e.start("Creating the project..."),await k`git clone --depth 1 ${r.url} ${t}`,await k`rm -rf ${t}/.git`,e.stop(D.green("Project created successfully!"))}catch(i){e.stop(i),process.exit(0)}}import*as l from"@clack/prompts";import{$ as O}from"execa";async function S(t){let r;if(t.git)r=t.git,l.log.success("With git initialize");else{let e=await l.confirm({message:"Initialize a new git repository?",initialValue:!0});r=!!e,l.isCancel(e)&&(l.cancel("Operation cancelled."),process.exit(0))}return r}async function T({projectName:t}){O`git init ${t}`}import p from"picocolors";var c={name:"create-flowbite-react",version:"1.1.1",description:"Quickly scaffold Flowbite React application",keywords:["create-flowbite-react","flowbite-react-templates","flowbite-react-template","flowbite-react","flowbite","react","tailwind","template"],homepage:"https://flowbite-react.com",bugs:"https://github.com/themesberg/flowbite-react/issues",repository:{type:"git",url:"git+https://github.com/themesberg/flowbite-react.git",directory:"packages/cli"},license:"MIT",author:{name:"Sutu Sebastian",email:"sebastian.sutu@stainless-code.com",url:"https://github.com/SutuSebastian"},type:"module",bin:{"create-flowbite-react":"./dist/index.js"},files:["dist"],scripts:{build:"tsup",clean:"git clean -xdf",dev:"tsup --watch",format:"prettier . --write","format:check":"prettier . --check",prepack:"clean-package",prepublishOnly:"bun run build",start:"bun run dist/index.js",typecheck:"tsc --noEmit"},dependencies:{"@clack/prompts":"0.8.2",arg:"5.0.2",execa:"9.5.2",ora:"8.1.1",picocolors:"1.1.1"},devDependencies:{tsup:"8.3.5",typescript:"5.6.3"},engines:{node:">=18.0.0"},"clean-package":{remove:["devDependencies","clean-package"],replace:{scripts:{postpublish:"clean-package restore"}}}};var g="flowbite-react-app",m=[{key:"adonisjs",name:"AdonisJS",url:"https://github.com/themesberg/flowbite-react-template-adonisjs.git"},{key:"astro",name:"Astro",url:"https://github.com/themesberg/flowbite-react-template-astro.git"},{key:"blitzjs",name:"Blitz.js",url:"https://github.com/themesberg/flowbite-react-template-blitzjs.git"},{key:"bun",name:"Bun",url:"https://github.com/themesberg/flowbite-react-template-bun.git"},{key:"esbuild",name:"ESBuild",url:"https://github.com/themesberg/flowbite-react-template-esbuild.git"},{key:"farm",name:"Farm",url:"https://github.com/themesberg/flowbite-react-template-farm.git"},{key:"gatsby",name:"Gatsby",url:"https://github.com/themesberg/flowbite-react-template-gatsby.git"},{key:"laravel",name:"Laravel",url:"https://github.com/themesberg/flowbite-react-template-laravel.git"},{key:"meteorjs",name:"Meteor.js",url:"https://github.com/themesberg/flowbite-react-template-meteorjs.git"},{key:"modernjs",name:"Modern.js",url:"https://github.com/themesberg/flowbite-react-template-modernjs.git"},{key:"nextjs",name:"Next.js",url:"https://github.com/themesberg/flowbite-react-template-nextjs.git"},{key:"parcel",name:"Parcel",description:"Client Mode, Server Mode",versions:[{key:"client",name:"Client Mode",description:"Client-side only React app",url:"https://github.com/themesberg/flowbite-react-template-parcel-client.git"},{key:"server",name:"Server Mode",description:"React Server Components setup",url:"https://github.com/themesberg/flowbite-react-template-parcel-server.git"},{key:"server-bun",name:"Server Mode (Bun)",description:"React Server Components setup with Bun",url:"https://github.com/themesberg/flowbite-react-template-parcel-server-bun.git"},{key:"server-deno",name:"Server Mode (Deno)",description:"React Server Components setup with Deno",url:"https://github.com/themesberg/flowbite-react-template-parcel-server-deno.git"}]},{key:"react-router",name:"React Router",description:"Framework Mode, Data Mode, Declarative Mode",versions:[{key:"framework",name:"Framework Mode",description:"Full-featured with SSR, code-splitting, and type safety",url:"https://github.com/themesberg/flowbite-react-template-react-router-framework.git"},{key:"data",name:"Data Mode",description:"Data loading and actions with pending states",url:"https://github.com/themesberg/flowbite-react-template-react-router-data.git"},{key:"declarative",name:"Declarative Mode",description:"Basic routing with BrowserRouter",url:"https://github.com/themesberg/flowbite-react-template-react-router-declarative.git"}]},{key:"react-server",name:"React Server",url:"https://github.com/themesberg/flowbite-react-template-react-server.git"},{key:"redwoodjs",name:"RedwoodJS",url:"https://github.com/themesberg/flowbite-react-template-redwoodjs.git"},{key:"remix",name:"Remix",url:"https://github.com/themesberg/flowbite-react-template-remix.git"},{key:"rsbuild",name:"Rsbuild",url:"https://github.com/themesberg/flowbite-react-template-rsbuild.git"},{key:"rspack",name:"Rspack",url:"https://github.com/themesberg/flowbite-react-template-rspack.git"},{key:"tanstack-router",name:"TanStack Router",url:"https://github.com/themesberg/flowbite-react-template-tanstack-router.git"},{key:"tanstack-start",name:"TanStack Start",url:"https://github.com/themesberg/flowbite-react-template-tanstack-start.git"},{key:"vike",name:"Vike",url:"https://github.com/themesberg/flowbite-react-template-vike.git"},{key:"vite",name:"Vite",url:"https://github.com/themesberg/flowbite-react-template-vite.git"},{key:"waku",name:"Waku",url:"https://github.com/themesberg/flowbite-react-template-waku.git"},{key:"webpack",name:"Webpack",url:"https://github.com/themesberg/flowbite-react-template-webpack.git"}];function C(){let t=p.bold(`Usage:
`),r=["--template, -t <name>","--git","--version, -v","--help, -h"];t+=` ${p.blue(c.name)} ${p.yellow("<project-directory> [options]")}`,t+=`
`,t+=p.bold("Options:"),t+=`
`,t+=p.yellow(r.join(`
`)),t+=`
`,t+=p.bold("Templates:"),t+=`
`,t+=m.map(e=>p.yellow(` ${e.key}`)+p.gray(` - ${e.name} (${e.url})`)).join(`
`),console.log(t)}import*as b from"@clack/prompts";import y from"picocolors";function P(){b.intro(y.cyan(c.name)),b.note(`Scaffold a new React project using ${y.bold(y.cyan("Flowbite React"))}`)}import*as d from"@clack/prompts";function R({projectName:t}){let r=[`cd ${t}`,"npm i","npm run dev"].join(`
`);d.note(r,"Next steps:"),d.outro("Enjoy!")}import*as s from"@clack/prompts";import A from"fs";function v(t){if(t.length&&!t.trim().length)return"Value is required!";let r=A.readdirSync("./"),e=t||g;if(r.includes(e))return"Folder already exists"}async function $(t){let r="";if(t.projectName!==void 0){let e=v(t.projectName);e&&(s.log.error(e),process.exit(0)),r=t.projectName,s.log.success(`Using project name: ${t.projectName}`)}else{let e=await s.text({message:"What is your project named?",placeholder:g,defaultValue:g,validate:i=>v(i)});r=String(e),s.isCancel(e)&&(s.cancel("Operation cancelled."),process.exit(0))}return r}import*as a from"@clack/prompts";async function M(t){let r=[];if(t.template){let e=J(t.template);if(e.invalidPart){let{value:i,available:n}=e.invalidPart;e.names.length?(a.log.info(`Using template: ${e.names.join(" \xBB ")}`),a.log.error(`Invalid version "${i}" for ${e.names[e.names.length-1]}. Available: ${n.join(", ")}`)):a.log.error(`Invalid template "${i}". Available: ${n.join(", ")}`),process.exit(0)}return r=e.names,a.log.info(`Using template: ${r.join(" -> ")}`),e.template?.url?e.template:await N(e.template)}return await N()}function J(t){let r=t.split("."),e,i=[],n=m.find(o=>o.key===r[0]);if(!n||!r[0])return{template:void 0,names:i,invalidPart:{value:r[0]||"",available:m.map(o=>o.key)}};e=n,i.push(e.name);for(let o=1;o<r.length&&e;o++){let u=e.versions||[],f=r[o];if(!f)continue;if(!u.length)return{template:void 0,names:i,invalidPart:{value:f,available:[]}};let h=u.find(w=>w.key===f);if(!h)return{template:void 0,names:i,invalidPart:{value:f,available:u.map(w=>w.key)}};e=h,i.push(h.name)}return{template:e,names:i}}async function N(t){let r=t;for(;;){if(r?.url)return r;let e=r?.versions||m;if(r){r=await U(r);continue}let i=await a.select({message:"What template would you like to use?",options:e.map(o=>({value:o.key,label:o.name,hint:o.description}))});a.isCancel(i)&&(a.cancel("Operation cancelled."),process.exit(0));let n=e.find(o=>o.key===i);n||(a.log.error("Selection not found"),process.exit(0)),r=n}}async function U(t){let r=await a.select({message:`Select version for ${t.name}:`,options:t.versions.map(i=>({value:i.key,label:i.name,hint:i.description}))});a.isCancel(r)&&(a.cancel("Operation cancelled."),process.exit(0));let e=t.versions.find(i=>i.key===r);return e||(a.log.error("Selection not found"),process.exit(0)),e}function E(){console.log(c.version)}import V from"arg";function B(t){let r=V({"--template":String,"--git":Boolean,"--version":Boolean,"--help":Boolean,"-t":"--template","-v":"--version","-h":"--help"},{argv:t,permissive:!0}),e=r._[0],{"--template":i,"--git":n,"--version":o,"--help":u}=r;return{projectName:e,template:i,git:n,version:o,help:u}}async function _(t){let r=B(t);if(r.help)return C();if(r.version)return E();P();let e=await $(r),i=await M(r),n=await S(r);await x({projectName:e,template:i}),n&&await T({projectName:e}),R({projectName:e})}var z=process.argv.slice(2).filter(t=>t!=="--");_(z).catch(console.error);