reciple 10.0.1-dev.7 → 10.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/README.md +69 -0
  2. package/assets/config/reciple.config.js +7 -0
  3. package/assets/config/reciple.config.ts +5 -0
  4. package/assets/global/nodemon.json +1 -0
  5. package/assets/templates/javascript/jsconfig.json +14 -2
  6. package/assets/templates/typescript/tsconfig.json +14 -2
  7. package/dist/_virtual/{_@oxc-project_runtime@0.99.0 → _@oxc-project_runtime@0.108.0}/helpers/decorate.mjs +1 -1
  8. package/dist/bin/commands/build.mjs +1 -1
  9. package/dist/bin/commands/build.mjs.map +1 -1
  10. package/dist/bin/commands/create.mjs +3 -2
  11. package/dist/bin/commands/create.mjs.map +1 -1
  12. package/dist/bin/commands/createModule.mjs +2 -2
  13. package/dist/bin/commands/createModule.mjs.map +1 -1
  14. package/dist/bin/commands/start.mjs +10 -9
  15. package/dist/bin/commands/start.mjs.map +1 -1
  16. package/dist/bin/commands/startSharding.d.mts +18 -0
  17. package/dist/bin/commands/startSharding.mjs +101 -0
  18. package/dist/bin/commands/startSharding.mjs.map +1 -0
  19. package/dist/bin/reciple.mjs +0 -0
  20. package/dist/classes/cli/CLI.d.mts +1 -1
  21. package/dist/classes/cli/CLI.mjs +6 -5
  22. package/dist/classes/cli/CLI.mjs.map +1 -1
  23. package/dist/classes/cli/ConfigReader.d.mts +24 -29
  24. package/dist/classes/cli/ConfigReader.mjs +45 -61
  25. package/dist/classes/cli/ConfigReader.mjs.map +1 -1
  26. package/dist/classes/cli/RuntimeEnvironment.mjs +1 -1
  27. package/dist/classes/cli/RuntimeEnvironment.mjs.map +1 -1
  28. package/dist/classes/client/EventListeners.mjs +3 -2
  29. package/dist/classes/client/EventListeners.mjs.map +1 -1
  30. package/dist/classes/client/ModuleLoader.d.mts +3 -3
  31. package/dist/classes/client/ModuleLoader.mjs +10 -8
  32. package/dist/classes/client/ModuleLoader.mjs.map +1 -1
  33. package/dist/classes/managers/ModuleManager.mjs +5 -5
  34. package/dist/classes/managers/ModuleManager.mjs.map +1 -1
  35. package/dist/classes/modules/BaseModule.d.mts +0 -3
  36. package/dist/classes/modules/BaseModule.mjs +2 -4
  37. package/dist/classes/modules/BaseModule.mjs.map +1 -1
  38. package/dist/classes/modules/PostconditionModule.d.mts +1 -1
  39. package/dist/classes/modules/PostconditionModule.mjs +5 -5
  40. package/dist/classes/modules/PostconditionModule.mjs.map +1 -1
  41. package/dist/classes/modules/PreconditionModule.d.mts +1 -1
  42. package/dist/classes/modules/PreconditionModule.mjs +5 -5
  43. package/dist/classes/modules/PreconditionModule.mjs.map +1 -1
  44. package/dist/classes/modules/commands/ContextMenuCommandModule.d.mts +1 -1
  45. package/dist/classes/modules/commands/ContextMenuCommandModule.mjs +5 -5
  46. package/dist/classes/modules/commands/ContextMenuCommandModule.mjs.map +1 -1
  47. package/dist/classes/modules/commands/MessageCommandModule.d.mts +1 -1
  48. package/dist/classes/modules/commands/MessageCommandModule.mjs +5 -5
  49. package/dist/classes/modules/commands/MessageCommandModule.mjs.map +1 -1
  50. package/dist/classes/modules/commands/SlashCommandModule.d.mts +1 -1
  51. package/dist/classes/modules/commands/SlashCommandModule.mjs +5 -5
  52. package/dist/classes/modules/commands/SlashCommandModule.mjs.map +1 -1
  53. package/dist/classes/modules/events/EventModule.d.mts +3 -4
  54. package/dist/classes/modules/events/EventModule.mjs +3 -4
  55. package/dist/classes/modules/events/EventModule.mjs.map +1 -1
  56. package/dist/classes/templates/ModuleTemplateBuilder.d.mts +1 -1
  57. package/dist/classes/templates/ModuleTemplateBuilder.mjs +3 -3
  58. package/dist/classes/templates/ModuleTemplateBuilder.mjs.map +1 -1
  59. package/dist/classes/templates/TemplateBuilder.mjs +29 -24
  60. package/dist/classes/templates/TemplateBuilder.mjs.map +1 -1
  61. package/dist/classes/validation/BaseModuleValidator.d.mts +11 -11
  62. package/dist/classes/validation/CommandModuleValidator.d.mts +18 -18
  63. package/dist/classes/validation/EventModuleValidator.d.mts +28 -12
  64. package/dist/classes/validation/PostconditionModule.d.mts +9 -9
  65. package/dist/classes/validation/PreconditionModule.d.mts +7 -7
  66. package/dist/helpers/constants.d.mts +1 -2
  67. package/dist/helpers/constants.mjs +8 -8
  68. package/dist/helpers/constants.mjs.map +1 -1
  69. package/dist/helpers/types.d.mts +3 -1
  70. package/dist/index.d.mts +4 -5
  71. package/dist/index.mjs +3 -4
  72. package/dist/index.mjs.map +1 -1
  73. package/dist/package.mjs +18 -15
  74. package/dist/package.mjs.map +1 -1
  75. package/package.json +17 -14
  76. package/LICENSE +0 -155
