reciple 10.0.1-dev.8 → 10.0.2
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.
- package/README.md +69 -0
- package/assets/config/reciple.config.js +7 -0
- package/assets/config/reciple.config.ts +5 -0
- package/assets/global/nodemon.json +1 -0
- package/assets/templates/javascript/jsconfig.json +4 -0
- package/assets/templates/typescript/tsconfig.json +4 -0
- package/dist/_virtual/{_@oxc-project_runtime@0.99.0 → _@oxc-project_runtime@0.110.0}/helpers/decorate.mjs +1 -1
- package/dist/bin/commands/build.mjs +1 -1
- package/dist/bin/commands/build.mjs.map +1 -1
- package/dist/bin/commands/create.mjs +3 -2
- package/dist/bin/commands/create.mjs.map +1 -1
- package/dist/bin/commands/createModule.mjs +2 -2
- package/dist/bin/commands/createModule.mjs.map +1 -1
- package/dist/bin/commands/start.mjs +27 -26
- package/dist/bin/commands/start.mjs.map +1 -1
- package/dist/bin/commands/startSharding.d.mts +18 -0
- package/dist/bin/commands/startSharding.mjs +101 -0
- package/dist/bin/commands/startSharding.mjs.map +1 -0
- package/dist/bin/reciple.mjs +0 -0
- package/dist/classes/cli/CLI.d.mts +1 -1
- package/dist/classes/cli/CLI.mjs +6 -5
- package/dist/classes/cli/CLI.mjs.map +1 -1
- package/dist/classes/cli/ConfigReader.d.mts +24 -29
- package/dist/classes/cli/ConfigReader.mjs +46 -61
- package/dist/classes/cli/ConfigReader.mjs.map +1 -1
- package/dist/classes/cli/RuntimeEnvironment.mjs +1 -1
- package/dist/classes/cli/RuntimeEnvironment.mjs.map +1 -1
- package/dist/classes/client/EventListeners.mjs +3 -2
- package/dist/classes/client/EventListeners.mjs.map +1 -1
- package/dist/classes/client/ModuleLoader.d.mts +3 -3
- package/dist/classes/client/ModuleLoader.mjs +27 -25
- package/dist/classes/client/ModuleLoader.mjs.map +1 -1
- package/dist/classes/managers/ModuleManager.mjs +5 -5
- package/dist/classes/managers/ModuleManager.mjs.map +1 -1
- package/dist/classes/modules/BaseModule.d.mts +0 -3
- package/dist/classes/modules/BaseModule.mjs +2 -4
- package/dist/classes/modules/BaseModule.mjs.map +1 -1
- package/dist/classes/modules/PostconditionModule.d.mts +1 -1
- package/dist/classes/modules/PostconditionModule.mjs +5 -5
- package/dist/classes/modules/PostconditionModule.mjs.map +1 -1
- package/dist/classes/modules/PreconditionModule.d.mts +1 -1
- package/dist/classes/modules/PreconditionModule.mjs +5 -5
- package/dist/classes/modules/PreconditionModule.mjs.map +1 -1
- package/dist/classes/modules/commands/ContextMenuCommandModule.d.mts +1 -1
- package/dist/classes/modules/commands/ContextMenuCommandModule.mjs +5 -5
- package/dist/classes/modules/commands/ContextMenuCommandModule.mjs.map +1 -1
- package/dist/classes/modules/commands/MessageCommandModule.d.mts +1 -1
- package/dist/classes/modules/commands/MessageCommandModule.mjs +5 -5
- package/dist/classes/modules/commands/MessageCommandModule.mjs.map +1 -1
- package/dist/classes/modules/commands/SlashCommandModule.d.mts +1 -1
- package/dist/classes/modules/commands/SlashCommandModule.mjs +5 -5
- package/dist/classes/modules/commands/SlashCommandModule.mjs.map +1 -1
- package/dist/classes/modules/events/EventModule.d.mts +3 -4
- package/dist/classes/modules/events/EventModule.mjs +3 -4
- package/dist/classes/modules/events/EventModule.mjs.map +1 -1
- package/dist/classes/templates/ModuleTemplateBuilder.d.mts +1 -1
- package/dist/classes/templates/ModuleTemplateBuilder.mjs +22 -22
- package/dist/classes/templates/ModuleTemplateBuilder.mjs.map +1 -1
- package/dist/classes/templates/TemplateBuilder.mjs +31 -27
- package/dist/classes/templates/TemplateBuilder.mjs.map +1 -1
- package/dist/classes/validation/BaseModuleValidator.d.mts +11 -11
- package/dist/classes/validation/CommandModuleValidator.d.mts +17 -17
- package/dist/classes/validation/EventModuleValidator.d.mts +28 -12
- package/dist/classes/validation/PostconditionModule.d.mts +9 -9
- package/dist/classes/validation/PreconditionModule.d.mts +7 -7
- package/dist/helpers/constants.d.mts +2 -4
- package/dist/helpers/constants.mjs +8 -8
- package/dist/helpers/constants.mjs.map +1 -1
- package/dist/helpers/types.d.mts +3 -1
- package/dist/index.d.mts +4 -5
- package/dist/index.mjs +3 -4
- package/dist/index.mjs.map +1 -1
- package/dist/package.mjs +18 -16
- package/dist/package.mjs.map +1 -1
- package/package.json +16 -14
- package/LICENSE +0 -155
package/README.md
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
<img src="https://i.imgur.com/C3gWxwc.png" width="50%">
|
|
3
|
+
<p align="center">
|
|
4
|
+
<b>A Discord.js framework that just works.</b>
|
|
5
|
+
</p>
|
|
6
|
+
<br>
|
|
7
|
+
</div>
|
|
8
|
+
|
|
9
|
+
<h3 align="center">
|
|
10
|
+
<a href="https://discord.gg/KxfPZYuTGV">
|
|
11
|
+
<img src="https://img.shields.io/discord/1453743492722458708?color=5865F2&logo=discord&logoColor=white">
|
|
12
|
+
</a>
|
|
13
|
+
<a href="https://npmjs.org/package/reciple">
|
|
14
|
+
<img src="https://img.shields.io/npm/v/reciple?label=npm">
|
|
15
|
+
</a>
|
|
16
|
+
<a href="https://github.com/reciplejs/reciple/tree/main/packages/reciple">
|
|
17
|
+
<img src="https://img.shields.io/npm/dt/reciple?maxAge=3600">
|
|
18
|
+
</a>
|
|
19
|
+
<a href="https://www.codefactor.io/repository/github/reciplejs/reciple">
|
|
20
|
+
<img src="https://www.codefactor.io/repository/github/reciplejs/reciple/badge">
|
|
21
|
+
</a>
|
|
22
|
+
<br>
|
|
23
|
+
<div style="padding-top: 1rem">
|
|
24
|
+
<a href="https://discord.gg/KxfPZYuTGV">
|
|
25
|
+
<img src="http://invidget.switchblade.xyz/KxfPZYuTGV">
|
|
26
|
+
</a>
|
|
27
|
+
</div>
|
|
28
|
+
</h3>
|
|
29
|
+
|
|
30
|
+
## About
|
|
31
|
+
|
|
32
|
+
`reciple` A Discord.js framework that just works.
|
|
33
|
+
|
|
34
|
+
## Help
|
|
35
|
+
```
|
|
36
|
+
Usage: reciple [options] [command]
|
|
37
|
+
|
|
38
|
+
The CLI for reciple
|
|
39
|
+
|
|
40
|
+
Options:
|
|
41
|
+
-v, --version Output the CLI version number
|
|
42
|
+
-D, --debug Enable debug mode (default: false)
|
|
43
|
+
--no-debug Disabled debug mode
|
|
44
|
+
--env <file> Load environment variables from .env file (default: [])
|
|
45
|
+
-h, --help display help for command
|
|
46
|
+
|
|
47
|
+
Commands:
|
|
48
|
+
build [options] Build the reciple modules defined in config file
|
|
49
|
+
create [options] [output] Create a new reciple project
|
|
50
|
+
start [options] Start the reciple client
|
|
51
|
+
help [command] display help for command
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Installation
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
npx reciple
|
|
58
|
+
yarn dlx reciple
|
|
59
|
+
pnpx reciple
|
|
60
|
+
bunx reciple
|
|
61
|
+
deno run -A npm:reciple
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Links
|
|
65
|
+
|
|
66
|
+
- [Website](https://reciple.js.org)
|
|
67
|
+
- [Discord](https://discord.gg/KxfPZYuTGV)
|
|
68
|
+
- [Github](https://github.com/reciplejs/reciple/tree/main/packages/reciple)
|
|
69
|
+
- [NPM](https://npmjs.org/package/reciple)
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Client, CommandType, CooldownAdapter, CooldownCommandPrecondition, MessageCommandFlagValidatePrecondition, MessageCommandOptionValidatePrecondition, type BuildConfig, type Config } from 'reciple';
|
|
2
|
+
import type { ShardingConfig } from '../../src/index.js';
|
|
2
3
|
|
|
3
4
|
export const client = new Client({
|
|
4
5
|
token: process.env.TOKEN,
|
|
@@ -78,3 +79,7 @@ export const build: BuildConfig = {
|
|
|
78
79
|
external: [],
|
|
79
80
|
noExternal: [],
|
|
80
81
|
};
|
|
82
|
+
|
|
83
|
+
export const sharding: ShardingConfig = {
|
|
84
|
+
mode: 'process',
|
|
85
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//#region \0@oxc-project+runtime@0.
|
|
1
|
+
//#region \0@oxc-project+runtime@0.110.0/helpers/decorate.js
|
|
2
2
|
function __decorate(decorators, target, key, desc) {
|
|
3
3
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
4
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
@@ -8,7 +8,7 @@ import { build } from "tsdown";
|
|
|
8
8
|
var BuildSubcommand = class extends CLISubcommand {
|
|
9
9
|
subcommand = new Command("build").description("Build the reciple modules defined in config file").option("-c, --config <path>", "Path to the configuration file");
|
|
10
10
|
async execute() {
|
|
11
|
-
const { build: buildConfig } = await new ConfigReader(this.subcommand.opts().config ?? await ConfigReader.
|
|
11
|
+
const { build: buildConfig } = await new ConfigReader(this.subcommand.opts().config ?? await ConfigReader.find() ?? ConfigReader.createConfigFilename("js")).read();
|
|
12
12
|
let plugins = buildConfig.plugins ? Array.isArray(buildConfig.plugins) ? buildConfig.plugins : [buildConfig.plugins] : [];
|
|
13
13
|
plugins.push(CLI.createTsdownLogger(this.cli.logger));
|
|
14
14
|
await build({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.mjs","names":[],"sources":["../../../src/bin/commands/build.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { CLISubcommand } from '../../classes/cli/CLISubcommand.js';\nimport { ConfigReader } from '../../classes/cli/ConfigReader.js';\nimport { build } from 'tsdown';\nimport { CLI } from '../../classes/cli/CLI.js';\n\nexport default class BuildSubcommand extends CLISubcommand {\n public subcommand: Command = new Command('build')\n .description('Build the reciple modules defined in config file')\n .option('-c, --config <path>', 'Path to the configuration file');\n\n public async execute(): Promise<void> {\n const flags = this.subcommand.opts<BuildSubcommand.Flags>();\n\n const configReader = new ConfigReader(\n flags.config\n ?? await ConfigReader.
|
|
1
|
+
{"version":3,"file":"build.mjs","names":[],"sources":["../../../src/bin/commands/build.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { CLISubcommand } from '../../classes/cli/CLISubcommand.js';\nimport { ConfigReader } from '../../classes/cli/ConfigReader.js';\nimport { build } from 'tsdown';\nimport { CLI } from '../../classes/cli/CLI.js';\n\nexport default class BuildSubcommand extends CLISubcommand {\n public subcommand: Command = new Command('build')\n .description('Build the reciple modules defined in config file')\n .option('-c, --config <path>', 'Path to the configuration file');\n\n public async execute(): Promise<void> {\n const flags = this.subcommand.opts<BuildSubcommand.Flags>();\n\n const configReader = new ConfigReader(\n flags.config\n ?? await ConfigReader.find()\n ?? ConfigReader.createConfigFilename('js')\n );\n\n const { build: buildConfig } = await configReader.read();\n\n let plugins = buildConfig.plugins\n ? Array.isArray(buildConfig.plugins)\n ? buildConfig.plugins\n : [buildConfig.plugins]\n : [];\n\n plugins.push(CLI.createTsdownLogger(this.cli.logger));\n\n await build({\n ...buildConfig,\n logLevel: 'silent',\n plugins,\n });\n }\n}\n\nexport namespace BuildSubcommand {\n export interface Flags {\n config?: string;\n }\n}\n"],"mappings":";;;;;;;AAMA,IAAqB,kBAArB,cAA6C,cAAc;CACvD,AAAO,aAAsB,IAAI,QAAQ,QAAQ,CAC5C,YAAY,mDAAmD,CAC/D,OAAO,uBAAuB,iCAAiC;CAEpE,MAAa,UAAyB;EASlC,MAAM,EAAE,OAAO,gBAAgB,MANV,IAAI,aAFX,KAAK,WAAW,MAA6B,CAGjD,UACH,MAAM,aAAa,MAAM,IACzB,aAAa,qBAAqB,KAAK,CAC7C,CAEiD,MAAM;EAExD,IAAI,UAAU,YAAY,UACpB,MAAM,QAAQ,YAAY,QAAQ,GAC9B,YAAY,UACZ,CAAC,YAAY,QAAQ,GACzB,EAAE;AAER,UAAQ,KAAK,IAAI,mBAAmB,KAAK,IAAI,OAAO,CAAC;AAErD,QAAM,MAAM;GACR,GAAG;GACH,UAAU;GACV;GACH,CAAC"}
|
|
@@ -2,8 +2,8 @@ import { NotAnError } from "../../classes/NotAnError.mjs";
|
|
|
2
2
|
import { CLISubcommand } from "../../classes/cli/CLISubcommand.mjs";
|
|
3
3
|
import { TemplateBuilder } from "../../classes/templates/TemplateBuilder.mjs";
|
|
4
4
|
import { Command, Option } from "commander";
|
|
5
|
-
import { colors } from "@reciple/utils";
|
|
6
5
|
import { cancel } from "@clack/prompts";
|
|
6
|
+
import { colors } from "@prtty/prtty";
|
|
7
7
|
import { inspect } from "node:util";
|
|
8
8
|
|
|
9
9
|
//#region src/bin/commands/create.ts
|
|
@@ -14,7 +14,7 @@ var CreateSubcommand = class extends CLISubcommand {
|
|
|
14
14
|
"pnpm",
|
|
15
15
|
"bun",
|
|
16
16
|
"deno"
|
|
17
|
-
])).option("-D, --default", "Use defaults for prompts").option("--install", "Install dependencies during setup", true).option("--build", "Build the project after creation", true).allowUnknownOption(true);
|
|
17
|
+
])).option("-D, --default", "Use defaults for prompts").option("--install", "Install dependencies during setup", true).option("--no-install", "Do not install dependencies during setup").option("--build", "Build the project after creation", true).option("--no-build", "Do not build the project after creation").allowUnknownOption(true);
|
|
18
18
|
async execute() {
|
|
19
19
|
const flags = this.cli.getFlags("create");
|
|
20
20
|
const template = new TemplateBuilder({
|
|
@@ -34,6 +34,7 @@ var CreateSubcommand = class extends CLISubcommand {
|
|
|
34
34
|
await template.createTemplate();
|
|
35
35
|
await template.setPackageManager();
|
|
36
36
|
await template.installDependencies({ value: flags?.install });
|
|
37
|
+
await template.createModules();
|
|
37
38
|
await template.build({ skipBuild: !flags?.build });
|
|
38
39
|
} catch (error) {
|
|
39
40
|
cancel(colors.red(error instanceof NotAnError ? error.message : inspect(error)));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.mjs","names":[],"sources":["../../../src/bin/commands/create.ts"],"sourcesContent":["import { Command, Option } from 'commander';\nimport { CLISubcommand } from '../../classes/cli/CLISubcommand.js';\nimport {
|
|
1
|
+
{"version":3,"file":"create.mjs","names":[],"sources":["../../../src/bin/commands/create.ts"],"sourcesContent":["import { Command, Option } from 'commander';\nimport { CLISubcommand } from '../../classes/cli/CLISubcommand.js';\nimport { TemplateBuilder } from '../../classes/templates/TemplateBuilder.js';\nimport { cancel } from '@clack/prompts';\nimport { inspect } from 'node:util';\nimport { NotAnError } from '../../classes/NotAnError.js';\nimport type { PackageManagerName } from 'nypm';\nimport { colors } from '@prtty/prtty';\n\nexport default class CreateSubcommand extends CLISubcommand {\n public subcommand: Command = new Command('create')\n .description('Create a new reciple project')\n .argument('[output]', 'The directory to create the project in')\n .option('-c, --config <path>', 'Path to the configuration file')\n .option('-t, --token <DiscordToken>', 'Set your Discord Bot token')\n .option('-T, --typescript', 'Use TypeScript')\n .addOption(new Option('-p, --package-manager <name>', 'The name of the package manager to use')\n .choices(['npm', 'yarn', 'pnpm', 'bun', 'deno'])\n )\n .option('-D, --default', 'Use defaults for prompts')\n .option('--install', 'Install dependencies during setup', true)\n .option('--no-install', 'Do not install dependencies during setup')\n .option('--build', 'Build the project after creation', true)\n .option('--no-build', 'Do not build the project after creation')\n .allowUnknownOption(true);\n\n public async execute(): Promise<void> {\n const flags = this.cli.getFlags<CreateSubcommand.Flags>('create');\n const template = new TemplateBuilder({\n cli: this.cli,\n directory: this.subcommand.args[0],\n typescript: flags?.typescript,\n packageManager: flags?.packageManager,\n defaultAll: flags?.default,\n token: flags?.token,\n });\n\n try {\n await template.init();\n await template.createDirectory();\n await template.setupLanguage();\n await template.createConfig();\n await template.createEnvFile({ envFile: this.cli.flags.env[0] });\n await template.createTemplate();\n await template.setPackageManager();\n await template.installDependencies({ value: flags?.install });\n await template.createModules();\n await template.build({ skipBuild: !flags?.build });\n } catch (error) {\n cancel(colors.red(error instanceof NotAnError ? error.message : inspect(error)));\n }\n }\n}\n\nexport namespace CreateSubcommand {\n export interface Flags {\n config?: string;\n token?: string;\n default?: boolean;\n typescript?: boolean;\n packageManager?: PackageManagerName;\n install: boolean;\n build: boolean;\n }\n}\n"],"mappings":";;;;;;;;;AASA,IAAqB,mBAArB,cAA8C,cAAc;CACxD,AAAO,aAAsB,IAAI,QAAQ,SAAS,CAC7C,YAAY,+BAA+B,CAC3C,SAAS,YAAY,yCAAyC,CAC9D,OAAO,uBAAuB,iCAAiC,CAC/D,OAAO,8BAA8B,6BAA6B,CAClE,OAAO,oBAAoB,iBAAiB,CAC5C,UAAU,IAAI,OAAO,gCAAgC,yCAAyC,CAC1F,QAAQ;EAAC;EAAO;EAAQ;EAAQ;EAAO;EAAO,CAAC,CACnD,CACA,OAAO,iBAAiB,2BAA2B,CACnD,OAAO,aAAa,qCAAqC,KAAK,CAC9D,OAAO,gBAAgB,2CAA2C,CAClE,OAAO,WAAW,oCAAoC,KAAK,CAC3D,OAAO,cAAc,0CAA0C,CAC/D,mBAAmB,KAAK;CAE7B,MAAa,UAAyB;EAClC,MAAM,QAAQ,KAAK,IAAI,SAAiC,SAAS;EACjE,MAAM,WAAW,IAAI,gBAAgB;GACjC,KAAK,KAAK;GACV,WAAW,KAAK,WAAW,KAAK;GAChC,YAAY,OAAO;GACnB,gBAAgB,OAAO;GACvB,YAAY,OAAO;GACnB,OAAO,OAAO;GACjB,CAAC;AAEF,MAAI;AACA,SAAM,SAAS,MAAM;AACrB,SAAM,SAAS,iBAAiB;AAChC,SAAM,SAAS,eAAe;AAC9B,SAAM,SAAS,cAAc;AAC7B,SAAM,SAAS,cAAc,EAAE,SAAS,KAAK,IAAI,MAAM,IAAI,IAAI,CAAC;AAChE,SAAM,SAAS,gBAAgB;AAC/B,SAAM,SAAS,mBAAmB;AAClC,SAAM,SAAS,oBAAoB,EAAE,OAAO,OAAO,SAAS,CAAC;AAC7D,SAAM,SAAS,eAAe;AAC9B,SAAM,SAAS,MAAM,EAAE,WAAW,CAAC,OAAO,OAAO,CAAC;WAC7C,OAAO;AACZ,UAAO,OAAO,IAAI,iBAAiB,aAAa,MAAM,UAAU,QAAQ,MAAM,CAAC,CAAC"}
|
|
@@ -3,8 +3,8 @@ import { CLISubcommand } from "../../classes/cli/CLISubcommand.mjs";
|
|
|
3
3
|
import { ConfigReader } from "../../classes/cli/ConfigReader.mjs";
|
|
4
4
|
import { ModuleTemplateBuilder } from "../../classes/templates/ModuleTemplateBuilder.mjs";
|
|
5
5
|
import { Command } from "commander";
|
|
6
|
-
import { colors } from "@reciple/utils";
|
|
7
6
|
import { cancel } from "@clack/prompts";
|
|
7
|
+
import { colors } from "@prtty/prtty";
|
|
8
8
|
import { inspect } from "node:util";
|
|
9
9
|
|
|
10
10
|
//#region src/bin/commands/createModule.ts
|
|
@@ -13,7 +13,7 @@ var CreateModuleSubcommand = class extends CLISubcommand {
|
|
|
13
13
|
parent = "create";
|
|
14
14
|
async execute() {
|
|
15
15
|
const flags = this.subcommand.opts();
|
|
16
|
-
const configReader = await new ConfigReader(flags.config ?? await ConfigReader.
|
|
16
|
+
const configReader = await new ConfigReader(flags.config ?? await ConfigReader.find() ?? ConfigReader.createConfigFilename("js")).read();
|
|
17
17
|
const template = new ModuleTemplateBuilder({
|
|
18
18
|
cli: this.cli,
|
|
19
19
|
config: configReader,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createModule.mjs","names":[],"sources":["../../../src/bin/commands/createModule.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { CLISubcommand } from '../../classes/cli/CLISubcommand.js';\nimport { ConfigReader } from '../../classes/cli/ConfigReader.js';\nimport { ModuleTemplateBuilder } from '../../classes/templates/ModuleTemplateBuilder.js';\nimport { cancel } from '@clack/prompts';\nimport { colors } from '@
|
|
1
|
+
{"version":3,"file":"createModule.mjs","names":[],"sources":["../../../src/bin/commands/createModule.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { CLISubcommand } from '../../classes/cli/CLISubcommand.js';\nimport { ConfigReader } from '../../classes/cli/ConfigReader.js';\nimport { ModuleTemplateBuilder } from '../../classes/templates/ModuleTemplateBuilder.js';\nimport { cancel } from '@clack/prompts';\nimport { colors } from '@prtty/prtty';\nimport { NotAnError } from '../../classes/NotAnError.js';\nimport { inspect } from 'node:util';\n\nexport default class CreateModuleSubcommand extends CLISubcommand {\n public subcommand: Command = new Command('module')\n .description('Creates new module')\n .argument('[output]', 'The directory to create the module in')\n .option('--template, -t <template>', 'Template source name')\n .option('--filename', 'The filename of the module')\n .option('-c, --config <path>', 'Path to the configuration file')\n .option('-T, --typescript', 'Use TypeScript')\n .option('-D, --default', 'Use defaults for prompts')\n .enablePositionalOptions(true);\n\n public parent: string = 'create';\n\n public async execute(): Promise<void> {\n const flags = this.subcommand.opts<CreateModuleSubcommand.Flags>();\n\n const configReader = await new ConfigReader(\n flags.config\n ?? await ConfigReader.find()\n ?? ConfigReader.createConfigFilename('js')\n ).read();\n\n const template = new ModuleTemplateBuilder({\n cli: this.cli,\n config: configReader,\n typescript: flags.typescript,\n filename: flags.filename,\n defaultAll: flags?.default\n });\n\n try {\n await template.init();\n await template.setupLanguage();\n await template.setupTemplate();\n await template.setupPlaceholders();\n await template.setupDirectory();\n await template.setupFilename();\n await template.build();\n } catch (error) {\n cancel(colors.red(error instanceof NotAnError ? error.message : inspect(error)));\n }\n }\n}\n\nexport namespace CreateModuleSubcommand {\n export interface Flags {\n template?: string;\n filename?: string;\n config?: string;\n typescript?: boolean;\n default?: boolean;\n }\n}\n"],"mappings":";;;;;;;;;;AASA,IAAqB,yBAArB,cAAoD,cAAc;CAC9D,AAAO,aAAsB,IAAI,QAAQ,SAAS,CAC7C,YAAY,qBAAqB,CACjC,SAAS,YAAY,wCAAwC,CAC7D,OAAO,6BAA6B,uBAAuB,CAC3D,OAAO,cAAc,6BAA6B,CAClD,OAAO,uBAAuB,iCAAiC,CAC/D,OAAO,oBAAoB,iBAAiB,CAC5C,OAAO,iBAAiB,2BAA2B,CACnD,wBAAwB,KAAK;CAElC,AAAO,SAAiB;CAExB,MAAa,UAAyB;EAClC,MAAM,QAAQ,KAAK,WAAW,MAAoC;EAElE,MAAM,eAAe,MAAM,IAAI,aAC3B,MAAM,UACH,MAAM,aAAa,MAAM,IACzB,aAAa,qBAAqB,KAAK,CAC7C,CAAC,MAAM;EAER,MAAM,WAAW,IAAI,sBAAsB;GACvC,KAAK,KAAK;GACV,QAAQ;GACR,YAAY,MAAM;GAClB,UAAU,MAAM;GAChB,YAAY,OAAO;GACtB,CAAC;AAEF,MAAI;AACA,SAAM,SAAS,MAAM;AACrB,SAAM,SAAS,eAAe;AAC9B,SAAM,SAAS,eAAe;AAC9B,SAAM,SAAS,mBAAmB;AAClC,SAAM,SAAS,gBAAgB;AAC/B,SAAM,SAAS,eAAe;AAC9B,SAAM,SAAS,OAAO;WACjB,OAAO;AACZ,UAAO,OAAO,IAAI,iBAAiB,aAAa,MAAM,UAAU,QAAQ,MAAM,CAAC,CAAC"}
|
|
@@ -5,9 +5,10 @@ import { RuntimeEnvironment } from "../../classes/cli/RuntimeEnvironment.mjs";
|
|
|
5
5
|
import { EventListeners } from "../../classes/client/EventListeners.mjs";
|
|
6
6
|
import { ModuleLoader } from "../../classes/client/ModuleLoader.mjs";
|
|
7
7
|
import { ModuleManager } from "../../classes/managers/ModuleManager.mjs";
|
|
8
|
-
import { Logger } from "
|
|
8
|
+
import { Logger } from "@prtty/print";
|
|
9
9
|
import { Command } from "commander";
|
|
10
|
-
import { Format,
|
|
10
|
+
import { Format, resolveEnvProtocol } from "@reciple/utils";
|
|
11
|
+
import { colors } from "@prtty/prtty";
|
|
11
12
|
import { Client, CommandType } from "@reciple/core";
|
|
12
13
|
import { version } from "discord.js";
|
|
13
14
|
import { build } from "tsdown";
|
|
@@ -17,18 +18,18 @@ var StartSubcommand = class extends CLISubcommand {
|
|
|
17
18
|
subcommand = new Command("start").description("Start the reciple client").option("-c, --config <path>", "Path to the configuration file").option("-t, --token <DiscordToken>", "Set your Discord Bot token").option("-b, --build", "Build the modules before starting the client").allowUnknownOption(true);
|
|
18
19
|
async execute() {
|
|
19
20
|
const flags = this.subcommand.opts();
|
|
20
|
-
const { client, config, build: buildConfig } = await new ConfigReader(flags.config ?? await ConfigReader.
|
|
21
|
-
const logger
|
|
21
|
+
const { client, config, build: buildConfig } = await new ConfigReader(flags.config ?? await ConfigReader.find() ?? ConfigReader.createConfigFilename("js")).read();
|
|
22
|
+
const logger = config.logger instanceof Logger ? this.cli.logger = config.logger : this.cli.logger.clone(config.logger);
|
|
22
23
|
let token = flags.token || config.token || "";
|
|
23
24
|
token = resolveEnvProtocol(token) || token;
|
|
24
25
|
function handleProcessError(err) {
|
|
25
|
-
logger
|
|
26
|
+
logger.error(err);
|
|
26
27
|
process.exit(1);
|
|
27
28
|
}
|
|
28
29
|
process.once("uncaughtException", handleProcessError);
|
|
29
30
|
process.once("unhandledRejection", handleProcessError);
|
|
30
|
-
process.on("warning", (warn) => logger
|
|
31
|
-
logger
|
|
31
|
+
process.on("warning", (warn) => logger.warn(warn));
|
|
32
|
+
logger.log(colors.magenta(`⚡ Initializing reciple!`));
|
|
32
33
|
if (flags.build) {
|
|
33
34
|
let plugins = buildConfig.plugins ? Array.isArray(buildConfig.plugins) ? buildConfig.plugins : [buildConfig.plugins] : [];
|
|
34
35
|
plugins.push(CLI.createTsdownLogger());
|
|
@@ -39,7 +40,7 @@ var StartSubcommand = class extends CLISubcommand {
|
|
|
39
40
|
});
|
|
40
41
|
}
|
|
41
42
|
Object.assign(client, {
|
|
42
|
-
logger
|
|
43
|
+
logger,
|
|
43
44
|
cli: this.cli,
|
|
44
45
|
config
|
|
45
46
|
});
|
|
@@ -49,12 +50,12 @@ var StartSubcommand = class extends CLISubcommand {
|
|
|
49
50
|
eventListeners: new EventListeners()
|
|
50
51
|
});
|
|
51
52
|
Reflect.set(global, "useClient", () => client);
|
|
52
|
-
Reflect.set(global, "useLogger", () => logger
|
|
53
|
+
Reflect.set(global, "useLogger", () => logger);
|
|
53
54
|
EventListeners.registerLoggerEventListeners(client);
|
|
54
|
-
logger
|
|
55
|
-
logger
|
|
56
|
-
logger
|
|
57
|
-
logger
|
|
55
|
+
logger.log(colors.green(`📦 Version Info:`));
|
|
56
|
+
logger.log(` ├─ ${colors.cyan(`reciple`)}\t\t${colors.yellow(`${this.cli.version}`)}`);
|
|
57
|
+
logger.log(` ├─ ${colors.cyan(`@reciple/client`)}\t${colors.yellow(`${Client.version}`)}`);
|
|
58
|
+
logger.log(` └─ ${colors.cyan(`discord.js`)}\t${colors.yellow(`${version}`)}`);
|
|
58
59
|
const modules = await client.moduleLoader.findModules();
|
|
59
60
|
Object.assign(client, {
|
|
60
61
|
_onBeforeLogin: async () => {
|
|
@@ -62,14 +63,14 @@ var StartSubcommand = class extends CLISubcommand {
|
|
|
62
63
|
client.once("clientReady", async () => {
|
|
63
64
|
if (!client.isReady()) return;
|
|
64
65
|
EventListeners.registerCommandsEventListeners(client);
|
|
65
|
-
logger
|
|
66
|
+
logger.debug(`Client is ready!`);
|
|
66
67
|
process.removeListener("uncaughtException", handleProcessError);
|
|
67
68
|
process.removeListener("unhandledRejection", handleProcessError);
|
|
68
69
|
const notEnabledModules = modules.length - enabledModules.length;
|
|
69
|
-
logger
|
|
70
|
+
logger.log(colors.green(`✅ ${enabledModules.length} ${Format.plural(enabledModules.length, "module")} ${Format.plural(enabledModules.length, "is", "are")} enabled.${notEnabledModules > 0 ? colors.red(` (${notEnabledModules} not enabled)`) : ""}`));
|
|
70
71
|
const readyModules = await client.modules.readyModules();
|
|
71
72
|
const notReadyModules = readyModules.length - enabledModules.length;
|
|
72
|
-
logger
|
|
73
|
+
logger.log(colors.green(`✅ ${readyModules.length} ${Format.plural(readyModules.length, "module")} ${Format.plural(readyModules.length, "is", "are")} ready.${notReadyModules > 0 ? colors.red(` (${notReadyModules} not ready)`) : ""}`));
|
|
73
74
|
await client.commands.registerApplicationCommands({
|
|
74
75
|
...config.applicationCommandsRegister,
|
|
75
76
|
commands: client.commands.applicationCommands
|
|
@@ -80,21 +81,21 @@ var StartSubcommand = class extends CLISubcommand {
|
|
|
80
81
|
message: client.commands.cache.filter((c) => c.type === CommandType.Message).size,
|
|
81
82
|
slash: client.commands.cache.filter((c) => c.type === CommandType.Slash).size
|
|
82
83
|
};
|
|
83
|
-
logger
|
|
84
|
-
logger
|
|
85
|
-
logger
|
|
86
|
-
logger
|
|
87
|
-
logger
|
|
88
|
-
logger
|
|
89
|
-
logger
|
|
84
|
+
logger.log(`🔑 Logged in as ${colors.bold(colors.cyan(client.user.displayName))} ${colors.magenta(`(${client.user.id})`)}`);
|
|
85
|
+
logger.log(` ├─ Loaded ${colors.green(modules.length.toLocaleString())} ${Format.plural(modules.length, "module")}.`);
|
|
86
|
+
logger.log(` ├─ Loaded ${colors.green(commands.contextMenus.toLocaleString())} context menu ${Format.plural(commands.contextMenus, "command")}.`);
|
|
87
|
+
logger.log(` ├─ Loaded ${colors.green(commands.message.toLocaleString())} message ${Format.plural(commands.message, "command")}.`);
|
|
88
|
+
logger.log(` ├─ Loaded ${colors.green(commands.slash.toLocaleString())} slash ${Format.plural(commands.slash, "command")}.`);
|
|
89
|
+
logger.log(` ├─ Loaded ${colors.green(client.preconditions.cache.size.toLocaleString())} global ${Format.plural(client.preconditions.cache.size, "precondition")}.`);
|
|
90
|
+
logger.log(` └─ Loaded ${colors.green(client.postconditions.cache.size.toLocaleString())} global ${Format.plural(client.postconditions.cache.size, "postcondition")}.`);
|
|
90
91
|
});
|
|
91
92
|
client.eventListeners.registerProcessExitEvents(async (signal) => RuntimeEnvironment.handleExitSignal(client, signal));
|
|
92
93
|
},
|
|
93
|
-
_onBeforeDestroy: async (client
|
|
94
|
-
await client
|
|
94
|
+
_onBeforeDestroy: async (client) => {
|
|
95
|
+
await client.modules.disableModules();
|
|
95
96
|
}
|
|
96
97
|
});
|
|
97
|
-
logger
|
|
98
|
+
logger.debug(`Logging in...`);
|
|
98
99
|
await client.login(token);
|
|
99
100
|
}
|
|
100
101
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.mjs","names":["logger","DiscordJsVersion","client"],"sources":["../../../src/bin/commands/start.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { CLISubcommand } from '../../classes/cli/CLISubcommand.js';\nimport { ConfigReader } from '../../classes/cli/ConfigReader.js';\nimport { Logger } from 'prtyprnt';\nimport { colors, Format, resolveEnvProtocol } from '@reciple/utils';\nimport { Client, CommandType } from '@reciple/core';\nimport { ModuleLoader } from '../../classes/client/ModuleLoader.js';\nimport { ModuleManager } from '../../classes/managers/ModuleManager.js';\nimport { version as DiscordJsVersion } from 'discord.js';\nimport { EventListeners } from '../../classes/client/EventListeners.js';\nimport { RuntimeEnvironment } from '../../classes/cli/RuntimeEnvironment.js';\nimport { build } from 'tsdown';\nimport { CLI } from '../../classes/cli/CLI.js';\n\nexport default class StartSubcommand extends CLISubcommand {\n public subcommand: Command = new Command('start')\n .description('Start the reciple client')\n .option('-c, --config <path>', 'Path to the configuration file')\n .option('-t, --token <DiscordToken>', 'Set your Discord Bot token')\n .option('-b, --build', 'Build the modules before starting the client')\n .allowUnknownOption(true);\n\n public async execute(): Promise<void> {\n const flags = this.subcommand.opts<StartSubcommand.Flags>();\n const configReader = new ConfigReader(\n flags.config\n ?? await ConfigReader.findConfig(process.cwd())\n ?? ConfigReader.createConfigFilename('js')\n );\n\n const { client, config, build: buildConfig } = await configReader.read({\n createIfNotExists: false\n });\n\n const logger = config.logger instanceof Logger ? this.cli.logger = config.logger : this.cli.logger.clone(config.logger);\n\n let token = flags.token || config.token || '';\n token = resolveEnvProtocol(token) || token;\n\n function handleProcessError(err: unknown) {\n logger.error(err);\n process.exit(1);\n }\n\n process.once('uncaughtException', handleProcessError);\n process.once('unhandledRejection', handleProcessError);\n process.on('warning', warn => logger.warn(warn));\n\n logger.log(colors.magenta(`⚡ Initializing reciple!`));\n\n if (flags.build) {\n let plugins = buildConfig.plugins\n ? Array.isArray(buildConfig.plugins)\n ? buildConfig.plugins\n : [buildConfig.plugins]\n : [];\n\n plugins.push(CLI.createTsdownLogger());\n\n await build({\n ...buildConfig,\n logLevel: 'silent',\n plugins,\n });\n }\n\n Object.assign(client, {\n logger,\n cli: this.cli,\n config\n });\n\n Object.assign(client, {\n modules: new ModuleManager(client),\n moduleLoader: new ModuleLoader(client),\n eventListeners: new EventListeners()\n });\n\n Reflect.set(global, 'useClient', () => client);\n Reflect.set(global, 'useLogger', () => logger);\n\n EventListeners.registerLoggerEventListeners(client);\n\n logger.log(colors.green(`📦 Version Info:`));\n logger.log(` ├─ ${colors.cyan(`reciple`)}\\t\\t${colors.yellow(`${this.cli.version}`)}`);\n logger.log(` ├─ ${colors.cyan(`@reciple/client`)}\\t${colors.yellow(`${Client.version}`)}`);\n logger.log(` └─ ${colors.cyan(`discord.js`)}\\t${colors.yellow(`${DiscordJsVersion}`)}`);\n\n const modules = await client.moduleLoader.findModules();\n\n Object.assign(client, {\n _onBeforeLogin: async() => {\n const enabledModules = await client.modules.enableModules({ modules });\n\n client.once('clientReady', async() => {\n if (!client.isReady()) return;\n\n EventListeners.registerCommandsEventListeners(client);\n\n logger.debug(`Client is ready!`);\n process.removeListener('uncaughtException', handleProcessError);\n process.removeListener('unhandledRejection', handleProcessError);\n\n const notEnabledModules = modules.length - enabledModules.length;\n logger.log(colors.green(`✅ ${enabledModules.length} ${Format.plural(enabledModules.length, 'module')} ${Format.plural(enabledModules.length, 'is', 'are')} enabled.${notEnabledModules > 0 ? colors.red(` (${notEnabledModules} not enabled)`) : ''}`));\n\n const readyModules = await client.modules.readyModules();\n const notReadyModules = readyModules.length - enabledModules.length;\n\n logger.log(colors.green(`✅ ${readyModules.length} ${Format.plural(readyModules.length, 'module')} ${Format.plural(readyModules.length, 'is', 'are')} ready.${notReadyModules > 0 ? colors.red(` (${notReadyModules} not ready)`) : ''}`));\n\n await client.commands.registerApplicationCommands({\n ...config.applicationCommandsRegister,\n commands: client.commands.applicationCommands,\n });\n\n process.stdin.resume();\n\n const commands = {\n contextMenus: client.commands.cache.filter(c => c.type === CommandType.ContextMenu).size,\n message: client.commands.cache.filter(c => c.type === CommandType.Message).size,\n slash: client.commands.cache.filter(c => c.type === CommandType.Slash).size\n };\n\n logger.log(`🔑 Logged in as ${colors.bold(colors.cyan(client.user.displayName))} ${colors.magenta(`(${client.user.id})`)}`);\n logger.log(` ├─ Loaded ${colors.green(modules.length)} ${Format.plural(modules.length, 'module')}.`);\n logger.log(` ├─ Loaded ${colors.green(commands.contextMenus)} context menu ${Format.plural(commands.contextMenus, 'command')}.`);\n logger.log(` ├─ Loaded ${colors.green(commands.message)} message ${Format.plural(commands.message, 'command')}.`);\n logger.log(` ├─ Loaded ${colors.green(commands.slash)} slash ${Format.plural(commands.slash, 'command')}.`);\n logger.log(` ├─ Loaded ${colors.green(client.preconditions.cache.size)} global ${Format.plural(client.preconditions.cache.size, 'precondition')}.`);\n logger.log(` └─ Loaded ${colors.green(client.postconditions.cache.size)} global ${Format.plural(client.postconditions.cache.size, 'postcondition')}.`);\n });\n\n client.eventListeners.registerProcessExitEvents(async signal => RuntimeEnvironment.handleExitSignal(client, signal));\n },\n _onBeforeDestroy: async (client: Client) => {\n await client.modules.disableModules();\n }\n })\n\n logger.debug(`Logging in...`);\n await client.login(token);\n }\n}\n\nexport namespace StartSubcommand {\n export interface Flags {\n config?: string;\n token?: string;\n build?: boolean;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"start.mjs","names":["DiscordJsVersion"],"sources":["../../../src/bin/commands/start.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { CLISubcommand } from '../../classes/cli/CLISubcommand.js';\nimport { ConfigReader } from '../../classes/cli/ConfigReader.js';\nimport { Logger } from '@prtty/print';\nimport { Format, resolveEnvProtocol } from '@reciple/utils';\nimport { Client, CommandType } from '@reciple/core';\nimport { ModuleLoader } from '../../classes/client/ModuleLoader.js';\nimport { ModuleManager } from '../../classes/managers/ModuleManager.js';\nimport { version as DiscordJsVersion } from 'discord.js';\nimport { EventListeners } from '../../classes/client/EventListeners.js';\nimport { RuntimeEnvironment } from '../../classes/cli/RuntimeEnvironment.js';\nimport { build } from 'tsdown';\nimport { CLI } from '../../classes/cli/CLI.js';\nimport { colors } from '@prtty/prtty';\n\nexport default class StartSubcommand extends CLISubcommand {\n public subcommand: Command = new Command('start')\n .description('Start the reciple client')\n .option('-c, --config <path>', 'Path to the configuration file')\n .option('-t, --token <DiscordToken>', 'Set your Discord Bot token')\n .option('-b, --build', 'Build the modules before starting the client')\n .allowUnknownOption(true);\n\n public async execute(): Promise<void> {\n const flags = this.subcommand.opts<StartSubcommand.Flags>();\n const configReader = new ConfigReader(\n flags.config\n ?? await ConfigReader.find()\n ?? ConfigReader.createConfigFilename('js')\n );\n\n const { client, config, build: buildConfig } = await configReader.read();\n\n const logger = config.logger instanceof Logger ? this.cli.logger = config.logger : this.cli.logger.clone(config.logger);\n\n let token = flags.token || config.token || '';\n token = resolveEnvProtocol(token) || token;\n\n function handleProcessError(err: unknown) {\n logger.error(err);\n process.exit(1);\n }\n\n process.once('uncaughtException', handleProcessError);\n process.once('unhandledRejection', handleProcessError);\n process.on('warning', warn => logger.warn(warn));\n\n logger.log(colors.magenta(`⚡ Initializing reciple!`));\n\n if (flags.build) {\n let plugins = buildConfig.plugins\n ? Array.isArray(buildConfig.plugins)\n ? buildConfig.plugins\n : [buildConfig.plugins]\n : [];\n\n plugins.push(CLI.createTsdownLogger());\n\n await build({\n ...buildConfig,\n logLevel: 'silent',\n plugins,\n });\n }\n\n Object.assign(client, {\n logger,\n cli: this.cli,\n config\n });\n\n Object.assign(client, {\n modules: new ModuleManager(client),\n moduleLoader: new ModuleLoader(client),\n eventListeners: new EventListeners()\n });\n\n Reflect.set(global, 'useClient', () => client);\n Reflect.set(global, 'useLogger', () => logger);\n\n EventListeners.registerLoggerEventListeners(client);\n\n logger.log(colors.green(`📦 Version Info:`));\n logger.log(` ├─ ${colors.cyan(`reciple`)}\\t\\t${colors.yellow(`${this.cli.version}`)}`);\n logger.log(` ├─ ${colors.cyan(`@reciple/client`)}\\t${colors.yellow(`${Client.version}`)}`);\n logger.log(` └─ ${colors.cyan(`discord.js`)}\\t${colors.yellow(`${DiscordJsVersion}`)}`);\n\n const modules = await client.moduleLoader.findModules();\n\n Object.assign(client, {\n _onBeforeLogin: async() => {\n const enabledModules = await client.modules.enableModules({ modules });\n\n client.once('clientReady', async() => {\n if (!client.isReady()) return;\n\n EventListeners.registerCommandsEventListeners(client);\n\n logger.debug(`Client is ready!`);\n process.removeListener('uncaughtException', handleProcessError);\n process.removeListener('unhandledRejection', handleProcessError);\n\n const notEnabledModules = modules.length - enabledModules.length;\n logger.log(colors.green(`✅ ${enabledModules.length} ${Format.plural(enabledModules.length, 'module')} ${Format.plural(enabledModules.length, 'is', 'are')} enabled.${notEnabledModules > 0 ? colors.red(` (${notEnabledModules} not enabled)`) : ''}`));\n\n const readyModules = await client.modules.readyModules();\n const notReadyModules = readyModules.length - enabledModules.length;\n\n logger.log(colors.green(`✅ ${readyModules.length} ${Format.plural(readyModules.length, 'module')} ${Format.plural(readyModules.length, 'is', 'are')} ready.${notReadyModules > 0 ? colors.red(` (${notReadyModules} not ready)`) : ''}`));\n\n await client.commands.registerApplicationCommands({\n ...config.applicationCommandsRegister,\n commands: client.commands.applicationCommands,\n });\n\n process.stdin.resume();\n\n const commands = {\n contextMenus: client.commands.cache.filter(c => c.type === CommandType.ContextMenu).size,\n message: client.commands.cache.filter(c => c.type === CommandType.Message).size,\n slash: client.commands.cache.filter(c => c.type === CommandType.Slash).size\n };\n\n logger.log(`🔑 Logged in as ${colors.bold(colors.cyan(client.user.displayName))} ${colors.magenta(`(${client.user.id})`)}`);\n logger.log(` ├─ Loaded ${colors.green(modules.length.toLocaleString())} ${Format.plural(modules.length, 'module')}.`);\n logger.log(` ├─ Loaded ${colors.green(commands.contextMenus.toLocaleString())} context menu ${Format.plural(commands.contextMenus, 'command')}.`);\n logger.log(` ├─ Loaded ${colors.green(commands.message.toLocaleString())} message ${Format.plural(commands.message, 'command')}.`);\n logger.log(` ├─ Loaded ${colors.green(commands.slash.toLocaleString())} slash ${Format.plural(commands.slash, 'command')}.`);\n logger.log(` ├─ Loaded ${colors.green(client.preconditions.cache.size.toLocaleString())} global ${Format.plural(client.preconditions.cache.size, 'precondition')}.`);\n logger.log(` └─ Loaded ${colors.green(client.postconditions.cache.size.toLocaleString())} global ${Format.plural(client.postconditions.cache.size, 'postcondition')}.`);\n });\n\n client.eventListeners.registerProcessExitEvents(async signal => RuntimeEnvironment.handleExitSignal(client, signal));\n },\n _onBeforeDestroy: async (client: Client) => {\n await client.modules.disableModules();\n }\n })\n\n logger.debug(`Logging in...`);\n await client.login(token);\n }\n}\n\nexport namespace StartSubcommand {\n export interface Flags {\n config?: string;\n token?: string;\n build?: boolean;\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { CLISubcommand } from "../../classes/cli/CLISubcommand.mjs";
|
|
2
|
+
import { StartSubcommand } from "./start.mjs";
|
|
3
|
+
import { Command } from "commander";
|
|
4
|
+
import { ShardingManager } from "discord.js";
|
|
5
|
+
|
|
6
|
+
//#region src/bin/commands/startSharding.d.ts
|
|
7
|
+
declare class StartShardingSubcommand extends CLISubcommand {
|
|
8
|
+
parent?: string;
|
|
9
|
+
subcommand: Command;
|
|
10
|
+
execute(): Promise<void>;
|
|
11
|
+
destroyShardingManager(manager: ShardingManager): void;
|
|
12
|
+
}
|
|
13
|
+
declare namespace ShardingSubcommand {
|
|
14
|
+
interface Flags extends StartSubcommand.Flags {}
|
|
15
|
+
}
|
|
16
|
+
//#endregion
|
|
17
|
+
export { ShardingSubcommand, StartShardingSubcommand as default };
|
|
18
|
+
//# sourceMappingURL=startSharding.d.mts.map
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { CLISubcommand } from "../../classes/cli/CLISubcommand.mjs";
|
|
2
|
+
import { CLI } from "../../classes/cli/CLI.mjs";
|
|
3
|
+
import { ConfigReader } from "../../classes/cli/ConfigReader.mjs";
|
|
4
|
+
import { EventListeners } from "../../classes/client/EventListeners.mjs";
|
|
5
|
+
import { Logger } from "@prtty/print";
|
|
6
|
+
import { Command } from "commander";
|
|
7
|
+
import { resolveEnvProtocol } from "@reciple/utils";
|
|
8
|
+
import { colors } from "@prtty/prtty";
|
|
9
|
+
import { ShardingManager } from "discord.js";
|
|
10
|
+
import { build } from "tsdown";
|
|
11
|
+
|
|
12
|
+
//#region src/bin/commands/startSharding.ts
|
|
13
|
+
var StartShardingSubcommand = class extends CLISubcommand {
|
|
14
|
+
parent = "start";
|
|
15
|
+
subcommand = new Command("sharding").description("Start the reciple client in sharding mode").option("-c, --config <path>", "Path to the configuration file").option("-t, --token <DiscordToken>", "Set your Discord Bot token").option("-b, --build", "Build the modules before starting the client").allowUnknownOption(true);
|
|
16
|
+
async execute() {
|
|
17
|
+
process.env.RECIPLE_SHARDING = "true";
|
|
18
|
+
process.env.RECIPLE_FIRST_SHARD = "true";
|
|
19
|
+
const recipleFlags = this.cli.getFlags();
|
|
20
|
+
const flags = this.subcommand.opts();
|
|
21
|
+
const shardArgs = [
|
|
22
|
+
...CLI.stringifyFlags(recipleFlags, this.cli.command),
|
|
23
|
+
"start",
|
|
24
|
+
...CLI.stringifyFlags(flags, this.command)
|
|
25
|
+
];
|
|
26
|
+
const { config, build: buildConfig, sharding } = await new ConfigReader(flags.config ?? await ConfigReader.find() ?? ConfigReader.createConfigFilename("js")).read();
|
|
27
|
+
const logger = config.logger instanceof Logger ? this.cli.logger = config.logger : this.cli.logger.clone(config.logger);
|
|
28
|
+
logger.label = "ShardingManager";
|
|
29
|
+
let token = flags.token || config.token || "";
|
|
30
|
+
token = resolveEnvProtocol(token) || token;
|
|
31
|
+
logger.log(colors.magenta(`⚡ Initializing reciple sharding manager!`));
|
|
32
|
+
const processErrorLogger = (err) => {
|
|
33
|
+
logger?.error(err);
|
|
34
|
+
process.exit(1);
|
|
35
|
+
};
|
|
36
|
+
process.once("uncaughtException", processErrorLogger);
|
|
37
|
+
process.once("unhandledRejection", processErrorLogger);
|
|
38
|
+
process.on("warning", (warn) => logger.warn(warn));
|
|
39
|
+
if (flags.build) {
|
|
40
|
+
let plugins = buildConfig.plugins ? Array.isArray(buildConfig.plugins) ? buildConfig.plugins : [buildConfig.plugins] : [];
|
|
41
|
+
plugins.push(CLI.createTsdownLogger());
|
|
42
|
+
await build({
|
|
43
|
+
...buildConfig,
|
|
44
|
+
logLevel: "silent",
|
|
45
|
+
plugins
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
if (!sharding) {
|
|
49
|
+
logger.error("Sharding is not enabled in the config file");
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
Reflect.set(global, "useLogger", () => logger);
|
|
53
|
+
const eventListeners = new EventListeners();
|
|
54
|
+
const manager = new ShardingManager(CLI.bin, {
|
|
55
|
+
...sharding,
|
|
56
|
+
token,
|
|
57
|
+
shardArgs
|
|
58
|
+
});
|
|
59
|
+
manager.on("shardCreate", (shard) => {
|
|
60
|
+
logger.log(colors.magenta(`🚀 Launched shard ${colors.green(String(shard.id))}`));
|
|
61
|
+
shard.on("ready", () => {
|
|
62
|
+
logger.log(colors.magenta(`✅ Shard ${colors.green(String(shard.id))} is ready!`));
|
|
63
|
+
if (process.env.RECIPLE_FIRST_SHARD === "true") process.env.RECIPLE_FIRST_SHARD = "false";
|
|
64
|
+
});
|
|
65
|
+
shard.on("reconnecting", () => {
|
|
66
|
+
logger.log(colors.magenta(`🔄 Shard ${colors.green(String(shard.id))} is reconnecting...`));
|
|
67
|
+
});
|
|
68
|
+
shard.on("resume", () => {
|
|
69
|
+
logger.log(colors.magenta(`✅ Shard ${colors.green(String(shard.id))} has resumed!`));
|
|
70
|
+
});
|
|
71
|
+
shard.on("disconnect", () => {
|
|
72
|
+
logger.log(colors.magenta(`🛑 Shard ${colors.green(String(shard.id))} is disconnected!`));
|
|
73
|
+
});
|
|
74
|
+
shard.on("death", () => {
|
|
75
|
+
logger.error(`🛑 Shard ${colors.green(String(shard.id))} has died!`);
|
|
76
|
+
});
|
|
77
|
+
shard.on("error", (error) => {
|
|
78
|
+
logger.error(`❌ Shard ${colors.green(String(shard.id))} encountered an error:`, error);
|
|
79
|
+
});
|
|
80
|
+
shard.on("message", (message) => {});
|
|
81
|
+
});
|
|
82
|
+
eventListeners.registerProcessExitEvents((signal) => this.destroyShardingManager(manager));
|
|
83
|
+
process.stdin.resume();
|
|
84
|
+
await manager.spawn();
|
|
85
|
+
}
|
|
86
|
+
destroyShardingManager(manager) {
|
|
87
|
+
const logger = useLogger();
|
|
88
|
+
manager.shards.map((s) => {
|
|
89
|
+
logger.log(colors.magenta(`🚧 Destroying shard ${s.id}`));
|
|
90
|
+
if (s.process) s.process.kill();
|
|
91
|
+
else s.kill();
|
|
92
|
+
logger.log(colors.magenta(`🛑 Destroyed shard ${s.id}`));
|
|
93
|
+
});
|
|
94
|
+
logger.log(colors.magenta(`🚨 Destroyed all shards`));
|
|
95
|
+
setTimeout(() => process.exit(0), 500);
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
//#endregion
|
|
100
|
+
export { StartShardingSubcommand as default };
|
|
101
|
+
//# sourceMappingURL=startSharding.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"startSharding.mjs","names":[],"sources":["../../../src/bin/commands/startSharding.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { CLISubcommand } from '../../classes/cli/CLISubcommand.js';\nimport { ConfigReader } from '../../classes/cli/ConfigReader.js';\nimport type { StartSubcommand } from './start.js';\nimport { Logger } from '@prtty/print';\nimport { resolveEnvProtocol } from '@reciple/utils';\nimport { colors } from '@prtty/prtty';\nimport { CLI } from '../../classes/cli/CLI.js';\nimport { build } from 'tsdown';\nimport { ShardingManager } from 'discord.js';\nimport { EventListeners } from '../../classes/client/EventListeners.js';\n\nexport default class StartShardingSubcommand extends CLISubcommand {\n public parent?: string = 'start';\n\n public subcommand: Command = new Command('sharding')\n .description('Start the reciple client in sharding mode')\n .option('-c, --config <path>', 'Path to the configuration file')\n .option('-t, --token <DiscordToken>', 'Set your Discord Bot token')\n .option('-b, --build', 'Build the modules before starting the client')\n .allowUnknownOption(true);\n\n public async execute(): Promise<void> {\n process.env.RECIPLE_SHARDING = 'true';\n process.env.RECIPLE_FIRST_SHARD = 'true';\n\n const recipleFlags = this.cli.getFlags();\n const flags = this.subcommand.opts<ShardingSubcommand.Flags>();\n\n const shardArgs: string[] = [\n ...CLI.stringifyFlags(recipleFlags, this.cli.command),\n 'start',\n ...CLI.stringifyFlags(flags, this.command)\n ];\n\n const configReader = new ConfigReader(\n flags.config\n ?? await ConfigReader.find()\n ?? ConfigReader.createConfigFilename('js')\n );\n\n const { config, build: buildConfig, sharding } = await configReader.read();\n\n const logger = config.logger instanceof Logger ? this.cli.logger = config.logger : this.cli.logger.clone(config.logger);\n\n logger.label = 'ShardingManager';\n\n let token = flags.token || config.token || '';\n token = resolveEnvProtocol(token) || token;\n\n logger.log(colors.magenta(`⚡ Initializing reciple sharding manager!`));\n\n const processErrorLogger = (err: any) => {\n logger?.error(err);\n process.exit(1);\n };\n\n process.once('uncaughtException', processErrorLogger);\n process.once('unhandledRejection', processErrorLogger);\n process.on('warning', warn => logger.warn(warn));\n\n if (flags.build) {\n let plugins = buildConfig.plugins\n ? Array.isArray(buildConfig.plugins)\n ? buildConfig.plugins\n : [buildConfig.plugins]\n : [];\n\n plugins.push(CLI.createTsdownLogger());\n\n await build({\n ...buildConfig,\n logLevel: 'silent',\n plugins,\n });\n }\n\n if (!sharding) {\n logger.error('Sharding is not enabled in the config file');\n process.exit(1);\n }\n\n Reflect.set(global, 'useLogger', () => logger);\n\n const eventListeners = new EventListeners();\n const manager = new ShardingManager(CLI.bin, {\n ...sharding,\n token: token,\n shardArgs\n });\n\n manager.on('shardCreate', shard => {\n logger.log(colors.magenta(`🚀 Launched shard ${colors.green(String(shard.id))}`));\n\n shard.on('ready', () => {\n logger.log(colors.magenta(`✅ Shard ${colors.green(String(shard.id))} is ready!`));\n\n if (process.env.RECIPLE_FIRST_SHARD === 'true') {\n process.env.RECIPLE_FIRST_SHARD = 'false';\n }\n });\n\n shard.on('reconnecting', () => {\n logger.log(colors.magenta(`🔄 Shard ${colors.green(String(shard.id))} is reconnecting...`));\n });\n\n shard.on('resume', () => {\n logger.log(colors.magenta(`✅ Shard ${colors.green(String(shard.id))} has resumed!`));\n });\n\n shard.on('disconnect', () => {\n logger.log(colors.magenta(`🛑 Shard ${colors.green(String(shard.id))} is disconnected!`));\n });\n\n shard.on('death', () => {\n logger.error(`🛑 Shard ${colors.green(String(shard.id))} has died!`);\n });\n\n shard.on('error', error => {\n logger.error(`❌ Shard ${colors.green(String(shard.id))} encountered an error:`, error);\n });\n\n shard.on('message', message => {\n // TODO: Handle shard messages\n });\n });\n\n eventListeners.registerProcessExitEvents(signal => this.destroyShardingManager(manager));\n process.stdin.resume();\n\n await manager.spawn();\n }\n\n public destroyShardingManager(manager: ShardingManager): void {\n const logger = useLogger();\n\n manager.shards.map(s => {\n logger.log(colors.magenta(`🚧 Destroying shard ${s.id}`));\n\n if (s.process) {\n s.process.kill();\n } else {\n s.kill();\n }\n\n logger.log(colors.magenta(`🛑 Destroyed shard ${s.id}`));\n });\n\n logger.log(colors.magenta(`🚨 Destroyed all shards`));\n setTimeout(() => process.exit(0), 500);\n }\n}\n\nexport namespace ShardingSubcommand {\n export interface Flags extends StartSubcommand.Flags {}\n}\n"],"mappings":"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"}
|
package/dist/bin/reciple.mjs
CHANGED
|
File without changes
|
package/dist/classes/cli/CLI.mjs
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { CLISubcommand } from "./CLISubcommand.mjs";
|
|
2
|
-
import { LogLevel, Logger, logger } from "
|
|
2
|
+
import { LogLevel, Logger, logger } from "@prtty/print";
|
|
3
3
|
import { Command } from "commander";
|
|
4
4
|
import { fileURLToPath } from "node:url";
|
|
5
5
|
import path from "node:path";
|
|
6
6
|
import { coerce } from "semver";
|
|
7
|
-
import { Format,
|
|
7
|
+
import { Format, isDebugging, recursiveDefaults } from "@reciple/utils";
|
|
8
8
|
import { config } from "@dotenvx/dotenvx";
|
|
9
9
|
import { readdir, stat } from "node:fs/promises";
|
|
10
10
|
import { spinner } from "@clack/prompts";
|
|
11
|
+
import { colors } from "@prtty/prtty";
|
|
11
12
|
|
|
12
13
|
//#region src/classes/cli/CLI.ts
|
|
13
14
|
var CLI = class {
|
|
@@ -25,7 +26,7 @@ var CLI = class {
|
|
|
25
26
|
this.options = options;
|
|
26
27
|
this.build = options.build;
|
|
27
28
|
this.version = String(coerce(this.build) ?? this.build);
|
|
28
|
-
this.command = new Command().name(options.name).description(options.description).version(options.build, "-v, --version", "Output the CLI version number").option("-D, --debug", "Enable debug mode", isDebugging()).option("--env <file>", "Load environment variables from .env file", (v, p) => p.concat(v), []).enablePositionalOptions(true).hook("preAction", this.handlePreAction.bind(this)).showHelpAfterError();
|
|
29
|
+
this.command = new Command().name(options.name).description(options.description).version(options.build, "-v, --version", "Output the CLI version number").option("-D, --debug", "Enable debug mode", isDebugging()).option("--no-debug", "Disabled debug mode").option("--env <file>", "Load environment variables from .env file", (v, p) => p.concat(v), []).enablePositionalOptions(true).hook("preAction", this.handlePreAction.bind(this)).showHelpAfterError();
|
|
29
30
|
this.logger = options.logger instanceof Logger ? options.logger : new Logger(options.logger);
|
|
30
31
|
if (this.flags.debug) {
|
|
31
32
|
this.logger.logLevel = LogLevel.Debug;
|
|
@@ -85,8 +86,8 @@ var CLI = class {
|
|
|
85
86
|
};
|
|
86
87
|
(function(_CLI) {
|
|
87
88
|
_CLI.root = path.join(path.dirname(fileURLToPath(import.meta.url)), "../../../");
|
|
88
|
-
_CLI.bin = path.join(CLI.root, "dist/bin/reciple.
|
|
89
|
-
_CLI.version = "10.0.
|
|
89
|
+
_CLI.bin = path.join(CLI.root, "dist/bin/reciple.mjs");
|
|
90
|
+
_CLI.version = "10.0.2";
|
|
90
91
|
function stringifyFlags(flags, command, ignored = []) {
|
|
91
92
|
let arr = [];
|
|
92
93
|
for (const [key, value] of Object.entries(flags)) {
|