commandkit 0.1.11-dev.20250112093452 → 0.1.11-dev.20250113184412

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cache/index.ts","../../src/context/async-context.ts","../../src/utils/error-codes.ts","../../src/CommandKit.ts","../../src/utils/clone.ts","../../src/utils/colors.ts","../../src/utils/get-paths.ts","../../src/utils/resolve-file-url.ts","../../src/handlers/command-handler/functions/loadCommandsWithRest.ts","../../src/handlers/command-handler/utils/areSlashCommandsDifferent.ts","../../src/handlers/command-handler/functions/registerCommands.ts","../../src/handlers/command-handler/validations/devOnly.ts","../../src/handlers/command-handler/validations/permissions.ts","../../src/handlers/command-handler/validations/index.ts","../../src/context/environment.ts","../../src/handlers/command-handler/CommandHandler.ts","../../src/handlers/event-handler/EventHandler.ts","../../src/handlers/validation-handler/ValidationHandler.ts","../../src/cache/CacheProvider.ts","../../src/cache/MemoryCache.ts","../../src/utils/constants.ts","../../src/utils/warn-unstable.ts"],"sourcesContent":["import { GenericFunction, getCommandKit } from '../context/async-context';\nimport { COMMANDKIT_CACHE_TAG } from '../utils/constants';\nimport { warnUnstable } from '../utils/warn-unstable';\nimport { randomUUID } from 'node:crypto';\n\nexport * from './CacheProvider';\nexport * from './MemoryCache';\n\nexport interface CacheOptions {\n /**\n * The name of the cache key.\n */\n name: string;\n /**\n * The time-to-live of the cache key in milliseconds.\n */\n ttl?: number;\n}\n\n/**\n * Assigns cache tag parameters to the function that uses the \"use cache\" directive.\n * @param options The cache options.\n * @param fn The function to assign the cache tag.\n */\nexport function unstable_cacheTag(\noptions: string | number | CacheOptions,\nfn: GenericFunction)\n: void {\n warnUnstable('cacheTag()');\n\n const isCacheable = Reflect.get(fn, COMMANDKIT_CACHE_TAG);\n\n if (!isCacheable) {\n throw new Error(\n 'cacheTag() can only be used with cache() functions or functions that use the \"use cache\" directive.'\n );\n }\n\n const opt =\n typeof options === 'string' ?\n { name: options } :\n typeof options === 'number' ?\n { name: randomUUID(), ttl: options } :\n options;\n\n Reflect.set(fn, '__cache_params', opt);\n}\n\n/**\n * Cache a value.\n * @param options The cache options.\n */\nexport function unstable_cache<R, F extends (...args: any[]) => Promise<R>>(\nfn: F,\noptions?: string | CacheOptions | undefined)\n: F {\n warnUnstable('cache()');\n const commandkit = getCommandKit(true);\n const cache = commandkit.getCacheProvider();\n\n if (!cache) {\n throw new Error('cache() cannot be used without a cache provider.');\n }\n\n options ??= randomUUID();\n\n const params = typeof options === 'string' ? { name: options } : options;\n\n const _fn = (async (...args: Parameters<F>): Promise<R> => {\n const context = (Reflect.get(_fn, '__cache_params') ||\n params) as CacheOptions;\n\n // check cache\n const data = await cache.get(context.name);\n\n if (data) return data as R;\n\n // cache miss\n const result = await fn(...args);\n\n await cache.set(context.name, result, context.ttl);\n\n return result;\n }) as F;\n\n Reflect.set(_fn, '__cache_params', params);\n Reflect.set(_fn, COMMANDKIT_CACHE_TAG, true);\n\n return _fn;\n}\n\n/**\n * Revalidate a cache by its key.\n * @param cache The cache key or the function that was cached.\n * @param ttl The new time-to-live of the cache key in milliseconds. If not provided, the ttl will not be set (past ttl will be ignored).\n */\nexport async function unstable_revalidate(\ncache: string | GenericFunction,\nttl?: number)\n: Promise<void> {\n warnUnstable('revalidate()');\n const commandkit = getCommandKit(true);\n const cacheProvider = commandkit.getCacheProvider();\n\n if (!cacheProvider) {\n throw new Error('revalidate() cannot be used without a cache provider.');\n }\n\n const key =\n typeof cache === 'string' ?\n cache :\n Reflect.get(cache, '__cache_params')?.name;\n\n if (!key) {\n throw new Error('Invalid cache key.');\n }\n\n const data = await cacheProvider.get(key);\n\n if (data) {\n const _ttl = ttl ?? undefined;\n await cacheProvider.set(key, data, _ttl);\n }\n}\n\n/**\n * Invalidate a cache by its key.\n * @param cache The cache key or the function that was cached.\n */\nexport async function unstable_invalidate(\ncache: string | GenericFunction)\n: Promise<void> {\n warnUnstable('invalidate()');\n const commandkit = getCommandKit(true);\n const cacheProvider = commandkit.getCacheProvider();\n\n if (!cacheProvider) {\n throw new Error('invalidate() cannot be used without a cache provider.');\n }\n\n const key =\n typeof cache === 'string' ?\n cache :\n Reflect.get(cache, '__cache_params')?.name;\n\n if (!key) {\n throw new Error('Invalid cache key.');\n }\n\n await cacheProvider.delete(key);\n}\n\n/**\n * Manually expire a cache by its key.\n * @param cache The cache key.\n * @param ttl The new time-to-live of the cache key in milliseconds. If not provided, the cache key will be deleted.\n */\nexport async function unstable_expire(\ncache: string | GenericFunction,\nttl?: number)\n: Promise<void> {\n warnUnstable('expire()');\n const commandkit = getCommandKit(true);\n const cacheProvider = commandkit.getCacheProvider();\n\n if (!cacheProvider) {\n throw new Error('expire() cannot be used without a cache provider.');\n }\n\n const name =\n typeof cache === 'string' ?\n cache :\n Reflect.get(cache, '__cache_params')?.name;\n\n if (!name) {\n throw new Error('Invalid cache key.');\n }\n\n if (typeof ttl === 'number') {\n await cacheProvider.expire(name, ttl);\n } else {\n await cacheProvider.delete(name);\n }\n}","import { AsyncLocalStorage } from 'node:async_hooks';\nimport { CommandKitEnvironment } from './environment';\nimport { CommandKitErrorCodes, isCommandKitError } from '../utils/error-codes';\nimport { Interaction } from 'discord.js';\nimport { CommandKit } from '../CommandKit';\n\nconst context = new AsyncLocalStorage<CommandKitEnvironment>();\n\nexport type GenericFunction<A extends any[] = any[]> = (...args: A) => any;\n\n/**\n * Returns a context-aware version of the given function.\n * @param env - The commandkit environment data.\n * @param fn - The target function.\n * @param finalizer - An optional finalizer function to run after the target function. This function will be context-aware.\n * @internal\n */\nexport function makeContextAwareFunction<\n R extends GenericFunction,\n F extends GenericFunction>(\nenv: CommandKitEnvironment, fn: R, finalizer?: F): R {\n const _fn = (...args: any[]) => {\n return context.run(env, async () => {\n try {\n // execute the target function\n const result = await fn(...args);\n\n return result;\n } catch (e) {\n // set the error in the environment data\n if (isCommandKitError(e)) {\n const code = Reflect.get(e, 'code');\n const interaction = env.variables.get('interaction') as Interaction;\n if (!interaction) return;\n\n switch (code) {\n case CommandKitErrorCodes.GuildOnlyException:{\n if (interaction.isRepliable()) {\n await interaction.reply({\n content: 'This command is only available in guilds.',\n ephemeral: true\n });\n }\n return;\n }\n case CommandKitErrorCodes.DMOnlyException:{\n if (interaction.isRepliable()) {\n await interaction.reply({\n content: 'This command is only available in DMs.',\n ephemeral: true\n });\n }\n return;\n }\n }\n\n return;\n }\n\n env.setExecutionError(e as Error);\n } finally {\n if (typeof finalizer === 'function') {\n // execute the finalizer function\n try {\n await finalizer(...args);\n } catch {\n\n // no-op\n }}\n }\n });\n };\n\n return _fn as R;\n}\n\n/**\n * Retrieves commandkit\n * @private\n * @internal\n */\nexport function getCommandKit(): CommandKit | undefined;\nexport function getCommandKit(strict: true): CommandKit;\nexport function getCommandKit(strict: false): CommandKit | undefined;\nexport function getCommandKit(strict = false): CommandKit | undefined {\n const kit = context.getStore()?.commandkit ?? CommandKit.instance;\n\n if (!kit && strict) {\n throw new Error('CommandKit instance not found.');\n }\n\n return kit;\n}\n\n/**\n * Get the current commandkit context.\n * @internal\n */\nexport function getContext(): CommandKitEnvironment | void {\n const ctx = context.getStore();\n return ctx;\n}\n\n/**\n * Use current commandkit context. Throws an error if no context is found.\n */\nexport function useEnvironment(): CommandKitEnvironment {\n const ctx = context.getStore();\n if (!ctx) {\n throw new Error(\n 'No commandkit environment found. Please make sure you are inside commandkit handler.'\n );\n }\n\n return ctx;\n}\n\n/**\n * Ensures the command is only available in guilds.\n * Note: do not wrap this function in a try/catch block.\n */\nexport function guildOnly() {\n const env = useEnvironment();\n const interaction: Interaction = env.variables.get('interaction');\n\n if (!interaction) {\n throw new Error('No interaction found in environment.');\n }\n\n if (!interaction.guild) {\n const error = new Error('This command is only available in guilds.');\n Reflect.set(error, 'code', CommandKitErrorCodes.GuildOnlyException);\n\n throw error;\n }\n}\n\n/**\n * Ensures the command is only available in DMs.\n * Note: do not wrap this function in a try/catch block.\n */\nexport function dmOnly() {\n const env = useEnvironment();\n const interaction: Interaction = env.variables.get('interaction');\n\n if (!interaction) {\n throw new Error('No interaction found in environment.');\n }\n\n if (interaction.guild) {\n const error = new Error('This command is only available in DMs.');\n Reflect.set(error, 'code', CommandKitErrorCodes.DMOnlyException);\n\n throw error;\n }\n}","export const CommandKitErrorCodes = {\n GuildOnlyException: Symbol('kGuildOnlyException'),\n DMOnlyException: Symbol('kDMOnlyException')\n} as const;\n\nexport function isCommandKitError(\nerror: unknown)\n: error is Error & {code: symbol;} {\n if (!(error instanceof Error)) return false;\n const code = Reflect.get(error, 'code');\n\n for (const key in CommandKitErrorCodes) {\n if (CommandKitErrorCodes[key as keyof typeof CommandKitErrorCodes] === code)\n return true;\n }\n\n return false;\n}","import EventEmitter from 'node:events';\nimport { CommandHandler, EventHandler, ValidationHandler } from './handlers';\nimport type {\n CommandKitData,\n CommandKitOptions,\n CommandObject,\n ReloadOptions } from\n'./types';\nimport colors from './utils/colors';\nimport { CacheProvider } from './cache/CacheProvider';\nimport { MemoryCache } from './cache/MemoryCache';\n\nexport class CommandKit extends EventEmitter {\n #data: CommandKitData;\n\n static instance: CommandKit | undefined = undefined;\n\n /**\n * Create a new command and event handler with CommandKit.\n *\n * @param options - The default CommandKit configuration.\n * @see {@link https://commandkit.dev/guide/commandkit-setup}\n */\n constructor(options: CommandKitOptions) {\n if (CommandKit.instance) {\n process.emitWarning(\n 'CommandKit instance already exists. Having multiple instance in same project is discouraged and it may lead to unexpected behavior.',\n {\n code: 'MultiInstanceWarning'\n }\n );\n }\n\n if (!options.client) {\n throw new Error(\n colors.red('\"client\" is required when instantiating CommandKit.')\n );\n }\n\n if (options.validationsPath && !options.commandsPath) {\n throw new Error(\n colors.red('\"commandsPath\" is required when \"validationsPath\" is set.')\n );\n }\n\n super();\n\n options.debugCommands ??= process.env.NODE_ENV !== 'production';\n\n if (\n options.cacheProvider !== null && (\n !options.cacheProvider ||\n !(options.cacheProvider instanceof CacheProvider)))\n {\n options.cacheProvider = new MemoryCache();\n }\n\n this.#data = options;\n\n this.#init().then(() => {\n // Increment client listeners count, as commandkit registers internal event listeners.\n this.incrementClientListenersCount();\n });\n\n if (!CommandKit.instance) {\n CommandKit.instance = this;\n }\n }\n\n /**\n * Resolves the current cache provider.\n */\n getCacheProvider(): CacheProvider | null {\n const provider = this.#data.cacheProvider;\n return provider ?? null;\n }\n\n /**\n * Whether or not to debug the command handler.\n */\n isDebuggingCommands() {\n return this.#data.debugCommands || false;\n }\n\n /**\n * Get the client attached to this CommandKit instance.\n */\n get client() {\n return this.#data.client;\n }\n\n /**\n * Get command handler instance.\n */\n get commandHandler() {\n return this.#data.commandHandler;\n }\n\n /**\n * (Private) Initialize CommandKit.\n */\n async #init() {\n // <!-- Setup event handler -->\n if (this.#data.eventsPath) {\n const eventHandler = new EventHandler({\n client: this.#data.client,\n eventsPath: this.#data.eventsPath,\n commandKitInstance: this\n });\n\n await eventHandler.init();\n\n this.#data.eventHandler = eventHandler;\n }\n\n // <!-- Setup validation handler -->\n if (this.#data.validationsPath) {\n const validationHandler = new ValidationHandler({\n validationsPath: this.#data.validationsPath\n });\n\n await validationHandler.init();\n\n this.#data.validationHandler = validationHandler;\n }\n\n // <!-- Setup command handler -->\n if (this.#data.commandsPath) {\n const commandHandler = new CommandHandler({\n client: this.#data.client,\n commandsPath: this.#data.commandsPath,\n devGuildIds: this.#data.devGuildIds || [],\n devUserIds: this.#data.devUserIds || [],\n devRoleIds: this.#data.devRoleIds || [],\n validationHandler: this.#data.validationHandler,\n skipBuiltInValidations: this.#data.skipBuiltInValidations || false,\n commandkitInstance: this,\n bulkRegister: this.#data.bulkRegister || false\n });\n\n await commandHandler.init();\n\n this.#data.commandHandler = commandHandler;\n }\n }\n\n /**\n * Updates application commands with the latest from \"commandsPath\".\n */\n async reloadCommands(type?: ReloadOptions) {\n if (!this.#data.commandHandler) return;\n await this.#data.commandHandler.reloadCommands(type);\n }\n\n /**\n * Updates application events with the latest from \"eventsPath\".\n */\n async reloadEvents() {\n if (!this.#data.eventHandler) return;\n await this.#data.eventHandler.reloadEvents(this.#data.commandHandler);\n }\n\n /**\n * Updates application command validations with the latest from \"validationsPath\".\n */\n async reloadValidations() {\n if (!this.#data.validationHandler) return;\n await this.#data.validationHandler.reloadValidations();\n }\n\n /**\n * @returns An array of objects of all the commands that CommandKit is handling.\n */\n get commands(): CommandObject[] {\n if (!this.#data.commandHandler) {\n return [];\n }\n\n const commands = this.#data.commandHandler.commands.map((cmd) => {\n const { run, autocomplete, ...command } = cmd;\n return command;\n });\n\n return commands;\n }\n\n /**\n * @returns The path to the commands folder which was set when instantiating CommandKit.\n */\n get commandsPath(): string | undefined {\n return this.#data.commandsPath;\n }\n\n /**\n * @returns The path to the events folder which was set when instantiating CommandKit.\n */\n get eventsPath(): string | undefined {\n return this.#data.eventsPath;\n }\n\n /**\n * @returns The path to the validations folder which was set when instantiating CommandKit.\n */\n get validationsPath(): string | undefined {\n return this.#data.validationsPath;\n }\n\n /**\n * @returns An array of all the developer user IDs which was set when instantiating CommandKit.\n */\n get devUserIds(): string[] {\n return this.#data.devUserIds || [];\n }\n\n /**\n * @returns An array of all the developer guild IDs which was set when instantiating CommandKit.\n */\n get devGuildIds(): string[] {\n return this.#data.devGuildIds || [];\n }\n\n /**\n * @returns An array of all the developer role IDs which was set when instantiating CommandKit.\n */\n get devRoleIds(): string[] {\n return this.#data.devRoleIds || [];\n }\n\n /**\n * Increment the client listeners count.\n */\n incrementClientListenersCount() {\n this.#data.client.setMaxListeners(this.#data.client.getMaxListeners() + 1);\n }\n\n /**\n * Decrement the client listeners count.\n */\n decrementClientListenersCount() {\n this.#data.client.setMaxListeners(this.#data.client.getMaxListeners() - 1);\n }\n}","import rfdc from 'rfdc';\n\nexport const clone = rfdc();","const resetColor = '\\x1b[0m';\n\nexport default {\n reset: (text: string) => `${text}${resetColor}`,\n bright: (text: string) => `\\x1b[1m${text}${resetColor}`,\n dim: (text: string) => `\\x1b[2m${text}${resetColor}`,\n underscore: (text: string) => `\\x1b[4m${text}${resetColor}`,\n blink: (text: string) => `\\x1b[5m${text}${resetColor}`,\n reverse: (text: string) => `\\x1b[7m${text}${resetColor}`,\n hidden: (text: string) => `\\x1b[8m${text}${resetColor}`,\n\n black: (text: string) => `\\x1b[30m${text}${resetColor}`,\n red: (text: string) => `\\x1b[31m${text}${resetColor}`,\n green: (text: string) => `\\x1b[32m${text}${resetColor}`,\n yellow: (text: string) => `\\x1b[33m${text}${resetColor}`,\n blue: (text: string) => `\\x1b[34m${text}${resetColor}`,\n magenta: (text: string) => `\\x1b[35m${text}${resetColor}`,\n cyan: (text: string) => `\\x1b[36m${text}${resetColor}`,\n white: (text: string) => `\\x1b[37m${text}${resetColor}`,\n\n bgBlack: (text: string) => `\\x1b[40m${text}${resetColor}`,\n bgRed: (text: string) => `\\x1b[41m${text}${resetColor}`,\n bgGreen: (text: string) => `\\x1b[42m${text}${resetColor}`,\n bgYellow: (text: string) => `\\x1b[43m${text}${resetColor}`,\n bgBlue: (text: string) => `\\x1b[44m${text}${resetColor}`,\n bgMagenta: (text: string) => `\\x1b[45m${text}${resetColor}`,\n bgCyan: (text: string) => `\\x1b[46m${text}${resetColor}`,\n bgWhite: (text: string) => `\\x1b[47m${text}${resetColor}`\n};","import path from 'path';\nimport fs from 'fs/promises';\n\nexport async function getFilePaths(\ndirectory: string,\nnesting?: boolean)\n: Promise<string[]> {\n let filePaths: string[] = [];\n\n if (!directory) return filePaths;\n\n const files = await fs.readdir(directory, { withFileTypes: true });\n\n for (const file of files) {\n const filePath = path.join(directory, file.name);\n\n if (file.isFile()) {\n filePaths.push(filePath);\n }\n\n if (nesting && file.isDirectory()) {\n filePaths = [...filePaths, ...(await getFilePaths(filePath, true))];\n }\n }\n\n return filePaths;\n}\n\nexport async function getFolderPaths(\ndirectory: string,\nnesting?: boolean)\n: Promise<string[]> {\n let folderPaths: string[] = [];\n\n if (!directory) return folderPaths;\n\n const folders = await fs.readdir(directory, { withFileTypes: true });\n\n for (const folder of folders) {\n const folderPath = path.join(directory, folder.name);\n\n if (folder.isDirectory()) {\n folderPaths.push(folderPath);\n\n if (nesting) {\n folderPaths = [\n ...folderPaths,\n ...(await getFolderPaths(folderPath, true))];\n\n }\n }\n }\n\n return folderPaths;\n}","import path from 'path';\n\n/**\n * Convert a local file path to a file URL.\n * @param filePath - The local file's path.\n * @returns - The converted file URL.\n */\nexport function toFileURL(filePath: string) {\n const resolvedPath = path.resolve(filePath);\n return 'file://' + resolvedPath.replace(/\\\\\\\\|\\\\/g, '/');\n}","import type { ApplicationCommandDataResolvable, Client } from 'discord.js';\nimport type { CommandFileObject, ReloadOptions } from '../../../types';\n\nimport colors from '../../../utils/colors';\n\ntype LoadCommandsWithRestProps = {\n /**\n * The main client.\n */\n client: Client;\n\n /**\n * An array of command objects.\n */\n commands: CommandFileObject[];\n\n /**\n * An array of developer guild IDs.\n */\n devGuildIds: string[];\n\n /**\n * A boolean indicating whether these commands are reloading.\n */\n reloading?: boolean;\n\n /**\n * A type for reloading the commands (if this is reloading).\n */\n type?: ReloadOptions;\n};\n\n/**\n * Use REST to load commands.\n * @param props - Options for loading commands.\n */\nexport default async function loadCommandsWithRest(\nprops: LoadCommandsWithRestProps)\n{\n if (props.reloading) {\n if (props.client.isReady()) {\n await handleLoading(\n props.client,\n props.commands,\n props.devGuildIds,\n props.reloading,\n props.type\n );\n } else {\n throw new Error(\n colors.red(`Cannot reload commands when client is not ready.`)\n );\n }\n } else {\n props.client.once('ready', async (c) => {\n await handleLoading(\n c,\n props.commands,\n props.devGuildIds,\n props.reloading,\n props.type\n );\n });\n }\n}\n\n/**\n * Handles loading commands.\n * @param client - The discord.js client instance.\n * @param commands - An array of command file objects.\n * @param devGuildIds - An array of developer guild IDs.\n * @param reloading - A boolean indicating whether this is reloading.\n * @param type - A type for reloading the commands (if this is reloading).\n */\nasync function handleLoading(\nclient: Client<true>,\ncommands: CommandFileObject[],\ndevGuildIds: string[],\nreloading?: boolean,\ntype?: ReloadOptions)\n{\n commands = commands.filter((cmd) => !cmd.options?.deleted);\n const devOnlyCommands = commands.filter((cmd) => cmd.options?.devOnly);\n const globalCommands = commands.filter((cmd) => !cmd.options?.devOnly);\n\n if (type === 'dev') {\n await loadDevCommands(client, devOnlyCommands, devGuildIds, reloading);\n } else if (type === 'global') {\n await loadGlobalCommands(client, globalCommands, reloading);\n } else {\n await loadDevCommands(client, devOnlyCommands, devGuildIds, reloading);\n await loadGlobalCommands(client, globalCommands, reloading);\n }\n}\n\n/**\n * Load commands globally.\n * @param client - The discord.js client instance.\n * @param commands - An array of command file objects.\n * @param reloading - A boolean indicating whether the commands are reloading.\n */\nasync function loadGlobalCommands(\nclient: Client<true>,\ncommands: CommandFileObject[],\nreloading?: boolean)\n{\n const requestBody = commands.map((cmd) => cmd.data);\n\n await client.application.commands.\n set(requestBody as ApplicationCommandDataResolvable[]).\n catch((error) => {\n throw new Error(\n colors.red(\n `Error ${\n reloading ? 'reloading' : 'loading'} global application commands.\\n`\n\n ),\n error\n );\n });\n\n console.log(\n colors.green(\n `${reloading ? 'Reloaded' : 'Loaded'} ${\n requestBody.length} global commands.`\n\n )\n );\n}\n\n/**\n * Load commands for dev guilds.\n * @param client - The discord.js client instance.\n * @param commands - An array of command file objects.\n * @param guildIds - An array of developer guild IDs.\n * @param reloading - A boolean indicating whether the commands are reloading.\n */\nasync function loadDevCommands(\nclient: Client<true>,\ncommands: CommandFileObject[],\nguildIds: string[],\nreloading?: boolean)\n{\n const requestBody = commands.map((cmd) => cmd.data);\n\n for (const guildId of guildIds) {\n const targetGuild =\n client.guilds.cache.get(guildId) || (await client.guilds.fetch(guildId));\n\n if (!targetGuild) {\n process.emitWarning(\n `Cannot ${\n reloading ? 'reload' : 'load'} commands in guild \"${\n guildId}\" - guild doesn't exist or client isn't part of the guild.`\n );\n\n continue;\n }\n\n await targetGuild.commands.\n set(requestBody as ApplicationCommandDataResolvable[]).\n catch((error) => {\n throw new Error(\n colors.red(\n `Error ${\n reloading ? 'reloading' : 'loading'} developer application commands in guild \"${\n\n targetGuild?.name || guildId}\".\\n`\n\n ),\n error\n );\n });\n\n console.log(\n colors.green(\n `${reloading ? 'Reloaded' : 'Loaded'} ${\n requestBody.length} developer commands in guild \"${\n targetGuild.name}\".`\n )\n );\n }\n}","/**\n * Test if two slash commands are different.\n * @param appCommand - The application command.\n * @param localCommand - The local command.\n * @returns A boolean indicating whether these commands are different\n */\nexport default function areSlashCommandsDifferent(\nappCommand: any,\nlocalCommand: any)\n{\n if (!appCommand.options) appCommand.options = [];\n if (!localCommand.options) localCommand.options = [];\n\n if (!appCommand.description) appCommand.description = '';\n if (!localCommand.description) localCommand.description = '';\n\n if (\n localCommand.description !== appCommand.description ||\n localCommand.options.length !== appCommand.options.length)\n {\n return true;\n }\n}","import type {\n Guild,\n Client,\n ApplicationCommandData,\n GuildApplicationCommandManager,\n ApplicationCommandDataResolvable } from\n'discord.js';\nimport type { CommandFileObject, ReloadOptions } from '../../../types';\n\nimport areSlashCommandsDifferent from '../utils/areSlashCommandsDifferent';\n\nimport colors from '../../../utils/colors';\n\ntype RegisterCommandProps = {\n client: Client;\n commands: CommandFileObject[];\n devGuildIds: string[];\n reloading?: boolean;\n type?: ReloadOptions;\n};\n\n/**\n * Register client commands to Discord.\n * @param props\n */\nexport default async function registerCommands(props: RegisterCommandProps) {\n if (props.reloading) {\n if (props.client.isReady()) {\n await handleRegistration(\n props.client,\n props.commands,\n props.devGuildIds,\n props.type\n );\n } else {\n throw new Error(\n colors.red(`Cannot reload commands when client is not ready.`)\n );\n }\n } else {\n props.client.once('ready', async (c) => {\n await handleRegistration(\n c,\n props.commands,\n props.devGuildIds,\n props.type\n );\n });\n }\n}\n\nasync function handleRegistration(\nclient: Client<true>,\ncommands: CommandFileObject[],\ndevGuildIds: string[],\ntype?: ReloadOptions)\n{\n const devOnlyCommands = commands.filter((cmd) => cmd.options?.devOnly);\n const globalCommands = commands.filter((cmd) => !cmd.options?.devOnly);\n\n if (type === 'dev') {\n await registerDevCommands(client, devOnlyCommands, devGuildIds);\n } else if (type === 'global') {\n await registerGlobalCommands(client, globalCommands);\n } else {\n await registerDevCommands(client, devOnlyCommands, devGuildIds);\n await registerGlobalCommands(client, globalCommands);\n }\n}\n\nasync function registerGlobalCommands(\nclient: Client<true>,\ncommands: CommandFileObject[])\n{\n const appCommandsManager = client.application.commands;\n await appCommandsManager.fetch();\n\n for (const command of commands) {\n const targetCommand = appCommandsManager.cache.find(\n (cmd) => cmd.name === command.data.name\n );\n\n // <!-- Delete global command -->\n if (command.options?.deleted) {\n if (!targetCommand) {\n process.emitWarning(\n colors.yellow(\n `Ignoring: Command \"${command.data.name}\" is globally marked as deleted.`\n )\n );\n } else {\n await targetCommand.delete().catch((error) => {\n throw new Error(\n colors.red(\n `Failed to delete command \"${command.data.name}\" globally.\\n`\n ),\n error\n );\n });\n\n console.log(\n colors.green(`Deleted command \"${command.data.name}\" globally.`)\n );\n }\n\n continue;\n }\n\n // <!-- Edit global command -->\n if (targetCommand) {\n const commandsAreDifferent = areSlashCommandsDifferent(\n targetCommand,\n command.data\n );\n\n if (commandsAreDifferent) {\n await targetCommand.\n edit(command.data as Partial<ApplicationCommandData>).\n catch((error) => {\n throw new Error(\n colors.red(\n `Failed to edit command \"${command.data.name}\" globally.\\n`\n ),\n error\n );\n });\n\n console.log(\n colors.green(`Edited command \"${command.data.name}\" globally.`)\n );\n\n continue;\n }\n }\n\n // <!-- Register global command -->\n if (targetCommand) continue;\n\n await appCommandsManager.\n create(command.data as ApplicationCommandDataResolvable).\n catch((error) => {\n throw new Error(\n colors.red(\n `Failed to register command \"${command.data.name}\" globally.\\n`\n ),\n error\n );\n });\n\n console.log(\n colors.green(`Registered command \"${command.data.name}\" globally.`)\n );\n }\n}\n\nasync function registerDevCommands(\nclient: Client<true>,\ncommands: CommandFileObject[],\nguildIds: string[])\n{\n const devGuilds: Guild[] = [];\n\n for (const guildId of guildIds) {\n const guild =\n client.guilds.cache.get(guildId) || (await client.guilds.fetch(guildId));\n\n if (!guild) {\n process.emitWarning(\n colors.yellow(\n `Ignoring: Guild ${guildId} doesn't exist or client isn't part of the guild.`\n )\n );\n continue;\n }\n\n devGuilds.push(guild);\n }\n\n const guildCommandsManagers: GuildApplicationCommandManager[] = [];\n\n for (const guild of devGuilds) {\n const guildCommandsManager = guild.commands;\n await guildCommandsManager.fetch();\n\n guildCommandsManagers.push(guildCommandsManager);\n }\n\n for (const command of commands) {\n for (const guildCommands of guildCommandsManagers) {\n const targetCommand = guildCommands.cache.find(\n (cmd) => cmd.name === command.data.name\n );\n\n // <!-- Delete dev command -->\n if (command.options?.deleted) {\n if (!targetCommand) {\n process.emitWarning(\n colors.yellow(\n `Ignoring: Command \"${command.data.name}\" is marked as deleted in ${guildCommands.guild.name}.`\n )\n );\n } else {\n await targetCommand.delete().catch((error) => {\n throw new Error(\n colors.red(\n `Failed to delete command \"${command.data.name}\" in ${guildCommands.guild.name}.`\n ),\n error\n );\n });\n\n console.log(\n colors.green(\n `Deleted command \"${command.data.name}\" in ${guildCommands.guild.name}.`\n )\n );\n }\n\n continue;\n }\n\n // <!-- Edit dev command -->\n if (targetCommand) {\n const commandsAreDifferent = areSlashCommandsDifferent(\n targetCommand,\n command.data\n );\n\n if (commandsAreDifferent) {\n await targetCommand.\n edit(command.data as Partial<ApplicationCommandData>).\n catch((error) => {\n throw new Error(\n colors.red(\n `Failed to edit command \"${command.data.name}\" in ${guildCommands.guild.name}.\\n`\n ),\n error\n );\n });\n\n console.log(\n colors.green(\n `Edited command \"${command.data.name}\" in ${guildCommands.guild.name}.`\n )\n );\n\n continue;\n }\n }\n\n // <!-- Register guild command -->\n if (targetCommand) continue;\n\n await guildCommands.\n create(command.data as ApplicationCommandDataResolvable).\n catch((error) => {\n throw new Error(\n colors.red(\n `Failed to register command \"${command.data.name}\" in ${guildCommands.guild.name}.\\n`\n ),\n error\n );\n });\n\n console.log(\n colors.green(\n `Registered command \"${command.data.name}\" in ${guildCommands.guild.name}.`\n )\n );\n }\n }\n}","import type { BuiltInValidationParams } from '../typings';\n\nexport default function ({\n interaction,\n targetCommand,\n handlerData\n}: BuiltInValidationParams) {\n if (interaction.isAutocomplete()) return;\n\n if (targetCommand.options?.devOnly) {\n if (\n interaction.inGuild() &&\n !handlerData.devGuildIds.includes(interaction.guildId))\n {\n interaction.reply({\n content: '❌ This command can only be used inside development servers.',\n ephemeral: true\n });\n\n return true;\n }\n\n const guildMember = interaction.guild?.members.cache.get(\n interaction.user.id\n );\n const memberRoles = guildMember?.roles.cache;\n\n let hasDevRole = false;\n\n memberRoles?.forEach((role) => {\n if (handlerData.devRoleIds.includes(role.id)) {\n hasDevRole = true;\n }\n });\n\n const isDevUser =\n handlerData.devUserIds.includes(interaction.user.id) || hasDevRole;\n\n if (!isDevUser) {\n interaction.reply({\n content: '❌ This command can only be used by developers.',\n ephemeral: true\n });\n\n return true;\n }\n }\n}","import type { BuiltInValidationParams } from '../typings';\nimport { EmbedBuilder } from 'discord.js';\n\nexport default function ({\n interaction,\n targetCommand\n}: BuiltInValidationParams) {\n if (interaction.isAutocomplete()) return;\n const userPermissions = interaction.memberPermissions;\n let userPermissionsRequired = targetCommand.options?.userPermissions;\n let missingUserPermissions: string[] = [];\n\n if (typeof userPermissionsRequired === 'string') {\n userPermissionsRequired = [userPermissionsRequired];\n }\n\n const botPermissions = interaction.guild?.members.me?.permissions;\n let botPermissionsRequired = targetCommand.options?.botPermissions;\n let missingBotPermissions: string[] = [];\n\n if (typeof botPermissionsRequired === 'string') {\n botPermissionsRequired = [botPermissionsRequired];\n }\n\n if (!userPermissionsRequired?.length && !botPermissionsRequired?.length) {\n return;\n }\n\n if (userPermissions && userPermissionsRequired) {\n for (const permission of userPermissionsRequired) {\n const hasPermission = userPermissions.has(permission);\n\n if (!hasPermission) {\n missingUserPermissions.push(permission);\n }\n }\n }\n\n if (botPermissions && botPermissionsRequired) {\n for (const permission of botPermissionsRequired) {\n const hasPermission = botPermissions.has(permission);\n\n if (!hasPermission) {\n missingBotPermissions.push(permission);\n }\n }\n }\n\n if (!missingUserPermissions.length && !missingBotPermissions.length) {\n return;\n }\n\n // Fix casing. e.g. KickMembers -> Kick Members\n const pattern = /([a-z])([A-Z])|([A-Z]+)([A-Z][a-z])/g;\n\n missingUserPermissions = missingUserPermissions.map((str) =>\n str.replace(pattern, '$1$3 $2$4')\n );\n missingBotPermissions = missingBotPermissions.map((str) =>\n str.replace(pattern, '$1$3 $2$4')\n );\n\n let embedDescription = '';\n\n const formatter = new Intl.ListFormat('en', {\n style: 'long',\n type: 'conjunction'\n });\n\n const getPermissionWord = (permissions: string[]) =>\n permissions.length === 1 ? 'permission' : 'permissions';\n\n if (missingUserPermissions.length) {\n const formattedPermissions = missingUserPermissions.map((p) => `\\`${p}\\``);\n const permissionsString = formatter.format(formattedPermissions);\n\n embedDescription += `- You must have the ${permissionsString} ${getPermissionWord(\n missingUserPermissions\n )} to be able to run this command.\\n`;\n }\n\n if (missingBotPermissions.length) {\n const formattedPermissions = missingBotPermissions.map((p) => `\\`${p}\\``);\n const permissionsString = formatter.format(formattedPermissions);\n\n embedDescription += `- I must have the ${permissionsString} ${getPermissionWord(\n missingBotPermissions\n )} to be able to execute this command.\\n`;\n }\n\n const embed = new EmbedBuilder().\n setTitle(`:x: Missing permissions!`).\n setDescription(embedDescription).\n setColor('Red');\n\n interaction.reply({ embeds: [embed], ephemeral: true });\n return true;\n}","import devOnly from './devOnly';\nimport permissions from './permissions';\n\nexport default [devOnly, permissions];","import { randomUUID } from 'node:crypto';\nimport { CommandKit } from '../CommandKit';\nimport { GenericFunction, getContext } from './async-context';\n\nexport interface CommandKitEnvironmentInternalData {\n executionError: Error | null;\n type: CommandKitEnvironmentType | null;\n variables: Map<string, any>;\n deferredFunctions: Map<string, GenericFunction<[CommandKitEnvironment]>>;\n marker: string;\n markStart: number;\n markEnd: number;\n}\n\nexport class CommandKitEnvironment {\n #data: CommandKitEnvironmentInternalData = {\n executionError: null,\n type: null,\n variables: new Map(),\n deferredFunctions: new Map(),\n marker: '',\n markStart: 0,\n markEnd: 0\n };\n\n /**\n * Creates the commandkit execution environment.\n * @param commandkit - The commandkit instance.\n */\n public constructor(public readonly commandkit: CommandKit) {}\n\n /**\n * Get the execution error.\n * @internal\n */\n public getExecutionError(): Error | null {\n return this.#data.executionError;\n }\n\n /**\n * Set the execution error.\n * @param error - The error to set.\n * @internal\n */\n public setExecutionError(error: Error): void {\n if (this.#data.executionError) {\n throw new Error('Execution error already set.');\n }\n\n this.#data.executionError = error;\n }\n\n /**\n * Get the environment type.\n */\n public getType(): CommandKitEnvironmentType {\n const type = this.#data.type;\n\n if (!type) {\n throw new Error('Environment type not set.');\n }\n\n return type;\n }\n\n /**\n * Set the environment type.\n * @param type - The environment type to set.\n * @internal\n */\n public setType(type: CommandKitEnvironmentType): void {\n this.#data.type = type;\n }\n\n /**\n * The variables store for this environment.\n */\n public get variables(): Map<string, any> {\n return this.#data.variables;\n }\n\n /**\n * Register a deferred function.\n * @param fn - The deferred function to register.\n * @returns The deferred function id.\n * @internal\n */\n public registerDeferredFunction(\n fn: GenericFunction<[CommandKitEnvironment]>)\n : string {\n const id = randomUUID();\n this.#data.deferredFunctions.set(id, fn);\n return id;\n }\n\n /**\n * Clear a deferred function by id.\n * @param id - The deferred function id to clear.\n * @internal\n */\n public clearDeferredFunction(id: string): void {\n this.#data.deferredFunctions.delete(id);\n }\n\n /**\n * Run all deferred functions sequentially.\n * @internal\n */\n public async runDeferredFunctions(): Promise<void> {\n for (const [id, fn] of this.#data.deferredFunctions) {\n try {\n await fn(this);\n } catch (e) {\n this.commandkit.emit('unhandledDeferredFunctionRejection', e);\n } finally {\n this.clearDeferredFunction(id);\n }\n }\n }\n\n /**\n * Clear all deferred functions.\n * @internal\n */\n public clearAllDeferredFunctions(): void {\n this.#data.deferredFunctions.clear();\n }\n\n /**\n * Mark the start of a command execution.\n * @param marker - The marker to set.\n * @internal\n */\n public markStart(marker: string): void {\n this.#data.marker = marker;\n this.#data.markStart = performance.now();\n }\n\n /**\n * Mark the end of a command execution.\n * @internal\n */\n public markEnd(): void {\n if (!this.#data.markEnd) this.#data.markEnd = performance.now();\n }\n\n /**\n * Get the marker.\n * @internal\n */\n public getMarker(): string {\n return this.#data.marker;\n }\n\n /**\n * Get the execution time in milliseconds.\n * @internal\n */\n public getExecutionTime(): number {\n return Math.abs(this.#data.markEnd - this.#data.markStart);\n }\n}\n\nexport enum CommandKitEnvironmentType {\n CommandHandler = 'COMMAND_HANDLER',\n}\n\n/**\n * Runs the given function after the current handler has finished executing.\n * @param fn The function to run after the current handler.\n * @returns The deferred function id. This can be used to cancel the deferred function.\n */\nexport function after(fn: GenericFunction<[CommandKitEnvironment]>): string {\n const env = getContext();\n\n if (!env) {\n throw new Error('after must be called inside commandkit handler.');\n }\n\n return env.registerDeferredFunction(fn);\n}\n\n/**\n * Cancels a deferred function registered with `after`.\n * @param id The deferred function id to cancel.\n */\nexport function cancelAfter(id: string): void {\n const env = getContext();\n\n if (!env) {\n throw new Error('cancelAfter must be called inside commandkit handler.');\n }\n\n env.clearDeferredFunction(id);\n}","import { CacheType, Interaction } from 'discord.js';\nimport type {\n CommandData,\n CommandFileObject,\n ReloadOptions } from\n'../../types';\nimport { clone } from '../../utils/clone';\nimport colors from '../../utils/colors';\nimport { getFilePaths } from '../../utils/get-paths';\nimport { toFileURL } from '../../utils/resolve-file-url';\nimport loadCommandsWithRest from './functions/loadCommandsWithRest';\nimport registerCommands from './functions/registerCommands';\nimport type {\n CommandHandlerData,\n CommandHandlerOptions,\n CommandKitInteraction } from\n'./typings';\nimport builtInValidationsFunctions from './validations';\nimport {\n makeContextAwareFunction,\n useEnvironment } from\n'../../context/async-context';\nimport {\n after,\n CommandKitEnvironment,\n CommandKitEnvironmentType } from\n'../../context/environment';\n\nexport interface hCommandContext {\n interaction: CommandKitInteraction;\n command: CommandData;\n}\n\n/**\n * A handler for client application commands.\n */\nexport class CommandHandler {\n #data: CommandHandlerData;\n\n constructor({ ...options }: CommandHandlerOptions) {\n this.#data = {\n ...options,\n builtInValidations: [],\n commands: []\n };\n }\n\n async init() {\n await this.#buildCommands();\n\n this.#buildBuiltInValidations();\n\n const devOnlyCommands = this.#data.commands.filter(\n (cmd) => cmd.options?.devOnly\n );\n\n if (devOnlyCommands.length && !this.#data.devGuildIds.length) {\n process.emitWarning(\n colors.yellow(\n 'You have commands marked as \"devOnly\", but \"devGuildIds\" have not been set.'\n )\n );\n }\n\n if (\n devOnlyCommands.length &&\n !this.#data.devUserIds.length &&\n !this.#data.devRoleIds.length)\n {\n process.emitWarning(\n colors.yellow(\n 'You have commands marked as \"devOnly\", but \"devUserIds\" or \"devRoleIds\" have not been set.'\n )\n );\n }\n\n if (this.#data.bulkRegister) {\n await loadCommandsWithRest({\n client: this.#data.client,\n devGuildIds: this.#data.devGuildIds,\n commands: this.#data.commands\n });\n } else {\n await registerCommands({\n client: this.#data.client,\n devGuildIds: this.#data.devGuildIds,\n commands: this.#data.commands\n });\n }\n\n this.handleCommands();\n }\n\n async #buildCommands() {\n const allowedExtensions = /\\.(js|mjs|cjs|ts)$/i;\n const paths = await getFilePaths(this.#data.commandsPath, true);\n\n const commandFilePaths = paths.filter((path) =>\n allowedExtensions.test(path)\n );\n\n for (const commandFilePath of commandFilePaths) {\n const modulePath = toFileURL(commandFilePath);\n\n const importedObj = await import(`${modulePath}?t=${Date.now()}`);\n let commandObj: CommandFileObject = clone(importedObj); // Make commandObj extensible\n\n // If it's CommonJS, invalidate the import cache\n if (typeof module !== 'undefined' && typeof require !== 'undefined') {\n delete require.cache[require.resolve(commandFilePath)];\n }\n\n const compactFilePath =\n commandFilePath.split(process.cwd())[1] || commandFilePath;\n\n if (commandObj.default)\n commandObj = commandObj.default as CommandFileObject;\n\n // Ensure builder properties\n if (importedObj.default) {\n commandObj.data = importedObj.default.data;\n } else {\n commandObj.data = importedObj.data;\n }\n\n if (!commandObj.data) {\n process.emitWarning(\n colors.yellow(\n `Ignoring: Command file ${compactFilePath} does not export \"data\".`\n )\n );\n continue;\n }\n\n if (!commandObj.data.name) {\n process.emitWarning(\n colors.yellow(\n `Ignoring: Command file ${compactFilePath} does not export \"data.name\".`\n )\n );\n continue;\n }\n\n if (!commandObj.run) {\n process.emitWarning(\n colors.yellow(\n `Ignoring: Command file ${commandObj.data.name} does not export \"run\".`\n )\n );\n continue;\n }\n\n if (typeof commandObj.run !== 'function') {\n process.emitWarning(\n colors.yellow(\n `Ignoring: Command file ${commandObj.data.name} does not export \"run\" as a function.`\n )\n );\n continue;\n }\n\n commandObj.filePath = commandFilePath;\n\n let commandCategory =\n commandFilePath.\n split(this.#data.commandsPath)[1]?.\n replace(/\\\\\\\\|\\\\/g, '/').\n split('/')[1] || null;\n\n if (commandCategory && allowedExtensions.test(commandCategory)) {\n commandObj.category = null;\n } else {\n commandObj.category = commandCategory;\n }\n\n this.#data.commands.push(commandObj);\n }\n }\n\n #buildBuiltInValidations() {\n for (const builtInValidationFunction of builtInValidationsFunctions) {\n this.#data.builtInValidations.push(builtInValidationFunction);\n }\n }\n\n async #commandFinalizer() {\n const env = useEnvironment();\n\n await env.runDeferredFunctions();\n\n // Clear all deferred functions if we somehow missed them\n env.clearAllDeferredFunctions();\n }\n\n async #interactionHandler(interaction: Interaction<CacheType>) {\n if (\n !interaction.isChatInputCommand() &&\n !interaction.isContextMenuCommand() &&\n !interaction.isAutocomplete())\n\n return;\n\n const isAutocomplete = interaction.isAutocomplete();\n\n const targetCommand = this.#data.commands.find(\n (cmd) => cmd.data.name === interaction.commandName\n );\n\n if (!targetCommand) return;\n\n const env = useEnvironment();\n\n env.variables.set('interaction', interaction);\n\n const { data, options, run, autocomplete, ...rest } = targetCommand;\n\n // Skip if autocomplete handler is not defined\n if (isAutocomplete && !autocomplete) return;\n\n const executor = async () => {\n const commandObj = {\n data: targetCommand.data,\n options: targetCommand.options,\n ...rest\n };\n\n if (this.#data.validationHandler) {\n let canRun = true;\n\n for (const validationFunction of this.#data.validationHandler.\n validations) {\n const stopValidationLoop = await validationFunction({\n interaction,\n commandObj,\n client: this.#data.client,\n handler: this.#data.commandkitInstance\n });\n\n if (stopValidationLoop) {\n canRun = false;\n break;\n }\n }\n\n if (!canRun) return;\n }\n\n let canRun = true;\n\n // If custom validations pass and !skipBuiltInValidations, run built-in CommandKit validation functions\n if (!this.#data.skipBuiltInValidations) {\n for (const validation of this.#data.builtInValidations) {\n const stopValidationLoop = validation({\n targetCommand,\n interaction,\n handlerData: this.#data\n });\n\n if (stopValidationLoop) {\n canRun = false;\n break;\n }\n }\n }\n\n if (!canRun) return;\n\n const command = targetCommand[isAutocomplete ? 'autocomplete' : 'run']!;\n\n const context = {\n interaction,\n client: this.#data.client,\n handler: this.#data.commandkitInstance\n };\n\n const shouldDebug = this.#data.commandkitInstance.isDebuggingCommands();\n\n if (!shouldDebug) {\n return command(context);\n }\n\n after((env) => {\n const error = env.getExecutionError();\n const marker = env.getMarker();\n const time = `${env.getExecutionTime().toFixed(2)}ms`;\n const cached = !!env.variables.get('cacheHit');\n const cachedMarker = cached ? ' (cached)' : '';\n\n if (error) {\n console.error(\n colors.red(\n `[${marker} - ${time}]${cachedMarker} Error executing command: ${error}`\n )\n );\n return;\n }\n\n console.log(\n colors.green(\n `[${marker} - ${time}]${cachedMarker} Command executed successfully`\n )\n );\n });\n\n try {\n env.markStart(interaction.commandName);\n const res = await command(context);\n\n return res;\n } finally {\n env.markEnd();\n }\n };\n\n return executor();\n }\n\n handleCommands() {\n this.#data.client.on('interactionCreate', (interaction) => {\n const env = new CommandKitEnvironment(this.#data.commandkitInstance);\n env.setType(CommandKitEnvironmentType.CommandHandler);\n\n return makeContextAwareFunction(\n env,\n this.#interactionHandler.bind(this),\n this.#commandFinalizer.bind(this)\n )(interaction);\n });\n }\n\n get commands() {\n return this.#data.commands;\n }\n\n async reloadCommands(type?: ReloadOptions) {\n if (!this.#data.commandsPath) {\n throw new Error(\n colors.red(\n 'Cannot reload commands as \"commandsPath\" was not provided when instantiating CommandKit.'\n )\n );\n }\n\n this.#data.commands = [];\n\n // Re-build commands tree\n await this.#buildCommands();\n\n if (this.#data.bulkRegister) {\n await loadCommandsWithRest({\n client: this.#data.client,\n devGuildIds: this.#data.devGuildIds,\n commands: this.#data.commands,\n reloading: true,\n type\n });\n } else {\n await registerCommands({\n client: this.#data.client,\n devGuildIds: this.#data.devGuildIds,\n commands: this.#data.commands,\n reloading: true,\n type\n });\n }\n }\n}","import type { EventHandlerOptions, EventHandlerData } from './typings';\nimport type { CommandHandler } from '../command-handler/CommandHandler';\nimport { getFilePaths, getFolderPaths } from '../../utils/get-paths';\nimport { toFileURL } from '../../utils/resolve-file-url';\nimport { clone } from '../../utils/clone';\nimport colors from '../../utils/colors';\n\n/**\n * A handler for client events.\n */\nexport class EventHandler {\n #data: EventHandlerData;\n\n constructor({ ...options }: EventHandlerOptions) {\n this.#data = {\n ...options,\n events: []\n };\n }\n\n async init() {\n await this.#buildEvents();\n this.#registerEvents();\n }\n\n async #buildEvents() {\n const eventFolderPaths = await getFolderPaths(this.#data.eventsPath);\n\n for (const eventFolderPath of eventFolderPaths) {\n const eventName = eventFolderPath.\n replace(/\\\\\\\\|\\\\/g, '/').\n split('/').\n pop() as string;\n\n const allowedExtensions = /\\.(js|mjs|cjs|ts)$/i;\n const eventPaths = await getFilePaths(eventFolderPath, true);\n\n const eventFilePaths = eventPaths.filter((path) =>\n allowedExtensions.test(path)\n );\n\n const eventObj = {\n name: eventName,\n functions: [] as Function[]\n };\n\n this.#data.events.push(eventObj);\n\n for (const eventFilePath of eventFilePaths) {\n const modulePath = toFileURL(eventFilePath);\n\n let importedFunction = (await import(`${modulePath}?t=${Date.now()}`)).\n default;\n let eventFunction = clone(importedFunction);\n\n // If it's CommonJS, invalidate the import cache\n if (typeof module !== 'undefined' && typeof require !== 'undefined') {\n delete require.cache[require.resolve(eventFilePath)];\n }\n\n if (eventFunction?.default) {\n eventFunction = eventFunction.default;\n }\n\n const compactFilePath =\n eventFilePath.split(process.cwd())[1] || eventFilePath;\n\n if (typeof eventFunction !== 'function') {\n process.emitWarning(\n colors.yellow(\n `Ignoring: Event file ${compactFilePath} does not export a function.`\n )\n );\n continue;\n }\n\n eventObj.functions.push(eventFunction);\n }\n }\n }\n\n #registerEvents() {\n const client = this.#data.client;\n const handler = this.#data.commandKitInstance;\n\n for (const eventObj of this.#data.events) {\n client.on(eventObj.name, async (...params) => {\n for (const eventFunction of eventObj.functions) {\n const stopEventLoop = await eventFunction(...params, client, handler);\n\n if (stopEventLoop) {\n break;\n }\n }\n });\n }\n }\n\n get events() {\n return this.#data.events;\n }\n\n async reloadEvents(commandHandler?: CommandHandler) {\n if (!this.#data.eventsPath) {\n throw new Error(\n colors.red(\n 'Cannot reload events as \"eventsPath\" was not provided when instantiating CommandKit.'\n )\n );\n }\n\n this.#data.events = [];\n\n await this.#buildEvents();\n\n this.#data.client.removeAllListeners();\n\n this.#registerEvents();\n\n // Re-register \"interactionCreate\" event for application commands.\n commandHandler?.handleCommands();\n }\n}","import type {\n ValidationHandlerData,\n ValidationHandlerOptions } from\n'./typings';\nimport { toFileURL } from '../../utils/resolve-file-url';\nimport { getFilePaths } from '../../utils/get-paths';\nimport { clone } from '../../utils/clone';\nimport colors from '../../utils/colors';\n\n/**\n * A handler for command validations.\n */\nexport class ValidationHandler {\n #data: ValidationHandlerData;\n\n constructor({ ...options }: ValidationHandlerOptions) {\n this.#data = {\n ...options,\n validations: []\n };\n }\n\n async init() {\n this.#data.validations = await this.#buildValidations();\n }\n\n async #buildValidations() {\n const allowedExtensions = /\\.(js|mjs|cjs|ts)$/i;\n\n const validationPaths = await getFilePaths(\n this.#data.validationsPath,\n true\n );\n const validationFilePaths = validationPaths.filter((path) =>\n allowedExtensions.test(path)\n );\n\n const validationFunctions: Function[] = [];\n\n for (const validationFilePath of validationFilePaths) {\n const modulePath = toFileURL(validationFilePath);\n\n let importedFunction = (await import(`${modulePath}?t=${Date.now()}`)).\n default;\n let validationFunction = clone(importedFunction);\n\n // If it's CommonJS, invalidate the import cache\n if (typeof module !== 'undefined' && typeof require !== 'undefined') {\n delete require.cache[require.resolve(validationFilePath)];\n }\n\n if (validationFunction?.default) {\n validationFunction = validationFunction.default;\n }\n\n const compactFilePath =\n validationFilePath.split(process.cwd())[1] || validationFilePath;\n\n if (typeof validationFunction !== 'function') {\n process.emitWarning(\n colors.yellow(\n `Ignoring: Validation file ${compactFilePath} does not export a function.`\n )\n );\n continue;\n }\n\n validationFunctions.push(validationFunction);\n }\n\n return validationFunctions;\n }\n\n get validations() {\n return this.#data.validations;\n }\n\n async reloadValidations() {\n if (!this.#data.validationsPath) {\n throw new Error(\n colors.red(\n 'Cannot reload validations as \"validationsPath\" was not provided when instantiating CommandKit.'\n )\n );\n }\n\n const newValidations = await this.#buildValidations();\n\n this.#data.validations = newValidations;\n }\n}","export interface CacheEntry {\n key: string;\n value: any;\n ttl?: number;\n}\n\nexport abstract class CacheProvider {\n abstract get(key: string): Promise<CacheEntry | undefined>;\n abstract set(key: string, value: any, ttl?: number): Promise<void>;\n abstract exists(key: string): Promise<boolean>;\n abstract delete(key: string): Promise<void>;\n abstract clear(): Promise<void>;\n abstract expire(key: string, ttl: number): Promise<void>;\n}","import { CacheEntry, CacheProvider } from './CacheProvider';\n\nexport class MemoryCache extends CacheProvider {\n #cache = new Map<string, CacheEntry>();\n\n public async get<T>(key: string): Promise<T | undefined> {\n const entry = this.#cache.get(key);\n\n if (!entry) {\n return undefined;\n }\n\n if (entry.ttl && Date.now() > entry.ttl) {\n this.#cache.delete(key);\n return undefined;\n }\n\n return entry.value;\n }\n\n public async set<T>(key: string, value: T, ttl?: number): Promise<void> {\n this.#cache.set(key, {\n key,\n value,\n ttl: ttl != null ? Date.now() + ttl : undefined\n });\n }\n\n public async exists(key: string): Promise<boolean> {\n return this.#cache.has(key);\n }\n\n public async delete(key: string): Promise<void> {\n this.#cache.delete(key);\n }\n\n public async clear(): Promise<void> {\n this.#cache.clear();\n }\n\n public async expire(key: string, ttl: number): Promise<void> {\n const entry = this.#cache.get(key);\n\n if (!entry) return;\n\n const _ttl = Date.now() + ttl;\n\n // delete if _ttl is in the past\n if (_ttl < Date.now()) {\n this.#cache.delete(key);\n return;\n }\n\n entry.ttl = _ttl;\n }\n}","export const COMMANDKIT_CACHE_TAG = Symbol('kCommandKitCacheTag');","import colors from './colors';\n\nconst WARNED_KEYS = new Set<string>();\n\nexport function warnUnstable(name: string) {\n if (WARNED_KEYS.has(name)) return;\n\n WARNED_KEYS.add(name);\n\n process.emitWarning(\n `${name} is unstable and may change in future versions.`,\n {\n code: 'CommandKitUnstableWarning'\n }\n );\n}"],"mappings":"q+BAAA,4VCAA,4BAAkC,uBCA3B,IAAM,qBAAuB,CAClC,mBAAoB,OAAO,qBAAqB,EAChD,gBAAiB,OAAO,kBAAkB,CAC5C,EAEO,SAAS,kBAChB,MACmC,CACjC,GAAI,EAAE,iBAAiB,OAAQ,MAAO,GACtC,IAAM,KAAO,QAAQ,IAAI,MAAO,MAAM,EAEtC,QAAW,OAAO,qBAChB,GAAI,qBAAqB,GAAwC,IAAM,KACvE,MAAO,GAGT,MAAO,EACT,CAZgB,8CCLhB,uBAAyB,2BCAzB,gBAAiB,yBAEJ,SAAQ,YAAAA,SAAK,ECF1B,IAAM,WAAa,UAEZ,eAAQ,CACb,MAAO,OAAC,MAAiB,GAAG,IAAI,GAAG,UAAU,GAAtC,SACP,OAAQ,OAAC,MAAiB,UAAU,IAAI,GAAG,UAAU,GAA7C,UACR,IAAK,OAAC,MAAiB,UAAU,IAAI,GAAG,UAAU,GAA7C,OACL,WAAY,OAAC,MAAiB,UAAU,IAAI,GAAG,UAAU,GAA7C,cACZ,MAAO,OAAC,MAAiB,UAAU,IAAI,GAAG,UAAU,GAA7C,SACP,QAAS,OAAC,MAAiB,UAAU,IAAI,GAAG,UAAU,GAA7C,WACT,OAAQ,OAAC,MAAiB,UAAU,IAAI,GAAG,UAAU,GAA7C,UAER,MAAO,OAAC,MAAiB,WAAW,IAAI,GAAG,UAAU,GAA9C,SACP,IAAK,OAAC,MAAiB,WAAW,IAAI,GAAG,UAAU,GAA9C,OACL,MAAO,OAAC,MAAiB,WAAW,IAAI,GAAG,UAAU,GAA9C,SACP,OAAQ,OAAC,MAAiB,WAAW,IAAI,GAAG,UAAU,GAA9C,UACR,KAAM,OAAC,MAAiB,WAAW,IAAI,GAAG,UAAU,GAA9C,QACN,QAAS,OAAC,MAAiB,WAAW,IAAI,GAAG,UAAU,GAA9C,WACT,KAAM,OAAC,MAAiB,WAAW,IAAI,GAAG,UAAU,GAA9C,QACN,MAAO,OAAC,MAAiB,WAAW,IAAI,GAAG,UAAU,GAA9C,SAEP,QAAS,OAAC,MAAiB,WAAW,IAAI,GAAG,UAAU,GAA9C,WACT,MAAO,OAAC,MAAiB,WAAW,IAAI,GAAG,UAAU,GAA9C,SACP,QAAS,OAAC,MAAiB,WAAW,IAAI,GAAG,UAAU,GAA9C,WACT,SAAU,OAAC,MAAiB,WAAW,IAAI,GAAG,UAAU,GAA9C,YACV,OAAQ,OAAC,MAAiB,WAAW,IAAI,GAAG,UAAU,GAA9C,UACR,UAAW,OAAC,MAAiB,WAAW,IAAI,GAAG,UAAU,GAA9C,aACX,OAAQ,OAAC,MAAiB,WAAW,IAAI,GAAG,UAAU,GAA9C,UACR,QAAS,OAAC,MAAiB,WAAW,IAAI,GAAG,UAAU,GAA9C,UACX,EC5BA,gBAAiB,yBACjB,gBAAe,gCAEf,eAAsB,aACtB,UACA,QACoB,CAClB,IAAI,UAAsB,CAAC,EAE3B,GAAI,CAAC,UAAW,OAAO,UAEvB,IAAM,MAAQ,MAAM,gBAAAC,QAAG,QAAQ,UAAW,CAAE,cAAe,EAAK,CAAC,EAEjE,QAAW,QAAQ,MAAO,CACxB,IAAM,SAAW,YAAAC,QAAK,KAAK,UAAW,KAAK,IAAI,EAE3C,KAAK,OAAO,GACd,UAAU,KAAK,QAAQ,EAGrB,SAAW,KAAK,YAAY,IAC9B,UAAY,CAAC,GAAG,UAAW,GAAI,MAAM,aAAa,SAAU,EAAI,CAAE,EAEtE,CAEA,OAAO,SACT,CAvBsB,oCAyBtB,eAAsB,eACtB,UACA,QACoB,CAClB,IAAI,YAAwB,CAAC,EAE7B,GAAI,CAAC,UAAW,OAAO,YAEvB,IAAM,QAAU,MAAM,gBAAAD,QAAG,QAAQ,UAAW,CAAE,cAAe,EAAK,CAAC,EAEnE,QAAW,UAAU,QAAS,CAC5B,IAAM,WAAa,YAAAC,QAAK,KAAK,UAAW,OAAO,IAAI,EAE/C,OAAO,YAAY,IACrB,YAAY,KAAK,UAAU,EAEvB,UACF,YAAc,CACd,GAAG,YACH,GAAI,MAAM,eAAe,WAAY,EAAI,CAAE,GAIjD,CAEA,OAAO,WACT,CA1BsB,wCC5BtB,IAAAC,aAAiB,yBAOV,SAAS,UAAU,SAAkB,CAE1C,MAAO,UADc,aAAAC,QAAK,QAAQ,QAAQ,EACV,QAAQ,WAAY,GAAG,CACzD,CAHgB,8BC6BhB,eAAO,qBACP,MACA,CACE,GAAI,MAAM,UACR,GAAI,MAAM,OAAO,QAAQ,EACvB,MAAM,cACJ,MAAM,OACN,MAAM,SACN,MAAM,YACN,MAAM,UACN,MAAM,IACR,MAEA,OAAM,IAAI,MACR,eAAO,IAAI,kDAAkD,CAC/D,OAGF,MAAM,OAAO,KAAK,QAAS,MAAO,GAAM,CACtC,MAAM,cACJ,EACA,MAAM,SACN,MAAM,YACN,MAAM,UACN,MAAM,IACR,CACF,CAAC,CAEL,CA5B8B,oDAsC9B,eAAe,cACf,OACA,SACA,YACA,UACA,KACA,CACE,SAAW,SAAS,OAAQ,KAAQ,CAAC,IAAI,SAAS,OAAO,EACzD,IAAM,gBAAkB,SAAS,OAAQ,KAAQ,IAAI,SAAS,OAAO,EAC/D,eAAiB,SAAS,OAAQ,KAAQ,CAAC,IAAI,SAAS,OAAO,EAEjE,OAAS,MACX,MAAM,gBAAgB,OAAQ,gBAAiB,YAAa,SAAS,EAC5D,OAAS,SAClB,MAAM,mBAAmB,OAAQ,eAAgB,SAAS,GAE1D,MAAM,gBAAgB,OAAQ,gBAAiB,YAAa,SAAS,EACrE,MAAM,mBAAmB,OAAQ,eAAgB,SAAS,EAE9D,CAnBe,sCA2Bf,eAAe,mBACf,OACA,SACA,UACA,CACE,IAAM,YAAc,SAAS,IAAK,KAAQ,IAAI,IAAI,EAElD,MAAM,OAAO,YAAY,SACzB,IAAI,WAAiD,EACrD,MAAO,OAAU,CACf,MAAM,IAAI,MACR,eAAO,IACL,SACA,UAAY,YAAc,SAAS;AAAA,CAErC,EACA,KACF,CACF,CAAC,EAED,QAAQ,IACN,eAAO,MACL,GAAG,UAAY,WAAa,QAAQ,IACpC,YAAY,MAAM,mBAEpB,CACF,CACF,CA3Be,gDAoCf,eAAe,gBACf,OACA,SACA,SACA,UACA,CACE,IAAM,YAAc,SAAS,IAAK,KAAQ,IAAI,IAAI,EAElD,QAAW,WAAW,SAAU,CAC9B,IAAM,YACN,OAAO,OAAO,MAAM,IAAI,OAAO,GAAM,MAAM,OAAO,OAAO,MAAM,OAAO,EAEtE,GAAI,CAAC,YAAa,CAChB,QAAQ,YACN,UACA,UAAY,SAAW,MAAM,uBAC7B,OAAO,4DACT,EAEA,QACF,CAEA,MAAM,YAAY,SAClB,IAAI,WAAiD,EACrD,MAAO,OAAU,CACf,MAAM,IAAI,MACR,eAAO,IACL,SACA,UAAY,YAAc,SAAS,6CAEnC,aAAa,MAAQ,OAAO;AAAA,CAE9B,EACA,KACF,CACF,CAAC,EAED,QAAQ,IACN,eAAO,MACL,GAAG,UAAY,WAAa,QAAQ,IACpC,YAAY,MAAM,iCAClB,YAAY,IAAI,IAClB,CACF,CACF,CACF,CA7Ce,0CCnIA,SAAR,0BACP,WACA,aACA,CAOE,GANK,WAAW,UAAS,WAAW,QAAU,CAAC,GAC1C,aAAa,UAAS,aAAa,QAAU,CAAC,GAE9C,WAAW,cAAa,WAAW,YAAc,IACjD,aAAa,cAAa,aAAa,YAAc,IAG1D,aAAa,cAAgB,WAAW,aACxC,aAAa,QAAQ,SAAW,WAAW,QAAQ,OAEjD,MAAO,EAEX,CAhBwB,8DCmBxB,eAAO,iBAAwC,MAA6B,CAC1E,GAAI,MAAM,UACR,GAAI,MAAM,OAAO,QAAQ,EACvB,MAAM,mBACJ,MAAM,OACN,MAAM,SACN,MAAM,YACN,MAAM,IACR,MAEA,OAAM,IAAI,MACR,eAAO,IAAI,kDAAkD,CAC/D,OAGF,MAAM,OAAO,KAAK,QAAS,MAAO,GAAM,CACtC,MAAM,mBACJ,EACA,MAAM,SACN,MAAM,YACN,MAAM,IACR,CACF,CAAC,CAEL,CAxB8B,4CA0B9B,eAAe,mBACf,OACA,SACA,YACA,KACA,CACE,IAAM,gBAAkB,SAAS,OAAQ,KAAQ,IAAI,SAAS,OAAO,EAC/D,eAAiB,SAAS,OAAQ,KAAQ,CAAC,IAAI,SAAS,OAAO,EAEjE,OAAS,MACX,MAAM,oBAAoB,OAAQ,gBAAiB,WAAW,EACrD,OAAS,SAClB,MAAM,uBAAuB,OAAQ,cAAc,GAEnD,MAAM,oBAAoB,OAAQ,gBAAiB,WAAW,EAC9D,MAAM,uBAAuB,OAAQ,cAAc,EAEvD,CAjBe,gDAmBf,eAAe,uBACf,OACA,SACA,CACE,IAAM,mBAAqB,OAAO,YAAY,SAC9C,MAAM,mBAAmB,MAAM,EAE/B,QAAW,WAAW,SAAU,CAC9B,IAAM,cAAgB,mBAAmB,MAAM,KAC5C,KAAQ,IAAI,OAAS,QAAQ,KAAK,IACrC,EAGA,GAAI,QAAQ,SAAS,QAAS,CACvB,eAOH,MAAM,cAAc,OAAO,EAAE,MAAO,OAAU,CAC5C,MAAM,IAAI,MACR,eAAO,IACL,6BAA6B,QAAQ,KAAK,IAAI;AAAA,CAChD,EACA,KACF,CACF,CAAC,EAED,QAAQ,IACN,eAAO,MAAM,oBAAoB,QAAQ,KAAK,IAAI,aAAa,CACjE,GAjBA,QAAQ,YACN,eAAO,OACL,sBAAsB,QAAQ,KAAK,IAAI,kCACzC,CACF,EAgBF,QACF,CAGA,GAAI,eAC2B,0BAC3B,cACA,QAAQ,IACV,EAE0B,CACxB,MAAM,cACN,KAAK,QAAQ,IAAuC,EACpD,MAAO,OAAU,CACf,MAAM,IAAI,MACR,eAAO,IACL,2BAA2B,QAAQ,KAAK,IAAI;AAAA,CAC9C,EACA,KACF,CACF,CAAC,EAED,QAAQ,IACN,eAAO,MAAM,mBAAmB,QAAQ,KAAK,IAAI,aAAa,CAChE,EAEA,QACF,CAIE,gBAEJ,MAAM,mBACN,OAAO,QAAQ,IAAwC,EACvD,MAAO,OAAU,CACf,MAAM,IAAI,MACR,eAAO,IACL,+BAA+B,QAAQ,KAAK,IAAI;AAAA,CAClD,EACA,KACF,CACF,CAAC,EAED,QAAQ,IACN,eAAO,MAAM,uBAAuB,QAAQ,KAAK,IAAI,aAAa,CACpE,EACF,CACF,CAnFe,wDAqFf,eAAe,oBACf,OACA,SACA,SACA,CACE,IAAM,UAAqB,CAAC,EAE5B,QAAW,WAAW,SAAU,CAC9B,IAAM,MACN,OAAO,OAAO,MAAM,IAAI,OAAO,GAAM,MAAM,OAAO,OAAO,MAAM,OAAO,EAEtE,GAAI,CAAC,MAAO,CACV,QAAQ,YACN,eAAO,OACL,mBAAmB,OAAO,mDAC5B,CACF,EACA,QACF,CAEA,UAAU,KAAK,KAAK,CACtB,CAEA,IAAM,sBAA0D,CAAC,EAEjE,QAAW,SAAS,UAAW,CAC7B,IAAM,qBAAuB,MAAM,SACnC,MAAM,qBAAqB,MAAM,EAEjC,sBAAsB,KAAK,oBAAoB,CACjD,CAEA,QAAW,WAAW,SACpB,QAAW,iBAAiB,sBAAuB,CACjD,IAAM,cAAgB,cAAc,MAAM,KACvC,KAAQ,IAAI,OAAS,QAAQ,KAAK,IACrC,EAGA,GAAI,QAAQ,SAAS,QAAS,CACvB,eAOH,MAAM,cAAc,OAAO,EAAE,MAAO,OAAU,CAC5C,MAAM,IAAI,MACR,eAAO,IACL,6BAA6B,QAAQ,KAAK,IAAI,QAAQ,cAAc,MAAM,IAAI,GAChF,EACA,KACF,CACF,CAAC,EAED,QAAQ,IACN,eAAO,MACL,oBAAoB,QAAQ,KAAK,IAAI,QAAQ,cAAc,MAAM,IAAI,GACvE,CACF,GAnBA,QAAQ,YACN,eAAO,OACL,sBAAsB,QAAQ,KAAK,IAAI,6BAA6B,cAAc,MAAM,IAAI,GAC9F,CACF,EAkBF,QACF,CAGA,GAAI,eAC2B,0BAC3B,cACA,QAAQ,IACV,EAE0B,CACxB,MAAM,cACN,KAAK,QAAQ,IAAuC,EACpD,MAAO,OAAU,CACf,MAAM,IAAI,MACR,eAAO,IACL,2BAA2B,QAAQ,KAAK,IAAI,QAAQ,cAAc,MAAM,IAAI;AAAA,CAC9E,EACA,KACF,CACF,CAAC,EAED,QAAQ,IACN,eAAO,MACL,mBAAmB,QAAQ,KAAK,IAAI,QAAQ,cAAc,MAAM,IAAI,GACtE,CACF,EAEA,QACF,CAIE,gBAEJ,MAAM,cACN,OAAO,QAAQ,IAAwC,EACvD,MAAO,OAAU,CACf,MAAM,IAAI,MACR,eAAO,IACL,+BAA+B,QAAQ,KAAK,IAAI,QAAQ,cAAc,MAAM,IAAI;AAAA,CAClF,EACA,KACF,CACF,CAAC,EAED,QAAQ,IACN,eAAO,MACL,uBAAuB,QAAQ,KAAK,IAAI,QAAQ,cAAc,MAAM,IAAI,GAC1E,CACF,EACF,CAEJ,CApHe,kDCzJA,SAAR,gBAAkB,CACvB,YACA,cACA,WACF,EAA4B,CAC1B,GAAI,aAAY,eAAe,GAE3B,cAAc,SAAS,QAAS,CAClC,GACA,YAAY,QAAQ,GACpB,CAAC,YAAY,YAAY,SAAS,YAAY,OAAO,EAEnD,mBAAY,MAAM,CAChB,QAAS,mEACT,UAAW,EACb,CAAC,EAEM,GAMT,IAAM,YAHc,YAAY,OAAO,QAAQ,MAAM,IACnD,YAAY,KAAK,EACnB,GACiC,MAAM,MAEnC,WAAa,GAWjB,GATA,aAAa,QAAS,MAAS,CACzB,YAAY,WAAW,SAAS,KAAK,EAAE,IACzC,WAAa,GAEjB,CAAC,EAKG,EAFJ,YAAY,WAAW,SAAS,YAAY,KAAK,EAAE,GAAK,YAGtD,mBAAY,MAAM,CAChB,QAAS,sDACT,UAAW,EACb,CAAC,EAEM,EAEX,CACF,CA7CO,kCCDP,mBAA6B,sBAEd,SAAR,oBAAkB,CACvB,YACA,aACF,EAA4B,CAC1B,GAAI,YAAY,eAAe,EAAG,OAClC,IAAM,gBAAkB,YAAY,kBAChC,wBAA0B,cAAc,SAAS,gBACjD,uBAAmC,CAAC,EAEpC,OAAO,yBAA4B,WACrC,wBAA0B,CAAC,uBAAuB,GAGpD,IAAM,eAAiB,YAAY,OAAO,QAAQ,IAAI,YAClD,uBAAyB,cAAc,SAAS,eAChD,sBAAkC,CAAC,EAMvC,GAJI,OAAO,wBAA2B,WACpC,uBAAyB,CAAC,sBAAsB,GAG9C,CAAC,yBAAyB,QAAU,CAAC,wBAAwB,OAC/D,OAGF,GAAI,iBAAmB,wBACrB,QAAW,cAAc,wBACD,gBAAgB,IAAI,UAAU,GAGlD,uBAAuB,KAAK,UAAU,EAK5C,GAAI,gBAAkB,uBACpB,QAAW,cAAc,uBACD,eAAe,IAAI,UAAU,GAGjD,sBAAsB,KAAK,UAAU,EAK3C,GAAI,CAAC,uBAAuB,QAAU,CAAC,sBAAsB,OAC3D,OAIF,IAAM,QAAU,uCAEhB,uBAAyB,uBAAuB,IAAK,KACrD,IAAI,QAAQ,QAAS,WAAW,CAChC,EACA,sBAAwB,sBAAsB,IAAK,KACnD,IAAI,QAAQ,QAAS,WAAW,CAChC,EAEA,IAAI,iBAAmB,GAEjB,UAAY,IAAI,KAAK,WAAW,KAAM,CAC1C,MAAO,OACP,KAAM,aACR,CAAC,EAEK,kBAAoB,OAAC,aAC3B,YAAY,SAAW,EAAI,aAAe,cADhB,qBAG1B,GAAI,uBAAuB,OAAQ,CACjC,IAAM,qBAAuB,uBAAuB,IAAK,GAAM,KAAK,CAAC,IAAI,EACnE,kBAAoB,UAAU,OAAO,oBAAoB,EAE/D,kBAAoB,uBAAuB,iBAAiB,IAAI,kBAC9D,sBACF,CAAC;AAAA,CACH,CAEA,GAAI,sBAAsB,OAAQ,CAChC,IAAM,qBAAuB,sBAAsB,IAAK,GAAM,KAAK,CAAC,IAAI,EAClE,kBAAoB,UAAU,OAAO,oBAAoB,EAE/D,kBAAoB,qBAAqB,iBAAiB,IAAI,kBAC5D,qBACF,CAAC;AAAA,CACH,CAEA,IAAM,MAAQ,IAAI,4BAAa,EAC/B,SAAS,0BAA0B,EACnC,eAAe,gBAAgB,EAC/B,SAAS,KAAK,EAEd,mBAAY,MAAM,CAAE,OAAQ,CAAC,KAAK,EAAG,UAAW,EAAK,CAAC,EAC/C,EACT,CA9FO,sCCAP,IAAO,oBAAQ,CAAC,gBAAS,mBAAW,ECHpC,uBAA2B,kBAcpB,IAAM,sBAAN,KAA4B,CAe1B,YAA4B,WAAwB,CAAxB,0BAAyB,CA7B9D,MAcmC,sCACjC,MAA2C,CACzC,eAAgB,KAChB,KAAM,KACN,UAAW,IAAI,IACf,kBAAmB,IAAI,IACvB,OAAQ,GACR,UAAW,EACX,QAAS,CACX,EAYO,mBAAkC,CACvC,OAAO,KAAK,MAAM,cACpB,CAOO,kBAAkB,MAAoB,CAC3C,GAAI,KAAK,MAAM,eACb,MAAM,IAAI,MAAM,8BAA8B,EAGhD,KAAK,MAAM,eAAiB,KAC9B,CAKO,SAAqC,CAC1C,IAAM,KAAO,KAAK,MAAM,KAExB,GAAI,CAAC,KACH,MAAM,IAAI,MAAM,2BAA2B,EAG7C,OAAO,IACT,CAOO,QAAQ,KAAuC,CACpD,KAAK,MAAM,KAAO,IACpB,CAKA,IAAW,WAA8B,CACvC,OAAO,KAAK,MAAM,SACpB,CAQO,yBACP,GACS,CACP,IAAM,MAAK,+BAAW,EACtB,YAAK,MAAM,kBAAkB,IAAI,GAAI,EAAE,EAChC,EACT,CAOO,sBAAsB,GAAkB,CAC7C,KAAK,MAAM,kBAAkB,OAAO,EAAE,CACxC,CAMA,MAAa,sBAAsC,CACjD,OAAW,CAAC,GAAI,EAAE,IAAK,KAAK,MAAM,kBAChC,GAAI,CACF,MAAM,GAAG,IAAI,CACf,OAAS,EAAG,CACV,KAAK,WAAW,KAAK,qCAAsC,CAAC,CAC9D,QAAE,CACA,KAAK,sBAAsB,EAAE,CAC/B,CAEJ,CAMO,2BAAkC,CACvC,KAAK,MAAM,kBAAkB,MAAM,CACrC,CAOO,UAAU,OAAsB,CACrC,KAAK,MAAM,OAAS,OACpB,KAAK,MAAM,UAAY,YAAY,IAAI,CACzC,CAMO,SAAgB,CAChB,KAAK,MAAM,UAAS,KAAK,MAAM,QAAU,YAAY,IAAI,EAChE,CAMO,WAAoB,CACzB,OAAO,KAAK,MAAM,MACpB,CAMO,kBAA2B,CAChC,OAAO,KAAK,IAAI,KAAK,MAAM,QAAU,KAAK,MAAM,SAAS,CAC3D,CACF,EAWO,SAAS,MAAM,GAAsD,CAC1E,IAAM,IAAM,WAAW,EAEvB,GAAI,CAAC,IACH,MAAM,IAAI,MAAM,iDAAiD,EAGnE,OAAO,IAAI,yBAAyB,EAAE,CACxC,CARgB,sBCxIT,IAAM,eAAN,KAAqB,CApC5B,MAoC4B,+BAC1B,MAEA,YAAY,CAAE,GAAG,OAAQ,EAA0B,CACjD,KAAK,MAAQ,CACX,GAAG,QACH,mBAAoB,CAAC,EACrB,SAAU,CAAC,CACb,CACF,CAEA,MAAM,MAAO,CACX,MAAM,KAAK,eAAe,EAE1B,KAAK,yBAAyB,EAE9B,IAAM,gBAAkB,KAAK,MAAM,SAAS,OACzC,KAAQ,IAAI,SAAS,OACxB,EAEI,gBAAgB,QAAU,CAAC,KAAK,MAAM,YAAY,QACpD,QAAQ,YACN,eAAO,OACL,6EACF,CACF,EAIF,gBAAgB,QAChB,CAAC,KAAK,MAAM,WAAW,QACvB,CAAC,KAAK,MAAM,WAAW,QAErB,QAAQ,YACN,eAAO,OACL,4FACF,CACF,EAGE,KAAK,MAAM,aACb,MAAM,qBAAqB,CACzB,OAAQ,KAAK,MAAM,OACnB,YAAa,KAAK,MAAM,YACxB,SAAU,KAAK,MAAM,QACvB,CAAC,EAED,MAAM,iBAAiB,CACrB,OAAQ,KAAK,MAAM,OACnB,YAAa,KAAK,MAAM,YACxB,SAAU,KAAK,MAAM,QACvB,CAAC,EAGH,KAAK,eAAe,CACtB,CAEA,KAAM,gBAAiB,CACrB,IAAM,kBAAoB,sBAGpB,kBAFQ,MAAM,aAAa,KAAK,MAAM,aAAc,EAAI,GAE/B,OAAQC,OACvC,kBAAkB,KAAKA,KAAI,CAC3B,EAEA,QAAW,mBAAmB,iBAAkB,CAG9C,IAAM,YAAc,MAAM,OAAO,GAFd,UAAU,eAAe,CAEE,MAAM,KAAK,IAAI,CAAC,IAC1D,WAAgC,MAAM,WAAW,EAGjD,OAAO,OAAW,KAAe,OAAO,QAAY,KACtD,OAAO,QAAQ,MAAM,QAAQ,QAAQ,eAAe,CAAC,EAGvD,IAAM,gBACN,gBAAgB,MAAM,QAAQ,IAAI,CAAC,EAAE,CAAC,GAAK,gBAY3C,GAVI,WAAW,UACf,WAAa,WAAW,SAGpB,YAAY,QACd,WAAW,KAAO,YAAY,QAAQ,KAEtC,WAAW,KAAO,YAAY,KAG5B,CAAC,WAAW,KAAM,CACpB,QAAQ,YACN,eAAO,OACL,0BAA0B,eAAe,0BAC3C,CACF,EACA,QACF,CAEA,GAAI,CAAC,WAAW,KAAK,KAAM,CACzB,QAAQ,YACN,eAAO,OACL,0BAA0B,eAAe,+BAC3C,CACF,EACA,QACF,CAEA,GAAI,CAAC,WAAW,IAAK,CACnB,QAAQ,YACN,eAAO,OACL,0BAA0B,WAAW,KAAK,IAAI,yBAChD,CACF,EACA,QACF,CAEA,GAAI,OAAO,WAAW,KAAQ,WAAY,CACxC,QAAQ,YACN,eAAO,OACL,0BAA0B,WAAW,KAAK,IAAI,uCAChD,CACF,EACA,QACF,CAEA,WAAW,SAAW,gBAEtB,IAAI,gBACJ,gBACA,MAAM,KAAK,MAAM,YAAY,EAAE,CAAC,GAChC,QAAQ,WAAY,GAAG,EACvB,MAAM,GAAG,EAAE,CAAC,GAAK,KAEb,iBAAmB,kBAAkB,KAAK,eAAe,EAC3D,WAAW,SAAW,KAEtB,WAAW,SAAW,gBAGxB,KAAK,MAAM,SAAS,KAAK,UAAU,CACrC,CACF,CAEA,0BAA2B,CACzB,QAAW,6BAA6B,oBACtC,KAAK,MAAM,mBAAmB,KAAK,yBAAyB,CAEhE,CAEA,KAAM,mBAAoB,CACxB,IAAM,IAAM,eAAe,EAE3B,MAAM,IAAI,qBAAqB,EAG/B,IAAI,0BAA0B,CAChC,CAEA,KAAM,oBAAoB,YAAqC,CAC7D,GACA,CAAC,YAAY,mBAAmB,GAChC,CAAC,YAAY,qBAAqB,GAClC,CAAC,YAAY,eAAe,EAE5B,OAEA,IAAM,eAAiB,YAAY,eAAe,EAE5C,cAAgB,KAAK,MAAM,SAAS,KACvC,KAAQ,IAAI,KAAK,OAAS,YAAY,WACzC,EAEA,GAAI,CAAC,cAAe,OAEpB,IAAM,IAAM,eAAe,EAE3B,IAAI,UAAU,IAAI,cAAe,WAAW,EAE5C,GAAM,CAAE,KAAM,QAAS,IAAK,aAAc,GAAG,IAAK,EAAI,cAGtD,OAAI,gBAAkB,CAAC,aAAc,OAEpB,gBAAY,CAC3B,IAAM,WAAa,CACjB,KAAM,cAAc,KACpB,QAAS,cAAc,QACvB,GAAG,IACL,EAEA,GAAI,KAAK,MAAM,kBAAmB,CAChC,IAAIC,QAAS,GAEb,QAAW,sBAAsB,KAAK,MAAM,kBAC5C,YAQE,GAP2B,MAAM,mBAAmB,CAClD,YACA,WACA,OAAQ,KAAK,MAAM,OACnB,QAAS,KAAK,MAAM,kBACtB,CAAC,EAEuB,CACtBA,QAAS,GACT,KACF,CAGF,GAAI,CAACA,QAAQ,MACf,CAEA,IAAI,OAAS,GAGb,GAAI,CAAC,KAAK,MAAM,wBACd,QAAW,cAAc,KAAK,MAAM,mBAOlC,GAN2B,WAAW,CACpC,cACA,YACA,YAAa,KAAK,KACpB,CAAC,EAEuB,CACtB,OAAS,GACT,KACF,EAIJ,GAAI,CAAC,OAAQ,OAEb,IAAM,QAAU,cAAc,eAAiB,eAAiB,KAAK,EAE/DC,SAAU,CACd,YACA,OAAQ,KAAK,MAAM,OACnB,QAAS,KAAK,MAAM,kBACtB,EAIA,GAAI,CAFgB,KAAK,MAAM,mBAAmB,oBAAoB,EAGpE,OAAO,QAAQA,QAAO,EAGxB,MAAOC,MAAQ,CACb,IAAM,MAAQA,KAAI,kBAAkB,EAC9B,OAASA,KAAI,UAAU,EACvB,KAAO,GAAGA,KAAI,iBAAiB,EAAE,QAAQ,CAAC,CAAC,KAE3C,aADS,CAAC,CAACA,KAAI,UAAU,IAAI,UAAU,EACf,YAAc,GAE5C,GAAI,MAAO,CACT,QAAQ,MACN,eAAO,IACL,IAAI,MAAM,MAAM,IAAI,IAAI,YAAY,6BAA6B,KAAK,EACxE,CACF,EACA,MACF,CAEA,QAAQ,IACN,eAAO,MACL,IAAI,MAAM,MAAM,IAAI,IAAI,YAAY,gCACtC,CACF,CACF,CAAC,EAED,GAAI,CACF,WAAI,UAAU,YAAY,WAAW,EACzB,MAAM,QAAQD,QAAO,CAGnC,QAAE,CACA,IAAI,QAAQ,CACd,CACF,EA7FiB,YA+FD,CAClB,CAEA,gBAAiB,CACf,KAAK,MAAM,OAAO,GAAG,oBAAsB,aAAgB,CACzD,IAAM,IAAM,IAAI,sBAAsB,KAAK,MAAM,kBAAkB,EACnE,WAAI,yBAAgD,EAE7C,yBACL,IACA,KAAK,oBAAoB,KAAK,IAAI,EAClC,KAAK,kBAAkB,KAAK,IAAI,CAClC,EAAE,WAAW,CACf,CAAC,CACH,CAEA,IAAI,UAAW,CACb,OAAO,KAAK,MAAM,QACpB,CAEA,MAAM,eAAe,KAAsB,CACzC,GAAI,CAAC,KAAK,MAAM,aACd,MAAM,IAAI,MACR,eAAO,IACL,0FACF,CACF,EAGF,KAAK,MAAM,SAAW,CAAC,EAGvB,MAAM,KAAK,eAAe,EAEtB,KAAK,MAAM,aACb,MAAM,qBAAqB,CACzB,OAAQ,KAAK,MAAM,OACnB,YAAa,KAAK,MAAM,YACxB,SAAU,KAAK,MAAM,SACrB,UAAW,GACX,IACF,CAAC,EAED,MAAM,iBAAiB,CACrB,OAAQ,KAAK,MAAM,OACnB,YAAa,KAAK,MAAM,YACxB,SAAU,KAAK,MAAM,SACrB,UAAW,GACX,IACF,CAAC,CAEL,CACF,ECpWO,IAAM,aAAN,KAAmB,CAV1B,MAU0B,6BACxB,MAEA,YAAY,CAAE,GAAG,OAAQ,EAAwB,CAC/C,KAAK,MAAQ,CACX,GAAG,QACH,OAAQ,CAAC,CACX,CACF,CAEA,MAAM,MAAO,CACX,MAAM,KAAK,aAAa,EACxB,KAAK,gBAAgB,CACvB,CAEA,KAAM,cAAe,CACnB,IAAM,iBAAmB,MAAM,eAAe,KAAK,MAAM,UAAU,EAEnE,QAAW,mBAAmB,iBAAkB,CAC9C,IAAM,UAAY,gBAClB,QAAQ,WAAY,GAAG,EACvB,MAAM,GAAG,EACT,IAAI,EAEE,kBAAoB,sBAGpB,gBAFa,MAAM,aAAa,gBAAiB,EAAI,GAEzB,OAAQE,OAC1C,kBAAkB,KAAKA,KAAI,CAC3B,EAEM,SAAW,CACf,KAAM,UACN,UAAW,CAAC,CACd,EAEA,KAAK,MAAM,OAAO,KAAK,QAAQ,EAE/B,QAAW,iBAAiB,eAAgB,CAG1C,IAAI,kBAAoB,MAAM,OAAO,GAFlB,UAAU,aAAa,CAEQ,MAAM,KAAK,IAAI,CAAC,KAClE,QACI,cAAgB,MAAM,gBAAgB,EAGtC,OAAO,OAAW,KAAe,OAAO,QAAY,KACtD,OAAO,QAAQ,MAAM,QAAQ,QAAQ,aAAa,CAAC,EAGjD,eAAe,UACjB,cAAgB,cAAc,SAGhC,IAAM,gBACN,cAAc,MAAM,QAAQ,IAAI,CAAC,EAAE,CAAC,GAAK,cAEzC,GAAI,OAAO,eAAkB,WAAY,CACvC,QAAQ,YACN,eAAO,OACL,wBAAwB,eAAe,8BACzC,CACF,EACA,QACF,CAEA,SAAS,UAAU,KAAK,aAAa,CACvC,CACF,CACF,CAEA,iBAAkB,CAChB,IAAM,OAAS,KAAK,MAAM,OACpB,QAAU,KAAK,MAAM,mBAE3B,QAAW,YAAY,KAAK,MAAM,OAChC,OAAO,GAAG,SAAS,KAAM,SAAU,SAAW,CAC5C,QAAW,iBAAiB,SAAS,UAGnC,GAFsB,MAAM,cAAc,GAAG,OAAQ,OAAQ,OAAO,EAGlE,KAGN,CAAC,CAEL,CAEA,IAAI,QAAS,CACX,OAAO,KAAK,MAAM,MACpB,CAEA,MAAM,aAAa,eAAiC,CAClD,GAAI,CAAC,KAAK,MAAM,WACd,MAAM,IAAI,MACR,eAAO,IACL,sFACF,CACF,EAGF,KAAK,MAAM,OAAS,CAAC,EAErB,MAAM,KAAK,aAAa,EAExB,KAAK,MAAM,OAAO,mBAAmB,EAErC,KAAK,gBAAgB,EAGrB,gBAAgB,eAAe,CACjC,CACF,EC9GO,IAAM,kBAAN,KAAwB,CAZ/B,MAY+B,kCAC7B,MAEA,YAAY,CAAE,GAAG,OAAQ,EAA6B,CACpD,KAAK,MAAQ,CACX,GAAG,QACH,YAAa,CAAC,CAChB,CACF,CAEA,MAAM,MAAO,CACX,KAAK,MAAM,YAAc,MAAM,KAAK,kBAAkB,CACxD,CAEA,KAAM,mBAAoB,CACxB,IAAM,kBAAoB,sBAMpB,qBAJkB,MAAM,aAC5B,KAAK,MAAM,gBACX,EACF,GAC4C,OAAQC,OACpD,kBAAkB,KAAKA,KAAI,CAC3B,EAEM,oBAAkC,CAAC,EAEzC,QAAW,sBAAsB,oBAAqB,CAGpD,IAAI,kBAAoB,MAAM,OAAO,GAFlB,UAAU,kBAAkB,CAEG,MAAM,KAAK,IAAI,CAAC,KAClE,QACI,mBAAqB,MAAM,gBAAgB,EAG3C,OAAO,OAAW,KAAe,OAAO,QAAY,KACtD,OAAO,QAAQ,MAAM,QAAQ,QAAQ,kBAAkB,CAAC,EAGtD,oBAAoB,UACtB,mBAAqB,mBAAmB,SAG1C,IAAM,gBACN,mBAAmB,MAAM,QAAQ,IAAI,CAAC,EAAE,CAAC,GAAK,mBAE9C,GAAI,OAAO,oBAAuB,WAAY,CAC5C,QAAQ,YACN,eAAO,OACL,6BAA6B,eAAe,8BAC9C,CACF,EACA,QACF,CAEA,oBAAoB,KAAK,kBAAkB,CAC7C,CAEA,OAAO,mBACT,CAEA,IAAI,aAAc,CAChB,OAAO,KAAK,MAAM,WACpB,CAEA,MAAM,mBAAoB,CACxB,GAAI,CAAC,KAAK,MAAM,gBACd,MAAM,IAAI,MACR,eAAO,IACL,gGACF,CACF,EAGF,IAAM,eAAiB,MAAM,KAAK,kBAAkB,EAEpD,KAAK,MAAM,YAAc,cAC3B,CACF,ECpFO,IAAe,cAAf,KAA6B,CANpC,MAMoC,8BAOpC,ECXO,IAAM,YAAN,cAA0B,aAAc,CAF/C,MAE+C,4BAC7C,OAAS,IAAI,IAEb,MAAa,IAAO,IAAqC,CACvD,IAAM,MAAQ,KAAK,OAAO,IAAI,GAAG,EAEjC,GAAK,MAIL,IAAI,MAAM,KAAO,KAAK,IAAI,EAAI,MAAM,IAAK,CACvC,KAAK,OAAO,OAAO,GAAG,EACtB,MACF,CAEA,OAAO,MAAM,MACf,CAEA,MAAa,IAAO,IAAa,MAAU,IAA6B,CACtE,KAAK,OAAO,IAAI,IAAK,CACnB,IACA,MACA,IAAK,KAAO,KAAO,KAAK,IAAI,EAAI,IAAM,MACxC,CAAC,CACH,CAEA,MAAa,OAAO,IAA+B,CACjD,OAAO,KAAK,OAAO,IAAI,GAAG,CAC5B,CAEA,MAAa,OAAO,IAA4B,CAC9C,KAAK,OAAO,OAAO,GAAG,CACxB,CAEA,MAAa,OAAuB,CAClC,KAAK,OAAO,MAAM,CACpB,CAEA,MAAa,OAAO,IAAa,IAA4B,CAC3D,IAAM,MAAQ,KAAK,OAAO,IAAI,GAAG,EAEjC,GAAI,CAAC,MAAO,OAEZ,IAAM,KAAO,KAAK,IAAI,EAAI,IAG1B,GAAI,KAAO,KAAK,IAAI,EAAG,CACrB,KAAK,OAAO,OAAO,GAAG,EACtB,MACF,CAEA,MAAM,IAAM,IACd,CACF,EhB3CO,IAAM,WAAN,MAAM,oBAAmB,mBAAAC,OAAa,CAZ7C,MAY6C,2BAC3C,MAEA,OAAO,SAAmC,OAQ1C,YAAY,QAA4B,CAUtC,GATI,YAAW,UACb,QAAQ,YACN,sIACA,CACE,KAAM,sBACR,CACF,EAGE,CAAC,QAAQ,OACX,MAAM,IAAI,MACR,eAAO,IAAI,qDAAqD,CAClE,EAGF,GAAI,QAAQ,iBAAmB,CAAC,QAAQ,aACtC,MAAM,IAAI,MACR,eAAO,IAAI,2DAA2D,CACxE,EAGF,MAAM,EAEN,QAAQ,gBAAkB,QAAQ,IAAI,WAAa,aAGnD,QAAQ,gBAAkB,OAC1B,CAAC,QAAQ,eACT,EAAE,QAAQ,yBAAyB,kBAEjC,QAAQ,cAAgB,IAAI,aAG9B,KAAK,MAAQ,QAEb,KAAK,MAAM,EAAE,KAAK,IAAM,CAEtB,KAAK,8BAA8B,CACrC,CAAC,EAEI,YAAW,WACd,YAAW,SAAW,KAE1B,CAKA,kBAAyC,CAEvC,OADiB,KAAK,MAAM,eACT,IACrB,CAKA,qBAAsB,CACpB,OAAO,KAAK,MAAM,eAAiB,EACrC,CAKA,IAAI,QAAS,CACX,OAAO,KAAK,MAAM,MACpB,CAKA,IAAI,gBAAiB,CACnB,OAAO,KAAK,MAAM,cACpB,CAKA,KAAM,OAAQ,CAEZ,GAAI,KAAK,MAAM,WAAY,CACzB,IAAM,aAAe,IAAI,aAAa,CACpC,OAAQ,KAAK,MAAM,OACnB,WAAY,KAAK,MAAM,WACvB,mBAAoB,IACtB,CAAC,EAED,MAAM,aAAa,KAAK,EAExB,KAAK,MAAM,aAAe,YAC5B,CAGA,GAAI,KAAK,MAAM,gBAAiB,CAC9B,IAAM,kBAAoB,IAAI,kBAAkB,CAC9C,gBAAiB,KAAK,MAAM,eAC9B,CAAC,EAED,MAAM,kBAAkB,KAAK,EAE7B,KAAK,MAAM,kBAAoB,iBACjC,CAGA,GAAI,KAAK,MAAM,aAAc,CAC3B,IAAM,eAAiB,IAAI,eAAe,CACxC,OAAQ,KAAK,MAAM,OACnB,aAAc,KAAK,MAAM,aACzB,YAAa,KAAK,MAAM,aAAe,CAAC,EACxC,WAAY,KAAK,MAAM,YAAc,CAAC,EACtC,WAAY,KAAK,MAAM,YAAc,CAAC,EACtC,kBAAmB,KAAK,MAAM,kBAC9B,uBAAwB,KAAK,MAAM,wBAA0B,GAC7D,mBAAoB,KACpB,aAAc,KAAK,MAAM,cAAgB,EAC3C,CAAC,EAED,MAAM,eAAe,KAAK,EAE1B,KAAK,MAAM,eAAiB,cAC9B,CACF,CAKA,MAAM,eAAe,KAAsB,CACpC,KAAK,MAAM,gBAChB,MAAM,KAAK,MAAM,eAAe,eAAe,IAAI,CACrD,CAKA,MAAM,cAAe,CACd,KAAK,MAAM,cAChB,MAAM,KAAK,MAAM,aAAa,aAAa,KAAK,MAAM,cAAc,CACtE,CAKA,MAAM,mBAAoB,CACnB,KAAK,MAAM,mBAChB,MAAM,KAAK,MAAM,kBAAkB,kBAAkB,CACvD,CAKA,IAAI,UAA4B,CAC9B,OAAK,KAAK,MAAM,eAIC,KAAK,MAAM,eAAe,SAAS,IAAK,KAAQ,CAC/D,GAAM,CAAE,IAAK,aAAc,GAAG,OAAQ,EAAI,IAC1C,OAAO,OACT,CAAC,EANQ,CAAC,CASZ,CAKA,IAAI,cAAmC,CACrC,OAAO,KAAK,MAAM,YACpB,CAKA,IAAI,YAAiC,CACnC,OAAO,KAAK,MAAM,UACpB,CAKA,IAAI,iBAAsC,CACxC,OAAO,KAAK,MAAM,eACpB,CAKA,IAAI,YAAuB,CACzB,OAAO,KAAK,MAAM,YAAc,CAAC,CACnC,CAKA,IAAI,aAAwB,CAC1B,OAAO,KAAK,MAAM,aAAe,CAAC,CACpC,CAKA,IAAI,YAAuB,CACzB,OAAO,KAAK,MAAM,YAAc,CAAC,CACnC,CAKA,+BAAgC,CAC9B,KAAK,MAAM,OAAO,gBAAgB,KAAK,MAAM,OAAO,gBAAgB,EAAI,CAAC,CAC3E,CAKA,+BAAgC,CAC9B,KAAK,MAAM,OAAO,gBAAgB,KAAK,MAAM,OAAO,gBAAgB,EAAI,CAAC,CAC3E,CACF,EF3OA,IAAM,QAAU,IAAI,0CAWb,SAAS,yBAGhB,IAA4B,GAAO,UAAkB,CAqDnD,OApDY,WAAI,OACP,QAAQ,IAAI,IAAK,SAAY,CAClC,GAAI,CAIF,OAFe,MAAM,GAAG,GAAG,IAAI,CAGjC,OAAS,EAAG,CAEV,GAAI,kBAAkB,CAAC,EAAG,CACxB,IAAM,KAAO,QAAQ,IAAI,EAAG,MAAM,EAC5B,YAAc,IAAI,UAAU,IAAI,aAAa,EACnD,GAAI,CAAC,YAAa,OAElB,OAAQ,KAAM,CACZ,KAAK,qBAAqB,mBAAmB,CACrC,YAAY,YAAY,GAC1B,MAAM,YAAY,MAAM,CACtB,QAAS,4CACT,UAAW,EACb,CAAC,EAEH,MACF,CACF,KAAK,qBAAqB,gBAAgB,CAClC,YAAY,YAAY,GAC1B,MAAM,YAAY,MAAM,CACtB,QAAS,yCACT,UAAW,EACb,CAAC,EAEH,MACF,CACJ,CAEA,MACF,CAEA,IAAI,kBAAkB,CAAU,CAClC,QAAE,CACA,GAAI,OAAO,WAAc,WAEvB,GAAI,CACF,MAAM,UAAU,GAAG,IAAI,CACzB,MAAQ,CAGR,CACJ,CACF,CAAC,EAjDS,MAqDd,CAzDgB,4DAmET,SAAS,cAAc,OAAS,GAA+B,CACpE,IAAM,IAAM,QAAQ,SAAS,GAAG,YAAc,WAAW,SAEzD,GAAI,CAAC,KAAO,OACV,MAAM,IAAI,MAAM,gCAAgC,EAGlD,OAAO,GACT,CARgB,sCAcT,SAAS,YAA2C,CAEzD,OADY,QAAQ,SAAS,CAE/B,CAHgB,gCAQT,SAAS,gBAAwC,CACtD,IAAM,IAAM,QAAQ,SAAS,EAC7B,GAAI,CAAC,IACH,MAAM,IAAI,MACR,sFACF,EAGF,OAAO,GACT,CATgB,wCmB1GT,IAAM,qBAAuB,OAAO,qBAAqB,ECEhE,IAAM,YAAc,IAAI,IAEjB,SAAS,aAAa,KAAc,CACrC,YAAY,IAAI,IAAI,IAExB,YAAY,IAAI,IAAI,EAEpB,QAAQ,YACN,GAAG,IAAI,kDACP,CACE,KAAM,2BACR,CACF,EACF,CAXgB,oCrBDhB,IAAAC,oBAA2B,kBAqBpB,SAAS,kBAChB,QACA,GACO,CAKL,GAJA,aAAa,YAAY,EAIrB,CAFgB,QAAQ,IAAI,GAAI,oBAAoB,EAGtD,MAAM,IAAI,MACR,qGACF,EAGF,IAAM,IACN,OAAO,SAAY,SACnB,CAAE,KAAM,OAAQ,EAChB,OAAO,SAAY,SACnB,CAAE,QAAM,gCAAW,EAAG,IAAK,OAAQ,EACnC,QAEA,QAAQ,IAAI,GAAI,iBAAkB,GAAG,CACvC,CAtBgB,8CA4BT,SAAS,eAChB,GACA,QACI,CACF,aAAa,SAAS,EAEtB,IAAM,MADa,cAAc,EAAI,EACZ,iBAAiB,EAE1C,GAAI,CAAC,MACH,MAAM,IAAI,MAAM,kDAAkD,EAGpE,aAAY,gCAAW,EAEvB,IAAM,OAAS,OAAO,SAAY,SAAW,CAAE,KAAM,OAAQ,EAAI,QAE3D,IAAO,gBAAU,OAAoC,CACzD,IAAMC,SAAW,QAAQ,IAAI,IAAK,gBAAgB,GAClD,OAGM,KAAO,MAAM,MAAM,IAAIA,SAAQ,IAAI,EAEzC,GAAI,KAAM,OAAO,KAGjB,IAAM,OAAS,MAAM,GAAG,GAAG,IAAI,EAE/B,aAAM,MAAM,IAAIA,SAAQ,KAAM,OAAQA,SAAQ,GAAG,EAE1C,MACT,EAfa,OAiBb,eAAQ,IAAI,IAAK,iBAAkB,MAAM,EACzC,QAAQ,IAAI,IAAK,qBAAsB,EAAI,EAEpC,GACT,CArCgB,wCA4ChB,eAAsB,oBACtB,MACA,IACgB,CACd,aAAa,cAAc,EAE3B,IAAM,cADa,cAAc,EAAI,EACJ,iBAAiB,EAElD,GAAI,CAAC,cACH,MAAM,IAAI,MAAM,uDAAuD,EAGzE,IAAM,IACN,OAAO,OAAU,SACjB,MACA,QAAQ,IAAI,MAAO,gBAAgB,GAAG,KAEtC,GAAI,CAAC,IACH,MAAM,IAAI,MAAM,oBAAoB,EAGtC,IAAM,KAAO,MAAM,cAAc,IAAI,GAAG,EAExC,GAAI,KAAM,CACR,IAAM,KAAO,KAAO,OACpB,MAAM,cAAc,IAAI,IAAK,KAAM,IAAI,CACzC,CACF,CA3BsB,kDAiCtB,eAAsB,oBACtB,MACgB,CACd,aAAa,cAAc,EAE3B,IAAM,cADa,cAAc,EAAI,EACJ,iBAAiB,EAElD,GAAI,CAAC,cACH,MAAM,IAAI,MAAM,uDAAuD,EAGzE,IAAM,IACN,OAAO,OAAU,SACjB,MACA,QAAQ,IAAI,MAAO,gBAAgB,GAAG,KAEtC,GAAI,CAAC,IACH,MAAM,IAAI,MAAM,oBAAoB,EAGtC,MAAM,cAAc,OAAO,GAAG,CAChC,CArBsB,kDA4BtB,eAAsB,gBACtB,MACA,IACgB,CACd,aAAa,UAAU,EAEvB,IAAM,cADa,cAAc,EAAI,EACJ,iBAAiB,EAElD,GAAI,CAAC,cACH,MAAM,IAAI,MAAM,mDAAmD,EAGrE,IAAM,KACN,OAAO,OAAU,SACjB,MACA,QAAQ,IAAI,MAAO,gBAAgB,GAAG,KAEtC,GAAI,CAAC,KACH,MAAM,IAAI,MAAM,oBAAoB,EAGlC,OAAO,KAAQ,SACjB,MAAM,cAAc,OAAO,KAAM,GAAG,EAEpC,MAAM,cAAc,OAAO,IAAI,CAEnC,CA1BsB","names":["rfdc","fs","path","import_path","path","path","canRun","context","env","path","path","EventEmitter","import_node_crypto","context"]}
1
+ {"version":3,"sources":["../../src/cache/index.ts","../../src/context/async-context.ts","../../src/utils/error-codes.ts","../../src/CommandKit.ts","../../src/utils/clone.ts","../../src/utils/colors.ts","../../src/utils/get-paths.ts","../../src/utils/resolve-file-url.ts","../../src/handlers/command-handler/functions/loadCommandsWithRest.ts","../../src/handlers/command-handler/utils/areSlashCommandsDifferent.ts","../../src/handlers/command-handler/functions/registerCommands.ts","../../src/handlers/command-handler/validations/devOnly.ts","../../src/handlers/command-handler/validations/permissions.ts","../../src/handlers/command-handler/validations/index.ts","../../src/context/environment.ts","../../src/handlers/command-handler/CommandHandler.ts","../../src/handlers/event-handler/EventHandler.ts","../../src/handlers/validation-handler/ValidationHandler.ts","../../src/cache/CacheProvider.ts","../../src/cache/MemoryCache.ts","../../src/utils/warn-unstable.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks';\nimport { GenericFunction, getCommandKit } from '../context/async-context';\nimport { warnUnstable } from '../utils/warn-unstable';\nimport { randomUUID } from 'node:crypto';\nimport ms from 'ms';\n\nconst cacheContext = new AsyncLocalStorage<CacheOptions | null>();\nconst CACHE_FN_STORE = new Map<GenericFunction, CacheOptions>();\n\nexport * from './CacheProvider';\nexport * from './MemoryCache';\n\nexport interface CacheOptions {\n /**\n * The name of the cache key.\n */\n name: string;\n /**\n * The time-to-live of the cache key in milliseconds.\n */\n ttl?: number;\n}\n\n/**\n * Assigns cache tag parameters to the current function that uses the \"use cache\" directive.\n * @param options The cache options or the name of the cache key.\n */\nexport function unstable_cacheTag(options: string | CacheOptions): void {\n warnUnstable('cacheTag()');\n\n const context = cacheContext.getStore();\n\n if (context === undefined) {\n throw new Error(\n 'cacheTag() can only be used inside a function that use the \"use cache\" directive.'\n );\n }\n\n // already tagged\n if (context === null) return;\n\n const opt = typeof options === 'string' ? { name: options } : options;\n\n if (opt.name) context.name = opt.name;\n if (opt.ttl !== undefined) context.ttl = opt.ttl;\n}\n\n/**\n * Assigns cache lifetime to the current function that uses the \"use cache\" directive.\n * @param ttl The time-to-live of the cache key in milliseconds or milliseconds parsable string.\n */\nexport function unstable_cacheLife(options: string | number): void {\n warnUnstable('cacheLife()');\n\n const context = cacheContext.getStore();\n\n if (context === undefined) {\n throw new Error(\n 'cacheLife() can only be used inside a function that use the \"use cache\" directive.'\n );\n }\n\n // already tagged\n if (context === null) return;\n\n const ttl = typeof options === 'string' ? ms(options) : options;\n\n context.ttl = ttl;\n}\n\n/**\n * Cache a value.\n * @param options The cache options.\n */\nexport function unstable_cache<R, F extends (...args: any[]) => Promise<R>>(\nfn: F,\noptions?: string | CacheOptions | undefined)\n: F {\n warnUnstable('cache()');\n const commandkit = getCommandKit(true);\n const cache = commandkit.getCacheProvider();\n\n if (!cache) {\n throw new Error('cache() cannot be used without a cache provider.');\n }\n\n options ??= randomUUID();\n\n const params =\n typeof options === 'string' ?\n {\n name: options\n } :\n options;\n\n // default ttl to 15 minutes\n params.ttl ??= 900_000;\n\n let firstRun = true;\n\n const _fn = (async (...args: Parameters<F>): Promise<R> => {\n const _context = CACHE_FN_STORE.get(_fn);\n\n if (!firstRun && !_context) {\n return await fn(...args);\n }\n\n firstRun = false;\n\n const context = _context ?? params;\n\n // check cache\n const data = await cache.get(context.name);\n\n if (data) return data as R;\n\n // cache miss\n const result = await fn(...args);\n\n await cache.set(context.name, result, context.ttl);\n\n return result;\n }) as F;\n\n CACHE_FN_STORE.set(_fn, params);\n\n return _fn;\n}\n\n/**\n * @private\n * @internal\n */\nfunction use_cache<R, F extends (...args: any[]) => Promise<R>>(fn: F): F {\n warnUnstable('\"use cache\"');\n\n let tagged = false;\n let originalFn: F;\n\n const memo = (async (...args) => {\n if (!originalFn) {\n originalFn = unstable_cache(fn);\n }\n\n if (!tagged) {\n // validate cacheTag() usage\n const _params = CACHE_FN_STORE.get(originalFn);\n\n if (!_params) return originalFn(...args);\n\n const [params, data] = await cacheContext.run(\n {\n name: _params?.name ?? '',\n ttl: _params?.ttl\n },\n async () => {\n const data = await originalFn(...args);\n const maybeTaggedParams = cacheContext.getStore();\n return [maybeTaggedParams, data];\n }\n );\n\n if (params) {\n CACHE_FN_STORE.set(originalFn, {\n name: params.name ?? _params?.name ?? randomUUID(),\n ttl: params.ttl ?? _params?.ttl\n });\n }\n\n tagged = true;\n\n return data;\n }\n\n return cacheContext.run(null, () => originalFn(...args));\n }) as F;\n\n return memo;\n}\n\n// this is intentional, do not change or you will be fired\nexport { use_cache as unstable_super_duper_secret_internal_for_use_cache_directive_of_commandkit_cli_do_not_use_it_directly_or_you_will_be_fired_kthxbai };\n\n/**\n * Revalidate a cache by its key.\n * @param cache The cache key to revalidate.\n */\nexport async function unstable_revalidate(cache: string): Promise<void> {\n warnUnstable('revalidate()');\n const commandkit = getCommandKit(true);\n const cacheProvider = commandkit.getCacheProvider();\n\n if (!cacheProvider) {\n throw new Error('revalidate() cannot be used without a cache provider.');\n }\n\n let target: GenericFunction | undefined = undefined;\n\n for (const [fn, params] of CACHE_FN_STORE) {\n if (params.name === cache) {\n target = fn;\n break;\n }\n }\n\n if (!target) {\n throw new Error('Invalid cache key.');\n }\n\n await cacheProvider.delete(cache);\n}\n\n/**\n * Manually expire a cache by its key.\n * @param cache The cache key.\n * @param ttl The new time-to-live of the cache key in milliseconds. If not provided, the cache key will be deleted.\n */\nexport async function unstable_expire(\ncache: string,\nttl?: number | string)\n: Promise<void> {\n warnUnstable('expire()');\n const commandkit = getCommandKit(true);\n const cacheProvider = commandkit.getCacheProvider();\n\n if (!cacheProvider) {\n throw new Error('expire() cannot be used without a cache provider.');\n }\n\n let target: GenericFunction | undefined = undefined;\n\n for (const [fn, params] of CACHE_FN_STORE) {\n if (params.name === cache) {\n target = fn;\n break;\n }\n }\n\n if (!target) {\n throw new Error('Invalid cache key.');\n }\n\n const _ttl =\n typeof ttl === 'string' ? ms(ttl) : typeof ttl === 'number' ? ttl : null;\n\n if (_ttl !== null) {\n await cacheProvider.expire(cache, _ttl);\n } else {\n await cacheProvider.delete(cache);\n }\n}","import { AsyncLocalStorage } from 'node:async_hooks';\nimport { CommandKitEnvironment } from './environment';\nimport { CommandKitErrorCodes, isCommandKitError } from '../utils/error-codes';\nimport { Interaction } from 'discord.js';\nimport { CommandKit } from '../CommandKit';\n\nconst context = new AsyncLocalStorage<CommandKitEnvironment>();\n\nexport type GenericFunction<A extends any[] = any[]> = (...args: A) => any;\n\n/**\n * Returns a context-aware version of the given function.\n * @param env - The commandkit environment data.\n * @param fn - The target function.\n * @param finalizer - An optional finalizer function to run after the target function. This function will be context-aware.\n * @internal\n */\nexport function makeContextAwareFunction<\n R extends GenericFunction,\n F extends GenericFunction>(\nenv: CommandKitEnvironment, fn: R, finalizer?: F): R {\n const _fn = (...args: any[]) => {\n return context.run(env, async () => {\n try {\n // execute the target function\n const result = await fn(...args);\n\n return result;\n } catch (e) {\n // set the error in the environment data\n if (isCommandKitError(e)) {\n const code = Reflect.get(e, 'code');\n const interaction = env.variables.get('interaction') as Interaction;\n if (!interaction) return;\n\n switch (code) {\n case CommandKitErrorCodes.GuildOnlyException:{\n if (interaction.isRepliable()) {\n await interaction.reply({\n content: 'This command is only available in guilds.',\n ephemeral: true\n });\n }\n return;\n }\n case CommandKitErrorCodes.DMOnlyException:{\n if (interaction.isRepliable()) {\n await interaction.reply({\n content: 'This command is only available in DMs.',\n ephemeral: true\n });\n }\n return;\n }\n }\n\n return;\n }\n\n env.setExecutionError(e as Error);\n } finally {\n if (typeof finalizer === 'function') {\n // execute the finalizer function\n try {\n await finalizer(...args);\n } catch {\n\n // no-op\n }}\n }\n });\n };\n\n return _fn as R;\n}\n\n/**\n * Retrieves commandkit\n * @private\n * @internal\n */\nexport function getCommandKit(): CommandKit | undefined;\nexport function getCommandKit(strict: true): CommandKit;\nexport function getCommandKit(strict: false): CommandKit | undefined;\nexport function getCommandKit(strict = false): CommandKit | undefined {\n const kit = context.getStore()?.commandkit ?? CommandKit.instance;\n\n if (!kit && strict) {\n throw new Error('CommandKit instance not found.');\n }\n\n return kit;\n}\n\n/**\n * Get the current commandkit context.\n * @internal\n */\nexport function getContext(): CommandKitEnvironment | void {\n const ctx = context.getStore();\n return ctx;\n}\n\n/**\n * Use current commandkit context. Throws an error if no context is found.\n */\nexport function useEnvironment(): CommandKitEnvironment {\n const ctx = context.getStore();\n if (!ctx) {\n throw new Error(\n 'No commandkit environment found. Please make sure you are inside commandkit handler.'\n );\n }\n\n return ctx;\n}\n\n/**\n * Ensures the command is only available in guilds.\n * Note: do not wrap this function in a try/catch block.\n */\nexport function guildOnly() {\n const env = useEnvironment();\n const interaction: Interaction = env.variables.get('interaction');\n\n if (!interaction) {\n throw new Error('No interaction found in environment.');\n }\n\n if (!interaction.guild) {\n const error = new Error('This command is only available in guilds.');\n Reflect.set(error, 'code', CommandKitErrorCodes.GuildOnlyException);\n\n throw error;\n }\n}\n\n/**\n * Ensures the command is only available in DMs.\n * Note: do not wrap this function in a try/catch block.\n */\nexport function dmOnly() {\n const env = useEnvironment();\n const interaction: Interaction = env.variables.get('interaction');\n\n if (!interaction) {\n throw new Error('No interaction found in environment.');\n }\n\n if (interaction.guild) {\n const error = new Error('This command is only available in DMs.');\n Reflect.set(error, 'code', CommandKitErrorCodes.DMOnlyException);\n\n throw error;\n }\n}","export const CommandKitErrorCodes = {\n GuildOnlyException: Symbol('kGuildOnlyException'),\n DMOnlyException: Symbol('kDMOnlyException')\n} as const;\n\nexport function isCommandKitError(\nerror: unknown)\n: error is Error & {code: symbol;} {\n if (!(error instanceof Error)) return false;\n const code = Reflect.get(error, 'code');\n\n for (const key in CommandKitErrorCodes) {\n if (CommandKitErrorCodes[key as keyof typeof CommandKitErrorCodes] === code)\n return true;\n }\n\n return false;\n}","import EventEmitter from 'node:events';\nimport { CommandHandler, EventHandler, ValidationHandler } from './handlers';\nimport type {\n CommandKitData,\n CommandKitOptions,\n CommandObject,\n ReloadOptions } from\n'./types';\nimport colors from './utils/colors';\nimport { CacheProvider } from './cache/CacheProvider';\nimport { MemoryCache } from './cache/MemoryCache';\n\nexport class CommandKit extends EventEmitter {\n #data: CommandKitData;\n\n static instance: CommandKit | undefined = undefined;\n\n /**\n * Create a new command and event handler with CommandKit.\n *\n * @param options - The default CommandKit configuration.\n * @see {@link https://commandkit.dev/guide/commandkit-setup}\n */\n constructor(options: CommandKitOptions) {\n if (CommandKit.instance) {\n process.emitWarning(\n 'CommandKit instance already exists. Having multiple instance in same project is discouraged and it may lead to unexpected behavior.',\n {\n code: 'MultiInstanceWarning'\n }\n );\n }\n\n if (!options.client) {\n throw new Error(\n colors.red('\"client\" is required when instantiating CommandKit.')\n );\n }\n\n if (options.validationsPath && !options.commandsPath) {\n throw new Error(\n colors.red('\"commandsPath\" is required when \"validationsPath\" is set.')\n );\n }\n\n super();\n\n options.debugCommands ??= process.env.NODE_ENV !== 'production';\n\n if (\n options.cacheProvider !== null && (\n !options.cacheProvider ||\n !(options.cacheProvider instanceof CacheProvider)))\n {\n options.cacheProvider = new MemoryCache();\n }\n\n this.#data = options;\n\n this.#init().then(() => {\n // Increment client listeners count, as commandkit registers internal event listeners.\n this.incrementClientListenersCount();\n });\n\n if (!CommandKit.instance) {\n CommandKit.instance = this;\n }\n }\n\n /**\n * Resolves the current cache provider.\n */\n getCacheProvider(): CacheProvider | null {\n const provider = this.#data.cacheProvider;\n return provider ?? null;\n }\n\n /**\n * Whether or not to debug the command handler.\n */\n isDebuggingCommands() {\n return this.#data.debugCommands || false;\n }\n\n /**\n * Get the client attached to this CommandKit instance.\n */\n get client() {\n return this.#data.client;\n }\n\n /**\n * Get command handler instance.\n */\n get commandHandler() {\n return this.#data.commandHandler;\n }\n\n /**\n * (Private) Initialize CommandKit.\n */\n async #init() {\n // <!-- Setup event handler -->\n if (this.#data.eventsPath) {\n const eventHandler = new EventHandler({\n client: this.#data.client,\n eventsPath: this.#data.eventsPath,\n commandKitInstance: this\n });\n\n await eventHandler.init();\n\n this.#data.eventHandler = eventHandler;\n }\n\n // <!-- Setup validation handler -->\n if (this.#data.validationsPath) {\n const validationHandler = new ValidationHandler({\n validationsPath: this.#data.validationsPath\n });\n\n await validationHandler.init();\n\n this.#data.validationHandler = validationHandler;\n }\n\n // <!-- Setup command handler -->\n if (this.#data.commandsPath) {\n const commandHandler = new CommandHandler({\n client: this.#data.client,\n commandsPath: this.#data.commandsPath,\n devGuildIds: this.#data.devGuildIds || [],\n devUserIds: this.#data.devUserIds || [],\n devRoleIds: this.#data.devRoleIds || [],\n validationHandler: this.#data.validationHandler,\n skipBuiltInValidations: this.#data.skipBuiltInValidations || false,\n commandkitInstance: this,\n bulkRegister: this.#data.bulkRegister || false\n });\n\n await commandHandler.init();\n\n this.#data.commandHandler = commandHandler;\n }\n }\n\n /**\n * Updates application commands with the latest from \"commandsPath\".\n */\n async reloadCommands(type?: ReloadOptions) {\n if (!this.#data.commandHandler) return;\n await this.#data.commandHandler.reloadCommands(type);\n }\n\n /**\n * Updates application events with the latest from \"eventsPath\".\n */\n async reloadEvents() {\n if (!this.#data.eventHandler) return;\n await this.#data.eventHandler.reloadEvents(this.#data.commandHandler);\n }\n\n /**\n * Updates application command validations with the latest from \"validationsPath\".\n */\n async reloadValidations() {\n if (!this.#data.validationHandler) return;\n await this.#data.validationHandler.reloadValidations();\n }\n\n /**\n * @returns An array of objects of all the commands that CommandKit is handling.\n */\n get commands(): CommandObject[] {\n if (!this.#data.commandHandler) {\n return [];\n }\n\n const commands = this.#data.commandHandler.commands.map((cmd) => {\n const { run, autocomplete, ...command } = cmd;\n return command;\n });\n\n return commands;\n }\n\n /**\n * @returns The path to the commands folder which was set when instantiating CommandKit.\n */\n get commandsPath(): string | undefined {\n return this.#data.commandsPath;\n }\n\n /**\n * @returns The path to the events folder which was set when instantiating CommandKit.\n */\n get eventsPath(): string | undefined {\n return this.#data.eventsPath;\n }\n\n /**\n * @returns The path to the validations folder which was set when instantiating CommandKit.\n */\n get validationsPath(): string | undefined {\n return this.#data.validationsPath;\n }\n\n /**\n * @returns An array of all the developer user IDs which was set when instantiating CommandKit.\n */\n get devUserIds(): string[] {\n return this.#data.devUserIds || [];\n }\n\n /**\n * @returns An array of all the developer guild IDs which was set when instantiating CommandKit.\n */\n get devGuildIds(): string[] {\n return this.#data.devGuildIds || [];\n }\n\n /**\n * @returns An array of all the developer role IDs which was set when instantiating CommandKit.\n */\n get devRoleIds(): string[] {\n return this.#data.devRoleIds || [];\n }\n\n /**\n * Increment the client listeners count.\n */\n incrementClientListenersCount() {\n this.#data.client.setMaxListeners(this.#data.client.getMaxListeners() + 1);\n }\n\n /**\n * Decrement the client listeners count.\n */\n decrementClientListenersCount() {\n this.#data.client.setMaxListeners(this.#data.client.getMaxListeners() - 1);\n }\n}","import rfdc from 'rfdc';\n\nexport const clone = rfdc();","const resetColor = '\\x1b[0m';\n\nexport default {\n reset: (text: string) => `${text}${resetColor}`,\n bright: (text: string) => `\\x1b[1m${text}${resetColor}`,\n dim: (text: string) => `\\x1b[2m${text}${resetColor}`,\n underscore: (text: string) => `\\x1b[4m${text}${resetColor}`,\n blink: (text: string) => `\\x1b[5m${text}${resetColor}`,\n reverse: (text: string) => `\\x1b[7m${text}${resetColor}`,\n hidden: (text: string) => `\\x1b[8m${text}${resetColor}`,\n\n black: (text: string) => `\\x1b[30m${text}${resetColor}`,\n red: (text: string) => `\\x1b[31m${text}${resetColor}`,\n green: (text: string) => `\\x1b[32m${text}${resetColor}`,\n yellow: (text: string) => `\\x1b[33m${text}${resetColor}`,\n blue: (text: string) => `\\x1b[34m${text}${resetColor}`,\n magenta: (text: string) => `\\x1b[35m${text}${resetColor}`,\n cyan: (text: string) => `\\x1b[36m${text}${resetColor}`,\n white: (text: string) => `\\x1b[37m${text}${resetColor}`,\n\n bgBlack: (text: string) => `\\x1b[40m${text}${resetColor}`,\n bgRed: (text: string) => `\\x1b[41m${text}${resetColor}`,\n bgGreen: (text: string) => `\\x1b[42m${text}${resetColor}`,\n bgYellow: (text: string) => `\\x1b[43m${text}${resetColor}`,\n bgBlue: (text: string) => `\\x1b[44m${text}${resetColor}`,\n bgMagenta: (text: string) => `\\x1b[45m${text}${resetColor}`,\n bgCyan: (text: string) => `\\x1b[46m${text}${resetColor}`,\n bgWhite: (text: string) => `\\x1b[47m${text}${resetColor}`\n};","import path from 'path';\nimport fs from 'fs/promises';\n\nexport async function getFilePaths(\ndirectory: string,\nnesting?: boolean)\n: Promise<string[]> {\n let filePaths: string[] = [];\n\n if (!directory) return filePaths;\n\n const files = await fs.readdir(directory, { withFileTypes: true });\n\n for (const file of files) {\n const filePath = path.join(directory, file.name);\n\n if (file.isFile()) {\n filePaths.push(filePath);\n }\n\n if (nesting && file.isDirectory()) {\n filePaths = [...filePaths, ...(await getFilePaths(filePath, true))];\n }\n }\n\n return filePaths;\n}\n\nexport async function getFolderPaths(\ndirectory: string,\nnesting?: boolean)\n: Promise<string[]> {\n let folderPaths: string[] = [];\n\n if (!directory) return folderPaths;\n\n const folders = await fs.readdir(directory, { withFileTypes: true });\n\n for (const folder of folders) {\n const folderPath = path.join(directory, folder.name);\n\n if (folder.isDirectory()) {\n folderPaths.push(folderPath);\n\n if (nesting) {\n folderPaths = [\n ...folderPaths,\n ...(await getFolderPaths(folderPath, true))];\n\n }\n }\n }\n\n return folderPaths;\n}","import path from 'path';\n\n/**\n * Convert a local file path to a file URL.\n * @param filePath - The local file's path.\n * @returns - The converted file URL.\n */\nexport function toFileURL(filePath: string) {\n const resolvedPath = path.resolve(filePath);\n return 'file://' + resolvedPath.replace(/\\\\\\\\|\\\\/g, '/');\n}","import type { ApplicationCommandDataResolvable, Client } from 'discord.js';\nimport type { CommandFileObject, ReloadOptions } from '../../../types';\n\nimport colors from '../../../utils/colors';\n\ntype LoadCommandsWithRestProps = {\n /**\n * The main client.\n */\n client: Client;\n\n /**\n * An array of command objects.\n */\n commands: CommandFileObject[];\n\n /**\n * An array of developer guild IDs.\n */\n devGuildIds: string[];\n\n /**\n * A boolean indicating whether these commands are reloading.\n */\n reloading?: boolean;\n\n /**\n * A type for reloading the commands (if this is reloading).\n */\n type?: ReloadOptions;\n};\n\n/**\n * Use REST to load commands.\n * @param props - Options for loading commands.\n */\nexport default async function loadCommandsWithRest(\nprops: LoadCommandsWithRestProps)\n{\n if (props.reloading) {\n if (props.client.isReady()) {\n await handleLoading(\n props.client,\n props.commands,\n props.devGuildIds,\n props.reloading,\n props.type\n );\n } else {\n throw new Error(\n colors.red(`Cannot reload commands when client is not ready.`)\n );\n }\n } else {\n props.client.once('ready', async (c) => {\n await handleLoading(\n c,\n props.commands,\n props.devGuildIds,\n props.reloading,\n props.type\n );\n });\n }\n}\n\n/**\n * Handles loading commands.\n * @param client - The discord.js client instance.\n * @param commands - An array of command file objects.\n * @param devGuildIds - An array of developer guild IDs.\n * @param reloading - A boolean indicating whether this is reloading.\n * @param type - A type for reloading the commands (if this is reloading).\n */\nasync function handleLoading(\nclient: Client<true>,\ncommands: CommandFileObject[],\ndevGuildIds: string[],\nreloading?: boolean,\ntype?: ReloadOptions)\n{\n commands = commands.filter((cmd) => !cmd.options?.deleted);\n const devOnlyCommands = commands.filter((cmd) => cmd.options?.devOnly);\n const globalCommands = commands.filter((cmd) => !cmd.options?.devOnly);\n\n if (type === 'dev') {\n await loadDevCommands(client, devOnlyCommands, devGuildIds, reloading);\n } else if (type === 'global') {\n await loadGlobalCommands(client, globalCommands, reloading);\n } else {\n await loadDevCommands(client, devOnlyCommands, devGuildIds, reloading);\n await loadGlobalCommands(client, globalCommands, reloading);\n }\n}\n\n/**\n * Load commands globally.\n * @param client - The discord.js client instance.\n * @param commands - An array of command file objects.\n * @param reloading - A boolean indicating whether the commands are reloading.\n */\nasync function loadGlobalCommands(\nclient: Client<true>,\ncommands: CommandFileObject[],\nreloading?: boolean)\n{\n const requestBody = commands.map((cmd) => cmd.data);\n\n await client.application.commands.\n set(requestBody as ApplicationCommandDataResolvable[]).\n catch((error) => {\n throw new Error(\n colors.red(\n `Error ${\n reloading ? 'reloading' : 'loading'} global application commands.\\n`\n\n ),\n error\n );\n });\n\n console.log(\n colors.green(\n `${reloading ? 'Reloaded' : 'Loaded'} ${\n requestBody.length} global commands.`\n\n )\n );\n}\n\n/**\n * Load commands for dev guilds.\n * @param client - The discord.js client instance.\n * @param commands - An array of command file objects.\n * @param guildIds - An array of developer guild IDs.\n * @param reloading - A boolean indicating whether the commands are reloading.\n */\nasync function loadDevCommands(\nclient: Client<true>,\ncommands: CommandFileObject[],\nguildIds: string[],\nreloading?: boolean)\n{\n const requestBody = commands.map((cmd) => cmd.data);\n\n for (const guildId of guildIds) {\n const targetGuild =\n client.guilds.cache.get(guildId) || (await client.guilds.fetch(guildId));\n\n if (!targetGuild) {\n process.emitWarning(\n `Cannot ${\n reloading ? 'reload' : 'load'} commands in guild \"${\n guildId}\" - guild doesn't exist or client isn't part of the guild.`\n );\n\n continue;\n }\n\n await targetGuild.commands.\n set(requestBody as ApplicationCommandDataResolvable[]).\n catch((error) => {\n throw new Error(\n colors.red(\n `Error ${\n reloading ? 'reloading' : 'loading'} developer application commands in guild \"${\n\n targetGuild?.name || guildId}\".\\n`\n\n ),\n error\n );\n });\n\n console.log(\n colors.green(\n `${reloading ? 'Reloaded' : 'Loaded'} ${\n requestBody.length} developer commands in guild \"${\n targetGuild.name}\".`\n )\n );\n }\n}","/**\n * Test if two slash commands are different.\n * @param appCommand - The application command.\n * @param localCommand - The local command.\n * @returns A boolean indicating whether these commands are different\n */\nexport default function areSlashCommandsDifferent(\nappCommand: any,\nlocalCommand: any)\n{\n if (!appCommand.options) appCommand.options = [];\n if (!localCommand.options) localCommand.options = [];\n\n if (!appCommand.description) appCommand.description = '';\n if (!localCommand.description) localCommand.description = '';\n\n if (\n localCommand.description !== appCommand.description ||\n localCommand.options.length !== appCommand.options.length)\n {\n return true;\n }\n}","import type {\n Guild,\n Client,\n ApplicationCommandData,\n GuildApplicationCommandManager,\n ApplicationCommandDataResolvable } from\n'discord.js';\nimport type { CommandFileObject, ReloadOptions } from '../../../types';\n\nimport areSlashCommandsDifferent from '../utils/areSlashCommandsDifferent';\n\nimport colors from '../../../utils/colors';\n\ntype RegisterCommandProps = {\n client: Client;\n commands: CommandFileObject[];\n devGuildIds: string[];\n reloading?: boolean;\n type?: ReloadOptions;\n};\n\n/**\n * Register client commands to Discord.\n * @param props\n */\nexport default async function registerCommands(props: RegisterCommandProps) {\n if (props.reloading) {\n if (props.client.isReady()) {\n await handleRegistration(\n props.client,\n props.commands,\n props.devGuildIds,\n props.type\n );\n } else {\n throw new Error(\n colors.red(`Cannot reload commands when client is not ready.`)\n );\n }\n } else {\n props.client.once('ready', async (c) => {\n await handleRegistration(\n c,\n props.commands,\n props.devGuildIds,\n props.type\n );\n });\n }\n}\n\nasync function handleRegistration(\nclient: Client<true>,\ncommands: CommandFileObject[],\ndevGuildIds: string[],\ntype?: ReloadOptions)\n{\n const devOnlyCommands = commands.filter((cmd) => cmd.options?.devOnly);\n const globalCommands = commands.filter((cmd) => !cmd.options?.devOnly);\n\n if (type === 'dev') {\n await registerDevCommands(client, devOnlyCommands, devGuildIds);\n } else if (type === 'global') {\n await registerGlobalCommands(client, globalCommands);\n } else {\n await registerDevCommands(client, devOnlyCommands, devGuildIds);\n await registerGlobalCommands(client, globalCommands);\n }\n}\n\nasync function registerGlobalCommands(\nclient: Client<true>,\ncommands: CommandFileObject[])\n{\n const appCommandsManager = client.application.commands;\n await appCommandsManager.fetch();\n\n for (const command of commands) {\n const targetCommand = appCommandsManager.cache.find(\n (cmd) => cmd.name === command.data.name\n );\n\n // <!-- Delete global command -->\n if (command.options?.deleted) {\n if (!targetCommand) {\n process.emitWarning(\n colors.yellow(\n `Ignoring: Command \"${command.data.name}\" is globally marked as deleted.`\n )\n );\n } else {\n await targetCommand.delete().catch((error) => {\n throw new Error(\n colors.red(\n `Failed to delete command \"${command.data.name}\" globally.\\n`\n ),\n error\n );\n });\n\n console.log(\n colors.green(`Deleted command \"${command.data.name}\" globally.`)\n );\n }\n\n continue;\n }\n\n // <!-- Edit global command -->\n if (targetCommand) {\n const commandsAreDifferent = areSlashCommandsDifferent(\n targetCommand,\n command.data\n );\n\n if (commandsAreDifferent) {\n await targetCommand.\n edit(command.data as Partial<ApplicationCommandData>).\n catch((error) => {\n throw new Error(\n colors.red(\n `Failed to edit command \"${command.data.name}\" globally.\\n`\n ),\n error\n );\n });\n\n console.log(\n colors.green(`Edited command \"${command.data.name}\" globally.`)\n );\n\n continue;\n }\n }\n\n // <!-- Register global command -->\n if (targetCommand) continue;\n\n await appCommandsManager.\n create(command.data as ApplicationCommandDataResolvable).\n catch((error) => {\n throw new Error(\n colors.red(\n `Failed to register command \"${command.data.name}\" globally.\\n`\n ),\n error\n );\n });\n\n console.log(\n colors.green(`Registered command \"${command.data.name}\" globally.`)\n );\n }\n}\n\nasync function registerDevCommands(\nclient: Client<true>,\ncommands: CommandFileObject[],\nguildIds: string[])\n{\n const devGuilds: Guild[] = [];\n\n for (const guildId of guildIds) {\n const guild =\n client.guilds.cache.get(guildId) || (await client.guilds.fetch(guildId));\n\n if (!guild) {\n process.emitWarning(\n colors.yellow(\n `Ignoring: Guild ${guildId} doesn't exist or client isn't part of the guild.`\n )\n );\n continue;\n }\n\n devGuilds.push(guild);\n }\n\n const guildCommandsManagers: GuildApplicationCommandManager[] = [];\n\n for (const guild of devGuilds) {\n const guildCommandsManager = guild.commands;\n await guildCommandsManager.fetch();\n\n guildCommandsManagers.push(guildCommandsManager);\n }\n\n for (const command of commands) {\n for (const guildCommands of guildCommandsManagers) {\n const targetCommand = guildCommands.cache.find(\n (cmd) => cmd.name === command.data.name\n );\n\n // <!-- Delete dev command -->\n if (command.options?.deleted) {\n if (!targetCommand) {\n process.emitWarning(\n colors.yellow(\n `Ignoring: Command \"${command.data.name}\" is marked as deleted in ${guildCommands.guild.name}.`\n )\n );\n } else {\n await targetCommand.delete().catch((error) => {\n throw new Error(\n colors.red(\n `Failed to delete command \"${command.data.name}\" in ${guildCommands.guild.name}.`\n ),\n error\n );\n });\n\n console.log(\n colors.green(\n `Deleted command \"${command.data.name}\" in ${guildCommands.guild.name}.`\n )\n );\n }\n\n continue;\n }\n\n // <!-- Edit dev command -->\n if (targetCommand) {\n const commandsAreDifferent = areSlashCommandsDifferent(\n targetCommand,\n command.data\n );\n\n if (commandsAreDifferent) {\n await targetCommand.\n edit(command.data as Partial<ApplicationCommandData>).\n catch((error) => {\n throw new Error(\n colors.red(\n `Failed to edit command \"${command.data.name}\" in ${guildCommands.guild.name}.\\n`\n ),\n error\n );\n });\n\n console.log(\n colors.green(\n `Edited command \"${command.data.name}\" in ${guildCommands.guild.name}.`\n )\n );\n\n continue;\n }\n }\n\n // <!-- Register guild command -->\n if (targetCommand) continue;\n\n await guildCommands.\n create(command.data as ApplicationCommandDataResolvable).\n catch((error) => {\n throw new Error(\n colors.red(\n `Failed to register command \"${command.data.name}\" in ${guildCommands.guild.name}.\\n`\n ),\n error\n );\n });\n\n console.log(\n colors.green(\n `Registered command \"${command.data.name}\" in ${guildCommands.guild.name}.`\n )\n );\n }\n }\n}","import type { BuiltInValidationParams } from '../typings';\n\nexport default function ({\n interaction,\n targetCommand,\n handlerData\n}: BuiltInValidationParams) {\n if (interaction.isAutocomplete()) return;\n\n if (targetCommand.options?.devOnly) {\n if (\n interaction.inGuild() &&\n !handlerData.devGuildIds.includes(interaction.guildId))\n {\n interaction.reply({\n content: '❌ This command can only be used inside development servers.',\n ephemeral: true\n });\n\n return true;\n }\n\n const guildMember = interaction.guild?.members.cache.get(\n interaction.user.id\n );\n const memberRoles = guildMember?.roles.cache;\n\n let hasDevRole = false;\n\n memberRoles?.forEach((role) => {\n if (handlerData.devRoleIds.includes(role.id)) {\n hasDevRole = true;\n }\n });\n\n const isDevUser =\n handlerData.devUserIds.includes(interaction.user.id) || hasDevRole;\n\n if (!isDevUser) {\n interaction.reply({\n content: '❌ This command can only be used by developers.',\n ephemeral: true\n });\n\n return true;\n }\n }\n}","import type { BuiltInValidationParams } from '../typings';\nimport { EmbedBuilder } from 'discord.js';\n\nexport default function ({\n interaction,\n targetCommand\n}: BuiltInValidationParams) {\n if (interaction.isAutocomplete()) return;\n const userPermissions = interaction.memberPermissions;\n let userPermissionsRequired = targetCommand.options?.userPermissions;\n let missingUserPermissions: string[] = [];\n\n if (typeof userPermissionsRequired === 'string') {\n userPermissionsRequired = [userPermissionsRequired];\n }\n\n const botPermissions = interaction.guild?.members.me?.permissions;\n let botPermissionsRequired = targetCommand.options?.botPermissions;\n let missingBotPermissions: string[] = [];\n\n if (typeof botPermissionsRequired === 'string') {\n botPermissionsRequired = [botPermissionsRequired];\n }\n\n if (!userPermissionsRequired?.length && !botPermissionsRequired?.length) {\n return;\n }\n\n if (userPermissions && userPermissionsRequired) {\n for (const permission of userPermissionsRequired) {\n const hasPermission = userPermissions.has(permission);\n\n if (!hasPermission) {\n missingUserPermissions.push(permission);\n }\n }\n }\n\n if (botPermissions && botPermissionsRequired) {\n for (const permission of botPermissionsRequired) {\n const hasPermission = botPermissions.has(permission);\n\n if (!hasPermission) {\n missingBotPermissions.push(permission);\n }\n }\n }\n\n if (!missingUserPermissions.length && !missingBotPermissions.length) {\n return;\n }\n\n // Fix casing. e.g. KickMembers -> Kick Members\n const pattern = /([a-z])([A-Z])|([A-Z]+)([A-Z][a-z])/g;\n\n missingUserPermissions = missingUserPermissions.map((str) =>\n str.replace(pattern, '$1$3 $2$4')\n );\n missingBotPermissions = missingBotPermissions.map((str) =>\n str.replace(pattern, '$1$3 $2$4')\n );\n\n let embedDescription = '';\n\n const formatter = new Intl.ListFormat('en', {\n style: 'long',\n type: 'conjunction'\n });\n\n const getPermissionWord = (permissions: string[]) =>\n permissions.length === 1 ? 'permission' : 'permissions';\n\n if (missingUserPermissions.length) {\n const formattedPermissions = missingUserPermissions.map((p) => `\\`${p}\\``);\n const permissionsString = formatter.format(formattedPermissions);\n\n embedDescription += `- You must have the ${permissionsString} ${getPermissionWord(\n missingUserPermissions\n )} to be able to run this command.\\n`;\n }\n\n if (missingBotPermissions.length) {\n const formattedPermissions = missingBotPermissions.map((p) => `\\`${p}\\``);\n const permissionsString = formatter.format(formattedPermissions);\n\n embedDescription += `- I must have the ${permissionsString} ${getPermissionWord(\n missingBotPermissions\n )} to be able to execute this command.\\n`;\n }\n\n const embed = new EmbedBuilder().\n setTitle(`:x: Missing permissions!`).\n setDescription(embedDescription).\n setColor('Red');\n\n interaction.reply({ embeds: [embed], ephemeral: true });\n return true;\n}","import devOnly from './devOnly';\nimport permissions from './permissions';\n\nexport default [devOnly, permissions];","import { randomUUID } from 'node:crypto';\nimport { CommandKit } from '../CommandKit';\nimport { GenericFunction, getContext } from './async-context';\n\nexport interface CommandKitEnvironmentInternalData {\n executionError: Error | null;\n type: CommandKitEnvironmentType | null;\n variables: Map<string, any>;\n deferredFunctions: Map<string, GenericFunction<[CommandKitEnvironment]>>;\n marker: string;\n markStart: number;\n markEnd: number;\n}\n\nexport class CommandKitEnvironment {\n #data: CommandKitEnvironmentInternalData = {\n executionError: null,\n type: null,\n variables: new Map(),\n deferredFunctions: new Map(),\n marker: '',\n markStart: 0,\n markEnd: 0\n };\n\n /**\n * Creates the commandkit execution environment.\n * @param commandkit - The commandkit instance.\n */\n public constructor(public readonly commandkit: CommandKit) {}\n\n /**\n * Get the execution error.\n * @internal\n */\n public getExecutionError(): Error | null {\n return this.#data.executionError;\n }\n\n /**\n * Set the execution error.\n * @param error - The error to set.\n * @internal\n */\n public setExecutionError(error: Error): void {\n if (this.#data.executionError) {\n throw new Error('Execution error already set.');\n }\n\n this.#data.executionError = error;\n }\n\n /**\n * Get the environment type.\n */\n public getType(): CommandKitEnvironmentType {\n const type = this.#data.type;\n\n if (!type) {\n throw new Error('Environment type not set.');\n }\n\n return type;\n }\n\n /**\n * Set the environment type.\n * @param type - The environment type to set.\n * @internal\n */\n public setType(type: CommandKitEnvironmentType): void {\n this.#data.type = type;\n }\n\n /**\n * The variables store for this environment.\n */\n public get variables(): Map<string, any> {\n return this.#data.variables;\n }\n\n /**\n * Register a deferred function.\n * @param fn - The deferred function to register.\n * @returns The deferred function id.\n * @internal\n */\n public registerDeferredFunction(\n fn: GenericFunction<[CommandKitEnvironment]>)\n : string {\n const id = randomUUID();\n this.#data.deferredFunctions.set(id, fn);\n return id;\n }\n\n /**\n * Clear a deferred function by id.\n * @param id - The deferred function id to clear.\n * @internal\n */\n public clearDeferredFunction(id: string): void {\n this.#data.deferredFunctions.delete(id);\n }\n\n /**\n * Run all deferred functions sequentially.\n * @internal\n */\n public async runDeferredFunctions(): Promise<void> {\n for (const [id, fn] of this.#data.deferredFunctions) {\n try {\n await fn(this);\n } catch (e) {\n this.commandkit.emit('unhandledDeferredFunctionRejection', e);\n } finally {\n this.clearDeferredFunction(id);\n }\n }\n }\n\n /**\n * Clear all deferred functions.\n * @internal\n */\n public clearAllDeferredFunctions(): void {\n this.#data.deferredFunctions.clear();\n }\n\n /**\n * Mark the start of a command execution.\n * @param marker - The marker to set.\n * @internal\n */\n public markStart(marker: string): void {\n this.#data.marker = marker;\n this.#data.markStart = performance.now();\n }\n\n /**\n * Mark the end of a command execution.\n * @internal\n */\n public markEnd(): void {\n if (!this.#data.markEnd) this.#data.markEnd = performance.now();\n }\n\n /**\n * Get the marker.\n * @internal\n */\n public getMarker(): string {\n return this.#data.marker;\n }\n\n /**\n * Get the execution time in milliseconds.\n * @internal\n */\n public getExecutionTime(): number {\n return Math.abs(this.#data.markEnd - this.#data.markStart);\n }\n}\n\nexport enum CommandKitEnvironmentType {\n CommandHandler = 'COMMAND_HANDLER',\n}\n\n/**\n * Runs the given function after the current handler has finished executing.\n * @param fn The function to run after the current handler.\n * @returns The deferred function id. This can be used to cancel the deferred function.\n */\nexport function after(fn: GenericFunction<[CommandKitEnvironment]>): string {\n const env = getContext();\n\n if (!env) {\n throw new Error('after must be called inside commandkit handler.');\n }\n\n return env.registerDeferredFunction(fn);\n}\n\n/**\n * Cancels a deferred function registered with `after`.\n * @param id The deferred function id to cancel.\n */\nexport function cancelAfter(id: string): void {\n const env = getContext();\n\n if (!env) {\n throw new Error('cancelAfter must be called inside commandkit handler.');\n }\n\n env.clearDeferredFunction(id);\n}","import { CacheType, Interaction } from 'discord.js';\nimport type {\n CommandData,\n CommandFileObject,\n ReloadOptions } from\n'../../types';\nimport { clone } from '../../utils/clone';\nimport colors from '../../utils/colors';\nimport { getFilePaths } from '../../utils/get-paths';\nimport { toFileURL } from '../../utils/resolve-file-url';\nimport loadCommandsWithRest from './functions/loadCommandsWithRest';\nimport registerCommands from './functions/registerCommands';\nimport type {\n CommandHandlerData,\n CommandHandlerOptions,\n CommandKitInteraction } from\n'./typings';\nimport builtInValidationsFunctions from './validations';\nimport {\n makeContextAwareFunction,\n useEnvironment } from\n'../../context/async-context';\nimport {\n after,\n CommandKitEnvironment,\n CommandKitEnvironmentType } from\n'../../context/environment';\n\nexport interface hCommandContext {\n interaction: CommandKitInteraction;\n command: CommandData;\n}\n\n/**\n * A handler for client application commands.\n */\nexport class CommandHandler {\n #data: CommandHandlerData;\n\n constructor({ ...options }: CommandHandlerOptions) {\n this.#data = {\n ...options,\n builtInValidations: [],\n commands: []\n };\n }\n\n async init() {\n await this.#buildCommands();\n\n this.#buildBuiltInValidations();\n\n const devOnlyCommands = this.#data.commands.filter(\n (cmd) => cmd.options?.devOnly\n );\n\n if (devOnlyCommands.length && !this.#data.devGuildIds.length) {\n process.emitWarning(\n colors.yellow(\n 'You have commands marked as \"devOnly\", but \"devGuildIds\" have not been set.'\n )\n );\n }\n\n if (\n devOnlyCommands.length &&\n !this.#data.devUserIds.length &&\n !this.#data.devRoleIds.length)\n {\n process.emitWarning(\n colors.yellow(\n 'You have commands marked as \"devOnly\", but \"devUserIds\" or \"devRoleIds\" have not been set.'\n )\n );\n }\n\n if (this.#data.bulkRegister) {\n await loadCommandsWithRest({\n client: this.#data.client,\n devGuildIds: this.#data.devGuildIds,\n commands: this.#data.commands\n });\n } else {\n await registerCommands({\n client: this.#data.client,\n devGuildIds: this.#data.devGuildIds,\n commands: this.#data.commands\n });\n }\n\n this.handleCommands();\n }\n\n async #buildCommands() {\n const allowedExtensions = /\\.(js|mjs|cjs|ts)$/i;\n const paths = await getFilePaths(this.#data.commandsPath, true);\n\n const commandFilePaths = paths.filter((path) =>\n allowedExtensions.test(path)\n );\n\n for (const commandFilePath of commandFilePaths) {\n const modulePath = toFileURL(commandFilePath);\n\n const importedObj = await import(`${modulePath}?t=${Date.now()}`);\n let commandObj: CommandFileObject = clone(importedObj); // Make commandObj extensible\n\n // If it's CommonJS, invalidate the import cache\n if (typeof module !== 'undefined' && typeof require !== 'undefined') {\n delete require.cache[require.resolve(commandFilePath)];\n }\n\n const compactFilePath =\n commandFilePath.split(process.cwd())[1] || commandFilePath;\n\n if (commandObj.default)\n commandObj = commandObj.default as CommandFileObject;\n\n // Ensure builder properties\n if (importedObj.default) {\n commandObj.data = importedObj.default.data;\n } else {\n commandObj.data = importedObj.data;\n }\n\n if (!commandObj.data) {\n process.emitWarning(\n colors.yellow(\n `Ignoring: Command file ${compactFilePath} does not export \"data\".`\n )\n );\n continue;\n }\n\n if (!commandObj.data.name) {\n process.emitWarning(\n colors.yellow(\n `Ignoring: Command file ${compactFilePath} does not export \"data.name\".`\n )\n );\n continue;\n }\n\n if (!commandObj.run) {\n process.emitWarning(\n colors.yellow(\n `Ignoring: Command file ${commandObj.data.name} does not export \"run\".`\n )\n );\n continue;\n }\n\n if (typeof commandObj.run !== 'function') {\n process.emitWarning(\n colors.yellow(\n `Ignoring: Command file ${commandObj.data.name} does not export \"run\" as a function.`\n )\n );\n continue;\n }\n\n commandObj.filePath = commandFilePath;\n\n let commandCategory =\n commandFilePath.\n split(this.#data.commandsPath)[1]?.\n replace(/\\\\\\\\|\\\\/g, '/').\n split('/')[1] || null;\n\n if (commandCategory && allowedExtensions.test(commandCategory)) {\n commandObj.category = null;\n } else {\n commandObj.category = commandCategory;\n }\n\n this.#data.commands.push(commandObj);\n }\n }\n\n #buildBuiltInValidations() {\n for (const builtInValidationFunction of builtInValidationsFunctions) {\n this.#data.builtInValidations.push(builtInValidationFunction);\n }\n }\n\n async #commandFinalizer() {\n const env = useEnvironment();\n\n await env.runDeferredFunctions();\n\n // Clear all deferred functions if we somehow missed them\n env.clearAllDeferredFunctions();\n }\n\n async #interactionHandler(interaction: Interaction<CacheType>) {\n if (\n !interaction.isChatInputCommand() &&\n !interaction.isContextMenuCommand() &&\n !interaction.isAutocomplete())\n\n return;\n\n const isAutocomplete = interaction.isAutocomplete();\n\n const targetCommand = this.#data.commands.find(\n (cmd) => cmd.data.name === interaction.commandName\n );\n\n if (!targetCommand) return;\n\n const env = useEnvironment();\n\n env.variables.set('interaction', interaction);\n\n const { data, options, run, autocomplete, ...rest } = targetCommand;\n\n // Skip if autocomplete handler is not defined\n if (isAutocomplete && !autocomplete) return;\n\n const executor = async () => {\n const commandObj = {\n data: targetCommand.data,\n options: targetCommand.options,\n ...rest\n };\n\n if (this.#data.validationHandler) {\n let canRun = true;\n\n for (const validationFunction of this.#data.validationHandler.\n validations) {\n const stopValidationLoop = await validationFunction({\n interaction,\n commandObj,\n client: this.#data.client,\n handler: this.#data.commandkitInstance\n });\n\n if (stopValidationLoop) {\n canRun = false;\n break;\n }\n }\n\n if (!canRun) return;\n }\n\n let canRun = true;\n\n // If custom validations pass and !skipBuiltInValidations, run built-in CommandKit validation functions\n if (!this.#data.skipBuiltInValidations) {\n for (const validation of this.#data.builtInValidations) {\n const stopValidationLoop = validation({\n targetCommand,\n interaction,\n handlerData: this.#data\n });\n\n if (stopValidationLoop) {\n canRun = false;\n break;\n }\n }\n }\n\n if (!canRun) return;\n\n const command = targetCommand[isAutocomplete ? 'autocomplete' : 'run']!;\n\n const context = {\n interaction,\n client: this.#data.client,\n handler: this.#data.commandkitInstance\n };\n\n const shouldDebug = this.#data.commandkitInstance.isDebuggingCommands();\n\n if (!shouldDebug) {\n return command(context);\n }\n\n after((env) => {\n const error = env.getExecutionError();\n const marker = env.getMarker();\n const time = `${env.getExecutionTime().toFixed(2)}ms`;\n const cached = !!env.variables.get('cacheHit');\n const cachedMarker = cached ? ' (cached)' : '';\n\n if (error) {\n console.error(\n colors.red(\n `[${marker} - ${time}]${cachedMarker} Error executing command: ${error}`\n )\n );\n return;\n }\n\n console.log(\n colors.green(\n `[${marker} - ${time}]${cachedMarker} Command executed successfully`\n )\n );\n });\n\n try {\n env.markStart(interaction.commandName);\n const res = await command(context);\n\n return res;\n } finally {\n env.markEnd();\n }\n };\n\n return executor();\n }\n\n handleCommands() {\n this.#data.client.on('interactionCreate', (interaction) => {\n const env = new CommandKitEnvironment(this.#data.commandkitInstance);\n env.setType(CommandKitEnvironmentType.CommandHandler);\n\n return makeContextAwareFunction(\n env,\n this.#interactionHandler.bind(this),\n this.#commandFinalizer.bind(this)\n )(interaction);\n });\n }\n\n get commands() {\n return this.#data.commands;\n }\n\n async reloadCommands(type?: ReloadOptions) {\n if (!this.#data.commandsPath) {\n throw new Error(\n colors.red(\n 'Cannot reload commands as \"commandsPath\" was not provided when instantiating CommandKit.'\n )\n );\n }\n\n this.#data.commands = [];\n\n // Re-build commands tree\n await this.#buildCommands();\n\n if (this.#data.bulkRegister) {\n await loadCommandsWithRest({\n client: this.#data.client,\n devGuildIds: this.#data.devGuildIds,\n commands: this.#data.commands,\n reloading: true,\n type\n });\n } else {\n await registerCommands({\n client: this.#data.client,\n devGuildIds: this.#data.devGuildIds,\n commands: this.#data.commands,\n reloading: true,\n type\n });\n }\n }\n}","import type { EventHandlerOptions, EventHandlerData } from './typings';\nimport type { CommandHandler } from '../command-handler/CommandHandler';\nimport { getFilePaths, getFolderPaths } from '../../utils/get-paths';\nimport { toFileURL } from '../../utils/resolve-file-url';\nimport { clone } from '../../utils/clone';\nimport colors from '../../utils/colors';\n\n/**\n * A handler for client events.\n */\nexport class EventHandler {\n #data: EventHandlerData;\n\n constructor({ ...options }: EventHandlerOptions) {\n this.#data = {\n ...options,\n events: []\n };\n }\n\n async init() {\n await this.#buildEvents();\n this.#registerEvents();\n }\n\n async #buildEvents() {\n const eventFolderPaths = await getFolderPaths(this.#data.eventsPath);\n\n for (const eventFolderPath of eventFolderPaths) {\n const eventName = eventFolderPath.\n replace(/\\\\\\\\|\\\\/g, '/').\n split('/').\n pop() as string;\n\n const allowedExtensions = /\\.(js|mjs|cjs|ts)$/i;\n const eventPaths = await getFilePaths(eventFolderPath, true);\n\n const eventFilePaths = eventPaths.filter((path) =>\n allowedExtensions.test(path)\n );\n\n const eventObj = {\n name: eventName,\n functions: [] as Function[]\n };\n\n this.#data.events.push(eventObj);\n\n for (const eventFilePath of eventFilePaths) {\n const modulePath = toFileURL(eventFilePath);\n\n let importedFunction = (await import(`${modulePath}?t=${Date.now()}`)).\n default;\n let eventFunction = clone(importedFunction);\n\n // If it's CommonJS, invalidate the import cache\n if (typeof module !== 'undefined' && typeof require !== 'undefined') {\n delete require.cache[require.resolve(eventFilePath)];\n }\n\n if (eventFunction?.default) {\n eventFunction = eventFunction.default;\n }\n\n const compactFilePath =\n eventFilePath.split(process.cwd())[1] || eventFilePath;\n\n if (typeof eventFunction !== 'function') {\n process.emitWarning(\n colors.yellow(\n `Ignoring: Event file ${compactFilePath} does not export a function.`\n )\n );\n continue;\n }\n\n eventObj.functions.push(eventFunction);\n }\n }\n }\n\n #registerEvents() {\n const client = this.#data.client;\n const handler = this.#data.commandKitInstance;\n\n for (const eventObj of this.#data.events) {\n client.on(eventObj.name, async (...params) => {\n for (const eventFunction of eventObj.functions) {\n const stopEventLoop = await eventFunction(...params, client, handler);\n\n if (stopEventLoop) {\n break;\n }\n }\n });\n }\n }\n\n get events() {\n return this.#data.events;\n }\n\n async reloadEvents(commandHandler?: CommandHandler) {\n if (!this.#data.eventsPath) {\n throw new Error(\n colors.red(\n 'Cannot reload events as \"eventsPath\" was not provided when instantiating CommandKit.'\n )\n );\n }\n\n this.#data.events = [];\n\n await this.#buildEvents();\n\n this.#data.client.removeAllListeners();\n\n this.#registerEvents();\n\n // Re-register \"interactionCreate\" event for application commands.\n commandHandler?.handleCommands();\n }\n}","import type {\n ValidationHandlerData,\n ValidationHandlerOptions } from\n'./typings';\nimport { toFileURL } from '../../utils/resolve-file-url';\nimport { getFilePaths } from '../../utils/get-paths';\nimport { clone } from '../../utils/clone';\nimport colors from '../../utils/colors';\n\n/**\n * A handler for command validations.\n */\nexport class ValidationHandler {\n #data: ValidationHandlerData;\n\n constructor({ ...options }: ValidationHandlerOptions) {\n this.#data = {\n ...options,\n validations: []\n };\n }\n\n async init() {\n this.#data.validations = await this.#buildValidations();\n }\n\n async #buildValidations() {\n const allowedExtensions = /\\.(js|mjs|cjs|ts)$/i;\n\n const validationPaths = await getFilePaths(\n this.#data.validationsPath,\n true\n );\n const validationFilePaths = validationPaths.filter((path) =>\n allowedExtensions.test(path)\n );\n\n const validationFunctions: Function[] = [];\n\n for (const validationFilePath of validationFilePaths) {\n const modulePath = toFileURL(validationFilePath);\n\n let importedFunction = (await import(`${modulePath}?t=${Date.now()}`)).\n default;\n let validationFunction = clone(importedFunction);\n\n // If it's CommonJS, invalidate the import cache\n if (typeof module !== 'undefined' && typeof require !== 'undefined') {\n delete require.cache[require.resolve(validationFilePath)];\n }\n\n if (validationFunction?.default) {\n validationFunction = validationFunction.default;\n }\n\n const compactFilePath =\n validationFilePath.split(process.cwd())[1] || validationFilePath;\n\n if (typeof validationFunction !== 'function') {\n process.emitWarning(\n colors.yellow(\n `Ignoring: Validation file ${compactFilePath} does not export a function.`\n )\n );\n continue;\n }\n\n validationFunctions.push(validationFunction);\n }\n\n return validationFunctions;\n }\n\n get validations() {\n return this.#data.validations;\n }\n\n async reloadValidations() {\n if (!this.#data.validationsPath) {\n throw new Error(\n colors.red(\n 'Cannot reload validations as \"validationsPath\" was not provided when instantiating CommandKit.'\n )\n );\n }\n\n const newValidations = await this.#buildValidations();\n\n this.#data.validations = newValidations;\n }\n}","export interface CacheEntry {\n key: string;\n value: any;\n ttl?: number;\n}\n\nexport abstract class CacheProvider {\n abstract get(key: string): Promise<CacheEntry | undefined>;\n abstract set(key: string, value: any, ttl?: number): Promise<void>;\n abstract exists(key: string): Promise<boolean>;\n abstract delete(key: string): Promise<void>;\n abstract clear(): Promise<void>;\n abstract expire(key: string, ttl: number): Promise<void>;\n}","import { CacheEntry, CacheProvider } from './CacheProvider';\n\nexport class MemoryCache extends CacheProvider {\n #cache = new Map<string, CacheEntry>();\n\n public async get<T>(key: string): Promise<T | undefined> {\n const entry = this.#cache.get(key);\n\n if (!entry) {\n return undefined;\n }\n\n if (entry.ttl && Date.now() > entry.ttl) {\n this.#cache.delete(key);\n return undefined;\n }\n\n return entry.value;\n }\n\n public async set<T>(key: string, value: T, ttl?: number): Promise<void> {\n this.#cache.set(key, {\n key,\n value,\n ttl: ttl != null ? Date.now() + ttl : undefined\n });\n }\n\n public async exists(key: string): Promise<boolean> {\n return this.#cache.has(key);\n }\n\n public async delete(key: string): Promise<void> {\n this.#cache.delete(key);\n }\n\n public async clear(): Promise<void> {\n this.#cache.clear();\n }\n\n public async expire(key: string, ttl: number): Promise<void> {\n const entry = this.#cache.get(key);\n\n if (!entry) return;\n\n const _ttl = Date.now() + ttl;\n\n // delete if _ttl is in the past\n if (_ttl < Date.now()) {\n this.#cache.delete(key);\n return;\n }\n\n entry.ttl = _ttl;\n }\n}","import colors from './colors';\n\nconst WARNED_KEYS = new Set<string>();\n\nexport function warnUnstable(name: string) {\n if (WARNED_KEYS.has(name)) return;\n\n WARNED_KEYS.add(name);\n\n process.emitWarning(\n `${name} is unstable and may change in future versions.`,\n {\n code: 'CommandKitUnstableWarning'\n }\n );\n}"],"mappings":"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","names":["import_node_async_hooks","rfdc","fs","path","import_path","path","path","canRun","context","env","path","path","EventEmitter","import_node_crypto","context","ms","data","ms"]}
@@ -1,2 +1,2 @@
1
- import{unstable_cache,unstable_cacheTag,unstable_expire,unstable_invalidate,unstable_revalidate}from"../chunk-S2LOXZTS.mjs";import"../chunk-MVPNDXHU.mjs";import"../chunk-Q7VUO3A3.mjs";import"../chunk-3TRGTPDU.mjs";import"../chunk-DW5KRS5H.mjs";import"../chunk-XJCWZEWC.mjs";import"../chunk-6AX5YJEO.mjs";import"../chunk-6TIGKCSX.mjs";import"../chunk-Z4FBPRS6.mjs";import"../chunk-K43A7OIY.mjs";import"../chunk-RGQOLRR6.mjs";import"../chunk-4OV4GE7B.mjs";import"../chunk-6BSP7AD3.mjs";import"../chunk-4CG7S6RY.mjs";import"../chunk-MNPCM4QU.mjs";import"../chunk-C6WU57FQ.mjs";import"../chunk-CKNUFVNV.mjs";import{MemoryCache}from"../chunk-GSYRGHXQ.mjs";import{CacheProvider}from"../chunk-47FOQCN7.mjs";import"../chunk-6TIBWNPX.mjs";export{CacheProvider,MemoryCache,unstable_cache,unstable_cacheTag,unstable_expire,unstable_invalidate,unstable_revalidate};
1
+ import{unstable_cache,unstable_cacheLife,unstable_cacheTag,unstable_expire,unstable_revalidate,use_cache}from"../chunk-YLJX7MMA.mjs";import"../chunk-MVPNDXHU.mjs";import"../chunk-3TRGTPDU.mjs";import"../chunk-DW5KRS5H.mjs";import"../chunk-XJCWZEWC.mjs";import"../chunk-6AX5YJEO.mjs";import"../chunk-6TIGKCSX.mjs";import"../chunk-Z4FBPRS6.mjs";import"../chunk-K43A7OIY.mjs";import"../chunk-RGQOLRR6.mjs";import"../chunk-4OV4GE7B.mjs";import"../chunk-6BSP7AD3.mjs";import"../chunk-4CG7S6RY.mjs";import"../chunk-MNPCM4QU.mjs";import"../chunk-C6WU57FQ.mjs";import"../chunk-CKNUFVNV.mjs";import{MemoryCache}from"../chunk-GSYRGHXQ.mjs";import{CacheProvider}from"../chunk-47FOQCN7.mjs";import"../chunk-6TIBWNPX.mjs";export{CacheProvider,MemoryCache,unstable_cache,unstable_cacheLife,unstable_cacheTag,unstable_expire,unstable_revalidate,use_cache as unstable_super_duper_secret_internal_for_use_cache_directive_of_commandkit_cli_do_not_use_it_directly_or_you_will_be_fired_kthxbai};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -0,0 +1,2 @@
1
+ import{warnUnstable}from"./chunk-MVPNDXHU.mjs";import{getCommandKit}from"./chunk-3TRGTPDU.mjs";import{__name}from"./chunk-6TIBWNPX.mjs";import{AsyncLocalStorage}from"node:async_hooks";import{randomUUID}from"node:crypto";import ms from"ms";var cacheContext=new AsyncLocalStorage,CACHE_FN_STORE=new Map;function unstable_cacheTag(options){warnUnstable("cacheTag()");let context=cacheContext.getStore();if(context===void 0)throw new Error('cacheTag() can only be used inside a function that use the "use cache" directive.');if(context===null)return;let opt=typeof options=="string"?{name:options}:options;opt.name&&(context.name=opt.name),opt.ttl!==void 0&&(context.ttl=opt.ttl)}__name(unstable_cacheTag,"unstable_cacheTag");function unstable_cacheLife(options){warnUnstable("cacheLife()");let context=cacheContext.getStore();if(context===void 0)throw new Error('cacheLife() can only be used inside a function that use the "use cache" directive.');if(context===null)return;let ttl=typeof options=="string"?ms(options):options;context.ttl=ttl}__name(unstable_cacheLife,"unstable_cacheLife");function unstable_cache(fn,options){warnUnstable("cache()");let cache=getCommandKit(!0).getCacheProvider();if(!cache)throw new Error("cache() cannot be used without a cache provider.");options??=randomUUID();let params=typeof options=="string"?{name:options}:options;params.ttl??=9e5;let firstRun=!0,_fn=__name(async(...args)=>{let _context=CACHE_FN_STORE.get(_fn);if(!firstRun&&!_context)return await fn(...args);firstRun=!1;let context=_context??params,data=await cache.get(context.name);if(data)return data;let result=await fn(...args);return await cache.set(context.name,result,context.ttl),result},"_fn");return CACHE_FN_STORE.set(_fn,params),_fn}__name(unstable_cache,"unstable_cache");function use_cache(fn){warnUnstable('"use cache"');let tagged=!1,originalFn;return __name(async(...args)=>{if(originalFn||(originalFn=unstable_cache(fn)),!tagged){let _params=CACHE_FN_STORE.get(originalFn);if(!_params)return originalFn(...args);let[params,data]=await cacheContext.run({name:_params?.name??"",ttl:_params?.ttl},async()=>{let data2=await originalFn(...args);return[cacheContext.getStore(),data2]});return params&&CACHE_FN_STORE.set(originalFn,{name:params.name??_params?.name??randomUUID(),ttl:params.ttl??_params?.ttl}),tagged=!0,data}return cacheContext.run(null,()=>originalFn(...args))},"memo")}__name(use_cache,"use_cache");async function unstable_revalidate(cache){warnUnstable("revalidate()");let cacheProvider=getCommandKit(!0).getCacheProvider();if(!cacheProvider)throw new Error("revalidate() cannot be used without a cache provider.");let target;for(let[fn,params]of CACHE_FN_STORE)if(params.name===cache){target=fn;break}if(!target)throw new Error("Invalid cache key.");await cacheProvider.delete(cache)}__name(unstable_revalidate,"unstable_revalidate");async function unstable_expire(cache,ttl){warnUnstable("expire()");let cacheProvider=getCommandKit(!0).getCacheProvider();if(!cacheProvider)throw new Error("expire() cannot be used without a cache provider.");let target;for(let[fn,params]of CACHE_FN_STORE)if(params.name===cache){target=fn;break}if(!target)throw new Error("Invalid cache key.");let _ttl=typeof ttl=="string"?ms(ttl):typeof ttl=="number"?ttl:null;_ttl!==null?await cacheProvider.expire(cache,_ttl):await cacheProvider.delete(cache)}__name(unstable_expire,"unstable_expire");export{unstable_cacheTag,unstable_cacheLife,unstable_cache,use_cache,unstable_revalidate,unstable_expire};
2
+ //# sourceMappingURL=chunk-YLJX7MMA.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cache/index.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks';\nimport { GenericFunction, getCommandKit } from '../context/async-context';\nimport { warnUnstable } from '../utils/warn-unstable';\nimport { randomUUID } from 'node:crypto';\nimport ms from 'ms';\n\nconst cacheContext = new AsyncLocalStorage<CacheOptions | null>();\nconst CACHE_FN_STORE = new Map<GenericFunction, CacheOptions>();\n\nexport * from './CacheProvider';\nexport * from './MemoryCache';\n\nexport interface CacheOptions {\n /**\n * The name of the cache key.\n */\n name: string;\n /**\n * The time-to-live of the cache key in milliseconds.\n */\n ttl?: number;\n}\n\n/**\n * Assigns cache tag parameters to the current function that uses the \"use cache\" directive.\n * @param options The cache options or the name of the cache key.\n */\nexport function unstable_cacheTag(options: string | CacheOptions): void {\n warnUnstable('cacheTag()');\n\n const context = cacheContext.getStore();\n\n if (context === undefined) {\n throw new Error(\n 'cacheTag() can only be used inside a function that use the \"use cache\" directive.'\n );\n }\n\n // already tagged\n if (context === null) return;\n\n const opt = typeof options === 'string' ? { name: options } : options;\n\n if (opt.name) context.name = opt.name;\n if (opt.ttl !== undefined) context.ttl = opt.ttl;\n}\n\n/**\n * Assigns cache lifetime to the current function that uses the \"use cache\" directive.\n * @param ttl The time-to-live of the cache key in milliseconds or milliseconds parsable string.\n */\nexport function unstable_cacheLife(options: string | number): void {\n warnUnstable('cacheLife()');\n\n const context = cacheContext.getStore();\n\n if (context === undefined) {\n throw new Error(\n 'cacheLife() can only be used inside a function that use the \"use cache\" directive.'\n );\n }\n\n // already tagged\n if (context === null) return;\n\n const ttl = typeof options === 'string' ? ms(options) : options;\n\n context.ttl = ttl;\n}\n\n/**\n * Cache a value.\n * @param options The cache options.\n */\nexport function unstable_cache<R, F extends (...args: any[]) => Promise<R>>(\nfn: F,\noptions?: string | CacheOptions | undefined)\n: F {\n warnUnstable('cache()');\n const commandkit = getCommandKit(true);\n const cache = commandkit.getCacheProvider();\n\n if (!cache) {\n throw new Error('cache() cannot be used without a cache provider.');\n }\n\n options ??= randomUUID();\n\n const params =\n typeof options === 'string' ?\n {\n name: options\n } :\n options;\n\n // default ttl to 15 minutes\n params.ttl ??= 900_000;\n\n let firstRun = true;\n\n const _fn = (async (...args: Parameters<F>): Promise<R> => {\n const _context = CACHE_FN_STORE.get(_fn);\n\n if (!firstRun && !_context) {\n return await fn(...args);\n }\n\n firstRun = false;\n\n const context = _context ?? params;\n\n // check cache\n const data = await cache.get(context.name);\n\n if (data) return data as R;\n\n // cache miss\n const result = await fn(...args);\n\n await cache.set(context.name, result, context.ttl);\n\n return result;\n }) as F;\n\n CACHE_FN_STORE.set(_fn, params);\n\n return _fn;\n}\n\n/**\n * @private\n * @internal\n */\nfunction use_cache<R, F extends (...args: any[]) => Promise<R>>(fn: F): F {\n warnUnstable('\"use cache\"');\n\n let tagged = false;\n let originalFn: F;\n\n const memo = (async (...args) => {\n if (!originalFn) {\n originalFn = unstable_cache(fn);\n }\n\n if (!tagged) {\n // validate cacheTag() usage\n const _params = CACHE_FN_STORE.get(originalFn);\n\n if (!_params) return originalFn(...args);\n\n const [params, data] = await cacheContext.run(\n {\n name: _params?.name ?? '',\n ttl: _params?.ttl\n },\n async () => {\n const data = await originalFn(...args);\n const maybeTaggedParams = cacheContext.getStore();\n return [maybeTaggedParams, data];\n }\n );\n\n if (params) {\n CACHE_FN_STORE.set(originalFn, {\n name: params.name ?? _params?.name ?? randomUUID(),\n ttl: params.ttl ?? _params?.ttl\n });\n }\n\n tagged = true;\n\n return data;\n }\n\n return cacheContext.run(null, () => originalFn(...args));\n }) as F;\n\n return memo;\n}\n\n// this is intentional, do not change or you will be fired\nexport { use_cache as unstable_super_duper_secret_internal_for_use_cache_directive_of_commandkit_cli_do_not_use_it_directly_or_you_will_be_fired_kthxbai };\n\n/**\n * Revalidate a cache by its key.\n * @param cache The cache key to revalidate.\n */\nexport async function unstable_revalidate(cache: string): Promise<void> {\n warnUnstable('revalidate()');\n const commandkit = getCommandKit(true);\n const cacheProvider = commandkit.getCacheProvider();\n\n if (!cacheProvider) {\n throw new Error('revalidate() cannot be used without a cache provider.');\n }\n\n let target: GenericFunction | undefined = undefined;\n\n for (const [fn, params] of CACHE_FN_STORE) {\n if (params.name === cache) {\n target = fn;\n break;\n }\n }\n\n if (!target) {\n throw new Error('Invalid cache key.');\n }\n\n await cacheProvider.delete(cache);\n}\n\n/**\n * Manually expire a cache by its key.\n * @param cache The cache key.\n * @param ttl The new time-to-live of the cache key in milliseconds. If not provided, the cache key will be deleted.\n */\nexport async function unstable_expire(\ncache: string,\nttl?: number | string)\n: Promise<void> {\n warnUnstable('expire()');\n const commandkit = getCommandKit(true);\n const cacheProvider = commandkit.getCacheProvider();\n\n if (!cacheProvider) {\n throw new Error('expire() cannot be used without a cache provider.');\n }\n\n let target: GenericFunction | undefined = undefined;\n\n for (const [fn, params] of CACHE_FN_STORE) {\n if (params.name === cache) {\n target = fn;\n break;\n }\n }\n\n if (!target) {\n throw new Error('Invalid cache key.');\n }\n\n const _ttl =\n typeof ttl === 'string' ? ms(ttl) : typeof ttl === 'number' ? ttl : null;\n\n if (_ttl !== null) {\n await cacheProvider.expire(cache, _ttl);\n } else {\n await cacheProvider.delete(cache);\n }\n}"],"mappings":"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","names":["data"]}
package/dist/index.d.mts CHANGED
@@ -2,7 +2,7 @@ export { A as AutocompleteProps, c as CommandContext, h as CommandData, d as Com
2
2
  export { ButtonKit, CommandKitButtonBuilderInteractionCollectorDispatch, CommandKitButtonBuilderInteractionCollectorDispatchContextData, CommandKitButtonBuilderOnEnd } from './components/ButtonKit.mjs';
3
3
  export { CommandKitConfig, defineConfig, getConfig } from './config.mjs';
4
4
  export { c as CommandKitEnvironment, C as CommandKitEnvironmentInternalData, e as CommandKitEnvironmentType, G as GenericFunction, f as after, h as cancelAfter, d as dmOnly, g as getCommandKit, a as getContext, b as guildOnly, m as makeContextAwareFunction, u as useEnvironment } from './async-context-C5FJOAIU.mjs';
5
- export { CacheOptions, unstable_cache, unstable_cacheTag, unstable_expire, unstable_invalidate, unstable_revalidate } from './cache/index.mjs';
5
+ export { CacheOptions, unstable_cache, unstable_cacheLife, unstable_cacheTag, unstable_expire, unstable_revalidate, unstable_super_duper_secret_internal_for_use_cache_directive_of_commandkit_cli_do_not_use_it_directly_or_you_will_be_fired_kthxbai } from './cache/index.mjs';
6
6
  export { CacheEntry, CacheProvider } from './cache/CacheProvider.mjs';
7
7
  export { MemoryCache } from './cache/MemoryCache.mjs';
8
8
  import './handlers/validation-handler/ValidationHandler.mjs';
package/dist/index.d.ts CHANGED
@@ -2,7 +2,7 @@ export { A as AutocompleteProps, c as CommandContext, h as CommandData, d as Com
2
2
  export { ButtonKit, CommandKitButtonBuilderInteractionCollectorDispatch, CommandKitButtonBuilderInteractionCollectorDispatchContextData, CommandKitButtonBuilderOnEnd } from './components/ButtonKit.js';
3
3
  export { CommandKitConfig, defineConfig, getConfig } from './config.js';
4
4
  export { c as CommandKitEnvironment, C as CommandKitEnvironmentInternalData, e as CommandKitEnvironmentType, G as GenericFunction, f as after, h as cancelAfter, d as dmOnly, g as getCommandKit, a as getContext, b as guildOnly, m as makeContextAwareFunction, u as useEnvironment } from './async-context-DnJSN785.js';
5
- export { CacheOptions, unstable_cache, unstable_cacheTag, unstable_expire, unstable_invalidate, unstable_revalidate } from './cache/index.js';
5
+ export { CacheOptions, unstable_cache, unstable_cacheLife, unstable_cacheTag, unstable_expire, unstable_revalidate, unstable_super_duper_secret_internal_for_use_cache_directive_of_commandkit_cli_do_not_use_it_directly_or_you_will_be_fired_kthxbai } from './cache/index.js';
6
6
  export { CacheEntry, CacheProvider } from './cache/CacheProvider.js';
7
7
  export { MemoryCache } from './cache/MemoryCache.js';
8
8
  import './handlers/validation-handler/ValidationHandler.js';