reciple 9.4.0 → 9.5.0

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.
Files changed (51) hide show
  1. package/README.md +11 -13
  2. package/dist/bin.js +2 -131
  3. package/dist/bin.js.map +1 -1
  4. package/dist/classes/CLI.d.ts +54 -0
  5. package/dist/classes/CLI.js +188 -0
  6. package/dist/classes/CLI.js.map +1 -0
  7. package/dist/classes/Config.d.ts +28 -51
  8. package/dist/classes/Config.js +54 -56
  9. package/dist/classes/Config.js.map +1 -1
  10. package/dist/classes/EventHandlers.d.ts +9 -0
  11. package/dist/classes/EventHandlers.js +71 -0
  12. package/dist/classes/EventHandlers.js.map +1 -0
  13. package/dist/classes/ModuleLoader.d.ts +25 -0
  14. package/dist/classes/ModuleLoader.js +95 -0
  15. package/dist/classes/ModuleLoader.js.map +1 -0
  16. package/dist/commands/dev.d.ts +12 -0
  17. package/dist/commands/dev.js +140 -0
  18. package/dist/commands/dev.js.map +1 -0
  19. package/dist/commands/init.d.ts +7 -0
  20. package/dist/commands/init.js +10 -0
  21. package/dist/commands/init.js.map +1 -0
  22. package/dist/commands/shard.d.ts +9 -0
  23. package/dist/commands/shard.js +101 -0
  24. package/dist/commands/shard.js.map +1 -0
  25. package/dist/commands/start.d.ts +9 -0
  26. package/dist/commands/start.js +94 -0
  27. package/dist/commands/start.js.map +1 -0
  28. package/dist/exports.d.ts +5 -9
  29. package/dist/exports.js +5 -3
  30. package/dist/exports.js.map +1 -1
  31. package/dist/index.d.ts +5 -1
  32. package/dist/index.js +3 -0
  33. package/dist/index.js.map +1 -1
  34. package/dist/types/constants.d.ts +6 -0
  35. package/dist/types/constants.js +29 -0
  36. package/dist/types/constants.js.map +1 -0
  37. package/dist/types/structures.d.ts +36 -0
  38. package/dist/types/structures.js +2 -0
  39. package/dist/types/structures.js.map +1 -0
  40. package/package.json +8 -5
  41. package/static/config.d.mts +3 -1
  42. package/static/config.mjs +18 -0
  43. package/dist/utils/cli.d.ts +0 -60
  44. package/dist/utils/cli.js +0 -79
  45. package/dist/utils/cli.js.map +0 -1
  46. package/dist/utils/logger.d.ts +0 -31
  47. package/dist/utils/logger.js +0 -87
  48. package/dist/utils/logger.js.map +0 -1
  49. package/dist/utils/modules.d.ts +0 -10
  50. package/dist/utils/modules.js +0 -44
  51. package/dist/utils/modules.js.map +0 -1
@@ -1,75 +1,73 @@
1
- import { Logger, RecipleError } from '@reciple/core';
2
- import { recursiveDefaults, existsAsync } from '@reciple/utils';
3
- import { mkdir, readFile, writeFile } from 'node:fs/promises';
4
- import { kleur } from 'fallout-utility/strings';
5
- import { cliVersion } from '../utils/cli.js';
6
- import { fileURLToPath } from 'node:url';
7
1
  import path from 'node:path';
