UNPKG

@selemondev/create-react-next

Version:

The Next Generation React Scaffolding Tool ✨

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