@@ -1 +1 @@
1
- {"version":3,"file":"ModuleTemplateBuilder.mjs","names":["template","value: string|symbol","value","directory","ModuleTypeClassName: Record<ModuleType, string[]>","files: string[]","templates: ModuleTemplateBuilder.Data[]"],"sources":["../../../src/classes/templates/ModuleTemplateBuilder.ts"],"sourcesContent":["import path from 'node:path';\nimport { CLI } from '../cli/CLI.js';\nimport { ModuleType } from '../../helpers/constants.js';\nimport { BaseModule } from '../modules/BaseModule.js';\nimport { MessageCommandModule } from '../modules/commands/MessageCommandModule.js';\nimport { SlashCommandModule } from '../modules/commands/SlashCommandModule.js';\nimport { ContextMenuCommandModule } from '../modules/commands/ContextMenuCommandModule.js';\nimport { ClientEventModule } from '../modules/events/ClientEventModule.js';\nimport { EventModule } from '../modules/events/EventModule.js';\nimport { RESTEventModule } from '../modules/events/RESTEventModule.js';\nimport { PostconditionModule } from '../modules/PostconditionModule.js';\nimport { PreconditionModule } from '../modules/PreconditionModule.js';\nimport { mkdir, readdir, readFile, writeFile } from 'node:fs/promises';\nimport { ConfigReader } from '../cli/ConfigReader.js';\nimport { confirm, intro, isCancel, outro, select, text } from '@clack/prompts';\nimport { NotAnError } from '../NotAnError.js';\nimport { ApplicationCommandType } from 'discord.js';\nimport { ModuleLoader } from '../client/ModuleLoader.js';\nimport { existsSync } from 'node:fs';\nimport { colors } from '@reciple/utils';\nimport { readTSConfig } from 'pkg-types';\n\nexport class ModuleTemplateBuilder {\n public _directory?: string;\n\n public readonly cli: CLI;\n public readonly config: ConfigReader;\n\n public template?: ModuleTemplateBuilder.Data;\n public typescript?: boolean;\n public filename?: string;\n public defaultAll: boolean;\n\n get content() {\n return this.template?.content ?? '';\n }\n\n get directory() {\n return this._directory ?? process.cwd();\n }\n\n get filepath() {\n return path.join(this.directory, this.filename ?? '');\n }\n\n constructor(options: ModuleTemplateBuilder.Options) {\n this.cli = options.cli;\n this.config = options.config;\n this.template = options?.template;\n this.typescript = options?.typescript;\n this._directory = options?.directory;\n this.filename = options?.filename;\n this.defaultAll = options?.defaultAll ?? false;\n }\n\n public async init(): Promise<this> {\n intro(colors.bold(colors.black(colors.bgCyan(` ${this.cli.command.name()} create module - v${this.cli.build} `))));\n return this;\n }\n\n public async setupLanguage(options?: ModuleTemplateBuilder.SetupLanguageOptions): Promise<this> {\n this.typescript = options?.typescript ?? this.typescript;\n\n if (!this.typescript) {\n const isTypeScriptDefault = (await ConfigReader.getProjectLang(this.directory)) === 'ts';\n const isTypeScript = this.defaultAll\n ? isTypeScriptDefault\n : await confirm({\n message: 'Would you like to use TypeScript?',\n active: 'Yes',\n inactive: 'No',\n initialValue: isTypeScriptDefault\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 setupTemplate(options?: ModuleTemplateBuilder.SetupTemplateOptions): Promise<this> {\n let template = typeof options?.template === 'object' ? options.template : undefined;\n\n if (!template) {\n const templateName = typeof options?.template === 'string' ? options.template : undefined;\n const templates = await ModuleTemplateBuilder.resolveModuleTemplates(this.typescript ? 'ts' : 'js');\n\n const selectedTemplate = this.defaultAll\n ? templateName ? templates.find(template => template.name === templateName) : templates.at(0)\n : await select({\n message: 'Select a module template',\n options: templates.map(template => ({\n label: template.name,\n value: template\n }))\n });\n\n if (isCancel(selectedTemplate)) throw new NotAnError('Operation cancelled');\n template = selectedTemplate;\n }\n\n this.template = template;\n if (!this.template) throw new NotAnError('No template selected');\n\n return this;\n }\n\n public async setupPlaceholders(): Promise<this> {\n const placeholders = Object.keys(ModuleTemplateBuilder.Placeholder).filter(k => !k.startsWith('$')) as (keyof typeof ModuleTemplateBuilder.Placeholder)[];\n\n for (const placeholderKey of placeholders) {\n if (!ModuleTemplateBuilder.hasPlaceholder(ModuleTemplateBuilder.Placeholder[placeholderKey], this.content)) continue;\n const placeholder = ModuleTemplateBuilder.Placeholder[placeholderKey];\n const defaultValue = ModuleTemplateBuilder.PlaceholderDefaultValues[placeholder];\n\n let value: string|symbol;\n\n if (this.defaultAll) {\n value = defaultValue;\n } else {\n switch (placeholder) {\n case ModuleTemplateBuilder.Placeholder.ModuleName:\n case ModuleTemplateBuilder.Placeholder.CommandName:\n case ModuleTemplateBuilder.Placeholder.EventName:\n value = this.defaultAll\n ? defaultValue\n : await text({\n message: `What would you like to name the ${placeholderKey.replace('Name', '').toLowerCase()}?`,\n initialValue: defaultValue,\n placeholder: defaultValue,\n defaultValue,\n validate: (value) => {\n if (!value) return 'Please enter a value';\n if (value.includes(' ')) return 'Please enter a value without spaces';\n }\n });\n break;\n case ModuleTemplateBuilder.Placeholder.CommandContextMenuType:\n const type = await select({\n message: 'Select a command context menu type',\n options: [\n { label: 'Message', value: ApplicationCommandType.Message },\n { label: 'User', value: ApplicationCommandType.User }\n ],\n initialValue: ApplicationCommandType.Message\n });\n\n value = isCancel(type) ? type : `${type}`;\n break;\n case ModuleTemplateBuilder.Placeholder.EventOnce:\n const once = await confirm({\n message: `Would you like to use the event once?`,\n active: 'Yes',\n inactive: 'No',\n initialValue: false\n });\n\n value = isCancel(once) ? once : `${once}`;\n break;\n case ModuleTemplateBuilder.Placeholder.EventEmitter:\n default:\n value = await text({\n message: `What would you like to use for the ${ModuleTemplateBuilder.toTextCase(placeholder)}?`,\n initialValue: defaultValue,\n placeholder: defaultValue,\n defaultValue\n });\n break;\n }\n }\n\n if (isCancel(value)) throw new NotAnError('Operation cancelled');\n if (!this.template) throw new NotAnError('No template selected');\n this.template.content = ModuleTemplateBuilder.removeExpectedErrorComments(this.content.replaceAll(placeholder, value));\n }\n\n return this;\n }\n\n public async setupDirectory(options?: ModuleTemplateBuilder.SetupDirectoryOptions): Promise<this> {\n let directory = options?.directory;\n\n if (!directory) {\n const cwd = process.cwd();\n const tsconfig = this.config.build.tsconfig\n ? await readTSConfig(typeof this.config.build.tsconfig == 'string' ? this.config.build.tsconfig : cwd, { try: true })\n : undefined;\n\n let directories = await ModuleLoader.scanForDirectories(this.config.config.modules);\n directories = await ModuleLoader.resolveSourceDirectories({\n directories,\n baseUrl: tsconfig?.compilerOptions?.baseUrl ?? '.',\n rootDir: tsconfig?.compilerOptions?.rootDir ?? 'src',\n outDir: tsconfig?.compilerOptions?.outDir ?? 'modules',\n cwd\n });\n\n const selectedDirectory = this.defaultAll\n ? directories.at(0)\n : await select({\n message: 'Select a directory',\n options: directories.map(directory => ({\n label: path.relative(cwd, directory),\n value: directory\n }))\n });\n\n if (isCancel(selectedDirectory)) throw new NotAnError('Operation cancelled');\n directory = selectedDirectory;\n }\n\n if (!directory) throw new NotAnError('No directory selected');\n this._directory = directory;\n\n return this;\n }\n\n public async setupFilename(options?: ModuleTemplateBuilder.SetupFilenameOptions): Promise<this> {\n let filename = options?.filename;\n\n if (!filename) {\n const defaultFilename = `${this.template?.name}.${this.typescript ? 'ts' : 'js'}`;\n const selectedFilename = this.defaultAll\n ? defaultFilename\n : await text({\n message: 'What would you like to name the module file?',\n initialValue: defaultFilename,\n placeholder: defaultFilename,\n defaultValue: defaultFilename,\n validate: (value) => {\n if (!value) return 'Please enter a value';\n if (existsSync(path.join(this.directory, value))) return 'File already exists';\n }\n });\n\n if (isCancel(selectedFilename)) throw new NotAnError('Operation cancelled');\n filename = selectedFilename;\n }\n\n if (!filename) throw new NotAnError('No filename selected');\n this.filename = filename;\n\n return this;\n }\n\n public async build({ overwrite, silent }: ModuleTemplateBuilder.BuildOptions = {}): Promise<this> {\n await mkdir(this.directory, { recursive: true });\n await writeFile(this.filepath, this.content, { flag: overwrite === false ? 'wx' : undefined });\n if (!silent) outro(`Module ${colors.green(this.template?.name!)} created in ${colors.cyan(path.relative(process.cwd(), this.filepath))}`);\n return this;\n }\n}\n\nexport namespace ModuleTemplateBuilder {\n export interface Options {\n cli: CLI;\n config: ConfigReader;\n template?: ModuleTemplateBuilder.Data;\n typescript?: boolean;\n directory?: string;\n filename?: string;\n defaultAll?: boolean;\n }\n\n export interface SetupLanguageOptions {\n typescript?: boolean;\n }\n\n export interface SetupTemplateOptions {\n template?: ModuleTemplateBuilder.Data|string;\n }\n\n export interface SetupDirectoryOptions {\n directory?: string;\n }\n\n export interface SetupFilenameOptions {\n filename?: string;\n }\n\n export interface BuildOptions {\n overwrite?: boolean;\n silent?: boolean;\n }\n\n export enum Placeholder {\n ModuleName = '$MODULE_NAME$',\n CommandName = '$COMMAND_NAME$',\n CommandDescription = '$COMMAND_DESCRIPTION$',\n CommandContextMenuType = '$COMMAND_CONTEXT_MENU_TYPE$',\n EventEmitter = '$EVENT_EMITTER$',\n EventName = '$EVENT_NAME$',\n EventOnce = '$EVENT_ONCE$'\n }\n\n export const PlaceholderDefaultValues: Record<Placeholder, string> = {\n [Placeholder.ModuleName]: 'MyModule',\n [Placeholder.CommandName]: 'my-command',\n [Placeholder.CommandDescription]: 'My command',\n [Placeholder.CommandContextMenuType]: `${ApplicationCommandType.Message}`,\n [Placeholder.EventEmitter]: 'null',\n [Placeholder.EventName]: 'my-event',\n [Placeholder.EventOnce]: 'false'\n }\n\n export const SourceDirectory = {\n js: path.join(CLI.root, './assets/modules/javascript'),\n ts: path.join(CLI.root, './assets/modules/typescript')\n };\n\n export const ModuleTypeClassName: Record<ModuleType, string[]> = {\n [ModuleType.Base]: [BaseModule.name],\n [ModuleType.Command]: [MessageCommandModule.name, SlashCommandModule.name, ContextMenuCommandModule.name],\n [ModuleType.Event]: [ClientEventModule.name, EventModule.name, RESTEventModule.name],\n [ModuleType.Postcondition]: [PostconditionModule.name],\n [ModuleType.Precondition]: [PreconditionModule.name]\n };\n\n export interface Data {\n src: string;\n name: string;\n content: string;\n moduleType: ModuleType|null;\n }\n\n export async function resolveModuleTemplates(source: keyof typeof SourceDirectory): Promise<ModuleTemplateBuilder.Data[]> {\n const src = ModuleTemplateBuilder.SourceDirectory[source];\n const files: string[] = await readdir(src);\n const templates: ModuleTemplateBuilder.Data[] = [];\n\n for (const file of files) {\n const filepath = path.join(src, file);\n const content = await readFile(filepath, 'utf-8');\n const moduleType = ModuleTemplateBuilder.getModuleTemplateContentType(content);\n\n templates.push({ src: filepath, name: path.parse(filepath).name, content, moduleType });\n }\n\n return templates;\n }\n\n export function getModuleTemplateContentType(content: string): ModuleType|null {\n const createExtendStatement = (name: string) => `export class ${Placeholder.ModuleName} extends ${name}`;\n\n for (const type of Object.keys(ModuleTypeClassName).map(Number) as ModuleType[]) {\n const statements = ModuleTypeClassName[type].map(createExtendStatement);\n\n for (const statement of statements) {\n if (content.includes(statement)) return type;\n }\n }\n\n return null;\n }\n\n export function hasPlaceholder(placeholder: Placeholder, content: string): boolean {\n return content.includes(placeholder);\n }\n\n export function removeExpectedErrorComments(content: string): string {\n const lines = content.split('\\n');\n\n return lines\n .filter(line => !line.trim().includes('// @ts-expect-error'))\n .join('\\n');\n }\n\n export function toTextCase(string: string): string {\n return String(string)\n .replace(/^[^A-Za-z0-9]*|[^A-Za-z0-9]*$/g, '')\n .replace(/([a-z])([A-Z])/g, (m, a, b) => a + '_' + b.toLowerCase())\n .replace(/[^A-Za-z0-9]+|_+/g, ' ')\n .toLowerCase();\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ModuleTemplateBuilder.mjs","names":["template","value","directory"],"sources":["../../../src/classes/templates/ModuleTemplateBuilder.ts"],"sourcesContent":["import path from 'node:path';\nimport { CLI } from '../cli/CLI.js';\nimport { ModuleType } from '../../helpers/constants.js';\nimport { BaseModule } from '../modules/BaseModule.js';\nimport { MessageCommandModule } from '../modules/commands/MessageCommandModule.js';\nimport { SlashCommandModule } from '../modules/commands/SlashCommandModule.js';\nimport { ContextMenuCommandModule } from '../modules/commands/ContextMenuCommandModule.js';\nimport { ClientEventModule } from '../modules/events/ClientEventModule.js';\nimport { EventModule } from '../modules/events/EventModule.js';\nimport { RESTEventModule } from '../modules/events/RESTEventModule.js';\nimport { PostconditionModule } from '../modules/PostconditionModule.js';\nimport { PreconditionModule } from '../modules/PreconditionModule.js';\nimport { mkdir, readdir, readFile, writeFile } from 'node:fs/promises';\nimport { ConfigReader } from '../cli/ConfigReader.js';\nimport { confirm, intro, isCancel, outro, select, text } from '@clack/prompts';\nimport { NotAnError } from '../NotAnError.js';\nimport { ApplicationCommandType } from 'discord.js';\nimport { ModuleLoader } from '../client/ModuleLoader.js';\nimport { existsSync } from 'node:fs';\nimport { readTSConfig } from 'pkg-types';\nimport { colors } from '@prtty/prtty';\n\nexport class ModuleTemplateBuilder {\n public _directory?: string;\n\n public readonly cli: CLI;\n public readonly config: ConfigReader;\n\n public template?: ModuleTemplateBuilder.Data;\n public typescript?: boolean;\n public filename?: string;\n public defaultAll: boolean;\n\n get content() {\n return this.template?.content ?? '';\n }\n\n get directory() {\n return this._directory ?? process.cwd();\n }\n\n get filepath() {\n return path.join(this.directory, this.filename ?? '');\n }\n\n constructor(options: ModuleTemplateBuilder.Options) {\n this.cli = options.cli;\n this.config = options.config;\n this.template = options?.template;\n this.typescript = options?.typescript;\n this._directory = options?.directory;\n this.filename = options?.filename;\n this.defaultAll = options?.defaultAll ?? false;\n }\n\n public async init(): Promise<this> {\n intro(colors.bold().black().bgCyan(` ${this.cli.command.name()} create module - v${this.cli.build} `));\n return this;\n }\n\n public async setupLanguage(options?: ModuleTemplateBuilder.SetupLanguageOptions): Promise<this> {\n this.typescript = options?.typescript ?? this.typescript;\n\n if (!this.typescript) {\n const isTypeScriptDefault = (await ConfigReader.getProjectLang(this.directory)) === 'ts';\n const isTypeScript = this.defaultAll\n ? isTypeScriptDefault\n : await confirm({\n message: 'Would you like to use TypeScript?',\n active: 'Yes',\n inactive: 'No',\n initialValue: isTypeScriptDefault\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 setupTemplate(options?: ModuleTemplateBuilder.SetupTemplateOptions): Promise<this> {\n let template = typeof options?.template === 'object' ? options.template : undefined;\n\n if (!template) {\n const templateName = typeof options?.template === 'string' ? options.template : undefined;\n const templates = await ModuleTemplateBuilder.resolveModuleTemplates(this.typescript ? 'ts' : 'js');\n\n const selectedTemplate = this.defaultAll\n ? templateName ? templates.find(template => template.name === templateName) : templates.at(0)\n : await select({\n message: 'Select a module template',\n options: templates.map(template => ({\n label: template.name,\n value: template\n }))\n });\n\n if (isCancel(selectedTemplate)) throw new NotAnError('Operation cancelled');\n template = selectedTemplate;\n }\n\n this.template = template;\n if (!this.template) throw new NotAnError('No template selected');\n\n return this;\n }\n\n public async setupPlaceholders(): Promise<this> {\n const placeholders = Object.keys(ModuleTemplateBuilder.Placeholder).filter(k => !k.startsWith('$')) as (keyof typeof ModuleTemplateBuilder.Placeholder)[];\n\n for (const placeholderKey of placeholders) {\n if (!ModuleTemplateBuilder.hasPlaceholder(ModuleTemplateBuilder.Placeholder[placeholderKey], this.content)) continue;\n const placeholder = ModuleTemplateBuilder.Placeholder[placeholderKey];\n const defaultValue = ModuleTemplateBuilder.PlaceholderDefaultValues[placeholder];\n\n let value: string|symbol;\n\n if (this.defaultAll) {\n value = defaultValue;\n } else {\n switch (placeholder) {\n case ModuleTemplateBuilder.Placeholder.ModuleName:\n case ModuleTemplateBuilder.Placeholder.CommandName:\n case ModuleTemplateBuilder.Placeholder.EventName:\n value = this.defaultAll\n ? defaultValue\n : await text({\n message: `What would you like to name the ${placeholderKey.replace('Name', '').toLowerCase()}?`,\n initialValue: defaultValue,\n placeholder: defaultValue,\n defaultValue,\n validate: (value) => {\n if (!value) return 'Please enter a value';\n if (value.includes(' ')) return 'Please enter a value without spaces';\n }\n });\n break;\n case ModuleTemplateBuilder.Placeholder.CommandContextMenuType:\n const type = await select({\n message: 'Select a command context menu type',\n options: [\n { label: 'Message', value: ApplicationCommandType.Message },\n { label: 'User', value: ApplicationCommandType.User }\n ],\n initialValue: ApplicationCommandType.Message\n });\n\n value = isCancel(type) ? type : `${type}`;\n break;\n case ModuleTemplateBuilder.Placeholder.EventOnce:\n const once = await confirm({\n message: `Would you like to use the event once?`,\n active: 'Yes',\n inactive: 'No',\n initialValue: false\n });\n\n value = isCancel(once) ? once : `${once}`;\n break;\n case ModuleTemplateBuilder.Placeholder.EventEmitter:\n default:\n value = await text({\n message: `What would you like to use for the ${ModuleTemplateBuilder.toTextCase(placeholder)}?`,\n initialValue: defaultValue,\n placeholder: defaultValue,\n defaultValue\n });\n break;\n }\n }\n\n if (isCancel(value)) throw new NotAnError('Operation cancelled');\n if (!this.template) throw new NotAnError('No template selected');\n this.template.content = ModuleTemplateBuilder.removeExpectedErrorComments(this.content.replaceAll(placeholder, value));\n }\n\n return this;\n }\n\n public async setupDirectory(options?: ModuleTemplateBuilder.SetupDirectoryOptions): Promise<this> {\n let directory = options?.directory;\n\n if (!directory) {\n const cwd = process.cwd();\n const tsconfig = this.config.build.tsconfig\n ? await readTSConfig(typeof this.config.build.tsconfig == 'string' ? this.config.build.tsconfig : cwd, { try: true })\n : undefined;\n\n let directories = await ModuleLoader.scanForDirectories(this.config.config.modules);\n directories = await ModuleLoader.resolveSourceDirectories({\n directories,\n baseUrl: tsconfig?.compilerOptions?.baseUrl ?? '.',\n rootDir: tsconfig?.compilerOptions?.rootDir ?? 'src',\n outDir: tsconfig?.compilerOptions?.outDir ?? 'modules',\n cwd\n });\n\n const selectedDirectory = this.defaultAll\n ? directories.at(0)\n : await select({\n message: 'Select a directory',\n options: directories.map(directory => ({\n label: path.relative(cwd, directory),\n value: directory\n }))\n });\n\n if (isCancel(selectedDirectory)) throw new NotAnError('Operation cancelled');\n directory = selectedDirectory;\n }\n\n if (!directory) throw new NotAnError('No directory selected');\n this._directory = directory;\n\n return this;\n }\n\n public async setupFilename(options?: ModuleTemplateBuilder.SetupFilenameOptions): Promise<this> {\n let filename = options?.filename;\n\n if (!filename) {\n const defaultFilename = `${this.template?.name}.${this.typescript ? 'ts' : 'js'}`;\n const selectedFilename = this.defaultAll\n ? defaultFilename\n : await text({\n message: 'What would you like to name the module file?',\n initialValue: defaultFilename,\n placeholder: defaultFilename,\n defaultValue: defaultFilename,\n validate: (value) => {\n if (!value) return 'Please enter a value';\n if (existsSync(path.join(this.directory, value))) return 'File already exists';\n }\n });\n\n if (isCancel(selectedFilename)) throw new NotAnError('Operation cancelled');\n filename = selectedFilename;\n }\n\n if (!filename) throw new NotAnError('No filename selected');\n this.filename = filename;\n\n return this;\n }\n\n public async build({ overwrite, silent }: ModuleTemplateBuilder.BuildOptions = {}): Promise<this> {\n await mkdir(this.directory, { recursive: true });\n await writeFile(this.filepath, this.content, { flag: overwrite === false ? 'wx' : undefined });\n if (!silent) outro(`Module ${colors.green(this.template?.name!)} created in ${colors.cyan(path.relative(process.cwd(), this.filepath))}`);\n return this;\n }\n}\n\nexport namespace ModuleTemplateBuilder {\n export interface Options {\n cli: CLI;\n config: ConfigReader;\n template?: ModuleTemplateBuilder.Data;\n typescript?: boolean;\n directory?: string;\n filename?: string;\n defaultAll?: boolean;\n }\n\n export interface SetupLanguageOptions {\n typescript?: boolean;\n }\n\n export interface SetupTemplateOptions {\n template?: ModuleTemplateBuilder.Data|string;\n }\n\n export interface SetupDirectoryOptions {\n directory?: string;\n }\n\n export interface SetupFilenameOptions {\n filename?: string;\n }\n\n export interface BuildOptions {\n overwrite?: boolean;\n silent?: boolean;\n }\n\n export enum Placeholder {\n ModuleName = '$MODULE_NAME$',\n CommandName = '$COMMAND_NAME$',\n CommandDescription = '$COMMAND_DESCRIPTION$',\n CommandContextMenuType = '$COMMAND_CONTEXT_MENU_TYPE$',\n EventEmitter = '$EVENT_EMITTER$',\n EventName = '$EVENT_NAME$',\n EventOnce = '$EVENT_ONCE$'\n }\n\n export const PlaceholderDefaultValues: Record<Placeholder, string> = {\n [Placeholder.ModuleName]: 'MyModule',\n [Placeholder.CommandName]: 'my-command',\n [Placeholder.CommandDescription]: 'My command',\n [Placeholder.CommandContextMenuType]: `${ApplicationCommandType.Message}`,\n [Placeholder.EventEmitter]: 'null',\n [Placeholder.EventName]: 'my-event',\n [Placeholder.EventOnce]: 'false'\n }\n\n export const SourceDirectory = {\n js: path.join(CLI.root, './assets/modules/javascript'),\n ts: path.join(CLI.root, './assets/modules/typescript')\n };\n\n export const ModuleTypeClassName: Record<ModuleType, string[]> = {\n [ModuleType.Base]: [BaseModule.name],\n [ModuleType.Command]: [MessageCommandModule.name, SlashCommandModule.name, ContextMenuCommandModule.name],\n [ModuleType.Event]: [ClientEventModule.name, EventModule.name, RESTEventModule.name],\n [ModuleType.Postcondition]: [PostconditionModule.name],\n [ModuleType.Precondition]: [PreconditionModule.name]\n };\n\n export interface Data {\n src: string;\n name: string;\n content: string;\n moduleType: ModuleType|null;\n }\n\n export async function resolveModuleTemplates(source: keyof typeof SourceDirectory): Promise<ModuleTemplateBuilder.Data[]> {\n const src = ModuleTemplateBuilder.SourceDirectory[source];\n const files: string[] = await readdir(src);\n const templates: ModuleTemplateBuilder.Data[] = [];\n\n for (const file of files) {\n const filepath = path.join(src, file);\n const content = await readFile(filepath, 'utf-8');\n const moduleType = ModuleTemplateBuilder.getModuleTemplateContentType(content);\n\n templates.push({ src: filepath, name: path.parse(filepath).name, content, moduleType });\n }\n\n return templates;\n }\n\n export function getModuleTemplateContentType(content: string): ModuleType|null {\n const createExtendStatement = (name: string) => `export class ${Placeholder.ModuleName} extends ${name}`;\n\n for (const type of Object.keys(ModuleTypeClassName).map(Number) as ModuleType[]) {\n const statements = ModuleTypeClassName[type].map(createExtendStatement);\n\n for (const statement of statements) {\n if (content.includes(statement)) return type;\n }\n }\n\n return null;\n }\n\n export function hasPlaceholder(placeholder: Placeholder, content: string): boolean {\n return content.includes(placeholder);\n }\n\n export function removeExpectedErrorComments(content: string): string {\n const lines = content.split('\\n');\n\n return lines\n .filter(line => !line.trim().includes('// @ts-expect-error'))\n .join('\\n');\n }\n\n export function toTextCase(string: string): string {\n return String(string)\n .replace(/^[^A-Za-z0-9]*|[^A-Za-z0-9]*$/g, '')\n .replace(/([a-z])([A-Z])/g, (m, a, b) => a + '_' + b.toLowerCase())\n .replace(/[^A-Za-z0-9]+|_+/g, ' ')\n .toLowerCase();\n }\n}\n"],"mappings":"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"}
@@ -4,10 +4,11 @@ import { ConfigReader } from "../cli/ConfigReader.mjs";
4
4
  import { packageJSON } from "../../helpers/constants.mjs";
5
5
  import { ModuleTemplateBuilder } from "./ModuleTemplateBuilder.mjs";
6
6
  import path from "node:path";
7
- import { PackageJsonBuilder, colors } from "@reciple/utils";
7
+ import { PackageJsonBuilder } from "@reciple/utils";
8
8
  import { parse } from "@dotenvx/dotenvx";
9
9
  import { copyFile, mkdir, readFile, readdir, stat, writeFile } from "node:fs/promises";
10
10
  import { confirm, intro, isCancel, log, outro, select, text } from "@clack/prompts";
11
+ import { colors } from "@prtty/prtty";
11
12
  import micromatch from "micromatch";
12
13
  import { existsSync, statSync } from "node:fs";
13
14
  import { slug } from "github-slugger";
@@ -45,7 +46,7 @@ var TemplateBuilder = class TemplateBuilder {
45
46
  this.token = options.token;
46
47
  }
47
48
  async init() {
48
- intro(colors.bold(colors.black(colors.bgCyan(` ${this.cli.command.name()} create - v${this.cli.build} `))));
49
+ intro(colors.bold().black().bgCyan(` ${this.cli.command.name()} create - v${this.cli.build} `));
49
50
  return this;
50
51
  }
51
52
  async createDirectory(options) {
@@ -129,9 +130,12 @@ var TemplateBuilder = class TemplateBuilder {
129
130
  return this;
130
131
  }
131
132
  async createConfig(options) {
132
- let filepath = options?.filepath;
133
- if (!filepath) filepath = await ConfigReader.findConfig(this.directory, this.typescript ? "ts" : this.typescript === false ? "js" : void 0) ?? path.join(this.directory, ConfigReader.createConfigFilename(this.typescript ? "ts" : "js"));
134
- if (await ConfigReader.hasFile(filepath)) {
133
+ let filepath = options?.path;
134
+ if (!filepath) filepath = await ConfigReader.find({
135
+ cwd: this.directory,
136
+ lang: this.typescript ? "ts" : this.typescript === false ? "js" : void 0
137
+ }) ?? path.join(this.directory, ConfigReader.createConfigFilename(this.typescript ? "ts" : "js"));
138
+ if (await ConfigReader.exists(filepath)) {
135
139
  const overwrite = this.defaultAll ? false : await confirm({
136
140
  message: `Config file already exists at ${colors.green(path.relative(process.cwd(), filepath))}. Would you like to overwrite it?`,
137
141
  active: "Yes",
@@ -143,9 +147,10 @@ var TemplateBuilder = class TemplateBuilder {
143
147
  }
144
148
  this.config = await ConfigReader.create({
145
149
  ...options,
146
- filepath,
150
+ path: filepath,
147
151
  type: this.typescript ? "ts" : "js",
148
- overwrite: true
152
+ overwrite: true,
153
+ readOptions: false
149
154
  });
150
155
  return this;
151
156
  }
@@ -222,15 +227,14 @@ var TemplateBuilder = class TemplateBuilder {
222
227
  this.packageJson = await PackageJsonBuilder.read(this.packageJsonPath, true);
223
228
  this.packageJson.merge({
224
229
  name: this.name,
225
- version: "0.0.1",
230
+ private: true,
226
231
  type: "module",
227
232
  scripts: {
228
233
  build: `reciple build`,
229
234
  start: "reciple start",
230
235
  dev: "nodemon"
231
236
  },
232
- ...TemplateBuilder.createDependencyRecord(this.typescript ? "ts" : "js"),
233
- private: true
237
+ ...TemplateBuilder.createDependencyRecord(this.typescript ? "ts" : "js")
234
238
  });
235
239
  return this;
236
240
  }
@@ -253,9 +257,9 @@ var TemplateBuilder = class TemplateBuilder {
253
257
  silent: true
254
258
  }),
255
259
  indicator: "timer",
256
- errorMessage: `${colors.bold(colors.red("✗"))} Failed to install dependencies`,
257
- successMessage: `${colors.bold(colors.green("✔"))} Dependencies installed successfully`,
258
- message: `${colors.bold(colors.dim("$"))} Installing dependencies`
260
+ errorMessage: `${colors.bold().red("✗")} Failed to install dependencies`,
261
+ successMessage: `${colors.bold().green("✔")} Dependencies installed successfully`,
262
+ message: `${colors.bold().dim("$")} Installing dependencies`
259
263
  })[0];
260
264
  this.dependenciesInstalled = true;
261
265
  }
@@ -296,24 +300,24 @@ var TemplateBuilder = class TemplateBuilder {
296
300
  }
297
301
  async build(options) {
298
302
  await this.packageJson?.write(this.packageJsonPath, true);
299
- if (!options?.skipBuild) await CLI.createSpinnerPromise({
303
+ if (!options?.skipBuild && this.dependenciesInstalled) await CLI.createSpinnerPromise({
300
304
  promise: runScript("build", {
301
305
  cwd: this.directory,
302
306
  packageManager: this.packageManager,
303
307
  silent: true
304
308
  }),
305
309
  indicator: "timer",
306
- errorMessage: `${colors.bold(colors.red("✗"))} Failed to build project`,
307
- successMessage: `${colors.bold(colors.green("✔"))} Project built successfully`,
308
- message: `${colors.bold(colors.dim("$"))} Building project`
310
+ errorMessage: `${colors.bold().red("✗")} Failed to build project`,
311
+ successMessage: `${colors.bold().green("✔")} Project built successfully`,
312
+ message: `${colors.bold().dim("$")} Building project`
309
313
  })[0];
310
314
  outro(`Project created in ${colors.cyan(this.relativeDirectory)}`);
311
- console.log(`\n${colors.bold(colors.green("✔"))} Start developing:`);
312
- if (this.relativeDirectory !== "./") console.log(` • ${colors.cyan(colors.bold(`cd ${this.relativeDirectory}`))}`);
313
- console.log(` • ${colors.cyan(colors.bold(installDependenciesCommand(this.packageManager ?? "npm")))} ${colors.dim("(Install dependencies)")}`);
314
- console.log(` • ${colors.cyan(colors.bold(runScriptCommand(this.packageManager ?? "npm", "build")))} ${colors.dim("(Build)")}`);
315
- console.log(` • ${colors.cyan(colors.bold(runScriptCommand(this.packageManager ?? "npm", "dev")))} ${colors.dim("(Development)")}`);
316
- console.log(` • ${colors.cyan(colors.bold(runScriptCommand(this.packageManager ?? "npm", "start")))} ${colors.dim("(Production)")}`);
315
+ console.log(`\n${colors.bold().green("✔")} Start developing:`);
316
+ if (this.relativeDirectory !== "./") console.log(` • ${colors.cyan().bold(`cd ${this.relativeDirectory}`)}`);
317
+ console.log(` • ${colors.cyan().bold(installDependenciesCommand(this.packageManager ?? "npm"))} ${colors.dim("(Install dependencies)")}`);
318
+ console.log(` • ${colors.cyan().bold(runScriptCommand(this.packageManager ?? "npm", "build"))} ${colors.dim("(Build)")}`);
319
+ console.log(` • ${colors.cyan().bold(runScriptCommand(this.packageManager ?? "npm", "dev"))} ${colors.dim("(Development)")}`);
320
+ console.log(` • ${colors.cyan().bold(runScriptCommand(this.packageManager ?? "npm", "start"))} ${colors.dim("(Production)")}`);
317
321
  return this;
318
322
  }
319
323
  };
@@ -328,7 +332,8 @@ var TemplateBuilder = class TemplateBuilder {
328
332
  },
329
333
  devDependencies: {
330
334
  "@types/node": packageJSON.devDependencies?.["@types/node"],
331
- nodemon: packageJSON.devDependencies?.nodemon
335
+ nodemon: packageJSON.devDependencies?.nodemon,
336
+ typescript: packageJSON.devDependencies?.["typescript"]
332
337
  }
333
338
  },
334
339
  ts: {},
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateBuilder.mjs","names":["dir","parseDotenv","packageManager: PackageManagerName|symbol","moduleOptions: ModuleTemplateBuilder.Options","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 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?.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 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 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 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 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":"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"}
1
+ {"version":3,"file":"TemplateBuilder.mjs","names":["dir","parseDotenv","data"],"sources":["../../../src/classes/templates/TemplateBuilder.ts"],"sourcesContent":["import { 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 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().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 await this.packageJson?.write(this.packageJsonPath, true);\n\n if (!options?.skipBuild && this.dependenciesInstalled) 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().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,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_shapeshift33 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_shapeshift33.StringValidator<string>;
9
- static moduleType: _sapphire_shapeshift33.NativeEnumValidator<typeof ModuleType>;
10
- static onEnable: _sapphire_shapeshift33.UnionValidator<Function | undefined>;
11
- static onReady: _sapphire_shapeshift33.UnionValidator<Function | undefined>;
12
- static onDisable: _sapphire_shapeshift33.UnionValidator<Function | undefined>;
13
- static object: _sapphire_shapeshift33.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_shapeshift33.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_shapeshift33.UnionValidator<_sapphire_shapeshift33.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_shapeshift33.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_shapeshift23 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_shapeshift23.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_shapeshift23.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_shapeshift23.UndefinedToOptional<{
26
26
  type: any;
27
27
  name: any;
28
28
  }>;
29
29
  cooldown: number | undefined;
30
- preconditions: _sapphire_shapeshift0.UndefinedToOptional<{
30
+ preconditions: _sapphire_shapeshift23.UndefinedToOptional<{
31
31
  id: any;
32
32
  scope: any;
33
33
  execute: any;
34
34
  }>[] | undefined;
35
- postconditions: _sapphire_shapeshift0.UndefinedToOptional<{
35
+ postconditions: _sapphire_shapeshift23.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_shapeshift23.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_shapeshift23.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_shapeshift23.UndefinedToOptional<{
59
59
  type: any;
60
60
  name: any;
61
61
  }>;
62
62
  cooldown: number | undefined;
63
- preconditions: _sapphire_shapeshift0.UndefinedToOptional<{
63
+ preconditions: _sapphire_shapeshift23.UndefinedToOptional<{
64
64
  id: any;
65
65
  scope: any;
66
66
  execute: any;
67
67
  }>[] | undefined;
68
- postconditions: _sapphire_shapeshift0.UndefinedToOptional<{
68
+ postconditions: _sapphire_shapeshift23.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_shapeshift23.UnionValidator<_sapphire_shapeshift23.UndefinedToOptional<{
78
+ toJSON: Function;
79
+ }> | _sapphire_shapeshift23.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_shapeshift23.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_shapeshift23.UndefinedToOptional<{
93
95
  type: any;
94
96
  name: any;
95
97
  }>;
96
98
  cooldown: number | undefined;
97
- preconditions: _sapphire_shapeshift0.UndefinedToOptional<{
99
+ preconditions: _sapphire_shapeshift23.UndefinedToOptional<{
98
100
  id: any;
99
101
  scope: any;
100
102
  execute: any;
101
103
  }>[] | undefined;
102
- postconditions: _sapphire_shapeshift0.UndefinedToOptional<{
104
+ postconditions: _sapphire_shapeshift23.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,47 +3,63 @@ 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_shapeshift7 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_shapeshift7.InstanceValidator<EventEmitter<{
11
+ [x: string]: any[];
12
+ [x: number]: any[];
13
+ [x: symbol]: any[];
14
+ }>>;
15
+ static event: _sapphire_shapeshift7.StringValidator<string>;
16
+ static once: _sapphire_shapeshift7.UnionValidator<boolean | undefined>;
17
+ static onEvent: _sapphire_shapeshift7.InstanceValidator<Function>;
18
+ static object: _sapphire_shapeshift7.ObjectValidator<{
15
19
  id: string | undefined;
16
20
  moduleType: ModuleType | undefined;
17
21
  onEnable: Function | undefined;
18
22
  onReady: Function | undefined;
19
23
  onDisable: Function | undefined;
20
24
  } & {
21
- emitter: EventEmitter<[never] | Record<string | number | symbol, any[]>>;
25
+ emitter: EventEmitter<{
26
+ [x: string]: any[];
27
+ [x: number]: any[];
28
+ [x: symbol]: any[];
29
+ }>;
22
30
  event: string;
23
31
  once: boolean | undefined;
24
32
  onEvent: Function;
25
- }, _sapphire_shapeshift16.UndefinedToOptional<{
33
+ }, _sapphire_shapeshift7.UndefinedToOptional<{
26
34
  id: string | undefined;
27
35
  moduleType: ModuleType | undefined;
28
36
  onEnable: Function | undefined;
29
37
  onReady: Function | undefined;
30
38
  onDisable: Function | undefined;
31
39
  } & {
32
- emitter: EventEmitter<[never] | Record<string | number | symbol, any[]>>;
40
+ emitter: EventEmitter<{
41
+ [x: string]: any[];
42
+ [x: number]: any[];
43
+ [x: symbol]: any[];
44
+ }>;
33
45
  event: string;
34
46
  once: boolean | undefined;
35
47
  onEvent: Function;
36
48
  }>>;
37
- static resolvable: _sapphire_shapeshift16.UnionValidator<_sapphire_shapeshift16.UndefinedToOptional<{
49
+ static resolvable: _sapphire_shapeshift7.UnionValidator<_sapphire_shapeshift7.UndefinedToOptional<{
38
50
  toJSON: Function;
39
- }> | _sapphire_shapeshift16.UndefinedToOptional<{
51
+ }> | _sapphire_shapeshift7.UndefinedToOptional<{
40
52
  id: string | undefined;
41
53
  moduleType: ModuleType | undefined;
42
54
  onEnable: Function | undefined;
43
55
  onReady: Function | undefined;
44
56
  onDisable: Function | undefined;
45
57
  } & {
46
- emitter: EventEmitter<[never] | Record<string | number | symbol, any[]>>;
58
+ emitter: EventEmitter<{
59
+ [x: string]: any[];
60
+ [x: number]: any[];
61
+ [x: symbol]: any[];
62
+ }>;
47
63
  event: string;
48
64
  once: boolean | undefined;
49
65
  onEvent: Function;