Skip to content

Commit

Permalink
refactor: simplify init cli
Browse files Browse the repository at this point in the history
  • Loading branch information
jxom committed Nov 2, 2023
1 parent 3d73815 commit 5e45a06
Show file tree
Hide file tree
Showing 6 changed files with 40 additions and 119 deletions.
12 changes: 1 addition & 11 deletions create-vocs/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,7 @@ import { cliInit, version } from 'vocs/internal'

const cli = cac('create-vocs')

cli
.usage('[options]')
.option('-n, --name [name]', 'Name of project')
.option(
'-i, --install [false|npm|pnpm|yarn|bun]',
'Install dependencies (and optionally force package manager)',
{
default: true,
},
)
.option('-g, --git', 'Initialize git repository', { default: true })
cli.usage('[options]').option('-n, --name [name]', 'Name of project')

cli.help()
cli.version(version)
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
"format": "biome format . --write",
"lint": "biome lint . --apply-unsafe",
"playground": "pnpm --filter playgrounds/default dev",
"prepare": "bun x simple-git-hooks",
"prepare": "simple-git-hooks",
"typecheck": "tsc --noEmit"
},
"devDependencies": {
Expand Down
66 changes: 4 additions & 62 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

64 changes: 32 additions & 32 deletions src/cli/commands/init.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,21 @@

import { dirname, resolve } from 'node:path'
import { fileURLToPath } from 'node:url'
import { text } from '@clack/prompts'
import { intro, log, outro, text } from '@clack/prompts'
// @ts-expect-error
import { detect } from 'detect-package-manager'
import { execa } from 'execa'
import { default as fs } from 'fs-extra'
import pc from 'picocolors'

import { kebabcase } from '../../utils/kebabcase.js'

type InitParameters = { name: string; git: boolean; install: boolean }
type InitParameters = { name: string }

const __dirname = dirname(fileURLToPath(import.meta.url))

export async function init(params: InitParameters) {
intro('Welcome to Vocs!')

const templateDir = resolve(__dirname, '../templates/default')

const displayName =
Expand All @@ -30,8 +32,6 @@ export async function init(params: InitParameters) {

const destDir = resolve(process.cwd(), name)

console.log(`Scaffolding project in ${name}...`)

// Copy contents
fs.copySync(templateDir, destDir)

Expand All @@ -46,37 +46,23 @@ export async function init(params: InitParameters) {
pkgJson.name = name
fs.writeJsonSync(resolve(destDir, 'package.json'), pkgJson, { spaces: 2 })

// Install dependencies
if (params.install) {
const packageManager =
typeof params.install === 'string' ? params.install : detectPackageManager()
await execa(packageManager, ['install'], {
cwd: destDir,
stdout: 'inherit',
env: {
...process.env,
ADBLOCK: '1',
DISABLE_OPENCOLLECTIVE: '1',
// we set NODE_ENV to development as pnpm skips dev
// dependencies when production
NODE_ENV: 'development',
},
})
}
// Wrap up
log.success(`Project successfully scaffolded in ${pc.blue(destDir)}!`)

// Create git repository
if (params.git) {
await execa('git', ['init'], { cwd: destDir })
await execa('git', ['add', '.'], { cwd: destDir })
await execa('git', ['commit', '--no-verify', '--message', 'initial commit'], {
cwd: destDir,
})
}
const pkgManager = detectPackageManager()

log.message('Next steps:')
log.step(`1. ${pc.blue(`cd ./${name}`)} - Navigate to project`)
log.step(`2. ${pc.blue(pkgManagerInstallCommand(pkgManager))} - Install dependencies`)
log.step(`3. ${pc.blue(pkgManagerRunCommand(pkgManager, 'dev'))} - Start dev server`)
log.step(`4. Head to ${pc.blue('http://localhost:5173')}`)

console.log('Done!')
outro('Happy documenting! 📝')
}

export function detectPackageManager() {
type PackageManager = 'npm' | 'yarn' | 'pnpm' | 'bun'

export function detectPackageManager(): PackageManager {
const userAgent = process.env.npm_config_user_agent
if (!userAgent) return 'npm'
if (userAgent.includes('bun')) return 'bun'
Expand All @@ -85,3 +71,17 @@ export function detectPackageManager() {
if (userAgent.includes('npm')) return 'npm'
return 'npm'
}

function pkgManagerInstallCommand(pkgManager: PackageManager) {
if (pkgManager === 'bun') return 'bun install'
if (pkgManager === 'yarn') return 'yarn'
if (pkgManager === 'pnpm') return 'pnpm install'
return 'npm install'
}

function pkgManagerRunCommand(pkgManager: PackageManager, command: string) {
if (pkgManager === 'bun') return `bun run ${command}`
if (pkgManager === 'yarn') return `yarn ${command}`
if (pkgManager === 'pnpm') return `pnpm ${command}`
return `npm run ${command}`
}
13 changes: 1 addition & 12 deletions src/cli/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,7 @@ import { version } from './version.js'
export const cli = cac('vocs')

cli.command('[root]').alias('dev').option('-h, --host', 'Expose host URL').action(dev)
cli
.command('init')
.option('-n, --name [name]', 'Name of project')
.option(
'-i, --install [false|npm|pnpm|yarn|bun]',
'Install dependencies (and optionally force package manager)',
{
default: true,
},
)
.option('-g, --git', 'Initialize git repository', { default: true })
.action(init)
cli.command('init').option('-n, --name [name]', 'Name of project').action(init)
cli.command('build').action(build)
cli.command('preview').action(preview)

Expand Down
2 changes: 1 addition & 1 deletion src/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,13 @@
"clsx": "^2.0.0",
"compression": "^1.7.4",
"detect-package-manager": "^3.0.1",
"execa": "^8.0.1",
"fs-extra": "^11.1.1",
"globby": "^13.2.2",
"hastscript": "^8.0.0",
"mdast-util-directive": "^3.0.0",
"mdast-util-to-hast": "^13.0.2",
"minimatch": "^9.0.3",
"picocolors": "^1.0.0",
"postcss": "^8.4.31",
"react-helmet": "^6.1.0",
"react-router-dom": "^6.16.0",
Expand Down

0 comments on commit 5e45a06

Please sign in to comment.