djs-next 1.0.0-dev.1 ā 1.0.0-dev.3
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.
Potentially problematic release.
This version of djs-next might be problematic. Click here for more details.
- package/README.md +61 -30
- package/bin/create-djs-next.js +78 -0
- package/dist/index.d.mts +57 -5
- package/dist/index.d.ts +57 -5
- package/dist/index.js +620 -256
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +620 -246
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/client.ts +277 -68
- package/src/index.ts +4 -1
- package/src/plugins/dnxt.ts +215 -176
- package/src/templates/cjs.ts +11 -6
- package/src/templates/esm.ts +11 -4
- package/src/templates/ts.ts +11 -5
- package/src/types.ts +27 -2
- package/src/utils/PaginationBuilder.ts +94 -0
- package/src/utils/paginate.ts +32 -13
- package/src/utils/prompts.ts +76 -0
- package/test_payload.js +3 -0
- package/test_reply.js +4 -0
- package/tsup.config.ts +1 -1
- package/dist/cli.d.mts +0 -1
- package/dist/cli.d.ts +0 -1
- package/dist/cli.js +0 -344
- package/dist/cli.js.map +0 -1
- package/dist/cli.mjs +0 -321
- package/dist/cli.mjs.map +0 -1
- package/src/cli.ts +0 -203
package/dist/cli.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/templates/ts.ts","../src/templates/esm.ts","../src/templates/cjs.ts"],"sourcesContent":["#!/usr/bin/env node\nimport fs from 'fs';\nimport path from 'path';\nimport { input, select, password } from '@inquirer/prompts';\nimport { spawnSync } from 'child_process';\nimport { tsTemplates } from './templates/ts.js';\nimport { esmTemplates } from './templates/esm.js';\nimport { cjsTemplates } from './templates/cjs.js';\nimport pc from 'picocolors';\nimport { execSync } from 'child_process';\n\nasync function main() {\n console.log(pc.bold(pc.blue('\\nš Welcome to djs-next!\\n')));\n\n const userAgent = process.env.npm_config_user_agent || '';\n let pm = 'npm';\n if (userAgent.startsWith('yarn')) pm = 'yarn';\n else if (userAgent.startsWith('pnpm')) pm = 'pnpm';\n else if (userAgent.startsWith('bun')) pm = 'bun';\n\n const args = process.argv.slice(2);\n let projectName = args[0] || '';\n\n if (!projectName || projectName === 'init') {\n projectName = await input({\n message: 'What is your project named?',\n default: 'my-bot',\n validate: (value) => value.trim().length > 0 || 'Project name is required'\n });\n }\n\n const language = await select({\n message: 'Would you like to use TypeScript or JavaScript?',\n choices: [\n { name: 'TypeScript', value: 'ts' },\n { name: 'JavaScript', value: 'js' }\n ],\n default: 'ts'\n });\n\n const moduleSystem = await select({\n message: 'Would you like to use ES Modules or CommonJS?',\n choices: [\n { name: 'ES Modules (import/export)', value: 'esm' },\n { name: 'CommonJS (require/module.exports)', value: 'cjs' }\n ],\n default: 'esm'\n });\n\n const botToken = await password({\n message: 'What is your Discord Bot Token? (Leave empty to skip)',\n mask: true\n });\n\n const clientId = await input({\n message: 'What is your Discord Client ID? (Leave empty to skip)'\n });\n\n const targetPath = path.resolve(process.cwd(), projectName);\n\n if (fs.existsSync(targetPath)) {\n console.error(pc.red(`\\nDirectory \"${projectName}\" already exists.`));\n process.exit(1);\n }\n\n console.log(pc.cyan(`\\nScaffolding project in ${targetPath}...`));\n fs.mkdirSync(targetPath, { recursive: true });\n\n const isTS = language === 'ts';\n const isESM = moduleSystem === 'esm';\n const ext = isTS ? 'ts' : 'js';\n\n let devScript = isTS ? \"tsx watch src/index.ts\" : \"node --watch src/index.js\";\n let startScript = isTS ? \"node dist/index.js\" : \"node src/index.js\";\n \n if (pm === 'bun') {\n devScript = `bun run --watch src/index.${ext}`;\n startScript = `bun src/index.${ext}`;\n }\n\n const packageJson: any = {\n name: projectName.toLowerCase().replace(/\\\\s+/g, '-'),\n version: \"1.0.0\",\n main: isTS ? \"dist/index.js\" : \"src/index.js\",\n type: isESM ? \"module\" : \"commonjs\",\n scripts: {\n \"dev\": devScript,\n \"start\": startScript\n },\n dependencies: {\n \"discord.js\": \"latest\",\n \"djs-next\": \"latest\",\n \"dotenv\": \"latest\"\n },\n devDependencies: {}\n };\n\n if (isTS) {\n packageJson.scripts.build = \"tsc\";\n packageJson.devDependencies = {\n \"typescript\": \"latest\",\n \"@types/node\": \"latest\",\n \"tsx\": \"latest\"\n };\n }\n\n fs.writeFileSync(path.join(targetPath, 'package.json'), JSON.stringify(packageJson, null, 2));\n\n if (isTS) {\n const tsconfig = {\n compilerOptions: {\n target: \"ES2022\",\n module: isESM ? \"NodeNext\" : \"CommonJS\",\n moduleResolution: isESM ? \"NodeNext\" : \"Node\",\n strict: true,\n esModuleInterop: true,\n outDir: \"./dist\",\n types: [\"node\"],\n ignoreDeprecations: \"5.0\"\n },\n include: [\"src/**/*\"]\n };\n fs.writeFileSync(path.join(targetPath, 'tsconfig.json'), JSON.stringify(tsconfig, null, 2));\n }\n\n fs.writeFileSync(path.join(targetPath, '.env'), `DISCORD_TOKEN=${botToken || 'your_token_here'}\nCLIENT_ID=${clientId || 'your_client_id_here'}\n`);\n fs.writeFileSync(path.join(targetPath, '.gitignore'), `node_modules/\ndist/\n.env\n.DS_Store\n`);\n\n const srcDir = path.join(targetPath, 'src');\n fs.mkdirSync(srcDir, { recursive: true });\n fs.mkdirSync(path.join(srcDir, 'commands'), { recursive: true });\n fs.mkdirSync(path.join(srcDir, 'events'), { recursive: true });\n fs.mkdirSync(path.join(srcDir, 'components', 'buttons'), { recursive: true });\n fs.mkdirSync(path.join(srcDir, 'tasks'), { recursive: true });\n\n // Index File\n if (isTS) {\n fs.writeFileSync(path.join(srcDir, `index.${ext}`), tsTemplates.index);\n } else if (isESM) {\n fs.writeFileSync(path.join(srcDir, `index.${ext}`), esmTemplates.index);\n } else {\n fs.writeFileSync(path.join(srcDir, 'index.js'), cjsTemplates.index);\n }\n\n // Ping Command\n if (isTS) {\n fs.writeFileSync(path.join(srcDir, 'commands', 'ping.ts'), tsTemplates.ping);\n } else if (isESM) {\n fs.writeFileSync(path.join(srcDir, 'commands', 'ping.js'), esmTemplates.ping);\n } else {\n fs.writeFileSync(path.join(srcDir, 'commands', 'ping.js'), cjsTemplates.ping);\n }\n\n // Ready Event\n if (isTS) {\n fs.writeFileSync(path.join(srcDir, 'events', 'ready.ts'), tsTemplates.ready);\n } else if (isESM) {\n fs.writeFileSync(path.join(srcDir, 'events', 'ready.js'), esmTemplates.ready);\n } else {\n fs.writeFileSync(path.join(srcDir, 'events', 'ready.js'), cjsTemplates.ready);\n }\n\n // Healthcheck Task\n if (isTS) {\n fs.writeFileSync(path.join(srcDir, 'tasks', 'healthcheck.ts'), tsTemplates.healthcheck);\n } else if (isESM) {\n fs.writeFileSync(path.join(srcDir, 'tasks', 'healthcheck.js'), esmTemplates.healthcheck);\n } else {\n fs.writeFileSync(path.join(srcDir, 'tasks', 'healthcheck.js'), cjsTemplates.healthcheck);\n }\n\n console.log(pc.cyan(`\\nInstalling dependencies with ${pm}...`));\n try {\n execSync(`${pm} install`, { cwd: targetPath, stdio: 'inherit' });\n } catch (error) {\n console.error(pc.red(`\\nFailed to install dependencies. Please run '${pm} install' manually.`));\n }\n\n console.log(pc.green(pc.bold(`\\nSuccess! Created ${projectName} at ${targetPath}`)));\n console.log(`\\nInside that directory, you can run several commands:`);\n console.log(pc.cyan(`\\n ${pm} run dev`));\n console.log(` Starts the development server with hot-reloading.`);\n if (isTS) {\n console.log(pc.cyan(`\\n ${pm} run build`));\n console.log(` Compiles the TypeScript app into JavaScript.`);\n }\n console.log(pc.cyan(`\\n ${pm} start`));\n console.log(` Starts the production server.`);\n console.log(`\\nWe suggest that you begin by typing:\\n`);\n console.log(pc.cyan(` cd ${projectName}`));\n console.log(pc.cyan(` ${pm} run dev\\n`));\n}\n\nmain().catch((err) => {\n console.error(pc.red('An unexpected error occurred:'), err);\n process.exit(1);\n});\n","export const tsTemplates = {\n index: `import { DJSNextClient, GatewayIntentBits } from 'djs-next';\nimport 'dotenv/config';\n\nconst client = new DJSNextClient({\n intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages],\n commandsDir: './src/commands',\n eventsDir: './src/events',\n componentsDir: './src/components',\n tasksDir: './src/tasks',\n clientId: process.env.CLIENT_ID\n});\n\nclient.start(process.env.DISCORD_TOKEN!);\n`,\n\n ping: `import { FileCommand } from 'djs-next';\n\nexport const command: FileCommand = {\n description: 'Replies with Pong!',\n execute: async (interaction) => {\n await interaction.reply('Pong!');\n }\n};\n`,\n\n ready: `import { DJSNextEvent, Events } from 'djs-next';\n\nexport const event: DJSNextEvent<Events.ClientReady> = {\n name: Events.ClientReady,\n once: true,\n execute: (client) => {\n console.log('Ready! Logged in as ' + client.user?.tag);\n }\n};\n`,\n\n healthcheck: `import { FileTask } from 'djs-next';\n\nexport const task: FileTask = {\n interval: 60000,\n execute: async (client) => {\n console.log('[Task] Healthcheck completed.');\n }\n};\n`\n};\n","export const esmTemplates = {\n index: `import { DJSNextClient, GatewayIntentBits } from 'djs-next';\nimport 'dotenv/config';\n\nconst client = new DJSNextClient({\n intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages],\n commandsDir: './src/commands',\n eventsDir: './src/events',\n componentsDir: './src/components',\n tasksDir: './src/tasks',\n clientId: process.env.CLIENT_ID\n});\n\nclient.start(process.env.DISCORD_TOKEN);\n`,\n\n ping: `export const command = {\n description: 'Replies with Pong!',\n execute: async (interaction) => {\n await interaction.reply('Pong!');\n }\n};\n`,\n\n ready: `import { Events } from 'djs-next';\n\nexport const event = {\n name: Events.ClientReady,\n once: true,\n execute: (client) => {\n console.log('Ready! Logged in as ' + client.user?.tag);\n }\n};\n`,\n\n healthcheck: `export const task = {\n interval: 60000,\n execute: async (client) => {\n console.log('[Task] Healthcheck completed.');\n }\n};\n`\n};\n","export const cjsTemplates = {\n index: `const { DJSNextClient, GatewayIntentBits } = require('djs-next');\nrequire('dotenv/config');\n\nconst client = new DJSNextClient({\n intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages],\n commandsDir: './src/commands',\n eventsDir: './src/events',\n componentsDir: './src/components',\n tasksDir: './src/tasks',\n clientId: process.env.CLIENT_ID\n});\n\nclient.start(process.env.DISCORD_TOKEN);\n`,\n\n ping: `module.exports = {\n command: {\n description: 'Replies with Pong!',\n execute: async (interaction) => {\n await interaction.reply('Pong!');\n }\n }\n};\n`,\n\n ready: `const { Events } = require('djs-next');\n\nmodule.exports = {\n event: {\n name: Events.ClientReady,\n once: true,\n execute: (client) => {\n console.log('Ready! Logged in as ' + client.user?.tag);\n }\n }\n};\n`,\n\n healthcheck: `module.exports = {\n task: {\n interval: 60000,\n execute: async (client) => {\n console.log('[Task] Healthcheck completed.');\n }\n }\n};\n`\n};\n"],"mappings":"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","names":["pc","path","fs"]}
|
package/dist/cli.mjs
DELETED
|
@@ -1,321 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
// src/cli.ts
|
|
4
|
-
import fs from "fs";
|
|
5
|
-
import path from "path";
|
|
6
|
-
import { input, select, password } from "@inquirer/prompts";
|
|
7
|
-
|
|
8
|
-
// src/templates/ts.ts
|
|
9
|
-
var tsTemplates = {
|
|
10
|
-
index: `import { DJSNextClient, GatewayIntentBits } from 'djs-next';
|
|
11
|
-
import 'dotenv/config';
|
|
12
|
-
|
|
13
|
-
const client = new DJSNextClient({
|
|
14
|
-
intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages],
|
|
15
|
-
commandsDir: './src/commands',
|
|
16
|
-
eventsDir: './src/events',
|
|
17
|
-
componentsDir: './src/components',
|
|
18
|
-
tasksDir: './src/tasks',
|
|
19
|
-
clientId: process.env.CLIENT_ID
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
client.start(process.env.DISCORD_TOKEN!);
|
|
23
|
-
`,
|
|
24
|
-
ping: `import { FileCommand } from 'djs-next';
|
|
25
|
-
|
|
26
|
-
export const command: FileCommand = {
|
|
27
|
-
description: 'Replies with Pong!',
|
|
28
|
-
execute: async (interaction) => {
|
|
29
|
-
await interaction.reply('Pong!');
|
|
30
|
-
}
|
|
31
|
-
};
|
|
32
|
-
`,
|
|
33
|
-
ready: `import { DJSNextEvent, Events } from 'djs-next';
|
|
34
|
-
|
|
35
|
-
export const event: DJSNextEvent<Events.ClientReady> = {
|
|
36
|
-
name: Events.ClientReady,
|
|
37
|
-
once: true,
|
|
38
|
-
execute: (client) => {
|
|
39
|
-
console.log('Ready! Logged in as ' + client.user?.tag);
|
|
40
|
-
}
|
|
41
|
-
};
|
|
42
|
-
`,
|
|
43
|
-
healthcheck: `import { FileTask } from 'djs-next';
|
|
44
|
-
|
|
45
|
-
export const task: FileTask = {
|
|
46
|
-
interval: 60000,
|
|
47
|
-
execute: async (client) => {
|
|
48
|
-
console.log('[Task] Healthcheck completed.');
|
|
49
|
-
}
|
|
50
|
-
};
|
|
51
|
-
`
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
// src/templates/esm.ts
|
|
55
|
-
var esmTemplates = {
|
|
56
|
-
index: `import { DJSNextClient, GatewayIntentBits } from 'djs-next';
|
|
57
|
-
import 'dotenv/config';
|
|
58
|
-
|
|
59
|
-
const client = new DJSNextClient({
|
|
60
|
-
intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages],
|
|
61
|
-
commandsDir: './src/commands',
|
|
62
|
-
eventsDir: './src/events',
|
|
63
|
-
componentsDir: './src/components',
|
|
64
|
-
tasksDir: './src/tasks',
|
|
65
|
-
clientId: process.env.CLIENT_ID
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
client.start(process.env.DISCORD_TOKEN);
|
|
69
|
-
`,
|
|
70
|
-
ping: `export const command = {
|
|
71
|
-
description: 'Replies with Pong!',
|
|
72
|
-
execute: async (interaction) => {
|
|
73
|
-
await interaction.reply('Pong!');
|
|
74
|
-
}
|
|
75
|
-
};
|
|
76
|
-
`,
|
|
77
|
-
ready: `import { Events } from 'djs-next';
|
|
78
|
-
|
|
79
|
-
export const event = {
|
|
80
|
-
name: Events.ClientReady,
|
|
81
|
-
once: true,
|
|
82
|
-
execute: (client) => {
|
|
83
|
-
console.log('Ready! Logged in as ' + client.user?.tag);
|
|
84
|
-
}
|
|
85
|
-
};
|
|
86
|
-
`,
|
|
87
|
-
healthcheck: `export const task = {
|
|
88
|
-
interval: 60000,
|
|
89
|
-
execute: async (client) => {
|
|
90
|
-
console.log('[Task] Healthcheck completed.');
|
|
91
|
-
}
|
|
92
|
-
};
|
|
93
|
-
`
|
|
94
|
-
};
|
|
95
|
-
|
|
96
|
-
// src/templates/cjs.ts
|
|
97
|
-
var cjsTemplates = {
|
|
98
|
-
index: `const { DJSNextClient, GatewayIntentBits } = require('djs-next');
|
|
99
|
-
require('dotenv/config');
|
|
100
|
-
|
|
101
|
-
const client = new DJSNextClient({
|
|
102
|
-
intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages],
|
|
103
|
-
commandsDir: './src/commands',
|
|
104
|
-
eventsDir: './src/events',
|
|
105
|
-
componentsDir: './src/components',
|
|
106
|
-
tasksDir: './src/tasks',
|
|
107
|
-
clientId: process.env.CLIENT_ID
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
client.start(process.env.DISCORD_TOKEN);
|
|
111
|
-
`,
|
|
112
|
-
ping: `module.exports = {
|
|
113
|
-
command: {
|
|
114
|
-
description: 'Replies with Pong!',
|
|
115
|
-
execute: async (interaction) => {
|
|
116
|
-
await interaction.reply('Pong!');
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
};
|
|
120
|
-
`,
|
|
121
|
-
ready: `const { Events } = require('djs-next');
|
|
122
|
-
|
|
123
|
-
module.exports = {
|
|
124
|
-
event: {
|
|
125
|
-
name: Events.ClientReady,
|
|
126
|
-
once: true,
|
|
127
|
-
execute: (client) => {
|
|
128
|
-
console.log('Ready! Logged in as ' + client.user?.tag);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
};
|
|
132
|
-
`,
|
|
133
|
-
healthcheck: `module.exports = {
|
|
134
|
-
task: {
|
|
135
|
-
interval: 60000,
|
|
136
|
-
execute: async (client) => {
|
|
137
|
-
console.log('[Task] Healthcheck completed.');
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
};
|
|
141
|
-
`
|
|
142
|
-
};
|
|
143
|
-
|
|
144
|
-
// src/cli.ts
|
|
145
|
-
import pc from "picocolors";
|
|
146
|
-
import { execSync } from "child_process";
|
|
147
|
-
async function main() {
|
|
148
|
-
console.log(pc.bold(pc.blue("\n\u{1F680} Welcome to djs-next!\n")));
|
|
149
|
-
const userAgent = process.env.npm_config_user_agent || "";
|
|
150
|
-
let pm = "npm";
|
|
151
|
-
if (userAgent.startsWith("yarn")) pm = "yarn";
|
|
152
|
-
else if (userAgent.startsWith("pnpm")) pm = "pnpm";
|
|
153
|
-
else if (userAgent.startsWith("bun")) pm = "bun";
|
|
154
|
-
const args = process.argv.slice(2);
|
|
155
|
-
let projectName = args[0] || "";
|
|
156
|
-
if (!projectName || projectName === "init") {
|
|
157
|
-
projectName = await input({
|
|
158
|
-
message: "What is your project named?",
|
|
159
|
-
default: "my-bot",
|
|
160
|
-
validate: (value) => value.trim().length > 0 || "Project name is required"
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
const language = await select({
|
|
164
|
-
message: "Would you like to use TypeScript or JavaScript?",
|
|
165
|
-
choices: [
|
|
166
|
-
{ name: "TypeScript", value: "ts" },
|
|
167
|
-
{ name: "JavaScript", value: "js" }
|
|
168
|
-
],
|
|
169
|
-
default: "ts"
|
|
170
|
-
});
|
|
171
|
-
const moduleSystem = await select({
|
|
172
|
-
message: "Would you like to use ES Modules or CommonJS?",
|
|
173
|
-
choices: [
|
|
174
|
-
{ name: "ES Modules (import/export)", value: "esm" },
|
|
175
|
-
{ name: "CommonJS (require/module.exports)", value: "cjs" }
|
|
176
|
-
],
|
|
177
|
-
default: "esm"
|
|
178
|
-
});
|
|
179
|
-
const botToken = await password({
|
|
180
|
-
message: "What is your Discord Bot Token? (Leave empty to skip)",
|
|
181
|
-
mask: true
|
|
182
|
-
});
|
|
183
|
-
const clientId = await input({
|
|
184
|
-
message: "What is your Discord Client ID? (Leave empty to skip)"
|
|
185
|
-
});
|
|
186
|
-
const targetPath = path.resolve(process.cwd(), projectName);
|
|
187
|
-
if (fs.existsSync(targetPath)) {
|
|
188
|
-
console.error(pc.red(`
|
|
189
|
-
Directory "${projectName}" already exists.`));
|
|
190
|
-
process.exit(1);
|
|
191
|
-
}
|
|
192
|
-
console.log(pc.cyan(`
|
|
193
|
-
Scaffolding project in ${targetPath}...`));
|
|
194
|
-
fs.mkdirSync(targetPath, { recursive: true });
|
|
195
|
-
const isTS = language === "ts";
|
|
196
|
-
const isESM = moduleSystem === "esm";
|
|
197
|
-
const ext = isTS ? "ts" : "js";
|
|
198
|
-
let devScript = isTS ? "tsx watch src/index.ts" : "node --watch src/index.js";
|
|
199
|
-
let startScript = isTS ? "node dist/index.js" : "node src/index.js";
|
|
200
|
-
if (pm === "bun") {
|
|
201
|
-
devScript = `bun run --watch src/index.${ext}`;
|
|
202
|
-
startScript = `bun src/index.${ext}`;
|
|
203
|
-
}
|
|
204
|
-
const packageJson = {
|
|
205
|
-
name: projectName.toLowerCase().replace(/\\s+/g, "-"),
|
|
206
|
-
version: "1.0.0",
|
|
207
|
-
main: isTS ? "dist/index.js" : "src/index.js",
|
|
208
|
-
type: isESM ? "module" : "commonjs",
|
|
209
|
-
scripts: {
|
|
210
|
-
"dev": devScript,
|
|
211
|
-
"start": startScript
|
|
212
|
-
},
|
|
213
|
-
dependencies: {
|
|
214
|
-
"discord.js": "latest",
|
|
215
|
-
"djs-next": "latest",
|
|
216
|
-
"dotenv": "latest"
|
|
217
|
-
},
|
|
218
|
-
devDependencies: {}
|
|
219
|
-
};
|
|
220
|
-
if (isTS) {
|
|
221
|
-
packageJson.scripts.build = "tsc";
|
|
222
|
-
packageJson.devDependencies = {
|
|
223
|
-
"typescript": "latest",
|
|
224
|
-
"@types/node": "latest",
|
|
225
|
-
"tsx": "latest"
|
|
226
|
-
};
|
|
227
|
-
}
|
|
228
|
-
fs.writeFileSync(path.join(targetPath, "package.json"), JSON.stringify(packageJson, null, 2));
|
|
229
|
-
if (isTS) {
|
|
230
|
-
const tsconfig = {
|
|
231
|
-
compilerOptions: {
|
|
232
|
-
target: "ES2022",
|
|
233
|
-
module: isESM ? "NodeNext" : "CommonJS",
|
|
234
|
-
moduleResolution: isESM ? "NodeNext" : "Node",
|
|
235
|
-
strict: true,
|
|
236
|
-
esModuleInterop: true,
|
|
237
|
-
outDir: "./dist",
|
|
238
|
-
types: ["node"],
|
|
239
|
-
ignoreDeprecations: "5.0"
|
|
240
|
-
},
|
|
241
|
-
include: ["src/**/*"]
|
|
242
|
-
};
|
|
243
|
-
fs.writeFileSync(path.join(targetPath, "tsconfig.json"), JSON.stringify(tsconfig, null, 2));
|
|
244
|
-
}
|
|
245
|
-
fs.writeFileSync(path.join(targetPath, ".env"), `DISCORD_TOKEN=${botToken || "your_token_here"}
|
|
246
|
-
CLIENT_ID=${clientId || "your_client_id_here"}
|
|
247
|
-
`);
|
|
248
|
-
fs.writeFileSync(path.join(targetPath, ".gitignore"), `node_modules/
|
|
249
|
-
dist/
|
|
250
|
-
.env
|
|
251
|
-
.DS_Store
|
|
252
|
-
`);
|
|
253
|
-
const srcDir = path.join(targetPath, "src");
|
|
254
|
-
fs.mkdirSync(srcDir, { recursive: true });
|
|
255
|
-
fs.mkdirSync(path.join(srcDir, "commands"), { recursive: true });
|
|
256
|
-
fs.mkdirSync(path.join(srcDir, "events"), { recursive: true });
|
|
257
|
-
fs.mkdirSync(path.join(srcDir, "components", "buttons"), { recursive: true });
|
|
258
|
-
fs.mkdirSync(path.join(srcDir, "tasks"), { recursive: true });
|
|
259
|
-
if (isTS) {
|
|
260
|
-
fs.writeFileSync(path.join(srcDir, `index.${ext}`), tsTemplates.index);
|
|
261
|
-
} else if (isESM) {
|
|
262
|
-
fs.writeFileSync(path.join(srcDir, `index.${ext}`), esmTemplates.index);
|
|
263
|
-
} else {
|
|
264
|
-
fs.writeFileSync(path.join(srcDir, "index.js"), cjsTemplates.index);
|
|
265
|
-
}
|
|
266
|
-
if (isTS) {
|
|
267
|
-
fs.writeFileSync(path.join(srcDir, "commands", "ping.ts"), tsTemplates.ping);
|
|
268
|
-
} else if (isESM) {
|
|
269
|
-
fs.writeFileSync(path.join(srcDir, "commands", "ping.js"), esmTemplates.ping);
|
|
270
|
-
} else {
|
|
271
|
-
fs.writeFileSync(path.join(srcDir, "commands", "ping.js"), cjsTemplates.ping);
|
|
272
|
-
}
|
|
273
|
-
if (isTS) {
|
|
274
|
-
fs.writeFileSync(path.join(srcDir, "events", "ready.ts"), tsTemplates.ready);
|
|
275
|
-
} else if (isESM) {
|
|
276
|
-
fs.writeFileSync(path.join(srcDir, "events", "ready.js"), esmTemplates.ready);
|
|
277
|
-
} else {
|
|
278
|
-
fs.writeFileSync(path.join(srcDir, "events", "ready.js"), cjsTemplates.ready);
|
|
279
|
-
}
|
|
280
|
-
if (isTS) {
|
|
281
|
-
fs.writeFileSync(path.join(srcDir, "tasks", "healthcheck.ts"), tsTemplates.healthcheck);
|
|
282
|
-
} else if (isESM) {
|
|
283
|
-
fs.writeFileSync(path.join(srcDir, "tasks", "healthcheck.js"), esmTemplates.healthcheck);
|
|
284
|
-
} else {
|
|
285
|
-
fs.writeFileSync(path.join(srcDir, "tasks", "healthcheck.js"), cjsTemplates.healthcheck);
|
|
286
|
-
}
|
|
287
|
-
console.log(pc.cyan(`
|
|
288
|
-
Installing dependencies with ${pm}...`));
|
|
289
|
-
try {
|
|
290
|
-
execSync(`${pm} install`, { cwd: targetPath, stdio: "inherit" });
|
|
291
|
-
} catch (error) {
|
|
292
|
-
console.error(pc.red(`
|
|
293
|
-
Failed to install dependencies. Please run '${pm} install' manually.`));
|
|
294
|
-
}
|
|
295
|
-
console.log(pc.green(pc.bold(`
|
|
296
|
-
Success! Created ${projectName} at ${targetPath}`)));
|
|
297
|
-
console.log(`
|
|
298
|
-
Inside that directory, you can run several commands:`);
|
|
299
|
-
console.log(pc.cyan(`
|
|
300
|
-
${pm} run dev`));
|
|
301
|
-
console.log(` Starts the development server with hot-reloading.`);
|
|
302
|
-
if (isTS) {
|
|
303
|
-
console.log(pc.cyan(`
|
|
304
|
-
${pm} run build`));
|
|
305
|
-
console.log(` Compiles the TypeScript app into JavaScript.`);
|
|
306
|
-
}
|
|
307
|
-
console.log(pc.cyan(`
|
|
308
|
-
${pm} start`));
|
|
309
|
-
console.log(` Starts the production server.`);
|
|
310
|
-
console.log(`
|
|
311
|
-
We suggest that you begin by typing:
|
|
312
|
-
`);
|
|
313
|
-
console.log(pc.cyan(` cd ${projectName}`));
|
|
314
|
-
console.log(pc.cyan(` ${pm} run dev
|
|
315
|
-
`));
|
|
316
|
-
}
|
|
317
|
-
main().catch((err) => {
|
|
318
|
-
console.error(pc.red("An unexpected error occurred:"), err);
|
|
319
|
-
process.exit(1);
|
|
320
|
-
});
|
|
321
|
-
//# sourceMappingURL=cli.mjs.map
|
package/dist/cli.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/templates/ts.ts","../src/templates/esm.ts","../src/templates/cjs.ts"],"sourcesContent":["#!/usr/bin/env node\nimport fs from 'fs';\nimport path from 'path';\nimport { input, select, password } from '@inquirer/prompts';\nimport { spawnSync } from 'child_process';\nimport { tsTemplates } from './templates/ts.js';\nimport { esmTemplates } from './templates/esm.js';\nimport { cjsTemplates } from './templates/cjs.js';\nimport pc from 'picocolors';\nimport { execSync } from 'child_process';\n\nasync function main() {\n console.log(pc.bold(pc.blue('\\nš Welcome to djs-next!\\n')));\n\n const userAgent = process.env.npm_config_user_agent || '';\n let pm = 'npm';\n if (userAgent.startsWith('yarn')) pm = 'yarn';\n else if (userAgent.startsWith('pnpm')) pm = 'pnpm';\n else if (userAgent.startsWith('bun')) pm = 'bun';\n\n const args = process.argv.slice(2);\n let projectName = args[0] || '';\n\n if (!projectName || projectName === 'init') {\n projectName = await input({\n message: 'What is your project named?',\n default: 'my-bot',\n validate: (value) => value.trim().length > 0 || 'Project name is required'\n });\n }\n\n const language = await select({\n message: 'Would you like to use TypeScript or JavaScript?',\n choices: [\n { name: 'TypeScript', value: 'ts' },\n { name: 'JavaScript', value: 'js' }\n ],\n default: 'ts'\n });\n\n const moduleSystem = await select({\n message: 'Would you like to use ES Modules or CommonJS?',\n choices: [\n { name: 'ES Modules (import/export)', value: 'esm' },\n { name: 'CommonJS (require/module.exports)', value: 'cjs' }\n ],\n default: 'esm'\n });\n\n const botToken = await password({\n message: 'What is your Discord Bot Token? (Leave empty to skip)',\n mask: true\n });\n\n const clientId = await input({\n message: 'What is your Discord Client ID? (Leave empty to skip)'\n });\n\n const targetPath = path.resolve(process.cwd(), projectName);\n\n if (fs.existsSync(targetPath)) {\n console.error(pc.red(`\\nDirectory \"${projectName}\" already exists.`));\n process.exit(1);\n }\n\n console.log(pc.cyan(`\\nScaffolding project in ${targetPath}...`));\n fs.mkdirSync(targetPath, { recursive: true });\n\n const isTS = language === 'ts';\n const isESM = moduleSystem === 'esm';\n const ext = isTS ? 'ts' : 'js';\n\n let devScript = isTS ? \"tsx watch src/index.ts\" : \"node --watch src/index.js\";\n let startScript = isTS ? \"node dist/index.js\" : \"node src/index.js\";\n \n if (pm === 'bun') {\n devScript = `bun run --watch src/index.${ext}`;\n startScript = `bun src/index.${ext}`;\n }\n\n const packageJson: any = {\n name: projectName.toLowerCase().replace(/\\\\s+/g, '-'),\n version: \"1.0.0\",\n main: isTS ? \"dist/index.js\" : \"src/index.js\",\n type: isESM ? \"module\" : \"commonjs\",\n scripts: {\n \"dev\": devScript,\n \"start\": startScript\n },\n dependencies: {\n \"discord.js\": \"latest\",\n \"djs-next\": \"latest\",\n \"dotenv\": \"latest\"\n },\n devDependencies: {}\n };\n\n if (isTS) {\n packageJson.scripts.build = \"tsc\";\n packageJson.devDependencies = {\n \"typescript\": \"latest\",\n \"@types/node\": \"latest\",\n \"tsx\": \"latest\"\n };\n }\n\n fs.writeFileSync(path.join(targetPath, 'package.json'), JSON.stringify(packageJson, null, 2));\n\n if (isTS) {\n const tsconfig = {\n compilerOptions: {\n target: \"ES2022\",\n module: isESM ? \"NodeNext\" : \"CommonJS\",\n moduleResolution: isESM ? \"NodeNext\" : \"Node\",\n strict: true,\n esModuleInterop: true,\n outDir: \"./dist\",\n types: [\"node\"],\n ignoreDeprecations: \"5.0\"\n },\n include: [\"src/**/*\"]\n };\n fs.writeFileSync(path.join(targetPath, 'tsconfig.json'), JSON.stringify(tsconfig, null, 2));\n }\n\n fs.writeFileSync(path.join(targetPath, '.env'), `DISCORD_TOKEN=${botToken || 'your_token_here'}\nCLIENT_ID=${clientId || 'your_client_id_here'}\n`);\n fs.writeFileSync(path.join(targetPath, '.gitignore'), `node_modules/\ndist/\n.env\n.DS_Store\n`);\n\n const srcDir = path.join(targetPath, 'src');\n fs.mkdirSync(srcDir, { recursive: true });\n fs.mkdirSync(path.join(srcDir, 'commands'), { recursive: true });\n fs.mkdirSync(path.join(srcDir, 'events'), { recursive: true });\n fs.mkdirSync(path.join(srcDir, 'components', 'buttons'), { recursive: true });\n fs.mkdirSync(path.join(srcDir, 'tasks'), { recursive: true });\n\n // Index File\n if (isTS) {\n fs.writeFileSync(path.join(srcDir, `index.${ext}`), tsTemplates.index);\n } else if (isESM) {\n fs.writeFileSync(path.join(srcDir, `index.${ext}`), esmTemplates.index);\n } else {\n fs.writeFileSync(path.join(srcDir, 'index.js'), cjsTemplates.index);\n }\n\n // Ping Command\n if (isTS) {\n fs.writeFileSync(path.join(srcDir, 'commands', 'ping.ts'), tsTemplates.ping);\n } else if (isESM) {\n fs.writeFileSync(path.join(srcDir, 'commands', 'ping.js'), esmTemplates.ping);\n } else {\n fs.writeFileSync(path.join(srcDir, 'commands', 'ping.js'), cjsTemplates.ping);\n }\n\n // Ready Event\n if (isTS) {\n fs.writeFileSync(path.join(srcDir, 'events', 'ready.ts'), tsTemplates.ready);\n } else if (isESM) {\n fs.writeFileSync(path.join(srcDir, 'events', 'ready.js'), esmTemplates.ready);\n } else {\n fs.writeFileSync(path.join(srcDir, 'events', 'ready.js'), cjsTemplates.ready);\n }\n\n // Healthcheck Task\n if (isTS) {\n fs.writeFileSync(path.join(srcDir, 'tasks', 'healthcheck.ts'), tsTemplates.healthcheck);\n } else if (isESM) {\n fs.writeFileSync(path.join(srcDir, 'tasks', 'healthcheck.js'), esmTemplates.healthcheck);\n } else {\n fs.writeFileSync(path.join(srcDir, 'tasks', 'healthcheck.js'), cjsTemplates.healthcheck);\n }\n\n console.log(pc.cyan(`\\nInstalling dependencies with ${pm}...`));\n try {\n execSync(`${pm} install`, { cwd: targetPath, stdio: 'inherit' });\n } catch (error) {\n console.error(pc.red(`\\nFailed to install dependencies. Please run '${pm} install' manually.`));\n }\n\n console.log(pc.green(pc.bold(`\\nSuccess! Created ${projectName} at ${targetPath}`)));\n console.log(`\\nInside that directory, you can run several commands:`);\n console.log(pc.cyan(`\\n ${pm} run dev`));\n console.log(` Starts the development server with hot-reloading.`);\n if (isTS) {\n console.log(pc.cyan(`\\n ${pm} run build`));\n console.log(` Compiles the TypeScript app into JavaScript.`);\n }\n console.log(pc.cyan(`\\n ${pm} start`));\n console.log(` Starts the production server.`);\n console.log(`\\nWe suggest that you begin by typing:\\n`);\n console.log(pc.cyan(` cd ${projectName}`));\n console.log(pc.cyan(` ${pm} run dev\\n`));\n}\n\nmain().catch((err) => {\n console.error(pc.red('An unexpected error occurred:'), err);\n process.exit(1);\n});\n","export const tsTemplates = {\n index: `import { DJSNextClient, GatewayIntentBits } from 'djs-next';\nimport 'dotenv/config';\n\nconst client = new DJSNextClient({\n intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages],\n commandsDir: './src/commands',\n eventsDir: './src/events',\n componentsDir: './src/components',\n tasksDir: './src/tasks',\n clientId: process.env.CLIENT_ID\n});\n\nclient.start(process.env.DISCORD_TOKEN!);\n`,\n\n ping: `import { FileCommand } from 'djs-next';\n\nexport const command: FileCommand = {\n description: 'Replies with Pong!',\n execute: async (interaction) => {\n await interaction.reply('Pong!');\n }\n};\n`,\n\n ready: `import { DJSNextEvent, Events } from 'djs-next';\n\nexport const event: DJSNextEvent<Events.ClientReady> = {\n name: Events.ClientReady,\n once: true,\n execute: (client) => {\n console.log('Ready! Logged in as ' + client.user?.tag);\n }\n};\n`,\n\n healthcheck: `import { FileTask } from 'djs-next';\n\nexport const task: FileTask = {\n interval: 60000,\n execute: async (client) => {\n console.log('[Task] Healthcheck completed.');\n }\n};\n`\n};\n","export const esmTemplates = {\n index: `import { DJSNextClient, GatewayIntentBits } from 'djs-next';\nimport 'dotenv/config';\n\nconst client = new DJSNextClient({\n intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages],\n commandsDir: './src/commands',\n eventsDir: './src/events',\n componentsDir: './src/components',\n tasksDir: './src/tasks',\n clientId: process.env.CLIENT_ID\n});\n\nclient.start(process.env.DISCORD_TOKEN);\n`,\n\n ping: `export const command = {\n description: 'Replies with Pong!',\n execute: async (interaction) => {\n await interaction.reply('Pong!');\n }\n};\n`,\n\n ready: `import { Events } from 'djs-next';\n\nexport const event = {\n name: Events.ClientReady,\n once: true,\n execute: (client) => {\n console.log('Ready! Logged in as ' + client.user?.tag);\n }\n};\n`,\n\n healthcheck: `export const task = {\n interval: 60000,\n execute: async (client) => {\n console.log('[Task] Healthcheck completed.');\n }\n};\n`\n};\n","export const cjsTemplates = {\n index: `const { DJSNextClient, GatewayIntentBits } = require('djs-next');\nrequire('dotenv/config');\n\nconst client = new DJSNextClient({\n intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages],\n commandsDir: './src/commands',\n eventsDir: './src/events',\n componentsDir: './src/components',\n tasksDir: './src/tasks',\n clientId: process.env.CLIENT_ID\n});\n\nclient.start(process.env.DISCORD_TOKEN);\n`,\n\n ping: `module.exports = {\n command: {\n description: 'Replies with Pong!',\n execute: async (interaction) => {\n await interaction.reply('Pong!');\n }\n }\n};\n`,\n\n ready: `const { Events } = require('djs-next');\n\nmodule.exports = {\n event: {\n name: Events.ClientReady,\n once: true,\n execute: (client) => {\n console.log('Ready! Logged in as ' + client.user?.tag);\n }\n }\n};\n`,\n\n healthcheck: `module.exports = {\n task: {\n interval: 60000,\n execute: async (client) => {\n console.log('[Task] Healthcheck completed.');\n }\n }\n};\n`\n};\n"],"mappings":"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","names":[]}
|
package/src/cli.ts
DELETED
|
@@ -1,203 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import fs from 'fs';
|
|
3
|
-
import path from 'path';
|
|
4
|
-
import { input, select, password } from '@inquirer/prompts';
|
|
5
|
-
import { spawnSync } from 'child_process';
|
|
6
|
-
import { tsTemplates } from './templates/ts.js';
|
|
7
|
-
import { esmTemplates } from './templates/esm.js';
|
|
8
|
-
import { cjsTemplates } from './templates/cjs.js';
|
|
9
|
-
import pc from 'picocolors';
|
|
10
|
-
import { execSync } from 'child_process';
|
|
11
|
-
|
|
12
|
-
async function main() {
|
|
13
|
-
console.log(pc.bold(pc.blue('\nš Welcome to djs-next!\n')));
|
|
14
|
-
|
|
15
|
-
const userAgent = process.env.npm_config_user_agent || '';
|
|
16
|
-
let pm = 'npm';
|
|
17
|
-
if (userAgent.startsWith('yarn')) pm = 'yarn';
|
|
18
|
-
else if (userAgent.startsWith('pnpm')) pm = 'pnpm';
|
|
19
|
-
else if (userAgent.startsWith('bun')) pm = 'bun';
|
|
20
|
-
|
|
21
|
-
const args = process.argv.slice(2);
|
|
22
|
-
let projectName = args[0] || '';
|
|
23
|
-
|
|
24
|
-
if (!projectName || projectName === 'init') {
|
|
25
|
-
projectName = await input({
|
|
26
|
-
message: 'What is your project named?',
|
|
27
|
-
default: 'my-bot',
|
|
28
|
-
validate: (value) => value.trim().length > 0 || 'Project name is required'
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
const language = await select({
|
|
33
|
-
message: 'Would you like to use TypeScript or JavaScript?',
|
|
34
|
-
choices: [
|
|
35
|
-
{ name: 'TypeScript', value: 'ts' },
|
|
36
|
-
{ name: 'JavaScript', value: 'js' }
|
|
37
|
-
],
|
|
38
|
-
default: 'ts'
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
const moduleSystem = await select({
|
|
42
|
-
message: 'Would you like to use ES Modules or CommonJS?',
|
|
43
|
-
choices: [
|
|
44
|
-
{ name: 'ES Modules (import/export)', value: 'esm' },
|
|
45
|
-
{ name: 'CommonJS (require/module.exports)', value: 'cjs' }
|
|
46
|
-
],
|
|
47
|
-
default: 'esm'
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
const botToken = await password({
|
|
51
|
-
message: 'What is your Discord Bot Token? (Leave empty to skip)',
|
|
52
|
-
mask: true
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
const clientId = await input({
|
|
56
|
-
message: 'What is your Discord Client ID? (Leave empty to skip)'
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
const targetPath = path.resolve(process.cwd(), projectName);
|
|
60
|
-
|
|
61
|
-
if (fs.existsSync(targetPath)) {
|
|
62
|
-
console.error(pc.red(`\nDirectory "${projectName}" already exists.`));
|
|
63
|
-
process.exit(1);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
console.log(pc.cyan(`\nScaffolding project in ${targetPath}...`));
|
|
67
|
-
fs.mkdirSync(targetPath, { recursive: true });
|
|
68
|
-
|
|
69
|
-
const isTS = language === 'ts';
|
|
70
|
-
const isESM = moduleSystem === 'esm';
|
|
71
|
-
const ext = isTS ? 'ts' : 'js';
|
|
72
|
-
|
|
73
|
-
let devScript = isTS ? "tsx watch src/index.ts" : "node --watch src/index.js";
|
|
74
|
-
let startScript = isTS ? "node dist/index.js" : "node src/index.js";
|
|
75
|
-
|
|
76
|
-
if (pm === 'bun') {
|
|
77
|
-
devScript = `bun run --watch src/index.${ext}`;
|
|
78
|
-
startScript = `bun src/index.${ext}`;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
const packageJson: any = {
|
|
82
|
-
name: projectName.toLowerCase().replace(/\\s+/g, '-'),
|
|
83
|
-
version: "1.0.0",
|
|
84
|
-
main: isTS ? "dist/index.js" : "src/index.js",
|
|
85
|
-
type: isESM ? "module" : "commonjs",
|
|
86
|
-
scripts: {
|
|
87
|
-
"dev": devScript,
|
|
88
|
-
"start": startScript
|
|
89
|
-
},
|
|
90
|
-
dependencies: {
|
|
91
|
-
"discord.js": "latest",
|
|
92
|
-
"djs-next": "latest",
|
|
93
|
-
"dotenv": "latest"
|
|
94
|
-
},
|
|
95
|
-
devDependencies: {}
|
|
96
|
-
};
|
|
97
|
-
|
|
98
|
-
if (isTS) {
|
|
99
|
-
packageJson.scripts.build = "tsc";
|
|
100
|
-
packageJson.devDependencies = {
|
|
101
|
-
"typescript": "latest",
|
|
102
|
-
"@types/node": "latest",
|
|
103
|
-
"tsx": "latest"
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
fs.writeFileSync(path.join(targetPath, 'package.json'), JSON.stringify(packageJson, null, 2));
|
|
108
|
-
|
|
109
|
-
if (isTS) {
|
|
110
|
-
const tsconfig = {
|
|
111
|
-
compilerOptions: {
|
|
112
|
-
target: "ES2022",
|
|
113
|
-
module: isESM ? "NodeNext" : "CommonJS",
|
|
114
|
-
moduleResolution: isESM ? "NodeNext" : "Node",
|
|
115
|
-
strict: true,
|
|
116
|
-
esModuleInterop: true,
|
|
117
|
-
outDir: "./dist",
|
|
118
|
-
types: ["node"],
|
|
119
|
-
ignoreDeprecations: "5.0"
|
|
120
|
-
},
|
|
121
|
-
include: ["src/**/*"]
|
|
122
|
-
};
|
|
123
|
-
fs.writeFileSync(path.join(targetPath, 'tsconfig.json'), JSON.stringify(tsconfig, null, 2));
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
fs.writeFileSync(path.join(targetPath, '.env'), `DISCORD_TOKEN=${botToken || 'your_token_here'}
|
|
127
|
-
CLIENT_ID=${clientId || 'your_client_id_here'}
|
|
128
|
-
`);
|
|
129
|
-
fs.writeFileSync(path.join(targetPath, '.gitignore'), `node_modules/
|
|
130
|
-
dist/
|
|
131
|
-
.env
|
|
132
|
-
.DS_Store
|
|
133
|
-
`);
|
|
134
|
-
|
|
135
|
-
const srcDir = path.join(targetPath, 'src');
|
|
136
|
-
fs.mkdirSync(srcDir, { recursive: true });
|
|
137
|
-
fs.mkdirSync(path.join(srcDir, 'commands'), { recursive: true });
|
|
138
|
-
fs.mkdirSync(path.join(srcDir, 'events'), { recursive: true });
|
|
139
|
-
fs.mkdirSync(path.join(srcDir, 'components', 'buttons'), { recursive: true });
|
|
140
|
-
fs.mkdirSync(path.join(srcDir, 'tasks'), { recursive: true });
|
|
141
|
-
|
|
142
|
-
// Index File
|
|
143
|
-
if (isTS) {
|
|
144
|
-
fs.writeFileSync(path.join(srcDir, `index.${ext}`), tsTemplates.index);
|
|
145
|
-
} else if (isESM) {
|
|
146
|
-
fs.writeFileSync(path.join(srcDir, `index.${ext}`), esmTemplates.index);
|
|
147
|
-
} else {
|
|
148
|
-
fs.writeFileSync(path.join(srcDir, 'index.js'), cjsTemplates.index);
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
// Ping Command
|
|
152
|
-
if (isTS) {
|
|
153
|
-
fs.writeFileSync(path.join(srcDir, 'commands', 'ping.ts'), tsTemplates.ping);
|
|
154
|
-
} else if (isESM) {
|
|
155
|
-
fs.writeFileSync(path.join(srcDir, 'commands', 'ping.js'), esmTemplates.ping);
|
|
156
|
-
} else {
|
|
157
|
-
fs.writeFileSync(path.join(srcDir, 'commands', 'ping.js'), cjsTemplates.ping);
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
// Ready Event
|
|
161
|
-
if (isTS) {
|
|
162
|
-
fs.writeFileSync(path.join(srcDir, 'events', 'ready.ts'), tsTemplates.ready);
|
|
163
|
-
} else if (isESM) {
|
|
164
|
-
fs.writeFileSync(path.join(srcDir, 'events', 'ready.js'), esmTemplates.ready);
|
|
165
|
-
} else {
|
|
166
|
-
fs.writeFileSync(path.join(srcDir, 'events', 'ready.js'), cjsTemplates.ready);
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
// Healthcheck Task
|
|
170
|
-
if (isTS) {
|
|
171
|
-
fs.writeFileSync(path.join(srcDir, 'tasks', 'healthcheck.ts'), tsTemplates.healthcheck);
|
|
172
|
-
} else if (isESM) {
|
|
173
|
-
fs.writeFileSync(path.join(srcDir, 'tasks', 'healthcheck.js'), esmTemplates.healthcheck);
|
|
174
|
-
} else {
|
|
175
|
-
fs.writeFileSync(path.join(srcDir, 'tasks', 'healthcheck.js'), cjsTemplates.healthcheck);
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
console.log(pc.cyan(`\nInstalling dependencies with ${pm}...`));
|
|
179
|
-
try {
|
|
180
|
-
execSync(`${pm} install`, { cwd: targetPath, stdio: 'inherit' });
|
|
181
|
-
} catch (error) {
|
|
182
|
-
console.error(pc.red(`\nFailed to install dependencies. Please run '${pm} install' manually.`));
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
console.log(pc.green(pc.bold(`\nSuccess! Created ${projectName} at ${targetPath}`)));
|
|
186
|
-
console.log(`\nInside that directory, you can run several commands:`);
|
|
187
|
-
console.log(pc.cyan(`\n ${pm} run dev`));
|
|
188
|
-
console.log(` Starts the development server with hot-reloading.`);
|
|
189
|
-
if (isTS) {
|
|
190
|
-
console.log(pc.cyan(`\n ${pm} run build`));
|
|
191
|
-
console.log(` Compiles the TypeScript app into JavaScript.`);
|
|
192
|
-
}
|
|
193
|
-
console.log(pc.cyan(`\n ${pm} start`));
|
|
194
|
-
console.log(` Starts the production server.`);
|
|
195
|
-
console.log(`\nWe suggest that you begin by typing:\n`);
|
|
196
|
-
console.log(pc.cyan(` cd ${projectName}`));
|
|
197
|
-
console.log(pc.cyan(` ${pm} run dev\n`));
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
main().catch((err) => {
|
|
201
|
-
console.error(pc.red('An unexpected error occurred:'), err);
|
|
202
|
-
process.exit(1);
|
|
203
|
-
});
|