8
- export class ConfigReader {
9
- static defaultConfigFile = path.join(path.dirname(fileURLToPath(import.meta.url)), '../../static/config.mjs');
10
- /**
11
- * Reads the default configuration data, processes it, and returns the resulting configuration string.
12
- *
13
- * @return {Promise<string>} The default configuration data as a string.
14
- */
15
- static async readDefaultConfig() {
16
- return recursiveDefaults(await import(this.defaultConfigFile));
17
- }
18
- /**
19
- * Reads the default configuration data, processes it, and returns the resulting configuration string.
20
- *
21
- * @return {Promise<string>} The default configuration data as a string.
22
- */
2
+ import { CLI } from './CLI.js';
3
+ import { existsAsync, recursiveDefaults } from '@reciple/utils';
4
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
5
+ import { cliVersion } from '../types/constants.js';
6
+ import { FileWriteStreamMode, Logger, RecipleError } from '@reciple/core';
7
+ import { kleur } from 'fallout-utility';
8
+ export class Config {
9
+ constructor() { }
10
+ static defaultConfigFile = path.join(CLI.root, './static/config.mjs');
23
11
  static async getDefaultConfigData() {
24
- let defaultConfig = (await readFile(this.defaultConfigFile, 'utf-8')).replaceAll('\r\n', '\n');
12
+ return recursiveDefaults(await import('file://' + Config.defaultConfigFile));
13
+ }
14
+ static async getDefaultConfigContent() {
15
+ let defaultConfig = (await readFile(Config.defaultConfigFile, 'utf-8')).replaceAll('\r\n', '\n');
25
16
  defaultConfig = defaultConfig.replace(`import { cliVersion } from 'reciple';\n`, '');
26
17
  defaultConfig = defaultConfig.replace('version: `^${cliVersion}`', 'version: `^' + cliVersion + '`');
27
18
  return defaultConfig;
28
19
  }
29
- /**
30
- * Reads a JavaScript configuration file and returns its contents as a `RecipleConfigJS` object.
31
- * If the file does not exist, it can optionally create the file and return a default configuration.
32
- *
33
- * @param {string|{ paths: string[]; default?: string; }} config - The path to the configuration file or an object specifying multiple paths and a default path.
34
- * @param {boolean} [createIfNotExists=true] - Whether to create the configuration file if it does not exist.
35
- * @return {Promise<RecipleConfigJS|null>} A promise that resolves to the contents of the configuration file as a `RecipleConfigJS` object, or `null` if the file does not exist and `createIfNotExists` is `false`.
36
- * @throws {RecipleError} If the configuration file does not contain valid data.
37
- */
38
- static async readConfigJS(config, createIfNotExists = true) {
39
- if (typeof config !== 'string') {
40
- let data = null;
41
- for (const file of config.paths) {
42
- data = await this.readConfigJS(file, false);
43
- if (data)
44
- break;
45
- }
46
- return data ?? this.readConfigJS(config.default ?? config.paths[0], createIfNotExists);
47
- }
48
- const file = path.resolve(config);
49
- const isFile = path.isAbsolute(config) || await existsAsync(file) || ['reciple.js', 'reciple.mjs'].includes(config);
50
- if (isFile && !await existsAsync(file)) {
51
- if (!createIfNotExists)
20
+ static async readConfigFile(options) {
21
+ const file = path.resolve(options.path);
22
+ const fileExists = await existsAsync(file);
23
+ const isFile = path.isAbsolute(options.path) || fileExists || options.path.startsWith('.') || ['reciple.js', 'reciple.mjs'].includes(options.path);
24
+ if (isFile && !fileExists) {
25
+ if (!options.createIfNotExists)
52
26
  return null;
53
- await this.createConfigJS(file);
27
+ await Config.createConfigFile(file);
54
28
  }
55
- const data = recursiveDefaults(await import(isFile ? ('file://' + file) : config));
29
+ const data = recursiveDefaults(await import(isFile ? ('file://' + file) : options.path));
56
30
  if (!data || !('config' in data))
57
31
  throw new RecipleError(`Invalid config data in ${kleur.yellow("'" + file) + "'"}`);
58
32
  return data;
59
33
  }
60
- /**
61
- * Creates a configuration file if it doesn't exist and returns the file path.
62
- *
63
- * @param {string} file - The path to the configuration file.
64
- * @return {Promise<string>} The path of the created or existing configuration file.
65
- */
66
- static async createConfigJS(file) {
34
+ static async createConfigFile(file) {
67
35
  if (await existsAsync(file))
68
36
  return file;
69
- const defaultConfig = await this.getDefaultConfigData();
37
+ const defaultConfig = await Config.getDefaultConfigContent();
70
38
  await mkdir(path.dirname(file), { recursive: true });
71
- await writeFile(file, defaultConfig);
39
+ await writeFile(file, defaultConfig, 'utf-8');
72
40
  return file;
73
41
  }
42
+ static async createLoggerOptions(config, options, cli) {
43
+ const loggerConfig = !(config.logger instanceof Logger) ? config.logger : undefined;
44
+ let file = loggerConfig?.logToFile.enabled && loggerConfig?.logToFile.logsFolder && loggerConfig?.logToFile.file
45
+ ? path.join(loggerConfig?.logToFile.logsFolder, loggerConfig?.logToFile.file)
46
+ : undefined;
47
+ if (CLI.shardMode && loggerConfig?.logToFile.enabled) {
48
+ const folder = CLI.shardLogsFolder ?? loggerConfig?.logToFile.logsFolder;
49
+ file = path.join(folder, `${(process.env.SHARDS ? process.env.SHARDS + '-' : '') + (CLI.threadId !== null ? (CLI.threadId + '-') : '') + process.pid}.log`);
50
+ }
51
+ if (cli && file)
52
+ cli.logPath = file;
53
+ const data = {
54
+ ...options,
55
+ debugmode: {
56
+ ...options?.debugmode,
57
+ enabled: options?.debugmode?.enabled ?? (typeof loggerConfig?.debugmode === 'boolean'
58
+ ? loggerConfig?.debugmode
59
+ : undefined)
60
+ },
61
+ writeStream: loggerConfig?.logToFile.enabled && file
62
+ ? await Logger.createFileWriteStream({
63
+ mode: FileWriteStreamMode.Rename,
64
+ path: file
65
+ })
66
+ : undefined,
67
+ label: (cli?.shardMode ? `Shards ${process.env.SHARDS ?? CLI.threadId}` : null) || options?.label
68
+ };
69
+ logger.debug(`Created logger options:`, data);
70
+ return data;
71
+ }
74
72
  }
75
73
  //# sourceMappingURL=Config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Config.js","sourceRoot":"","sources":["../../src/classes/Config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Config.js","sourceRoot":"","sources":["../../src/classes/Config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { type RecipleClient } from '../index.js';
2
+ export declare class EventHandlers {
3
+ private constructor();
4
+ static addClientEvents(client: RecipleClient): void;
5
+ static addCommandExecuteHandlers(client: RecipleClient): void;
6
+ private static quoteString;
7
+ static addExitListener(listener: (signal: NodeJS.Signals) => any, once?: boolean): void;
8
+ static removeExitListener(listener: (signal: NodeJS.Signals) => any): void;
9
+ }
@@ -0,0 +1,71 @@
1
+ import {} from '../index.js';
2
+ import { RecipleModule } from '@reciple/core';
3
+ import { kleur } from 'fallout-utility';
4
+ export class EventHandlers {
5
+ constructor() { }
6
+ static addClientEvents(client) {
7
+ client.on('recipleDebug', debug => client.logger?.debug(debug));
8
+ client.modules.on('resolveModuleFileError', (file, error) => client.logger?.error(`Failed to resolve module ${kleur.yellow(EventHandlers.quoteString(file))}:`, error));
9
+ client.modules.on('preStartModule', (m) => {
10
+ if (!RecipleModule.getModuleRoot(m))
11
+ Reflect.set(m, 'root', cli.cwd);
12
+ client.logger?.debug(`Starting module ${kleur.cyan(EventHandlers.quoteString(m.displayName))}`);
13
+ });
14
+ client.modules.on('postStartModule', (m) => client.logger?.log(`Started module ${kleur.cyan(EventHandlers.quoteString(m.displayName))}`));
15
+ client.modules.on('startModuleError', (m, err) => client.logger?.error(`Failed to start module ${kleur.yellow(EventHandlers.quoteString(m.displayName))}:`, err));
16
+ client.modules.on('preLoadModule', (m) => client.logger?.debug(`Loading module ${kleur.cyan(EventHandlers.quoteString(m.displayName))}`));
17
+ client.modules.on('postLoadModule', (m) => client.logger?.log(`Loaded module ${kleur.cyan(EventHandlers.quoteString(m.displayName))}`));
18
+ client.modules.on('loadModuleError', (m, err) => client.logger?.error(`Failed to load module ${kleur.yellow(EventHandlers.quoteString(m.displayName))}:`, err));
19
+ client.modules.on('preUnloadModule', (m) => client.logger?.debug(`Unloading module ${kleur.cyan(EventHandlers.quoteString(m.displayName))}`));
20
+ client.modules.on('postUnloadModule', (m) => client.logger?.log(`Unloaded module ${kleur.cyan(EventHandlers.quoteString(m.displayName))}`));
21
+ client.modules.on('unloadModuleError', (m, err) => client.logger?.error(`Failed to unload module ${kleur.yellow(EventHandlers.quoteString(m.displayName))}:`, err));
22
+ client.on('recipleRegisterApplicationCommands', (commands, guild) => client.logger?.log(`Registered (${commands?.size || 0}) application commands ${guild ? 'to ' + guild : 'globally'}`));
23
+ }
24
+ static addCommandExecuteHandlers(client) {
25
+ client.on('interactionCreate', async (interaction) => {
26
+ if (interaction.isChatInputCommand())
27
+ await client.commands?.execute(interaction);
28
+ if (interaction.isContextMenuCommand())
29
+ await client.commands?.execute(interaction);
30
+ });
31
+ client.on('messageCreate', async (message) => {
32
+ await client.commands?.execute(message);
33
+ });
34
+ }
35
+ static quoteString(string, quote = "'") {
36
+ return `${quote}${string}${quote}`;
37
+ }
38
+ static addExitListener(listener, once) {
39
+ if (!once) {
40
+ process.on('SIGHUP', listener);
41
+ process.on('SIGINT', listener);
42
+ process.on('SIGQUIT', listener);
43
+ process.on('SIGABRT', listener);
44
+ process.on('SIGALRM', listener);
45
+ process.on('SIGTERM', listener);
46
+ process.on('SIGBREAK', listener);
47
+ process.on('SIGUSR2', listener);
48
+ }
49
+ else {
50
+ process.once('SIGHUP', listener);
51
+ process.once('SIGINT', listener);
52
+ process.once('SIGQUIT', listener);
53
+ process.once('SIGABRT', listener);
54
+ process.once('SIGALRM', listener);
55
+ process.once('SIGTERM', listener);
56
+ process.once('SIGBREAK', listener);
57
+ process.once('SIGUSR2', listener);
58
+ }
59
+ }
60
+ static removeExitListener(listener) {
61
+ process.removeListener('SIGHUP', listener);
62
+ process.removeListener('SIGINT', listener);
63
+ process.removeListener('SIGQUIT', listener);
64
+ process.removeListener('SIGABRT', listener);
65
+ process.removeListener('SIGALRM', listener);
66
+ process.removeListener('SIGTERM', listener);
67
+ process.removeListener('SIGBREAK', listener);
68
+ process.removeListener('SIGUSR2', listener);
69
+ }
70
+ }
71
+ //# sourceMappingURL=EventHandlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventHandlers.js","sourceRoot":"","sources":["../../src/classes/EventHandlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { type Awaitable } from 'fallout-utility';
2
+ import type { RecipleConfig } from '../types/structures.js';
3
+ import type { RecipleModule } from '@reciple/core';
4
+ import type { RecipleClient } from '../index.js';
5
+ export interface ModuleLoaderGetModulePathsOptions {
6
+ config: Exclude<RecipleConfig['modules'], undefined>;
7
+ filter?: (file: string) => Awaitable<boolean>;
8
+ cwd?: string;
9
+ }
10
+ export interface ModuleLoaderActionData {
11
+ success: RecipleModule[];
12
+ failed: RecipleModule[];
13
+ }
14
+ export declare class ModuleLoader {
15
+ static globby?: typeof import('globby');
16
+ static stopping: boolean;
17
+ private constructor();
18
+ static getModulePaths(options: ModuleLoaderGetModulePathsOptions): Promise<string[]>;
19
+ static startModules(client: RecipleClient, modules: RecipleModule[]): Promise<ModuleLoaderActionData>;
20
+ static loadModules(client: RecipleClient, modules: RecipleModule[]): Promise<ModuleLoaderActionData>;
21
+ static unloadModules(client: RecipleClient, modules: RecipleModule[]): Promise<ModuleLoaderActionData>;
22
+ static processExitHandleModuleUnload(client: RecipleClient, signal: NodeJS.Signals): Promise<void>;
23
+ static defaultModulePathsFilter(file: string): Awaitable<boolean>;
24
+ static getGlobby(): Promise<typeof import('globby')>;
25
+ }
@@ -0,0 +1,95 @@
1
+ import { kleur } from 'fallout-utility';
2
+ import micromatch from 'micromatch';
3
+ import path from 'node:path';
4
+ import { existsAsync } from '@reciple/utils';
5
+ import { lstat, mkdir, readdir } from 'node:fs/promises';
6
+ import { setTimeout as sleep } from 'node:timers/promises';
7
+ export class ModuleLoader {
8
+ static globby;
9
+ static stopping = false;
10
+ constructor() { }
11
+ static async getModulePaths(options) {
12
+ const paths = [];
13
+ const { globby, isDynamicPattern } = await ModuleLoader.getGlobby();
14
+ const cwd = options?.cwd ?? process.cwd();
15
+ for (const folder of options.config.dirs) {
16
+ const folderPath = path.isAbsolute(folder) ? folder : path.join(cwd, folder);
17
+ if (isDynamicPattern(folder, { cwd })) {
18
+ let dirs = await globby(folder, {
19
+ cwd: process.cwd(),
20
+ onlyDirectories: true,
21
+ absolute: true
22
+ });
23
+ if (options.config?.exclude?.length) {
24
+ dirs = dirs.filter(f => !micromatch.isMatch(path.basename(f), options.config.exclude));
25
+ }
26
+ paths.push(...await ModuleLoader.getModulePaths({
27
+ ...options,
28
+ config: {
29
+ ...options.config,
30
+ dirs
31
+ }
32
+ }));
33
+ continue;
34
+ }
35
+ if (!await existsAsync(folderPath))
36
+ await mkdir(folderPath, { recursive: true });
37
+ if (!(await lstat(folderPath)).isDirectory())
38
+ continue;
39
+ const files = (await readdir(folderPath))
40
+ .map(file => path
41
+ .join(folderPath, file))
42
+ .filter(f => !options.config?.exclude?.length || !micromatch.isMatch(path.basename(f), options.config.exclude))
43
+ .filter(file => (options.filter ? options.filter(file) : ModuleLoader.defaultModulePathsFilter(file)));
44
+ await Promise.all(files.map(async (f) => {
45
+ if (options.config.filter) {
46
+ const allowed = !!await Promise.resolve(options.config.filter(f));
47
+ if (!allowed)
48
+ return;
49
+ }
50
+ if (!await existsAsync(f))
51
+ return;
52
+ paths.push(f);
53
+ }));
54
+ }
55
+ if (options.config?.sort)
56
+ paths.sort(options.config.sort);
57
+ return paths;
58
+ }
59
+ static async startModules(client, modules) {
60
+ const success = await client.modules.startModules({ modules });
61
+ const failed = modules.filter(m => !success.some(s => s.id === m.id));
62
+ return { success, failed };
63
+ }
64
+ static async loadModules(client, modules) {
65
+ const success = await client.modules.loadModules({ modules });
66
+ const failed = modules.filter(m => !success.some(s => s.id === m.id));
67
+ return { success, failed };
68
+ }
69
+ static async unloadModules(client, modules) {
70
+ const success = await client.modules.unloadModules({ modules });
71
+ const failed = modules.filter(m => !success.some(s => s.id === m.id));
72
+ return { success, failed };
73
+ }
74
+ static async processExitHandleModuleUnload(client, signal) {
75
+ if (ModuleLoader.stopping)
76
+ return;
77
+ ModuleLoader.stopping = true;
78
+ client.logger?.warn(`Received exit signal: ${signal}`);
79
+ await client.destroy(true);
80
+ const signalString = signal === 'SIGINT' ? 'keyboard interrupt' : signal === 'SIGTERM' ? 'terminate' : String(signal);
81
+ client.logger?.warn(`Process exited: ${kleur.yellow(signalString)}`);
82
+ await sleep(10);
83
+ client.logger?.closeFileWriteStream();
84
+ process.exit(0);
85
+ }
86
+ static defaultModulePathsFilter(file) {
87
+ return file.endsWith('.js') || file.endsWith('.mjs');
88
+ }
89
+ static async getGlobby() {
90
+ if (ModuleLoader.globby)
91
+ return ModuleLoader.globby;
92
+ return (ModuleLoader.globby = await import('globby'));
93
+ }
94
+ }
95
+ //# sourceMappingURL=ModuleLoader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModuleLoader.js","sourceRoot":"","sources":["../../src/classes/ModuleLoader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { Command } from 'commander';
2
+ import { CLI } from '../classes/CLI.js';
3
+ import type { CLIStartFlags } from './start.js';
4
+ export interface CLIDevFlags extends CLIStartFlags {
5
+ watch?: string[];
6
+ ignore?: string[];
7
+ exec?: string[];
8
+ nostart: boolean;
9
+ killSignal?: NodeJS.Signals;
10
+ }
11
+ declare const _default: (command: Command, cli: CLI) => Command;
12
+ export default _default;
@@ -0,0 +1,140 @@
1
+ import { CLI } from '../classes/CLI.js';
2
+ import { Logger } from '@reciple/core';
3
+ import { Config, EventHandlers } from '../exports.js';
4
+ import { watch } from 'chokidar';
5
+ import { fork } from 'node:child_process';
6
+ import { kleur } from 'fallout-utility';
7
+ import micromatch from 'micromatch';
8
+ import path from 'node:path';
9
+ import { config as loadEnv } from 'dotenv';
10
+ export default (command, cli) => command
11
+ .command('dev')
12
+ .description('Starts the bot in development mode')
13
+ .option('-t, --token <DiscordToken>', 'Set your Discord Bot token')
14
+ .option('-c, --config <file>', 'Set the config file path', 'reciple.mjs')
15
+ .option('--watch <files>', 'Files to watch for changes', (v, p) => p.concat(v), [])
16
+ .option('--ignore <files>', 'Files to ignore', (v, p) => p.concat(v), [])
17
+ .option('--exec <script>', 'Execute a script', (v, p) => p.concat(v), [])
18
+ .option('--nostart', 'Do not start the bot')
19
+ .option('--killSignal <signal>', 'Signal to send to the child process', 'SIGINT')
20
+ .allowUnknownOption(true)
21
+ .action(async () => {
22
+ let logger = cli.logger ?? null;
23
+ if (logger)
24
+ logger.label = 'Dev';
25
+ const startFlags = CLI.stringifyFlags(cli.getFlags('dev'), cli.getCommand('dev'));
26
+ const recipleFlags = CLI.stringifyFlags(cli.getFlags(), cli.getCommand(), ['cwd']);
27
+ const processFlags = [...startFlags, ...recipleFlags];
28
+ const flags = cli.getFlags('dev', true);
29
+ const configFile = path.parse(flags.config ?? 'reciple.mjs').base;
30
+ let defaultConfig = (await Config.getDefaultConfigData()).devmode;
31
+ let config = await Config.readConfigFile({ path: flags.config, createIfNotExists: false }).then(config => config?.devmode);
32
+ let watcher = null;
33
+ let childProcess = null;
34
+ let throttle = null;
35
+ let hardRefreshTargets = ['package.json', '.env*', 'tsconfig.json', 'reciple.*js', configFile];
36
+ await createWatcher();
37
+ async function createWatcher() {
38
+ if (watcher) {
39
+ watcher.removeAllListeners();
40
+ watcher.close();
41
+ watcher = null;
42
+ }
43
+ if (throttle) {
44
+ clearTimeout(throttle);
45
+ throttle = null;
46
+ }
47
+ logger?.debug(`Starting chokidar watcher...`);
48
+ watcher = watch(config?.watch ?? defaultConfig?.watch ?? cli.cwd, {
49
+ ignored: config?.ignore ?? defaultConfig?.ignore,
50
+ ignoreInitial: true,
51
+ cwd: cli.cwd,
52
+ alwaysStat: true
53
+ });
54
+ await new Promise(resolve => watcher?.on('ready', resolve));
55
+ logger?.debug(`Chokidar watcher is ready!`);
56
+ throttle = setTimeout(() => createChildProcess(), 0);
57
+ watcher.on('all', (event, target, stats) => {
58
+ logger?.debug(`Chokidar event: ${kleur.cyan(event)}; target: ${kleur.green().dim(target)}`);
59
+ if (throttle) {
60
+ clearTimeout(throttle);
61
+ throttle = null;
62
+ }
63
+ throttle = setTimeout(async () => {
64
+ const hardRefreshHits = target && micromatch([target], hardRefreshTargets) || [];
65
+ if (hardRefreshHits.length) {
66
+ logger?.debug(`Hard refresh hits: ${hardRefreshHits.join(', ')}`);
67
+ logger?.debug(`Hard refreshing...`);
68
+ loadEnv({ path: flags.env });
69
+ await createWatcher();
70
+ return;
71
+ }
72
+ await createChildProcess();
73
+ }, 1000);
74
+ });
75
+ }
76
+ async function killChildProcess() {
77
+ if (!childProcess || childProcess.killed)
78
+ return;
79
+ const pid = childProcess.pid;
80
+ logger?.debug(`Killing child process: ${pid}`);
81
+ childProcess.removeAllListeners();
82
+ const promise = new Promise(resolve => childProcess?.once('exit', () => {
83
+ childProcess = null;
84
+ resolve();
85
+ }));
86
+ childProcess.kill(flags.killSignal ?? config?.killSignal ?? 'SIGINT');
87
+ await promise;
88
+ logger?.debug(`Child process killed: ${pid}`);
89
+ }
90
+ async function createChildProcess() {
91
+ if (childProcess)
92
+ await killChildProcess();
93
+ if (throttle) {
94
+ clearTimeout(throttle);
95
+ throttle = null;
96
+ }
97
+ CLI.clearConsole();
98
+ const exec = [...(config?.exec ?? []), ...(flags.exec ?? [])];
99
+ if (exec.length > 0) {
100
+ for (const script of exec) {
101
+ try {
102
+ logger?.log(`${kleur.cyan('$')} ${kleur.gray(script)}`);
103
+ CLI.run(script, {
104
+ cwd: cli.cwd,
105
+ stdio: ['ignore', 'inherit', 'inherit'],
106
+ env: process.env
107
+ });
108
+ CLI.clearConsole();
109
+ }
110
+ catch (error) {
111
+ logger?.error(error);
112
+ logger?.error(kleur.red(`Failed to execute script: ${kleur.gray(script)}`));
113
+ logger?.error(kleur.red(`Waiting for the next file changes...`));
114
+ return;
115
+ }
116
+ }
117
+ }
118
+ if (flags.nostart) {
119
+ logger?.log(kleur.green(`Waiting for the next file changes...`));
120
+ return;
121
+ }
122
+ logger?.log(kleur.green(`Starting bot...`));
123
+ logger?.debug(`Starting bot in development mode with flags: ${kleur.dim(processFlags.join(' '))}`);
124
+ childProcess = fork(cli.binPath, processFlags, {
125
+ cwd: cli.cwd,
126
+ stdio: 'inherit',
127
+ env: process.env
128
+ });
129
+ childProcess.on('exit', code => {
130
+ const color = code === 0 ? kleur.green : kleur.red;
131
+ logger?.log(color(`Process process exited with code: ${code}`));
132
+ logger?.log(color(`Waiting for the next file changes...`));
133
+ });
134
+ }
135
+ EventHandlers.addExitListener(async () => {
136
+ await killChildProcess();
137
+ process.exit(0);
138
+ }, true);
139
+ });
140
+ //# sourceMappingURL=dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { Command } from 'commander';
2
+ import type { CLI } from '../classes/CLI.js';
3
+ export interface CLIInitFlags {
4
+ config: string;
5
+ }
6
+ declare const _default: (command: Command, cli: CLI) => Command;
7
+ export default _default;
@@ -0,0 +1,10 @@
1
+ import { Config } from '../classes/Config.js';
2
+ export default (command, cli) => command
3
+ .command('init')
4
+ .option('-c, --config <file>', 'Set the config file path', 'reciple.mjs')
5
+ .description('Initializes the config file')
6
+ .action(async () => {
7
+ const flags = cli.getFlags('init');
8
+ await Config.readConfigFile({ path: flags.config, createIfNotExists: true });
9
+ });
10
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAM9C,eAAe,CAAC,OAAgB,EAAE,GAAQ,EAAE,EAAE,CAAC,OAAO;KACjD,OAAO,CAAC,MAAM,CAAC;KACf,MAAM,CAAC,qBAAqB,EAAE,0BAA0B,EAAE,aAAa,CAAC;KACxE,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,KAAK,IAAI,EAAE;IACf,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAe,MAAM,CAAE,CAAC;IAElD,MAAM,MAAM,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;AACjF,CAAC,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { Command } from 'commander';
2
+ import { CLI } from '../classes/CLI.js';
3
+ import type { CLIStartFlags } from './start.js';
4
+ import { ShardingManager } from 'discord.js';
5
+ export interface CLIShardFlags extends CLIStartFlags {
6
+ }
7
+ declare const _default: (command: Command, cli: CLI) => Command;
8
+ export default _default;
9
+ export declare function stopShardsProcess(shards: ShardingManager): void;