diff --git a/packages/create-commandkit/src/functions/installDeps.ts b/packages/create-commandkit/src/functions/installDeps.ts index dfec5c07..fe50ec19 100644 --- a/packages/create-commandkit/src/functions/installDeps.ts +++ b/packages/create-commandkit/src/functions/installDeps.ts @@ -12,7 +12,7 @@ const baseDependencies = [ const dependencies = { js: { dependencies: baseDependencies, - devDependencies: ['@types/node'], + devDependencies: ['@types/node', 'typescript'], }, ts: { dependencies: baseDependencies, @@ -27,6 +27,24 @@ interface InstallDepsProps { stdio: IOType; } +function getInstallCommand( + manager: PackageManager, + deps: string[], + dev = false, +) { + switch (manager) { + case 'npm': + case 'pnpm': + case 'yarn': + case 'bun': + return `${manager} add ${dev ? '-D' : ''} ${deps.join(' ')}`; + case 'deno': + return `deno add ${dev ? '--dev' : ''} ${deps.map((d) => `npm:${d}`).join(' ')}`; + default: + return manager satisfies never; + } +} + export function installDeps({ manager, dir, @@ -37,17 +55,20 @@ export function installDeps({ try { if (dependencies[lang].dependencies.length) { - const depsCommand = `${manager} add ${dependencies[ - lang - ].dependencies.join(' ')}`; + const depsCommand = getInstallCommand( + manager, + dependencies[lang].dependencies, + ); execSync(depsCommand, { cwd: dir, stdio }); } if (dependencies[lang].devDependencies.length) { - const devDepsCommand = `${manager} add -D ${dependencies[ - lang - ].devDependencies.join(' ')}`; + const devDepsCommand = getInstallCommand( + manager, + dependencies[lang].devDependencies, + true, + ); execSync(devDepsCommand, { cwd: dir, stdio }); } diff --git a/packages/create-commandkit/src/functions/setup.ts b/packages/create-commandkit/src/functions/setup.ts index 1521685c..0280a009 100644 --- a/packages/create-commandkit/src/functions/setup.ts +++ b/packages/create-commandkit/src/functions/setup.ts @@ -19,24 +19,32 @@ export async function setup({ stdio = 'pipe', }: SetupProps) { await fs.emptyDir(dir); - execSync(commands.init[manager], { cwd: dir, stdio }); + + if (manager === 'yarn') { + execSync(commands.init.yarn, { cwd: dir, stdio }); + } const packageJsonPath = path.join(dir, 'package.json'); - const packageJson = await fs.readJSON(packageJsonPath); - - delete packageJson.main; - packageJson.name = packageJson.name.toLowerCase(); - packageJson.type = 'module'; - packageJson.version = '0.1.0'; - packageJson.private = true; - packageJson.description = 'A CommandKit project'; - - packageJson.scripts = { - dev: 'commandkit dev', - build: 'commandkit build', - start: 'commandkit start', + + const packageJson = { + name: + dir.replaceAll('\\', '/').split('/').pop()?.toLowerCase() || + 'commandkit-project', + description: 'A CommandKit project', + version: '0.1.0', + type: 'module', + private: true, + main: 'dist/index.js', + scripts: { + dev: 'commandkit dev', + build: 'commandkit build', + start: 'commandkit start', + }, + devDependencies: {}, + dependencies: {}, }; await fs.writeJSON(packageJsonPath, packageJson, { spaces: 2 }); - await fs.writeFile(`${dir}/.env`, `DISCORD_TOKEN="${token}"`); + + await fs.writeFile(`${dir}/.env`, `DISCORD_TOKEN="${token || ''}"`); } diff --git a/packages/create-commandkit/src/index.ts b/packages/create-commandkit/src/index.ts index 7bf6e256..0dfe3e7f 100755 --- a/packages/create-commandkit/src/index.ts +++ b/packages/create-commandkit/src/index.ts @@ -12,9 +12,10 @@ import { copyTemplates } from './functions/copyTemplates.js'; import { installDeps } from './functions/installDeps.js'; import { setup } from './functions/setup.js'; import type { Language, PackageManager } from './types'; -import { textColors } from './utils.js'; +import { detectPackageManager, textColors } from './utils.js'; const commandkitGradient = gradient(textColors.commandkit)('CommandKit'); + intro(`Welcome to ${commandkitGradient}!`); const dir = path.resolve( @@ -41,12 +42,13 @@ const dir = path.resolve( const manager = (await select({ message: 'Select a package manager:', - initialValue: 'npm' as PackageManager, + initialValue: detectPackageManager(), options: [ { label: 'npm', value: 'npm' }, { label: 'pnpm', value: 'pnpm' }, { label: 'yarn', value: 'yarn' }, { label: 'bun', value: 'bun' }, + { label: 'deno', value: 'deno' }, ], })) as PackageManager; @@ -98,13 +100,29 @@ installDeps({ stdio: 'pipe', }); +const command = (cmd: string) => { + switch (manager) { + case 'npm': + // bun build runs bundler instead of the build script + case 'bun': + return `${manager} run ${cmd}`; + case 'pnpm': + case 'yarn': + return `${manager} ${cmd}`; + case 'deno': + return `deno task ${cmd}`; + default: + return manager satisfies never; + } +}; + console.log( `${gradient(textColors.commandkit)('Thank you for choosing CommandKit!')} To start your bot, use the following commands: - ${colors.magenta(`${manager} run dev`)} - Run your bot in development mode - ${colors.magenta(`${manager} run build`)} - Build your bot for production - ${colors.magenta(`${manager} run start`)} - Run your bot in production mode + ${colors.magenta(command('dev'))} - Run your bot in development mode + ${colors.magenta(command('build'))} - Build your bot for production + ${colors.magenta(command('start'))} - Run your bot in production mode • Documentation: ${colors.blue('https://commandkit.dev')} • GitHub: ${colors.blue('https://github.com/underctrl-io/commandkit')} diff --git a/packages/create-commandkit/src/types.ts b/packages/create-commandkit/src/types.ts index 5518d4eb..4beaa26d 100644 --- a/packages/create-commandkit/src/types.ts +++ b/packages/create-commandkit/src/types.ts @@ -1,2 +1,2 @@ export type Language = 'js' | 'ts'; -export type PackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun'; +export type PackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun' | 'deno'; diff --git a/packages/create-commandkit/src/utils.ts b/packages/create-commandkit/src/utils.ts index 316fb52a..fdedf73c 100644 --- a/packages/create-commandkit/src/utils.ts +++ b/packages/create-commandkit/src/utils.ts @@ -1,3 +1,5 @@ +import type { PackageManager } from './types'; + export const textColors = { commandkit: ['#fdba74', '#e4a5a2', '#c288de', '#b27bf9'], js: ['#f7e01c', '#f7e01c'], @@ -6,9 +8,18 @@ export const textColors = { export const commands = { init: { - npm: 'npm init -y', - yarn: 'yarn init -y; yarn set version stable; yarn config set nodeLinker node-modules;', - pnpm: 'pnpm init', - bun: 'bun init -y -m', + yarn: 'yarn set version stable; yarn config set nodeLinker node-modules;', }, }; + +export function detectPackageManager(): PackageManager { + const packageManager = process.env.npm_config_user_agent; + + if (packageManager?.includes('pnpm')) return 'pnpm'; + if (packageManager?.includes('yarn')) return 'yarn'; + if (packageManager?.includes('bun')) return 'bun'; + if (packageManager?.includes('npm')) return 'npm'; + if (packageManager?.includes('deno')) return 'deno'; + + return 'npm'; +}