diff --git a/packages/create-bot/README.md b/packages/create-bot/README.md index 719436f8..4c7e3440 100644 --- a/packages/create-bot/README.md +++ b/packages/create-bot/README.md @@ -1,6 +1,6 @@ # @mtcute/create-bot -Starter kit for creating bots using `@mtcute/node`. +Starter kit for creating bots using `@mtcute/node` or `@mtcute/bun`. [Learn more](https://mtcute.dev/guide/) @@ -12,7 +12,15 @@ Starter kit for creating bots using `@mtcute/node`. ## Usage +Depending on your preferred package manager, run one of the following commands: ```bash pnpm create @mtcute/bot -# and follow the instructions +# or +yarn create @mtcute/bot +# or +npm create @mtcute/bot +# or +bun create @mtcute/bot ``` + +and follow the instructions diff --git a/packages/create-bot/src/cli.ts b/packages/create-bot/src/cli.ts index 7502bf0f..b84cdb56 100644 --- a/packages/create-bot/src/cli.ts +++ b/packages/create-bot/src/cli.ts @@ -6,7 +6,7 @@ import { readConfig, UserConfigPersisted, writeConfig } from './config.js' import { TELEGRAM_APPS_PAGE } from './constants.js' import { getFeatureChoices } from './features/cli.js' import { MtcuteFeature } from './features/types.js' -import { getPackageManager, PackageManager } from './package-manager.js' +import { PackageManager } from './package-manager.js' interface UserConfigAnswers { reuse?: boolean @@ -101,7 +101,7 @@ export async function askForConfigPersisted(): Promise { return config } -export async function askForConfig(): Promise { +export async function askForConfig(packageManager: PackageManager): Promise { const persisted = await askForConfigPersisted() let allowEmptyBotToken = false @@ -128,7 +128,7 @@ export async function askForConfig(): Promise { }, { type: 'checkbox', - choices: getFeatureChoices(), + choices: getFeatureChoices(packageManager), name: 'features', message: 'Select features:', }, @@ -137,7 +137,7 @@ export async function askForConfig(): Promise { return { ...persisted, name: '', // will be filled later - packageManager: getPackageManager(), + packageManager, botToken: botToken || undefined, features, } diff --git a/packages/create-bot/src/dependencies.ts b/packages/create-bot/src/dependencies.ts index 37130571..e44e77e9 100644 --- a/packages/create-bot/src/dependencies.ts +++ b/packages/create-bot/src/dependencies.ts @@ -1,12 +1,18 @@ import { UserConfig } from './cli.js' import { MtcuteFeature } from './features/types.js' -import { getInstallCommand } from './package-manager.js' +import { getInstallCommand, PackageManager } from './package-manager.js' import { exec } from './utils.js' export function buildDependenciesList(config: UserConfig) { - const dependencies = ['@mtcute/node'] + const dependencies = [] const devDepdenencies = ['dotenv-cli'] + if (config.packageManager === PackageManager.Bun) { + dependencies.push('@mtcute/bun') + } else { + dependencies.push('@mtcute/node') + } + if (config.features.includes(MtcuteFeature.Dispatcher)) { dependencies.push('@mtcute/dispatcher') } diff --git a/packages/create-bot/src/features/cli.ts b/packages/create-bot/src/features/cli.ts index c1f7a463..f079458c 100644 --- a/packages/create-bot/src/features/cli.ts +++ b/packages/create-bot/src/features/cli.ts @@ -1,15 +1,10 @@ import { CheckboxChoiceOptions } from 'inquirer' +import { PackageManager } from '../package-manager.js' import { MtcuteFeature } from './types.js' -export function getFeatureChoices(): CheckboxChoiceOptions[] { - return [ - { - name: ' 🚀 Native addon (better performance)', - short: 'Native addon', - value: MtcuteFeature.NativeAddon, - checked: true, - }, +export function getFeatureChoices(packageMananger: PackageManager): CheckboxChoiceOptions[] { + const arr: CheckboxChoiceOptions[] = [ { name: ' 🌐 Internationalization', short: 'i18n', @@ -21,12 +16,6 @@ export function getFeatureChoices(): CheckboxChoiceOptions[] { value: MtcuteFeature.Dispatcher, checked: true, }, - { - name: ' 🐳 Generate Dockerfile', - short: 'Dockerfile', - value: MtcuteFeature.Docker, - checked: true, - }, { name: ' ✨ Use TypeScript', short: 'TypeScript', @@ -40,4 +29,25 @@ export function getFeatureChoices(): CheckboxChoiceOptions[] { checked: true, }, ] + + if (packageMananger !== PackageManager.Bun) { + arr.unshift({ + name: ' 🚀 Native addon (better performance)', + short: 'Native addon', + value: MtcuteFeature.NativeAddon, + checked: true, + }) + } + + if (packageMananger === PackageManager.Pnpm) { + // todo: add support for dockerfile generation for other package managers + arr.push({ + name: ' 🐳 Generate Dockerfile', + short: 'Dockerfile', + value: MtcuteFeature.Docker, + checked: true, + }) + } + + return arr } diff --git a/packages/create-bot/src/main.ts b/packages/create-bot/src/main.ts index 88f6174d..4cbaf945 100644 --- a/packages/create-bot/src/main.ts +++ b/packages/create-bot/src/main.ts @@ -6,7 +6,7 @@ import { fileURLToPath } from 'node:url' import { askForConfig } from './cli.js' import { installDependencies } from './dependencies.js' import { MtcuteFeature } from './features/types.js' -import { getExecCommand } from './package-manager.js' +import { getExecCommand, getPackageManager, PackageManager } from './package-manager.js' import { runTemplater } from './templater.js' import { exec } from './utils.js' @@ -17,7 +17,13 @@ if (!projectName) { process.exit(1) } -const config = await askForConfig() +const packageManager = getPackageManager() + +if (packageManager === PackageManager.Bun) { + console.log(`${colors.red('‼️ Warning:')} ${colors.yellow('Bun')} support is ${colors.bold('experimental')}`) +} + +const config = await askForConfig(packageManager) config.name = projectName const outDir = process.env.TARGET_DIR || join(process.cwd(), projectName) diff --git a/packages/create-bot/template/package.json.hbs b/packages/create-bot/template/package.json.hbs index df814575..8d4a6902 100644 --- a/packages/create-bot/template/package.json.hbs +++ b/packages/create-bot/template/package.json.hbs @@ -15,11 +15,19 @@ "lint:fix": "eslint --fix .", "format": "prettier --write \"src/**/*.ts\"", {{/if}} + {{#if (eq packageManager "bun")}} + {{#if features.typescript}} + "start": "bun ./src/index.ts" + {{else}} + "start": "bun ./src/index.js" + {{/if}} + {{else}} {{#if features.typescript}} "start": "tsc && dotenv node ./dist/index.js", "build": "tsc" {{else}} "start": "dotenv node ./src/index.js" {{/if}} + {{/if}} } } \ No newline at end of file diff --git a/packages/create-bot/template/src/index.js.hbs b/packages/create-bot/template/src/index.js.hbs index 3079fe89..629c923c 100644 --- a/packages/create-bot/template/src/index.js.hbs +++ b/packages/create-bot/template/src/index.js.hbs @@ -2,7 +2,11 @@ {{#if features.dispatcher}} import { Dispatcher, filters } from '@mtcute/dispatcher' {{/if}} +{{#if (eq packageManager "bun")}} +import { TelegramClient } from '@mtcute/bun' +{{else}} import { TelegramClient } from '@mtcute/node' +{{/if}} import * as env from './env.js' {{#if features.i18n}} diff --git a/packages/create-bot/template/src/index.ts.hbs b/packages/create-bot/template/src/index.ts.hbs index 631653c5..db1cf374 100644 --- a/packages/create-bot/template/src/index.ts.hbs +++ b/packages/create-bot/template/src/index.ts.hbs @@ -2,7 +2,11 @@ {{#if features.dispatcher}} import { Dispatcher, filters } from '@mtcute/dispatcher' {{/if}} +{{#if (eq packageManager "bun")}} +import { TelegramClient } from '@mtcute/bun' +{{else}} import { TelegramClient } from '@mtcute/node' +{{/if}} import * as env from './env.js' {{#if features.i18n}}