@selemondev/create-react-next
Version:
The Next Generation React Scaffolding Tool ✨
24 lines (16 loc) • 17.4 kB
JavaScript
var ge=Object.defineProperty;var fe=(r,t)=>{for(var s in t)ge(r,s,{get:t[s],enumerable:!0})};import{Command as ye}from"commander";var h={name:"@selemondev/create-react-next",version:"1.0.4",description:"The Next Generation React Scaffolding Tool \u2728",type:"module",main:"./dist/index.cjs",module:"./dist/index.js",types:"./dist/index.d.ts",scripts:{dev:"esno src/index.ts","build:package":"tsup-node src/index.ts --format cjs,esm --clean --dts --minify --shims","generate:release":"npx changelogen@latest --release","package:beta":"npm run build && npm publish --tag beta",package:"pnpm build:package && npm publish --access=public"},exports:{".":{types:"./dist/index.d.ts",require:"./dist/index.cjs",import:"./dist/index.js"}},bin:{"@selemondev/create-react-next":"./dist/index.js"},files:["dist","src","template"],keywords:["@selemondev/create-react-next","React 18 CLI","React CLI","Vite CLI","Vite","React-ts","React-js","TypeScript"],author:"Selemondev",license:"MIT",devDependencies:{"@types/ejs":"^3.1.5","@types/fs-extra":"^11.0.4","@types/node":"^20.11.30","@types/prompts":"^2.4.9","@types/validate-npm-package-name":"^4.0.2",conf:"^12.0.0",esno:"^4.0.0",tsup:"^8.0.2",typescript:"^5.3.3"},dependencies:{commander:"^12.0.0",ejs:"^3.1.9","fs-extra":"^11.2.0",ora:"^8.0.1",prettier:"^3.5.3",prompts:"^2.4.2","validate-npm-package-name":"^5.0.0"},pnpm:{overrides:{},onlyBuiltDependencies:["esbuild"]}};var xe=new ye(h.name),g=xe;import{execSync as Se}from"child_process";var S=process||{},L=S.argv||[],k=S.env||{},Be=!(k.NO_COLOR||L.includes("--no-color"))&&(!!k.FORCE_COLOR||L.includes("--color")||S.platform==="win32"||(S.stdout||{}).isTTY&&k.TERM!=="dumb"||!!k.CI);function be(r,t,s=r){return p=>{let a=`${p}`,m=a.indexOf(t,r.length);return~m?r+we(a,t,s,m)+t:r+a+t}}function we(r,t,s,p){let a="",m=0;do a+=r.substring(m,p)+s,m=p+t.length,p=r.indexOf(t,m);while(~p);return a+r.substring(m)}function he(r=Be){let t=r?be:()=>String;return{isColorSupported:r,reset:t("\x1B[0m","\x1B[0m"),bold:t("\x1B[1m","\x1B[22m","\x1B[22m\x1B[1m"),dim:t("\x1B[2m","\x1B[22m","\x1B[22m\x1B[2m"),italic:t("\x1B[3m","\x1B[23m"),underline:t("\x1B[4m","\x1B[24m"),inverse:t("\x1B[7m","\x1B[27m"),hidden:t("\x1B[8m","\x1B[28m"),strikethrough:t("\x1B[9m","\x1B[29m"),black:t("\x1B[30m","\x1B[39m"),red:t("\x1B[31m","\x1B[39m"),green:t("\x1B[32m","\x1B[39m"),yellow:t("\x1B[33m","\x1B[39m"),blue:t("\x1B[34m","\x1B[39m"),magenta:t("\x1B[35m","\x1B[39m"),cyan:t("\x1B[36m","\x1B[39m"),white:t("\x1B[37m","\x1B[39m"),gray:t("\x1B[90m","\x1B[39m"),orange:t("\x1B[38;5;208m","\x1B[39m"),bgBlack:t("\x1B[40m","\x1B[49m"),bgRed:t("\x1B[41m","\x1B[49m"),bgGreen:t("\x1B[42m","\x1B[49m"),bgYellow:t("\x1B[43m","\x1B[49m"),bgBlue:t("\x1B[44m","\x1B[49m"),bgMagenta:t("\x1B[45m","\x1B[49m"),bgCyan:t("\x1B[46m","\x1B[49m"),bgWhite:t("\x1B[47m","\x1B[49m"),blackBright:t("\x1B[90m","\x1B[39m"),redBright:t("\x1B[91m","\x1B[39m"),greenBright:t("\x1B[92m","\x1B[39m"),yellowBright:t("\x1B[93m","\x1B[39m"),blueBright:t("\x1B[94m","\x1B[39m"),magentaBright:t("\x1B[95m","\x1B[39m"),cyanBright:t("\x1B[96m","\x1B[39m"),whiteBright:t("\x1B[97m","\x1B[39m"),bgBlackBright:t("\x1B[100m","\x1B[49m"),bgRedBright:t("\x1B[101m","\x1B[49m"),bgGreenBright:t("\x1B[102m","\x1B[49m"),bgYellowBright:t("\x1B[103m","\x1B[49m"),bgBlueBright:t("\x1B[104m","\x1B[49m"),bgMagentaBright:t("\x1B[105m","\x1B[49m"),bgCyanBright:t("\x1B[106m","\x1B[49m"),bgWhiteBright:t("\x1B[107m","\x1B[49m")}}var ke=he(),f=ke;var c={info:(...r)=>{console.log(f.cyan(String(...r)))},error:(...r)=>{console.log(f.red(String(...r)))},warning:(...r)=>{console.log(f.yellow(String(...r)))},success:(...r)=>{console.log(f.green(String(...r)))}};var D=()=>{try{let r=process.env.npm_config_user_agent;return r&&r.startsWith("yarn")||Se("yarnpkg --version",{stdio:"ignore"}),!0}catch(r){return r instanceof Error&&c.error(r.message),!1}};import{execSync as Te}from"child_process";var M=()=>{try{let r=process.env.config_user_agent;return r&&r.startsWith("pnpm")||Te("pnpm --version",{stdio:"ignore"}),!0}catch(r){return r instanceof Error&&c.error(r.message),!1}};import{execSync as je}from"child_process";var F=()=>{try{let r=process.env.config_user_agent;return r&&r.startsWith("bun")||je("bun --version",{stdio:"ignore"}),!0}catch(r){return r instanceof Error&&c.error(r.message),!1}};var O=D(),Y=M(),A=F(),J={name:"package",type:"select",message:"Which package manager do you prefer to use?",choices:[{title:"I prefer manual installation",value:"none"},{title:A?"Bun":"Bun is not installed",value:"bun",disabled:!A},{title:Y?"Pnpm":"Pnpm is not installed",value:"pnpm",disabled:!Y},{title:O?"Yarn":"Yarn is not installed",value:"yarn",disabled:!O},{title:"Npm",value:"npm"}]};var Ce={},e=Ce;import Q from"fs-extra";import{resolve as Re}from"path";function _(r){let t=Re(process.cwd(),r);if(!Q.existsSync(t))return!0;let s=Q.readdirSync(t);return s.length===0||s.length===1&&s[0]===".git"}import $e from"validate-npm-package-name";function z(r){let t=$e(r);return t.validForNewPackages?{valid:!0}:{valid:!1,problems:[...t.errors||[],...t.warnings||[]]}}var Ie="create-react-next",Ve=[{name:"name",type:"text",message:"What should we call your project?",initial:Ie,validate:r=>{let t=z(r);return t.valid?(e.name=r,!0):"Invalid project name: "+t.problems[0]},active:"Yes",inactive:"No"},{name:"overwrite",type:()=>e.name&&_(e.name)?null:"confirm",message:()=>`Directory "${e.name}" is not empty. Do you want to overwrite it?`},{name:"overwrite",type:(r,t)=>{if(t.overwrite===!1)throw new Error("Operation cancelled");return null}}],W=Ve;var U={name:"deploy",type:"select",message:"Where should we deploy your project?",choices:[{title:"I prefer manual deployment",value:"none"},{title:"Vercel",value:"vercel"},{title:"Netlify",value:"netlify"}]};var Pe=[{name:"useRouter",type:()=>"toggle",message:"Add React Router DOM for Single Page Application development?",initial:!0,active:"Yes",inactive:"No"},{name:"useHooks",type:()=>"toggle",message:"Add useHooks for a collection of modern, server-safe React hooks?",initial:!1,active:"Yes",inactive:"No"},{name:"useVitest",type:()=>"toggle",message:"Add Vitest for unit testing?",initial:!0,active:"Yes",inactive:"No"}],G=Pe;var R={};fe(R,{constantDevDeps:()=>ze,constantProDeps:()=>We,eslintJs:()=>Me,eslintTs:()=>Fe,javascript:()=>b,jotai:()=>De,netlifyCLI:()=>_e,reactHooks:()=>Ye,redux:()=>Ee,router:()=>Ne,tailwind:()=>Oe,tanStackReactQuery:()=>Ae,typescript:()=>B,vercelCLI:()=>Qe,vitest:()=>Je,zustand:()=>Le});var Ne={name:"react-router-dom",version:"^6.22.3",stableVersion:"^6.22.3",env:"pro"},Ee={name:["react-redux","@reduxjs/toolkit"],version:["^9.1.0","^2.2.1"],stableVersion:["^9.1.0","^2.2.1"],env:"pro"},Le={name:"zustand",version:"^4.5.2",stableVersion:"^4.5.2",env:"pro"},De={name:["jotai","jotai-immer"],version:["^2.7.1","^0.3.0"],stableVersion:["^2.7.1","^0.3.0"],env:"pro"},Me={name:["eslint","eslint-plugin-react","eslint-plugin-react-hooks","eslint-plugin-react-refresh"],version:["^8.57.0","^7.34.0","^4.6.0","^0.4.5"],stableVersion:["^8.57.0","^7.34.0","^4.6.0","^0.4.5"],env:["dev","dev","dev","dev"]},Fe={name:["eslint","eslint-plugin-react-hooks","eslint-plugin-react-refresh","@typescript-eslint/eslint-plugin","@typescript-eslint/parser"],version:["^8.57.0","^4.6.0","^0.4.5","^7.1.1","^7.1.1"],stableVersion:["^8.57.0","^4.6.0","^0.4.5","^7.1.1","^7.1.1"],env:["dev","dev","dev","dev","dev"]},Oe={name:["tailwindcss","postcss","autoprefixer"],version:["^3.4.1","^8.4.35","^10.4.18"],stableVersion:["^3.4.1","^8.4.35","^10.4.18"],env:["dev","dev","dev"]},Ye={name:"@uidotdev/usehooks",version:"^2.4.1",stableVersion:"^2.4.1",env:"pro"},B={name:["typescript","@types/react","@types/react-dom","@types/node"],version:["^5.2.2","^18.2.64","^18.2.21","^20.11.28"],stableVersion:["^5.2.2","^18.2.64","^18.2.21","^20.11.28"],dev:["dev","dev","dev","dev"]},b={name:[],version:[],stableVersion:[],dev:[]},Ae={name:["@tanstack/react-query","@tanstack/react-query-devtools"],version:["^5.28.0","^5.28.0"],stableVersion:["^5.28.0","^5.28.0"],dev:["pro","pro"]},Je={name:["vitest","jsdom","@testing-library/react","@testing-library/jest-dom"],version:["^1.2.2","^24.0.0","^14.2.1","^6.4.2"],stableVersion:["^1.2.2","^24.0.0","^14.2.1","^6.4.2"],dev:["dev","dev","dev","dev"]},Qe={name:["vercel"],version:["^34.1.7"],stableVersion:["^34.1.7"],dev:["dev"]},_e={name:["netlify-cli"],version:["^17.30.0"],stableVersion:["^17.30.0"],dev:["dev"]},ze={name:e.useTypeScript?B.name:b.name,version:e.useTypeScript?B.version:b.version,stableVersion:e.useTypeScript?B.stableVersion:b.stableVersion,dev:e.useTypeScript?B.dev:b.dev},We={name:["react","react-dom"],version:["^18.2.0","^18.2.0"],stableVersion:["^18.2.0","^18.2.0"],dev:"pro"};var l=new Map,w=R;Object.keys(w).forEach(r=>{let t=w[r].name;if(Array.isArray(t)){let s="";t.forEach((p,a)=>{s+=`"${p}":"${w[r].version[a]}",`}),l.set(r,s)}else l.set(r,`"${w[r].name}":"${w[r].version}",`)});var H=new Map([["EslintScript",'"lint": "eslint . --ext ts,tsx,js,jsx --report-unused-disable-directives --max-warnings 0",'],["VitestScript",'"test:unit": "vitest",']]);import Ue from"prompts";async function u(r){let t=await Ue(r,{onCancel:()=>{throw new Error("\u274C Operation cancelled")}});return Object.assign(e,t),Promise.resolve(e)}async function Ge(){let r=l.get("eslintJs"),t=l.get("eslintTs"),s=l.get("vitest"),p=l.get("tanStackReactQuery"),a=l.get("router"),m=l.get("redux"),v=l.get("jotai"),y=l.get("zustand"),d=l.get("tailwind"),j=l.get("typescript"),C=l.get("javascript"),de=l.get("reactHooks");return q(e,l),q(e,H),e.constantDevDeps=l.get("constantDevDeps"),e.constantProDeps=l.get("constantProDeps"),e.Eslint=e.useTypeScript?t:r,e.Vitest=s,e.Router=a,e.Jotai=v,e.Zustand=y,e.TanStackReactQuery=p,e.Redux=m,e.UseHooks=de,e.Tailwind=d,e.TypeScript=j,e.JavaScript=C,e.useEslintTs=e.useTypeScript,e.useJavaScript=e.useTypeScript===!1,Promise.resolve(!0)}async function Z(){await u(G),await Ge()}function q(r,t){Array.from(t.keys()).forEach(s=>{r[s]=t.get(s)})}var He=[{name:"useGitInit",type:()=>"toggle",message:"Initialize a new git repository?",initial:!0,active:"Yes",inactive:"No"}],K=He;var qe=[{name:"useTailwind",type:()=>"toggle",message:"Add TailwindCSS for styling?",initial:!0,active:"Yes",inactive:"No"}],X=qe;var Ze=[{name:"useTypeScript",type:()=>"toggle",message:"Add TypeScript for type safety?",initial:!0,active:"Yes",inactive:"No"}],ee=Ze;var Ke=[{name:"useEslint",type:()=>"toggle",message:"Add ESLint for code quality?",initial:!0,active:"Yes",inactive:"No"}],te=Ke;var re={name:"stateManagement",type:"select",message:"Which state management solution do you prefer?",choices:[{title:"None",value:"none"},{title:"Redux",value:"redux"},{title:"Zustand",value:"zustand"},{title:"Jotai",value:"jotai"}]};var Xe=[{name:"useTanStackReactQuery",type:()=>"toggle",message:"Add TanStack React Query for server state management?",initial:!1,active:"Yes",inactive:"No"}],se=Xe;async function et(){try{e.name=g.args[0]??(await u(W)).name,e.useTypeScript||await u(ee),e.useTailwind||await u(X),await u(re),await Z(),await u(se),e.useEslint||await u(te),e.package||await u(J);let r=l.get("vercelCLI"),t=l.get("netlifyCLI"),s=await u(U);e.VercelCLI=s?.deploy==="vercel"&&r,e.NetlifyCLI=s?.deploy==="netlify"&&t,e.useVercelCLI=!!e.VercelCLI,e.useNetlifyCLI=!!e.NetlifyCLI,await u(K)}catch(r){r instanceof Error&&(c.error(r.message),process.exit(1))}return Promise.resolve()}var oe=et;async function tt(){console.clear(),c.info("Welcome To Create React Next. The Next Generation React Scaffolding Tool \u2728"),console.log()}var ne=tt;import{spawn as rt}from"child_process";var ie=(r,t="inherit")=>function(s,p){let a=rt(s,p,{cwd:r,stdio:t,shell:!0});return new Promise((m,v)=>{a.on("close",y=>{y===0?m(!0):v(!1)})}).catch(m=>m)};import st from"ora";async function ot(){let r=ie(e.dest,"ignore"),t=st("Copying template...").start(),s=new Date().getTime();e.useGitInit&&(await r("git",["init"]),await r("git",["add ."]),await r("git",['commit -m "Initialized by create-react-next"'])),e.package&&e.package!=="none"&&(t.text=f.cyan(`Installing dependencies with ${e.package}. Please wait...`),await r(e.package,["install"])),t.stop();let a=(new Date().getTime()-s)/1e3;console.log(),c.info(`\u{1F680} Completed in ${a}s`),console.log(),c.success("\u2705 Project created successfully"),console.log(),c.info(`cd ${e.name}`),console.log(),e.package!=="none"?(c.info(e.package==="npm"?`${e.package} run dev to start the dev server`:`${e.package} dev to start the dev server`),e.useEslint&&console.log(),e.useEslint&&c.info(`${e.package} run lint to format your code`),e.useVitest&&console.log(),e.useVitest&&c.info(`${e.package} run test:unit to run tests`)):(c.info("npm install - To install dependencies"),console.log(),e.useEslint&&c.info("npm run lint to format your code"),e.useEslint&&console.log(),c.info("npm run dev to start the dev server"),e.useVitest&&console.log(),e.useVitest&&c.info("npm run test:unit to run tests"))}var ae=ot;import me from"fs-extra";import x from"path";import nt from"ejs";import $ from"fs-extra";import{resolve as I,extname as ce,parse as it}from"path";import{format as T}from"prettier/standalone";import V from"prettier/parser-babel";import P from"prettier/plugins/estree";async function le(r,t){try{let s="",p=it(r),a=I(process.cwd(),t),m=I(a,p.dir,`${p.name}.ejs`),v=I(a,r),y=await $.readFile(m),d=nt.render(y.toString(),e),j=ce(r).replace(/[.]/g,"");try{switch(j){case"ts":case"tsx":case"jsx":case"js":s=await T(d,{parser:"babel",plugins:[V,P]});break;case"json":s=await T(d,{parser:"json",plugins:[V,P]});break;case"cjs":s=await T(d,{parser:"babel",plugins:[V,P]});break;case"toml":s=d;break;case"":s=d;break;default:s=await T(d,{parser:ce});break}}catch(C){console.log(C)}await $.outputFile(v,s),await $.remove(m)}catch(s){console.log(s)}}var N=new Map;N.set("react",at);function at(){return["package.json",e.useTypeScript?"src/main.tsx":"src/main.jsx",e.useTypeScript?"src/App.tsx":"src/App.jsx",e.useTypeScript?"src/components/TheWelcome.tsx":"src/components/TheWelcome.jsx"].filter(Boolean)}import i from"fs-extra";function pe(){async function r(){return e.useRouter||i.remove(`${e.dest}/src/pages`),e.useTailwind||(i.remove(`${e.dest}/tailwind.config.js`),i.remove(`${e.dest}/postcss.config.js`),i.remove(`${e.dest}/src/assets/css/tailwind.css`)),e.useTailwind&&i.remove(`${e.dest}/src/assets/css/base.css`),e.deploy==="none"&&(i.remove(`${e.dest}/netlify.toml`),i.remove(`${e.dest}/vercel.json`)),e.deploy==="netlify"&&i.remove(`${e.dest}/vercel.json`),e.deploy==="vercel"&&i.remove(`${e.dest}/netlify.toml`),e.useTailwind===!1&&i.remove(`${e.dest}/src/assets/css/tailwind.css`),e.useJavaScript&&i.remove(`${e.dest}/src/main.tsx`),e.useVitest||(i.remove(`${e.dest}/vitest.config.ts`),i.remove(`${e.dest}/vitest.config.js`),i.remove(`${e.dest}/tests`)),e.stateManagement==="none"&&(i.remove(`${e.dest}/src/store`),i.remove(`${e.dest}/src/app`),i.remove(`${e.dest}/src/features`)),e.stateManagement==="jotai"&&(i.remove(`${e.dest}/src/app`),i.remove(`${e.dest}/src/store`),i.remove(`${e.dest}/src/features`)),e.stateManagement==="zustand"&&(i.remove(`${e.dest}/src/app`),i.remove(`${e.dest}/src/store/appStore.ts`),i.remove(`${e.dest}/src/store/appStore.js`),i.remove(`${e.dest}/src/features`)),e.stateManagement==="redux"&&(i.remove(`${e.dest}/src/store/store.ts`),i.remove(`${e.dest}/src/store/store.js`)),e.useEslint||i.remove(`${e.dest}/.eslintrc.cjs`),!0}return new Map([["react",r]]).get("react")}import{fileURLToPath as ct}from"url";import{dirname as lt}from"path";import pt from"ora";async function mt(){let r=ct(import.meta.url),t=lt(r),s=pt("Copying template...").start(),p=e.useTypeScript?"react-ts":"react-js";e.src=x.resolve(t,`../template/${p}`);let a=e.name&&x.resolve(process.cwd(),e.name);e.dest=a;let m=x.resolve(t,`../../../../template/${p}`);e.templatePath=m;let v=pe();async function y(){let d=x.resolve(t,"../");a&&await me.copy(`${d}/template/${p}`,a)}await y(),v&&await v(),e.dest&&await me.move(x.resolve(e.dest,".gitignore.ejs"),x.resolve(e.dest,".gitignore"),{overwrite:!0}),await Promise.all(N.get("react")().map(d=>e.name&&le(d,e.name))),s.text=f.green("Template successfully copied!"),s.succeed()}var ue=mt;async function ut(){await ne(),await oe(),await ue(),await ae()}async function E(){await ut()}async function dt(){g.version(h.version).description("Create React Next. The Next Generation React Scaffolding Tool \u26A1").action(r=>{e.name=r}).option("--ts, --typescript",`
Initialize as a TypeScript project.
`).option("--tailwind",`
Initialize with Tailwind CSS.
`).option("--eslint",`
Initialize with eslint config.
`).option("--use-npm",`
Explicitly tell the CLI to bootstrap the application using npm
`).option("--use-pnpm",`
Explicitly tell the CLI to bootstrap the application using pnpm
`).option("--use-yarn",`
Explicitly tell the CLI to bootstrap the application using Yarn
`).option("--use-bun",`
Explicitly tell the CLI to bootstrap the application using Bun
`).allowUnknownOption().parse(process.argv),e.useTypeScript=g.opts().typescript,e.useTailwind=g.opts().tailwind,e.useEslint=g.opts().eslint,e.package=g.opts().useNpm?"npm":g.opts().usePnpm?"pnpm":g.opts().useYarn?"yarn":g.opts().useBun?"bun":e.package,await E()}dt();