reciple 10.0.35 → 10.0.36
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/assets/config/reciple.config.js +2 -2
- package/assets/config/reciple.config.ts +1 -1
- package/dist/bin/commands/build.mjs +1 -1
- package/dist/bin/commands/build.mjs.map +1 -1
- package/dist/bin/commands/start.mjs +1 -1
- package/dist/bin/commands/start.mjs.map +1 -1
- package/dist/bin/commands/startSharding.d.mts +2 -3
- package/dist/bin/commands/startSharding.mjs +2 -3
- package/dist/bin/commands/startSharding.mjs.map +1 -1
- package/dist/classes/cli/CLI.d.mts +1 -1
- package/dist/classes/cli/CLI.mjs +3 -3
- package/dist/classes/cli/CLI.mjs.map +1 -1
- package/dist/classes/client/ModuleLoader.d.mts +0 -2
- package/dist/classes/client/ModuleLoader.mjs +3 -10
- package/dist/classes/client/ModuleLoader.mjs.map +1 -1
- package/dist/classes/managers/ModuleManager.mjs +6 -6
- package/dist/classes/managers/ModuleManager.mjs.map +1 -1
- package/dist/classes/validation/BaseModuleValidator.d.mts +2 -2
- package/dist/classes/validation/EventModuleValidator.d.mts +2 -2
- package/dist/classes/validation/PostconditionModule.d.mts +2 -2
- package/dist/package.mjs +3 -3
- package/package.json +5 -5
|
@@ -69,7 +69,7 @@ export const config = {
|
|
|
69
69
|
},
|
|
70
70
|
modules: {
|
|
71
71
|
directories: ["./modules/**", "./modules"],
|
|
72
|
-
ignore: ["_*"],
|
|
72
|
+
ignore: ["_*", ".*", "+*"],
|
|
73
73
|
filter: undefined
|
|
74
74
|
}
|
|
75
75
|
};
|
|
@@ -87,5 +87,5 @@ export const build = {
|
|
|
87
87
|
* @type {import('reciple').ShardingConfig}
|
|
88
88
|
*/
|
|
89
89
|
export const sharding = {
|
|
90
|
-
mode: 'process',
|
|
90
|
+
mode: 'process',
|
|
91
91
|
};
|
|
@@ -11,7 +11,7 @@ var BuildSubcommand = class extends CLISubcommand {
|
|
|
11
11
|
await this.cli.setCurrentDirectory(this.subcommand.args[0]);
|
|
12
12
|
const { build: buildConfig } = await new ConfigReader(await ConfigReader.find() ?? ConfigReader.createConfigFilename("js")).read();
|
|
13
13
|
let plugins = buildConfig.plugins ? Array.isArray(buildConfig.plugins) ? buildConfig.plugins : [buildConfig.plugins] : [];
|
|
14
|
-
plugins.push(CLI.
|
|
14
|
+
plugins.push(CLI.createRolldownLogger(this.cli.logger));
|
|
15
15
|
await build({
|
|
16
16
|
...buildConfig,
|
|
17
17
|
logLevel: "silent",
|
|
@@ -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 .argument('[project]', 'The root directory of your project');\n\n public async execute(): Promise<void> {\n await this.cli.setCurrentDirectory(this.subcommand.args[0]);\n\n const configReader = new ConfigReader(\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.
|
|
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 .argument('[project]', 'The root directory of your project');\n\n public async execute(): Promise<void> {\n await this.cli.setCurrentDirectory(this.subcommand.args[0]);\n\n const configReader = new ConfigReader(\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.createRolldownLogger(this.cli.logger));\n\n await build({\n ...buildConfig,\n logLevel: 'silent',\n plugins,\n });\n }\n}\n"],"mappings":";;;;;;;AAMA,IAAqB,kBAArB,cAA6C,cAAc;CACvD,AAAO,aAAsB,IAAI,QAAQ,QAAQ,CAC5C,YAAY,mDAAmD,CAC/D,SAAS,aAAa,qCAAqC;CAEhE,MAAa,UAAyB;AAClC,QAAM,KAAK,IAAI,oBAAoB,KAAK,WAAW,KAAK,GAAG;EAO3D,MAAM,EAAE,OAAO,gBAAgB,MALV,IAAI,aACrB,MAAM,aAAa,MAAM,IACtB,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,qBAAqB,KAAK,IAAI,OAAO,CAAC;AAEvD,QAAM,MAAM;GACR,GAAG;GACH,UAAU;GACV;GACH,CAAC"}
|
|
@@ -33,7 +33,7 @@ var StartSubcommand = class extends CLISubcommand {
|
|
|
33
33
|
logger.log(colors.magenta(`⚡ Initializing reciple!`));
|
|
34
34
|
if (flags.build) {
|
|
35
35
|
let plugins = buildConfig.plugins ? Array.isArray(buildConfig.plugins) ? buildConfig.plugins : [buildConfig.plugins] : [];
|
|
36
|
-
plugins.push(CLI.
|
|
36
|
+
plugins.push(CLI.createRolldownLogger());
|
|
37
37
|
await build({
|
|
38
38
|
...buildConfig,
|
|
39
39
|
logLevel: "silent",
|
|
@@ -1 +1 @@
|
|
|
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 .argument('[project]', 'The root directory of your project')\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\n await this.cli.setCurrentDirectory(this.subcommand.args[0]);\n\n const configReader = new ConfigReader(\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/core`)}\\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 if (commands.message && !client.options.intents.has(['GuildMessages', 'MessageContent'])) {\n const missingIntents = (\n [\n 'GuildMessages',\n 'MessageContent'\n ] as const\n ).filter(intent => !client.options.intents.has(intent));\n\n logger.warn(\n colors.yellow().bold(`Message commands are enabled, but the following intents are not enabled:\\n`) +\n `${missingIntents.map(s => ` • ${colors.redBright(s)}`).join('\\n')}`\n );\n }\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 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 .argument('[project]', 'The root directory of your project')\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\n await this.cli.setCurrentDirectory(this.subcommand.args[0]);\n\n const configReader = new ConfigReader(\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.createRolldownLogger());\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/core`)}\\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 if (commands.message && !client.options.intents.has(['GuildMessages', 'MessageContent'])) {\n const missingIntents = (\n [\n 'GuildMessages',\n 'MessageContent'\n ] as const\n ).filter(intent => !client.options.intents.has(intent));\n\n logger.warn(\n colors.yellow().bold(`Message commands are enabled, but the following intents are not enabled:\\n`) +\n `${missingIntents.map(s => ` • ${colors.redBright(s)}`).join('\\n')}`\n );\n }\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 token?: string;\n build?: boolean;\n }\n}\n"],"mappings":"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"}
|
|
@@ -5,14 +5,13 @@ import { ShardingManager } from "discord.js";
|
|
|
5
5
|
|
|
6
6
|
//#region src/bin/commands/startSharding.d.ts
|
|
7
7
|
declare class StartShardingSubcommand extends CLISubcommand {
|
|
8
|
-
parent?: string;
|
|
9
8
|
subcommand: Command;
|
|
10
9
|
execute(): Promise<void>;
|
|
11
10
|
destroyShardingManager(manager: ShardingManager): void;
|
|
12
11
|
}
|
|
13
|
-
declare namespace
|
|
12
|
+
declare namespace StartShardingSubcommand {
|
|
14
13
|
interface Flags extends StartSubcommand.Flags {}
|
|
15
14
|
}
|
|
16
15
|
//#endregion
|
|
17
|
-
export {
|
|
16
|
+
export { StartShardingSubcommand, StartShardingSubcommand as default };
|
|
18
17
|
//# sourceMappingURL=startSharding.d.mts.map
|
|
@@ -11,8 +11,7 @@ import { build } from "tsdown";
|
|
|
11
11
|
|
|
12
12
|
//#region src/bin/commands/startSharding.ts
|
|
13
13
|
var StartShardingSubcommand = class extends CLISubcommand {
|
|
14
|
-
|
|
15
|
-
subcommand = new Command("sharding").description("Start the reciple client in sharding mode").argument("[project]", "The root directory of your project").option("-t, --token <DiscordToken>", "Set your Discord Bot token").option("-b, --build", "Build the modules before starting the client").allowUnknownOption(true);
|
|
14
|
+
subcommand = new Command("start-sharding").description("Start the reciple client in sharding mode").argument("[project]", "The root directory of your project").option("-t, --token <DiscordToken>", "Set your Discord Bot token").option("-b, --build", "Build the modules before starting the client").allowUnknownOption(true);
|
|
16
15
|
async execute() {
|
|
17
16
|
process.env.RECIPLE_SHARDING = "true";
|
|
18
17
|
process.env.RECIPLE_FIRST_SHARD = "true";
|
|
@@ -39,7 +38,7 @@ var StartShardingSubcommand = class extends CLISubcommand {
|
|
|
39
38
|
process.on("warning", (warn) => logger.warn(warn));
|
|
40
39
|
if (flags.build) {
|
|
41
40
|
let plugins = buildConfig.plugins ? Array.isArray(buildConfig.plugins) ? buildConfig.plugins : [buildConfig.plugins] : [];
|
|
42
|
-
plugins.push(CLI.
|
|
41
|
+
plugins.push(CLI.createRolldownLogger());
|
|
43
42
|
await build({
|
|
44
43
|
...buildConfig,
|
|
45
44
|
logLevel: "silent",
|
|
@@ -1 +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
|
|
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 subcommand: Command = new Command('start-sharding')\n .description('Start the reciple client in sharding mode')\n .argument('[project]', 'The root directory of your project')\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<StartShardingSubcommand.Flags>();\n\n await this.cli.setCurrentDirectory(this.subcommand.args[0]);\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 await ConfigReader.find()\n ?? ConfigReader.createConfigFilename('js')\n );\n\n const { config, build: buildConfig, sharding } = await configReader.read();\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.createRolldownLogger());\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 StartShardingSubcommand {\n export interface Flags extends StartSubcommand.Flags {}\n}\n"],"mappings":"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"}
|
|
@@ -47,7 +47,7 @@ declare namespace CLI {
|
|
|
47
47
|
errorMessage?: string;
|
|
48
48
|
}
|
|
49
49
|
function createSpinnerPromise<T>(options: SpinnerPromiseOptions<T>): [Promise<T>, ReturnType<typeof spinner>];
|
|
50
|
-
function
|
|
50
|
+
function createRolldownLogger(_logger?: Logger): RolldownPlugin;
|
|
51
51
|
}
|
|
52
52
|
//#endregion
|
|
53
53
|
export { CLI };
|
package/dist/classes/cli/CLI.mjs
CHANGED
|
@@ -94,7 +94,7 @@ var CLI = class {
|
|
|
94
94
|
(function(_CLI) {
|
|
95
95
|
_CLI.root = path.join(path.dirname(fileURLToPath(import.meta.url)), "../../../");
|
|
96
96
|
_CLI.bin = path.join(CLI.root, "dist/bin/reciple.mjs");
|
|
97
|
-
_CLI.version = "10.0.
|
|
97
|
+
_CLI.version = "10.0.36";
|
|
98
98
|
function stringifyFlags(flags, command, ignored = []) {
|
|
99
99
|
let arr = [];
|
|
100
100
|
for (const [key, value] of Object.entries(flags)) {
|
|
@@ -124,7 +124,7 @@ var CLI = class {
|
|
|
124
124
|
}), loader];
|
|
125
125
|
}
|
|
126
126
|
_CLI.createSpinnerPromise = createSpinnerPromise;
|
|
127
|
-
function
|
|
127
|
+
function createRolldownLogger(_logger = logger) {
|
|
128
128
|
let startedAt;
|
|
129
129
|
return {
|
|
130
130
|
name: "reciple:log-build-completion",
|
|
@@ -146,7 +146,7 @@ var CLI = class {
|
|
|
146
146
|
}
|
|
147
147
|
};
|
|
148
148
|
}
|
|
149
|
-
_CLI.
|
|
149
|
+
_CLI.createRolldownLogger = createRolldownLogger;
|
|
150
150
|
})(CLI || (CLI = {}));
|
|
151
151
|
|
|
152
152
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CLI.mjs","names":[],"sources":["../../../src/classes/cli/CLI.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { fileURLToPath } from 'node:url';\nimport path from 'node:path';\nimport { Format, isDebugging, recursiveDefaults } from '@reciple/utils';\nimport { logger, Logger, LogLevel } from '@prtty/print';\nimport { config as loadEnv } from '@dotenvx/dotenvx';\nimport { readdir, stat } from 'node:fs/promises';\nimport { CLISubcommand } from './CLISubcommand.js';\nimport { spinner, type SpinnerOptions } from '@clack/prompts';\nimport type { RolldownPlugin } from 'rolldown';\nimport { colors } from '@prtty/prtty';\n\nexport class CLI {\n public build: string;\n public version: string;\n public command: Command;\n public logger: Logger;\n\n get isDebugging(): boolean {\n return this.flags.debug;\n }\n\n get flags(): CLI.Flags {\n return this.command.opts();\n }\n\n constructor(public readonly options: CLI.Options) {\n this.build = options.build;\n this.version = String(this.build.split('-')[0]);\n\n this.command = new Command()\n .name(options.name)\n .description(options.description)\n .version(options.build, '-v, --version', 'Output the CLI version number')\n .option('-D, --debug', 'Enable debug mode', isDebugging())\n .option('--no-debug', 'Disabled debug mode')\n .option('--env <file>', 'Load environment variables from .env file', (v, p) => p.concat(v), [] as string[])\n .enablePositionalOptions(true)\n .hook('preAction', this.handlePreAction.bind(this))\n .showHelpAfterError();\n\n this.logger = options.logger instanceof Logger ? options.logger : new Logger(options.logger);\n\n if (this.flags.debug) {\n this.logger.logLevel = LogLevel.Debug;\n this.logger.writeLevel = LogLevel.Debug;\n }\n }\n\n public async parse(argv?: string[]): Promise<this> {\n await this.loadCommands();\n await this.command.parseAsync(argv);\n return this;\n }\n\n public async loadCommands(): Promise<void> {\n this.logger.debug(`Loading cli commands from ${this.options.subcommandsDir}`);\n\n const dirStat = await stat(this.options.subcommandsDir).catch(() => undefined);\n if (!dirStat?.isDirectory()) return;\n\n const files = (await readdir(this.options.subcommandsDir))\n .map(f => path.join(this.options.subcommandsDir, f))\n .filter(f => f.endsWith('.mjs'));\n\n const hasParent: CLISubcommand[] = [];\n\n for (const file of files) {\n const Subommand = recursiveDefaults<CLISubcommand.Constructor>(await import(path.isAbsolute(file) ? `file://${file}` : file));\n if (!Subommand || typeof Subommand !== 'function') continue;\n\n const instance = new Subommand({ cli: this, command: this.command });\n\n if (instance.parent) {\n hasParent.push(instance);\n continue;\n }\n\n CLISubcommand.registerSubcommand(instance);\n }\n\n for (const instance of hasParent) {\n CLISubcommand.registerSubcommand(instance);\n }\n }\n\n public async handlePreAction(cmd: Command, action: Command): Promise<void> {\n this.logger.debug(`Executing ${action.name()}`);\n this.logger.debug(`Debug mode is ${this.flags.debug ? 'enabled' : 'disabled'}`);\n process.env.NODE_ENV = this.flags.debug ? 'development' : process.env.NODE_ENV;\n\n loadEnv({\n path: this.flags.env.length ? this.flags.env : [path.join(process.cwd(), '.env')],\n debug: this.flags.debug,\n quiet: !this.flags.debug,\n ignore: ['MISSING_ENV_FILE']\n });\n\n this.logger.debug(`Loaded environment variables from ${this.flags.env.join(', ')}`);\n }\n\n public async setCurrentDirectory(cwd?: string): Promise<void> {\n cwd ??= process.cwd();\n\n if (!(await stat(cwd).then(s => s.isDirectory()).catch(() => false))) {\n console.log(colors.red('Please specify a valid project directory'));\n process.exit(1);\n }\n\n process.chdir(cwd);\n }\n\n public getFlags<Flags extends Record<string, any> = Record<string, any>>(command: Command|string, mergeDefault?: false): Flags|undefined;\n public getFlags<Flags extends Record<string, any> = Record<string, any>>(command: Command|string, mergeDefault: true): Flags & CLI.Flags|undefined;\n public getFlags(command?: undefined): CLI.Flags;\n public getFlags(command?: Command|string, mergeDefault: boolean = false): Record<string, any>|undefined {\n if (!command) return this.flags;\n\n command = typeof command === 'string' ? this.command.commands.find(c => c.name() === command) : command;\n const flags = command?.opts();\n\n return mergeDefault ? { ...this.flags, ...flags } : flags;\n }\n\n public getCommand(name: string): Command|undefined;\n public getCommand(name?: undefined): Command;\n public getCommand(name?: string): Command|undefined {\n if (!name) return this.command;\n\n return this.command.commands.find(c => c.name() === name);\n }\n}\n\nexport namespace CLI {\n export interface Options {\n name: string;\n description: string;\n build: string;\n subcommandsDir: string;\n logger?: Logger|Logger.Options;\n }\n\n export interface Flags {\n debug: boolean;\n env: string[];\n }\n\n export const root: string = path.join(path.dirname(fileURLToPath(import.meta.url)), '../../../');\n export const bin: string = path.join(CLI.root, 'dist/bin/reciple.mjs');\n export const version = process.env.__VERSION__;\n\n export function stringifyFlags(flags: Record<string, any>, command: Command, ignored: string[] = []): string[] {\n let arr: string[] = [];\n\n for (const [key, value] of Object.entries(flags)) {\n const option = command.options.find(o => o.name() === key || o.attributeName() === key);\n if (!option || ignored.includes(key)) continue;\n\n const flag = option.long ?? option.short ?? `--${option.name()}`;\n\n if (!option.flags.endsWith('>') && !option.flags.endsWith(']') && typeof value === 'boolean') {\n if (value) arr.push(flag);\n continue;\n }\n\n arr.push(flag, String(value));\n }\n\n return arr;\n }\n\n export interface SpinnerPromiseOptions<T> {\n indicator?: SpinnerOptions['indicator'];\n promise: Promise<T>;\n message?: string;\n successMessage?: string;\n errorMessage?: string;\n }\n\n export function createSpinnerPromise<T>(options: SpinnerPromiseOptions<T>): [Promise<T>, ReturnType<typeof spinner>] {\n const loader = spinner({ indicator: options.indicator });\n\n return [\n new Promise<T>((resolve, reject) => {\n loader.start(options.message);\n\n options.promise\n .then((value) => {\n loader.stop(options.successMessage);\n resolve(value);\n })\n .catch((error) => {\n loader.stop(options.errorMessage);\n reject(error);\n });\n }),\n loader\n ];\n }\n\n export function createTsdownLogger(_logger: Logger = logger): RolldownPlugin {\n let startedAt: number;\n\n return {\n name: 'reciple:log-build-completion',\n buildStart: () => {\n _logger.log(colors.green('🚀 Building reciple modules...'));\n startedAt = Date.now();\n },\n renderChunk: (code, info) => {\n const size = Format.bytes(Buffer.byteLength(code, 'utf8'));\n _logger.log(` ├─ ${colors.cyan(size)}\\t${colors.bold(info.fileName)}`);\n\n return { code };\n },\n buildEnd: error => {\n if (error) _logger.error(error)\n },\n closeBundle: () => {\n const time = Format.duration(Date.now() - startedAt);\n _logger.log(colors.green(`✅ Build success in `) + colors.yellow(`${time}`));\n }\n };\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CLI.mjs","names":[],"sources":["../../../src/classes/cli/CLI.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { fileURLToPath } from 'node:url';\nimport path from 'node:path';\nimport { Format, isDebugging, recursiveDefaults } from '@reciple/utils';\nimport { logger, Logger, LogLevel } from '@prtty/print';\nimport { config as loadEnv } from '@dotenvx/dotenvx';\nimport { readdir, stat } from 'node:fs/promises';\nimport { CLISubcommand } from './CLISubcommand.js';\nimport { spinner, type SpinnerOptions } from '@clack/prompts';\nimport type { RolldownPlugin } from 'rolldown';\nimport { colors } from '@prtty/prtty';\n\nexport class CLI {\n public build: string;\n public version: string;\n public command: Command;\n public logger: Logger;\n\n get isDebugging(): boolean {\n return this.flags.debug;\n }\n\n get flags(): CLI.Flags {\n return this.command.opts();\n }\n\n constructor(public readonly options: CLI.Options) {\n this.build = options.build;\n this.version = String(this.build.split('-')[0]);\n\n this.command = new Command()\n .name(options.name)\n .description(options.description)\n .version(options.build, '-v, --version', 'Output the CLI version number')\n .option('-D, --debug', 'Enable debug mode', isDebugging())\n .option('--no-debug', 'Disabled debug mode')\n .option('--env <file>', 'Load environment variables from .env file', (v, p) => p.concat(v), [] as string[])\n .enablePositionalOptions(true)\n .hook('preAction', this.handlePreAction.bind(this))\n .showHelpAfterError();\n\n this.logger = options.logger instanceof Logger ? options.logger : new Logger(options.logger);\n\n if (this.flags.debug) {\n this.logger.logLevel = LogLevel.Debug;\n this.logger.writeLevel = LogLevel.Debug;\n }\n }\n\n public async parse(argv?: string[]): Promise<this> {\n await this.loadCommands();\n await this.command.parseAsync(argv);\n return this;\n }\n\n public async loadCommands(): Promise<void> {\n this.logger.debug(`Loading cli commands from ${this.options.subcommandsDir}`);\n\n const dirStat = await stat(this.options.subcommandsDir).catch(() => undefined);\n if (!dirStat?.isDirectory()) return;\n\n const files = (await readdir(this.options.subcommandsDir))\n .map(f => path.join(this.options.subcommandsDir, f))\n .filter(f => f.endsWith('.mjs'));\n\n const hasParent: CLISubcommand[] = [];\n\n for (const file of files) {\n const Subommand = recursiveDefaults<CLISubcommand.Constructor>(await import(path.isAbsolute(file) ? `file://${file}` : file));\n if (!Subommand || typeof Subommand !== 'function') continue;\n\n const instance = new Subommand({ cli: this, command: this.command });\n\n if (instance.parent) {\n hasParent.push(instance);\n continue;\n }\n\n CLISubcommand.registerSubcommand(instance);\n }\n\n for (const instance of hasParent) {\n CLISubcommand.registerSubcommand(instance);\n }\n }\n\n public async handlePreAction(cmd: Command, action: Command): Promise<void> {\n this.logger.debug(`Executing ${action.name()}`);\n this.logger.debug(`Debug mode is ${this.flags.debug ? 'enabled' : 'disabled'}`);\n process.env.NODE_ENV = this.flags.debug ? 'development' : process.env.NODE_ENV;\n\n loadEnv({\n path: this.flags.env.length ? this.flags.env : [path.join(process.cwd(), '.env')],\n debug: this.flags.debug,\n quiet: !this.flags.debug,\n ignore: ['MISSING_ENV_FILE']\n });\n\n this.logger.debug(`Loaded environment variables from ${this.flags.env.join(', ')}`);\n }\n\n public async setCurrentDirectory(cwd?: string): Promise<void> {\n cwd ??= process.cwd();\n\n if (!(await stat(cwd).then(s => s.isDirectory()).catch(() => false))) {\n console.log(colors.red('Please specify a valid project directory'));\n process.exit(1);\n }\n\n process.chdir(cwd);\n }\n\n public getFlags<Flags extends Record<string, any> = Record<string, any>>(command: Command|string, mergeDefault?: false): Flags|undefined;\n public getFlags<Flags extends Record<string, any> = Record<string, any>>(command: Command|string, mergeDefault: true): Flags & CLI.Flags|undefined;\n public getFlags(command?: undefined): CLI.Flags;\n public getFlags(command?: Command|string, mergeDefault: boolean = false): Record<string, any>|undefined {\n if (!command) return this.flags;\n\n command = typeof command === 'string' ? this.command.commands.find(c => c.name() === command) : command;\n const flags = command?.opts();\n\n return mergeDefault ? { ...this.flags, ...flags } : flags;\n }\n\n public getCommand(name: string): Command|undefined;\n public getCommand(name?: undefined): Command;\n public getCommand(name?: string): Command|undefined {\n if (!name) return this.command;\n\n return this.command.commands.find(c => c.name() === name);\n }\n}\n\nexport namespace CLI {\n export interface Options {\n name: string;\n description: string;\n build: string;\n subcommandsDir: string;\n logger?: Logger|Logger.Options;\n }\n\n export interface Flags {\n debug: boolean;\n env: string[];\n }\n\n export const root: string = path.join(path.dirname(fileURLToPath(import.meta.url)), '../../../');\n export const bin: string = path.join(CLI.root, 'dist/bin/reciple.mjs');\n export const version = process.env.__VERSION__;\n\n export function stringifyFlags(flags: Record<string, any>, command: Command, ignored: string[] = []): string[] {\n let arr: string[] = [];\n\n for (const [key, value] of Object.entries(flags)) {\n const option = command.options.find(o => o.name() === key || o.attributeName() === key);\n if (!option || ignored.includes(key)) continue;\n\n const flag = option.long ?? option.short ?? `--${option.name()}`;\n\n if (!option.flags.endsWith('>') && !option.flags.endsWith(']') && typeof value === 'boolean') {\n if (value) arr.push(flag);\n continue;\n }\n\n arr.push(flag, String(value));\n }\n\n return arr;\n }\n\n export interface SpinnerPromiseOptions<T> {\n indicator?: SpinnerOptions['indicator'];\n promise: Promise<T>;\n message?: string;\n successMessage?: string;\n errorMessage?: string;\n }\n\n export function createSpinnerPromise<T>(options: SpinnerPromiseOptions<T>): [Promise<T>, ReturnType<typeof spinner>] {\n const loader = spinner({ indicator: options.indicator });\n\n return [\n new Promise<T>((resolve, reject) => {\n loader.start(options.message);\n\n options.promise\n .then((value) => {\n loader.stop(options.successMessage);\n resolve(value);\n })\n .catch((error) => {\n loader.stop(options.errorMessage);\n reject(error);\n });\n }),\n loader\n ];\n }\n\n export function createRolldownLogger(_logger: Logger = logger): RolldownPlugin {\n let startedAt: number;\n\n return {\n name: 'reciple:log-build-completion',\n buildStart: () => {\n _logger.log(colors.green('🚀 Building reciple modules...'));\n startedAt = Date.now();\n },\n renderChunk: (code, info) => {\n const size = Format.bytes(Buffer.byteLength(code, 'utf8'));\n _logger.log(` ├─ ${colors.cyan(size)}\\t${colors.bold(info.fileName)}`);\n\n return { code };\n },\n buildEnd: error => {\n if (error) _logger.error(error)\n },\n closeBundle: () => {\n const time = Format.duration(Date.now() - startedAt);\n _logger.log(colors.green(`✅ Build success in `) + colors.yellow(`${time}`));\n }\n };\n }\n}\n"],"mappings":"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"}
|
|
@@ -2,7 +2,6 @@ import { AnyModule } from "../../helpers/types.mjs";
|
|
|
2
2
|
import { Logger } from "@prtty/print";
|
|
3
3
|
import { Client, RecipleError } from "@reciple/core";
|
|
4
4
|
import { Awaitable } from "discord.js";
|
|
5
|
-
import * as globby$1 from "globby";
|
|
6
5
|
import { EventEmitter } from "node:events";
|
|
7
6
|
|
|
8
7
|
//#region src/classes/client/ModuleLoader.d.ts
|
|
@@ -47,7 +46,6 @@ declare namespace ModuleLoader {
|
|
|
47
46
|
outDir: string;
|
|
48
47
|
cwd?: string;
|
|
49
48
|
}
|
|
50
|
-
function getGlobby(): Promise<typeof globby$1>;
|
|
51
49
|
}
|
|
52
50
|
//#endregion
|
|
53
51
|
export { ModuleLoader };
|
|
@@ -18,7 +18,7 @@ import { colors } from "@prtty/prtty";
|
|
|
18
18
|
import { CommandType, RecipleError } from "@reciple/core";
|
|
19
19
|
import "discord.js";
|
|
20
20
|
import micromatch from "micromatch";
|
|
21
|
-
import {
|
|
21
|
+
import { glob, isDynamicPattern } from "tinyglobby";
|
|
22
22
|
import { EventEmitter } from "node:events";
|
|
23
23
|
|
|
24
24
|
//#region src/classes/client/ModuleLoader.ts
|
|
@@ -57,12 +57,11 @@ var ModuleLoader = class ModuleLoader extends EventEmitter {
|
|
|
57
57
|
let scanned = [];
|
|
58
58
|
let directories = [];
|
|
59
59
|
for (const directory of config?.directories ?? []) {
|
|
60
|
-
if (isDynamicPattern(directory
|
|
61
|
-
const matches = await
|
|
60
|
+
if (isDynamicPattern(directory)) {
|
|
61
|
+
const matches = await glob(directory, {
|
|
62
62
|
cwd,
|
|
63
63
|
ignore: config?.ignore,
|
|
64
64
|
onlyDirectories: true,
|
|
65
|
-
baseNameMatch: true,
|
|
66
65
|
absolute: true
|
|
67
66
|
});
|
|
68
67
|
scanned.push(...matches);
|
|
@@ -136,17 +135,11 @@ var ModuleLoader = class ModuleLoader extends EventEmitter {
|
|
|
136
135
|
}
|
|
137
136
|
};
|
|
138
137
|
(function(_ModuleLoader) {
|
|
139
|
-
let globby = null;
|
|
140
138
|
_ModuleLoader.fileTypes = [
|
|
141
139
|
"js",
|
|
142
140
|
"mjs",
|
|
143
141
|
"jsx"
|
|
144
142
|
];
|
|
145
|
-
async function getGlobby() {
|
|
146
|
-
if (globby) return globby;
|
|
147
|
-
return globby = await import("globby");
|
|
148
|
-
}
|
|
149
|
-
_ModuleLoader.getGlobby = getGlobby;
|
|
150
143
|
})(ModuleLoader || (ModuleLoader = {}));
|
|
151
144
|
|
|
152
145
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ModuleLoader.mjs","names":[],"sources":["../../../src/classes/client/ModuleLoader.ts"],"sourcesContent":["import { type Awaitable } from 'discord.js';\nimport path from 'node:path';\nimport { mkdir, readdir, stat } from 'node:fs/promises';\nimport micromatch from 'micromatch';\nimport { globby, isDynamicPattern } from 'globby';\nimport { CommandType, RecipleError, type Client } from '@reciple/core';\nimport type { AnyModule, AnyModuleData } from '../../helpers/types.js';\nimport { recursiveDefaults } from '@reciple/utils';\nimport { BaseModule } from '../modules/BaseModule.js';\nimport { BaseModuleValidator } from '../validation/BaseModuleValidator.js';\nimport { ModuleType } from '../../helpers/constants.js';\nimport { PostconditionModule } from '../modules/PostconditionModule.js';\nimport { PreconditionModule } from '../modules/PreconditionModule.js';\nimport { EventModule } from '../modules/events/EventModule.js';\nimport { MessageCommandModule } from '../modules/commands/MessageCommandModule.js';\nimport { SlashCommandModule } from '../modules/commands/SlashCommandModule.js';\nimport { ContextMenuCommandModule } from '../modules/commands/ContextMenuCommandModule.js';\nimport { CommandModuleValidator } from '../validation/CommandModuleValidator.js';\nimport { EventModuleValidator } from '../validation/EventModuleValidator.js';\nimport { PreconditionModuleValidator } from '../validation/PreconditionModule.js';\nimport { PostconditionModuleValidator } from '../validation/PostconditionModule.js';\nimport type { Logger } from '@prtty/print';\nimport { EventEmitter } from 'node:events';\nimport { colors } from '@prtty/prtty';\n\nexport class ModuleLoader extends EventEmitter<ModuleLoader.Events> {\n public readonly logger: Logger;\n\n constructor(public readonly client: Client) {\n super();\n\n this.logger = this.client.logger.clone({\n label: 'ModuleLoader'\n });\n }\n\n public async findModules(ignoreErrors: boolean = false): Promise<AnyModule[]> {\n const modulePaths = await ModuleLoader.scanForModulePaths(this.client.config?.modules);\n const modules: AnyModule[] = [];\n\n this.emit('modulesResolving', modulePaths);\n\n for (const path of modulePaths) {\n try {\n this.emit('moduleResolving', path);\n const resolved = await ModuleLoader.resolveModuleFromPath(path);\n\n Object.assign(resolved, { client: this.client, __$filepath: path });\n modules.push(resolved);\n\n this.emit('moduleResolved', resolved);\n } catch (error) {\n if (ignoreErrors) continue;\n\n this.emitOrThrow('moduleResolveError', new RecipleError({\n message: `Failed to load module: ${colors.cyan(path)}`,\n cause: error\n }));\n }\n }\n\n this.emit('modulesResolved', modules);\n return modules;\n }\n\n public static async scanForDirectories(config?: Pick<ModuleLoader.Config, 'directories'|'ignore'> & { cwd?: string; createDirectories?: boolean; }) {\n const cwd = config?.cwd ?? process.cwd();\n\n let scanned: string[] = [];\n let directories: string[] = [];\n\n for (const directory of config?.directories ?? []) {\n if (isDynamicPattern(directory, { cwd })) {\n const matches = await globby(directory, {\n cwd,\n ignore: config?.ignore,\n onlyDirectories: true,\n baseNameMatch: true,\n absolute: true\n });\n\n scanned.push(...matches);\n continue;\n }\n\n scanned.push(path.join(cwd, directory));\n }\n\n for (const directory of scanned) {\n const stats = await stat(directory).catch(() => undefined);\n\n if (!stats && config?.createDirectories !== false) {\n await mkdir(directory, { recursive: true });\n }\n\n directories.push(directory);\n }\n\n return directories;\n }\n\n public static async scanForModulePaths(config?: ModuleLoader.Config & { cwd?: string; createDirectories?: boolean; }): Promise<string[]> {\n const directories = await ModuleLoader.scanForDirectories(config);\n\n let modules: string[] = [];\n\n for (const directory of directories) {\n let files = await readdir(directory);\n\n if (config?.ignore?.length) {\n files = micromatch.not(files, config.ignore, {\n cwd: directory,\n matchBase: true,\n dot: true\n });\n }\n\n files = files.map(f => path.join(directory, f));\n\n for (const file of files) {\n if (config?.filter ? !(await config?.filter(file)) : ModuleLoader.fileTypes.every(type => !file.endsWith(`.${type}`))) continue;\n modules.push(file);\n }\n }\n\n if (config?.sort) modules.sort(config.sort);\n\n return modules;\n }\n\n public static async resolveModuleFromPath(filepath: string, options?: { cwd?: string; }): Promise<AnyModule> {\n const stats = await stat(filepath).catch(() => undefined);\n if (!stats) throw new RecipleError(`Module not found: ${filepath}`);\n\n const data = recursiveDefaults<AnyModule|AnyModuleData|undefined>(await import(`file://${path.resolve(options?.cwd ?? process.cwd(), filepath)}`));\n if (BaseModule.isModule(data)) return data;\n\n if (data && 'moduleType' in data) {\n switch (data?.moduleType) {\n case ModuleType.Command:\n CommandModuleValidator.isValid(data);\n switch (data.type) {\n case CommandType.Message: return MessageCommandModule.from(data);\n case CommandType.Slash: return SlashCommandModule.from(data);\n case CommandType.ContextMenu: return ContextMenuCommandModule.from(data);\n default: throw new RecipleError(`Unknown command type from module: ${colors.cyan(filepath)}`);\n }\n case ModuleType.Event:\n EventModuleValidator.isValid(data);\n return EventModule.from(data);\n case ModuleType.Precondition:\n PreconditionModuleValidator.isValid(data);\n return PreconditionModule.from(data);\n case ModuleType.Postcondition:\n PostconditionModuleValidator.isValid(data);\n return PostconditionModule.from(data);\n default:\n BaseModuleValidator.isValid(data);\n return BaseModule.from(data);\n }\n }\n\n BaseModuleValidator.isValid(data);\n return BaseModule.from(data);\n }\n\n public static async resolveSourceDirectories(options: ModuleLoader.ResolveSourceDirectoryOptions): Promise<string[]> {\n const dir = path.isAbsolute(options.baseUrl) ? options.baseUrl : path.resolve(path.join(options.cwd ?? process.cwd(), options.baseUrl));\n\n const root = path.resolve(path.join(dir, options.rootDir));\n const out = path.resolve(path.join(dir, options.outDir));\n\n return options.directories.map(directory => path.resolve(directory).replace(out, root));\n }\n\n private emitOrThrow<K extends keyof Pick<ModuleLoader.Events, 'moduleResolveError'>>(event: K, error: RecipleError) {\n if (this.client.listenerCount(event) > 0) {\n // @ts-expect-error\n return this.emit(event, error);\n }\n\n throw error;\n }\n}\n\nexport namespace ModuleLoader {\n let globby: typeof import('globby')|null = null;\n\n export const fileTypes = [\n 'js',\n 'mjs',\n 'jsx'\n ];\n\n export interface Config {\n directories?: string[];\n ignore?: string[];\n filter?: (filepath: string) => Awaitable<boolean>;\n sort?: (a: string, b: string) => number;\n }\n\n export interface Events {\n moduleResolveError: [error: RecipleError];\n moduleResolved: [module: AnyModule];\n moduleResolving: [filepath: string];\n modulesResolved: [modules: AnyModule[]];\n modulesResolving: [files: string[]];\n }\n\n export interface ResolveSourceDirectoryOptions {\n directories: string[];\n baseUrl: string;\n rootDir: string;\n outDir: string;\n cwd?: string;\n }\n\n export async function getGlobby(): Promise<typeof import('globby')> {\n if (globby) return globby;\n\n return globby = await import('globby');\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ModuleLoader.mjs","names":[],"sources":["../../../src/classes/client/ModuleLoader.ts"],"sourcesContent":["import { type Awaitable } from 'discord.js';\nimport path from 'node:path';\nimport { mkdir, readdir, stat } from 'node:fs/promises';\nimport micromatch from 'micromatch';\nimport { glob, isDynamicPattern } from 'tinyglobby';\nimport { CommandType, RecipleError, type Client } from '@reciple/core';\nimport type { AnyModule, AnyModuleData } from '../../helpers/types.js';\nimport { recursiveDefaults } from '@reciple/utils';\nimport { BaseModule } from '../modules/BaseModule.js';\nimport { BaseModuleValidator } from '../validation/BaseModuleValidator.js';\nimport { ModuleType } from '../../helpers/constants.js';\nimport { PostconditionModule } from '../modules/PostconditionModule.js';\nimport { PreconditionModule } from '../modules/PreconditionModule.js';\nimport { EventModule } from '../modules/events/EventModule.js';\nimport { MessageCommandModule } from '../modules/commands/MessageCommandModule.js';\nimport { SlashCommandModule } from '../modules/commands/SlashCommandModule.js';\nimport { ContextMenuCommandModule } from '../modules/commands/ContextMenuCommandModule.js';\nimport { CommandModuleValidator } from '../validation/CommandModuleValidator.js';\nimport { EventModuleValidator } from '../validation/EventModuleValidator.js';\nimport { PreconditionModuleValidator } from '../validation/PreconditionModule.js';\nimport { PostconditionModuleValidator } from '../validation/PostconditionModule.js';\nimport type { Logger } from '@prtty/print';\nimport { EventEmitter } from 'node:events';\nimport { colors } from '@prtty/prtty';\n\nexport class ModuleLoader extends EventEmitter<ModuleLoader.Events> {\n public readonly logger: Logger;\n\n constructor(public readonly client: Client) {\n super();\n\n this.logger = this.client.logger.clone({\n label: 'ModuleLoader'\n });\n }\n\n public async findModules(ignoreErrors: boolean = false): Promise<AnyModule[]> {\n const modulePaths = await ModuleLoader.scanForModulePaths(this.client.config?.modules);\n const modules: AnyModule[] = [];\n\n this.emit('modulesResolving', modulePaths);\n\n for (const path of modulePaths) {\n try {\n this.emit('moduleResolving', path);\n const resolved = await ModuleLoader.resolveModuleFromPath(path);\n\n Object.assign(resolved, { client: this.client, __$filepath: path });\n modules.push(resolved);\n\n this.emit('moduleResolved', resolved);\n } catch (error) {\n if (ignoreErrors) continue;\n\n this.emitOrThrow('moduleResolveError', new RecipleError({\n message: `Failed to load module: ${colors.cyan(path)}`,\n cause: error\n }));\n }\n }\n\n this.emit('modulesResolved', modules);\n return modules;\n }\n\n public static async scanForDirectories(config?: Pick<ModuleLoader.Config, 'directories'|'ignore'> & { cwd?: string; createDirectories?: boolean; }) {\n const cwd = config?.cwd ?? process.cwd();\n\n let scanned: string[] = [];\n let directories: string[] = [];\n\n for (const directory of config?.directories ?? []) {\n if (isDynamicPattern(directory)) {\n const matches = await glob(directory, {\n cwd,\n ignore: config?.ignore,\n onlyDirectories: true,\n absolute: true\n });\n\n scanned.push(...matches);\n continue;\n }\n\n scanned.push(path.join(cwd, directory));\n }\n\n for (const directory of scanned) {\n const stats = await stat(directory).catch(() => undefined);\n\n if (!stats && config?.createDirectories !== false) {\n await mkdir(directory, { recursive: true });\n }\n\n directories.push(directory);\n }\n\n return directories;\n }\n\n public static async scanForModulePaths(config?: ModuleLoader.Config & { cwd?: string; createDirectories?: boolean; }): Promise<string[]> {\n const directories = await ModuleLoader.scanForDirectories(config);\n\n let modules: string[] = [];\n\n for (const directory of directories) {\n let files = await readdir(directory);\n\n if (config?.ignore?.length) {\n files = micromatch.not(files, config.ignore, {\n cwd: directory,\n matchBase: true,\n dot: true\n });\n }\n\n files = files.map(f => path.join(directory, f));\n\n for (const file of files) {\n if (config?.filter ? !(await config?.filter(file)) : ModuleLoader.fileTypes.every(type => !file.endsWith(`.${type}`))) continue;\n modules.push(file);\n }\n }\n\n if (config?.sort) modules.sort(config.sort);\n\n return modules;\n }\n\n public static async resolveModuleFromPath(filepath: string, options?: { cwd?: string; }): Promise<AnyModule> {\n const stats = await stat(filepath).catch(() => undefined);\n if (!stats) throw new RecipleError(`Module not found: ${filepath}`);\n\n const data = recursiveDefaults<AnyModule|AnyModuleData|undefined>(await import(`file://${path.resolve(options?.cwd ?? process.cwd(), filepath)}`));\n if (BaseModule.isModule(data)) return data;\n\n if (data && 'moduleType' in data) {\n switch (data?.moduleType) {\n case ModuleType.Command:\n CommandModuleValidator.isValid(data);\n switch (data.type) {\n case CommandType.Message: return MessageCommandModule.from(data);\n case CommandType.Slash: return SlashCommandModule.from(data);\n case CommandType.ContextMenu: return ContextMenuCommandModule.from(data);\n default: throw new RecipleError(`Unknown command type from module: ${colors.cyan(filepath)}`);\n }\n case ModuleType.Event:\n EventModuleValidator.isValid(data);\n return EventModule.from(data);\n case ModuleType.Precondition:\n PreconditionModuleValidator.isValid(data);\n return PreconditionModule.from(data);\n case ModuleType.Postcondition:\n PostconditionModuleValidator.isValid(data);\n return PostconditionModule.from(data);\n default:\n BaseModuleValidator.isValid(data);\n return BaseModule.from(data);\n }\n }\n\n BaseModuleValidator.isValid(data);\n return BaseModule.from(data);\n }\n\n public static async resolveSourceDirectories(options: ModuleLoader.ResolveSourceDirectoryOptions): Promise<string[]> {\n const dir = path.isAbsolute(options.baseUrl) ? options.baseUrl : path.resolve(path.join(options.cwd ?? process.cwd(), options.baseUrl));\n\n const root = path.resolve(path.join(dir, options.rootDir));\n const out = path.resolve(path.join(dir, options.outDir));\n\n return options.directories.map(directory => path.resolve(directory).replace(out, root));\n }\n\n private emitOrThrow<K extends keyof Pick<ModuleLoader.Events, 'moduleResolveError'>>(event: K, error: RecipleError) {\n if (this.client.listenerCount(event) > 0) {\n // @ts-expect-error\n return this.emit(event, error);\n }\n\n throw error;\n }\n}\n\nexport namespace ModuleLoader {\n export const fileTypes = [\n 'js',\n 'mjs',\n 'jsx'\n ];\n\n export interface Config {\n directories?: string[];\n ignore?: string[];\n filter?: (filepath: string) => Awaitable<boolean>;\n sort?: (a: string, b: string) => number;\n }\n\n export interface Events {\n moduleResolveError: [error: RecipleError];\n moduleResolved: [module: AnyModule];\n moduleResolving: [filepath: string];\n modulesResolved: [modules: AnyModule[]];\n modulesResolving: [files: string[]];\n }\n\n export interface ResolveSourceDirectoryOptions {\n directories: string[];\n baseUrl: string;\n rootDir: string;\n outDir: string;\n cwd?: string;\n }\n}\n"],"mappings":"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"}
|
|
@@ -11,9 +11,9 @@ let ModuleManager = class ModuleManager {
|
|
|
11
11
|
constructor(client) {
|
|
12
12
|
this.client = client;
|
|
13
13
|
}
|
|
14
|
-
async enableModules({ modules, removeFromCacheOnError } = {
|
|
14
|
+
async enableModules({ modules, removeFromCacheOnError } = {}) {
|
|
15
15
|
const enabledModules = [];
|
|
16
|
-
for (const module of modules ??
|
|
16
|
+
for (const module of modules ?? this.cache.values()) {
|
|
17
17
|
this.emit("modulePreEnable", module);
|
|
18
18
|
await module.onEnable({ client: this.client }).catch((e) => {
|
|
19
19
|
if (removeFromCacheOnError) this.cache.delete(module.id);
|
|
@@ -26,10 +26,10 @@ let ModuleManager = class ModuleManager {
|
|
|
26
26
|
this.emit("enabledModules", enabledModules);
|
|
27
27
|
return enabledModules;
|
|
28
28
|
}
|
|
29
|
-
async readyModules({ modules, removeFromCacheOnError } = {
|
|
29
|
+
async readyModules({ modules, removeFromCacheOnError } = {}) {
|
|
30
30
|
const readyModules = [];
|
|
31
31
|
if (!this.client.isReady()) throw new RecipleError(RecipleError.Code.ClientNotReady());
|
|
32
|
-
for (const module of modules ??
|
|
32
|
+
for (const module of modules ?? this.cache.values()) {
|
|
33
33
|
this.emit("modulePreReady", module);
|
|
34
34
|
await module.onReady({ client: this.client }).catch((e) => {
|
|
35
35
|
if (removeFromCacheOnError !== false) this.remove(module);
|
|
@@ -42,9 +42,9 @@ let ModuleManager = class ModuleManager {
|
|
|
42
42
|
this.emit("readyModules", readyModules);
|
|
43
43
|
return readyModules;
|
|
44
44
|
}
|
|
45
|
-
async disableModules({ modules, removeFromCache } = {
|
|
45
|
+
async disableModules({ modules, removeFromCache } = {}) {
|
|
46
46
|
const disabledModules = [];
|
|
47
|
-
for (const module of modules ??
|
|
47
|
+
for (const module of modules ?? this.cache.values()) {
|
|
48
48
|
this.emit("modulePreDisable", module);
|
|
49
49
|
await module.onDisable({ client: this.client }).catch((e) => {
|
|
50
50
|
if (removeFromCache !== false) this.remove(module);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ModuleManager.mjs","names":[],"sources":["../../../src/classes/managers/ModuleManager.ts"],"sourcesContent":["import { mix } from 'ts-mixer';\nimport { BaseModule } from '../modules/BaseModule.js';\nimport { BaseManager, RecipleError, type Client } from '@reciple/core';\nimport { EventEmitter } from 'node:events';\nimport type { AnyModule } from '../../helpers/types.js';\nimport { ModuleType } from '../../helpers/constants.js';\n\nexport interface ModuleManager extends BaseManager<string, AnyModule, BaseModule.Resolvable>, EventEmitter<ModuleManager.Events> {}\n\n@mix(BaseManager, EventEmitter)\nexport class ModuleManager {\n public readonly holds = BaseModule;\n\n constructor(public readonly client: Client) {}\n\n public async enableModules({ modules, removeFromCacheOnError }: ModuleManager.EventExecuteData & { removeFromCacheOnError?: boolean; } = {
|
|
1
|
+
{"version":3,"file":"ModuleManager.mjs","names":[],"sources":["../../../src/classes/managers/ModuleManager.ts"],"sourcesContent":["import { mix } from 'ts-mixer';\nimport { BaseModule } from '../modules/BaseModule.js';\nimport { BaseManager, RecipleError, type Client } from '@reciple/core';\nimport { EventEmitter } from 'node:events';\nimport type { AnyModule } from '../../helpers/types.js';\nimport { ModuleType } from '../../helpers/constants.js';\n\nexport interface ModuleManager extends BaseManager<string, AnyModule, BaseModule.Resolvable>, EventEmitter<ModuleManager.Events> {}\n\n@mix(BaseManager, EventEmitter)\nexport class ModuleManager {\n public readonly holds = BaseModule;\n\n constructor(public readonly client: Client) {}\n\n public async enableModules(\n { modules, removeFromCacheOnError }: ModuleManager.EventExecuteData & { removeFromCacheOnError?: boolean; } = {}\n ): Promise<AnyModule[]> {\n const enabledModules: AnyModule[] = [];\n\n for (const module of modules ?? this.cache.values()) {\n this.emit('modulePreEnable', module);\n\n await module.onEnable({ client: this.client }).catch(e => {\n if (removeFromCacheOnError) this.cache.delete(module.id);\n this.emitOrThrow('moduleEnableError', module, e);\n });\n\n this.emit('moduleEnable', module);\n this.add(module);\n enabledModules.push(module);\n }\n\n this.emit('enabledModules', enabledModules);\n return enabledModules;\n }\n\n public async readyModules(\n { modules, removeFromCacheOnError }: ModuleManager.EventExecuteData & { removeFromCacheOnError?: boolean; } = {}\n ): Promise<AnyModule[]> {\n const readyModules: AnyModule[] = [];\n\n if (!this.client.isReady()) throw new RecipleError(RecipleError.Code.ClientNotReady());\n\n for (const module of modules ?? this.cache.values()) {\n this.emit('modulePreReady', module);\n\n await module.onReady({ client: this.client }).catch(e => {\n if (removeFromCacheOnError !== false) this.remove(module);\n this.emitOrThrow('moduleReadyError', module, e);\n });\n\n this.emit('moduleReady', module);\n this.cache.set(module.id, module);\n readyModules.push(module);\n }\n\n this.emit('readyModules', readyModules);\n return readyModules;\n }\n\n public async disableModules(\n { modules, removeFromCache }: ModuleManager.EventExecuteData & { removeFromCache?: boolean; } = {}\n ): Promise<AnyModule[]> {\n const disabledModules: AnyModule[] = [];\n\n for (const module of modules ?? this.cache.values()) {\n this.emit('modulePreDisable', module);\n\n await module.onDisable({ client: this.client }).catch(e => {\n if (removeFromCache !== false) this.remove(module);\n this.emitOrThrow('moduleDisableError', module, e);\n });\n\n this.emit('moduleDisable', module);\n if (removeFromCache !== false) this.remove(module);\n disabledModules.push(module);\n }\n\n this.emit('disabledModules', disabledModules);\n return disabledModules;\n }\n\n public add(module: AnyModule): void {\n this.cache.set(module.id, module);\n\n if (!('moduleType' in module)) return;\n\n switch (module.moduleType) {\n case ModuleType.Command:\n this.client.commands?.add(module);\n break;\n case ModuleType.Event:\n this.client.eventListeners.register(module);\n break;\n case ModuleType.Precondition:\n this.client.preconditions?.cache.set(module.id, module);\n break;\n case ModuleType.Postcondition:\n this.client.postconditions?.cache.set(module.id, module);\n break;\n default:\n break;\n }\n }\n\n public remove(module: AnyModule): void {\n this.cache.delete(module.id);\n\n if (!('moduleType' in module)) return;\n\n switch (module.moduleType) {\n case ModuleType.Command:\n this.client.commands?.cache.delete(module.id);\n break;\n case ModuleType.Event:\n this.client.eventListeners.unregister(module);\n break;\n case ModuleType.Precondition:\n this.client.preconditions?.cache.delete(module.id);\n break;\n case ModuleType.Postcondition:\n this.client.postconditions?.cache.delete(module.id);\n break;\n default:\n break;\n }\n }\n\n private emitOrThrow<K extends keyof Pick<ModuleManager.Events, 'moduleDisableError'|'moduleEnableError'|'moduleReadyError'>>(event: K, ...args: ModuleManager.Events[K]) {\n if (this.client.listenerCount(event) > 0) {\n return this.emit(event, ...(args as never));\n }\n\n throw args[1];\n }\n}\n\nexport namespace ModuleManager {\n export interface Events {\n modulePreEnable: [module: AnyModule];\n moduleEnable: [module: AnyModule];\n moduleEnableError: [module: AnyModule, error: Error];\n enabledModules: [modules: AnyModule[]];\n\n modulePreReady: [module: AnyModule];\n moduleReady: [module: AnyModule];\n moduleReadyError: [module: AnyModule, error: Error];\n readyModules: [modules: AnyModule[]];\n\n modulePreDisable: [module: AnyModule];\n moduleDisable: [module: AnyModule];\n moduleDisableError: [module: AnyModule, error: Error];\n disabledModules: [modules: AnyModule[]];\n }\n\n export interface EventExecuteData {\n modules?: AnyModule[];\n }\n}\n"],"mappings":";;;;;;;;AAUO,0BAAM,cAAc;CACvB,AAAgB,QAAQ;CAExB,YAAY,AAAgB,QAAgB;EAAhB;;CAE5B,MAAa,cACT,EAAE,SAAS,2BAAmG,EAAE,EAC5F;EACpB,MAAM,iBAA8B,EAAE;AAEtC,OAAK,MAAM,UAAU,WAAW,KAAK,MAAM,QAAQ,EAAE;AACjD,QAAK,KAAK,mBAAmB,OAAO;AAEpC,SAAM,OAAO,SAAS,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC,OAAM,MAAK;AACtD,QAAI,uBAAwB,MAAK,MAAM,OAAO,OAAO,GAAG;AACxD,SAAK,YAAY,qBAAqB,QAAQ,EAAE;KAClD;AAEF,QAAK,KAAK,gBAAgB,OAAO;AACjC,QAAK,IAAI,OAAO;AAChB,kBAAe,KAAK,OAAO;;AAG/B,OAAK,KAAK,kBAAkB,eAAe;AAC3C,SAAO;;CAGX,MAAa,aACT,EAAE,SAAS,2BAAmG,EAAE,EAC5F;EACpB,MAAM,eAA4B,EAAE;AAEpC,MAAI,CAAC,KAAK,OAAO,SAAS,CAAE,OAAM,IAAI,aAAa,aAAa,KAAK,gBAAgB,CAAC;AAEtF,OAAK,MAAM,UAAU,WAAW,KAAK,MAAM,QAAQ,EAAE;AACjD,QAAK,KAAK,kBAAkB,OAAO;AAEnC,SAAM,OAAO,QAAQ,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC,OAAM,MAAK;AACrD,QAAI,2BAA2B,MAAO,MAAK,OAAO,OAAO;AACzD,SAAK,YAAY,oBAAoB,QAAQ,EAAE;KACjD;AAEF,QAAK,KAAK,eAAe,OAAO;AAChC,QAAK,MAAM,IAAI,OAAO,IAAI,OAAO;AACjC,gBAAa,KAAK,OAAO;;AAG7B,OAAK,KAAK,gBAAgB,aAAa;AACvC,SAAO;;CAGX,MAAa,eACT,EAAE,SAAS,oBAAqF,EAAE,EAC9E;EACpB,MAAM,kBAA+B,EAAE;AAEvC,OAAK,MAAM,UAAU,WAAW,KAAK,MAAM,QAAQ,EAAE;AACjD,QAAK,KAAK,oBAAoB,OAAO;AAErC,SAAM,OAAO,UAAU,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC,OAAM,MAAK;AACvD,QAAI,oBAAoB,MAAO,MAAK,OAAO,OAAO;AAClD,SAAK,YAAY,sBAAsB,QAAQ,EAAE;KACnD;AAEF,QAAK,KAAK,iBAAiB,OAAO;AAClC,OAAI,oBAAoB,MAAO,MAAK,OAAO,OAAO;AAClD,mBAAgB,KAAK,OAAO;;AAGhC,OAAK,KAAK,mBAAmB,gBAAgB;AAC7C,SAAO;;CAGX,AAAO,IAAI,QAAyB;AAChC,OAAK,MAAM,IAAI,OAAO,IAAI,OAAO;AAEjC,MAAI,EAAE,gBAAgB,QAAS;AAE/B,UAAQ,OAAO,YAAf;GACI,KAAK,WAAW;AACZ,SAAK,OAAO,UAAU,IAAI,OAAO;AACjC;GACJ,KAAK,WAAW;AACZ,SAAK,OAAO,eAAe,SAAS,OAAO;AAC3C;GACJ,KAAK,WAAW;AACZ,SAAK,OAAO,eAAe,MAAM,IAAI,OAAO,IAAI,OAAO;AACvD;GACJ,KAAK,WAAW;AACZ,SAAK,OAAO,gBAAgB,MAAM,IAAI,OAAO,IAAI,OAAO;AACxD;GACJ,QACI;;;CAIZ,AAAO,OAAO,QAAyB;AACnC,OAAK,MAAM,OAAO,OAAO,GAAG;AAE5B,MAAI,EAAE,gBAAgB,QAAS;AAE/B,UAAQ,OAAO,YAAf;GACI,KAAK,WAAW;AACZ,SAAK,OAAO,UAAU,MAAM,OAAO,OAAO,GAAG;AAC7C;GACJ,KAAK,WAAW;AACZ,SAAK,OAAO,eAAe,WAAW,OAAO;AAC7C;GACJ,KAAK,WAAW;AACZ,SAAK,OAAO,eAAe,MAAM,OAAO,OAAO,GAAG;AAClD;GACJ,KAAK,WAAW;AACZ,SAAK,OAAO,gBAAgB,MAAM,OAAO,OAAO,GAAG;AACnD;GACJ,QACI;;;CAIZ,AAAQ,YAAqH,OAAU,GAAG,MAA+B;AACrK,MAAI,KAAK,OAAO,cAAc,MAAM,GAAG,EACnC,QAAO,KAAK,KAAK,OAAO,GAAI,KAAe;AAG/C,QAAM,KAAK;;;4BA7HlB,IAAI,aAAa,aAAa"}
|
|
@@ -24,13 +24,13 @@ declare class BaseModuleValidator extends Validator {
|
|
|
24
24
|
onDisable: Function | undefined;
|
|
25
25
|
}>>;
|
|
26
26
|
static resolvable: _sapphire_shapeshift0.UnionValidator<_sapphire_shapeshift0.UndefinedToOptional<{
|
|
27
|
-
toJSON: Function;
|
|
28
|
-
}> | _sapphire_shapeshift0.UndefinedToOptional<{
|
|
29
27
|
id: string | undefined;
|
|
30
28
|
moduleType: ModuleType | undefined;
|
|
31
29
|
onEnable: Function | undefined;
|
|
32
30
|
onReady: Function | undefined;
|
|
33
31
|
onDisable: Function | undefined;
|
|
32
|
+
}> | _sapphire_shapeshift0.UndefinedToOptional<{
|
|
33
|
+
toJSON: Function;
|
|
34
34
|
}>>;
|
|
35
35
|
static isValidId(id: unknown): asserts id is string;
|
|
36
36
|
static isValidModuleType(moduleType: unknown): asserts moduleType is ModuleType;
|
|
@@ -46,8 +46,6 @@ declare class EventModuleValidator extends Validator {
|
|
|
46
46
|
onEvent: Function;
|
|
47
47
|
}>>;
|
|
48
48
|
static resolvable: _sapphire_shapeshift0.UnionValidator<_sapphire_shapeshift0.UndefinedToOptional<{
|
|
49
|
-
toJSON: Function;
|
|
50
|
-
}> | _sapphire_shapeshift0.UndefinedToOptional<{
|
|
51
49
|
id: string | undefined;
|
|
52
50
|
moduleType: ModuleType | undefined;
|
|
53
51
|
onEnable: Function | undefined;
|
|
@@ -62,6 +60,8 @@ declare class EventModuleValidator extends Validator {
|
|
|
62
60
|
event: string;
|
|
63
61
|
once: boolean | undefined;
|
|
64
62
|
onEvent: Function;
|
|
63
|
+
}> | _sapphire_shapeshift0.UndefinedToOptional<{
|
|
64
|
+
toJSON: Function;
|
|
65
65
|
}>>;
|
|
66
66
|
static isValidEmitter(emitter: unknown): asserts emitter is EventEmitter;
|
|
67
67
|
static isValidEvent(event: unknown): asserts event is string;
|
|
@@ -15,10 +15,10 @@ declare class PostconditionModuleValidator extends Validator {
|
|
|
15
15
|
execute: Function;
|
|
16
16
|
}>>;
|
|
17
17
|
static resolvable: _sapphire_shapeshift0.UnionValidator<_sapphire_shapeshift0.UndefinedToOptional<{
|
|
18
|
+
toJSON: Function;
|
|
19
|
+
}> | _sapphire_shapeshift0.UndefinedToOptional<{
|
|
18
20
|
scope: CommandType[] | undefined;
|
|
19
21
|
execute: Function;
|
|
20
|
-
}> | _sapphire_shapeshift0.UndefinedToOptional<{
|
|
21
|
-
toJSON: Function;
|
|
22
22
|
}>>;
|
|
23
23
|
static isValidScope(scope: unknown): asserts scope is CommandType[];
|
|
24
24
|
static isValidAccepts(accepts: unknown): asserts accepts is CommandPostconditionReason[];
|
package/dist/package.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
//#region package.json
|
|
2
2
|
var package_default = {
|
|
3
3
|
name: "reciple",
|
|
4
|
-
version: "10.0.
|
|
4
|
+
version: "10.0.36",
|
|
5
5
|
license: "LGPL-3.0-only",
|
|
6
6
|
description: "The CLI for reciple",
|
|
7
7
|
module: "./dist/index.mjs",
|
|
@@ -37,7 +37,7 @@ var package_default = {
|
|
|
37
37
|
},
|
|
38
38
|
dependencies: {
|
|
39
39
|
"@clack/prompts": "^1.1.0",
|
|
40
|
-
"@dotenvx/dotenvx": "^1.
|
|
40
|
+
"@dotenvx/dotenvx": "^1.55.1",
|
|
41
41
|
"@prtty/print": "catalog:",
|
|
42
42
|
"@prtty/prtty": "catalog:",
|
|
43
43
|
"@reciple/utils": "workspace:^",
|
|
@@ -45,11 +45,11 @@ var package_default = {
|
|
|
45
45
|
"@sapphire/snowflake": "^3.5.5",
|
|
46
46
|
"commander": "^14.0.3",
|
|
47
47
|
"github-slugger": "^2.0.0",
|
|
48
|
-
"globby": "^16.1.1",
|
|
49
48
|
"jiti": "^2.6.1",
|
|
50
49
|
"micromatch": "^4.0.8",
|
|
51
50
|
"nypm": "^0.6.5",
|
|
52
51
|
"pkg-types": "^2.3.0",
|
|
52
|
+
"tinyglobby": "^0.2.15",
|
|
53
53
|
"ts-mixer": "^6.0.4",
|
|
54
54
|
"tsdown": "catalog:"
|
|
55
55
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "reciple",
|
|
3
|
-
"version": "10.0.
|
|
3
|
+
"version": "10.0.36",
|
|
4
4
|
"license": "LGPL-3.0-only",
|
|
5
5
|
"description": "The CLI for reciple",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
38
|
"@clack/prompts": "^1.1.0",
|
|
39
|
-
"@dotenvx/dotenvx": "^1.
|
|
39
|
+
"@dotenvx/dotenvx": "^1.55.1",
|
|
40
40
|
"@prtty/print": "^1.1.3",
|
|
41
41
|
"@prtty/prtty": "^1.1.2",
|
|
42
42
|
"@reciple/utils": "^10.0.2",
|
|
@@ -44,13 +44,13 @@
|
|
|
44
44
|
"@sapphire/snowflake": "^3.5.5",
|
|
45
45
|
"commander": "^14.0.3",
|
|
46
46
|
"github-slugger": "^2.0.0",
|
|
47
|
-
"globby": "^16.1.1",
|
|
48
47
|
"jiti": "^2.6.1",
|
|
49
48
|
"micromatch": "^4.0.8",
|
|
50
49
|
"nypm": "^0.6.5",
|
|
51
50
|
"pkg-types": "^2.3.0",
|
|
51
|
+
"tinyglobby": "^0.2.15",
|
|
52
52
|
"ts-mixer": "^6.0.4",
|
|
53
|
-
"tsdown": "^0.21.
|
|
53
|
+
"tsdown": "^0.21.4"
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
56
|
"@reciple/jsx": "^10.0.9",
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
"typescript": "^5.9.3"
|
|
62
62
|
},
|
|
63
63
|
"peerDependencies": {
|
|
64
|
-
"@reciple/core": "^10.0.
|
|
64
|
+
"@reciple/core": "^10.0.4",
|
|
65
65
|
"discord.js": "^14.25.1"
|
|
66
66
|
},
|
|
67
67
|
"peerDependenciesMeta": {
|