reciple 10.0.1-dev.5 → 10.0.1-dev.6

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.
@@ -31,12 +31,10 @@ var CreateSubcommand = class extends CLISubcommand {
31
31
  await template.setupLanguage();
32
32
  await template.createConfig();
33
33
  await template.setPackageManager();
34
+ await template.installDependencies({ value: flags?.install });
34
35
  await template.createTemplate();
35
36
  await template.createEnvFile({ envFile: this.cli.flags.env[0] });
36
- await template.build({
37
- skipInstall: !flags?.install,
38
- skipBuild: !flags?.build
39
- });
37
+ await template.build({ skipBuild: !flags?.build });
40
38
  } catch (error) {
41
39
  cancel(colors.red(error instanceof NotAnError ? error.message : inspect(error)));
42
40
  }
@@ -1 +1 @@
1
- {"version":3,"file":"create.mjs","names":[],"sources":["../../../src/bin/commands/create.ts"],"sourcesContent":["import { Command, Option } from 'commander';\nimport { CLISubcommand } from '../../classes/cli/CLISubcommand.js';\nimport { colors } from '@reciple/utils';\nimport { TemplateBuilder } from '../../classes/templates/TemplateBuilder.js';\nimport { cancel } from '@clack/prompts';\nimport { inspect } from 'node:util';\nimport { NotAnError } from '../../classes/NotAnError.js';\nimport type { PackageManagerName } from 'nypm';\n\nexport default class CreateSubcommand extends CLISubcommand {\n public subcommand: Command = new Command('create')\n .description('Create a new reciple project')\n .argument('[output]', 'The directory to create the project in')\n .option('-c, --config <path>', 'Path to the configuration file')\n .option('-t, --token <DiscordToken>', 'Set your Discord Bot token')\n .option('-T, --typescript', 'Use TypeScript')\n .addOption(new Option('-p, --package-manager <name>', 'The name of the package manager to use')\n .choices(['npm', 'yarn', 'pnpm', 'bun', 'deno'])\n )\n .option('-D, --default', 'Use defaults for prompts')\n .option('--install', 'Install dependencies during setup', true)\n .option('--build', 'Build the project after creation', true)\n .allowUnknownOption(true);\n\n public async execute(): Promise<void> {\n const flags = this.cli.getFlags<CreateSubcommand.Flags>('create');\n const template = new TemplateBuilder({\n cli: this.cli,\n directory: this.subcommand.args[0],\n typescript: flags?.typescript,\n packageManager: flags?.packageManager,\n defaultAll: flags?.default,\n token: flags?.token,\n });\n\n try {\n await template.init();\n await template.createDirectory();\n await template.setupLanguage();\n await template.createConfig();\n await template.setPackageManager();\n await template.createTemplate();\n await template.createEnvFile({ envFile: this.cli.flags.env[0] });\n await template.build({ skipInstall: !flags?.install, skipBuild: !flags?.build });\n } catch (error) {\n cancel(colors.red(error instanceof NotAnError ? error.message : inspect(error)));\n }\n }\n}\n\nexport namespace CreateSubcommand {\n export interface Flags {\n config?: string;\n token?: string;\n default?: boolean;\n typescript?: boolean;\n packageManager?: PackageManagerName;\n install: boolean;\n build: boolean;\n }\n}\n"],"mappings":";;;;;;;;;AASA,IAAqB,mBAArB,cAA8C,cAAc;CACxD,AAAO,aAAsB,IAAI,QAAQ,SAAS,CAC7C,YAAY,+BAA+B,CAC3C,SAAS,YAAY,yCAAyC,CAC9D,OAAO,uBAAuB,iCAAiC,CAC/D,OAAO,8BAA8B,6BAA6B,CAClE,OAAO,oBAAoB,iBAAiB,CAC5C,UAAU,IAAI,OAAO,gCAAgC,yCAAyC,CAC1F,QAAQ;EAAC;EAAO;EAAQ;EAAQ;EAAO;EAAO,CAAC,CACnD,CACA,OAAO,iBAAiB,2BAA2B,CACnD,OAAO,aAAa,qCAAqC,KAAK,CAC9D,OAAO,WAAW,oCAAoC,KAAK,CAC3D,mBAAmB,KAAK;CAE7B,MAAa,UAAyB;EAClC,MAAM,QAAQ,KAAK,IAAI,SAAiC,SAAS;EACjE,MAAM,WAAW,IAAI,gBAAgB;GACjC,KAAK,KAAK;GACV,WAAW,KAAK,WAAW,KAAK;GAChC,YAAY,OAAO;GACnB,gBAAgB,OAAO;GACvB,YAAY,OAAO;GACnB,OAAO,OAAO;GACjB,CAAC;AAEF,MAAI;AACA,SAAM,SAAS,MAAM;AACrB,SAAM,SAAS,iBAAiB;AAChC,SAAM,SAAS,eAAe;AAC9B,SAAM,SAAS,cAAc;AAC7B,SAAM,SAAS,mBAAmB;AAClC,SAAM,SAAS,gBAAgB;AAC/B,SAAM,SAAS,cAAc,EAAE,SAAS,KAAK,IAAI,MAAM,IAAI,IAAI,CAAC;AAChE,SAAM,SAAS,MAAM;IAAE,aAAa,CAAC,OAAO;IAAS,WAAW,CAAC,OAAO;IAAO,CAAC;WAC3E,OAAO;AACZ,UAAO,OAAO,IAAI,iBAAiB,aAAa,MAAM,UAAU,QAAQ,MAAM,CAAC,CAAC"}
1
+ {"version":3,"file":"create.mjs","names":[],"sources":["../../../src/bin/commands/create.ts"],"sourcesContent":["import { Command, Option } from 'commander';\nimport { CLISubcommand } from '../../classes/cli/CLISubcommand.js';\nimport { colors } from '@reciple/utils';\nimport { TemplateBuilder } from '../../classes/templates/TemplateBuilder.js';\nimport { cancel } from '@clack/prompts';\nimport { inspect } from 'node:util';\nimport { NotAnError } from '../../classes/NotAnError.js';\nimport type { PackageManagerName } from 'nypm';\n\nexport default class CreateSubcommand extends CLISubcommand {\n public subcommand: Command = new Command('create')\n .description('Create a new reciple project')\n .argument('[output]', 'The directory to create the project in')\n .option('-c, --config <path>', 'Path to the configuration file')\n .option('-t, --token <DiscordToken>', 'Set your Discord Bot token')\n .option('-T, --typescript', 'Use TypeScript')\n .addOption(new Option('-p, --package-manager <name>', 'The name of the package manager to use')\n .choices(['npm', 'yarn', 'pnpm', 'bun', 'deno'])\n )\n .option('-D, --default', 'Use defaults for prompts')\n .option('--install', 'Install dependencies during setup', true)\n .option('--build', 'Build the project after creation', true)\n .allowUnknownOption(true);\n\n public async execute(): Promise<void> {\n const flags = this.cli.getFlags<CreateSubcommand.Flags>('create');\n const template = new TemplateBuilder({\n cli: this.cli,\n directory: this.subcommand.args[0],\n typescript: flags?.typescript,\n packageManager: flags?.packageManager,\n defaultAll: flags?.default,\n token: flags?.token,\n });\n\n try {\n await template.init();\n await template.createDirectory();\n await template.setupLanguage();\n await template.createConfig();\n await template.setPackageManager();\n await template.installDependencies({ value: flags?.install });\n await template.createTemplate();\n await template.createEnvFile({ envFile: this.cli.flags.env[0] });\n await template.build({ skipBuild: !flags?.build });\n } catch (error) {\n cancel(colors.red(error instanceof NotAnError ? error.message : inspect(error)));\n }\n }\n}\n\nexport namespace CreateSubcommand {\n export interface Flags {\n config?: string;\n token?: string;\n default?: boolean;\n typescript?: boolean;\n packageManager?: PackageManagerName;\n install: boolean;\n build: boolean;\n }\n}\n"],"mappings":";;;;;;;;;AASA,IAAqB,mBAArB,cAA8C,cAAc;CACxD,AAAO,aAAsB,IAAI,QAAQ,SAAS,CAC7C,YAAY,+BAA+B,CAC3C,SAAS,YAAY,yCAAyC,CAC9D,OAAO,uBAAuB,iCAAiC,CAC/D,OAAO,8BAA8B,6BAA6B,CAClE,OAAO,oBAAoB,iBAAiB,CAC5C,UAAU,IAAI,OAAO,gCAAgC,yCAAyC,CAC1F,QAAQ;EAAC;EAAO;EAAQ;EAAQ;EAAO;EAAO,CAAC,CACnD,CACA,OAAO,iBAAiB,2BAA2B,CACnD,OAAO,aAAa,qCAAqC,KAAK,CAC9D,OAAO,WAAW,oCAAoC,KAAK,CAC3D,mBAAmB,KAAK;CAE7B,MAAa,UAAyB;EAClC,MAAM,QAAQ,KAAK,IAAI,SAAiC,SAAS;EACjE,MAAM,WAAW,IAAI,gBAAgB;GACjC,KAAK,KAAK;GACV,WAAW,KAAK,WAAW,KAAK;GAChC,YAAY,OAAO;GACnB,gBAAgB,OAAO;GACvB,YAAY,OAAO;GACnB,OAAO,OAAO;GACjB,CAAC;AAEF,MAAI;AACA,SAAM,SAAS,MAAM;AACrB,SAAM,SAAS,iBAAiB;AAChC,SAAM,SAAS,eAAe;AAC9B,SAAM,SAAS,cAAc;AAC7B,SAAM,SAAS,mBAAmB;AAClC,SAAM,SAAS,oBAAoB,EAAE,OAAO,OAAO,SAAS,CAAC;AAC7D,SAAM,SAAS,gBAAgB;AAC/B,SAAM,SAAS,cAAc,EAAE,SAAS,KAAK,IAAI,MAAM,IAAI,IAAI,CAAC;AAChE,SAAM,SAAS,MAAM,EAAE,WAAW,CAAC,OAAO,OAAO,CAAC;WAC7C,OAAO;AACZ,UAAO,OAAO,IAAI,iBAAiB,aAAa,MAAM,UAAU,QAAQ,MAAM,CAAC,CAAC"}
@@ -86,7 +86,7 @@ var CLI = class {
86
86
  (function(_CLI) {
87
87
  _CLI.root = path.join(path.dirname(fileURLToPath(import.meta.url)), "../../../");
88
88
  _CLI.bin = path.join(CLI.root, "dist/bin/reciple.js");
89
- _CLI.version = "10.0.1-dev.5";
89
+ _CLI.version = "10.0.1-dev.6";
90
90
  function stringifyFlags(flags, command, ignored = []) {
91
91
  let arr = [];
92
92
  for (const [key, value] of Object.entries(flags)) {
@@ -39,7 +39,6 @@ declare class ConfigReader {
39
39
  static hasFile(filepath: string): Promise<boolean>;
40
40
  static findConfig(directory: string, type?: 'ts' | 'js'): Promise<string | null>;
41
41
  static getDefaultContent(type?: 'ts' | 'js'): Promise<string>;
42
- static getDefault(type?: 'ts' | 'js'): Promise<ConfigReader>;
43
42
  }
44
43
  declare namespace ConfigReader {
45
44
  function getProjectLang(dir: string): Promise<'ts' | 'js'>;
@@ -72,10 +72,6 @@ var ConfigReader = class ConfigReader {
72
72
  const filepath = ConfigReader.defaultConfigFilePaths[type];
73
73
  return await readFile(filepath, "utf-8");
74
74
  }
75
- static async getDefault(type = "js") {
76
- const filepath = ConfigReader.defaultConfigFilePaths[type];
77
- return new ConfigReader(filepath).read();
78
- }
79
75
  };
80
76
  (function(_ConfigReader) {
81
77
  async function getProjectLang(dir) {
@@ -1 +1 @@
1
- {"version":3,"file":"ConfigReader.mjs","names":["filepath: string"],"sources":["../../../src/classes/cli/ConfigReader.ts"],"sourcesContent":["import { Client, RecipleError, type Config } from '@reciple/core';\nimport { colors } from '@reciple/utils';\nimport { CLI } from './CLI.js';\nimport path from 'node:path';\nimport { mkdir, readdir, readFile, stat, writeFile } from 'node:fs/promises';\nimport type { ModuleLoader } from '../client/ModuleLoader.js';\nimport type { Logger } from 'prtyprnt';\nimport type { ModuleManager } from '../managers/ModuleManager.js';\nimport type { BuildConfig } from '../../helpers/types.js';\nimport type { EventListeners } from '../client/EventListeners.js';\nimport type { UserConfig } from 'tsdown';\nimport { unrun, type Options } from 'unrun';\nimport { resolveTSConfig } from 'pkg-types';\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\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 constructor(public readonly filepath: string) {}\n\n public async read(options?: Omit<ConfigReader.ReadOptions, 'filepath'>): Promise<ConfigReader> {\n if (!await ConfigReader.hasFile(this.filepath) && options?.createIfNotExists !== false) return ConfigReader.create({\n filepath: this.filepath,\n readOptions: options\n });\n\n const { module } = await unrun<Config>({ ...options, path: this.filepath });\n\n if (!module || !module.client || !(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\n return this;\n }\n\n public async create(options?: Omit<ConfigReader.CreateOptions, 'filepath'>): Promise<ConfigReader> {\n return ConfigReader.create({ ...options, filepath: this.filepath });\n }\n\n public async exists(): Promise<boolean> {\n return await ConfigReader.hasFile(this.filepath);\n }\n\n public static async create(options: ConfigReader.CreateOptions): Promise<ConfigReader> {\n const type = options.type ?? ConfigReader.getLangTypeFromFilename(options.filepath) ?? 'js';\n\n if (await ConfigReader.hasFile(options.filepath) && !options.overwrite) {\n if (options.throwOnConflict !== false) throw new RecipleError(`config file already exists at ${colors.green(options.filepath)}`);\n\n const reader = new ConfigReader(options.filepath);\n await reader.read(options.readOptions);\n return reader;\n }\n\n await mkdir(path.dirname(options.filepath), { recursive: true });\n await writeFile(options.filepath, await this.getDefaultContent(type));\n\n const reader = new ConfigReader(options.filepath);\n\n return reader;\n }\n\n public static async hasFile(filepath: string): Promise<boolean> {\n return stat(filepath)\n .then(s => s.isFile())\n .catch(() => false);\n }\n\n public static async findConfig(directory: string, type?: 'ts'|'js'): Promise<string|null> {\n const validFiles = ConfigReader.defaultConfigFilenames.filter(f => type ? ConfigReader.FileTypes[type].includes(f) : true);\n const files = (await readdir(directory)).find(f => validFiles.includes(f));\n return files ? path.join(directory, files) : null;\n }\n\n public static async getDefaultContent(type: 'ts'|'js' = 'js'): Promise<string> {\n const filepath = ConfigReader.defaultConfigFilePaths[type];\n const content = await readFile(filepath, 'utf-8');\n return content;\n }\n\n public static async getDefault(type: 'ts'|'js' = 'js'): Promise<ConfigReader> {\n const filepath = ConfigReader.defaultConfigFilePaths[type];\n return new ConfigReader(filepath).read();\n }\n}\n\nexport namespace ConfigReader {\n export async function getProjectLang(dir: string): Promise<'ts'|'js'> {\n const hasTsConfig = !!await resolveTSConfig(dir, { try: true });\n const configLangIsTypescript = (await ConfigReader.findConfig(dir).then(f => f ?? '')).endsWith('ts');\n\n return hasTsConfig || configLangIsTypescript ? 'ts' : 'js';\n }\n\n export interface Structure {\n client: Client;\n config: Config;\n }\n\n export interface ReadOptions extends Options {\n createIfNotExists?: boolean;\n createOptions?: Omit<CreateOptions, 'path'>;\n }\n\n export interface CreateOptions {\n filepath: string;\n overwrite?: boolean;\n throwOnConflict?: boolean;\n type?: 'ts' | 'js';\n readOptions?: Omit<ReadOptions, ''>;\n }\n\n export const FileTypes = {\n ts: ['ts', 'mts', 'tsx'],\n js: ['js', 'mjs', 'jsx']\n };\n\n export const defaultConfigFilePaths = {\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 const defaultConfigFilenames = [\n 'reciple.config.ts',\n 'reciple.config.mts',\n 'reciple.config.js',\n 'reciple.config.mjs'\n ];\n\n export function normalizeTsdownConfig({ type, overrides }: { type?: 'ts' | 'js', overrides?: BuildConfig; } = {}): UserConfig {\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 export function createConfigFilename(type: 'ts'|'js', esm: boolean = false): string {\n return `reciple.config.${type === 'ts' ? esm ? 'mts' : 'ts' : esm ? 'mjs' : 'js'}`;\n }\n\n export function getLangTypeFromFilename(filename: string): 'ts'|'js'|null {\n const extention = path.extname(filename).slice(1);\n\n if (FileTypes.ts.includes(extention)) return 'ts';\n if (FileTypes.js.includes(extention)) return 'js';\n return null;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ConfigReader.mjs","names":["filepath: string"],"sources":["../../../src/classes/cli/ConfigReader.ts"],"sourcesContent":["import { Client, RecipleError, type Config } from '@reciple/core';\nimport { colors } from '@reciple/utils';\nimport { CLI } from './CLI.js';\nimport path from 'node:path';\nimport { mkdir, readdir, readFile, stat, writeFile } from 'node:fs/promises';\nimport type { ModuleLoader } from '../client/ModuleLoader.js';\nimport type { Logger } from 'prtyprnt';\nimport type { ModuleManager } from '../managers/ModuleManager.js';\nimport type { BuildConfig } from '../../helpers/types.js';\nimport type { EventListeners } from '../client/EventListeners.js';\nimport type { UserConfig } from 'tsdown';\nimport { unrun, type Options } from 'unrun';\nimport { resolveTSConfig } from 'pkg-types';\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\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 constructor(public readonly filepath: string) {}\n\n public async read(options?: Omit<ConfigReader.ReadOptions, 'filepath'>): Promise<ConfigReader> {\n if (!await ConfigReader.hasFile(this.filepath) && options?.createIfNotExists !== false) return ConfigReader.create({\n filepath: this.filepath,\n readOptions: options\n });\n\n const { module } = await unrun<Config>({ ...options, path: this.filepath });\n\n if (!module || !module.client || !(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\n return this;\n }\n\n public async create(options?: Omit<ConfigReader.CreateOptions, 'filepath'>): Promise<ConfigReader> {\n return ConfigReader.create({ ...options, filepath: this.filepath });\n }\n\n public async exists(): Promise<boolean> {\n return await ConfigReader.hasFile(this.filepath);\n }\n\n public static async create(options: ConfigReader.CreateOptions): Promise<ConfigReader> {\n const type = options.type ?? ConfigReader.getLangTypeFromFilename(options.filepath) ?? 'js';\n\n if (await ConfigReader.hasFile(options.filepath) && !options.overwrite) {\n if (options.throwOnConflict !== false) throw new RecipleError(`config file already exists at ${colors.green(options.filepath)}`);\n\n const reader = new ConfigReader(options.filepath);\n await reader.read(options.readOptions);\n return reader;\n }\n\n await mkdir(path.dirname(options.filepath), { recursive: true });\n await writeFile(options.filepath, await this.getDefaultContent(type));\n\n const reader = new ConfigReader(options.filepath);\n\n return reader;\n }\n\n public static async hasFile(filepath: string): Promise<boolean> {\n return stat(filepath)\n .then(s => s.isFile())\n .catch(() => false);\n }\n\n public static async findConfig(directory: string, type?: 'ts'|'js'): Promise<string|null> {\n const validFiles = ConfigReader.defaultConfigFilenames.filter(f => type ? ConfigReader.FileTypes[type].includes(f) : true);\n const files = (await readdir(directory)).find(f => validFiles.includes(f));\n return files ? path.join(directory, files) : null;\n }\n\n public static async getDefaultContent(type: 'ts'|'js' = 'js'): Promise<string> {\n const filepath = ConfigReader.defaultConfigFilePaths[type];\n const content = await readFile(filepath, 'utf-8');\n return content;\n }\n}\n\nexport namespace ConfigReader {\n export async function getProjectLang(dir: string): Promise<'ts'|'js'> {\n const hasTsConfig = !!await resolveTSConfig(dir, { try: true });\n const configLangIsTypescript = (await ConfigReader.findConfig(dir).then(f => f ?? '')).endsWith('ts');\n\n return hasTsConfig || configLangIsTypescript ? 'ts' : 'js';\n }\n\n export interface Structure {\n client: Client;\n config: Config;\n }\n\n export interface ReadOptions extends Options {\n createIfNotExists?: boolean;\n createOptions?: Omit<CreateOptions, 'path'>;\n }\n\n export interface CreateOptions {\n filepath: string;\n overwrite?: boolean;\n throwOnConflict?: boolean;\n type?: 'ts' | 'js';\n readOptions?: Omit<ReadOptions, ''>;\n }\n\n export const FileTypes = {\n ts: ['ts', 'mts', 'tsx'],\n js: ['js', 'mjs', 'jsx']\n };\n\n export const defaultConfigFilePaths = {\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 const defaultConfigFilenames = [\n 'reciple.config.ts',\n 'reciple.config.mts',\n 'reciple.config.js',\n 'reciple.config.mjs'\n ];\n\n export function normalizeTsdownConfig({ type, overrides }: { type?: 'ts' | 'js', overrides?: BuildConfig; } = {}): UserConfig {\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 export function createConfigFilename(type: 'ts'|'js', esm: boolean = false): string {\n return `reciple.config.${type === 'ts' ? esm ? 'mts' : 'ts' : esm ? 'mjs' : 'js'}`;\n }\n\n export function getLangTypeFromFilename(filename: string): 'ts'|'js'|null {\n const extention = path.extname(filename).slice(1);\n\n if (FileTypes.ts.includes(extention)) return 'ts';\n if (FileTypes.js.includes(extention)) return 'js';\n return null;\n }\n}\n"],"mappings":"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"}
@@ -13,6 +13,7 @@ declare class TemplateBuilder {
13
13
  config?: ConfigReader;
14
14
  packageJson?: PackageJsonBuilder;
15
15
  packageManager?: PackageManagerName;
16
+ dependenciesInstalled: boolean;
16
17
  get directory(): string;
17
18
  get relativeDirectory(): string;
18
19
  get packageJsonPath(): string;
@@ -23,6 +24,8 @@ declare class TemplateBuilder {
23
24
  setupLanguage(options?: TemplateBuilder.SetupLanguageOptions): Promise<this>;
24
25
  createConfig(options?: TemplateBuilder.CreateConfigOptions): Promise<this>;
25
26
  createTemplate(options?: TemplateBuilder.CreateModulesOptions): Promise<this>;
27
+ installDependencies(options?: TemplateBuilder.InstallDependenciesOptions): Promise<this>;
28
+ createModules(): Promise<this>;
26
29
  setPackageManager(options?: TemplateBuilder.SetPackageManagerOptions): Promise<this>;
27
30
  createEnvFile(options?: TemplateBuilder.CreateEnvFileOptions): Promise<this>;
28
31
  build(options?: TemplateBuilder.BuildOptions): Promise<this>;
@@ -52,13 +55,15 @@ declare namespace TemplateBuilder {
52
55
  interface SetPackageManagerOptions {
53
56
  packageManager?: PackageManagerName;
54
57
  }
58
+ interface InstallDependenciesOptions {
59
+ value?: boolean;
60
+ }
55
61
  interface CreateEnvFileOptions {
56
62
  envFile?: string;
57
63
  tokenKey?: string;
58
64
  env?: Record<string, string>;
59
65
  }
60
66
  interface BuildOptions {
61
- skipInstall?: boolean;
62
67
  skipBuild?: boolean;
63
68
  }
64
69
  interface CopyOptions {
@@ -7,7 +7,7 @@ import path from "node:path";
7
7
  import { PackageJsonBuilder, colors } from "@reciple/utils";
8
8
  import { parse } from "@dotenvx/dotenvx";
9
9
  import { copyFile, mkdir, readFile, readdir, stat, writeFile } from "node:fs/promises";
10
- import { confirm, intro, isCancel, outro, select, text } from "@clack/prompts";
10
+ import { confirm, intro, isCancel, log, outro, select, text } from "@clack/prompts";
11
11
  import micromatch from "micromatch";
12
12
  import { existsSync, statSync } from "node:fs";
13
13
  import { slug } from "github-slugger";
@@ -23,6 +23,7 @@ var TemplateBuilder = class TemplateBuilder {
23
23
  config;
24
24
  packageJson;
25
25
  packageManager;
26
+ dependenciesInstalled = false;
26
27
  get directory() {
27
28
  return this._directory ?? process.cwd();
28
29
  }
@@ -122,14 +123,6 @@ var TemplateBuilder = class TemplateBuilder {
122
123
  async createTemplate(options) {
123
124
  const source = path.join(CLI.root, "./assets/templates/", this.typescript ? "typescript" : "javascript");
124
125
  const globals = path.join(CLI.root, "./assets/global/");
125
- const modulesDirectory = path.join(this.directory, "src");
126
- const moduleTemplates = await ModuleTemplateBuilder.resolveModuleTemplates(this.typescript ? "ts" : "js");
127
- const moduleOptions = {
128
- cli: this.cli,
129
- config: await ConfigReader.getDefault(this.typescript ? "ts" : "js"),
130
- defaultAll: true,
131
- typescript: this.typescript
132
- };
133
126
  function rename(data) {
134
127
  switch (data.basename) {
135
128
  case "gitignore": return ".gitignore";
@@ -145,30 +138,15 @@ var TemplateBuilder = class TemplateBuilder {
145
138
  }
146
139
  }
147
140
  const [template, loader] = CLI.createSpinnerPromise({
148
- promise: Promise.all([
149
- TemplateBuilder.copy(source, this.directory, {
150
- ...options,
151
- rename,
152
- overwrite
153
- }),
154
- TemplateBuilder.copy(globals, this.directory, {
155
- ...options,
156
- rename,
157
- overwrite
158
- }),
159
- new ModuleTemplateBuilder({
160
- ...moduleOptions,
161
- directory: path.join(modulesDirectory, "commands"),
162
- filename: `SlashCommand.${this.typescript ? "ts" : "js"}`,
163
- template: moduleTemplates.find((t) => t.name === "SlashCommand")
164
- }).setupPlaceholders().then((m) => m.build({ silent: true })),
165
- new ModuleTemplateBuilder({
166
- ...moduleOptions,
167
- directory: path.join(modulesDirectory, "events"),
168
- filename: `ClientEvent.${this.typescript ? "ts" : "js"}`,
169
- template: moduleTemplates.find((t) => t.name === "ClientEvent")
170
- }).setupPlaceholders().then((m) => m.build({ silent: true }))
171
- ]),
141
+ promise: Promise.all([TemplateBuilder.copy(source, this.directory, {
142
+ ...options,
143
+ rename,
144
+ overwrite
145
+ }), TemplateBuilder.copy(globals, this.directory, {
146
+ ...options,
147
+ rename,
148
+ overwrite
149
+ })]),
172
150
  message: "Copying template files",
173
151
  successMessage: "Files copied successfully",
174
152
  errorMessage: "Failed to copy files"
@@ -176,6 +154,66 @@ var TemplateBuilder = class TemplateBuilder {
176
154
  await template;
177
155
  return this;
178
156
  }
157
+ async installDependencies(options) {
158
+ if (options?.value !== false) {
159
+ if (options?.value === void 0) {
160
+ const install = this.defaultAll ? true : await confirm({
161
+ message: `Would you like to install dependencies?`,
162
+ active: "Yes",
163
+ inactive: "No",
164
+ initialValue: true
165
+ });
166
+ if (isCancel(install)) throw new NotAnError("Operation cancelled");
167
+ if (!install) return this;
168
+ }
169
+ await CLI.createSpinnerPromise({
170
+ promise: installDependencies({
171
+ cwd: this.directory,
172
+ packageManager: this.packageManager,
173
+ silent: true
174
+ }),
175
+ indicator: "timer",
176
+ errorMessage: `${colors.bold(colors.red("✗"))} Failed to install dependencies`,
177
+ successMessage: `${colors.bold(colors.green("✔"))} Dependencies installed successfully`,
178
+ message: `${colors.bold(colors.dim("$"))} Installing dependencies`
179
+ })[0];
180
+ this.dependenciesInstalled = true;
181
+ }
182
+ return this;
183
+ }
184
+ async createModules() {
185
+ const modulesDirectory = path.join(this.directory, "src");
186
+ const moduleTemplates = await ModuleTemplateBuilder.resolveModuleTemplates(this.typescript ? "ts" : "js");
187
+ await mkdir(modulesDirectory, { recursive: true });
188
+ if (!this.dependenciesInstalled) {
189
+ log.warn("Dependencies not installed. Skipping module creation.");
190
+ return this;
191
+ }
192
+ const moduleOptions = {
193
+ cli: this.cli,
194
+ config: await this.config?.read(),
195
+ defaultAll: true,
196
+ typescript: this.typescript
197
+ };
198
+ const [template, loader] = CLI.createSpinnerPromise({
199
+ promise: Promise.all([new ModuleTemplateBuilder({
200
+ ...moduleOptions,
201
+ directory: path.join(modulesDirectory, "commands"),
202
+ filename: `SlashCommand.${this.typescript ? "ts" : "js"}`,
203
+ template: moduleTemplates.find((t) => t.name === "SlashCommand")
204
+ }).setupPlaceholders().then((m) => m.build({ silent: true })), new ModuleTemplateBuilder({
205
+ ...moduleOptions,
206
+ directory: path.join(modulesDirectory, "events"),
207
+ filename: `ClientEvent.${this.typescript ? "ts" : "js"}`,
208
+ template: moduleTemplates.find((t) => t.name === "ClientEvent")
209
+ }).setupPlaceholders().then((m) => m.build({ silent: true }))]),
210
+ message: "Creating module templates",
211
+ successMessage: "Module templates created successfully",
212
+ errorMessage: "Failed to create module templates"
213
+ });
214
+ await template;
215
+ return this;
216
+ }
179
217
  async setPackageManager(options) {
180
218
  this.packageManager = options?.packageManager ?? this.packageManager;
181
219
  if (!this.packageManager) {
@@ -258,17 +296,6 @@ var TemplateBuilder = class TemplateBuilder {
258
296
  }
259
297
  async build(options) {
260
298
  await this.packageJson?.write(this.packageJsonPath, true);
261
- if (options?.skipInstall) await CLI.createSpinnerPromise({
262
- promise: installDependencies({
263
- cwd: this.directory,
264
- packageManager: this.packageManager,
265
- silent: true
266
- }),
267
- indicator: "timer",
268
- errorMessage: `${colors.bold(colors.red("✗"))} Failed to install dependencies`,
269
- successMessage: `${colors.bold(colors.green("✔"))} Dependencies installed successfully`,
270
- message: `${colors.bold(colors.dim("$"))} Installing dependencies`
271
- })[0];
272
299
  if (!options?.skipBuild) await CLI.createSpinnerPromise({
273
300
  promise: runScript("build", {
274
301
  cwd: this.directory,
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateBuilder.mjs","names":["dir","moduleOptions: ModuleTemplateBuilder.Options","packageManager: PackageManagerName|symbol","parseDotenv","dependencies: Record<'ts'|'js'|'both', Partial<Record<'dependencies'|'devDependencies', Record<string, string>>>>","data: CopyMetadata","data"],"sources":["../../../src/classes/templates/TemplateBuilder.ts"],"sourcesContent":["import { colors, 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 } 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';\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\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(colors.black(colors.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 createConfig(options?: TemplateBuilder.CreateConfigOptions): Promise<this> {\n let filepath = options?.filepath;\n\n if (!filepath) {\n filepath = await ConfigReader.findConfig(\n this.directory,\n this.typescript\n ? 'ts'\n : this.typescript === false\n ? 'js'\n : undefined\n )\n ?? path.join(\n this.directory,\n ConfigReader.createConfigFilename(this.typescript ? 'ts' : 'js')\n );\n }\n\n const exists = await ConfigReader.hasFile(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 filepath,\n type: this.typescript ? 'ts' : 'js',\n overwrite: true\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 const modulesDirectory = path.join(this.directory, 'src');\n const moduleTemplates = await ModuleTemplateBuilder.resolveModuleTemplates(this.typescript ? 'ts' : 'js');\n const moduleOptions: ModuleTemplateBuilder.Options = {\n cli: this.cli,\n config: await ConfigReader.getDefault(this.typescript ? 'ts' : 'js'),\n defaultAll: true,\n typescript: this.typescript,\n };\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 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: '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);\n this.packageJson.merge({\n name: this.name,\n version: '0.0.1',\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 private: true\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 build(options?: TemplateBuilder.BuildOptions): Promise<this> {\n await this.packageJson?.write(this.packageJsonPath, true);\n\n if (options?.skipInstall) await CLI.createSpinnerPromise({\n promise: installDependencies({\n cwd: this.directory,\n packageManager: this.packageManager,\n silent: true\n }),\n indicator: 'timer',\n errorMessage: `${colors.bold(colors.red('✗'))} Failed to install dependencies`,\n successMessage: `${colors.bold(colors.green('✔'))} Dependencies installed successfully`,\n message: `${colors.bold(colors.dim('$'))} Installing dependencies`\n })[0];\n\n if (!options?.skipBuild) await CLI.createSpinnerPromise({\n promise: runScript('build', {\n cwd: this.directory,\n packageManager: this.packageManager,\n silent: true\n }),\n indicator: 'timer',\n errorMessage: `${colors.bold(colors.red('✗'))} Failed to build project`,\n successMessage: `${colors.bold(colors.green('✔'))} Project built successfully`,\n message: `${colors.bold(colors.dim('$'))} Building project`\n })[0];\n\n outro(`Project created in ${colors.cyan(this.relativeDirectory)}`);\n\n console.log(`\\n${colors.bold(colors.green('✔'))} Start developing:`);\n\n if (this.relativeDirectory !== './') {\n console.log(` • ${colors.cyan(colors.bold(`cd ${this.relativeDirectory}`))}`);\n }\n\n console.log(` • ${colors.cyan(colors.bold(installDependenciesCommand(this.packageManager ?? 'npm')))} ${colors.dim('(Install dependencies)')}`);\n console.log(` • ${colors.cyan(colors.bold(runScriptCommand(this.packageManager ?? 'npm', 'build')))} ${colors.dim('(Build)')}`);\n console.log(` • ${colors.cyan(colors.bold(runScriptCommand(this.packageManager ?? 'npm', 'dev')))} ${colors.dim('(Development)')}`);\n console.log(` • ${colors.cyan(colors.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 }\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 CreateEnvFileOptions {\n envFile?: string;\n tokenKey?: string;\n env?: Record<string, string>;\n }\n\n export interface BuildOptions {\n skipInstall?: boolean;\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":["dir","moduleOptions: ModuleTemplateBuilder.Options","packageManager: PackageManagerName|symbol","parseDotenv","dependencies: Record<'ts'|'js'|'both', Partial<Record<'dependencies'|'devDependencies', Record<string, string>>>>","data: CopyMetadata","data"],"sources":["../../../src/classes/templates/TemplateBuilder.ts"],"sourcesContent":["import { colors, 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';\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(colors.black(colors.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 createConfig(options?: TemplateBuilder.CreateConfigOptions): Promise<this> {\n let filepath = options?.filepath;\n\n if (!filepath) {\n filepath = await ConfigReader.findConfig(\n this.directory,\n this.typescript\n ? 'ts'\n : this.typescript === false\n ? 'js'\n : undefined\n )\n ?? path.join(\n this.directory,\n ConfigReader.createConfigFilename(this.typescript ? 'ts' : 'js')\n );\n }\n\n const exists = await ConfigReader.hasFile(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 filepath,\n type: this.typescript ? 'ts' : 'js',\n overwrite: true\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 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: true\n }),\n indicator: 'timer',\n errorMessage: `${colors.bold(colors.red('✗'))} Failed to install dependencies`,\n successMessage: `${colors.bold(colors.green('✔'))} Dependencies installed successfully`,\n message: `${colors.bold(colors.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 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);\n this.packageJson.merge({\n name: this.name,\n version: '0.0.1',\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 private: true\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 build(options?: TemplateBuilder.BuildOptions): Promise<this> {\n await this.packageJson?.write(this.packageJsonPath, true);\n\n if (!options?.skipBuild) await CLI.createSpinnerPromise({\n promise: runScript('build', {\n cwd: this.directory,\n packageManager: this.packageManager,\n silent: true\n }),\n indicator: 'timer',\n errorMessage: `${colors.bold(colors.red('✗'))} Failed to build project`,\n successMessage: `${colors.bold(colors.green('✔'))} Project built successfully`,\n message: `${colors.bold(colors.dim('$'))} Building project`\n })[0];\n\n outro(`Project created in ${colors.cyan(this.relativeDirectory)}`);\n\n console.log(`\\n${colors.bold(colors.green('✔'))} Start developing:`);\n\n if (this.relativeDirectory !== './') {\n console.log(` • ${colors.cyan(colors.bold(`cd ${this.relativeDirectory}`))}`);\n }\n\n console.log(` • ${colors.cyan(colors.bold(installDependenciesCommand(this.packageManager ?? 'npm')))} ${colors.dim('(Install dependencies)')}`);\n console.log(` • ${colors.cyan(colors.bold(runScriptCommand(this.packageManager ?? 'npm', 'build')))} ${colors.dim('(Build)')}`);\n console.log(` • ${colors.cyan(colors.bold(runScriptCommand(this.packageManager ?? 'npm', 'dev')))} ${colors.dim('(Development)')}`);\n console.log(` • ${colors.cyan(colors.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 }\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":";;;;;;;;;;;;;;;;AAeA,IAAa,kBAAb,MAAa,gBAAgB;CACzB,AAAQ;CAER,AAAO;CACP,AAAO;CACP,AAAO;CACP,AAAO;CAEP,AAAO;CACP,AAAO;CAEP,AAAO;CACP,AAAO,wBAAiC;CAExC,IAAI,YAAY;AACZ,SAAO,KAAK,cAAc,QAAQ,KAAK;;CAG3C,IAAI,oBAAoB;AACpB,SAAO,KAAK,SAAS,QAAQ,KAAK,EAAE,KAAK,UAAU,IAAI;;CAG3D,IAAI,kBAAkB;AAClB,SAAO,KAAK,KAAK,KAAK,WAAW,eAAe;;CAGpD,IAAI,OAAO;AACP,SAAO,KAAK,KAAK,SAAS,KAAK,UAAU,CAAC;;CAG9C,YAAY,SAAkC;AAC1C,OAAK,MAAM,QAAQ;AACnB,OAAK,aAAa,QAAQ;AAC1B,OAAK,aAAa,QAAQ;AAC1B,OAAK,aAAa,QAAQ,cAAc;AACxC,OAAK,iBAAiB,QAAQ;AAC9B,OAAK,QAAQ,QAAQ;;CAGzB,MAAa,OAAsB;AAC/B,QAAM,OAAO,KAAK,OAAO,MAAM,OAAO,OAAO,IAAI,KAAK,IAAI,QAAQ,MAAM,CAAC,aAAa,KAAK,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC;AAC3G,SAAO;;CAGX,MAAa,gBAAgB,SAAiE;AAC1F,OAAK,aAAa,SAAS,aAAa,KAAK;AAE7C,MAAI,CAAC,KAAK,YAAY;GAClB,MAAM,MAAM,KAAK,aACX,QAAQ,KAAK,GACb,MAAM,KAAK;IACT,SAAS;IACT,aAAa;IACb,cAAc,QAAQ,KAAK;IAC3B,WAAU,UAAS;KACf,MAAMA,QAAM,KAAK,QAAQ,MAAM;AAC/B,SAAI,WAAWA,MAAI,IAAI,CAAC,SAASA,MAAI,CAAC,aAAa,CAAE,QAAO;;IAEnE,CAAC;AAEN,OAAI,SAAS,IAAI,CAAE,OAAM,IAAI,WAAW,sBAAsB;AAC9D,QAAK,aAAa;;AAGtB,OAAK,aAAa,KAAK,QAAQ,KAAK,WAAW;AAI/C,MAFc,MAAM,KAAK,KAAK,UAAU,CAAC,YAAY,OAAU,EAEpD;GACP,IAAI,QAAQ,MAAM,QAAQ,KAAK,UAAU;AACrC,WAAQ,WAAW,IAAI,OAAO,SAAS,gBAAgB,gBAAgB,uBAAuB,EAAE,KAAK,MAAM,CAAC;AAEhH,OAAI,MAAM,OACN,SAAQ,SAAS,YAAjB;IACI,KAAK,QACD,OAAM,IAAI,WAAW,aAAa,OAAO,KAAK,KAAK,kBAAkB,CAAC,eAAe;IACzF,KAAK,SACD,QAAO;IACX;KACI,MAAM,YAAY,KAAK,aACjB,QACA,MAAM,QAAQ;MACZ,SAAS,aAAa,OAAO,KAAK,KAAK,kBAAkB,CAAC;MAC1D,QAAQ;MACR,UAAU;MACV,cAAc;MACjB,CAAC;AAEN,SAAI,CAAC,UAAW,OAAM,IAAI,WAAW,aAAa,OAAO,KAAK,KAAK,kBAAkB,CAAC,eAAe;AACrG,SAAI,SAAS,UAAU,CAAE,OAAM,IAAI,WAAW,sBAAsB;AACpE;;;AAKhB,QAAM,MAAM,KAAK,WAAW,EAAE,WAAW,MAAM,CAAC;AAChD,SAAO;;CAGX,MAAa,cAAc,SAA+D;AACtF,OAAK,aAAa,SAAS,cAAc,KAAK;AAE9C,MAAI,CAAC,KAAK,YAAY;GAClB,MAAM,eAAe,KAAK,aACpB,QACA,MAAM,QAAQ;IACZ,SAAS;IACT,QAAQ;IACR,UAAU;IACV,cAAc;IACjB,CAAC;AAEN,OAAI,SAAS,aAAa,CAAE,OAAM,IAAI,WAAW,sBAAsB;AACvE,QAAK,aAAa;;AAGtB,SAAO;;CAGX,MAAa,aAAa,SAA8D;EACpF,IAAI,WAAW,SAAS;AAExB,MAAI,CAAC,SACD,YAAW,MAAM,aAAa,WACtB,KAAK,WACL,KAAK,aACC,OACA,KAAK,eAAe,QAChB,OACA,OACb,IACE,KAAK,KACJ,KAAK,WACL,aAAa,qBAAqB,KAAK,aAAa,OAAO,KAAK,CACnE;AAKT,MAFe,MAAM,aAAa,QAAQ,SAAS,EAEvC;GACR,MAAM,YAAY,KAAK,aACjB,QACA,MAAM,QAAQ;IACZ,SAAS,iCAAiC,OAAO,MAAM,KAAK,SAAS,QAAQ,KAAK,EAAE,SAAS,CAAC,CAAC;IAC/F,QAAQ;IACR,UAAU;IACV,cAAc;IACjB,CAAC;AAEN,OAAI,CAAC,UAAW,QAAO;AACvB,OAAI,SAAS,UAAU,CAAE,OAAM,IAAI,WAAW,sBAAsB;;AAGxE,OAAK,SAAS,MAAM,aAAa,OAAO;GACpC,GAAG;GACH;GACA,MAAM,KAAK,aAAa,OAAO;GAC/B,WAAW;GACd,CAAC;AAEF,SAAO;;CAGX,MAAa,eAAe,SAA+D;EACvF,MAAM,SAAS,KAAK,KAAK,IAAI,MAAM,uBAAuB,KAAK,aAAa,eAAe,aAAa;EACxG,MAAM,UAAU,KAAK,KAAK,IAAI,MAAM,mBAAmB;EAEvD,SAAS,OAAO,MAAoC;AAChD,WAAQ,KAAK,UAAb;IACI,KAAK,YACD,QAAO;IACX,QACI,QAAO,SAAS,SAAS,KAAK,IAAI,KAAK;;;EAInD,SAAS,UAAU,MAAoC;AACnD,WAAQ,KAAK,UAAb;IACI,KAAK,YACD,QAAO;IACX,KAAK;IACL,KAAK,gBACD,QAAO;IACX,QACI,SAAQ,OAAO,SAAS,cAAc,YAAY,QAAQ,YAAY,SAAS,YAAY,KAAK,KAAK;;;EAIjH,MAAM,CAAC,UAAU,UAAU,IAAI,qBAAqB;GAChD,SAAS,QAAQ,IAAI,CACjB,gBAAgB,KAAK,QAAQ,KAAK,WAAW;IAAE,GAAG;IAAS;IAAQ;IAAW,CAAC,EAC/E,gBAAgB,KAAK,SAAS,KAAK,WAAW;IAAE,GAAG;IAAS;IAAQ;IAAW,CAAC,CACnF,CAAC;GACF,SAAS;GACT,gBAAgB;GAChB,cAAc;GACjB,CAAC;AAEF,QAAM;AACN,SAAO;;CAGX,MAAa,oBAAoB,SAAqE;AAClG,MAAI,SAAS,UAAU,OAAO;AAC1B,OAAI,SAAS,UAAU,QAAW;IAC9B,MAAM,UAAU,KAAK,aACf,OACA,MAAM,QAAQ;KACZ,SAAS;KACT,QAAQ;KACR,UAAU;KACV,cAAc;KACjB,CAAC;AAEN,QAAI,SAAS,QAAQ,CAAE,OAAM,IAAI,WAAW,sBAAsB;AAClE,QAAI,CAAC,QAAS,QAAO;;AAGzB,SAAM,IAAI,qBAAqB;IAC3B,SAAS,oBAAoB;KACzB,KAAK,KAAK;KACV,gBAAgB,KAAK;KACrB,QAAQ;KACX,CAAC;IACF,WAAW;IACX,cAAc,GAAG,OAAO,KAAK,OAAO,IAAI,IAAI,CAAC,CAAC;IAC9C,gBAAgB,GAAG,OAAO,KAAK,OAAO,MAAM,IAAI,CAAC,CAAC;IAClD,SAAS,GAAG,OAAO,KAAK,OAAO,IAAI,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC;AAEH,QAAK,wBAAwB;;AAGjC,SAAO;;CAGX,MAAa,gBAA+B;EACxC,MAAM,mBAAmB,KAAK,KAAK,KAAK,WAAW,MAAM;EACzD,MAAM,kBAAkB,MAAM,sBAAsB,uBAAuB,KAAK,aAAa,OAAO,KAAK;AAEzG,QAAM,MAAM,kBAAkB,EAAE,WAAW,MAAM,CAAC;AAElD,MAAI,CAAC,KAAK,uBAAuB;AAC7B,OAAI,KAAK,wDAAwD;AACjE,UAAO;;EAGX,MAAMC,gBAA+C;GACjD,KAAK,KAAK;GACV,QAAQ,MAAM,KAAK,QAAQ,MAAM;GACjC,YAAY;GACZ,YAAY,KAAK;GACpB;EAED,MAAM,CAAC,UAAU,UAAU,IAAI,qBAAqB;GAChD,SAAS,QAAQ,IAAI,CACjB,IAAI,sBAAsB;IAClB,GAAG;IACH,WAAW,KAAK,KAAK,kBAAkB,WAAW;IAClD,UAAU,gBAAgB,KAAK,aAAa,OAAO;IACnD,UAAU,gBAAgB,MAAK,MAAK,EAAE,SAAS,eAAe;IACjE,CAAC,CACD,mBAAmB,CACnB,MAAK,MAAK,EAAE,MAAM,EAAE,QAAQ,MAAM,CAAC,CAAC,EACzC,IAAI,sBAAsB;IAClB,GAAG;IACH,WAAW,KAAK,KAAK,kBAAkB,SAAS;IAChD,UAAU,eAAe,KAAK,aAAa,OAAO;IAClD,UAAU,gBAAgB,MAAK,MAAK,EAAE,SAAS,cAAc;IAChE,CAAC,CACD,mBAAmB,CACnB,MAAK,MAAK,EAAE,MAAM,EAAE,QAAQ,MAAM,CAAC,CAAC,CAC5C,CAAC;GACF,SAAS;GACT,gBAAgB;GAChB,cAAc;GACjB,CAAC;AAEF,QAAM;AACN,SAAO;;CAGX,MAAa,kBAAkB,SAAoD;AAC/E,OAAK,iBAAiB,SAAS,kBAAkB,KAAK;AAEtD,MAAI,CAAC,KAAK,gBAAgB;GACtB,MAAM,wBAAwB,MAAM,qBAAqB,KAAK,UAAU,CAAC,MAAK,OAAM,IAAI,QAAQ,MAAM;GACtG,MAAMC,iBAA4C,KAAK,aACjD,wBACA,MAAM,OAAO;IACX,SAAS;IACT,SAAS,CACL;KAAE,OAAO;KAAuB,OAAO;KAAuB,EAC9D,GAAG;KACC;MAAE,OAAO;MAAO,OAAO;MAAO;KAC9B;MAAE,OAAO;MAAQ,OAAO;MAAQ;KAChC;MAAE,OAAO;MAAQ,OAAO;MAAQ;KAChC;MAAE,OAAO;MAAO,OAAO;MAAO;KAC9B;MAAE,OAAO;MAAQ,OAAO;MAAQ;KACnC,CAAC,QAAO,MAAK,EAAE,UAAU,sBAAsB,CACnD;IACD,cAAc;IACjB,CAAC;AAEN,OAAI,SAAS,eAAe,CAAE,OAAM,IAAI,WAAW,sBAAsB;AACzE,QAAK,iBAAiB;;AAG1B,OAAK,cAAc,MAAM,mBAAmB,KAAK,KAAK,gBAAgB;AACtE,OAAK,YAAY,MAAM;GACnB,MAAM,KAAK;GACX,SAAS;GACT,MAAM;GACN,SAAS;IACL,OAAO;IACP,OAAO;IACP,KAAK;IACR;GACD,GAAG,gBAAgB,uBAAuB,KAAK,aAAa,OAAO,KAAK;GACxE,SAAS;GACZ,CAAC;AAEF,SAAO;;CAGX,MAAa,cAAc,SAA+D;EACtF,MAAM,WAAW,SAAS,YAAY;EACtC,MAAM,UAAU,SAAS,UAAU,KAAK,QAAQ,QAAQ,QAAQ,GAAG,KAAK,KAAK,KAAK,WAAW,OAAO;EACpG,MAAM,QAAQ,MAAM,KAAK,QAAQ,CAAC,YAAY,OAAU;EAExD,IAAI,MAAM,SAAS,OAAO,EAAE;AACxB,QAAM,QACAC,MAAY,MAAM,SAAS,SAAS,QAAQ,EAAE,EAC5C,YAAY,KACf,CAAC,GACA;AAEV,MAAI,IAAI,WAAW;GACf,MAAM,OAAO,KAAK,cAAc,MAAM,QAAQ;IAC1C,SAAS;IACT,cAAc;IACd,QAAQ;IACR,UAAU;IACb,CAAC;AAEF,OAAI,SAAS,KAAK,CAAE,OAAM,IAAI,WAAW,sBAAsB;AAC/D,OAAI,KAAM,QAAO;;EAGrB,MAAM,QAAQ,MAAM,KAAK;GACrB,SAAS;GACT,aAAa;GACb,cAAc,IAAI;GACrB,CAAC;AAEF,MAAI,SAAS,MAAM,CAAE,OAAM,IAAI,WAAW,sBAAsB;AAChE,MAAI,YAAY;AAEhB,QAAM,UAAU,SAAS,KAAK,SAAS,IAAI,MAAM,MAAM;GACnD,UAAU;GACV,MAAM;GACT,CAAC;AAEF,SAAO;;CAGX,MAAa,MAAM,SAAuD;AACtE,QAAM,KAAK,aAAa,MAAM,KAAK,iBAAiB,KAAK;AAEzD,MAAI,CAAC,SAAS,UAAW,OAAM,IAAI,qBAAqB;GACpD,SAAS,UAAU,SAAS;IACxB,KAAK,KAAK;IACV,gBAAgB,KAAK;IACrB,QAAQ;IACX,CAAC;GACF,WAAW;GACX,cAAc,GAAG,OAAO,KAAK,OAAO,IAAI,IAAI,CAAC,CAAC;GAC9C,gBAAgB,GAAG,OAAO,KAAK,OAAO,MAAM,IAAI,CAAC,CAAC;GAClD,SAAS,GAAG,OAAO,KAAK,OAAO,IAAI,IAAI,CAAC,CAAC;GAC5C,CAAC,CAAC;AAEH,QAAM,sBAAsB,OAAO,KAAK,KAAK,kBAAkB,GAAG;AAElE,UAAQ,IAAI,KAAK,OAAO,KAAK,OAAO,MAAM,IAAI,CAAC,CAAC,oBAAoB;AAEpE,MAAI,KAAK,sBAAsB,KAC3B,SAAQ,IAAI,OAAO,OAAO,KAAK,OAAO,KAAK,MAAM,KAAK,oBAAoB,CAAC,GAAG;AAGlF,UAAQ,IAAI,OAAO,OAAO,KAAK,OAAO,KAAK,2BAA2B,KAAK,kBAAkB,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,yBAAyB,GAAG;AAChJ,UAAQ,IAAI,OAAO,OAAO,KAAK,OAAO,KAAK,iBAAiB,KAAK,kBAAkB,OAAO,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,UAAU,GAAG;AAChI,UAAQ,IAAI,OAAO,OAAO,KAAK,OAAO,KAAK,iBAAiB,KAAK,kBAAkB,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,gBAAgB,GAAG;AACpI,UAAQ,IAAI,OAAO,OAAO,KAAK,OAAO,KAAK,iBAAiB,KAAK,kBAAkB,OAAO,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,eAAe,GAAG;AAGrI,SAAO;;;;0CAc0B,CAAC,MAAM,UAAU;CAE/C,MAAMC,+CAAoH;EAC7H,MAAM;GACF,cAAc;IACV,iBAAiB,YAAY,eAAe;IAC5C,gBAAgB,YAAY,eAAe;IAC3C,WAAW,IAAI,YAAY;IAC9B;GACD,iBAAiB;IACb,eAAe,YAAY,kBAAkB;IAC7C,SAAS,YAAY,iBAAiB;IACzC;GACJ;EACD,IAAI,EAAE;EACN,IAAI,EAAE;EACT;CAEM,SAAS,uBAAuB,MAA4F;EAC/H,MAAM,SAAS,SAAS,OAClB,aAAa,KACb,SAAS,OACL,aAAa,KACb,EAAE;AAEZ,SAAO,eAAe;GAAE,GAAG,OAAO;GAAc,GAAG,aAAa,KAAK;GAAc;AACnF,SAAO,kBAAkB;GAAE,GAAG,OAAO;GAAiB,GAAG,aAAa,KAAK;GAAiB;AAE5F,SAAO;;;CA+CJ,eAAe,KAAK,MAAc,IAAY,SAAsC;EACvF,MAAM,YAAY,MAAM,KAAK,KAAK,CAAC,YAAY,OAAU;AACzD,MAAI,CAAC,UAAW;AAEhB,MAAI,UAAU,aAAa,EAAE;GACzB,MAAM,QAAQ,MAAM,QAAQ,KAAK;AAEjC,QAAK,MAAM,QAAQ,OAAO;IACtB,MAAMC,SAAqB;KACvB,UAAU;KACV,KAAK,KAAK,KAAK,MAAM,KAAK;KAC1B,MAAM;KACT;AAED,UAAM,KACFC,OAAK,KACL,KAAK,KAAK,IACN,SAAS,SACH,QAAQ,OAAOA,OAAK,GACpB,KACT,EACD,QACH;;AAEL;;EAGJ,MAAMD,OAAqB;GACvB,UAAU,KAAK,SAAS,KAAK;GAC7B,KAAK;GACL,MAAM;GACT;AAED,MAAI,SAAS,UAAU,CAAC,QAAQ,OAAO,KAAK,CAAE;EAE9C,MAAM,UAAU,MAAM,KAAK,GAAG,CAAC,YAAY,OAAU;EACrD,MAAM,YAAY,OAAO,SAAS,cAAc,aAC1C,QAAQ,UAAU,KAAK,GACvB,SAAS,aAAa;AAE5B,MAAI,WAAW,UAAW;AAE1B,QAAM,MAAM,KAAK,QAAQ,GAAG,EAAE,EAAE,WAAW,MAAM,CAAC;AAClD,QAAM,SAAS,MAAM,GAAG"}
@@ -1,36 +1,36 @@
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 _sapphire_shapeshift25 from "@sapphire/shapeshift";
4
+ import * as _sapphire_shapeshift40 from "@sapphire/shapeshift";
5
5
 
6
6
  //#region src/classes/validation/BaseModuleValidator.d.ts
7
7
  declare class BaseModuleValidator extends Validator {
8
- static id: _sapphire_shapeshift25.StringValidator<string>;
9
- static moduleType: _sapphire_shapeshift25.NativeEnumValidator<typeof ModuleType>;
10
- static onEnable: _sapphire_shapeshift25.UnionValidator<Function | undefined>;
11
- static onReady: _sapphire_shapeshift25.UnionValidator<Function | undefined>;
12
- static onDisable: _sapphire_shapeshift25.UnionValidator<Function | undefined>;
13
- static object: _sapphire_shapeshift25.ObjectValidator<{
8
+ static id: _sapphire_shapeshift40.StringValidator<string>;
9
+ static moduleType: _sapphire_shapeshift40.NativeEnumValidator<typeof ModuleType>;
10
+ static onEnable: _sapphire_shapeshift40.UnionValidator<Function | undefined>;
11
+ static onReady: _sapphire_shapeshift40.UnionValidator<Function | undefined>;
12
+ static onDisable: _sapphire_shapeshift40.UnionValidator<Function | undefined>;
13
+ static object: _sapphire_shapeshift40.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
- }, _sapphire_shapeshift25.UndefinedToOptional<{
19
+ }, _sapphire_shapeshift40.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: _sapphire_shapeshift25.UnionValidator<_sapphire_shapeshift25.UndefinedToOptional<{
26
+ static resolvable: _sapphire_shapeshift40.UnionValidator<_sapphire_shapeshift40.UndefinedToOptional<{
27
+ toJSON: Function;
28
+ }> | _sapphire_shapeshift40.UndefinedToOptional<{
27
29
  id: string | undefined;
28
30
  moduleType: ModuleType | undefined;
29
31
  onEnable: Function | undefined;
30
32
  onReady: Function | undefined;
31
33
  onDisable: Function | undefined;
32
- }> | _sapphire_shapeshift25.UndefinedToOptional<{
33
- toJSON: Function;
34
34
  }>>;
35
35
  static isValidId(id: unknown): asserts id is string;
36
36
  static isValidModuleType(moduleType: unknown): asserts moduleType is ModuleType;
@@ -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 _sapphire_shapeshift0 from "@sapphire/shapeshift";
6
+ import * as _sapphire_shapeshift7 from "@sapphire/shapeshift";
7
7
 
8
8
  //#region src/classes/validation/CommandModuleValidator.d.ts
9
9
  declare class CommandModuleValidator extends Validator {
10
- static object: _sapphire_shapeshift0.ObjectValidator<{
10
+ static object: _sapphire_shapeshift7.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: _sapphire_shapeshift0.UndefinedToOptional<{
19
+ data: _sapphire_shapeshift7.UndefinedToOptional<{
20
20
  name: any;
21
21
  description: any;
22
22
  aliases: any;
23
23
  options: any;
24
24
  flags: any;
25
- }> | _sapphire_shapeshift0.UndefinedToOptional<{
25
+ }> | _sapphire_shapeshift7.UndefinedToOptional<{
26
26
  type: any;
27
27
  name: any;
28
28
  }>;
29
29
  cooldown: number | undefined;
30
- preconditions: _sapphire_shapeshift0.UndefinedToOptional<{
30
+ preconditions: _sapphire_shapeshift7.UndefinedToOptional<{
31
31
  id: any;
32
32
  scope: any;
33
33
  execute: any;
34
34
  }>[] | undefined;
35
- postconditions: _sapphire_shapeshift0.UndefinedToOptional<{
35
+ postconditions: _sapphire_shapeshift7.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
- }, _sapphire_shapeshift0.UndefinedToOptional<{
43
+ }, _sapphire_shapeshift7.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: _sapphire_shapeshift0.UndefinedToOptional<{
52
+ data: _sapphire_shapeshift7.UndefinedToOptional<{
53
53
  name: any;
54
54
  description: any;
55
55
  aliases: any;
56
56
  options: any;
57
57
  flags: any;
58
- }> | _sapphire_shapeshift0.UndefinedToOptional<{
58
+ }> | _sapphire_shapeshift7.UndefinedToOptional<{
59
59
  type: any;
60
60
  name: any;
61
61
  }>;
62
62
  cooldown: number | undefined;
63
- preconditions: _sapphire_shapeshift0.UndefinedToOptional<{
63
+ preconditions: _sapphire_shapeshift7.UndefinedToOptional<{
64
64
  id: any;
65
65
  scope: any;
66
66
  execute: any;
67
67
  }>[] | undefined;
68
- postconditions: _sapphire_shapeshift0.UndefinedToOptional<{
68
+ postconditions: _sapphire_shapeshift7.UndefinedToOptional<{
69
69
  id: any;
70
70
  scope: any;
71
71
  execute: any;
@@ -74,7 +74,9 @@ declare class CommandModuleValidator extends Validator {
74
74
  disabledPostconditions: string[] | undefined;
75
75
  execute: Function;
76
76
  }>>;
77
- static resolvable: _sapphire_shapeshift0.UnionValidator<_sapphire_shapeshift0.UndefinedToOptional<{
77
+ static resolvable: _sapphire_shapeshift7.UnionValidator<_sapphire_shapeshift7.UndefinedToOptional<{
78
+ toJSON: Function;
79
+ }> | _sapphire_shapeshift7.UndefinedToOptional<{
78
80
  id: string | undefined;
79
81
  moduleType: ModuleType | undefined;
80
82
  onEnable: Function | undefined;
@@ -83,23 +85,23 @@ declare class CommandModuleValidator extends Validator {
83
85
  } & {
84
86
  id: string;
85
87
  type: _reciple_core0.CommandType;
86
- data: _sapphire_shapeshift0.UndefinedToOptional<{
88
+ data: _sapphire_shapeshift7.UndefinedToOptional<{
87
89
  name: any;
88
90
  description: any;
89
91
  aliases: any;
90
92
  options: any;
91
93
  flags: any;
92
- }> | _sapphire_shapeshift0.UndefinedToOptional<{
94
+ }> | _sapphire_shapeshift7.UndefinedToOptional<{
93
95
  type: any;
94
96
  name: any;
95
97
  }>;
96
98
  cooldown: number | undefined;
97
- preconditions: _sapphire_shapeshift0.UndefinedToOptional<{
99
+ preconditions: _sapphire_shapeshift7.UndefinedToOptional<{
98
100
  id: any;
99
101
  scope: any;
100
102
  execute: any;
101
103
  }>[] | undefined;
102
- postconditions: _sapphire_shapeshift0.UndefinedToOptional<{
104
+ postconditions: _sapphire_shapeshift7.UndefinedToOptional<{
103
105
  id: any;
104
106
  scope: any;
105
107
  execute: any;
@@ -107,8 +109,6 @@ declare class CommandModuleValidator extends Validator {
107
109
  disabledPreconditions: string[] | undefined;
108
110
  disabledPostconditions: string[] | undefined;
109
111
  execute: Function;
110
- }> | _sapphire_shapeshift0.UndefinedToOptional<{
111
- toJSON: Function;
112
112
  }>>;
113
113
  static isValid(value: unknown): asserts value is AnyCommandModuleData;
114
114
  }
@@ -3,15 +3,15 @@ import { EventModule } from "../modules/events/EventModule.mjs";
3
3
  import "../../index.mjs";
4
4
  import { Validator } from "@reciple/core";
5
5
  import { EventEmitter } from "node:events";
6
- import * as _sapphire_shapeshift16 from "@sapphire/shapeshift";
6
+ import * as _sapphire_shapeshift31 from "@sapphire/shapeshift";
7
7
 
8
8
  //#region src/classes/validation/EventModuleValidator.d.ts
9
9
  declare class EventModuleValidator extends Validator {
10
- static emitter: _sapphire_shapeshift16.InstanceValidator<EventEmitter<[never] | Record<string | number | symbol, any[]>>>;
11
- static event: _sapphire_shapeshift16.StringValidator<string>;
12
- static once: _sapphire_shapeshift16.UnionValidator<boolean | undefined>;
13
- static onEvent: _sapphire_shapeshift16.InstanceValidator<Function>;
14
- static object: _sapphire_shapeshift16.ObjectValidator<{
10
+ static emitter: _sapphire_shapeshift31.InstanceValidator<EventEmitter<[never] | Record<string | number | symbol, any[]>>>;
11
+ static event: _sapphire_shapeshift31.StringValidator<string>;
12
+ static once: _sapphire_shapeshift31.UnionValidator<boolean | undefined>;
13
+ static onEvent: _sapphire_shapeshift31.InstanceValidator<Function>;
14
+ static object: _sapphire_shapeshift31.ObjectValidator<{
15
15
  id: string | undefined;
16
16
  moduleType: ModuleType | undefined;
17
17
  onEnable: Function | undefined;
@@ -22,7 +22,7 @@ declare class EventModuleValidator extends Validator {
22
22
  event: string;
23
23
  once: boolean | undefined;
24
24
  onEvent: Function;
25
- }, _sapphire_shapeshift16.UndefinedToOptional<{
25
+ }, _sapphire_shapeshift31.UndefinedToOptional<{
26
26
  id: string | undefined;
27
27
  moduleType: ModuleType | undefined;
28
28
  onEnable: Function | undefined;
@@ -34,9 +34,9 @@ declare class EventModuleValidator extends Validator {
34
34
  once: boolean | undefined;
35
35
  onEvent: Function;
36
36
  }>>;
37
- static resolvable: _sapphire_shapeshift16.UnionValidator<_sapphire_shapeshift16.UndefinedToOptional<{
37
+ static resolvable: _sapphire_shapeshift31.UnionValidator<_sapphire_shapeshift31.UndefinedToOptional<{
38
38
  toJSON: Function;
39
- }> | _sapphire_shapeshift16.UndefinedToOptional<{
39
+ }> | _sapphire_shapeshift31.UndefinedToOptional<{
40
40
  id: string | undefined;
41
41
  moduleType: ModuleType | undefined;
42
42
  onEnable: Function | undefined;
@@ -1,24 +1,24 @@
1
1
  import { PostconditionModule } from "../modules/PostconditionModule.mjs";
2
2
  import { CommandPostconditionReason, CommandType, Validator } from "@reciple/core";
3
- import * as _sapphire_shapeshift35 from "@sapphire/shapeshift";
3
+ import * as _sapphire_shapeshift0 from "@sapphire/shapeshift";
4
4
 
5
5
  //#region src/classes/validation/PostconditionModule.d.ts
6
6
  declare class PostconditionModuleValidator extends Validator {
7
- static scope: _sapphire_shapeshift35.UnionValidator<CommandType[] | undefined>;
8
- static accepts: _sapphire_shapeshift35.UnionValidator<CommandPostconditionReason[] | undefined>;
9
- static execute: _sapphire_shapeshift35.InstanceValidator<Function>;
10
- static object: _sapphire_shapeshift35.ObjectValidator<{
7
+ static scope: _sapphire_shapeshift0.UnionValidator<CommandType[] | undefined>;
8
+ static accepts: _sapphire_shapeshift0.UnionValidator<CommandPostconditionReason[] | undefined>;
9
+ static execute: _sapphire_shapeshift0.InstanceValidator<Function>;
10
+ static object: _sapphire_shapeshift0.ObjectValidator<{
11
11
  scope: CommandType[] | undefined;
12
12
  execute: Function;
13
- }, _sapphire_shapeshift35.UndefinedToOptional<{
13
+ }, _sapphire_shapeshift0.UndefinedToOptional<{
14
14
  scope: CommandType[] | undefined;
15
15
  execute: Function;
16
16
  }>>;
17
- static resolvable: _sapphire_shapeshift35.UnionValidator<_sapphire_shapeshift35.UndefinedToOptional<{
18
- toJSON: Function;
19
- }> | _sapphire_shapeshift35.UndefinedToOptional<{
17
+ static resolvable: _sapphire_shapeshift0.UnionValidator<_sapphire_shapeshift0.UndefinedToOptional<{
20
18
  scope: CommandType[] | undefined;
21
19
  execute: Function;
20
+ }> | _sapphire_shapeshift0.UndefinedToOptional<{
21
+ toJSON: Function;
22
22
  }>>;
23
23
  static isValidScope(scope: unknown): asserts scope is CommandType[];
24
24
  static isValidAccepts(accepts: unknown): asserts accepts is CommandPostconditionReason[];
@@ -1,21 +1,21 @@
1
1
  import { PreconditionModule } from "../modules/PreconditionModule.mjs";
2
2
  import { CommandType, Validator } from "@reciple/core";
3
- import * as _sapphire_shapeshift43 from "@sapphire/shapeshift";
3
+ import * as _sapphire_shapeshift24 from "@sapphire/shapeshift";
4
4
 
5
5
  //#region src/classes/validation/PreconditionModule.d.ts
6
6
  declare class PreconditionModuleValidator extends Validator {
7
- static scope: _sapphire_shapeshift43.UnionValidator<CommandType[] | undefined>;
8
- static execute: _sapphire_shapeshift43.InstanceValidator<Function>;
9
- static object: _sapphire_shapeshift43.ObjectValidator<{
7
+ static scope: _sapphire_shapeshift24.UnionValidator<CommandType[] | undefined>;
8
+ static execute: _sapphire_shapeshift24.InstanceValidator<Function>;
9
+ static object: _sapphire_shapeshift24.ObjectValidator<{
10
10
  scope: CommandType[] | undefined;
11
11
  execute: Function;
12
- }, _sapphire_shapeshift43.UndefinedToOptional<{
12
+ }, _sapphire_shapeshift24.UndefinedToOptional<{
13
13
  scope: CommandType[] | undefined;
14
14
  execute: Function;
15
15
  }>>;
16
- static resolvable: _sapphire_shapeshift43.UnionValidator<_sapphire_shapeshift43.UndefinedToOptional<{
16
+ static resolvable: _sapphire_shapeshift24.UnionValidator<_sapphire_shapeshift24.UndefinedToOptional<{
17
17
  toJSON: Function;
18
- }> | _sapphire_shapeshift43.UndefinedToOptional<{
18
+ }> | _sapphire_shapeshift24.UndefinedToOptional<{
19
19
  scope: CommandType[] | undefined;
20
20
  execute: Function;
21
21
  }>>;
package/dist/package.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  //#region package.json
2
2
  var package_default = {
3
3
  name: "reciple",
4
- version: "10.0.1-dev.5",
4
+ version: "10.0.1-dev.6",
5
5
  license: "LGPL-3.0-only",
6
6
  description: "The CLI for reciple",
7
7
  module: "./dist/index.mjs",
@@ -68,7 +68,7 @@ var package_default = {
68
68
  "discord.js": { "optional": false }
69
69
  },
70
70
  publishConfig: { "access": "public" },
71
- gitHead: "73fbf446422a0f7c828322836c9a781d9ba63dce"
71
+ gitHead: "5f648f7f0daf5313e7f65cfd79fbae85ada1644c"
72
72
  };
73
73
 
74
74
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"package.mjs","names":[],"sources":["../package.json"],"sourcesContent":["{\n \"name\": \"reciple\",\n \"version\": \"10.0.1-dev.5\",\n \"license\": \"LGPL-3.0-only\",\n \"description\": \"The CLI for reciple\",\n \"module\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.mts\",\n \"bin\": \"./dist/bin/reciple.mjs\",\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"import\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.mts\"\n },\n \"./jsx-runtime\": {\n \"import\": \"./dist/helpers/jsx-runtime.mjs\",\n \"types\": \"./dist/helpers/jsx-runtime.d.mts\"\n }\n },\n \"files\": [\n \"dist\",\n \"assets\",\n \"README.md\"\n ],\n \"scripts\": {\n \"clean\": \"rimraf ./dist\",\n \"build\": \"tsdown --config-loader unrun\",\n \"check\": \"tsc --noEmit\",\n \"prepack\": \"npm run build\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/thenorthsolution/reciple\",\n \"directory\": \"packages/reciple\"\n },\n \"dependencies\": {\n \"@clack/prompts\": \"^0.11.0\",\n \"@dotenvx/dotenvx\": \"^1.51.1\",\n \"@reciple/utils\": \"^10.0.1-dev.1\",\n \"@sapphire/shapeshift\": \"^4.0.0\",\n \"@sapphire/snowflake\": \"^3.5.5\",\n \"commander\": \"^14.0.2\",\n \"github-slugger\": \"^2.0.0\",\n \"globby\": \"^16.0.0\",\n \"micromatch\": \"^4.0.8\",\n \"pkg-types\": \"^2.3.0\",\n \"prtyprnt\": \"^2.0.2\",\n \"semver\": \"^7.7.3\",\n \"ts-mixer\": \"^6.0.4\",\n \"tsdown\": \"^0.17.0-beta.4\",\n \"unrun\": \"^0.2.15\"\n },\n \"devDependencies\": {\n \"@reciple/jsx\": \"^10.0.1-dev.0\",\n \"@types/micromatch\": \"^4.0.10\",\n \"@types/node\": \"^24.10.1\",\n \"@types/semver\": \"^7.7.1\",\n \"nodemon\": \"^3.1.11\",\n \"rolldown\": \"^1.0.0-beta.52\"\n },\n \"peerDependencies\": {\n \"@reciple/core\": \"^10.0.0 || >=10.0.1-dev.0\",\n \"discord.js\": \"^14.25.1\"\n },\n \"peerDependenciesMeta\": {\n \"@reciple/core\": {\n \"optional\": false\n },\n \"discord.js\": {\n \"optional\": false\n }\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"gitHead\": \"73fbf446422a0f7c828322836c9a781d9ba63dce\"\n}\n"],"mappings":";sBAAA;OACU;UACG;UACA;cACI;SACL;QACD;MACF;OACC;UACG;EACT,KAAK;GACH,UAAU;GACV,SAAS;GACV;EACD,iBAAiB;GACf,UAAU;GACV,SAAS;GACV;EACF;QACQ;EACP;EACA;EACA;EACD;UACU;EACT,SAAS;EACT,SAAS;EACT,SAAS;EACT,WAAW;EACZ;aACa;EACZ,QAAQ;EACR,OAAO;EACP,aAAa;EACd;eACe;EACd,kBAAkB;EAClB,oBAAoB;EACpB,kBAAkB;EAClB,wBAAwB;EACxB,uBAAuB;EACvB,aAAa;EACb,kBAAkB;EAClB,UAAU;EACV,cAAc;EACd,aAAa;EACb,YAAY;EACZ,UAAU;EACV,YAAY;EACZ,UAAU;EACV,SAAS;EACV;kBACkB;EACjB,gBAAgB;EAChB,qBAAqB;EACrB,eAAe;EACf,iBAAiB;EACjB,WAAW;EACX,YAAY;EACb;mBACmB;EAClB,iBAAiB;EACjB,cAAc;EACf;uBACuB;EACtB,iBAAiB,EACf,YAAY,OACb;EACD,cAAc,EACZ,YAAY,OACb;EACF;gBACgB,EACf,UAAU,UACX;UACU;CACZ"}
1
+ {"version":3,"file":"package.mjs","names":[],"sources":["../package.json"],"sourcesContent":["{\n \"name\": \"reciple\",\n \"version\": \"10.0.1-dev.6\",\n \"license\": \"LGPL-3.0-only\",\n \"description\": \"The CLI for reciple\",\n \"module\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.mts\",\n \"bin\": \"./dist/bin/reciple.mjs\",\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"import\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.mts\"\n },\n \"./jsx-runtime\": {\n \"import\": \"./dist/helpers/jsx-runtime.mjs\",\n \"types\": \"./dist/helpers/jsx-runtime.d.mts\"\n }\n },\n \"files\": [\n \"dist\",\n \"assets\",\n \"README.md\"\n ],\n \"scripts\": {\n \"clean\": \"rimraf ./dist\",\n \"build\": \"tsdown --config-loader unrun\",\n \"check\": \"tsc --noEmit\",\n \"prepack\": \"npm run build\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/thenorthsolution/reciple\",\n \"directory\": \"packages/reciple\"\n },\n \"dependencies\": {\n \"@clack/prompts\": \"^0.11.0\",\n \"@dotenvx/dotenvx\": \"^1.51.1\",\n \"@reciple/utils\": \"^10.0.1-dev.1\",\n \"@sapphire/shapeshift\": \"^4.0.0\",\n \"@sapphire/snowflake\": \"^3.5.5\",\n \"commander\": \"^14.0.2\",\n \"github-slugger\": \"^2.0.0\",\n \"globby\": \"^16.0.0\",\n \"micromatch\": \"^4.0.8\",\n \"pkg-types\": \"^2.3.0\",\n \"prtyprnt\": \"^2.0.2\",\n \"semver\": \"^7.7.3\",\n \"ts-mixer\": \"^6.0.4\",\n \"tsdown\": \"^0.17.0-beta.4\",\n \"unrun\": \"^0.2.15\"\n },\n \"devDependencies\": {\n \"@reciple/jsx\": \"^10.0.1-dev.0\",\n \"@types/micromatch\": \"^4.0.10\",\n \"@types/node\": \"^24.10.1\",\n \"@types/semver\": \"^7.7.1\",\n \"nodemon\": \"^3.1.11\",\n \"rolldown\": \"^1.0.0-beta.52\"\n },\n \"peerDependencies\": {\n \"@reciple/core\": \"^10.0.0 || >=10.0.1-dev.0\",\n \"discord.js\": \"^14.25.1\"\n },\n \"peerDependenciesMeta\": {\n \"@reciple/core\": {\n \"optional\": false\n },\n \"discord.js\": {\n \"optional\": false\n }\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"gitHead\": \"5f648f7f0daf5313e7f65cfd79fbae85ada1644c\"\n}\n"],"mappings":";sBAAA;OACU;UACG;UACA;cACI;SACL;QACD;MACF;OACC;UACG;EACT,KAAK;GACH,UAAU;GACV,SAAS;GACV;EACD,iBAAiB;GACf,UAAU;GACV,SAAS;GACV;EACF;QACQ;EACP;EACA;EACA;EACD;UACU;EACT,SAAS;EACT,SAAS;EACT,SAAS;EACT,WAAW;EACZ;aACa;EACZ,QAAQ;EACR,OAAO;EACP,aAAa;EACd;eACe;EACd,kBAAkB;EAClB,oBAAoB;EACpB,kBAAkB;EAClB,wBAAwB;EACxB,uBAAuB;EACvB,aAAa;EACb,kBAAkB;EAClB,UAAU;EACV,cAAc;EACd,aAAa;EACb,YAAY;EACZ,UAAU;EACV,YAAY;EACZ,UAAU;EACV,SAAS;EACV;kBACkB;EACjB,gBAAgB;EAChB,qBAAqB;EACrB,eAAe;EACf,iBAAiB;EACjB,WAAW;EACX,YAAY;EACb;mBACmB;EAClB,iBAAiB;EACjB,cAAc;EACf;uBACuB;EACtB,iBAAiB,EACf,YAAY,OACb;EACD,cAAc,EACZ,YAAY,OACb;EACF;gBACgB,EACf,UAAU,UACX;UACU;CACZ"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "reciple",
3
- "version": "10.0.1-dev.5",
3
+ "version": "10.0.1-dev.6",
4
4
  "license": "LGPL-3.0-only",
5
5
  "description": "The CLI for reciple",
6
6
  "module": "./dist/index.mjs",
@@ -73,5 +73,5 @@
73
73
  "publishConfig": {
74
74
  "access": "public"
75
75
  },
76
- "gitHead": "73fbf446422a0f7c828322836c9a781d9ba63dce"
76
+ "gitHead": "5f648f7f0daf5313e7f65cfd79fbae85ada1644c"
77
77
  }