create-discord-bot
Advanced tools
Comparing version
#!/usr/bin/env node | ||
var __defProp=Object.defineProperty,__name=(target,value)=>__defProp(target,"name",{value:value,configurable:!0});import process3 from"process";import{Option,program}from"commander";import picocolors3 from"picocolors";import prompts from"prompts";import validateProjectName from"validate-npm-package-name";var package_default_name="create-discord-bot",package_default_version="4.0.0";import{cp,stat,mkdir,readdir,readFile,writeFile}from"fs/promises";import path from"path";import process2 from"process";import{URL}from"url";import glob from"fast-glob";import picocolors2 from"picocolors";import{execSync}from"child_process";import process from"process";import picocolors from"picocolors";var NODE_PACKAGE_MANAGERS=["npm","pnpm","yarn"];function resolvePackageManager(){const npmConfigUserAgent=process.env.npm_config_user_agent;return npmConfigUserAgent?npmConfigUserAgent.startsWith("npm")?"npm":npmConfigUserAgent.startsWith("yarn")?"yarn":npmConfigUserAgent.startsWith("pnpm")?"pnpm":npmConfigUserAgent.startsWith("bun")?"bun":(console.error(picocolors.yellow(`Detected an unsupported package manager (${npmConfigUserAgent}). Falling back to npm.`)),"npm"):"npm"}function install(packageManager2){let installCommand=`${packageManager2} install`;switch(console.log(`Installing dependencies with ${packageManager2}...`),packageManager2){case"yarn":console.log(),installCommand=[`${packageManager2} set version stable`,`${packageManager2} config set nodeLinker node-modules`,`${packageManager2} config set logFilters --json '[{ "code": "YN0002", "level": "discard" }, { "code": "YN0013", "level": "discard" }, { "code": "YN0032", "level": "discard" }, { "code": "YN0060", "level": "discard" }]'`,`${packageManager2} plugin import interactive-tools`,`${packageManager2} plugin import workspace-tools`,installCommand];break;case"deno":installCommand=`${packageManager2} cache --reload src/index.ts`;break;case"pnpm":case"bun":console.log()}const env={...process.env,ADBLOCK:"1",NODE_ENV:"development",DISABLE_OPENCOLLECTIVE:"1"};if(Array.isArray(installCommand))for(const[index,command]of installCommand.entries()){if(index===installCommand.length-1){execSync(command,{stdio:"inherit",env:env});break}execSync(command,{stdio:"ignore",env:env})}else execSync(installCommand,{stdio:"inherit",env:env})}function isNodePackageManager(packageManager2){return NODE_PACKAGE_MANAGERS.includes(packageManager2)}async function createDiscordBot({directory:directory,installPackages:installPackages2,typescript:typescript2,packageManager:packageManager2}){const root=path.resolve(directory),directoryName=path.basename(root);console.log();(!(await stat(root).catch((async error=>{if("ENOENT"===error.code)return await mkdir(root,{recursive:!0}),stat(root);throw error}))).isDirectory()||(await readdir(root)).length>0)&&(console.error(picocolors2.red(`The directory ${picocolors2.yellow(`"${directoryName}"`)} is either not a directory or is not empty.`)),console.error(picocolors2.red("Please specify an empty directory.")),process2.exit(1)),console.log(`Creating ${directoryName} in ${picocolors2.green(root)}.`);const deno2="deno"===packageManager2;await cp(new URL("../template/"+(deno2?"Deno":typescript2?"TypeScript":"JavaScript"),import.meta.url),root,{recursive:!0});const bun="bun"===packageManager2;bun&&(await cp(new URL(`../template/Bun/${typescript2?"TypeScript":"JavaScript"}/package.json`,import.meta.url),`${root}/package.json`),typescript2&&(await cp(new URL("../template/Bun/TypeScript/tsconfig.eslint.json",import.meta.url),`${root}/tsconfig.eslint.json`),await cp(new URL("../template/Bun/TypeScript/tsconfig.json",import.meta.url),`${root}/tsconfig.json`))),process2.chdir(root);const newVSCodeSettings=await readFile("./.vscode/settings.json",{encoding:"utf8"}).then((str=>{let newStr=str.replace("[REPLACE_ME]",deno2||bun?"auto":packageManager2);return deno2&&(newStr=newStr.replaceAll('"[REPLACE_BOOL]"',!0)),newStr}));await writeFile("./.vscode/settings.json",newVSCodeSettings);const globStream=glob.stream("./src/**/*.ts");for await(const file of globStream){const newData=await readFile(file,{encoding:"utf8"}).then((str=>str.replaceAll("[REPLACE_IMPORT_EXT]",typescript2&&!isNodePackageManager(packageManager2)?"ts":"js")));await writeFile(file,newData)}if(!deno2){const newPackageJSON=await readFile("./package.json",{encoding:"utf8"}).then((str=>{let newStr=str.replace("[REPLACE_ME]",directoryName);return newStr=newStr.replaceAll("[REPLACE_IMPORT_EXT]",typescript2&&!isNodePackageManager(packageManager2)?"ts":"js"),newStr}));await writeFile("./package.json",newPackageJSON)}if(installPackages2)try{install(packageManager2)}catch(error){console.log();"SIGINT"===error.signal?console.log(picocolors2.red("Installation aborted.")):(console.error(picocolors2.red("Installation failed.")),process2.exit(1))}console.log(),console.log(picocolors2.green("All done! Be sure to read through the discord.js guide for help on your journey.")),console.log(`Link: ${picocolors2.cyan("https://discordjs.guide")}`)}__name(resolvePackageManager,"resolvePackageManager"),__name(install,"install"),__name(isNodePackageManager,"isNodePackageManager"),__name(createDiscordBot,"createDiscordBot");var projectDirectory="",handleSigTerm=__name((()=>process3.exit(0)),"handleSigTerm");process3.on("SIGINT",handleSigTerm),process3.on("SIGTERM",handleSigTerm);var onPromptState=__name((state=>{state.aborted&&(process3.stdout.write("[?25h"),process3.stdout.write("\n"),process3.exit(1))}),"onPromptState");program.name(package_default_name).version(package_default_version).description("Create a basic discord.js bot.").argument("[directory]","What is the name of the directory you want to create this project in?").usage(`${picocolors3.green("<directory>")}`).action((directory=>{projectDirectory=directory})).option("--typescript","Whether to use the TypeScript template.").option("--javascript","Whether to use the JavaScript template.").option("--no-install","Whether to not automatically install the packages.").addOption(new Option("--package-manager <packageManager>","The package manager to use.").choices(["npm","pnpm","yarn","bun","deno"]).default(resolvePackageManager())).allowUnknownOption().parse();var{typescript:typescript,javascript:javascript,packageManager:packageManager,install:installPackages}=program.opts();if(projectDirectory||(projectDirectory=(await prompts({onState:onPromptState,type:"text",name:"directory",initial:"my-bot",message:"What is the name of the directory you want to create this project in?",validate:__name((directory=>{const validationResult=validateProjectName(directory);if(!validationResult.validForNewPackages){const errors=[];for(const error of[...validationResult.errors??[],...validationResult.warnings??[]])errors.push(picocolors3.red(`- ${error}`));return picocolors3.red(`Cannot create a project named ${picocolors3.yellow(`"${directory}"`)} due to npm naming restrictions.\n\nErrors:\n${errors.join("\n")}\n\n${picocolors3.red("\nSee https://docs.npmjs.com/cli/configuring-npm/package-json for more details.")}}`)}return!0}),"validate")})).directory),!("deno"===packageManager)&&void 0===typescript&&void 0===javascript){const{useTypescript:useTypescript}=await prompts({onState:onPromptState,type:"toggle",name:"useTypescript",message:"Do you want to use TypeScript?",initial:!0,active:"Yes",inactive:"No"});typescript=useTypescript}await createDiscordBot({typescript:typescript,directory:projectDirectory,packageManager:packageManager,installPackages:installPackages}); | ||
var __defProp=Object.defineProperty,__name=(target,value)=>__defProp(target,"name",{value:value,configurable:!0});import process3 from"process";import{styleText as styleText3}from"util";import{Option,program}from"commander";import prompts from"prompts";import validateProjectName from"validate-npm-package-name";var package_default_name="create-discord-bot",package_default_version="5.0.0-dev.1753613920-c0c1ac287";import{cp,glob,mkdir,stat,readdir,readFile,writeFile}from"fs/promises";import path from"path";import process2 from"process";import{URL}from"url";import{styleText as styleText2}from"util";import{execSync}from"child_process";import process from"process";import{styleText}from"util";var NODE_PACKAGE_MANAGERS=["npm","pnpm","yarn"];function resolvePackageManager(){const npmConfigUserAgent=process.env.npm_config_user_agent;return npmConfigUserAgent?npmConfigUserAgent.startsWith("npm")?"npm":npmConfigUserAgent.startsWith("yarn")?"yarn":npmConfigUserAgent.startsWith("pnpm")?"pnpm":npmConfigUserAgent.startsWith("bun")?"bun":(console.error(styleText("yellow",`Detected an unsupported package manager (${npmConfigUserAgent}). Falling back to npm.`)),"npm"):"npm"}function install(packageManager2){let installCommand=`${packageManager2} install`;switch(console.log(`Installing dependencies with ${packageManager2}...`),packageManager2){case"yarn":console.log(),installCommand=[`${packageManager2} set version stable`,`${packageManager2} config set nodeLinker node-modules`,`${packageManager2} config set logFilters --json '[{ "code": "YN0002", "level": "discard" }, { "code": "YN0013", "level": "discard" }, { "code": "YN0032", "level": "discard" }, { "code": "YN0060", "level": "discard" }]'`,`${packageManager2} plugin import interactive-tools`,`${packageManager2} plugin import workspace-tools`,installCommand];break;case"deno":installCommand=`${packageManager2} cache --reload src/index.ts`;break;case"pnpm":case"bun":console.log()}const env={...process.env,ADBLOCK:"1",NODE_ENV:"development",DISABLE_OPENCOLLECTIVE:"1"};if(Array.isArray(installCommand))for(const[index,command]of installCommand.entries()){if(index===installCommand.length-1){execSync(command,{stdio:"inherit",env:env});break}execSync(command,{stdio:"ignore",env:env})}else execSync(installCommand,{stdio:"inherit",env:env})}function isNodePackageManager(packageManager2){return NODE_PACKAGE_MANAGERS.includes(packageManager2)}async function createDiscordBot({directory:directory,installPackages:installPackages2,typescript:typescript2,packageManager:packageManager2}){const root=path.resolve(directory),directoryName=path.basename(root);console.log();(!(await stat(root).catch(async error=>{if("ENOENT"===error.code)return await mkdir(root,{recursive:!0}),stat(root);throw error})).isDirectory()||(await readdir(root)).length>0)&&(console.error(styleText2("red",`The directory ${styleText2("yellow",`"${directoryName}"`)} is either not a directory or is not empty.`)),console.error(styleText2("red","Please specify an empty directory.")),process2.exit(1)),console.log(`Creating ${directoryName} in ${styleText2("green",root)}.`);const deno2="deno"===packageManager2;await cp(new URL("../template/"+(deno2?"Deno":typescript2?"TypeScript":"JavaScript"),import.meta.url),root,{recursive:!0});const bun="bun"===packageManager2;bun&&(await cp(new URL(`../template/Bun/${typescript2?"TypeScript":"JavaScript"}/package.json`,import.meta.url),`${root}/package.json`),typescript2&&(await cp(new URL("../template/Bun/TypeScript/tsconfig.eslint.json",import.meta.url),`${root}/tsconfig.eslint.json`),await cp(new URL("../template/Bun/TypeScript/tsconfig.json",import.meta.url),`${root}/tsconfig.json`))),process2.chdir(root);const newVSCodeSettings=await readFile("./.vscode/settings.json",{encoding:"utf8"}).then(str=>{let newStr=str.replace("[REPLACE_ME]",deno2||bun?"auto":packageManager2);return deno2&&(newStr=newStr.replaceAll('"[REPLACE_BOOL]"',!0)),newStr});await writeFile("./.vscode/settings.json",newVSCodeSettings);const globIterator=glob("./src/**/*.ts");for await(const file of globIterator){const newData=await readFile(file,{encoding:"utf8"}).then(str=>str.replaceAll("[REPLACE_IMPORT_EXT]",typescript2&&!isNodePackageManager(packageManager2)?"ts":"js"));await writeFile(file,newData)}if(!deno2){const newPackageJSON=await readFile("./package.json",{encoding:"utf8"}).then(str=>{let newStr=str.replace("[REPLACE_ME]",directoryName);return newStr=newStr.replaceAll("[REPLACE_IMPORT_EXT]",typescript2&&!isNodePackageManager(packageManager2)?"ts":"js"),newStr});await writeFile("./package.json",newPackageJSON)}if(installPackages2)try{install(packageManager2)}catch(error){console.log();"SIGINT"===error.signal?console.log(styleText2("red","Installation aborted.")):(console.error(styleText2("red","Installation failed.")),process2.exit(1))}console.log(),console.log(styleText2("green","All done! Be sure to read through the discord.js guide for help on your journey.")),console.log(`Link: ${styleText2("cyan","https://discordjs.guide")}`)}__name(resolvePackageManager,"resolvePackageManager"),__name(install,"install"),__name(isNodePackageManager,"isNodePackageManager"),__name(createDiscordBot,"createDiscordBot");var projectDirectory="",handleSigTerm=__name(()=>process3.exit(0),"handleSigTerm");process3.on("SIGINT",handleSigTerm),process3.on("SIGTERM",handleSigTerm);var onPromptState=__name(state=>{state.aborted&&(process3.stdout.write("[?25h"),process3.stdout.write("\n"),process3.exit(1))},"onPromptState");program.name(package_default_name).version(package_default_version).description("Create a basic discord.js bot.").argument("[directory]","What is the name of the directory you want to create this project in?").usage(`${styleText3("green","<directory>")}`).action(directory=>{projectDirectory=directory}).option("--typescript","Whether to use the TypeScript template.").option("--javascript","Whether to use the JavaScript template.").option("--no-install","Whether to not automatically install the packages.").addOption(new Option("--package-manager <packageManager>","The package manager to use.").choices(["npm","pnpm","yarn","bun","deno"]).default(resolvePackageManager())).allowUnknownOption().parse();var{typescript:typescript,javascript:javascript,packageManager:packageManager,install:installPackages}=program.opts();if(projectDirectory||(projectDirectory=(await prompts({onState:onPromptState,type:"text",name:"directory",initial:"my-bot",message:"What is the name of the directory you want to create this project in?",validate:__name(directory=>{const validationResult=validateProjectName(directory);if(!validationResult.validForNewPackages){const errors=[];for(const error of[...validationResult.errors??[],...validationResult.warnings??[]])errors.push(styleText3("red",`- ${error}`));return styleText3("red",`Cannot create a project named ${styleText3("yellow",`"${directory}"`)} due to npm naming restrictions.\n\nErrors:\n${errors.join("\n")}\n\n${styleText3("red","\nSee https://docs.npmjs.com/cli/configuring-npm/package-json for more details.")}}`)}return!0},"validate")})).directory),!("deno"===packageManager)&&void 0===typescript&&void 0===javascript){const{useTypescript:useTypescript}=await prompts({onState:onPromptState,type:"toggle",name:"useTypescript",message:"Do you want to use TypeScript?",initial:!0,active:"Yes",inactive:"No"});typescript=useTypescript}await createDiscordBot({typescript:typescript,directory:projectDirectory,packageManager:packageManager,installPackages:installPackages}); |
{ | ||
"$schema": "https://json.schemastore.org/package.json", | ||
"name": "create-discord-bot", | ||
"version": "4.0.0", | ||
"version": "5.0.0-dev.1753613920-c0c1ac287", | ||
"description": "A simple way to create a startup Discord bot.", | ||
@@ -44,21 +44,19 @@ "type": "module", | ||
"dependencies": { | ||
"commander": "^13.1.0", | ||
"fast-glob": "^3.3.3", | ||
"picocolors": "^1.1.1", | ||
"commander": "^14.0.0", | ||
"prompts": "^2.4.2", | ||
"validate-npm-package-name": "^6.0.0" | ||
"validate-npm-package-name": "^6.0.1" | ||
}, | ||
"devDependencies": { | ||
"@favware/cliff-jumper": "^4.1.0", | ||
"@types/node": "^22.15.2", | ||
"@types/node": "^22.16.3", | ||
"@types/prompts": "^2.4.9", | ||
"@types/validate-npm-package-name": "^4.0.2", | ||
"cross-env": "^7.0.3", | ||
"eslint": "^9.25.1", | ||
"eslint": "^9.30.1", | ||
"eslint-config-neon": "^0.2.7", | ||
"eslint-formatter-compact": "^8.40.0", | ||
"eslint-formatter-pretty": "^6.0.1", | ||
"prettier": "^3.5.3", | ||
"terser": "^5.39.0", | ||
"tsup": "^8.4.0", | ||
"prettier": "^3.6.2", | ||
"terser": "^5.43.1", | ||
"tsup": "^8.5.0", | ||
"typescript": "~5.8.3", | ||
@@ -65,0 +63,0 @@ "@discordjs/api-extractor": "^7.52.7" |
@@ -9,3 +9,3 @@ <div align="center"> | ||
<a href="https://discord.gg/djs"><img src="https://img.shields.io/discord/222078108977594368?color=5865F2&logo=discord&logoColor=white" alt="Discord server" /></a> | ||
<a href="https://github.com/discordjs/discord.js/actions"><img src="https://github.com/discordjs/discord.js/actions/workflows/test.yml/badge.svg" alt="Build status" /></a> | ||
<a href="https://github.com/discordjs/discord.js/actions"><img src="https://github.com/discordjs/discord.js/actions/workflows/tests.yml/badge.svg" alt="Build status" /></a> | ||
<a href="https://github.com/discordjs/discord.js/commits/main/packages/create-discord-bot"><img alt="Last commit." src="https://img.shields.io/github/last-commit/discordjs/discord.js?logo=github&logoColor=ffffff&path=packages%2Fcreate-discord-bot" /></a> | ||
@@ -27,3 +27,3 @@ </p> | ||
pnpm create discord-bot ./your/chosen/directory | ||
bunx create-discord-bot ./your/chosen/directory | ||
bun create discord-bot ./your/chosen/directory | ||
``` | ||
@@ -36,3 +36,3 @@ | ||
- [discord.js Discord server][discord] | ||
- [Discord API Discord server][discord-api] | ||
- [Discord Developers Discord server][discord-developers] | ||
- [GitHub][source] | ||
@@ -53,4 +53,4 @@ | ||
[discord]: https://discord.gg/djs | ||
[discord-api]: https://discord.gg/discord-api | ||
[discord-developers]: https://discord.gg/discord-developers | ||
[source]: https://github.com/discordjs/discord.js/tree/main/packages/create-discord-bot | ||
[contributing]: https://github.com/discordjs/discord.js/blob/main/.github/CONTRIBUTING.md |
@@ -14,13 +14,13 @@ { | ||
"dependencies": { | ||
"@discordjs/core": "^2.1.1", | ||
"discord.js": "^14.20.0" | ||
"@discordjs/core": "^2.2.0", | ||
"discord.js": "^14.21.0" | ||
}, | ||
"devDependencies": { | ||
"eslint": "^9.24.0", | ||
"eslint": "^9.30.1", | ||
"eslint-config-neon": "^0.2.7", | ||
"eslint-formatter-compact": "^8.40.0", | ||
"eslint-formatter-pretty": "^6.0.1", | ||
"prettier": "^3.5.3", | ||
"zod": "^3.24.1" | ||
"prettier": "^3.6.2", | ||
"zod": "^3.25.74" | ||
} | ||
} |
@@ -14,16 +14,16 @@ { | ||
"dependencies": { | ||
"@discordjs/core": "^2.1.1", | ||
"discord.js": "^14.20.0" | ||
"@discordjs/core": "^2.2.0", | ||
"discord.js": "^14.21.0" | ||
}, | ||
"devDependencies": { | ||
"@sapphire/ts-config": "^5.0.1", | ||
"@types/bun": "^1.1.14", | ||
"eslint": "^9.24.0", | ||
"@types/bun": "^1.2.18", | ||
"eslint": "^9.30.1", | ||
"eslint-config-neon": "^0.2.7", | ||
"eslint-formatter-compact": "^8.40.0", | ||
"eslint-formatter-pretty": "^6.0.1", | ||
"prettier": "^3.5.3", | ||
"typescript": "~5.5.4", | ||
"zod": "^3.24.1" | ||
"prettier": "^3.6.2", | ||
"typescript": "~5.8.3", | ||
"zod": "^3.25.74" | ||
} | ||
} |
@@ -10,17 +10,16 @@ { | ||
"format": "prettier --write . && eslint --ext .js,.mjs,.cjs --fix --format=pretty src", | ||
"start": "node --require dotenv/config src/index.js", | ||
"deploy": "node --require dotenv/config src/util/deploy.js" | ||
"start": "node --env-file=.env src/index.js", | ||
"deploy": "node --env-file=.env src/util/deploy.js" | ||
}, | ||
"dependencies": { | ||
"@discordjs/core": "^2.1.1", | ||
"discord.js": "^14.20.0", | ||
"dotenv": "^16.4.5" | ||
"@discordjs/core": "^2.2.0", | ||
"discord.js": "^14.21.0" | ||
}, | ||
"devDependencies": { | ||
"eslint": "^9.24.0", | ||
"eslint": "^9.30.1", | ||
"eslint-config-neon": "^0.2.7", | ||
"eslint-formatter-compact": "^8.40.0", | ||
"eslint-formatter-pretty": "^6.0.1", | ||
"prettier": "^3.5.3", | ||
"zod": "^3.24.1" | ||
"prettier": "^3.6.2", | ||
"zod": "^3.25.74" | ||
}, | ||
@@ -27,0 +26,0 @@ "engines": { |
@@ -10,21 +10,20 @@ { | ||
"lint": "prettier --check . && eslint --ext .ts --format=pretty src", | ||
"deploy": "node --require dotenv/config dist/util/deploy.js", | ||
"deploy": "node --env-file=.env dist/util/deploy.js", | ||
"format": "prettier --write . && eslint --ext .ts --fix --format=pretty src", | ||
"start": "node --require dotenv/config dist/index.js" | ||
"start": "node --env-file=.env dist/index.js" | ||
}, | ||
"dependencies": { | ||
"@discordjs/core": "^2.1.1", | ||
"discord.js": "^14.20.0", | ||
"dotenv": "^16.4.7" | ||
"@discordjs/core": "^2.2.0", | ||
"discord.js": "^14.21.0" | ||
}, | ||
"devDependencies": { | ||
"@sapphire/ts-config": "^5.0.1", | ||
"@types/node": "^22.10.10", | ||
"eslint": "^9.24.0", | ||
"@types/node": "^22.16.0", | ||
"eslint": "^9.30.1", | ||
"eslint-config-neon": "^0.2.7", | ||
"eslint-formatter-compact": "^8.40.0", | ||
"eslint-formatter-pretty": "^6.0.1", | ||
"prettier": "^3.5.3", | ||
"typescript": "~5.5.4", | ||
"zod": "^3.24.1" | ||
"prettier": "^3.6.2", | ||
"typescript": "~5.8.3", | ||
"zod": "^3.25.74" | ||
}, | ||
@@ -31,0 +30,0 @@ "engines": { |
Deprecated
MaintenanceThe maintainer of the package marked it as deprecated. This could indicate that a single version should not be used, or that the package is no longer maintained and any new vulnerabilities will not be fixed.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
3
-40%53297
-0.14%1
Infinity%1
Infinity%3
-66.67%+ Added
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
Updated