reciple 10.0.3 → 10.0.5
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/dist/bin/commands/build.mjs +1 -1
- package/dist/bin/commands/build.mjs.map +1 -1
- package/dist/bin/commands/createModule.mjs +1 -1
- package/dist/bin/commands/createModule.mjs.map +1 -1
- package/dist/bin/commands/startSharding.mjs +1 -1
- package/dist/bin/commands/startSharding.mjs.map +1 -1
- package/dist/classes/cli/CLI.mjs +1 -1
- package/dist/classes/cli/ConfigReader.d.mts +3 -1
- package/dist/classes/cli/ConfigReader.mjs +7 -2
- package/dist/classes/cli/ConfigReader.mjs.map +1 -1
- package/dist/classes/templates/TemplateBuilder.mjs +1 -1
- package/dist/classes/templates/TemplateBuilder.mjs.map +1 -1
- package/dist/classes/validation/BaseModuleValidator.d.mts +10 -10
- package/dist/classes/validation/CommandModuleValidator.d.mts +17 -17
- package/dist/classes/validation/EventModuleValidator.d.mts +11 -10
- package/dist/classes/validation/PreconditionModule.d.mts +7 -7
- package/dist/package.mjs +1 -1
- package/package.json +1 -1
|
@@ -8,7 +8,7 @@ import { build } from "tsdown";
|
|
|
8
8
|
var BuildSubcommand = class extends CLISubcommand {
|
|
9
9
|
subcommand = new Command("build").description("Build the reciple modules defined in config file").option("-c, --config <path>", "Path to the configuration file");
|
|
10
10
|
async execute() {
|
|
11
|
-
const { build: buildConfig } = await new ConfigReader(this.subcommand.opts().config ?? await ConfigReader.find() ?? ConfigReader.createConfigFilename("js")).read();
|
|
11
|
+
const { build: buildConfig } = await new ConfigReader(this.subcommand.opts().config ?? await ConfigReader.find() ?? ConfigReader.createConfigFilename("js")).read({ ignoreInstanceCheck: true });
|
|
12
12
|
let plugins = buildConfig.plugins ? Array.isArray(buildConfig.plugins) ? buildConfig.plugins : [buildConfig.plugins] : [];
|
|
13
13
|
plugins.push(CLI.createTsdownLogger(this.cli.logger));
|
|
14
14
|
await build({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.mjs","names":[],"sources":["../../../src/bin/commands/build.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { CLISubcommand } from '../../classes/cli/CLISubcommand.js';\nimport { ConfigReader } from '../../classes/cli/ConfigReader.js';\nimport { build } from 'tsdown';\nimport { CLI } from '../../classes/cli/CLI.js';\n\nexport default class BuildSubcommand extends CLISubcommand {\n public subcommand: Command = new Command('build')\n .description('Build the reciple modules defined in config file')\n .option('-c, --config <path>', 'Path to the configuration file');\n\n public async execute(): Promise<void> {\n const flags = this.subcommand.opts<BuildSubcommand.Flags>();\n\n const configReader = new ConfigReader(\n flags.config\n ?? await ConfigReader.find()\n ?? ConfigReader.createConfigFilename('js')\n );\n\n const { build: buildConfig } = await configReader.read();\n\n let plugins = buildConfig.plugins\n ? Array.isArray(buildConfig.plugins)\n ? buildConfig.plugins\n : [buildConfig.plugins]\n : [];\n\n plugins.push(CLI.createTsdownLogger(this.cli.logger));\n\n await build({\n ...buildConfig,\n logLevel: 'silent',\n plugins,\n });\n }\n}\n\nexport namespace BuildSubcommand {\n export interface Flags {\n config?: string;\n }\n}\n"],"mappings":";;;;;;;AAMA,IAAqB,kBAArB,cAA6C,cAAc;CACvD,AAAO,aAAsB,IAAI,QAAQ,QAAQ,CAC5C,YAAY,mDAAmD,CAC/D,OAAO,uBAAuB,iCAAiC;CAEpE,MAAa,UAAyB;EASlC,MAAM,EAAE,OAAO,gBAAgB,MANV,IAAI,aAFX,KAAK,WAAW,MAA6B,CAGjD,UACH,MAAM,aAAa,MAAM,IACzB,aAAa,qBAAqB,KAAK,CAC7C,CAEiD,MAAM;
|
|
1
|
+
{"version":3,"file":"build.mjs","names":[],"sources":["../../../src/bin/commands/build.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { CLISubcommand } from '../../classes/cli/CLISubcommand.js';\nimport { ConfigReader } from '../../classes/cli/ConfigReader.js';\nimport { build } from 'tsdown';\nimport { CLI } from '../../classes/cli/CLI.js';\n\nexport default class BuildSubcommand extends CLISubcommand {\n public subcommand: Command = new Command('build')\n .description('Build the reciple modules defined in config file')\n .option('-c, --config <path>', 'Path to the configuration file');\n\n public async execute(): Promise<void> {\n const flags = this.subcommand.opts<BuildSubcommand.Flags>();\n\n const configReader = new ConfigReader(\n flags.config\n ?? await ConfigReader.find()\n ?? ConfigReader.createConfigFilename('js')\n );\n\n const { build: buildConfig } = await configReader.read({ ignoreInstanceCheck: true });\n\n let plugins = buildConfig.plugins\n ? Array.isArray(buildConfig.plugins)\n ? buildConfig.plugins\n : [buildConfig.plugins]\n : [];\n\n plugins.push(CLI.createTsdownLogger(this.cli.logger));\n\n await build({\n ...buildConfig,\n logLevel: 'silent',\n plugins,\n });\n }\n}\n\nexport namespace BuildSubcommand {\n export interface Flags {\n config?: string;\n }\n}\n"],"mappings":";;;;;;;AAMA,IAAqB,kBAArB,cAA6C,cAAc;CACvD,AAAO,aAAsB,IAAI,QAAQ,QAAQ,CAC5C,YAAY,mDAAmD,CAC/D,OAAO,uBAAuB,iCAAiC;CAEpE,MAAa,UAAyB;EASlC,MAAM,EAAE,OAAO,gBAAgB,MANV,IAAI,aAFX,KAAK,WAAW,MAA6B,CAGjD,UACH,MAAM,aAAa,MAAM,IACzB,aAAa,qBAAqB,KAAK,CAC7C,CAEiD,KAAK,EAAE,qBAAqB,MAAM,CAAC;EAErF,IAAI,UAAU,YAAY,UACpB,MAAM,QAAQ,YAAY,QAAQ,GAC9B,YAAY,UACZ,CAAC,YAAY,QAAQ,GACzB,EAAE;AAER,UAAQ,KAAK,IAAI,mBAAmB,KAAK,IAAI,OAAO,CAAC;AAErD,QAAM,MAAM;GACR,GAAG;GACH,UAAU;GACV;GACH,CAAC"}
|
|
@@ -13,7 +13,7 @@ var CreateModuleSubcommand = class extends CLISubcommand {
|
|
|
13
13
|
parent = "create";
|
|
14
14
|
async execute() {
|
|
15
15
|
const flags = this.subcommand.opts();
|
|
16
|
-
const configReader = await new ConfigReader(flags.config ?? await ConfigReader.find() ?? ConfigReader.createConfigFilename("js")).read();
|
|
16
|
+
const configReader = await new ConfigReader(flags.config ?? await ConfigReader.find() ?? ConfigReader.createConfigFilename("js")).read({ ignoreInstanceCheck: true });
|
|
17
17
|
const template = new ModuleTemplateBuilder({
|
|
18
18
|
cli: this.cli,
|
|
19
19
|
config: configReader,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createModule.mjs","names":[],"sources":["../../../src/bin/commands/createModule.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { CLISubcommand } from '../../classes/cli/CLISubcommand.js';\nimport { ConfigReader } from '../../classes/cli/ConfigReader.js';\nimport { ModuleTemplateBuilder } from '../../classes/templates/ModuleTemplateBuilder.js';\nimport { cancel } from '@clack/prompts';\nimport { colors } from '@prtty/prtty';\nimport { NotAnError } from '../../classes/NotAnError.js';\nimport { inspect } from 'node:util';\n\nexport default class CreateModuleSubcommand extends CLISubcommand {\n public subcommand: Command = new Command('module')\n .description('Creates new module')\n .argument('[output]', 'The directory to create the module in')\n .option('--template, -t <template>', 'Template source name')\n .option('--filename', 'The filename of the module')\n .option('-c, --config <path>', 'Path to the configuration file')\n .option('-T, --typescript', 'Use TypeScript')\n .option('-D, --default', 'Use defaults for prompts')\n .enablePositionalOptions(true);\n\n public parent: string = 'create';\n\n public async execute(): Promise<void> {\n const flags = this.subcommand.opts<CreateModuleSubcommand.Flags>();\n\n const configReader = await new ConfigReader(\n flags.config\n ?? await ConfigReader.find()\n ?? ConfigReader.createConfigFilename('js')\n ).read();\n\n const template = new ModuleTemplateBuilder({\n cli: this.cli,\n config: configReader,\n typescript: flags.typescript,\n filename: flags.filename,\n defaultAll: flags?.default\n });\n\n try {\n await template.init();\n await template.setupLanguage();\n await template.setupTemplate();\n await template.setupPlaceholders();\n await template.setupDirectory();\n await template.setupFilename();\n await template.build();\n } catch (error) {\n cancel(colors.red(error instanceof NotAnError ? error.message : inspect(error)));\n }\n }\n}\n\nexport namespace CreateModuleSubcommand {\n export interface Flags {\n template?: string;\n filename?: string;\n config?: string;\n typescript?: boolean;\n default?: boolean;\n }\n}\n"],"mappings":";;;;;;;;;;AASA,IAAqB,yBAArB,cAAoD,cAAc;CAC9D,AAAO,aAAsB,IAAI,QAAQ,SAAS,CAC7C,YAAY,qBAAqB,CACjC,SAAS,YAAY,wCAAwC,CAC7D,OAAO,6BAA6B,uBAAuB,CAC3D,OAAO,cAAc,6BAA6B,CAClD,OAAO,uBAAuB,iCAAiC,CAC/D,OAAO,oBAAoB,iBAAiB,CAC5C,OAAO,iBAAiB,2BAA2B,CACnD,wBAAwB,KAAK;CAElC,AAAO,SAAiB;CAExB,MAAa,UAAyB;EAClC,MAAM,QAAQ,KAAK,WAAW,MAAoC;EAElE,MAAM,eAAe,MAAM,IAAI,aAC3B,MAAM,UACH,MAAM,aAAa,MAAM,IACzB,aAAa,qBAAqB,KAAK,CAC7C,CAAC,MAAM;
|
|
1
|
+
{"version":3,"file":"createModule.mjs","names":[],"sources":["../../../src/bin/commands/createModule.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { CLISubcommand } from '../../classes/cli/CLISubcommand.js';\nimport { ConfigReader } from '../../classes/cli/ConfigReader.js';\nimport { ModuleTemplateBuilder } from '../../classes/templates/ModuleTemplateBuilder.js';\nimport { cancel } from '@clack/prompts';\nimport { colors } from '@prtty/prtty';\nimport { NotAnError } from '../../classes/NotAnError.js';\nimport { inspect } from 'node:util';\n\nexport default class CreateModuleSubcommand extends CLISubcommand {\n public subcommand: Command = new Command('module')\n .description('Creates new module')\n .argument('[output]', 'The directory to create the module in')\n .option('--template, -t <template>', 'Template source name')\n .option('--filename', 'The filename of the module')\n .option('-c, --config <path>', 'Path to the configuration file')\n .option('-T, --typescript', 'Use TypeScript')\n .option('-D, --default', 'Use defaults for prompts')\n .enablePositionalOptions(true);\n\n public parent: string = 'create';\n\n public async execute(): Promise<void> {\n const flags = this.subcommand.opts<CreateModuleSubcommand.Flags>();\n\n const configReader = await new ConfigReader(\n flags.config\n ?? await ConfigReader.find()\n ?? ConfigReader.createConfigFilename('js')\n ).read({ ignoreInstanceCheck: true });\n\n const template = new ModuleTemplateBuilder({\n cli: this.cli,\n config: configReader,\n typescript: flags.typescript,\n filename: flags.filename,\n defaultAll: flags?.default\n });\n\n try {\n await template.init();\n await template.setupLanguage();\n await template.setupTemplate();\n await template.setupPlaceholders();\n await template.setupDirectory();\n await template.setupFilename();\n await template.build();\n } catch (error) {\n cancel(colors.red(error instanceof NotAnError ? error.message : inspect(error)));\n }\n }\n}\n\nexport namespace CreateModuleSubcommand {\n export interface Flags {\n template?: string;\n filename?: string;\n config?: string;\n typescript?: boolean;\n default?: boolean;\n }\n}\n"],"mappings":";;;;;;;;;;AASA,IAAqB,yBAArB,cAAoD,cAAc;CAC9D,AAAO,aAAsB,IAAI,QAAQ,SAAS,CAC7C,YAAY,qBAAqB,CACjC,SAAS,YAAY,wCAAwC,CAC7D,OAAO,6BAA6B,uBAAuB,CAC3D,OAAO,cAAc,6BAA6B,CAClD,OAAO,uBAAuB,iCAAiC,CAC/D,OAAO,oBAAoB,iBAAiB,CAC5C,OAAO,iBAAiB,2BAA2B,CACnD,wBAAwB,KAAK;CAElC,AAAO,SAAiB;CAExB,MAAa,UAAyB;EAClC,MAAM,QAAQ,KAAK,WAAW,MAAoC;EAElE,MAAM,eAAe,MAAM,IAAI,aAC3B,MAAM,UACH,MAAM,aAAa,MAAM,IACzB,aAAa,qBAAqB,KAAK,CAC7C,CAAC,KAAK,EAAE,qBAAqB,MAAM,CAAC;EAErC,MAAM,WAAW,IAAI,sBAAsB;GACvC,KAAK,KAAK;GACV,QAAQ;GACR,YAAY,MAAM;GAClB,UAAU,MAAM;GAChB,YAAY,OAAO;GACtB,CAAC;AAEF,MAAI;AACA,SAAM,SAAS,MAAM;AACrB,SAAM,SAAS,eAAe;AAC9B,SAAM,SAAS,eAAe;AAC9B,SAAM,SAAS,mBAAmB;AAClC,SAAM,SAAS,gBAAgB;AAC/B,SAAM,SAAS,eAAe;AAC9B,SAAM,SAAS,OAAO;WACjB,OAAO;AACZ,UAAO,OAAO,IAAI,iBAAiB,aAAa,MAAM,UAAU,QAAQ,MAAM,CAAC,CAAC"}
|
|
@@ -23,7 +23,7 @@ var StartShardingSubcommand = class extends CLISubcommand {
|
|
|
23
23
|
"start",
|
|
24
24
|
...CLI.stringifyFlags(flags, this.command)
|
|
25
25
|
];
|
|
26
|
-
const { config, build: buildConfig, sharding } = await new ConfigReader(flags.config ?? await ConfigReader.find() ?? ConfigReader.createConfigFilename("js")).read();
|
|
26
|
+
const { config, build: buildConfig, sharding } = await new ConfigReader(flags.config ?? await ConfigReader.find() ?? ConfigReader.createConfigFilename("js")).read({ ignoreInstanceCheck: true });
|
|
27
27
|
const logger = config.logger instanceof Logger ? this.cli.logger = config.logger : this.cli.logger.clone(config.logger);
|
|
28
28
|
logger.label = "ShardingManager";
|
|
29
29
|
let token = flags.token || config.token || "";
|
|
@@ -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 parent?: string = 'start';\n\n public subcommand: Command = new Command('sharding')\n .description('Start the reciple client in sharding mode')\n .option('-c, --config <path>', 'Path to the configuration file')\n .option('-t, --token <DiscordToken>', 'Set your Discord Bot token')\n .option('-b, --build', 'Build the modules before starting the client')\n .allowUnknownOption(true);\n\n public async execute(): Promise<void> {\n process.env.RECIPLE_SHARDING = 'true';\n process.env.RECIPLE_FIRST_SHARD = 'true';\n\n const recipleFlags = this.cli.getFlags();\n const flags = this.subcommand.opts<ShardingSubcommand.Flags>();\n\n const shardArgs: string[] = [\n ...CLI.stringifyFlags(recipleFlags, this.cli.command),\n 'start',\n ...CLI.stringifyFlags(flags, this.command)\n ];\n\n const configReader = new ConfigReader(\n flags.config\n ?? await ConfigReader.find()\n ?? ConfigReader.createConfigFilename('js')\n );\n\n const { config, build: buildConfig, sharding } = await configReader.read();\n\n const logger = config.logger instanceof Logger ? this.cli.logger = config.logger : this.cli.logger.clone(config.logger);\n\n logger.label = 'ShardingManager';\n\n let token = flags.token || config.token || '';\n token = resolveEnvProtocol(token) || token;\n\n logger.log(colors.magenta(`⚡ Initializing reciple sharding manager!`));\n\n const processErrorLogger = (err: any) => {\n logger?.error(err);\n process.exit(1);\n };\n\n process.once('uncaughtException', processErrorLogger);\n process.once('unhandledRejection', processErrorLogger);\n process.on('warning', warn => logger.warn(warn));\n\n if (flags.build) {\n let plugins = buildConfig.plugins\n ? Array.isArray(buildConfig.plugins)\n ? buildConfig.plugins\n : [buildConfig.plugins]\n : [];\n\n plugins.push(CLI.createTsdownLogger());\n\n await build({\n ...buildConfig,\n logLevel: 'silent',\n plugins,\n });\n }\n\n if (!sharding) {\n logger.error('Sharding is not enabled in the config file');\n process.exit(1);\n }\n\n Reflect.set(global, 'useLogger', () => logger);\n\n const eventListeners = new EventListeners();\n const manager = new ShardingManager(CLI.bin, {\n ...sharding,\n token: token,\n shardArgs\n });\n\n manager.on('shardCreate', shard => {\n logger.log(colors.magenta(`🚀 Launched shard ${colors.green(String(shard.id))}`));\n\n shard.on('ready', () => {\n logger.log(colors.magenta(`✅ Shard ${colors.green(String(shard.id))} is ready!`));\n\n if (process.env.RECIPLE_FIRST_SHARD === 'true') {\n process.env.RECIPLE_FIRST_SHARD = 'false';\n }\n });\n\n shard.on('reconnecting', () => {\n logger.log(colors.magenta(`🔄 Shard ${colors.green(String(shard.id))} is reconnecting...`));\n });\n\n shard.on('resume', () => {\n logger.log(colors.magenta(`✅ Shard ${colors.green(String(shard.id))} has resumed!`));\n });\n\n shard.on('disconnect', () => {\n logger.log(colors.magenta(`🛑 Shard ${colors.green(String(shard.id))} is disconnected!`));\n });\n\n shard.on('death', () => {\n logger.error(`🛑 Shard ${colors.green(String(shard.id))} has died!`);\n });\n\n shard.on('error', error => {\n logger.error(`❌ Shard ${colors.green(String(shard.id))} encountered an error:`, error);\n });\n\n shard.on('message', message => {\n // TODO: Handle shard messages\n });\n });\n\n eventListeners.registerProcessExitEvents(signal => this.destroyShardingManager(manager));\n process.stdin.resume();\n\n await manager.spawn();\n }\n\n public destroyShardingManager(manager: ShardingManager): void {\n const logger = useLogger();\n\n manager.shards.map(s => {\n logger.log(colors.magenta(`🚧 Destroying shard ${s.id}`));\n\n if (s.process) {\n s.process.kill();\n } else {\n s.kill();\n }\n\n logger.log(colors.magenta(`🛑 Destroyed shard ${s.id}`));\n });\n\n logger.log(colors.magenta(`🚨 Destroyed all shards`));\n setTimeout(() => process.exit(0), 500);\n }\n}\n\nexport namespace ShardingSubcommand {\n export interface Flags extends StartSubcommand.Flags {}\n}\n"],"mappings":";;;;;;;;;;;;AAYA,IAAqB,0BAArB,cAAqD,cAAc;CAC/D,AAAO,SAAkB;CAEzB,AAAO,aAAsB,IAAI,QAAQ,WAAW,CAC/C,YAAY,4CAA4C,CACxD,OAAO,uBAAuB,iCAAiC,CAC/D,OAAO,8BAA8B,6BAA6B,CAClE,OAAO,eAAe,+CAA+C,CACrE,mBAAmB,KAAK;CAE7B,MAAa,UAAyB;AAClC,UAAQ,IAAI,mBAAmB;AAC/B,UAAQ,IAAI,sBAAsB;EAElC,MAAM,eAAe,KAAK,IAAI,UAAU;EACxC,MAAM,QAAQ,KAAK,WAAW,MAAgC;EAE9D,MAAM,YAAsB;GACxB,GAAG,IAAI,eAAe,cAAc,KAAK,IAAI,QAAQ;GACrD;GACA,GAAG,IAAI,eAAe,OAAO,KAAK,QAAQ;GAC7C;EAQD,MAAM,EAAE,QAAQ,OAAO,aAAa,aAAa,MAN5B,IAAI,aACrB,MAAM,UACH,MAAM,aAAa,MAAM,IACzB,aAAa,qBAAqB,KAAK,CAC7C,CAEmE,MAAM;
|
|
1
|
+
{"version":3,"file":"startSharding.mjs","names":[],"sources":["../../../src/bin/commands/startSharding.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { CLISubcommand } from '../../classes/cli/CLISubcommand.js';\nimport { ConfigReader } from '../../classes/cli/ConfigReader.js';\nimport type { StartSubcommand } from './start.js';\nimport { Logger } from '@prtty/print';\nimport { resolveEnvProtocol } from '@reciple/utils';\nimport { colors } from '@prtty/prtty';\nimport { CLI } from '../../classes/cli/CLI.js';\nimport { build } from 'tsdown';\nimport { ShardingManager } from 'discord.js';\nimport { EventListeners } from '../../classes/client/EventListeners.js';\n\nexport default class StartShardingSubcommand extends CLISubcommand {\n public parent?: string = 'start';\n\n public subcommand: Command = new Command('sharding')\n .description('Start the reciple client in sharding mode')\n .option('-c, --config <path>', 'Path to the configuration file')\n .option('-t, --token <DiscordToken>', 'Set your Discord Bot token')\n .option('-b, --build', 'Build the modules before starting the client')\n .allowUnknownOption(true);\n\n public async execute(): Promise<void> {\n process.env.RECIPLE_SHARDING = 'true';\n process.env.RECIPLE_FIRST_SHARD = 'true';\n\n const recipleFlags = this.cli.getFlags();\n const flags = this.subcommand.opts<ShardingSubcommand.Flags>();\n\n const shardArgs: string[] = [\n ...CLI.stringifyFlags(recipleFlags, this.cli.command),\n 'start',\n ...CLI.stringifyFlags(flags, this.command)\n ];\n\n const configReader = new ConfigReader(\n flags.config\n ?? await ConfigReader.find()\n ?? ConfigReader.createConfigFilename('js')\n );\n\n const { config, build: buildConfig, sharding } = await configReader.read({ ignoreInstanceCheck: true });\n\n const logger = config.logger instanceof Logger ? this.cli.logger = config.logger : this.cli.logger.clone(config.logger);\n\n logger.label = 'ShardingManager';\n\n let token = flags.token || config.token || '';\n token = resolveEnvProtocol(token) || token;\n\n logger.log(colors.magenta(`⚡ Initializing reciple sharding manager!`));\n\n const processErrorLogger = (err: any) => {\n logger?.error(err);\n process.exit(1);\n };\n\n process.once('uncaughtException', processErrorLogger);\n process.once('unhandledRejection', processErrorLogger);\n process.on('warning', warn => logger.warn(warn));\n\n if (flags.build) {\n let plugins = buildConfig.plugins\n ? Array.isArray(buildConfig.plugins)\n ? buildConfig.plugins\n : [buildConfig.plugins]\n : [];\n\n plugins.push(CLI.createTsdownLogger());\n\n await build({\n ...buildConfig,\n logLevel: 'silent',\n plugins,\n });\n }\n\n if (!sharding) {\n logger.error('Sharding is not enabled in the config file');\n process.exit(1);\n }\n\n Reflect.set(global, 'useLogger', () => logger);\n\n const eventListeners = new EventListeners();\n const manager = new ShardingManager(CLI.bin, {\n ...sharding,\n token: token,\n shardArgs\n });\n\n manager.on('shardCreate', shard => {\n logger.log(colors.magenta(`🚀 Launched shard ${colors.green(String(shard.id))}`));\n\n shard.on('ready', () => {\n logger.log(colors.magenta(`✅ Shard ${colors.green(String(shard.id))} is ready!`));\n\n if (process.env.RECIPLE_FIRST_SHARD === 'true') {\n process.env.RECIPLE_FIRST_SHARD = 'false';\n }\n });\n\n shard.on('reconnecting', () => {\n logger.log(colors.magenta(`🔄 Shard ${colors.green(String(shard.id))} is reconnecting...`));\n });\n\n shard.on('resume', () => {\n logger.log(colors.magenta(`✅ Shard ${colors.green(String(shard.id))} has resumed!`));\n });\n\n shard.on('disconnect', () => {\n logger.log(colors.magenta(`🛑 Shard ${colors.green(String(shard.id))} is disconnected!`));\n });\n\n shard.on('death', () => {\n logger.error(`🛑 Shard ${colors.green(String(shard.id))} has died!`);\n });\n\n shard.on('error', error => {\n logger.error(`❌ Shard ${colors.green(String(shard.id))} encountered an error:`, error);\n });\n\n shard.on('message', message => {\n // TODO: Handle shard messages\n });\n });\n\n eventListeners.registerProcessExitEvents(signal => this.destroyShardingManager(manager));\n process.stdin.resume();\n\n await manager.spawn();\n }\n\n public destroyShardingManager(manager: ShardingManager): void {\n const logger = useLogger();\n\n manager.shards.map(s => {\n logger.log(colors.magenta(`🚧 Destroying shard ${s.id}`));\n\n if (s.process) {\n s.process.kill();\n } else {\n s.kill();\n }\n\n logger.log(colors.magenta(`🛑 Destroyed shard ${s.id}`));\n });\n\n logger.log(colors.magenta(`🚨 Destroyed all shards`));\n setTimeout(() => process.exit(0), 500);\n }\n}\n\nexport namespace ShardingSubcommand {\n export interface Flags extends StartSubcommand.Flags {}\n}\n"],"mappings":"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"}
|
package/dist/classes/cli/CLI.mjs
CHANGED
|
@@ -87,7 +87,7 @@ var CLI = class {
|
|
|
87
87
|
(function(_CLI) {
|
|
88
88
|
_CLI.root = path.join(path.dirname(fileURLToPath(import.meta.url)), "../../../");
|
|
89
89
|
_CLI.bin = path.join(CLI.root, "dist/bin/reciple.mjs");
|
|
90
|
-
_CLI.version = "10.0.
|
|
90
|
+
_CLI.version = "10.0.5";
|
|
91
91
|
function stringifyFlags(flags, command, ignored = []) {
|
|
92
92
|
let arr = [];
|
|
93
93
|
for (const [key, value] of Object.entries(flags)) {
|
|
@@ -35,7 +35,9 @@ declare class ConfigReader {
|
|
|
35
35
|
get build(): UserConfig;
|
|
36
36
|
get sharding(): ShardingManagerOptions | null;
|
|
37
37
|
constructor(filepath: string);
|
|
38
|
-
read(options?: Omit<Options, 'path'>
|
|
38
|
+
read(options?: Omit<Options, 'path'> & {
|
|
39
|
+
ignoreInstanceCheck?: boolean;
|
|
40
|
+
}): Promise<ConfigReader>;
|
|
39
41
|
create(options: Omit<ConfigReader.CreateOptions, 'path'>): Promise<ConfigReader>;
|
|
40
42
|
static exists(file: string): Promise<boolean>;
|
|
41
43
|
static create(options: ConfigReader.CreateOptions): Promise<ConfigReader>;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { CLI } from "./CLI.mjs";
|
|
2
2
|
import path from "node:path";
|
|
3
|
+
import { isDebugging } from "@reciple/utils";
|
|
3
4
|
import { mkdir, readFile, readdir, stat, writeFile } from "node:fs/promises";
|
|
4
5
|
import { colors } from "@prtty/prtty";
|
|
5
6
|
import { Client, RecipleError } from "@reciple/core";
|
|
@@ -29,12 +30,16 @@ var ConfigReader = class ConfigReader {
|
|
|
29
30
|
this.filepath = filepath;
|
|
30
31
|
}
|
|
31
32
|
async read(options) {
|
|
33
|
+
const originalPath = process.cwd();
|
|
34
|
+
process.chdir(path.dirname(this.filepath));
|
|
32
35
|
const { module } = await unrun({
|
|
33
36
|
...options,
|
|
34
|
-
|
|
37
|
+
debug: isDebugging(),
|
|
38
|
+
preset: "bundle-require",
|
|
35
39
|
path: this.filepath
|
|
36
40
|
});
|
|
37
|
-
|
|
41
|
+
process.chdir(originalPath);
|
|
42
|
+
if (!module || !module.client || !options?.ignoreInstanceCheck && !(module.client instanceof Client)) throw new RecipleError(`exported client is not an instance of ${colors.cyan("Client")} from ${colors.green("\"@reciple/core\"")}.`);
|
|
38
43
|
this._client = module.client;
|
|
39
44
|
this._config = module.config;
|
|
40
45
|
this._build = module.build;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfigReader.mjs","names":[],"sources":["../../../src/classes/cli/ConfigReader.ts"],"sourcesContent":["import type { ModuleLoader } from '../client/ModuleLoader.js';\nimport type { ModuleManager } from '../managers/ModuleManager.js';\nimport type { EventListeners } from '../client/EventListeners.js';\nimport type { Logger } from '@prtty/print';\nimport { CLI } from './CLI.js';\nimport { Client, RecipleError, type Config } from '@reciple/core';\nimport type { BuildConfig } from '../../helpers/types.js';\nimport type { UserConfig as TsdownConfig } from 'tsdown';\nimport path from 'node:path';\nimport { mkdir, readdir, readFile, stat, writeFile } from 'node:fs/promises';\nimport { resolveTSConfig } from 'pkg-types';\nimport { unrun, type Options as UnrunOptions } from 'unrun';\nimport { colors } from '@prtty/prtty';\nimport type { ShardingManagerOptions } from 'discord.js';\n\ndeclare module \"@reciple/core\" {\n interface Config {\n token?: string;\n modules?: ModuleLoader.Config;\n logger?: Logger|Logger.Options;\n }\n\n interface Client {\n readonly modules: ModuleManager;\n readonly moduleLoader: ModuleLoader;\n readonly eventListeners: EventListeners;\n readonly cli: CLI;\n logger: Logger;\n }\n}\n\nexport class ConfigReader {\n private _client: Client|null = null;\n private _config: Config|null = null;\n private _build: BuildConfig|null = null;\n private _sharding: ShardingManagerOptions|null = null;\n\n get client() {\n if (!this._client) throw new RecipleError('client is not yet loaded from config.');\n return this._client;\n }\n\n get config() {\n return this._config ?? {};\n }\n\n get build() {\n return ConfigReader.normalizeTsdownConfig({\n overrides: this._build ?? {}\n });\n }\n\n get sharding() {\n return this._sharding;\n }\n\n constructor(public readonly filepath: string) {}\n\n public async read(options?: Omit<UnrunOptions, 'path'>): Promise<ConfigReader> {\n const { module } = await unrun<Config>({\n ...options,\n
|
|
1
|
+
{"version":3,"file":"ConfigReader.mjs","names":[],"sources":["../../../src/classes/cli/ConfigReader.ts"],"sourcesContent":["import type { ModuleLoader } from '../client/ModuleLoader.js';\nimport type { ModuleManager } from '../managers/ModuleManager.js';\nimport type { EventListeners } from '../client/EventListeners.js';\nimport type { Logger } from '@prtty/print';\nimport { CLI } from './CLI.js';\nimport { Client, RecipleError, type Config } from '@reciple/core';\nimport type { BuildConfig } from '../../helpers/types.js';\nimport type { UserConfig as TsdownConfig } from 'tsdown';\nimport path from 'node:path';\nimport { mkdir, readdir, readFile, stat, writeFile } from 'node:fs/promises';\nimport { resolveTSConfig } from 'pkg-types';\nimport { unrun, type Options as UnrunOptions } from 'unrun';\nimport { colors } from '@prtty/prtty';\nimport type { ShardingManagerOptions } from 'discord.js';\nimport { isDebugging } from '@reciple/utils';\n\ndeclare module \"@reciple/core\" {\n interface Config {\n token?: string;\n modules?: ModuleLoader.Config;\n logger?: Logger|Logger.Options;\n }\n\n interface Client {\n readonly modules: ModuleManager;\n readonly moduleLoader: ModuleLoader;\n readonly eventListeners: EventListeners;\n readonly cli: CLI;\n logger: Logger;\n }\n}\n\nexport class ConfigReader {\n private _client: Client|null = null;\n private _config: Config|null = null;\n private _build: BuildConfig|null = null;\n private _sharding: ShardingManagerOptions|null = null;\n\n get client() {\n if (!this._client) throw new RecipleError('client is not yet loaded from config.');\n return this._client;\n }\n\n get config() {\n return this._config ?? {};\n }\n\n get build() {\n return ConfigReader.normalizeTsdownConfig({\n overrides: this._build ?? {}\n });\n }\n\n get sharding() {\n return this._sharding;\n }\n\n constructor(public readonly filepath: string) {}\n\n public async read(options?: Omit<UnrunOptions, 'path'> & { ignoreInstanceCheck?: boolean; }): Promise<ConfigReader> {\n const originalPath = process.cwd();\n\n process.chdir(path.dirname(this.filepath));\n\n const { module } = await unrun<Config>({\n ...options,\n debug: isDebugging(),\n preset: 'bundle-require',\n path: this.filepath\n });\n\n process.chdir(originalPath);\n\n if (!module || !module.client || (!options?.ignoreInstanceCheck && !(module.client instanceof Client))) {\n throw new RecipleError(`exported client is not an instance of ${colors.cyan('Client')} from ${colors.green('\"@reciple/core\"')}.`);\n }\n\n this._client = module.client;\n this._config = module.config;\n this._build = module.build;\n this._sharding = module.sharding ?? null;\n\n return this;\n }\n\n public async create(options: Omit<ConfigReader.CreateOptions, 'path'>): Promise<ConfigReader> {\n const exists = await ConfigReader.exists(this.filepath);\n\n if (exists && options.throwIfExists === true) {\n throw new RecipleError(`Config file already exists at ${colors.green(path.relative(process.cwd(), this.filepath))}.`);\n }\n\n if (!exists || exists && options.overwrite !== false) {\n await mkdir(path.dirname(this.filepath), { recursive: true });\n await writeFile(this.filepath, await ConfigReader.getDefaultContent(options.type));\n }\n\n return options.readOptions !== false ? this.read(options.readOptions) : this;\n }\n\n public static async exists(file: string): Promise<boolean> {\n return await stat(file).then(s => s.isFile()).catch(() => false);\n }\n\n public static async create(options: ConfigReader.CreateOptions): Promise<ConfigReader> {\n return new ConfigReader(options.path).create(options);\n }\n\n public static async find(options?: ConfigReader.FindOptions): Promise<string|null> {\n const filenames = ConfigReader.configFilenames.filter(f => !options?.lang || f.endsWith(options.lang));\n const cwd = options?.cwd ?? process.cwd();\n const directories = [cwd];\n\n directories.push(...(options?.directories ?? [path.join(cwd, '.config')]));\n\n for (const directory of directories) {\n const stats = await stat(directory).catch(() => undefined);\n\n if (!stats?.isDirectory()) continue;\n\n const file = (await readdir(directory)).find(f => filenames.includes(f));\n if (file) return path.join(directory, file);\n }\n\n return null;\n }\n}\n\nexport namespace ConfigReader {\n export interface CreateOptions {\n path: string;\n overwrite?: boolean;\n throwIfExists?: boolean;\n type: LangType;\n readOptions?: Omit<UnrunOptions, 'path'>|false;\n }\n\n export interface FindOptions {\n cwd?: string;\n lang?: LangType;\n directories?: string[];\n }\n\n export async function getProjectLang(cwd: string): Promise<LangType> {\n const hasTsConfig = !!await resolveTSConfig(cwd, { try: true });\n const configLangIsTypescript = !!(await ConfigReader.find({ cwd, lang: 'ts' }));\n\n return hasTsConfig || configLangIsTypescript ? 'ts' : 'js';\n }\n\n export type LangType = 'ts'|'js';\n\n export const defaultConfigPath = {\n ts: path.join(CLI.root, 'assets/config', `reciple.config.ts`),\n js: path.join(CLI.root, 'assets/config', `reciple.config.js`)\n };\n\n export async function getDefaultContent(type: LangType): Promise<string> {\n const filepath = ConfigReader.defaultConfigPath[type];\n const content = await readFile(filepath, 'utf-8');\n return content;\n }\n\n export const configFilenames = [\n 'reciple.config.ts',\n 'reciple.config.mts',\n 'reciple.config.js',\n 'reciple.config.mjs'\n ];\n\n export function createConfigFilename(type: LangType, esm: boolean = false): string {\n return `reciple.config.${esm ? 'm' : ''}${type}`;\n }\n\n export function normalizeTsdownConfig({ type, overrides }: { type?: LangType; overrides?: BuildConfig; } = {}): TsdownConfig {\n return {\n entry: [`./src/**/*.{ts,tsx,js,jsx}`],\n outDir: './modules',\n tsconfig: `./${type ?? 'ts'}config.json`,\n external: [],\n noExternal: [],\n sourcemap: true,\n treeshake: true,\n clean: true,\n ...overrides,\n watch: false,\n platform: 'node',\n format: 'esm',\n unbundle: true,\n skipNodeModulesBundle: true\n };\n }\n}\n"],"mappings":"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"}
|
|
@@ -276,7 +276,7 @@ var TemplateBuilder = class TemplateBuilder {
|
|
|
276
276
|
}
|
|
277
277
|
const moduleOptions = {
|
|
278
278
|
cli: this.cli,
|
|
279
|
-
config: await this.config?.read(),
|
|
279
|
+
config: await this.config?.read({ ignoreInstanceCheck: true }),
|
|
280
280
|
defaultAll: true,
|
|
281
281
|
typescript: this.typescript
|
|
282
282
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TemplateBuilder.mjs","names":["parseDotenv"],"sources":["../../../src/classes/templates/TemplateBuilder.ts"],"sourcesContent":["import { isDebugging, PackageJsonBuilder } from '@reciple/utils';\nimport { ConfigReader } from '../cli/ConfigReader.js';\nimport { copyFile, mkdir, readdir, readFile, stat, writeFile } from 'node:fs/promises';\nimport { confirm, intro, isCancel, outro, select, text, log } from '@clack/prompts';\nimport micromatch from 'micromatch';\nimport { CLI } from '../cli/CLI.js';\nimport path from 'node:path';\nimport { existsSync, statSync } from 'node:fs';\nimport { NotAnError } from '../NotAnError.js';\nimport { slug } from 'github-slugger';\nimport { packageJSON } from '../../helpers/constants.js';\nimport { parse as parseDotenv } from '@dotenvx/dotenvx';\nimport { ModuleTemplateBuilder } from './ModuleTemplateBuilder.js';\nimport { detectPackageManager, installDependencies, installDependenciesCommand, runScript, runScriptCommand, type PackageManagerName } from 'nypm';\nimport { colors } from '@prtty/prtty';\n\nexport class TemplateBuilder {\n private _directory?: string;\n\n public cli: CLI;\n public typescript?: boolean;\n public token?: string;\n public defaultAll: boolean;\n\n public config?: ConfigReader;\n public packageJson?: PackageJsonBuilder;\n\n public packageManager?: PackageManagerName;\n public dependenciesInstalled: boolean = false;\n\n get directory() {\n return this._directory ?? process.cwd();\n }\n\n get relativeDirectory() {\n return path.relative(process.cwd(), this.directory) || './';\n }\n\n get packageJsonPath() {\n return path.join(this.directory, 'package.json');\n }\n\n get name() {\n return slug(path.basename(this.directory));\n }\n\n constructor(options: TemplateBuilder.Options) {\n this.cli = options.cli;\n this._directory = options.directory;\n this.typescript = options.typescript;\n this.defaultAll = options.defaultAll ?? false;\n this.packageManager = options.packageManager;\n this.token = options.token;\n }\n\n public async init(): Promise<this> {\n intro(colors.bold().black().bgCyan(` ${this.cli.command.name()} create - v${this.cli.build} `));\n return this;\n }\n\n public async createDirectory(options?: TemplateBuilder.CreateDirectoryOptions): Promise<this> {\n this._directory = options?.directory ?? this._directory;\n\n if (!this._directory) {\n const dir = this.defaultAll\n ? process.cwd()\n : await text({\n message: `Enter project directory`,\n placeholder: `Leave empty to use current directory`,\n defaultValue: process.cwd(),\n validate: value => {\n const dir = path.resolve(value);\n if (existsSync(dir) && !statSync(dir).isDirectory()) return 'Invalid folder directory';\n }\n });\n\n if (isCancel(dir)) throw new NotAnError('Operation cancelled');\n this._directory = dir;\n }\n\n this._directory = path.resolve(this._directory);\n\n const stats = await stat(this.directory).catch(() => undefined);\n\n if (stats) {\n let files = await readdir(this.directory);\n files = micromatch.not(files, options?.ignoredFiles ?? TemplateBuilder.ignoredDirectoryFiles, { dot: true });\n\n if (files.length) {\n switch (options?.onNotEmpty) {\n case 'throw':\n throw new NotAnError(`Directory ${colors.cyan(this.relativeDirectory)} is not empty`);\n case 'ignore':\n return this;\n default:\n const overwrite = this.defaultAll\n ? false\n : await confirm({\n message: `Directory ${colors.cyan(this.relativeDirectory)} is not empty. Would you like to continue?`,\n active: 'Yes',\n inactive: 'No',\n initialValue: false\n });\n\n if (!overwrite) throw new NotAnError(`Directory ${colors.cyan(this.relativeDirectory)} is not empty`);\n if (isCancel(overwrite)) throw new NotAnError('Operation cancelled');\n break;\n }\n }\n }\n\n await mkdir(this.directory, { recursive: true });\n return this;\n }\n\n public async setupLanguage(options?: TemplateBuilder.SetupLanguageOptions): Promise<this> {\n this.typescript = options?.typescript ?? this.typescript;\n\n if (!this.typescript) {\n const isTypeScript = this.defaultAll\n ? false\n : await confirm({\n message: 'Would you like to use TypeScript?',\n active: 'Yes',\n inactive: 'No',\n initialValue: false\n });\n\n if (isCancel(isTypeScript)) throw new NotAnError('Operation cancelled');\n this.typescript = isTypeScript;\n }\n\n return this;\n }\n\n public async createEnvFile(options?: TemplateBuilder.CreateEnvFileOptions): Promise<this> {\n const tokenKey = options?.tokenKey ?? 'DISCORD_TOKEN';\n const envFile = options?.envFile ? path.resolve(options.envFile) : path.join(this.directory, '.env');\n const stats = await stat(envFile).catch(() => undefined);\n\n let env = options?.env ?? {};\n env = stats\n ? parseDotenv(await readFile(envFile, 'utf-8'), {\n processEnv: env\n })\n : env;\n\n if (env[tokenKey]) {\n const skip = this.defaultAll || await confirm({\n message: 'Discord bot token already exists in .env file, do you want to skip?',\n initialValue: true,\n active: 'Yes',\n inactive: 'No'\n });\n\n if (isCancel(skip)) throw new NotAnError('Operation cancelled');\n if (skip) return this;\n }\n\n const token = await text({\n message: 'Enter Discord Bot Token',\n placeholder: 'Bot Token from Discord Developer Portal',\n defaultValue: env[tokenKey]\n });\n\n if (isCancel(token)) throw new NotAnError('Operation cancelled');\n env[tokenKey] = token;\n\n await writeFile(envFile, `\\n${tokenKey}=\"${token}\"\\n`, {\n encoding: 'utf-8',\n flag: 'a'\n });\n\n return this;\n }\n\n public async createConfig(options?: TemplateBuilder.CreateConfigOptions): Promise<this> {\n let filepath = options?.path;\n\n if (!filepath) {\n filepath = await ConfigReader.find({\n cwd: this.directory,\n lang: this.typescript\n ? 'ts'\n : this.typescript === false\n ? 'js'\n : undefined\n }) ?? path.join(\n this.directory,\n ConfigReader.createConfigFilename(this.typescript ? 'ts' : 'js')\n );\n }\n\n const exists = await ConfigReader.exists(filepath);\n\n if (exists) {\n const overwrite = this.defaultAll\n ? false\n : await confirm({\n message: `Config file already exists at ${colors.green(path.relative(process.cwd(), filepath))}. Would you like to overwrite it?`,\n active: 'Yes',\n inactive: 'No',\n initialValue: false\n });\n\n if (!overwrite) return this;\n if (isCancel(overwrite)) throw new NotAnError('Operation cancelled');\n }\n\n this.config = await ConfigReader.create({\n ...options,\n path: filepath,\n type: this.typescript ? 'ts' : 'js',\n overwrite: true,\n readOptions: false\n });\n\n return this;\n }\n\n public async createTemplate(options?: TemplateBuilder.CreateModulesOptions): Promise<this> {\n const source = path.join(CLI.root, './assets/templates/', this.typescript ? 'typescript' : 'javascript');\n const globals = path.join(CLI.root, './assets/global/');\n\n function rename(data: TemplateBuilder.CopyMetadata) {\n switch (data.basename) {\n case 'gitignore':\n return '.gitignore';\n default:\n return options?.rename?.(data) ?? data.basename;\n }\n }\n\n function overwrite(data: TemplateBuilder.CopyMetadata) {\n switch (data.basename) {\n case 'gitignore':\n return false;\n case 'tsconfig.json':\n case 'jsconfig.json':\n return true;\n default:\n return (typeof options?.overwrite === 'boolean' ? options.overwrite : options?.overwrite?.(data)) ?? true;\n }\n }\n\n const [template, loader] = CLI.createSpinnerPromise({\n promise: Promise.all([\n TemplateBuilder.copy(source, this.directory, { ...options, rename, overwrite }),\n TemplateBuilder.copy(globals, this.directory, { ...options, rename, overwrite })\n ]),\n message: 'Copying template files',\n successMessage: 'Files copied successfully',\n errorMessage: 'Failed to copy files'\n });\n\n await template;\n return this;\n }\n\n public async setPackageManager(options?: TemplateBuilder.SetPackageManagerOptions) {\n this.packageManager = options?.packageManager ?? this.packageManager;\n\n if (!this.packageManager) {\n const defaultPackageManager = await detectPackageManager(this.directory).then(pm => pm?.name ?? 'npm');\n const packageManager: PackageManagerName|symbol = this.defaultAll\n ? defaultPackageManager\n : await select({\n message: 'Select package manager',\n options: [\n { value: defaultPackageManager, label: defaultPackageManager },\n ...[\n { value: 'npm', label: 'npm' },\n { value: 'yarn', label: 'yarn' },\n { value: 'pnpm', label: 'pnpm' },\n { value: 'bun', label: 'bun' },\n { value: 'deno', label: 'deno' }\n ].filter(o => o.value !== defaultPackageManager) as { value: PackageManagerName; label: string; }[]\n ],\n initialValue: defaultPackageManager\n });\n\n if (isCancel(packageManager)) throw new NotAnError('Operation cancelled');\n this.packageManager = packageManager;\n }\n\n this.packageJson = await PackageJsonBuilder.read(this.packageJsonPath, true);\n this.packageJson.merge({\n name: this.name,\n private: true,\n type: 'module',\n scripts: {\n build: `reciple build`,\n start: 'reciple start',\n dev: 'nodemon',\n },\n ...TemplateBuilder.createDependencyRecord(this.typescript ? 'ts' : 'js'),\n });\n\n await this.packageJson?.write(this.packageJsonPath, true);\n\n return this;\n }\n\n public async installDependencies(options?: TemplateBuilder.InstallDependenciesOptions): Promise<this> {\n if (options?.value !== false) {\n if (options?.value === undefined) {\n const install = this.defaultAll\n ? true\n : await confirm({\n message: `Would you like to install dependencies?`,\n active: 'Yes',\n inactive: 'No',\n initialValue: true\n });\n\n if (isCancel(install)) throw new NotAnError('Operation cancelled');\n if (!install) return this;\n }\n\n await CLI.createSpinnerPromise({\n promise: installDependencies({\n cwd: this.directory,\n packageManager: this.packageManager,\n silent: !isDebugging()\n }),\n indicator: 'timer',\n errorMessage: `${colors.bold().red('✗')} Failed to install dependencies`,\n successMessage: `${colors.bold().green('✔')} Dependencies installed successfully`,\n message: `${colors.bold().dim('$')} Installing dependencies`\n })[0];\n\n this.dependenciesInstalled = true;\n }\n\n return this;\n }\n\n public async createModules(): Promise<this> {\n const modulesDirectory = path.join(this.directory, 'src');\n const moduleTemplates = await ModuleTemplateBuilder.resolveModuleTemplates(this.typescript ? 'ts' : 'js');\n\n await mkdir(modulesDirectory, { recursive: true });\n\n if (!this.dependenciesInstalled) {\n log.warn('Dependencies not installed. Skipping module creation.');\n return this;\n }\n\n const moduleOptions: ModuleTemplateBuilder.Options = {\n cli: this.cli,\n config: await this.config?.read()!,\n defaultAll: true,\n typescript: this.typescript,\n };\n\n const [template, loader] = CLI.createSpinnerPromise({\n promise: Promise.all([\n new ModuleTemplateBuilder({\n ...moduleOptions,\n directory: path.join(modulesDirectory, 'commands'),\n filename: `SlashCommand.${this.typescript ? 'ts' : 'js'}`,\n template: moduleTemplates.find(t => t.name === 'SlashCommand')\n })\n .setupPlaceholders()\n .then(m => m.build({ silent: true })),\n new ModuleTemplateBuilder({\n ...moduleOptions,\n directory: path.join(modulesDirectory, 'events'),\n filename: `ClientEvent.${this.typescript ? 'ts' : 'js'}`,\n template: moduleTemplates.find(t => t.name === 'ClientEvent')\n })\n .setupPlaceholders()\n .then(m => m.build({ silent: true }))\n ]),\n message: 'Creating module templates',\n successMessage: 'Module templates created successfully',\n errorMessage: 'Failed to create module templates'\n });\n\n await template;\n return this;\n }\n\n public async build(options?: TemplateBuilder.BuildOptions): Promise<this> {\n if (!options?.skipBuild && this.dependenciesInstalled) await CLI.createSpinnerPromise({\n promise: runScript('build', {\n cwd: this.directory,\n packageManager: this.packageManager,\n silent: !isDebugging()\n }),\n indicator: 'timer',\n errorMessage: `${colors.bold().red('✗')} Failed to build project`,\n successMessage: `${colors.bold().green('✔')} Project built successfully`,\n message: `${colors.bold().dim('$')} Building project`\n })[0];\n\n outro(`Project created in ${colors.cyan(this.relativeDirectory)}`);\n\n console.log(`\\n${colors.bold().green('✔')} Start developing:`);\n\n if (this.relativeDirectory !== './') {\n console.log(` • ${colors.cyan().bold(`cd ${this.relativeDirectory}`)}`);\n }\n\n console.log(` • ${colors.cyan().bold(installDependenciesCommand(this.packageManager ?? 'npm'))} ${colors.dim('(Install dependencies)')}`);\n console.log(` • ${colors.cyan().bold(runScriptCommand(this.packageManager ?? 'npm', 'build'))} ${colors.dim('(Build)')}`);\n console.log(` • ${colors.cyan().bold(runScriptCommand(this.packageManager ?? 'npm', 'dev'))} ${colors.dim('(Development)')}`);\n console.log(` • ${colors.cyan().bold(runScriptCommand(this.packageManager ?? 'npm', 'start'))} ${colors.dim('(Production)')}`);\n\n\n return this;\n }\n}\n\nexport namespace TemplateBuilder {\n export interface Options {\n cli: CLI;\n directory?: string;\n typescript?: boolean;\n packageManager?: PackageManagerName;\n defaultAll?: boolean;\n token?: string;\n }\n\n export const ignoredDirectoryFiles = ['.*', 'LICENSE'];\n\n export const dependencies: Record<'ts'|'js'|'both', Partial<Record<'dependencies'|'devDependencies', Record<string, string>>>> = {\n both: {\n dependencies: {\n '@reciple/core': packageJSON.dependencies?.['@reciple/core']!,\n '@reciple/jsx': packageJSON.dependencies?.['@reciple/jsx']!,\n 'reciple': `^${packageJSON.version}`,\n },\n devDependencies: {\n '@types/node': packageJSON.devDependencies?.['@types/node']!,\n nodemon: packageJSON.devDependencies?.nodemon!,\n typescript: packageJSON.devDependencies?.['typescript']!,\n }\n },\n ts: {},\n js: {}\n };\n\n export function createDependencyRecord(type: 'ts'|'js'): Partial<Record<'dependencies'|'devDependencies', Record<string, string>>> {\n const record = type === 'ts'\n ? dependencies.ts\n : type === 'js'\n ? dependencies.js\n : {};\n\n record.dependencies = { ...record.dependencies, ...dependencies.both.dependencies };\n record.devDependencies = { ...record.devDependencies, ...dependencies.both.devDependencies };\n\n return record;\n }\n\n export interface CreateDirectoryOptions {\n directory?: string;\n ignoredFiles?: string[];\n onNotEmpty?: 'prompt'|'throw'|'ignore';\n }\n\n export interface SetupLanguageOptions {\n typescript?: boolean;\n }\n\n export interface CreateConfigOptions extends Partial<ConfigReader.CreateOptions> {}\n\n export interface CreateModulesOptions extends Partial<CopyOptions> {}\n\n export interface SetPackageManagerOptions {\n packageManager?: PackageManagerName;\n }\n\n export interface InstallDependenciesOptions {\n value?: boolean;\n }\n\n export interface CreateEnvFileOptions {\n envFile?: string;\n tokenKey?: string;\n env?: Record<string, string>;\n }\n\n export interface BuildOptions {\n skipBuild?: boolean;\n }\n\n export interface CopyOptions {\n overwrite?: boolean|((data: CopyMetadata) => boolean);\n filter?: (data: CopyMetadata) => boolean;\n rename?: (data: CopyMetadata) => string;\n }\n\n export interface CopyMetadata {\n basename: string;\n src: string;\n dest: string;\n }\n\n export async function copy(from: string, to: string, options?: CopyOptions): Promise<void> {\n const fromStats = await stat(from).catch(() => undefined);\n if (!fromStats) return;\n\n if (fromStats.isDirectory()) {\n const files = await readdir(from);\n\n for (const file of files) {\n const data: CopyMetadata = {\n basename: file,\n src: path.join(from, file),\n dest: to\n };\n\n await copy(\n data.src,\n path.join(to,\n options?.rename\n ? options.rename(data)\n : file\n ),\n options\n );\n }\n return;\n }\n\n const data: CopyMetadata = {\n basename: path.basename(from),\n src: from,\n dest: to\n };\n\n if (options?.filter && !options.filter(data)) return;\n\n const toStats = await stat(to).catch(() => undefined);\n const overwrite = typeof options?.overwrite === 'function'\n ? options.overwrite(data)\n : options?.overwrite ?? true;\n\n if (toStats && overwrite) return;\n\n await mkdir(path.dirname(to), { recursive: true });\n await copyFile(from, to);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TemplateBuilder.mjs","names":["parseDotenv"],"sources":["../../../src/classes/templates/TemplateBuilder.ts"],"sourcesContent":["import { isDebugging, PackageJsonBuilder } from '@reciple/utils';\nimport { ConfigReader } from '../cli/ConfigReader.js';\nimport { copyFile, mkdir, readdir, readFile, stat, writeFile } from 'node:fs/promises';\nimport { confirm, intro, isCancel, outro, select, text, log } from '@clack/prompts';\nimport micromatch from 'micromatch';\nimport { CLI } from '../cli/CLI.js';\nimport path from 'node:path';\nimport { existsSync, statSync } from 'node:fs';\nimport { NotAnError } from '../NotAnError.js';\nimport { slug } from 'github-slugger';\nimport { packageJSON } from '../../helpers/constants.js';\nimport { parse as parseDotenv } from '@dotenvx/dotenvx';\nimport { ModuleTemplateBuilder } from './ModuleTemplateBuilder.js';\nimport { detectPackageManager, installDependencies, installDependenciesCommand, runScript, runScriptCommand, type PackageManagerName } from 'nypm';\nimport { colors } from '@prtty/prtty';\n\nexport class TemplateBuilder {\n private _directory?: string;\n\n public cli: CLI;\n public typescript?: boolean;\n public token?: string;\n public defaultAll: boolean;\n\n public config?: ConfigReader;\n public packageJson?: PackageJsonBuilder;\n\n public packageManager?: PackageManagerName;\n public dependenciesInstalled: boolean = false;\n\n get directory() {\n return this._directory ?? process.cwd();\n }\n\n get relativeDirectory() {\n return path.relative(process.cwd(), this.directory) || './';\n }\n\n get packageJsonPath() {\n return path.join(this.directory, 'package.json');\n }\n\n get name() {\n return slug(path.basename(this.directory));\n }\n\n constructor(options: TemplateBuilder.Options) {\n this.cli = options.cli;\n this._directory = options.directory;\n this.typescript = options.typescript;\n this.defaultAll = options.defaultAll ?? false;\n this.packageManager = options.packageManager;\n this.token = options.token;\n }\n\n public async init(): Promise<this> {\n intro(colors.bold().black().bgCyan(` ${this.cli.command.name()} create - v${this.cli.build} `));\n return this;\n }\n\n public async createDirectory(options?: TemplateBuilder.CreateDirectoryOptions): Promise<this> {\n this._directory = options?.directory ?? this._directory;\n\n if (!this._directory) {\n const dir = this.defaultAll\n ? process.cwd()\n : await text({\n message: `Enter project directory`,\n placeholder: `Leave empty to use current directory`,\n defaultValue: process.cwd(),\n validate: value => {\n const dir = path.resolve(value);\n if (existsSync(dir) && !statSync(dir).isDirectory()) return 'Invalid folder directory';\n }\n });\n\n if (isCancel(dir)) throw new NotAnError('Operation cancelled');\n this._directory = dir;\n }\n\n this._directory = path.resolve(this._directory);\n\n const stats = await stat(this.directory).catch(() => undefined);\n\n if (stats) {\n let files = await readdir(this.directory);\n files = micromatch.not(files, options?.ignoredFiles ?? TemplateBuilder.ignoredDirectoryFiles, { dot: true });\n\n if (files.length) {\n switch (options?.onNotEmpty) {\n case 'throw':\n throw new NotAnError(`Directory ${colors.cyan(this.relativeDirectory)} is not empty`);\n case 'ignore':\n return this;\n default:\n const overwrite = this.defaultAll\n ? false\n : await confirm({\n message: `Directory ${colors.cyan(this.relativeDirectory)} is not empty. Would you like to continue?`,\n active: 'Yes',\n inactive: 'No',\n initialValue: false\n });\n\n if (!overwrite) throw new NotAnError(`Directory ${colors.cyan(this.relativeDirectory)} is not empty`);\n if (isCancel(overwrite)) throw new NotAnError('Operation cancelled');\n break;\n }\n }\n }\n\n await mkdir(this.directory, { recursive: true });\n return this;\n }\n\n public async setupLanguage(options?: TemplateBuilder.SetupLanguageOptions): Promise<this> {\n this.typescript = options?.typescript ?? this.typescript;\n\n if (!this.typescript) {\n const isTypeScript = this.defaultAll\n ? false\n : await confirm({\n message: 'Would you like to use TypeScript?',\n active: 'Yes',\n inactive: 'No',\n initialValue: false\n });\n\n if (isCancel(isTypeScript)) throw new NotAnError('Operation cancelled');\n this.typescript = isTypeScript;\n }\n\n return this;\n }\n\n public async createEnvFile(options?: TemplateBuilder.CreateEnvFileOptions): Promise<this> {\n const tokenKey = options?.tokenKey ?? 'DISCORD_TOKEN';\n const envFile = options?.envFile ? path.resolve(options.envFile) : path.join(this.directory, '.env');\n const stats = await stat(envFile).catch(() => undefined);\n\n let env = options?.env ?? {};\n env = stats\n ? parseDotenv(await readFile(envFile, 'utf-8'), {\n processEnv: env\n })\n : env;\n\n if (env[tokenKey]) {\n const skip = this.defaultAll || await confirm({\n message: 'Discord bot token already exists in .env file, do you want to skip?',\n initialValue: true,\n active: 'Yes',\n inactive: 'No'\n });\n\n if (isCancel(skip)) throw new NotAnError('Operation cancelled');\n if (skip) return this;\n }\n\n const token = await text({\n message: 'Enter Discord Bot Token',\n placeholder: 'Bot Token from Discord Developer Portal',\n defaultValue: env[tokenKey]\n });\n\n if (isCancel(token)) throw new NotAnError('Operation cancelled');\n env[tokenKey] = token;\n\n await writeFile(envFile, `\\n${tokenKey}=\"${token}\"\\n`, {\n encoding: 'utf-8',\n flag: 'a'\n });\n\n return this;\n }\n\n public async createConfig(options?: TemplateBuilder.CreateConfigOptions): Promise<this> {\n let filepath = options?.path;\n\n if (!filepath) {\n filepath = await ConfigReader.find({\n cwd: this.directory,\n lang: this.typescript\n ? 'ts'\n : this.typescript === false\n ? 'js'\n : undefined\n }) ?? path.join(\n this.directory,\n ConfigReader.createConfigFilename(this.typescript ? 'ts' : 'js')\n );\n }\n\n const exists = await ConfigReader.exists(filepath);\n\n if (exists) {\n const overwrite = this.defaultAll\n ? false\n : await confirm({\n message: `Config file already exists at ${colors.green(path.relative(process.cwd(), filepath))}. Would you like to overwrite it?`,\n active: 'Yes',\n inactive: 'No',\n initialValue: false\n });\n\n if (!overwrite) return this;\n if (isCancel(overwrite)) throw new NotAnError('Operation cancelled');\n }\n\n this.config = await ConfigReader.create({\n ...options,\n path: filepath,\n type: this.typescript ? 'ts' : 'js',\n overwrite: true,\n readOptions: false\n });\n\n return this;\n }\n\n public async createTemplate(options?: TemplateBuilder.CreateModulesOptions): Promise<this> {\n const source = path.join(CLI.root, './assets/templates/', this.typescript ? 'typescript' : 'javascript');\n const globals = path.join(CLI.root, './assets/global/');\n\n function rename(data: TemplateBuilder.CopyMetadata) {\n switch (data.basename) {\n case 'gitignore':\n return '.gitignore';\n default:\n return options?.rename?.(data) ?? data.basename;\n }\n }\n\n function overwrite(data: TemplateBuilder.CopyMetadata) {\n switch (data.basename) {\n case 'gitignore':\n return false;\n case 'tsconfig.json':\n case 'jsconfig.json':\n return true;\n default:\n return (typeof options?.overwrite === 'boolean' ? options.overwrite : options?.overwrite?.(data)) ?? true;\n }\n }\n\n const [template, loader] = CLI.createSpinnerPromise({\n promise: Promise.all([\n TemplateBuilder.copy(source, this.directory, { ...options, rename, overwrite }),\n TemplateBuilder.copy(globals, this.directory, { ...options, rename, overwrite })\n ]),\n message: 'Copying template files',\n successMessage: 'Files copied successfully',\n errorMessage: 'Failed to copy files'\n });\n\n await template;\n return this;\n }\n\n public async setPackageManager(options?: TemplateBuilder.SetPackageManagerOptions) {\n this.packageManager = options?.packageManager ?? this.packageManager;\n\n if (!this.packageManager) {\n const defaultPackageManager = await detectPackageManager(this.directory).then(pm => pm?.name ?? 'npm');\n const packageManager: PackageManagerName|symbol = this.defaultAll\n ? defaultPackageManager\n : await select({\n message: 'Select package manager',\n options: [\n { value: defaultPackageManager, label: defaultPackageManager },\n ...[\n { value: 'npm', label: 'npm' },\n { value: 'yarn', label: 'yarn' },\n { value: 'pnpm', label: 'pnpm' },\n { value: 'bun', label: 'bun' },\n { value: 'deno', label: 'deno' }\n ].filter(o => o.value !== defaultPackageManager) as { value: PackageManagerName; label: string; }[]\n ],\n initialValue: defaultPackageManager\n });\n\n if (isCancel(packageManager)) throw new NotAnError('Operation cancelled');\n this.packageManager = packageManager;\n }\n\n this.packageJson = await PackageJsonBuilder.read(this.packageJsonPath, true);\n this.packageJson.merge({\n name: this.name,\n private: true,\n type: 'module',\n scripts: {\n build: `reciple build`,\n start: 'reciple start',\n dev: 'nodemon',\n },\n ...TemplateBuilder.createDependencyRecord(this.typescript ? 'ts' : 'js'),\n });\n\n await this.packageJson?.write(this.packageJsonPath, true);\n\n return this;\n }\n\n public async installDependencies(options?: TemplateBuilder.InstallDependenciesOptions): Promise<this> {\n if (options?.value !== false) {\n if (options?.value === undefined) {\n const install = this.defaultAll\n ? true\n : await confirm({\n message: `Would you like to install dependencies?`,\n active: 'Yes',\n inactive: 'No',\n initialValue: true\n });\n\n if (isCancel(install)) throw new NotAnError('Operation cancelled');\n if (!install) return this;\n }\n\n await CLI.createSpinnerPromise({\n promise: installDependencies({\n cwd: this.directory,\n packageManager: this.packageManager,\n silent: !isDebugging()\n }),\n indicator: 'timer',\n errorMessage: `${colors.bold().red('✗')} Failed to install dependencies`,\n successMessage: `${colors.bold().green('✔')} Dependencies installed successfully`,\n message: `${colors.bold().dim('$')} Installing dependencies`\n })[0];\n\n this.dependenciesInstalled = true;\n }\n\n return this;\n }\n\n public async createModules(): Promise<this> {\n const modulesDirectory = path.join(this.directory, 'src');\n const moduleTemplates = await ModuleTemplateBuilder.resolveModuleTemplates(this.typescript ? 'ts' : 'js');\n\n await mkdir(modulesDirectory, { recursive: true });\n\n if (!this.dependenciesInstalled) {\n log.warn('Dependencies not installed. Skipping module creation.');\n return this;\n }\n\n const moduleOptions: ModuleTemplateBuilder.Options = {\n cli: this.cli,\n config: await this.config?.read({ ignoreInstanceCheck: true })!,\n defaultAll: true,\n typescript: this.typescript,\n };\n\n const [template, loader] = CLI.createSpinnerPromise({\n promise: Promise.all([\n new ModuleTemplateBuilder({\n ...moduleOptions,\n directory: path.join(modulesDirectory, 'commands'),\n filename: `SlashCommand.${this.typescript ? 'ts' : 'js'}`,\n template: moduleTemplates.find(t => t.name === 'SlashCommand')\n })\n .setupPlaceholders()\n .then(m => m.build({ silent: true })),\n new ModuleTemplateBuilder({\n ...moduleOptions,\n directory: path.join(modulesDirectory, 'events'),\n filename: `ClientEvent.${this.typescript ? 'ts' : 'js'}`,\n template: moduleTemplates.find(t => t.name === 'ClientEvent')\n })\n .setupPlaceholders()\n .then(m => m.build({ silent: true }))\n ]),\n message: 'Creating module templates',\n successMessage: 'Module templates created successfully',\n errorMessage: 'Failed to create module templates'\n });\n\n await template;\n return this;\n }\n\n public async build(options?: TemplateBuilder.BuildOptions): Promise<this> {\n if (!options?.skipBuild && this.dependenciesInstalled) await CLI.createSpinnerPromise({\n promise: runScript('build', {\n cwd: this.directory,\n packageManager: this.packageManager,\n silent: !isDebugging()\n }),\n indicator: 'timer',\n errorMessage: `${colors.bold().red('✗')} Failed to build project`,\n successMessage: `${colors.bold().green('✔')} Project built successfully`,\n message: `${colors.bold().dim('$')} Building project`\n })[0];\n\n outro(`Project created in ${colors.cyan(this.relativeDirectory)}`);\n\n console.log(`\\n${colors.bold().green('✔')} Start developing:`);\n\n if (this.relativeDirectory !== './') {\n console.log(` • ${colors.cyan().bold(`cd ${this.relativeDirectory}`)}`);\n }\n\n console.log(` • ${colors.cyan().bold(installDependenciesCommand(this.packageManager ?? 'npm'))} ${colors.dim('(Install dependencies)')}`);\n console.log(` • ${colors.cyan().bold(runScriptCommand(this.packageManager ?? 'npm', 'build'))} ${colors.dim('(Build)')}`);\n console.log(` • ${colors.cyan().bold(runScriptCommand(this.packageManager ?? 'npm', 'dev'))} ${colors.dim('(Development)')}`);\n console.log(` • ${colors.cyan().bold(runScriptCommand(this.packageManager ?? 'npm', 'start'))} ${colors.dim('(Production)')}`);\n\n\n return this;\n }\n}\n\nexport namespace TemplateBuilder {\n export interface Options {\n cli: CLI;\n directory?: string;\n typescript?: boolean;\n packageManager?: PackageManagerName;\n defaultAll?: boolean;\n token?: string;\n }\n\n export const ignoredDirectoryFiles = ['.*', 'LICENSE'];\n\n export const dependencies: Record<'ts'|'js'|'both', Partial<Record<'dependencies'|'devDependencies', Record<string, string>>>> = {\n both: {\n dependencies: {\n '@reciple/core': packageJSON.dependencies?.['@reciple/core']!,\n '@reciple/jsx': packageJSON.dependencies?.['@reciple/jsx']!,\n 'reciple': `^${packageJSON.version}`,\n },\n devDependencies: {\n '@types/node': packageJSON.devDependencies?.['@types/node']!,\n nodemon: packageJSON.devDependencies?.nodemon!,\n typescript: packageJSON.devDependencies?.['typescript']!,\n }\n },\n ts: {},\n js: {}\n };\n\n export function createDependencyRecord(type: 'ts'|'js'): Partial<Record<'dependencies'|'devDependencies', Record<string, string>>> {\n const record = type === 'ts'\n ? dependencies.ts\n : type === 'js'\n ? dependencies.js\n : {};\n\n record.dependencies = { ...record.dependencies, ...dependencies.both.dependencies };\n record.devDependencies = { ...record.devDependencies, ...dependencies.both.devDependencies };\n\n return record;\n }\n\n export interface CreateDirectoryOptions {\n directory?: string;\n ignoredFiles?: string[];\n onNotEmpty?: 'prompt'|'throw'|'ignore';\n }\n\n export interface SetupLanguageOptions {\n typescript?: boolean;\n }\n\n export interface CreateConfigOptions extends Partial<ConfigReader.CreateOptions> {}\n\n export interface CreateModulesOptions extends Partial<CopyOptions> {}\n\n export interface SetPackageManagerOptions {\n packageManager?: PackageManagerName;\n }\n\n export interface InstallDependenciesOptions {\n value?: boolean;\n }\n\n export interface CreateEnvFileOptions {\n envFile?: string;\n tokenKey?: string;\n env?: Record<string, string>;\n }\n\n export interface BuildOptions {\n skipBuild?: boolean;\n }\n\n export interface CopyOptions {\n overwrite?: boolean|((data: CopyMetadata) => boolean);\n filter?: (data: CopyMetadata) => boolean;\n rename?: (data: CopyMetadata) => string;\n }\n\n export interface CopyMetadata {\n basename: string;\n src: string;\n dest: string;\n }\n\n export async function copy(from: string, to: string, options?: CopyOptions): Promise<void> {\n const fromStats = await stat(from).catch(() => undefined);\n if (!fromStats) return;\n\n if (fromStats.isDirectory()) {\n const files = await readdir(from);\n\n for (const file of files) {\n const data: CopyMetadata = {\n basename: file,\n src: path.join(from, file),\n dest: to\n };\n\n await copy(\n data.src,\n path.join(to,\n options?.rename\n ? options.rename(data)\n : file\n ),\n options\n );\n }\n return;\n }\n\n const data: CopyMetadata = {\n basename: path.basename(from),\n src: from,\n dest: to\n };\n\n if (options?.filter && !options.filter(data)) return;\n\n const toStats = await stat(to).catch(() => undefined);\n const overwrite = typeof options?.overwrite === 'function'\n ? options.overwrite(data)\n : options?.overwrite ?? true;\n\n if (toStats && overwrite) return;\n\n await mkdir(path.dirname(to), { recursive: true });\n await copyFile(from, to);\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,35 +1,35 @@
|
|
|
1
1
|
import { ModuleType } from "../../helpers/constants.mjs";
|
|
2
2
|
import { AnyModuleData } from "../../helpers/types.mjs";
|
|
3
3
|
import { Validator } from "@reciple/core";
|
|
4
|
-
import * as
|
|
4
|
+
import * as _sapphire_shapeshift0 from "@sapphire/shapeshift";
|
|
5
5
|
|
|
6
6
|
//#region src/classes/validation/BaseModuleValidator.d.ts
|
|
7
7
|
declare class BaseModuleValidator extends Validator {
|
|
8
|
-
static id:
|
|
9
|
-
static moduleType:
|
|
10
|
-
static onEnable:
|
|
11
|
-
static onReady:
|
|
12
|
-
static onDisable:
|
|
13
|
-
static object:
|
|
8
|
+
static id: _sapphire_shapeshift0.StringValidator<string>;
|
|
9
|
+
static moduleType: _sapphire_shapeshift0.NativeEnumValidator<typeof ModuleType>;
|
|
10
|
+
static onEnable: _sapphire_shapeshift0.UnionValidator<Function | undefined>;
|
|
11
|
+
static onReady: _sapphire_shapeshift0.UnionValidator<Function | undefined>;
|
|
12
|
+
static onDisable: _sapphire_shapeshift0.UnionValidator<Function | undefined>;
|
|
13
|
+
static object: _sapphire_shapeshift0.ObjectValidator<{
|
|
14
14
|
id: string | undefined;
|
|
15
15
|
moduleType: ModuleType | undefined;
|
|
16
16
|
onEnable: Function | undefined;
|
|
17
17
|
onReady: Function | undefined;
|
|
18
18
|
onDisable: Function | undefined;
|
|
19
|
-
},
|
|
19
|
+
}, _sapphire_shapeshift0.UndefinedToOptional<{
|
|
20
20
|
id: string | undefined;
|
|
21
21
|
moduleType: ModuleType | undefined;
|
|
22
22
|
onEnable: Function | undefined;
|
|
23
23
|
onReady: Function | undefined;
|
|
24
24
|
onDisable: Function | undefined;
|
|
25
25
|
}>>;
|
|
26
|
-
static resolvable:
|
|
26
|
+
static resolvable: _sapphire_shapeshift0.UnionValidator<_sapphire_shapeshift0.UndefinedToOptional<{
|
|
27
27
|
id: string | undefined;
|
|
28
28
|
moduleType: ModuleType | undefined;
|
|
29
29
|
onEnable: Function | undefined;
|
|
30
30
|
onReady: Function | undefined;
|
|
31
31
|
onDisable: Function | undefined;
|
|
32
|
-
}> |
|
|
32
|
+
}> | _sapphire_shapeshift0.UndefinedToOptional<{
|
|
33
33
|
toJSON: Function;
|
|
34
34
|
}>>;
|
|
35
35
|
static isValidId(id: unknown): asserts id is string;
|
|
@@ -3,11 +3,11 @@ import { AnyCommandModuleData } from "../../helpers/types.mjs";
|
|
|
3
3
|
import "../../index.mjs";
|
|
4
4
|
import * as _reciple_core0 from "@reciple/core";
|
|
5
5
|
import { Validator } from "@reciple/core";
|
|
6
|
-
import * as
|
|
6
|
+
import * as _sapphire_shapeshift9 from "@sapphire/shapeshift";
|
|
7
7
|
|
|
8
8
|
//#region src/classes/validation/CommandModuleValidator.d.ts
|
|
9
9
|
declare class CommandModuleValidator extends Validator {
|
|
10
|
-
static object:
|
|
10
|
+
static object: _sapphire_shapeshift9.ObjectValidator<{
|
|
11
11
|
id: string | undefined;
|
|
12
12
|
moduleType: ModuleType | undefined;
|
|
13
13
|
onEnable: Function | undefined;
|
|
@@ -16,23 +16,23 @@ declare class CommandModuleValidator extends Validator {
|
|
|
16
16
|
} & {
|
|
17
17
|
id: string;
|
|
18
18
|
type: _reciple_core0.CommandType;
|
|
19
|
-
data:
|
|
19
|
+
data: _sapphire_shapeshift9.UndefinedToOptional<{
|
|
20
20
|
name: any;
|
|
21
21
|
description: any;
|
|
22
22
|
aliases: any;
|
|
23
23
|
options: any;
|
|
24
24
|
flags: any;
|
|
25
|
-
}> |
|
|
25
|
+
}> | _sapphire_shapeshift9.UndefinedToOptional<{
|
|
26
26
|
type: any;
|
|
27
27
|
name: any;
|
|
28
28
|
}>;
|
|
29
29
|
cooldown: number | undefined;
|
|
30
|
-
preconditions:
|
|
30
|
+
preconditions: _sapphire_shapeshift9.UndefinedToOptional<{
|
|
31
31
|
id: any;
|
|
32
32
|
scope: any;
|
|
33
33
|
execute: any;
|
|
34
34
|
}>[] | undefined;
|
|
35
|
-
postconditions:
|
|
35
|
+
postconditions: _sapphire_shapeshift9.UndefinedToOptional<{
|
|
36
36
|
id: any;
|
|
37
37
|
scope: any;
|
|
38
38
|
execute: any;
|
|
@@ -40,7 +40,7 @@ declare class CommandModuleValidator extends Validator {
|
|
|
40
40
|
disabledPreconditions: string[] | undefined;
|
|
41
41
|
disabledPostconditions: string[] | undefined;
|
|
42
42
|
execute: Function;
|
|
43
|
-
},
|
|
43
|
+
}, _sapphire_shapeshift9.UndefinedToOptional<{
|
|
44
44
|
id: string | undefined;
|
|
45
45
|
moduleType: ModuleType | undefined;
|
|
46
46
|
onEnable: Function | undefined;
|
|
@@ -49,23 +49,23 @@ declare class CommandModuleValidator extends Validator {
|
|
|
49
49
|
} & {
|
|
50
50
|
id: string;
|
|
51
51
|
type: _reciple_core0.CommandType;
|
|
52
|
-
data:
|
|
52
|
+
data: _sapphire_shapeshift9.UndefinedToOptional<{
|
|
53
53
|
name: any;
|
|
54
54
|
description: any;
|
|
55
55
|
aliases: any;
|
|
56
56
|
options: any;
|
|
57
57
|
flags: any;
|
|
58
|
-
}> |
|
|
58
|
+
}> | _sapphire_shapeshift9.UndefinedToOptional<{
|
|
59
59
|
type: any;
|
|
60
60
|
name: any;
|
|
61
61
|
}>;
|
|
62
62
|
cooldown: number | undefined;
|
|
63
|
-
preconditions:
|
|
63
|
+
preconditions: _sapphire_shapeshift9.UndefinedToOptional<{
|
|
64
64
|
id: any;
|
|
65
65
|
scope: any;
|
|
66
66
|
execute: any;
|
|
67
67
|
}>[] | undefined;
|
|
68
|
-
postconditions:
|
|
68
|
+
postconditions: _sapphire_shapeshift9.UndefinedToOptional<{
|
|
69
69
|
id: any;
|
|
70
70
|
scope: any;
|
|
71
71
|
execute: any;
|
|
@@ -74,9 +74,9 @@ declare class CommandModuleValidator extends Validator {
|
|
|
74
74
|
disabledPostconditions: string[] | undefined;
|
|
75
75
|
execute: Function;
|
|
76
76
|
}>>;
|
|
77
|
-
static resolvable:
|
|
77
|
+
static resolvable: _sapphire_shapeshift9.UnionValidator<_sapphire_shapeshift9.UndefinedToOptional<{
|
|
78
78
|
toJSON: Function;
|
|
79
|
-
}> |
|
|
79
|
+
}> | _sapphire_shapeshift9.UndefinedToOptional<{
|
|
80
80
|
id: string | undefined;
|
|
81
81
|
moduleType: ModuleType | undefined;
|
|
82
82
|
onEnable: Function | undefined;
|
|
@@ -85,23 +85,23 @@ declare class CommandModuleValidator extends Validator {
|
|
|
85
85
|
} & {
|
|
86
86
|
id: string;
|
|
87
87
|
type: _reciple_core0.CommandType;
|
|
88
|
-
data:
|
|
88
|
+
data: _sapphire_shapeshift9.UndefinedToOptional<{
|
|
89
89
|
name: any;
|
|
90
90
|
description: any;
|
|
91
91
|
aliases: any;
|
|
92
92
|
options: any;
|
|
93
93
|
flags: any;
|
|
94
|
-
}> |
|
|
94
|
+
}> | _sapphire_shapeshift9.UndefinedToOptional<{
|
|
95
95
|
type: any;
|
|
96
96
|
name: any;
|
|
97
97
|
}>;
|
|
98
98
|
cooldown: number | undefined;
|
|
99
|
-
preconditions:
|
|
99
|
+
preconditions: _sapphire_shapeshift9.UndefinedToOptional<{
|
|
100
100
|
id: any;
|
|
101
101
|
scope: any;
|
|
102
102
|
execute: any;
|
|
103
103
|
}>[] | undefined;
|
|
104
|
-
postconditions:
|
|
104
|
+
postconditions: _sapphire_shapeshift9.UndefinedToOptional<{
|
|
105
105
|
id: any;
|
|
106
106
|
scope: any;
|
|
107
107
|
execute: any;
|
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
import { ModuleType } from "../../helpers/constants.mjs";
|
|
2
2
|
import { EventModule } from "../modules/events/EventModule.mjs";
|
|
3
|
+
import "../../index.mjs";
|
|
3
4
|
import { Validator } from "@reciple/core";
|
|
4
5
|
import { EventEmitter } from "node:events";
|
|
5
|
-
import * as
|
|
6
|
+
import * as _sapphire_shapeshift33 from "@sapphire/shapeshift";
|
|
6
7
|
|
|
7
8
|
//#region src/classes/validation/EventModuleValidator.d.ts
|
|
8
9
|
declare class EventModuleValidator extends Validator {
|
|
9
|
-
static emitter:
|
|
10
|
+
static emitter: _sapphire_shapeshift33.InstanceValidator<EventEmitter<{
|
|
10
11
|
[x: string]: any[];
|
|
11
12
|
[x: number]: any[];
|
|
12
13
|
[x: symbol]: any[];
|
|
13
14
|
}>>;
|
|
14
|
-
static event:
|
|
15
|
-
static once:
|
|
16
|
-
static onEvent:
|
|
17
|
-
static object:
|
|
15
|
+
static event: _sapphire_shapeshift33.StringValidator<string>;
|
|
16
|
+
static once: _sapphire_shapeshift33.UnionValidator<boolean | undefined>;
|
|
17
|
+
static onEvent: _sapphire_shapeshift33.InstanceValidator<Function>;
|
|
18
|
+
static object: _sapphire_shapeshift33.ObjectValidator<{
|
|
18
19
|
id: string | undefined;
|
|
19
20
|
moduleType: ModuleType | undefined;
|
|
20
21
|
onEnable: Function | undefined;
|
|
@@ -29,7 +30,7 @@ declare class EventModuleValidator extends Validator {
|
|
|
29
30
|
event: string;
|
|
30
31
|
once: boolean | undefined;
|
|
31
32
|
onEvent: Function;
|
|
32
|
-
},
|
|
33
|
+
}, _sapphire_shapeshift33.UndefinedToOptional<{
|
|
33
34
|
id: string | undefined;
|
|
34
35
|
moduleType: ModuleType | undefined;
|
|
35
36
|
onEnable: Function | undefined;
|
|
@@ -45,7 +46,9 @@ declare class EventModuleValidator extends Validator {
|
|
|
45
46
|
once: boolean | undefined;
|
|
46
47
|
onEvent: Function;
|
|
47
48
|
}>>;
|
|
48
|
-
static resolvable:
|
|
49
|
+
static resolvable: _sapphire_shapeshift33.UnionValidator<_sapphire_shapeshift33.UndefinedToOptional<{
|
|
50
|
+
toJSON: Function;
|
|
51
|
+
}> | _sapphire_shapeshift33.UndefinedToOptional<{
|
|
49
52
|
id: string | undefined;
|
|
50
53
|
moduleType: ModuleType | undefined;
|
|
51
54
|
onEnable: Function | undefined;
|
|
@@ -60,8 +63,6 @@ declare class EventModuleValidator extends Validator {
|
|
|
60
63
|
event: string;
|
|
61
64
|
once: boolean | undefined;
|
|
62
65
|
onEvent: Function;
|
|
63
|
-
}> | _sapphire_shapeshift0.UndefinedToOptional<{
|
|
64
|
-
toJSON: Function;
|
|
65
66
|
}>>;
|
|
66
67
|
static isValidEmitter(emitter: unknown): asserts emitter is EventEmitter;
|
|
67
68
|
static isValidEvent(event: unknown): asserts event is string;
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
import { PreconditionModule } from "../modules/PreconditionModule.mjs";
|
|
2
2
|
import { CommandType, Validator } from "@reciple/core";
|
|
3
|
-
import * as
|
|
3
|
+
import * as _sapphire_shapeshift26 from "@sapphire/shapeshift";
|
|
4
4
|
|
|
5
5
|
//#region src/classes/validation/PreconditionModule.d.ts
|
|
6
6
|
declare class PreconditionModuleValidator extends Validator {
|
|
7
|
-
static scope:
|
|
8
|
-
static execute:
|
|
9
|
-
static object:
|
|
7
|
+
static scope: _sapphire_shapeshift26.UnionValidator<CommandType[] | undefined>;
|
|
8
|
+
static execute: _sapphire_shapeshift26.InstanceValidator<Function>;
|
|
9
|
+
static object: _sapphire_shapeshift26.ObjectValidator<{
|
|
10
10
|
scope: CommandType[] | undefined;
|
|
11
11
|
execute: Function;
|
|
12
|
-
},
|
|
12
|
+
}, _sapphire_shapeshift26.UndefinedToOptional<{
|
|
13
13
|
scope: CommandType[] | undefined;
|
|
14
14
|
execute: Function;
|
|
15
15
|
}>>;
|
|
16
|
-
static resolvable:
|
|
16
|
+
static resolvable: _sapphire_shapeshift26.UnionValidator<_sapphire_shapeshift26.UndefinedToOptional<{
|
|
17
17
|
toJSON: Function;
|
|
18
|
-
}> |
|
|
18
|
+
}> | _sapphire_shapeshift26.UndefinedToOptional<{
|
|
19
19
|
scope: CommandType[] | undefined;
|
|
20
20
|
execute: Function;
|
|
21
21
|
}>>;
|
package/dist/package.mjs
CHANGED