next-ts-cli 1.0.5 → 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -74,11 +74,15 @@ npx next-ts-cli my-app --cli --supabase --drizzle --shadcnui --stripe
|
|
|
74
74
|
|
|
75
75
|
🎨 **Shadcn/ui** - With neutral configuration to start building compound components
|
|
76
76
|
|
|
77
|
-
**AI Integration** - Vercel AI Gateway for building
|
|
77
|
+
💡 **AI Integration** - Vercel AI Gateway for building AI apps
|
|
78
78
|
|
|
79
79
|
|
|
80
80
|
_*These integrations are all optional, so not required to scaffold the core project_
|
|
81
81
|
|
|
82
|
+
Beside these, there is also another automatic feature:
|
|
83
|
+
|
|
84
|
+
📁 **MCP Configurations** - Dynamically MCP Servers for Cursor and VSCode loaded bases on selected integrations
|
|
85
|
+
|
|
82
86
|
|
|
83
87
|
## Core Stack
|
|
84
88
|
The core project structure contains the following features:
|
package/dist/index.js
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import
|
|
2
|
+
import Ne from"path";import{execa as Pt}from"execa";import Oe from"fs-extra";import*as m from"@clack/prompts";import{Command as Ke}from"commander";import F from"path";import{fileURLToPath as De}from"url";var Ge=De(import.meta.url),Le=F.dirname(Ge),p=F.join(Le,"../"),H=`
|
|
3
3
|
__ __ __ __
|
|
4
4
|
.-----.-----.--.--| |_ ______| |_.-----.______.----| |__|
|
|
5
5
|
| | -__|_ _| _|______| _|__ --|______| __| | |
|
|
6
6
|
|__|__|_____|__.__|____| |____|_____| |____|__|__|
|
|
7
|
-
`,
|
|
7
|
+
`,z="next-ts-cli",D="next-ts-cli";import Je from"path";import Ve from"fs-extra";var _=()=>{let e=Je.join(p,"package.json");return Ve.readJSONSync(e).version??"1.0.0"};var E=class extends Error{constructor(t){super(t)}};import R from"chalk";var a={error(...e){console.log(R.red(...e))},warn(...e){console.log(R.yellow(...e))},info(...e){console.log(R.cyan(...e))},success(...e){console.log(R.green(...e))}};var U=e=>(e.length>1&&e.endsWith("/")&&(e=e.slice(0,-1)),e);var $e=/^(?:@[a-z0-9-*~][a-z0-9-*._~]*\/)?[a-z0-9-~][a-z0-9-._~]*$/,Y=e=>{if(!e)return;let t=U(e),s=t.split("/"),n=s.findIndex(r=>r.startsWith("@")),o=s[s.length-1];if(s.findIndex(r=>r.startsWith("@"))!==-1&&(o=s.slice(n).join("/")),!(t==="."||$e.test(o??"")))return"App name must consist of only lowercase alphanumeric characters, '-', and '_'"};var X=e=>{if(e.startsWith(".")||e.startsWith("/"))return"Import alias can't start with '.' or '/'"};var C={appName:z,packages:[],flags:{default:!1,cli:!1,drizzle:!1,supabase:!1,betterauth:!1,alias:"@/",docker:!1,stripe:!1,shadcnui:!1,clerk:!1,neon:!1,vercelAi:!1}},q=async()=>{let e=C,t=new Ke().name(D).description("A CLI for creating production-ready web applications with the Next.js").argument("[dir]","The name of the application, as well as the name of the directory to create").option("--cli","Run in CLI mode (non-interactive)",!1).option("-d, --default","Scaffold the project without any additional integrations",!1).option("-a, --alias [alias]","Explicitly tell the CLI to use a custom import alias",C.flags.alias).option("--drizzle [boolean]","Experimental: Boolean value if we should install Drizzle. Must be used in conjunction with `--cli`.",n=>!!n&&n!=="false").option("--docker [boolean]","Experimental: Boolean value if we should install Docker. Must be used in conjunction with `--cli`.",n=>!!n&&n!=="false").option("--stripe [boolean]","Experimental: Boolean value if we should install Stripe. Must be used in conjunction with `--cli`.",n=>!!n&&n!=="false").option("--shadcnui [boolean]","Experimental: Boolean value if we should install Shadcn UI. Must be used in conjunction with `--cli`.",n=>!!n&&n!=="false").option("--betterauth [boolean]","Experimental: Boolean value if we should install BetterAuth. Must be used in conjunction with `--cli`. Not valid with --clerk",n=>!!n&&n!=="false").option("--clerk [boolean]","Experimental: Boolean value if we should install Clerk.js . Must be used in conjunction with `--cli`. Not valid with --betterAuth",n=>!!n&&n!=="false").option("--supabase [boolean]","Experimental: Boolean value if we should install Supabase. Must be used in conjunction with `--cli`. Not valid with --betterAuth or --clerk",n=>!!n&&n!=="false").option("--neon [boolean]","Experimental: Boolean value if we should install Neon. Must be used in conjunction with `--cli`.",n=>!!n&&n!=="false").option("--vercelAi [boolean]","Experimental: Boolean value if we should install Vercel AI Gateway. Must be used in conjunction with `--cli`.",n=>!!n&&n!=="false").version(_(),"-v, --version","Display the version number").parse(process.argv);process.env.npm_config_user_agent?.startsWith("yarn/3")&&a.warn(` WARNING: It looks like you are using Yarn 3. This is currently not supported,
|
|
8
8
|
and likely to result in a crash. Please run next-ts-cli with another
|
|
9
|
-
package manager such as pnpm, npm, or Yarn Classic.`);let
|
|
10
|
-
using Git Bash. If that's that case, please use Git Bash from another terminal, such as Windows Terminal.`),new
|
|
11
|
-
${
|
|
12
|
-
Using: ${
|
|
13
|
-
`);let
|
|
14
|
-
`).start();if(
|
|
15
|
-
`);else{
|
|
16
|
-
`),
|
|
17
|
-
`)};import
|
|
9
|
+
package manager such as pnpm, npm, or Yarn Classic.`);let s=t.args[0];if(s&&(e.appName=s),e.flags=t.opts(),e.flags.cli)return e.packages=[],e.flags.docker&&e.packages.push("docker"),e.flags.drizzle&&e.packages.push("drizzle"),e.flags.supabase&&e.packages.push("supabase"),e.flags.betterauth&&e.packages.push("betterAuth"),e.flags.clerk&&e.packages.push("clerk"),e.flags.vercelAi&&e.packages.push("vercelAi"),e.flags.supabase&&e.flags.betterauth&&(a.warn("Incompatible combination Supabase and BetterAuth. Exiting."),process.exit(0)),e.flags.clerk&&e.flags.betterauth&&(a.warn("Incompatible combination Clerk and BetterAuth. Exiting."),process.exit(0)),e.flags.supabase&&e.flags.clerk&&(a.warn("Incompatible combination Supabase and Clerk. Exiting."),process.exit(0)),e.flags.stripe&&e.packages.push("stripe"),e.flags.shadcnui&&e.packages.push("shadcnui"),e;if(e.flags.default)return e;try{if(process.env.TERM_PROGRAM?.toLowerCase().includes("mintty"))throw a.warn(` WARNING: It looks like you are using MinTTY, which is non-interactive. This is most likely because you are
|
|
10
|
+
using Git Bash. If that's that case, please use Git Bash from another terminal, such as Windows Terminal.`),new E("Non-interactive environment");let n=await m.group({...!s&&{name:()=>m.text({message:"Project name",defaultValue:s,placeholder:C.appName,validate:Y})},authentication:()=>m.select({message:"What authentication provider would you like to use?",options:[{value:"none",label:"None"},{value:"better-auth",label:"BetterAuth"},{value:"clerk",label:"Clerk"},{value:"supabase",label:"Supabase"}],initialValue:"none"}),database:({results:i})=>{if(i.authentication!=="supabase")return m.select({message:"What database would you like to use?",options:[{value:"none",label:"None"},{value:"neon",label:"Neon"}],initialValue:"none"})},orm:()=>m.select({message:"What ORM Database would you like to use?",options:[{value:"none",label:"None"},{value:"drizzle",label:"Drizzle"}],initialValue:"none"}),importAlias:()=>m.text({message:"Custom import aliases",defaultValue:C.flags.alias,placeholder:C.flags.alias,validate:X}),additionalConfig:()=>m.multiselect({message:"Select additional tools to install (press enter to skip)",options:[{value:"docker",label:"Docker"},{value:"stripe",label:"Stripe"},{value:"shadcnui",label:"Shadcn UI"},{value:"vercelAi",label:"Vercel AI Gateway"}],required:!1})},{onCancel(){process.exit(1)}}),o=[],r=n.additionalConfig;return n.orm==="drizzle"&&o.push("drizzle"),n.authentication==="better-auth"&&o.push("betterAuth"),n.authentication==="clerk"&&o.push("clerk"),(r.includes("supabase")||n.authentication==="supabase")&&o.push("supabase"),n.database==="neon"&&o.push("neon"),r.includes("docker")&&o.push("docker"),r.includes("stripe")&&o.push("stripe"),r.includes("shadcnui")&&o.push("shadcnui"),r.includes("vercelAi")&&o.push("vercelAi"),{appName:n.name??e.appName,packages:o,flags:{...e.flags,alias:n.importAlias??e.flags.alias}}}catch(n){if(n instanceof E)a.warn(`
|
|
11
|
+
${D} needs an interactive terminal to provide options`),await m.confirm({message:"Continue scaffolding a default next-ts-cli?",initialValue:!0})||(a.info("Exiting..."),process.exit(0)),a.info(`Bootstrapping a default next-ts-cli in ./${e.appName}`);else throw n}return e};import Qe from"path";import Q from"chalk";import We from"ora";var Z=e=>{let{packages:t}=e;a.info("Adding boilerplate...");for(let[s,n]of Object.entries(t))if(n.inUse){let o=We(`Boilerplating ${s}...`).start();n.installer(e),o.succeed(Q.green(`Successfully setup boilerplate for ${Q.green.bold(s)}`))}a.info("")};import Fe from"path";import*as k from"@clack/prompts";import y from"chalk";import M from"fs-extra";import He from"ora";var ee=async({projectName:e,projectDir:t,pkgManager:s})=>{let n=Fe.join(p,"template/base");a.info(`
|
|
12
|
+
Using: ${y.cyan.bold(s)}
|
|
13
|
+
`);let o=He(`Scaffolding in: ${t}...
|
|
14
|
+
`).start();if(M.existsSync(t))if(M.readdirSync(t).length===0)e!=="."&&o.info(`${y.cyan.bold(e)} exists but is empty, continuing...
|
|
15
|
+
`);else{o.stopAndPersist();let i=await k.select({message:`${y.redBright.bold("Warning:")} ${y.cyan.bold(e)} already exists and isn't empty. How would you like to proceed?`,options:[{label:"Abort installation (recommended)",value:"abort"},{label:"Clear the directory and continue installation",value:"clear"},{label:"Continue installation and overwrite conflicting files",value:"overwrite"}],initialValue:"abort"});(k.isCancel(i)||i==="abort")&&(o.fail("Aborting installation..."),process.exit(1));let c=await k.confirm({message:`Are you sure you want to ${i==="clear"?"clear the directory":"overwrite conflicting files"}?`,initialValue:!1});(k.isCancel(c)||!c)&&(o.fail("Aborting installation..."),process.exit(1)),i==="clear"&&(o.info(`Emptying ${y.cyan.bold(e)} and creating next-ts-cli app..
|
|
16
|
+
`),M.emptyDirSync(t))}o.start(),M.copySync(n,t);let r=e==="."?"App":y.cyan.bold(e);o.succeed(`${r} ${y.green("scaffolded successfully!")}
|
|
17
|
+
`)};import Ye from"path";import Xe from"fs-extra";var te=({projectDir:e,projectName:t,packages:s})=>{let n=qe(t,s);Xe.writeFileSync(Ye.join(e,"README.md"),n)},qe=(e,t)=>{let s=[];s.push(`# ${e}
|
|
18
18
|
|
|
19
19
|
This project was bootstrapped with [next-ts-cli](https://github.com/RossiFire/next-ts-cli).
|
|
20
20
|
|
|
@@ -26,11 +26,11 @@ This project was bootstrapped with [next-ts-cli](https://github.com/RossiFire/ne
|
|
|
26
26
|
- **Commitlint** \u2014 Commit message linting
|
|
27
27
|
- **Lint-staged** \u2014 Run linters on staged files
|
|
28
28
|
- **Biome** \u2014 Linter and formatter
|
|
29
|
-
- **Jest** \u2014 Testing framework`);let
|
|
29
|
+
- **Jest** \u2014 Testing framework`);let n=[];t.clerk.inUse&&n.push("- **Clerk** \u2014 Fast authentication"),t.betterAuth.inUse&&n.push("- **BetterAuth** \u2014 Flexible authentication"),t.supabase.inUse&&n.push("- **Supabase** \u2014 Auth & database with real-time capabilities"),t.drizzle.inUse&&n.push("- **Drizzle ORM** \u2014 Type-safe database queries"),t.shadcnui.inUse&&n.push("- **Shadcn UI** \u2014 UI library"),t.stripe.inUse&&n.push("- **Stripe** \u2014 Payment checkout and webhooks boilerplate to easily create SaaS features"),t.docker.inUse&&n.push("- **Docker** \u2014 Containerization"),t.vercelAi.inUse&&n.push("- **Vercel AI Gateway** \u2014 AI capabilities witsh chat API route boilerplate"),n.length>0&&s.push(`
|
|
30
30
|
### Selected Integrations
|
|
31
31
|
|
|
32
|
-
${
|
|
33
|
-
`)}`),
|
|
32
|
+
${n.join(`
|
|
33
|
+
`)}`),s.push(`
|
|
34
34
|
## Getting Started
|
|
35
35
|
|
|
36
36
|
\`\`\`bash
|
|
@@ -48,47 +48,44 @@ Open [http://localhost:3000](http://localhost:3000) in your browser.
|
|
|
48
48
|
| \`npm run build\` | Build for production |
|
|
49
49
|
| \`npm run start\` | Start production server |
|
|
50
50
|
| \`npm run lint\` | Lint code |
|
|
51
|
-
| \`npm run test\` | Run tests |`),
|
|
52
|
-
`)};var u=()=>{let e=process.env.npm_config_user_agent;return e?e.startsWith("yarn")?"yarn":e.startsWith("pnpm")?"pnpm":e.startsWith("bun")?"bun":"npm":"npm"};var
|
|
53
|
-
`).start(),
|
|
54
|
-
`)}catch{
|
|
55
|
-
`)}};var
|
|
51
|
+
| \`npm run test\` | Run tests |`),t.docker.inUse&&s.push("| `npm run docker:build` | Build Docker image |\n| `npm run docker:up` | Start containers |\n| `npm run docker:down` | Stop containers |"),t.drizzle.inUse&&s.push("| `npm run db:generate` | Generate migrations |\n| `npm run db:migrate` | Run migrations |\n| `npm run db:studio` | Open Drizzle Studio |");let o=[];return t.drizzle.inUse&&o.push("DATABASE_URL="),t.betterAuth.inUse&&o.push("BETTER_AUTH_SECRET=","BETTER_AUTH_URL=http://localhost:3000"),t.supabase.inUse&&o.push("NEXT_PUBLIC_SUPABASE_URL=","NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY="),t.stripe.inUse&&o.push("STRIPE_SECRET_KEY=","STRIPE_WEBHOOK_SECRET=","NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY="),t.clerk.inUse&&o.push("NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=","CLERK_SECRET_KEY="),t.vercelAi.inUse&&o.push("AI_GATEWAY_API_KEY="),s.join(`
|
|
52
|
+
`)};var u=()=>{let e=process.env.npm_config_user_agent;return e?e.startsWith("yarn")?"yarn":e.startsWith("pnpm")?"pnpm":e.startsWith("bun")?"bun":"npm":"npm"};var ne=async({projectName:e,scopedAppName:t,packages:s})=>{let n=u(),o=Qe.resolve(process.cwd(),e);return await ee({projectName:e,projectDir:o,pkgManager:n,scopedAppName:t}),Z({projectName:e,scopedAppName:t,projectDir:o,pkgManager:n,packages:s}),te({projectDir:o,projectName:e,packages:s}),o};import{execSync as J}from"child_process";import G from"path";import*as L from"@clack/prompts";import j from"chalk";import{execa as T}from"execa";import se from"fs-extra";import Ze from"ora";var et=e=>{try{return J("git --version",{cwd:e}),!0}catch{return!1}},tt=e=>se.existsSync(G.join(e,".git")),nt=async e=>{try{return await T("git",["rev-parse","--is-inside-work-tree"],{cwd:e,stdout:"ignore"}),!0}catch{return!1}},st=()=>{let t=J("git --version").toString().trim().split(" ")[2],s=t?.split(".")[0],n=t?.split(".")[1];return{major:Number(s),minor:Number(n)}},ot=()=>J("git config --global init.defaultBranch || echo main").toString().trim(),oe=async e=>{if(a.info("Initializing Git..."),!et(e)){a.warn("Git is not installed. Skipping Git initialization.");return}let t=Ze(`Creating a new git repo...
|
|
53
|
+
`).start(),s=tt(e),n=await nt(e),o=G.parse(e).name;if(n&&s){if(t.stop(),!await L.confirm({message:`${j.redBright.bold("Warning:")} Git is already initialized in "${o}". Initializing a new git repository would delete the previous history. Would you like to continue anyways?`,initialValue:!1})){t.info("Skipping Git initialization.");return}se.removeSync(G.join(e,".git"))}else if(n&&!s&&(t.stop(),!await L.confirm({message:`${j.redBright.bold("Warning:")} "${o}" is already in a git worktree. Would you still like to initialize a new git repository in this directory?`,initialValue:!1}))){t.info("Skipping Git initialization.");return}try{let r=ot(),{major:i,minor:c}=st();i<2||i===2&&c<28?(await T("git",["init"],{cwd:e}),await T("git",["symbolic-ref","HEAD",`refs/heads/${r}`],{cwd:e})):await T("git",["init",`--initial-branch=${r}`],{cwd:e}),await T("git",["add","."],{cwd:e}),t.succeed(`${j.green("Successfully initialized and staged")} ${j.green.bold("git")}
|
|
54
|
+
`)}catch{t.fail(`${j.bold.red("Failed:")} could not initialize git. Update git to the latest version!
|
|
55
|
+
`)}};var re=async({projectName:e=z})=>{let t=u();a.info("Next steps:"),e!=="."&&a.info(` cd ${e}`),["npm","bun"].includes(t)?a.info(` ${t} run dev`):a.info(` ${t} dev`)};import N from"fs";import rt from"path";function ie(e,t,s){let n=N.readdirSync(e);try{n.forEach(o=>{let r=rt.join(e,o);if(N.statSync(r).isDirectory())ie(r,t,s);else{let c=N.readFileSync(r,"utf8").replace(new RegExp(t,"g"),s);N.writeFileSync(r,c,"utf8")}})}catch(o){a.error(`Error setting import alias: ${o}`)}}var ae=(e,t)=>{try{let s=t.replace(/\*/g,"").replace(/[^/]$/,"$&/");ie(e,"@/",s)}catch(s){a.error(`Error setting import alias: ${s}`)}};import it from"crypto";import at from"path";import lt from"fs-extra";var le=({projectDir:e,packages:t,scopedAppName:s})=>{let n=t?.betterAuth.inUse,o=t?.supabase.inUse,r=t?.drizzle.inUse,i=t?.stripe.inUse,c=t?.clerk.inUse,l=t?.neon.inUse,f=t?.vercelAi.inUse,b=ct(!!n,!!o,!!r,!!i,!!c,!!l,!!f,s),Be=at.join(e,".env");lt.writeFileSync(Be,b,"utf-8")},ct=(e,t,s,n,o,r,i,c)=>{let l=`
|
|
56
56
|
# Base variables
|
|
57
57
|
NEXT_PUBLIC_BASE_URL="http://localhost:3000"
|
|
58
58
|
GOOGLE_ANALYTICS_TAG="G-xxxxxxx" # Google Analytics G-Tag ID
|
|
59
|
-
`;if(e){let f=Buffer.from(
|
|
59
|
+
`;if(e){let f=Buffer.from(it.getRandomValues(new Uint8Array(32))).toString("base64");l+=`
|
|
60
60
|
# Better Auth
|
|
61
|
-
# Secret used by Better Auth
|
|
62
61
|
BETTER_AUTH_SECRET="${f}" # Generated by next-ts-cli.
|
|
63
62
|
|
|
64
63
|
# Better Auth GitHub OAuth
|
|
65
64
|
BETTER_AUTH_GITHUB_CLIENT_ID=""
|
|
66
65
|
BETTER_AUTH_GITHUB_CLIENT_SECRET=""
|
|
67
|
-
|
|
66
|
+
|
|
67
|
+
`}return t&&(l+=`
|
|
68
68
|
# Supabase
|
|
69
69
|
# https://supabase.com/docs/guides/functions/secrets
|
|
70
|
-
|
|
71
70
|
NEXT_PUBLIC_SUPABASE_URL="https://<app-id>.supabase.co",
|
|
72
71
|
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY=""
|
|
73
|
-
`),
|
|
74
|
-
`,(
|
|
75
|
-
`),
|
|
72
|
+
`),s&&(l+="# Drizzle"),r&&(l+=" + Neon"),l+=`
|
|
73
|
+
`,(s||r)&&(l+=`DATABASE_URL="postgresql://postgres:password@localhost:5432/${c}"
|
|
74
|
+
`),n&&(l+=`
|
|
76
75
|
# https://dashboard.stripe.com/apikeys
|
|
77
76
|
|
|
78
|
-
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=
|
|
79
|
-
STRIPE_SECRET_KEY=
|
|
80
|
-
STRIPE_WEBHOOK_SECRET="
|
|
81
|
-
`),
|
|
77
|
+
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=""
|
|
78
|
+
STRIPE_SECRET_KEY=""
|
|
79
|
+
STRIPE_WEBHOOK_SECRET=""
|
|
80
|
+
`),o&&(l+=`
|
|
82
81
|
# Clerk
|
|
83
82
|
# https://clerk.com/docs/nextjs/getting-started/quickstart
|
|
84
|
-
|
|
85
83
|
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY="pk_test_..."
|
|
86
84
|
CLERK_SECRET_KEY="sk_test_..."
|
|
87
85
|
|
|
88
|
-
`),
|
|
86
|
+
`),i&&(l+=`
|
|
89
87
|
# Vercel AI Gateway
|
|
90
88
|
# https://ai-sdk.dev/docs/getting-started/nextjs-app-router
|
|
91
|
-
|
|
92
89
|
AI_GATEWAY_API_KEY="sk_..."
|
|
93
|
-
`),l};import
|
|
94
|
-
`))};import{execSync as
|
|
90
|
+
`),l};import S from"path";import me from"fs-extra";import pe from"path";import de from"fs-extra";import pt from"sort-package-json";var ce={"better-auth":"^1.4.10","drizzle-kit":"^0.31.5","drizzle-orm":"^0.41.0",postgres:"^3.4.7",tailwindcss:"^4.0.15",postcss:"^8.5.3","@tailwindcss/postcss":"^4.0.15","@biomejs/biome":"^2.3.10","@supabase/ssr":"^0.8.0","@supabase/supabase-js":"^2.89.0","@stripe/react-stripe-js":"^5.4.1","@stripe/stripe-js":"^8.6.0",stripe:"^20.1.0","@clerk/nextjs":"^6.36.5","@neondatabase/serverless":"^1.0.2",ai:"^6.0.6","@ai-sdk/react":"^3.0.6"};var d=e=>{let{dependencies:t,devMode:s,projectDir:n}=e,o=de.readJSONSync(pe.join(n,"package.json"));t.forEach(i=>{let c=ce[i];s&&o.devDependencies?o.devDependencies[i]=c:o.dependencies&&(o.dependencies[i]=c)});let r=pt(o);de.writeJSONSync(pe.join(n,"package.json"),r,{spaces:2})};var fe=({projectDir:e,packages:t})=>{let s=t?.drizzle.inUse;d({projectDir:e,dependencies:["better-auth"],devMode:!1});let o=S.join(p,"template/extras"),r=S.join(o,"better-auth"),i="api/auth/[...all]/route.ts",c=S.join(r,i),l=S.join(e,"app",i);me.copySync(c,l);let f=S.join(r,s?"with-drizzle-auth.ts":"base-auth.ts"),b=S.join(e,"lib","auth.ts");me.copySync(f,b)};import v from"path";import ge from"fs-extra";import dt from"path";import ue from"fs-extra";import mt from"sort-package-json";var x=e=>{let{scripts:t,projectDir:s}=e,n=dt.join(s,"package.json"),o=ue.readJSONSync(n);o.scripts={...o.scripts,...t};let r=mt(o);ue.writeJSONSync(n,r,{spaces:2})};var he=({projectDir:e})=>{d({projectDir:e,dependencies:["drizzle-kit"],devMode:!0}),d({projectDir:e,dependencies:["drizzle-orm","postgres"],devMode:!1});let t=v.join(p,"template/extras"),s=v.join(t,"drizzle"),n=v.join(s,"drizzle.config.ts"),o=v.join(e,"drizzle.config.ts");ge.copySync(n,o);let r=v.join(s,"db"),i=v.join(e,"lib/db");ge.copySync(r,i),x({projectDir:e,scripts:{"db:push":"drizzle-kit push","db:studio":"drizzle-kit studio","db:generate":"drizzle-kit generate","db:migrate":"drizzle-kit migrate"}})};import g from"path";import V from"fs-extra";var be=({projectDir:e})=>{let t=g.join(p,"template/extras"),s=g.join(t,"docker");V.copySync(g.join(s,"Dockerfile"),g.join(e,"Dockerfile")),V.copySync(g.join(s,"docker-compose.prod.yml"),g.join(e,"docker-compose.prod.yml")),V.copySync(g.join(s,".dockerignore"),g.join(e,".dockerignore")),x({projectDir:e,scripts:{"docker:build":"docker compose -f docker-compose.prod.yml build","docker:up":"docker compose -f docker-compose.prod.yml up -d","docker:down":"docker compose -f docker-compose.prod.yml down","docker:logs":"docker compose -f docker-compose.prod.yml logs -f","docker:exec":"docker compose -f docker-compose.prod.yml exec app sh","docker:exec:bash":"docker compose -f docker-compose.prod.yml exec app bash","docker:exec:sh":"docker compose -f docker-compose.prod.yml exec app sh","docker:exec:npm":"docker compose -f docker-compose.prod.yml exec app npm"}})};import $ from"path";import gt from"fs-extra";import O from"path";import h from"fs-extra";var w=e=>{let{serverName:t,serverConfig:s,projectDir:n}=e;ft({serverName:t,serverConfig:s,projectDir:n}),ut({serverName:t,serverConfig:s,projectDir:n})},ft=e=>{let{serverName:t,serverConfig:s,projectDir:n}=e,o=O.join(n,".cusror/mpc.json");h.ensureDirSync(O.dirname(o));let r={args:s.args,command:s.command,env:s.env,url:s.url},i={};h.existsSync(o)&&(i=h.readJSONSync(o)),i.mcpServers||(i.mcpServers={}),i.mcpServers[t]={...r},h.writeJSONSync(o,i,{spaces:" "})},ut=e=>{let{serverName:t,serverConfig:s,projectDir:n}=e,o=O.join(n,".vscode/mcp.json");h.ensureDirSync(O.dirname(o));let r={};h.existsSync(o)&&(r=h.readJSONSync(o)),r.servers||(r.servers={}),r.servers[t]={...s},h.writeJSONSync(o,r,{spaces:" "})};var ye=({projectDir:e})=>{d({projectDir:e,dependencies:["@supabase/ssr","@supabase/supabase-js"],devMode:!1});let t=$.join(p,"template/extras"),s=$.join(t,"supabase"),n=$.join(e,"lib","supabase");gt.copySync(s,n),w({serverName:"supabase",serverConfig:{type:"http",url:"https://mcp.supabase.com/mcp?project_ref=<YOUR_SUPABASE_PROJECT_ID>"},projectDir:e})};import P from"path";import ke from"fs-extra";var _e=({projectDir:e})=>{d({projectDir:e,dependencies:["stripe","@stripe/stripe-js","@stripe/react-stripe-js"],devMode:!1});let t=P.join(p,"template/extras"),s=P.join(t,"stripe"),n=P.join(s,"checkout_session"),o=P.join(e,"app/api/checkout_session");ke.copySync(n,o);let r=P.join(s,"webhook/stripe/route.ts"),i=P.join(e,"app/api/webhook/stripe/route.ts");ke.copySync(r,i),x({projectDir:e,scripts:{"webhook:local":"stripe listen --forward-to localhost:3000/api/webhook/stripe"}}),w({serverName:"stripe",serverConfig:{type:"http",url:"https://mcp.stripe.com"},projectDir:e})};import I from"path";import K from"fs-extra";var Se=({projectDir:e})=>{let t=I.join(p,"template/extras"),s=I.join(t,"shadcnui"),n=I.join(s,"components.json"),o=I.join(e,"components.json");K.copySync(n,o);let r=I.join(s,"globals.css"),i=I.join(e,"app/globals.css");K.writeFileSync(i,K.readFileSync(r,"utf8")),w({serverName:"shadcn",serverConfig:{command:"npx",args:["shadcn@latest","mcp"]},projectDir:e})};import A from"path";import xe from"fs-extra";var ve=({projectDir:e})=>{d({projectDir:e,dependencies:["@clerk/nextjs"],devMode:!1});let t=A.join(p,"template/extras"),s=A.join(t,"clerk"),n=A.join(s,"proxy.ts"),o=A.join(e,"proxy.ts");xe.copySync(n,o);let r=A.join(s,"layout.tsx"),i=A.join(e,"app/layout.tsx");xe.copySync(r,i)};import we from"path";import ht from"fs-extra";var Pe=({projectDir:e,packages:t})=>{if(d({projectDir:e,dependencies:["@neondatabase/serverless"],devMode:!1}),t?.drizzle.inUse){let s=we.join(p,"template/extras/neon/index.ts"),n=we.join(e,"lib/db/index.ts");ht.copySync(s,n)}};import B from"path";import bt from"fs-extra";var Ie=({projectDir:e})=>{d({projectDir:e,dependencies:["ai","@ai-sdk/react"],devMode:!1});let t=B.join(p,"template/extras"),s=B.join(t,"vercel-ai"),n=B.join(s,"route.ts"),o=B.join(e,"app/api/chat/route.ts");bt.copySync(n,o)};var Ae=e=>({docker:{inUse:e.includes("docker"),installer:be},betterAuth:{inUse:e.includes("betterAuth"),installer:fe},drizzle:{inUse:e.includes("drizzle"),installer:he},envVariables:{inUse:!0,installer:le},supabase:{inUse:e.includes("supabase"),installer:ye},stripe:{inUse:e.includes("stripe"),installer:_e},shadcnui:{inUse:e.includes("shadcnui"),installer:Se},clerk:{inUse:e.includes("clerk"),installer:ve},neon:{inUse:e.includes("neon"),installer:Pe},vercelAi:{inUse:e.includes("vercelAi"),installer:Ie}});import Ee from"path";var Ce=e=>{let s=U(e).split("/"),n=s[s.length-1];if(n==="."){let i=Ee.resolve(process.cwd());n=Ee.basename(i)}let o=s.findIndex(i=>i.startsWith("@"));s.findIndex(i=>i.startsWith("@"))!==-1&&(n=s.slice(o).join("/"));let r=s.filter(i=>!i.startsWith("@")).join("/");return[n,r]};import yt from"gradient-string";var kt=["#003f5b","#5f5195","#cc4c91","#ff6f4e","#ff7030","#f10062","#b1008f","#2c19a8"],je=()=>{let e=yt(kt),t=u();(t==="yarn"||t==="pnpm")&&console.log(""),console.log(e.multiline(H))};import _t from"chalk";import{execa as Te}from"execa";import ze from"ora";var W=async(e,t,s)=>{let{onDataHandle:n,args:o=["install"],stdout:r="pipe"}=s,i=ze(`Running ${t} install...`).start(),c=Te(t,o,{cwd:e,stdout:r});return await new Promise((l,f)=>{n&&c.stdout?.on("data",n(i)),c.on("error",b=>f(b)),c.on("close",()=>l())}),i},St=async(e,t)=>{switch(e){case"npm":return await Te(e,["install"],{cwd:t,stderr:"inherit"}),null;case"pnpm":return W(t,e,{onDataHandle:s=>n=>{let o=n.toString();o.includes("Progress")&&(s.text=o.includes("|")?o.split(" | ")[1]??"":o)}});case"yarn":return W(t,e,{onDataHandle:s=>n=>{s.text=n.toString()}});case"bun":return W(t,e,{stdout:"ignore"})}},Re=async({projectDir:e})=>{a.info("Installing dependencies...");let t=u();(await St(t,e)??ze()).succeed(_t.green(`Successfully installed dependencies!
|
|
91
|
+
`))};import{execSync as xt}from"child_process";import vt from"https";var Ue=e=>{let t=_();t.includes("beta")?(a.warn(" You are using a beta version of next-ts-cli."),a.warn(" Please report any bugs you encounter.")):t.includes("next")?(a.warn(" You are running next-ts-cli with the @next tag which is no longer maintained."),a.warn(" Please run the CLI with @latest instead.")):t!==e&&(a.warn(" You are using an outdated version of next-ts-cli."),a.warn(" Your version:",t+".","Latest version in the npm registry:",e),a.warn(" Please run the CLI with @latest to get the latest updates.")),console.log("")};function wt(){return new Promise((e,t)=>{vt.get("https://registry.npmjs.org/-/package/next-ts-cli/dist-tags",s=>{if(s.statusCode===200){let n="";s.on("data",o=>{n+=o}),s.on("end",()=>{e(JSON.parse(n).latest)})}else t()}).on("error",()=>{t()})})}var Me=()=>wt().catch(()=>{try{return xt("npm view next-ts-cli version").toString().trim()}catch{return null}});var It=async()=>{let e=await Me(),t=u();je(),e&&Ue(e);let{appName:s,packages:n,flags:{alias:o}}=await q(),r=Ae(n),[i,c]=Ce(s),l=await ne({projectName:c,scopedAppName:i,packages:r,alias:o}),f=Oe.readJSONSync(Ne.join(l,"package.json"));if(f.name=i,f.nextTsMetadata={initVersion:_()},t!=="bun"){let{stdout:b}=await Pt(t,["-v"],{cwd:l});f.packageManager=`${t}@${b.trim()}`}Oe.writeJSONSync(Ne.join(l,"package.json"),f,{spaces:2}),o!=="@/"&&ae(l,o),await Re({projectDir:l}),await oe(l),await re({projectName:c,packages:r,projectDir:l}),process.exit(0)};It().catch(e=>{a.error("Aborting installation..."),e instanceof Error?a.error(e):(a.error("An unknown error has occurred. Please open an issue on github with the below:"),console.log(e)),process.exit(1)});
|
package/package.json
CHANGED