UNPKG

@selemondev/create-react-next

Version:

The Next Generation React Scaffolding Tool ✨

24 lines (16 loc) 18.5 kB
#!/usr/bin/env node "use strict";var Ce=Object.create;var P=Object.defineProperty;var Re=Object.getOwnPropertyDescriptor;var $e=Object.getOwnPropertyNames;var Ie=Object.getPrototypeOf,Ve=Object.prototype.hasOwnProperty;var Pe=(r,t)=>{for(var s in t)P(r,s,{get:t[s],enumerable:!0})},Ne=(r,t,s,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of $e(t))!Ve.call(r,i)&&i!==s&&P(r,i,{get:()=>t[i],enumerable:!(a=Re(t,i))||a.enumerable});return r};var d=(r,t,s)=>(s=r!=null?Ce(Ie(r)):{},Ne(t||!r||!r.__esModule?P(s,"default",{value:r,enumerable:!0}):s,r));var Ee=()=>typeof document>"u"?new URL(`file:${__filename}`).href:document.currentScript&&document.currentScript.src||new URL("main.js",document.baseURI).href,o=Ee();var F=require("commander");var S={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 De=new F.Command(S.name),g=De;var Y=require("child_process");var j=process||{},O=j.argv||[],T=j.env||{},Me=!(T.NO_COLOR||O.includes("--no-color"))&&(!!T.FORCE_COLOR||O.includes("--color")||j.platform==="win32"||(j.stdout||{}).isTTY&&T.TERM!=="dumb"||!!T.CI);function Fe(r,t,s=r){return a=>{let i=`${a}`,p=i.indexOf(t,r.length);return~p?r+Oe(i,t,s,p)+t:r+i+t}}function Oe(r,t,s,a){let i="",p=0;do i+=r.substring(p,a)+s,p=a+t.length,a=r.indexOf(t,p);while(~a);return i+r.substring(p)}function Ye(r=Me){let t=r?Fe:()=>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 Ae=Ye(),f=Ae;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 A=()=>{try{let r=process.env.npm_config_user_agent;return r&&r.startsWith("yarn")||(0,Y.execSync)("yarnpkg --version",{stdio:"ignore"}),!0}catch(r){return r instanceof Error&&c.error(r.message),!1}};var J=require("child_process");var Q=()=>{try{let r=process.env.config_user_agent;return r&&r.startsWith("pnpm")||(0,J.execSync)("pnpm --version",{stdio:"ignore"}),!0}catch(r){return r instanceof Error&&c.error(r.message),!1}};var _=require("child_process");var U=()=>{try{let r=process.env.config_user_agent;return r&&r.startsWith("bun")||(0,_.execSync)("bun --version",{stdio:"ignore"}),!0}catch(r){return r instanceof Error&&c.error(r.message),!1}};var z=A(),W=Q(),G=U(),H={name:"package",type:"select",message:"Which package manager do you prefer to use?",choices:[{title:"I prefer manual installation",value:"none"},{title:G?"Bun":"Bun is not installed",value:"bun",disabled:!G},{title:W?"Pnpm":"Pnpm is not installed",value:"pnpm",disabled:!W},{title:z?"Yarn":"Yarn is not installed",value:"yarn",disabled:!z},{title:"Npm",value:"npm"}]};var Je={},e=Je;var N=d(require("fs-extra"),1),q=require("path");function Z(r){let t=(0,q.resolve)(process.cwd(),r);if(!N.default.existsSync(t))return!0;let s=N.default.readdirSync(t);return s.length===0||s.length===1&&s[0]===".git"}var K=d(require("validate-npm-package-name"),1);function X(r){let t=(0,K.default)(r);return t.validForNewPackages?{valid:!0}:{valid:!1,problems:[...t.errors||[],...t.warnings||[]]}}var Qe="create-react-next",_e=[{name:"name",type:"text",message:"What should we call your project?",initial:Qe,validate:r=>{let t=X(r);return t.valid?(e.name=r,!0):"Invalid project name: "+t.problems[0]},active:"Yes",inactive:"No"},{name:"overwrite",type:()=>e.name&&Z(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}}],ee=_e;var te={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 Ue=[{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"}],re=Ue;var E={};Pe(E,{constantDevDeps:()=>ot,constantProDeps:()=>nt,eslintJs:()=>qe,eslintTs:()=>Ze,javascript:()=>w,jotai:()=>He,netlifyCLI:()=>st,reactHooks:()=>Xe,redux:()=>We,router:()=>ze,tailwind:()=>Ke,tanStackReactQuery:()=>et,typescript:()=>b,vercelCLI:()=>rt,vitest:()=>tt,zustand:()=>Ge});var ze={name:"react-router-dom",version:"^6.22.3",stableVersion:"^6.22.3",env:"pro"},We={name:["react-redux","@reduxjs/toolkit"],version:["^9.1.0","^2.2.1"],stableVersion:["^9.1.0","^2.2.1"],env:"pro"},Ge={name:"zustand",version:"^4.5.2",stableVersion:"^4.5.2",env:"pro"},He={name:["jotai","jotai-immer"],version:["^2.7.1","^0.3.0"],stableVersion:["^2.7.1","^0.3.0"],env:"pro"},qe={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"]},Ze={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"]},Ke={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"]},Xe={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"]},w={name:[],version:[],stableVersion:[],dev:[]},et={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"]},tt={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"]},rt={name:["vercel"],version:["^34.1.7"],stableVersion:["^34.1.7"],dev:["dev"]},st={name:["netlify-cli"],version:["^17.30.0"],stableVersion:["^17.30.0"],dev:["dev"]},ot={name:e.useTypeScript?b.name:w.name,version:e.useTypeScript?b.version:w.version,stableVersion:e.useTypeScript?b.stableVersion:w.stableVersion,dev:e.useTypeScript?b.dev:w.dev},nt={name:["react","react-dom"],version:["^18.2.0","^18.2.0"],stableVersion:["^18.2.0","^18.2.0"],dev:"pro"};var l=new Map,h=E;Object.keys(h).forEach(r=>{let t=h[r].name;if(Array.isArray(t)){let s="";t.forEach((a,i)=>{s+=`"${a}":"${h[r].version[i]}",`}),l.set(r,s)}else l.set(r,`"${h[r].name}":"${h[r].version}",`)});var se=new Map([["EslintScript",'"lint": "eslint . --ext ts,tsx,js,jsx --report-unused-disable-directives --max-warnings 0",'],["VitestScript",'"test:unit": "vitest",']]);var oe=d(require("prompts"),1);async function m(r){let t=await(0,oe.default)(r,{onCancel:()=>{throw new Error("\u274C Operation cancelled")}});return Object.assign(e,t),Promise.resolve(e)}async function it(){let r=l.get("eslintJs"),t=l.get("eslintTs"),s=l.get("vitest"),a=l.get("tanStackReactQuery"),i=l.get("router"),p=l.get("redux"),y=l.get("jotai"),x=l.get("zustand"),u=l.get("tailwind"),I=l.get("typescript"),V=l.get("javascript"),je=l.get("reactHooks");return ne(e,l),ne(e,se),e.constantDevDeps=l.get("constantDevDeps"),e.constantProDeps=l.get("constantProDeps"),e.Eslint=e.useTypeScript?t:r,e.Vitest=s,e.Router=i,e.Jotai=y,e.Zustand=x,e.TanStackReactQuery=a,e.Redux=p,e.UseHooks=je,e.Tailwind=u,e.TypeScript=I,e.JavaScript=V,e.useEslintTs=e.useTypeScript,e.useJavaScript=e.useTypeScript===!1,Promise.resolve(!0)}async function ie(){await m(re),await it()}function ne(r,t){Array.from(t.keys()).forEach(s=>{r[s]=t.get(s)})}var at=[{name:"useGitInit",type:()=>"toggle",message:"Initialize a new git repository?",initial:!0,active:"Yes",inactive:"No"}],ae=at;var ct=[{name:"useTailwind",type:()=>"toggle",message:"Add TailwindCSS for styling?",initial:!0,active:"Yes",inactive:"No"}],ce=ct;var lt=[{name:"useTypeScript",type:()=>"toggle",message:"Add TypeScript for type safety?",initial:!0,active:"Yes",inactive:"No"}],le=lt;var pt=[{name:"useEslint",type:()=>"toggle",message:"Add ESLint for code quality?",initial:!0,active:"Yes",inactive:"No"}],pe=pt;var me={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 mt=[{name:"useTanStackReactQuery",type:()=>"toggle",message:"Add TanStack React Query for server state management?",initial:!1,active:"Yes",inactive:"No"}],ue=mt;async function ut(){try{e.name=g.args[0]??(await m(ee)).name,e.useTypeScript||await m(le),e.useTailwind||await m(ce),await m(me),await ie(),await m(ue),e.useEslint||await m(pe),e.package||await m(H);let r=l.get("vercelCLI"),t=l.get("netlifyCLI"),s=await m(te);e.VercelCLI=s?.deploy==="vercel"&&r,e.NetlifyCLI=s?.deploy==="netlify"&&t,e.useVercelCLI=!!e.VercelCLI,e.useNetlifyCLI=!!e.NetlifyCLI,await m(ae)}catch(r){r instanceof Error&&(c.error(r.message),process.exit(1))}return Promise.resolve()}var de=ut;async function dt(){console.clear(),c.info("Welcome To Create React Next. The Next Generation React Scaffolding Tool \u2728"),console.log()}var ge=dt;var fe=require("child_process"),ve=(r,t="inherit")=>function(s,a){let i=(0,fe.spawn)(s,a,{cwd:r,stdio:t,shell:!0});return new Promise((p,y)=>{i.on("close",x=>{x===0?p(!0):y(!1)})}).catch(p=>p)};var ye=d(require("ora"),1);async function gt(){let r=ve(e.dest,"ignore"),t=(0,ye.default)("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 i=(new Date().getTime()-s)/1e3;console.log(),c.info(`\u{1F680} Completed in ${i}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 xe=gt;var D=d(require("fs-extra"),1),B=d(require("path"),1);var Be=d(require("ejs"),1),C=d(require("fs-extra"),1),v=require("path"),k=require("prettier/standalone"),R=d(require("prettier/parser-babel"),1),$=d(require("prettier/plugins/estree"),1);async function be(r,t){try{let s="",a=(0,v.parse)(r),i=(0,v.resolve)(process.cwd(),t),p=(0,v.resolve)(i,a.dir,`${a.name}.ejs`),y=(0,v.resolve)(i,r),x=await C.default.readFile(p),u=Be.default.render(x.toString(),e),I=(0,v.extname)(r).replace(/[.]/g,"");try{switch(I){case"ts":case"tsx":case"jsx":case"js":s=await(0,k.format)(u,{parser:"babel",plugins:[R.default,$.default]});break;case"json":s=await(0,k.format)(u,{parser:"json",plugins:[R.default,$.default]});break;case"cjs":s=await(0,k.format)(u,{parser:"babel",plugins:[R.default,$.default]});break;case"toml":s=u;break;case"":s=u;break;default:s=await(0,k.format)(u,{parser:v.extname});break}}catch(V){console.log(V)}await C.default.outputFile(y,s),await C.default.remove(p)}catch(s){console.log(s)}}var L=new Map;L.set("react",ft);function ft(){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)}var n=d(require("fs-extra"),1);function we(){async function r(){return e.useRouter||n.default.remove(`${e.dest}/src/pages`),e.useTailwind||(n.default.remove(`${e.dest}/tailwind.config.js`),n.default.remove(`${e.dest}/postcss.config.js`),n.default.remove(`${e.dest}/src/assets/css/tailwind.css`)),e.useTailwind&&n.default.remove(`${e.dest}/src/assets/css/base.css`),e.deploy==="none"&&(n.default.remove(`${e.dest}/netlify.toml`),n.default.remove(`${e.dest}/vercel.json`)),e.deploy==="netlify"&&n.default.remove(`${e.dest}/vercel.json`),e.deploy==="vercel"&&n.default.remove(`${e.dest}/netlify.toml`),e.useTailwind===!1&&n.default.remove(`${e.dest}/src/assets/css/tailwind.css`),e.useJavaScript&&n.default.remove(`${e.dest}/src/main.tsx`),e.useVitest||(n.default.remove(`${e.dest}/vitest.config.ts`),n.default.remove(`${e.dest}/vitest.config.js`),n.default.remove(`${e.dest}/tests`)),e.stateManagement==="none"&&(n.default.remove(`${e.dest}/src/store`),n.default.remove(`${e.dest}/src/app`),n.default.remove(`${e.dest}/src/features`)),e.stateManagement==="jotai"&&(n.default.remove(`${e.dest}/src/app`),n.default.remove(`${e.dest}/src/store`),n.default.remove(`${e.dest}/src/features`)),e.stateManagement==="zustand"&&(n.default.remove(`${e.dest}/src/app`),n.default.remove(`${e.dest}/src/store/appStore.ts`),n.default.remove(`${e.dest}/src/store/appStore.js`),n.default.remove(`${e.dest}/src/features`)),e.stateManagement==="redux"&&(n.default.remove(`${e.dest}/src/store/store.ts`),n.default.remove(`${e.dest}/src/store/store.js`)),e.useEslint||n.default.remove(`${e.dest}/.eslintrc.cjs`),!0}return new Map([["react",r]]).get("react")}var he=require("url"),ke=require("path"),Se=d(require("ora"),1);async function vt(){let r=(0,he.fileURLToPath)(o),t=(0,ke.dirname)(r),s=(0,Se.default)("Copying template...").start(),a=e.useTypeScript?"react-ts":"react-js";e.src=B.default.resolve(t,`../template/${a}`);let i=e.name&&B.default.resolve(process.cwd(),e.name);e.dest=i;let p=B.default.resolve(t,`../../../../template/${a}`);e.templatePath=p;let y=we();async function x(){let u=B.default.resolve(t,"../");i&&await D.default.copy(`${u}/template/${a}`,i)}await x(),y&&await y(),e.dest&&await D.default.move(B.default.resolve(e.dest,".gitignore.ejs"),B.default.resolve(e.dest,".gitignore"),{overwrite:!0}),await Promise.all(L.get("react")().map(u=>e.name&&be(u,e.name))),s.text=f.green("Template successfully copied!"),s.succeed()}var Te=vt;async function yt(){await ge(),await de(),await Te(),await xe()}async function M(){await yt()}async function xt(){g.version(S.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 M()}xt();