commandkit 1.2.4 → 1.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/analytics/analytics-engine.js +1 -1
- package/dist/analytics/constants.js.map +1 -1
- package/dist/analytics/utils.js +1 -1
- package/dist/app/commands/AppCommandRunner.js +1 -1
- package/dist/app/commands/Context.js +1 -1
- package/dist/app/commands/MessageCommandParser.js.map +1 -1
- package/dist/app/commands/helpers.js.map +1 -1
- package/dist/app/events/EventWorkerContext.js.map +1 -1
- package/dist/app/handlers/AppCommandHandler.js +1 -1
- package/dist/app/handlers/AppEventsHandler.js +1 -1
- package/dist/app/index.js +1 -1
- package/dist/app/interrupt/signals.js.map +1 -1
- package/dist/app/middlewares/permissions.js +1 -1
- package/dist/app/register/CommandRegistrar.js +1 -1
- package/dist/app/router/CommandsRouter.js.map +1 -1
- package/dist/app/router/EventsRouter.js.map +1 -1
- package/dist/app/router/TreeArtifact.js.map +1 -1
- package/dist/cli/app-process.js.map +1 -1
- package/dist/cli/build.js +1 -1
- package/dist/cli/build.js.map +1 -1
- package/dist/cli/common.js.map +1 -1
- package/dist/cli/development.js +1 -1
- package/dist/cli/development.js.map +1 -1
- package/dist/cli/env.js.map +1 -1
- package/dist/cli/generators.js.map +1 -1
- package/dist/cli/information.js.map +1 -1
- package/dist/cli/init.js +1 -1
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/production.js +1 -1
- package/dist/cli/production.js.map +1 -1
- package/dist/cli/type-checker.js.map +1 -1
- package/dist/cli/utils.js.map +1 -1
- package/dist/{commandkit-5cCZPGBF.js → commandkit-BMeeFmdY.js} +6 -4
- package/dist/commandkit-BMeeFmdY.js.map +1 -0
- package/dist/commandkit.js +1 -1
- package/dist/components/common/EventInterceptor.js.map +1 -1
- package/dist/components/common/element.js +1 -1
- package/dist/components/display/common.js +1 -1
- package/dist/components/display/container.js +1 -1
- package/dist/components/display/file.js.map +1 -1
- package/dist/components/display/index.js +1 -1
- package/dist/components/display/label.js +1 -1
- package/dist/components/display/media-gallery.js +1 -1
- package/dist/components/display/poll.js.map +1 -1
- package/dist/components/display/section.js +1 -1
- package/dist/components/display/separator.js.map +1 -1
- package/dist/components/display/text-display.js.map +1 -1
- package/dist/components/index.js +1 -1
- package/dist/components/interactive/action-row/ActionRow.js.map +1 -1
- package/dist/components/interactive/button/Button.js +1 -1
- package/dist/components/interactive/button/ButtonKit.js +1 -1
- package/dist/components/interactive/checkbox/checkbox.js +1 -1
- package/dist/components/interactive/modal/Modal.js +1 -1
- package/dist/components/interactive/modal/ModalKit.js +1 -1
- package/dist/components/interactive/radio/radio.js +1 -1
- package/dist/components/interactive/select-menu/ChannelSelectMenuKit.js +1 -1
- package/dist/components/interactive/select-menu/MentionableSelectMenuKit.js +1 -1
- package/dist/components/interactive/select-menu/RoleSelectMenuKit.js +1 -1
- package/dist/components/interactive/select-menu/SelectMenu.js +1 -1
- package/dist/components/interactive/select-menu/StringSelectMenuKit.js +1 -1
- package/dist/components/interactive/select-menu/UserSelectMenuKit.js +1 -1
- package/dist/config/config.js +1 -1
- package/dist/config/default.js +1 -1
- package/dist/config/loader.js +1 -1
- package/dist/config/utils.js.map +1 -1
- package/dist/context/async-context.js +1 -1
- package/dist/context/environment.js +1 -1
- package/dist/events/CommandKitEventsChannel.js.map +1 -1
- package/dist/flags/FlagProvider.js.map +1 -1
- package/dist/flags/feature-flags.js +1 -1
- package/dist/flags/store.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/kv/constants.js.map +1 -1
- package/dist/kv/dotprops.js.map +1 -1
- package/dist/kv/kv.js.map +1 -1
- package/dist/kv/serde.js.map +1 -1
- package/dist/logger/DefaultLogger.js +1 -1
- package/dist/logger/Logger.js +1 -1
- package/dist/logger/NoopLogger.js.map +1 -1
- package/dist/plugins/CompilerPlugin.js.map +1 -1
- package/dist/plugins/PluginCommon.js.map +1 -1
- package/dist/plugins/RuntimePlugin.js.map +1 -1
- package/dist/plugins/index.js +1 -1
- package/dist/plugins/plugin-runtime/CommandKitPluginRuntime.js +1 -1
- package/dist/plugins/plugin-runtime/CompilerPluginRuntime.js +1 -1
- package/dist/plugins/plugin-runtime/builtin/CommonDirectiveTransformer.js +1 -1
- package/dist/plugins/plugin-runtime/builtin/MacroPlugin.js +1 -1
- package/dist/utils/colors.js.map +1 -1
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/dev-hooks.js +1 -1
- package/dist/utils/error-codes.js.map +1 -1
- package/dist/utils/resolve-file-url.js.map +1 -1
- package/dist/utils/types-package.js.map +1 -1
- package/dist/utils/useful-stuff/async-queue.js.map +1 -1
- package/dist/utils/useful-stuff/mutex.js.map +1 -1
- package/dist/utils/useful-stuff/ratelimiter.js.map +1 -1
- package/dist/utils/useful-stuff/semaphore.js.map +1 -1
- package/dist/utils/utilities.js +1 -1
- package/dist/utils/warning.js.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +3 -3
- package/dist/commandkit-5cCZPGBF.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
-
const require_commandkit = require("../commandkit-
|
|
2
|
+
const require_commandkit = require("../commandkit-BMeeFmdY.js");
|
|
3
3
|
|
|
4
4
|
exports.AnalyticsEngine = require_commandkit.AnalyticsEngine;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","names":["randomUUID"],"sources":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"constants.js","names":["randomUUID"],"sources":["../../src/analytics/constants.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\n/**\n * @private\n * @internal\n */\nexport const DO_NOT_TRACK_KEY = `COMMANDKIT_ANALYTICS__DO_NOT_TRACK::${randomUUID()}`;\n\n/**\n * The analytics events that are used in CommandKit.\n * These events are used to track various actions and metrics within the CommandKit framework.\n */\nexport const AnalyticsEvents = {\n // commands\n COMMAND_EXECUTION: 'command_execution',\n // feature flags\n FEATURE_FLAG_METRICS: 'feature_flag_metrics',\n FEATURE_FLAG_DECISION: 'feature_flag_decision',\n // @commandkit/cache\n CACHE_HIT: 'cache_hit',\n CACHE_MISS: 'cache_miss',\n CACHE_REVALIDATED: 'cache_revalidated',\n} as const;\n\n/**\n * The type of analytics events that can be tracked in CommandKit.\n * This type is derived from the keys of the `AnalyticsEvents` object.\n * It ensures that only valid analytics events can be used in the tracking functions.\n */\nexport type AnalyticsEvent =\n (typeof AnalyticsEvents)[keyof typeof AnalyticsEvents];\n"],"mappings":";;;;;;;;AAMA,MAAa,mBAAmB,2CAAuCA,wBAAW;;;;;AAMlF,MAAa,kBAAkB;CAE7B,mBAAmB;CAEnB,sBAAsB;CACtB,uBAAuB;CAEvB,WAAW;CACX,YAAY;CACZ,mBAAmB;AACrB"}
|
package/dist/analytics/utils.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
-
const require_commandkit = require("../commandkit-
|
|
2
|
+
const require_commandkit = require("../commandkit-BMeeFmdY.js");
|
|
3
3
|
|
|
4
4
|
exports.getDoNotTrack = require_commandkit.getDoNotTrack;
|
|
5
5
|
exports.noAnalytics = require_commandkit.noAnalytics;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
-
const require_commandkit = require("../../commandkit-
|
|
2
|
+
const require_commandkit = require("../../commandkit-BMeeFmdY.js");
|
|
3
3
|
|
|
4
4
|
exports.AppCommandRunner = require_commandkit.AppCommandRunner;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
-
const require_commandkit = require("../../commandkit-
|
|
2
|
+
const require_commandkit = require("../../commandkit-BMeeFmdY.js");
|
|
3
3
|
|
|
4
4
|
exports.CommandExecutionMode = require_commandkit.CommandExecutionMode;
|
|
5
5
|
exports.Context = require_commandkit.Context;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageCommandParser.js","names":["createCommandKitError","CommandKitErrorCodes","ApplicationCommandOptionType","GuildMember","User","Role"],"sources":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"MessageCommandParser.js","names":["createCommandKitError","CommandKitErrorCodes","ApplicationCommandOptionType","GuildMember","User","Role"],"sources":["../../../src/app/commands/MessageCommandParser.ts"],"sourcesContent":["import { Channel } from 'diagnostics_channel';\nimport {\n Message,\n ApplicationCommandOptionType,\n GuildMember,\n Attachment,\n User,\n Role,\n CommandInteractionOption,\n} from 'discord.js';\nimport {\n CommandKitErrorCodes,\n createCommandKitError,\n} from '../../utils/error-codes';\n\n/**\n * Represents a parsed message command with its components.\n */\nexport interface ParsedMessageCommand {\n command: string;\n options: { name: string; value: unknown }[];\n subcommand?: string;\n subcommandGroup?: string;\n fullRoute: string[];\n}\n\n/**\n * Schema defining the types of options for a message command.\n */\nexport type MessageCommandOptionsSchema = Record<\n string,\n ApplicationCommandOptionType\n>;\n\n/**\n * Parses message content into structured command data with options and subcommands.\n */\nexport class MessageCommandParser {\n /**\n * @private\n * @internal\n */\n #parsed: ParsedMessageCommand | null = null;\n\n /**\n * @private\n * @internal\n */\n #options: MessageCommandOptions | null = null;\n\n /**\n * @private\n * @internal\n */\n #args: string[] = [];\n\n /**\n * Creates a new message command parser.\n * @param message - The Discord message to parse\n * @param prefix - Array of valid command prefixes or a regular expression\n * @param schema - Function that returns the options schema for a command\n */\n public constructor(\n public message: Message,\n private prefix: string[] | RegExp,\n private schema: (command: string) => MessageCommandOptionsSchema,\n ) {}\n\n /**\n * Gets the parsed command arguments.\n * @returns Array of command arguments\n */\n public getArgs() {\n void this.parse();\n return this.#args;\n }\n\n /**\n * Gets the message command options object for easy access to typed option values.\n */\n public get options() {\n if (!this.#options) {\n this.#options = new MessageCommandOptions(this);\n }\n\n return this.#options;\n }\n\n /**\n * Gets a specific option value by name.\n * @param name - The option name\n * @returns The option value or undefined if not found\n */\n public getOption<T>(name: string): T | undefined {\n return this.parse().options.find((o) => o.name === name)?.value as T;\n }\n\n /**\n * Gets the main command name.\n * @returns The command name\n */\n public getCommand(): string {\n return this.parse().command;\n }\n\n /**\n * Gets the full command route as an array of segments.\n * @returns Array of command segments\n */\n public getFullRoute(): string[] {\n return this.parse().fullRoute;\n }\n\n /**\n * Gets the subcommand name if present.\n * @returns The subcommand name or undefined\n */\n public getSubcommand(): string | undefined {\n return this.parse().subcommand;\n }\n\n /**\n * Gets the subcommand group name if present.\n * @returns The subcommand group name or undefined\n */\n public getSubcommandGroup(): string | undefined {\n return this.parse().subcommandGroup;\n }\n\n /**\n * Gets the prefix used in the message.\n * @returns The matched prefix or undefined\n */\n public getPrefix() {\n if (this.prefix instanceof RegExp) {\n const match = this.message.content.match(this.prefix);\n return match?.[0];\n }\n\n for (const p of this.prefix) {\n if (this.message.content.startsWith(p)) {\n return p;\n }\n }\n }\n\n /**\n * Gets the full command including subcommand group and subcommand.\n * @returns The complete command string\n */\n public getFullCommand() {\n return this.getFullRoute().join(' ');\n }\n\n /**\n * Parses the message content into structured command data.\n * @returns The parsed command data\n */\n public parse(): ParsedMessageCommand {\n if (this.#parsed) {\n return this.#parsed;\n }\n\n const content = this.message.content;\n\n const prefix = this.getPrefix();\n\n if (!prefix) {\n throw createCommandKitError(CommandKitErrorCodes.InvalidCommandPrefix);\n }\n\n const body = content.slice(prefix.length).trim();\n\n if (!body) {\n throw createCommandKitError(CommandKitErrorCodes.InvalidCommandPrefix);\n }\n\n const parts = body.split(' ');\n const commandToken = parts.shift();\n\n this.#args = parts;\n\n let command: string | undefined = '';\n let subcommandGroup: string | undefined;\n let subcommand: string | undefined;\n\n const fullRoute = commandToken?.split(':') ?? [];\n\n if (fullRoute.length) {\n command = fullRoute[0];\n\n if (fullRoute.length === 2) {\n subcommand = fullRoute[1];\n } else if (fullRoute.length >= 3) {\n subcommandGroup = fullRoute[1];\n subcommand = fullRoute[fullRoute.length - 1];\n }\n }\n\n const schema = this.schema(fullRoute.join(' ').trim());\n\n const options = parts\n .map((part) => {\n try {\n const [name, value] = part.split(':');\n\n if (!(name in schema)) return null;\n\n switch (schema[name]) {\n case ApplicationCommandOptionType.Boolean:\n return { name, value: value === 'true' };\n case ApplicationCommandOptionType.Integer:\n return { name, value: parseInt(value, 10) };\n case ApplicationCommandOptionType.Number:\n return { name, value: parseFloat(value) };\n case ApplicationCommandOptionType.String:\n return { name, value };\n case ApplicationCommandOptionType.User:\n return {\n name,\n value: this.message.mentions.users.find((u) => {\n return u.id === value.replace(/[<@!>]/g, '');\n }),\n };\n case ApplicationCommandOptionType.Channel:\n return {\n name,\n value: this.message.mentions.channels.find((c) => {\n return c.id === value.replace(/[<#>]/g, '');\n }),\n };\n case ApplicationCommandOptionType.Role:\n return {\n name,\n value: this.message.mentions.roles.find((r) => {\n return r.id === value.replace(/[<@&>]/g, '');\n }),\n };\n case ApplicationCommandOptionType.Attachment:\n return {\n name,\n value: this.message.attachments.find((a) => {\n return a.name === value;\n }),\n };\n default:\n return null;\n }\n } catch {\n // Invalid option\n return null;\n }\n })\n .filter((v) => v !== null);\n\n this.#parsed = {\n command: command!,\n options,\n subcommand,\n subcommandGroup,\n fullRoute,\n };\n\n return this.#parsed;\n }\n}\n\n/**\n * Provides typed access to message command options with methods similar to Discord.js interaction options.\n */\nexport class MessageCommandOptions {\n /**\n * Creates a new message command options instance.\n * @param parser - The message command parser instance\n */\n public constructor(private parser: MessageCommandParser) {}\n\n /**\n * @private\n * @internal\n */\n private assertOption<T>(name: string, required = false) {\n const option = this.parser.getOption<T>(name);\n\n if (required && option === undefined) {\n throw new Error(`Option \"${name}\" is required.`);\n }\n\n return option ?? null;\n }\n\n /**\n * Gets a guild member from the command options.\n * @param name - The option name\n * @param required - Whether the option is required\n * @returns The guild member or null if not found\n */\n getMember(name: string): GuildMember | null;\n getMember(name: string, required: true): GuildMember;\n getMember(name: string, required = false) {\n const user = this.assertOption<User>(name, required);\n const member = this.parser.message.guild?.members.cache.get(user?.id!);\n\n if (required && !member) {\n throw new Error(`Member \"${name}\" is required.`);\n }\n\n return member ?? null;\n }\n\n /**\n * Gets an attachment from the command options.\n * @param name - The option name\n * @param required - Whether the option is required\n * @returns The attachment or null if not found\n */\n getAttachment(name: string): Attachment | null;\n getAttachment(name: string, required: true): Attachment;\n getAttachment(name: string, required = false) {\n return this.assertOption<Attachment>(name, required);\n }\n\n /**\n * Gets a boolean value from the command options.\n * @param name - The option name\n * @param required - Whether the option is required\n * @returns The boolean value or null if not found\n */\n getBoolean(name: string): boolean | null;\n getBoolean(name: string, required: true): boolean;\n getBoolean(name: string, required = false) {\n return this.assertOption<boolean>(name, required);\n }\n\n /**\n * Gets a number value from the command options.\n * @param name - The option name\n * @param required - Whether the option is required\n * @returns The number value or null if not found\n */\n getNumber(name: string): number | null;\n getNumber(name: string, required: true): number;\n getNumber(name: string, required = false) {\n return this.assertOption<number>(name, required);\n }\n\n /**\n * Gets a string value from the command options.\n * @param name - The option name\n * @param required - Whether the option is required\n * @returns The string value or null if not found\n */\n getString(name: string): string | null;\n getString(name: string, required: true): string;\n getString(name: string, required = false) {\n return this.assertOption<string>(name, required);\n }\n\n /**\n * Gets an integer value from the command options.\n * @param name - The option name\n * @param required - Whether the option is required\n * @returns The integer value or null if not found\n */\n getInteger(name: string): number | null;\n getInteger(name: string, required: true): number;\n getInteger(name: string, required = false) {\n return this.assertOption<number>(name, required);\n }\n\n /**\n * Gets a user from the command options.\n * @param name - The option name\n * @param required - Whether the option is required\n * @returns The user or null if not found\n */\n getUser(name: string): User | null;\n getUser(name: string, required: true): User;\n getUser(name: string, required = false) {\n return this.assertOption<User>(name, required);\n }\n\n /**\n * Gets a channel from the command options.\n * @param name - The option name\n * @param required - Whether the option is required\n * @returns The channel or null if not found\n */\n getChannel(name: string): Channel | null;\n getChannel(name: string, required: true): Channel;\n getChannel(name: string, required = false) {\n return this.assertOption<Channel>(name, required);\n }\n\n /**\n * Gets a role from the command options.\n * @param name - The option name\n * @param required - Whether the option is required\n * @returns The role or null if not found\n */\n getRole(name: string): Role | null;\n getRole(name: string, required: true): Role;\n getRole(name: string, required = false) {\n return this.assertOption<Role>(name, required);\n }\n\n /**\n * Gets a mentionable (user, member, or role) from the command options.\n * @param name - The option name\n * @param required - Whether the option is required\n * @returns The mentionable or null if not found\n */\n getMentionable(\n name: string,\n ): NonNullable<CommandInteractionOption['member' | 'role' | 'user']> | null;\n getMentionable(\n name: string,\n required: true,\n ): NonNullable<CommandInteractionOption['member' | 'role' | 'user']>;\n getMentionable(\n name: string,\n required = false,\n ): NonNullable<CommandInteractionOption['member' | 'role' | 'user']> | null {\n const target = this.assertOption(name, required);\n\n if (\n target instanceof GuildMember ||\n target instanceof User ||\n target instanceof Role\n ) {\n return target;\n }\n\n if (required) {\n throw new Error(`Mentionable \"${name}\" is required.`);\n }\n\n return null;\n }\n\n /**\n * Gets the subcommand name from the command.\n * @param required - Whether the subcommand is required\n * @returns The subcommand name or null if not found\n */\n getSubcommand(): string | null;\n getSubcommand(required: true): string;\n getSubcommand(required = false) {\n const sub = this.parser.getSubcommand();\n\n if (required && sub === undefined) {\n throw new Error('Subcommand is required.');\n }\n\n return sub ?? null;\n }\n\n /**\n * Gets the subcommand group name from the command.\n * @param required - Whether the subcommand group is required\n * @returns The subcommand group name or null if not found\n */\n getSubcommandGroup(): string | null;\n getSubcommandGroup(required: true): string;\n getSubcommandGroup(required = false) {\n const sub = this.parser.getSubcommandGroup();\n\n if (required && sub === undefined) {\n throw new Error('Subcommand group is required.');\n }\n\n return sub ?? null;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","names":["Message"],"sources":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"helpers.js","names":["Message"],"sources":["../../../src/app/commands/helpers.ts"],"sourcesContent":["import { Interaction, Message } from 'discord.js';\n\n/**\n * Union type representing possible command sources.\n */\nexport type CommandSource = Interaction | Message;\n\n/**\n * Type guard to check if a command source is a Discord message.\n * @param source - The command source to check\n * @returns True if the source is a Message\n */\nexport function isMessageSource(source: CommandSource): source is Message {\n return source instanceof Message;\n}\n\n/**\n * Type guard to check if a command source is a Discord interaction.\n * @param source - The command source to check\n * @returns True if the source is an Interaction\n */\nexport function isInteractionSource(\n source: CommandSource,\n): source is Interaction {\n return !isMessageSource(source);\n}\n"],"mappings":";;;;;;;;;AAYA,SAAgB,gBAAgB,QAA0C;CACxE,OAAO,kBAAkBA;AAC3B;;;;;;AAOA,SAAgB,oBACd,QACuB;CACvB,OAAO,CAAC,gBAAgB,MAAM;AAChC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventWorkerContext.js","names":["AsyncLocalStorage"],"sources":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"EventWorkerContext.js","names":["AsyncLocalStorage"],"sources":["../../../src/app/events/EventWorkerContext.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks';\nimport { ParsedEvent } from '../router';\nimport type { CommandKit } from '../../commandkit';\n\n/**\n * Context object containing information about the currently executing event.\n */\nexport interface EventWorkerContext {\n event: string;\n namespace: string | null;\n data: ParsedEvent;\n commandkit: CommandKit;\n arguments: any[];\n variables: Map<string, any>;\n}\n\n/**\n * @private\n * @internal\n */\nconst kEventWorker = Symbol('commandkitEventWorker');\n\n/**\n * Async local storage for event worker context.\n */\nexport const eventWorkerContext = new AsyncLocalStorage<EventWorkerContext>();\n\n/**\n * Runs a callback within an event worker context.\n * @param context - The event worker context\n * @param callback - The callback to execute\n * @returns The result of the callback\n */\nexport function runInEventWorkerContext<T>(\n context: EventWorkerContext,\n callback: () => T,\n): T {\n Reflect.set(context, kEventWorker, true);\n\n return eventWorkerContext.run(context, callback);\n}\n\n/**\n * Gets the current event worker context.\n * @returns The current event worker context\n * @throws Error if no context is found\n */\nexport function getEventWorkerContext(): EventWorkerContext {\n const context = eventWorkerContext.getStore();\n\n if (!context) {\n throw new Error('Event worker context not found');\n }\n\n return context;\n}\n\n/**\n * Type guard to check if an object is an event worker context.\n * @param worker - The object to check\n * @returns True if the object is an event worker context\n */\nexport function isEventWorkerContext(\n worker: any,\n): worker is EventWorkerContext {\n return worker && Reflect.get(worker, kEventWorker) === true;\n}\n"],"mappings":";;;;;;;;AAoBA,MAAM,eAAe,OAAO,uBAAuB;;;;AAKnD,MAAa,qBAAqB,IAAIA,mCAAsC;;;;;;;AAQ5E,SAAgB,wBACd,SACA,UACG;CACH,QAAQ,IAAI,SAAS,cAAc,IAAI;CAEvC,OAAO,mBAAmB,IAAI,SAAS,QAAQ;AACjD;;;;;;AAOA,SAAgB,wBAA4C;CAC1D,MAAM,UAAU,mBAAmB,SAAS;CAE5C,IAAI,CAAC,SACH,MAAM,IAAI,MAAM,gCAAgC;CAGlD,OAAO;AACT;;;;;;AAOA,SAAgB,qBACd,QAC8B;CAC9B,OAAO,UAAU,QAAQ,IAAI,QAAQ,YAAY,MAAM;AACzD"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
-
const require_commandkit = require("../../commandkit-
|
|
2
|
+
const require_commandkit = require("../../commandkit-BMeeFmdY.js");
|
|
3
3
|
|
|
4
4
|
exports.AppCommandHandler = require_commandkit.AppCommandHandler;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
-
const require_commandkit = require("../../commandkit-
|
|
2
|
+
const require_commandkit = require("../../commandkit-BMeeFmdY.js");
|
|
3
3
|
|
|
4
4
|
exports.AppEventsHandler = require_commandkit.AppEventsHandler;
|
package/dist/app/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
-
const require_commandkit = require("../commandkit-
|
|
2
|
+
const require_commandkit = require("../commandkit-BMeeFmdY.js");
|
|
3
3
|
const require_app_interrupt_signals = require("./interrupt/signals.js");
|
|
4
4
|
const require_app_commands_helpers = require("./commands/helpers.js");
|
|
5
5
|
const require_app_commands_MessageCommandParser = require("./commands/MessageCommandParser.js");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signals.js","names":["createCommandKitError","CommandKitErrorCodes","isCommandKitError","eventWorkerContext"],"sources":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"signals.js","names":["createCommandKitError","CommandKitErrorCodes","isCommandKitError","eventWorkerContext"],"sources":["../../../src/app/interrupt/signals.ts"],"sourcesContent":["import {\n CommandKitErrorCodes,\n createCommandKitError,\n isCommandKitError,\n} from '../../utils/error-codes';\nimport { eventWorkerContext } from '../events/EventWorkerContext';\n\n/**\n * Stop upcoming middlewares and command execution.\n */\nexport function stopMiddlewares(): never {\n throw createCommandKitError(CommandKitErrorCodes.StopMiddlewares);\n}\n\n/**\n * Rethrow the error if it is a CommandKit error.\n * @param error The error to rethrow.\n * @example try {\n * doSomething();\n * } catch(e) {\n * // do something\n *\n * // throw the error if it's a commandkit error\n * rethrow(e)\n * }\n */\nexport function rethrow(error: unknown): void {\n if (isCommandKitError(error)) throw error;\n}\n\n/**\n * Stops current command assuming it has been redirected to another command.\n */\nexport function redirect(): never {\n throw createCommandKitError(CommandKitErrorCodes.ForwardedCommand);\n}\n\n/**\n * Stops event propagation. This function should be called inside an event handler\n * to prevent further event handling.\n * @example // src/app/events/messageCreate/handler.ts\n * import { stopEvents } from 'commandkit';\n *\n * export default async function messageCreateHandler() {\n * console.log('Message created');\n * // Stop further event propagation\n * stopEvents();\n * }\n */\nexport function stopEvents(): never {\n if (!eventWorkerContext.getStore()) {\n throw new Error('stopEvents() may only be called inside an event handler');\n }\n\n throw createCommandKitError(CommandKitErrorCodes.StopEvents);\n}\n"],"mappings":";;;;;;;;AAUA,SAAgB,kBAAyB;CACvC,MAAMA,gDAAsBC,+CAAqB,eAAe;AAClE;;;;;;;;;;;;;AAcA,SAAgB,QAAQ,OAAsB;CAC5C,IAAIC,4CAAkB,KAAK,GAAG,MAAM;AACtC;;;;AAKA,SAAgB,WAAkB;CAChC,MAAMF,gDAAsBC,+CAAqB,gBAAgB;AACnE;;;;;;;;;;;;;AAcA,SAAgB,aAAoB;CAClC,IAAI,CAACE,yDAAmB,SAAS,GAC/B,MAAM,IAAI,MAAM,yDAAyD;CAG3E,MAAMH,gDAAsBC,+CAAqB,UAAU;AAC7D"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
-
const require_commandkit = require("../../commandkit-
|
|
2
|
+
const require_commandkit = require("../../commandkit-BMeeFmdY.js");
|
|
3
3
|
|
|
4
4
|
exports.beforeExecute = require_commandkit.beforeExecute;
|
|
5
5
|
exports.middlewareId = require_commandkit.middlewareId;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
-
const require_commandkit = require("../../commandkit-
|
|
2
|
+
const require_commandkit = require("../../commandkit-BMeeFmdY.js");
|
|
3
3
|
|
|
4
4
|
exports.CommandRegistrar = require_commandkit.CommandRegistrar;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommandsRouter.js","names":["Collection","existsSync","normalize","join","readdir","basename","extname","relative","isAbsolute"],"sources":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"CommandsRouter.js","names":["Collection","existsSync","normalize","join","readdir","basename","extname","relative","isAbsolute"],"sources":["../../../src/app/router/CommandsRouter.ts"],"sourcesContent":["import { Collection } from 'discord.js';\nimport { Dirent, existsSync } from 'node:fs';\nimport { readdir } from 'node:fs/promises';\nimport {\n basename,\n extname,\n isAbsolute,\n join,\n normalize,\n relative,\n} from 'node:path';\nimport {\n CommandRouteDiagnostic,\n CommandTreeNode,\n CommandTreeNodeKind,\n CompiledCommandRoute,\n} from './CommandTree';\n\n/**\n * Represents a command with its metadata and middleware associations.\n */\nexport interface Command {\n id: string;\n name: string;\n path: string;\n relativePath: string;\n parentPath: string;\n middlewares: Array<string>;\n category: string | null;\n}\n\n/**\n * Represents a middleware with its metadata and scope.\n */\nexport interface Middleware {\n id: string;\n name: string;\n path: string;\n relativePath: string;\n parentPath: string;\n global: boolean;\n command: string | null;\n}\n\n/**\n * Data structure containing parsed commands, middleware, and tree data.\n */\nexport interface ParsedCommandData {\n commands: Record<string, Command>;\n middlewares: Record<string, Middleware>;\n treeNodes?: Record<string, CommandTreeNode>;\n compiledRoutes?: Record<string, CompiledCommandRoute>;\n diagnostics?: CommandRouteDiagnostic[];\n}\n\n/**\n * Configuration options for the commands router.\n */\nexport interface CommandsRouterOptions {\n entrypoint: string;\n}\n\nexport type RouterFileChangeType = 'add' | 'change' | 'unlink' | 'unlinkDir';\n\nconst ROOT_NODE_ID = '__commandkit_router_root__';\n\n/**\n * @private\n * @internal\n */\nconst MIDDLEWARE_PATTERN = /^\\+middleware\\.(m|c)?(j|t)sx?$/;\n\n/**\n * @private\n * @internal\n */\nconst COMMAND_MIDDLEWARE_PATTERN =\n /^\\+([^+().][^().]*)\\.middleware\\.(m|c)?(j|t)sx?$/;\n\n/**\n * @private\n * @internal\n */\nconst GLOBAL_MIDDLEWARE_PATTERN = /^\\+global-middleware\\.(m|c)?(j|t)sx?$/;\n\n/**\n * @private\n * @internal\n */\nconst COMMAND_PATTERN = /^([^+().][^().]*)\\.(m|c)?(j|t)sx?$/;\n\n/**\n * @private\n * @internal\n */\nconst CATEGORY_PATTERN = /^\\(.+\\)$/;\n\n/**\n * @private\n * @internal\n */\nconst COMMAND_DIRECTORY_PATTERN = /^\\[([^\\][\\\\\\/]+)\\]$/;\n\n/**\n * @private\n * @internal\n */\nconst GROUP_DIRECTORY_PATTERN = /^\\{([^}{\\\\\\/]+)\\}$/;\n\n/**\n * @private\n * @internal\n */\nconst COMMAND_DEFINITION_PATTERN = /^command\\.(m|c)?(j|t)sx?$/;\n\n/**\n * @private\n * @internal\n */\nconst GROUP_DEFINITION_PATTERN = /^group\\.(m|c)?(j|t)sx?$/;\n\n/**\n * @private\n * @internal\n */\nconst SUBCOMMAND_FILE_PATTERN =\n /^([^+().][^().]*)\\.subcommand\\.(m|c)?(j|t)sx?$/;\n\n/**\n * Handles discovery and parsing of command and middleware files in the filesystem.\n */\nexport class CommandsRouter {\n /**\n * @private\n * @internal\n */\n private commands = new Collection<string, Command>();\n\n /**\n * @private\n * @internal\n */\n private middlewares = new Collection<string, Middleware>();\n\n /**\n * @private\n * @internal\n */\n private treeNodes = new Collection<string, CommandTreeNode>();\n\n /**\n * @private\n * @internal\n */\n private compiledRoutes = new Collection<string, CompiledCommandRoute>();\n\n /**\n * @private\n * @internal\n */\n private diagnostics: CommandRouteDiagnostic[] = [];\n\n /**\n * Creates a new CommandsRouter instance.\n * @param options - Configuration options for the router\n */\n public constructor(private readonly options: CommandsRouterOptions) {}\n\n /**\n * Populates the router with existing command, middleware, and tree data.\n * @param data - Parsed command data to populate with\n */\n public populate(data: ParsedCommandData): void {\n this.clear();\n\n for (const [id, command] of Object.entries(data.commands)) {\n this.commands.set(id, command);\n }\n\n for (const [id, middleware] of Object.entries(data.middlewares)) {\n this.middlewares.set(id, middleware);\n }\n\n for (const [id, node] of Object.entries(data.treeNodes ?? {})) {\n this.treeNodes.set(id, node);\n }\n\n for (const [key, route] of Object.entries(data.compiledRoutes ?? {})) {\n this.compiledRoutes.set(key, route);\n }\n\n this.diagnostics = [...(data.diagnostics ?? [])];\n }\n\n /**\n * Checks if the configured entrypoint path exists.\n * @returns True if the path exists\n */\n public isValidPath(): boolean {\n return existsSync(this.options.entrypoint);\n }\n\n /**\n * @private\n * @internal\n */\n private isCommand(name: string): boolean {\n return COMMAND_PATTERN.test(name);\n }\n\n /**\n * @private\n * @internal\n */\n private isMiddleware(name: string): boolean {\n return (\n MIDDLEWARE_PATTERN.test(name) ||\n GLOBAL_MIDDLEWARE_PATTERN.test(name) ||\n COMMAND_MIDDLEWARE_PATTERN.test(name)\n );\n }\n\n /**\n * @private\n * @internal\n */\n private isCategory(name: string): boolean {\n return CATEGORY_PATTERN.test(name);\n }\n\n /**\n * @private\n * @internal\n */\n private isCommandDirectory(name: string): boolean {\n return COMMAND_DIRECTORY_PATTERN.test(name);\n }\n\n /**\n * @private\n * @internal\n */\n private isGroupDirectory(name: string): boolean {\n return GROUP_DIRECTORY_PATTERN.test(name);\n }\n\n /**\n * @private\n * @internal\n */\n private isCommandDefinition(name: string): boolean {\n return COMMAND_DEFINITION_PATTERN.test(name);\n }\n\n /**\n * @private\n * @internal\n */\n private isGroupDefinition(name: string): boolean {\n return GROUP_DEFINITION_PATTERN.test(name);\n }\n\n /**\n * @private\n * @internal\n */\n private isSubcommandFile(name: string): boolean {\n return SUBCOMMAND_FILE_PATTERN.test(name);\n }\n\n /**\n * Clears all loaded commands, middleware, and compiled tree data.\n */\n public clear(): void {\n this.commands.clear();\n this.middlewares.clear();\n this.treeNodes.clear();\n this.compiledRoutes.clear();\n this.diagnostics = [];\n }\n\n /**\n * Scans the filesystem for commands and middleware files.\n * @returns Parsed command data\n */\n public async scan(): Promise<ParsedCommandData> {\n this.clear();\n this.initializeRootNode();\n\n await this.traverseDirectory(\n this.options.entrypoint,\n 'normal',\n null,\n ROOT_NODE_ID,\n );\n\n await this.applyMiddlewares();\n this.compileTree();\n\n return this.toJSON();\n }\n\n /**\n * Incrementally updates only the top-level command subtree affected by a file change.\n * Falls back to a full scan when the changed path cannot be safely scoped.\n */\n public async scanIncremental(\n changedPath: string,\n _changeType: RouterFileChangeType = 'change',\n ): Promise<ParsedCommandData> {\n const normalizedPath = normalize(changedPath);\n\n if (!this.isWithinPath(this.options.entrypoint, normalizedPath)) {\n return this.toJSON();\n }\n\n const relativePath = this.replaceEntrypoint(normalizedPath)\n .replace(/^[/\\\\]/, '')\n .split(/[/\\\\]/)\n .filter(Boolean);\n\n if (!relativePath.length) {\n return this.scan();\n }\n\n const topLevelToken = relativePath[0];\n\n if (!this.isCommandDirectory(topLevelToken)) {\n return this.scan();\n }\n\n const commandName = topLevelToken.match(COMMAND_DIRECTORY_PATTERN)?.[1];\n\n if (!commandName) {\n return this.scan();\n }\n\n this.ensureRootNode();\n\n const commandRootDirectory = join(this.options.entrypoint, topLevelToken);\n this.pruneCommandSubtree(commandName, commandRootDirectory);\n\n if (existsSync(commandRootDirectory)) {\n await this.traverseDirectory(\n commandRootDirectory,\n 'command',\n null,\n ROOT_NODE_ID,\n commandName,\n );\n }\n\n await this.applyMiddlewares();\n this.compileTree();\n\n return this.toJSON();\n }\n\n /**\n * Gets the raw command, middleware, and compiled tree collections.\n * @returns Object containing router collections\n */\n public getData(): {\n commands: Collection<string, Command>;\n middlewares: Collection<string, Middleware>;\n treeNodes: Collection<string, CommandTreeNode>;\n compiledRoutes: Collection<string, CompiledCommandRoute>;\n diagnostics: CommandRouteDiagnostic[];\n } {\n return {\n commands: this.commands,\n middlewares: this.middlewares,\n treeNodes: this.treeNodes,\n compiledRoutes: this.compiledRoutes,\n diagnostics: this.diagnostics,\n };\n }\n\n /**\n * Gets only the internal command tree and compiled route data.\n * @returns Object containing tree data\n */\n public getTreeData(): {\n treeNodes: Collection<string, CommandTreeNode>;\n compiledRoutes: Collection<string, CompiledCommandRoute>;\n diagnostics: CommandRouteDiagnostic[];\n } {\n return {\n treeNodes: this.treeNodes,\n compiledRoutes: this.compiledRoutes,\n diagnostics: this.diagnostics,\n };\n }\n\n /**\n * Converts the loaded data to a JSON-serializable format.\n * @returns Plain object with commands, middleware, and tree data\n */\n public toJSON(): ParsedCommandData {\n return {\n commands: Object.fromEntries(this.commands.entries()),\n middlewares: Object.fromEntries(this.middlewares.entries()),\n treeNodes: Object.fromEntries(this.treeNodes.entries()),\n compiledRoutes: Object.fromEntries(this.compiledRoutes.entries()),\n diagnostics: this.diagnostics,\n };\n }\n\n /**\n * @private\n * @internal\n */\n private initializeRootNode() {\n this.treeNodes.set(ROOT_NODE_ID, {\n id: ROOT_NODE_ID,\n source: 'root',\n kind: 'root',\n token: '',\n route: [],\n category: null,\n parentId: null,\n childIds: [],\n directoryPath: this.options.entrypoint,\n definitionPath: null,\n relativePath: '',\n shorthand: false,\n executable: false,\n });\n }\n\n /**\n * @private\n * @internal\n */\n private ensureRootNode() {\n if (!this.treeNodes.has(ROOT_NODE_ID)) {\n this.initializeRootNode();\n }\n }\n\n /**\n * @private\n * @internal\n */\n private pruneCommandSubtree(\n commandName: string,\n commandRootDirectory: string,\n ) {\n const normalizedRootDirectory = normalize(commandRootDirectory);\n\n for (const [id, command] of this.commands.entries()) {\n if (\n command.name === commandName ||\n this.isWithinPath(normalizedRootDirectory, command.path) ||\n this.isWithinPath(normalizedRootDirectory, command.parentPath)\n ) {\n this.commands.delete(id);\n }\n }\n\n for (const [id, middleware] of this.middlewares.entries()) {\n if (\n this.isWithinPath(normalizedRootDirectory, middleware.path) ||\n this.isWithinPath(normalizedRootDirectory, middleware.parentPath)\n ) {\n this.middlewares.delete(id);\n }\n }\n\n const nodeIdsToDelete = new Set<string>();\n\n for (const [id, node] of this.treeNodes.entries()) {\n if (id === ROOT_NODE_ID) continue;\n\n if (\n node.route[0] === commandName ||\n this.isWithinPath(normalizedRootDirectory, node.directoryPath) ||\n (node.definitionPath &&\n this.isWithinPath(normalizedRootDirectory, node.definitionPath))\n ) {\n nodeIdsToDelete.add(id);\n }\n }\n\n if (nodeIdsToDelete.size) {\n for (const id of nodeIdsToDelete) {\n this.treeNodes.delete(id);\n }\n\n for (const node of this.treeNodes.values()) {\n node.childIds = node.childIds.filter((childId) => {\n return !nodeIdsToDelete.has(childId);\n });\n }\n }\n }\n\n /**\n * @private\n * @internal\n */\n private async traverseDirectory(\n path: string,\n state: 'normal' | 'command' | 'group',\n category: string | null,\n parentId: string,\n token?: string,\n ) {\n let node: CommandTreeNode | null = null;\n\n if (state === 'command') {\n node = this.createTreeNode({\n source: 'directory',\n token: token!,\n category,\n parentId,\n directoryPath: path,\n definitionPath: null,\n shorthand: false,\n });\n if (!node) return;\n } else if (state === 'group') {\n node = this.createTreeNode({\n source: 'group',\n token: token!,\n category,\n parentId,\n directoryPath: path,\n definitionPath: null,\n shorthand: false,\n });\n if (!node) return;\n }\n\n const currentNodeId = node ? node.id : parentId;\n\n const entries = await readdir(path, {\n withFileTypes: true,\n });\n\n for (const entry of entries) {\n if (entry.name.startsWith('_')) continue;\n\n const fullPath = join(path, entry.name);\n\n if (entry.isFile()) {\n if (state === 'command') {\n if (this.isCommandDefinition(entry.name)) {\n node!.definitionPath = fullPath;\n node!.relativePath = this.replaceEntrypoint(fullPath);\n continue;\n }\n if (this.isSubcommandFile(entry.name)) {\n this.createTreeNode({\n source: 'shorthand',\n token: entry.name.match(SUBCOMMAND_FILE_PATTERN)![1],\n category,\n parentId: currentNodeId,\n directoryPath: path,\n definitionPath: fullPath,\n shorthand: true,\n });\n continue;\n }\n if (this.isMiddleware(entry.name)) {\n await this.handle(entry, category);\n continue;\n }\n if (this.isCommand(entry.name)) {\n this.addDiagnostic(\n 'UNSUPPORTED_FILE_IN_COMMAND_DIRECTORY',\n 'Only command.ts, middleware files, and subcommand shorthand files are supported inside a command directory.',\n fullPath,\n );\n }\n } else if (state === 'group') {\n if (this.isGroupDefinition(entry.name)) {\n node!.definitionPath = fullPath;\n node!.relativePath = this.replaceEntrypoint(fullPath);\n continue;\n }\n if (this.isSubcommandFile(entry.name)) {\n this.createTreeNode({\n source: 'shorthand',\n token: entry.name.match(SUBCOMMAND_FILE_PATTERN)![1],\n category,\n parentId: currentNodeId,\n directoryPath: path,\n definitionPath: fullPath,\n shorthand: true,\n });\n continue;\n }\n if (this.isMiddleware(entry.name)) {\n await this.handle(entry, category);\n continue;\n }\n if (this.isCommand(entry.name)) {\n this.addDiagnostic(\n 'UNSUPPORTED_FILE_IN_GROUP_DIRECTORY',\n 'Only group.ts, middleware files, and subcommand shorthand files are supported inside a group directory.',\n fullPath,\n );\n }\n } else {\n if (this.isSubcommandFile(entry.name)) {\n if (currentNodeId === ROOT_NODE_ID) {\n this.addDiagnostic(\n 'ORPHAN_SUBCOMMAND_FILE',\n 'Subcommand shorthand files must be nested inside a command or group directory.',\n fullPath,\n );\n } else {\n this.createTreeNode({\n source: 'shorthand',\n token: entry.name.match(SUBCOMMAND_FILE_PATTERN)![1],\n category,\n parentId: currentNodeId,\n directoryPath: path,\n definitionPath: fullPath,\n shorthand: true,\n });\n }\n continue;\n }\n if (this.isCommand(entry.name) || this.isMiddleware(entry.name)) {\n const result = await this.handle(entry, category);\n if (result.command) {\n this.createFlatCommandNode(result.command);\n }\n }\n }\n continue;\n }\n\n if (!entry.isDirectory()) continue;\n\n if (this.isCommandDirectory(entry.name)) {\n if (state === 'command' || state === 'group') {\n await this.traverseDirectory(\n fullPath,\n 'command',\n category,\n currentNodeId,\n entry.name.match(COMMAND_DIRECTORY_PATTERN)![1],\n );\n } else if (currentNodeId !== ROOT_NODE_ID) {\n this.addDiagnostic(\n 'NESTED_COMMAND_NOT_ALLOWED',\n 'Command directories cannot be nested under group or subcommand directories unless they are part of a hierarchical structure.',\n fullPath,\n );\n } else {\n await this.traverseDirectory(\n fullPath,\n 'command',\n category,\n ROOT_NODE_ID,\n entry.name.match(COMMAND_DIRECTORY_PATTERN)![1],\n );\n }\n continue;\n }\n\n if (this.isGroupDirectory(entry.name)) {\n if (currentNodeId === ROOT_NODE_ID) {\n this.addDiagnostic(\n 'ROOT_GROUP_NOT_ALLOWED',\n 'Group directories must be nested inside a command directory.',\n fullPath,\n );\n } else {\n await this.traverseDirectory(\n fullPath,\n 'group',\n category,\n currentNodeId,\n entry.name.match(GROUP_DIRECTORY_PATTERN)![1],\n );\n }\n continue;\n }\n\n if (this.isCategory(entry.name)) {\n const nestedCategory = category\n ? `${category}:${entry.name.slice(1, -1)}`\n : entry.name.slice(1, -1);\n await this.traverseDirectory(\n fullPath,\n 'normal',\n nestedCategory,\n currentNodeId,\n );\n continue;\n }\n\n await this.traverseDirectory(fullPath, 'normal', category, currentNodeId);\n }\n\n if (state === 'command' && node && !node.definitionPath) {\n this.addDiagnostic(\n 'MISSING_COMMAND_DEFINITION',\n 'Command directories must include a command.ts file.',\n path,\n );\n } else if (state === 'group' && node && !node.definitionPath) {\n this.addDiagnostic(\n 'MISSING_GROUP_DEFINITION',\n 'Group directories must include a group.ts file.',\n path,\n );\n }\n }\n\n /**\n * @private\n * @internal\n */\n private createFlatCommandNode(command: Command) {\n this.createTreeNode({\n id: command.id,\n source: 'flat',\n token: command.name,\n category: command.category,\n parentId: ROOT_NODE_ID,\n directoryPath: command.parentPath,\n definitionPath: command.path,\n shorthand: false,\n });\n }\n\n /**\n * @private\n * @internal\n */\n private createTreeNode(options: {\n id?: string;\n source: Exclude<CommandTreeNode['source'], 'root'>;\n token: string;\n category: string | null;\n parentId: string;\n directoryPath: string;\n definitionPath: string | null;\n shorthand: boolean;\n }) {\n const parent = this.treeNodes.get(options.parentId);\n\n if (!parent) {\n this.addDiagnostic(\n 'MISSING_PARENT_NODE',\n `Unable to create command tree node \"${options.token}\" because its parent node was not found.`,\n options.directoryPath,\n );\n return null;\n }\n\n const duplicate = parent.childIds.some((childId) => {\n return this.treeNodes.get(childId)?.token === options.token;\n });\n\n if (duplicate) {\n this.addDiagnostic(\n 'DUPLICATE_SIBLING_TOKEN',\n `Duplicate command token \"${options.token}\" found under the same parent.`,\n options.definitionPath ?? options.directoryPath,\n );\n return null;\n }\n\n const route = [...parent.route, options.token];\n const node: CommandTreeNode = {\n id: options.id ?? crypto.randomUUID(),\n source: options.source,\n kind: this.resolveNodeKind(options.source, route.length),\n token: options.token,\n route,\n category: options.category,\n parentId: options.parentId,\n childIds: [],\n directoryPath: options.directoryPath,\n definitionPath: options.definitionPath,\n relativePath: this.replaceEntrypoint(\n options.definitionPath ?? options.directoryPath,\n ),\n shorthand: options.shorthand,\n executable: false,\n };\n\n this.treeNodes.set(node.id, node);\n parent.childIds.push(node.id);\n\n return node;\n }\n\n /**\n * @private\n * @internal\n */\n private resolveNodeKind(\n source: CommandTreeNode['source'],\n depth: number,\n ): CommandTreeNodeKind {\n switch (source) {\n case 'root':\n return 'root';\n case 'flat':\n return 'flat';\n case 'group':\n return 'group';\n case 'shorthand':\n return 'subcommand';\n case 'directory':\n return depth === 1 ? 'command' : 'subcommand';\n default:\n return source satisfies never;\n }\n }\n\n /**\n * @private\n * @internal\n */\n private compileTree() {\n this.compiledRoutes.clear();\n\n for (const node of this.treeNodes.values()) {\n if (node.id === ROOT_NODE_ID) continue;\n\n const hasChildren = node.childIds.length > 0;\n node.executable =\n !!node.definitionPath && node.kind !== 'group' && !hasChildren;\n\n if (hasChildren && node.definitionPath && node.kind !== 'group') {\n this.addDiagnostic(\n 'NON_LEAF_NODE_MAY_HAVE_HANDLERS',\n `Hierarchical node \"${node.route.join('.')}\" has child nodes. Ensure its command.ts file does not export chatInput, message, or autocomplete handlers. Executable handlers must be defined on leaf nodes.`,\n node.definitionPath,\n );\n }\n\n if (node.kind === 'subcommand' && hasChildren) {\n this.addDiagnostic(\n 'SUBCOMMAND_CANNOT_HAVE_CHILDREN',\n `Subcommand \"${node.route.join('.')}\" cannot contain child command nodes.`,\n node.definitionPath ?? node.directoryPath,\n );\n }\n\n if (node.kind === 'command') {\n const childKinds = new Set(\n node.childIds\n .map((childId) => this.treeNodes.get(childId)?.kind)\n .filter(Boolean),\n );\n\n if (childKinds.has('group') && childKinds.has('subcommand')) {\n this.addDiagnostic(\n 'MIXED_ROOT_CHILDREN',\n `Command \"${node.route.join('.')}\" cannot mix direct subcommands and subcommand groups.`,\n node.definitionPath ?? node.directoryPath,\n );\n }\n }\n\n if (!node.executable || !node.definitionPath) continue;\n\n const key = node.route.join('.');\n const routeKind = node.kind as Exclude<\n CommandTreeNodeKind,\n 'root' | 'group'\n >;\n this.compiledRoutes.set(key, {\n id: node.id,\n key,\n kind: routeKind,\n token: node.token,\n route: node.route,\n category: node.category,\n definitionPath: node.definitionPath,\n relativePath: this.replaceEntrypoint(node.definitionPath),\n nodeId: node.id,\n middlewares: this.collectCompiledMiddlewares(node),\n });\n }\n }\n\n /**\n * @private\n * @internal\n */\n private collectCompiledMiddlewares(node: CommandTreeNode) {\n const allMiddlewares = Array.from(this.middlewares.values());\n const globalMiddlewares = allMiddlewares\n .filter((middleware) => middleware.global)\n .map((middleware) => middleware.id);\n\n const directoryMiddlewares = allMiddlewares\n .filter((middleware) => {\n return (\n !middleware.global &&\n !middleware.command &&\n middleware.parentPath === node.directoryPath\n );\n })\n .map((middleware) => middleware.id);\n\n const commandSpecificMiddlewares = allMiddlewares\n .filter((middleware) => {\n return (\n middleware.command === node.token &&\n middleware.parentPath === node.directoryPath\n );\n })\n .map((middleware) => middleware.id);\n\n return [\n ...globalMiddlewares,\n ...directoryMiddlewares,\n ...commandSpecificMiddlewares,\n ];\n }\n\n /**\n * @private\n * @internal\n */\n private addDiagnostic(code: string, message: string, path: string) {\n this.diagnostics.push({\n code,\n message,\n path: normalize(path),\n });\n }\n\n /**\n * @private\n * @internal\n */\n private async handle(entry: Dirent, category: string | null = null) {\n const name = entry.name;\n const path = join(entry.parentPath, entry.name);\n\n if (this.isCommand(name)) {\n const command: Command = {\n id: crypto.randomUUID(),\n name: basename(path, extname(path)),\n path,\n category,\n parentPath: entry.parentPath,\n relativePath: this.replaceEntrypoint(path),\n middlewares: [],\n };\n\n this.commands.set(command.id, command);\n return { command };\n }\n\n if (this.isMiddleware(name)) {\n const middleware: Middleware = {\n id: crypto.randomUUID(),\n name: basename(path, extname(path)),\n path,\n relativePath: this.replaceEntrypoint(path),\n parentPath: entry.parentPath,\n global: GLOBAL_MIDDLEWARE_PATTERN.test(name),\n command: COMMAND_MIDDLEWARE_PATTERN.test(name)\n ? name.match(COMMAND_MIDDLEWARE_PATTERN)?.[1] || null\n : null,\n };\n\n this.middlewares.set(middleware.id, middleware);\n return { middleware };\n }\n\n return {};\n }\n\n /**\n * @private\n * @internal\n */\n private applyMiddlewares() {\n this.commands.forEach((command) => {\n const commandPath = command.parentPath;\n const allMiddlewares = Array.from(this.middlewares.values());\n\n const commandSpecificMiddlewares = allMiddlewares\n .filter((middleware) => middleware.command === command.name)\n .map((middleware) => middleware.id);\n\n const directorySpecificMiddlewares = allMiddlewares\n .filter((middleware) => {\n return (\n !middleware.global &&\n !middleware.command &&\n middleware.parentPath === commandPath\n );\n })\n .map((middleware) => middleware.id);\n\n const globalMiddlewares = allMiddlewares\n .filter((middleware) => middleware.global)\n .map((middleware) => middleware.id);\n\n command.middlewares = [\n ...globalMiddlewares,\n ...directorySpecificMiddlewares,\n ...commandSpecificMiddlewares,\n ];\n });\n }\n\n /**\n * @private\n * @internal\n */\n private replaceEntrypoint(path: string) {\n const normalized = normalize(path);\n return normalized.replace(this.options.entrypoint, '');\n }\n\n /**\n * @private\n * @internal\n */\n private isWithinPath(basePath: string, targetPath: string) {\n const base = normalize(basePath);\n const target = normalize(targetPath);\n const rel = relative(base, target);\n\n if (!rel) {\n return true;\n }\n\n return !rel.startsWith('..') && !isAbsolute(rel);\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventsRouter.js","names":["Collection","existsSync","readdir","join","normalize","relative","isAbsolute"],"sources":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"EventsRouter.js","names":["Collection","existsSync","readdir","join","normalize","relative","isAbsolute"],"sources":["../../../src/app/router/EventsRouter.ts"],"sourcesContent":["import { Collection } from 'discord.js';\nimport { existsSync } from 'node:fs';\nimport { readdir } from 'node:fs/promises';\nimport { isAbsolute, join, normalize, relative } from 'node:path';\n\nexport type EventsRouterFileChangeType =\n 'add' | 'change' | 'unlink' | 'unlinkDir';\n\n/**\n * Configuration options for the EventsRouter\n * @interface EventsRouterOptions\n */\nexport interface EventsRouterOptions {\n /** Root directory path where event handlers are located */\n entrypoints: string[];\n}\n\n/**\n * Represents a parsed event with its handlers\n * @interface ParsedEvent\n */\nexport interface ParsedEvent {\n /** Name of the event derived from directory name */\n event: string;\n /** Absolute path to the event directory */\n path: string;\n /** Array of file paths to event listener handlers */\n listeners: string[];\n /** Namespace of the event */\n namespace: string | null;\n}\n\n/** Collection of event names to their parsed metadata */\nexport type EventsTree = Record<string, ParsedEvent>;\n\n/**\n * Router for discovering and managing event handler files in a directory structure.\n * Events are represented by directories, and handlers are files within those directories.\n */\nexport class EventsRouter {\n /** Internal storage of parsed events */\n private events = new Collection<string, ParsedEvent>();\n\n /**\n * Creates a new EventsRouter instance\n * @param options - Configuration options for the router\n * @throws Error if entrypoint is not provided\n */\n public constructor(private options: EventsRouterOptions) {\n if (options.entrypoints) {\n options.entrypoints = Array.from(new Set(options.entrypoints));\n }\n\n if (!options.entrypoints?.length) {\n throw new Error('Entrypoint directory must be provided');\n }\n }\n\n /**\n * Adds new entrypoints to the router\n * @param entrypoints - Array of new entrypoint paths\n */\n public addEntrypoints(entrypoints: string[]) {\n this.options.entrypoints = Array.from(\n new Set([...this.options.entrypoints, ...entrypoints]),\n );\n }\n\n /**\n * Find a parsed event by its name\n * @param event - Name of the event to find\n * @returns Parsed event metadata or null if not found\n */\n public match(event: string): ParsedEvent | null {\n return this.events.get(event) ?? null;\n }\n\n /**\n * Get the entrypoint directory path\n * @returns Entrypoint directory path\n */\n public get entrypoints(): string[] {\n return this.options.entrypoints;\n }\n\n /**\n * Checks if the entrypoint path is valid\n */\n public isValidPath() {\n return this.entrypoints.every((entrypoint) => existsSync(entrypoint));\n }\n\n /**\n * Clear all parsed events\n */\n public clear() {\n this.events.clear();\n }\n\n /**\n * Populates router state from pre-resolved event metadata.\n */\n public populate(events: EventsTree) {\n this.clear();\n\n for (const [key, event] of Object.entries(events)) {\n this.events.set(key, event);\n }\n }\n\n /**\n * Reload and re-scan the entrypoint directory for events\n * @returns Promise resolving to the updated events tree\n */\n public async reload() {\n this.clear();\n return this.scan();\n }\n\n /**\n * Scan the entrypoint directory for events and their handlers\n * @returns Promise resolving to the events tree\n */\n public async scan(): Promise<EventsTree> {\n this.clear();\n\n for (const entrypoint of this.entrypoints) {\n const dirs = await readdir(entrypoint, { withFileTypes: true });\n\n for (const dir of dirs) {\n if (dir.isDirectory()) {\n const path = join(entrypoint, dir.name);\n await this.scanEvent(dir.name, path, null, [], true);\n }\n }\n }\n\n return Object.fromEntries(this.events);\n }\n\n /**\n * Incrementally rescans only the event subtree impacted by a changed path.\n */\n public async scanIncremental(\n changedPath: string,\n _changeType: EventsRouterFileChangeType = 'change',\n ): Promise<EventsTree> {\n const resolvedChangedPath = normalize(changedPath);\n const entrypoint = this.entrypoints.find((root) =>\n this.isWithinPath(root, resolvedChangedPath),\n );\n\n if (!entrypoint) {\n return this.toJSON();\n }\n\n const branch = this.resolveTopLevelBranch(entrypoint, resolvedChangedPath);\n\n if (!branch) {\n return this.scan();\n }\n\n const normalizedBranch = normalize(branch);\n\n for (const [key, event] of this.events.entries()) {\n const listeners = event.listeners.filter(\n (listener) => !this.isWithinPath(normalizedBranch, listener),\n );\n\n if (\n !listeners.length &&\n this.isWithinPath(normalizedBranch, event.path)\n ) {\n this.events.delete(key);\n continue;\n }\n\n this.events.set(key, {\n ...event,\n listeners,\n });\n }\n\n if (existsSync(normalizedBranch)) {\n const branchName = branch\n .slice(entrypoint.length)\n .replace(/^[/\\\\]/, '')\n .split(/[/\\\\]/)\n .filter(Boolean)[0];\n\n if (branchName) {\n await this.scanEvent(branchName, normalizedBranch, null, [], true);\n }\n }\n\n return this.toJSON();\n }\n\n /**\n * Convert the internal events Collection to a plain object\n * @returns Events tree as a plain object\n */\n public toJSON(): EventsTree {\n return Object.fromEntries(this.events);\n }\n\n /**\n * Recursively scan a directory for event handlers\n * @param event - Name of the event\n * @param path - Path to the event directory\n * @param listeners - Array to collect listener file paths\n * @returns Promise resolving to the parsed event metadata\n */\n private async scanEvent(\n event: string,\n path: string,\n _namespace: string | null = null,\n listeners: string[] = [],\n isRoot = false,\n ): Promise<void> {\n const files = await readdir(path, { withFileTypes: true });\n const isNamespace = isRoot && /^\\(.+\\)$/.test(event);\n\n // if event = (something) pattern then namespace is something\n const namespace = isNamespace ? event.slice(1, -1) : (_namespace ?? null);\n\n files.sort((a, b) => a.name.localeCompare(b.name));\n\n for (const file of files) {\n if (file.name.startsWith('_')) continue;\n\n if (file.isDirectory()) {\n const nextPath = join(path, file.name);\n await this.scanEvent(file.name, nextPath, namespace, listeners);\n continue;\n }\n\n if (file.isFile() && /\\.(m|c)?(j|t)sx?$/.test(file.name)) {\n listeners.push(join(file.parentPath, file.name));\n }\n }\n\n if (!isNamespace) {\n const existing = this.events.get(event);\n\n if (existing) {\n existing.listeners = Array.from(\n new Set([...existing.listeners, ...listeners]),\n );\n\n return;\n }\n\n this.events.set(event, { event, path, listeners, namespace });\n }\n }\n\n /**\n * @private\n * @internal\n */\n private isWithinPath(basePath: string, targetPath: string) {\n const base = normalize(basePath);\n const target = normalize(targetPath);\n const rel = relative(base, target);\n\n if (!rel) {\n return true;\n }\n\n return !rel.startsWith('..') && !isAbsolute(rel);\n }\n\n /**\n * @private\n * @internal\n */\n private resolveTopLevelBranch(entrypoint: string, changedPath: string) {\n const rel = relative(entrypoint, changedPath)\n .split(/[/\\\\]/)\n .filter(Boolean);\n\n if (!rel.length) {\n return null;\n }\n\n return join(entrypoint, rel[0]);\n }\n}\n"],"mappings":";;;;;;;;;;;AAuCA,IAAa,eAAb,MAA0B;CASG;;CAP3B,AAAQ,SAAS,IAAIA,sBAAgC;;;;;;CAOrD,AAAO,YAAY,AAAQ,SAA8B;;EAA9B;EACzB,IAAI,QAAQ,aACV,QAAQ,cAAc,MAAM,KAAK,IAAI,IAAI,QAAQ,WAAW,CAAC;EAG/D,IAAI,0BAAC,QAAQ,yFAAa,SACxB,MAAM,IAAI,MAAM,uCAAuC;CAE3D;;;;;CAMA,AAAO,eAAe,aAAuB;EAC3C,KAAK,QAAQ,cAAc,MAAM,qBAC/B,IAAI,IAAI,CAAC,GAAG,KAAK,QAAQ,aAAa,GAAG,WAAW,CAAC,CACvD;CACF;;;;;;CAOA,AAAO,MAAM,OAAmC;EAC9C,OAAO,KAAK,OAAO,IAAI,KAAK,KAAK;CACnC;;;;;CAMA,IAAW,cAAwB;EACjC,OAAO,KAAK,QAAQ;CACtB;;;;CAKA,AAAO,cAAc;EACnB,OAAO,KAAK,YAAY,OAAO,mBAAeC,oBAAW,UAAU,CAAC;CACtE;;;;CAKA,AAAO,QAAQ;EACb,KAAK,OAAO,MAAM;CACpB;;;;CAKA,AAAO,SAAS,QAAoB;EAClC,KAAK,MAAM;EAEX,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,GAC9C,KAAK,OAAO,IAAI,KAAK,KAAK;CAE9B;;;;;CAMA,MAAa,SAAS;EACpB,KAAK,MAAM;EACX,OAAO,KAAK,KAAK;CACnB;;;;;CAMA,MAAa,OAA4B;EACvC,KAAK,MAAM;EAEX,KAAK,MAAM,cAAc,KAAK,aAAa;GACzC,MAAM,OAAO,UAAMC,0BAAQ,YAAY,EAAE,eAAe,KAAK,CAAC;GAE9D,KAAK,MAAM,OAAO,MAChB,IAAI,IAAI,YAAY,GAAG;IACrB,MAAM,WAAOC,gBAAK,YAAY,IAAI,IAAI;IACtC,MAAM,KAAK,UAAU,IAAI,MAAM,MAAM,MAAM,CAAC,GAAG,IAAI;GACrD;EAEJ;EAEA,OAAO,OAAO,YAAY,KAAK,MAAM;CACvC;;;;CAKA,MAAa,gBACX,aACA,cAA0C,UACrB;EACrB,MAAM,0BAAsBC,qBAAU,WAAW;EACjD,MAAM,aAAa,KAAK,YAAY,MAAM,SACxC,KAAK,aAAa,MAAM,mBAAmB,CAC7C;EAEA,IAAI,CAAC,YACH,OAAO,KAAK,OAAO;EAGrB,MAAM,SAAS,KAAK,sBAAsB,YAAY,mBAAmB;EAEzE,IAAI,CAAC,QACH,OAAO,KAAK,KAAK;EAGnB,MAAM,uBAAmBA,qBAAU,MAAM;EAEzC,KAAK,MAAM,CAAC,KAAK,UAAU,KAAK,OAAO,QAAQ,GAAG;GAChD,MAAM,YAAY,MAAM,UAAU,QAC/B,aAAa,CAAC,KAAK,aAAa,kBAAkB,QAAQ,CAC7D;GAEA,IACE,CAAC,UAAU,UACX,KAAK,aAAa,kBAAkB,MAAM,IAAI,GAC9C;IACA,KAAK,OAAO,OAAO,GAAG;IACtB;GACF;GAEA,KAAK,OAAO,IAAI,KAAK;IACnB,GAAG;IACH;GACF,CAAC;EACH;EAEA,QAAIH,oBAAW,gBAAgB,GAAG;GAChC,MAAM,aAAa,OAChB,MAAM,WAAW,MAAM,CAAC,CACxB,QAAQ,UAAU,EAAE,CAAC,CACrB,MAAM,OAAO,CAAC,CACd,OAAO,OAAO,CAAC,CAAC;GAEnB,IAAI,YACF,MAAM,KAAK,UAAU,YAAY,kBAAkB,MAAM,CAAC,GAAG,IAAI;EAErE;EAEA,OAAO,KAAK,OAAO;CACrB;;;;;CAMA,AAAO,SAAqB;EAC1B,OAAO,OAAO,YAAY,KAAK,MAAM;CACvC;;;;;;;;CASA,MAAc,UACZ,OACA,MACA,aAA4B,MAC5B,YAAsB,CAAC,GACvB,SAAS,OACM;EACf,MAAM,QAAQ,UAAMC,0BAAQ,MAAM,EAAE,eAAe,KAAK,CAAC;EACzD,MAAM,cAAc,UAAU,WAAW,KAAK,KAAK;EAGnD,MAAM,YAAY,cAAc,MAAM,MAAM,GAAG,EAAE,IAAK,cAAc;EAEpE,MAAM,MAAM,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;EAEjD,KAAK,MAAM,QAAQ,OAAO;GACxB,IAAI,KAAK,KAAK,WAAW,GAAG,GAAG;GAE/B,IAAI,KAAK,YAAY,GAAG;IACtB,MAAM,eAAWC,gBAAK,MAAM,KAAK,IAAI;IACrC,MAAM,KAAK,UAAU,KAAK,MAAM,UAAU,WAAW,SAAS;IAC9D;GACF;GAEA,IAAI,KAAK,OAAO,KAAK,oBAAoB,KAAK,KAAK,IAAI,GACrD,UAAU,SAAKA,gBAAK,KAAK,YAAY,KAAK,IAAI,CAAC;EAEnD;EAEA,IAAI,CAAC,aAAa;GAChB,MAAM,WAAW,KAAK,OAAO,IAAI,KAAK;GAEtC,IAAI,UAAU;IACZ,SAAS,YAAY,MAAM,qBACzB,IAAI,IAAI,CAAC,GAAG,SAAS,WAAW,GAAG,SAAS,CAAC,CAC/C;IAEA;GACF;GAEA,KAAK,OAAO,IAAI,OAAO;IAAE;IAAO;IAAM;IAAW;GAAU,CAAC;EAC9D;CACF;;;;;CAMA,AAAQ,aAAa,UAAkB,YAAoB;EACzD,MAAM,WAAOC,qBAAU,QAAQ;EAC/B,MAAM,aAASA,qBAAU,UAAU;EACnC,MAAM,UAAMC,oBAAS,MAAM,MAAM;EAEjC,IAAI,CAAC,KACH,OAAO;EAGT,OAAO,CAAC,IAAI,WAAW,IAAI,KAAK,KAACC,sBAAW,GAAG;CACjD;;;;;CAMA,AAAQ,sBAAsB,YAAoB,aAAqB;EACrE,MAAM,UAAMD,oBAAS,YAAY,WAAW,CAAC,CAC1C,MAAM,OAAO,CAAC,CACd,OAAO,OAAO;EAEjB,IAAI,CAAC,IAAI,QACP,OAAO;EAGT,WAAOF,gBAAK,YAAY,IAAI,EAAE;CAChC;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeArtifact.js","names":["normalize","isAbsolute","relative","join"],"sources":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"TreeArtifact.js","names":["normalize","isAbsolute","relative","join"],"sources":["../../../src/app/router/TreeArtifact.ts"],"sourcesContent":["import { isAbsolute, join, normalize, relative } from 'node:path';\nimport type { EventsTree } from './EventsRouter';\nimport type { ParsedCommandData } from './CommandsRouter';\n\nexport const ROUTER_TREE_ARTIFACT_SCHEMA_VERSION = 1;\nexport const ROUTER_TREE_ARTIFACT_FILE = 'router-tree.json';\nexport const ROUTER_TREE_ARTIFACT_DIRECTORY = '.commandkit';\n\nexport interface RouterTreeArtifact {\n schemaVersion: number;\n commandkitVersion: string;\n generatedAt: string;\n commands: ParsedCommandData;\n events: EventsTree;\n}\n\nexport function createRouterTreeArtifact(options: {\n outputRoot: string;\n commandkitVersion: string;\n commands: ParsedCommandData;\n events: EventsTree;\n}): RouterTreeArtifact {\n const { outputRoot, commandkitVersion } = options;\n\n return {\n schemaVersion: ROUTER_TREE_ARTIFACT_SCHEMA_VERSION,\n commandkitVersion,\n generatedAt: new Date().toISOString(),\n commands: mapCommandDataPaths(options.commands, outputRoot, toRelativePath),\n events: mapEventsTreePaths(options.events, outputRoot, toRelativePath),\n };\n}\n\nexport function validateRouterTreeArtifact(\n input: unknown,\n runtimeVersion: string,\n): input is RouterTreeArtifact {\n if (!input || typeof input !== 'object') return false;\n\n const artifact = input as Partial<RouterTreeArtifact>;\n\n if (artifact.schemaVersion !== ROUTER_TREE_ARTIFACT_SCHEMA_VERSION) {\n return false;\n }\n\n if (\n !artifact.commandkitVersion ||\n artifact.commandkitVersion !== runtimeVersion\n ) {\n return false;\n }\n\n if (!artifact.commands || typeof artifact.commands !== 'object') {\n return false;\n }\n\n if (!artifact.events || typeof artifact.events !== 'object') {\n return false;\n }\n\n return true;\n}\n\nexport function hydrateRouterTreeArtifact(\n artifact: RouterTreeArtifact,\n outputRoot: string,\n): {\n commands: ParsedCommandData;\n events: EventsTree;\n} {\n return {\n commands: mapCommandDataPaths(\n artifact.commands,\n outputRoot,\n toAbsolutePath,\n ),\n events: mapEventsTreePaths(artifact.events, outputRoot, toAbsolutePath),\n };\n}\n\nfunction mapCommandDataPaths(\n data: ParsedCommandData,\n root: string,\n mapper: (rootPath: string, path: string) => string,\n): ParsedCommandData {\n const commands = Object.fromEntries(\n Object.entries(data.commands ?? {}).map(([id, command]) => [\n id,\n {\n ...command,\n path: mapper(root, command.path),\n parentPath: mapper(root, command.parentPath),\n },\n ]),\n );\n\n const middlewares = Object.fromEntries(\n Object.entries(data.middlewares ?? {}).map(([id, middleware]) => [\n id,\n {\n ...middleware,\n path: mapper(root, middleware.path),\n parentPath: mapper(root, middleware.parentPath),\n },\n ]),\n );\n\n const treeNodes = Object.fromEntries(\n Object.entries(data.treeNodes ?? {}).map(([id, node]) => [\n id,\n {\n ...node,\n directoryPath: mapper(root, node.directoryPath),\n definitionPath:\n node.definitionPath === null\n ? null\n : mapper(root, node.definitionPath),\n },\n ]),\n );\n\n const compiledRoutes = Object.fromEntries(\n Object.entries(data.compiledRoutes ?? {}).map(([id, route]) => [\n id,\n {\n ...route,\n definitionPath: mapper(root, route.definitionPath),\n },\n ]),\n );\n\n const diagnostics = (data.diagnostics ?? []).map((diagnostic) => ({\n ...diagnostic,\n path: mapper(root, diagnostic.path),\n }));\n\n return {\n commands,\n middlewares,\n treeNodes,\n compiledRoutes,\n diagnostics,\n };\n}\n\nfunction mapEventsTreePaths(\n events: EventsTree,\n root: string,\n mapper: (rootPath: string, path: string) => string,\n): EventsTree {\n return Object.fromEntries(\n Object.entries(events ?? {}).map(([id, event]) => [\n id,\n {\n ...event,\n path: mapper(root, event.path),\n listeners: event.listeners.map((listener) => mapper(root, listener)),\n },\n ]),\n );\n}\n\nfunction toRelativePath(rootPath: string, path: string): string {\n if (!path) return path;\n\n const normalizedPath = normalize(path);\n\n if (!isAbsolute(normalizedPath)) {\n return normalizedPath;\n }\n\n return normalize(relative(rootPath, normalizedPath));\n}\n\nfunction toAbsolutePath(rootPath: string, path: string): string {\n if (!path) return path;\n\n const normalizedPath = normalize(path);\n\n if (isAbsolute(normalizedPath)) {\n return normalizedPath;\n }\n\n return normalize(join(rootPath, normalizedPath));\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-process.js","names":["existsSync","join","spawn","DevEnv","ProdEnv"],"sources":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"app-process.js","names":["existsSync","join","spawn","DevEnv","ProdEnv"],"sources":["../../src/cli/app-process.ts"],"sourcesContent":["import { IOType, spawn } from 'node:child_process';\nimport { DevEnv, ProdEnv } from './env';\nimport { join } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport { panic } from './common';\nimport { ResolvedCommandKitConfig } from '../config/utils';\nimport { CommandKitJsRuntime } from '../config/types';\n\n/**\n * @private\n * @internal\n */\nfunction getStdio(supportsCommands: boolean) {\n if (supportsCommands) {\n return ['pipe', 'pipe', 'pipe', 'ipc'];\n }\n\n return ['pipe', 'pipe', 'pipe'];\n}\n\nconst RuntimeLookup: [CommandKitJsRuntime, () => boolean][] = [\n // @ts-ignore Bun types\n ['bun', () => typeof Bun !== 'undefined' && typeof Bun.version === 'string'],\n [\n 'deno',\n () =>\n // @ts-ignore Deno types\n typeof Deno !== 'undefined' &&\n // @ts-ignore Deno types\n typeof Deno.version === 'object' &&\n // @ts-ignore Deno types\n typeof Deno.version.deno === 'string',\n ],\n];\n\nfunction resolveRuntime(config: ResolvedCommandKitConfig): CommandKitJsRuntime {\n const maybeRuntime = config?.experimental?.devServerRuntime;\n\n // TODO: once stable enough, we should try 'auto' option here\n if (!maybeRuntime) return 'node';\n\n if (maybeRuntime === 'auto') {\n for (const [runtime, check] of RuntimeLookup) {\n if (check()) {\n return runtime as CommandKitJsRuntime;\n }\n }\n\n return 'node';\n }\n\n return maybeRuntime;\n}\n\n/**\n * @private\n * @internal\n */\nexport function createAppProcess(\n fileName: string,\n cwd: string,\n isDev: boolean,\n config: ResolvedCommandKitConfig,\n) {\n if (!existsSync(join(cwd, fileName))) {\n panic(`Could not locate the entrypoint file: ${fileName}`);\n }\n\n const stdio = getStdio(isDev) as IOType[];\n const targetRuntime = resolveRuntime(config);\n\n const baseArgs =\n targetRuntime === 'node'\n ? [\n `--title=\"CommandKit ${isDev ? 'Development' : 'Production'}\"`,\n '--enable-source-maps',\n ]\n : [];\n\n const nodeOptions = process.env.CK_NODE_OPTIONS || process.env.NODE_OPTIONS;\n let nodeArgs = [...baseArgs];\n\n if (nodeOptions) {\n const options = nodeOptions.trim().split(/\\s+/);\n\n for (const option of options) {\n const optionName = option.split('=')[0];\n const existingIndex = nodeArgs.findIndex((arg) =>\n arg.startsWith(optionName),\n );\n\n if (existingIndex !== -1) {\n nodeArgs[existingIndex] = option;\n } else {\n nodeArgs.push(option);\n }\n }\n }\n\n nodeArgs.push(fileName);\n\n const ps = spawn(targetRuntime, nodeArgs, {\n cwd,\n windowsHide: true,\n env: isDev ? DevEnv() : ProdEnv(),\n stdio,\n });\n\n ps.stdout?.pipe(process.stdout);\n ps.stderr?.pipe(process.stderr);\n\n return ps;\n}\n"],"mappings":";;;;;;;;;;;;AAYA,SAAS,SAAS,kBAA2B;CAC3C,IAAI,kBACF,OAAO;EAAC;EAAQ;EAAQ;EAAQ;CAAK;CAGvC,OAAO;EAAC;EAAQ;EAAQ;CAAM;AAChC;AAEA,MAAM,gBAAwD,CAE5D,CAAC,aAAa,OAAO,QAAQ,eAAe,OAAO,IAAI,YAAY,QAAQ,GAC3E,CACE,cAGE,OAAO,SAAS,eAEhB,OAAO,KAAK,YAAY,YAExB,OAAO,KAAK,QAAQ,SAAS,QACjC,CACF;AAEA,SAAS,eAAe,QAAuD;;CAC7E,MAAM,+EAAe,OAAQ,0FAAc;CAG3C,IAAI,CAAC,cAAc,OAAO;CAE1B,IAAI,iBAAiB,QAAQ;EAC3B,KAAK,MAAM,CAAC,SAAS,UAAU,eAC7B,IAAI,MAAM,GACR,OAAO;EAIX,OAAO;CACT;CAEA,OAAO;AACT;;;;;AAMA,SAAgB,iBACd,UACA,KACA,OACA,QACA;;CACA,IAAI,KAACA,wBAAWC,gBAAK,KAAK,QAAQ,CAAC,GACjC,yBAAM,yCAAyC,UAAU;CAG3D,MAAM,QAAQ,SAAS,KAAK;CAC5B,MAAM,gBAAgB,eAAe,MAAM;CAE3C,MAAM,WACJ,kBAAkB,SACd,CACE,uBAAuB,QAAQ,gBAAgB,aAAa,IAC5D,sBACF,IACA,CAAC;CAEP,MAAM,cAAc,QAAQ,IAAI,mBAAmB,QAAQ,IAAI;CAC/D,IAAI,WAAW,CAAC,GAAG,QAAQ;CAE3B,IAAI,aAAa;EACf,MAAM,UAAU,YAAY,KAAK,CAAC,CAAC,MAAM,KAAK;EAE9C,KAAK,MAAM,UAAU,SAAS;GAC5B,MAAM,aAAa,OAAO,MAAM,GAAG,CAAC,CAAC;GACrC,MAAM,gBAAgB,SAAS,WAAW,QACxC,IAAI,WAAW,UAAU,CAC3B;GAEA,IAAI,kBAAkB,IACpB,SAAS,iBAAiB;QAE1B,SAAS,KAAK,MAAM;EAExB;CACF;CAEA,SAAS,KAAK,QAAQ;CAEtB,MAAM,SAAKC,0BAAM,eAAe,UAAU;EACxC;EACA,aAAa;EACb,KAAK,QAAQC,uBAAO,IAAIC,wBAAQ;EAChC;CACF,CAAC;CAED,iBAAG,wDAAQ,KAAK,QAAQ,MAAM;CAC9B,iBAAG,wDAAQ,KAAK,QAAQ,MAAM;CAE9B,OAAO;AACT"}
|
package/dist/cli/build.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
-
const require_commandkit = require("../commandkit-
|
|
2
|
+
const require_commandkit = require("../commandkit-BMeeFmdY.js");
|
|
3
3
|
const require_utils_constants = require("../utils/constants.js");
|
|
4
4
|
const require_config_utils = require("../config/utils.js");
|
|
5
5
|
const require_app_router_CommandsRouter = require("../app/router/CommandsRouter.js");
|
package/dist/cli/build.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","names":["loadTsdown","loadConfigFile","performTypeCheck","COMMANDKIT_CWD","CompilerPluginRuntime","mergeDeep","copyLocaleFiles","join","CommandsRouter","EventsRouter","createRouterTreeArtifact","version","ROUTER_TREE_ARTIFACT_DIRECTORY","mkdir","writeFile","ROUTER_TREE_ARTIFACT_FILE","devEnvFileArgs","prodEnvFileArgs","existsSync"],"sources":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"build.js","names":["loadTsdown","loadConfigFile","performTypeCheck","COMMANDKIT_CWD","CompilerPluginRuntime","mergeDeep","copyLocaleFiles","join","CommandsRouter","EventsRouter","createRouterTreeArtifact","version","ROUTER_TREE_ARTIFACT_DIRECTORY","mkdir","writeFile","ROUTER_TREE_ARTIFACT_FILE","devEnvFileArgs","prodEnvFileArgs","existsSync"],"sources":["../../src/cli/build.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { rimraf } from 'rimraf';\nimport type { InlineConfig } from 'tsdown';\n\nimport { CommandsRouter, EventsRouter } from '../app/router';\nimport {\n createRouterTreeArtifact,\n ROUTER_TREE_ARTIFACT_DIRECTORY,\n ROUTER_TREE_ARTIFACT_FILE,\n} from '../app/router/TreeArtifact';\nimport { MaybeArray } from '../components';\nimport { loadConfigFile } from '../config/loader';\nimport { mergeDeep } from '../config/utils';\nimport { CompilerPlugin, CompilerPluginRuntime } from '../plugins';\nimport { COMMANDKIT_CWD } from '../utils/constants';\nimport { version } from '../version';\nimport { copyLocaleFiles, loadTsdown } from './common';\nimport { devEnvFileArgs, prodEnvFileArgs } from './env';\nimport { performTypeCheck } from './type-checker';\n\n/**\n * @private\n * @internal\n */\nexport interface ApplicationBuildOptions {\n plugins?: MaybeArray<CompilerPlugin>[] | Array<CompilerPlugin>;\n rolldownPlugins?: any[];\n isDev?: boolean;\n configPath?: string;\n}\n\n// emit public env variables and given env variables\n/**\n * @private\n * @internal\n */\nfunction mergeDefinitionsIfNeeded(env: Record<string, string>, isDev: boolean) {\n const values = Object.fromEntries(\n Object.entries(process.env).filter(\n ([k]) => !(k in env) && k.startsWith('COMMANDKIT_PUBLIC_'),\n ),\n );\n\n return {\n ...env,\n ...values,\n ...(isDev\n ? {\n NODE_ENV: 'development',\n COMMANDKIT_BOOTSTRAP_MODE: 'development',\n COMMANDKIT_IS_DEV: 'true',\n COMMANDKIT_IS_TEST: 'false',\n }\n : {\n NODE_ENV: 'production',\n COMMANDKIT_BOOTSTRAP_MODE: 'production',\n COMMANDKIT_IS_DEV: 'false',\n COMMANDKIT_IS_TEST: 'false',\n }),\n };\n}\n\n/**\n * @private\n * @internal\n */\nexport async function buildApplication({\n plugins,\n rolldownPlugins,\n isDev,\n configPath,\n}: ApplicationBuildOptions) {\n const { build } = await loadTsdown();\n const config = await loadConfigFile(configPath);\n\n if (!isDev && !config?.typescript?.ignoreBuildErrors) {\n await performTypeCheck(configPath || COMMANDKIT_CWD);\n }\n\n const pluginRuntime = new CompilerPluginRuntime(\n (plugins || []) as CompilerPlugin[],\n !!isDev,\n );\n\n rolldownPlugins ??= [];\n\n rolldownPlugins.push(pluginRuntime.toJSON());\n\n try {\n const dest = isDev ? '.commandkit' : config.distDir;\n\n // Clean the destination directory\n await rimraf(dest);\n\n await pluginRuntime.init();\n\n await build(\n mergeDeep(\n {\n watch: false,\n dts: false,\n clean: true,\n format: ['esm'],\n shims: true,\n minify: false,\n logLevel: !!isDev ? 'silent' : 'info',\n inputOptions: {\n transform: {\n jsx: {\n runtime: 'automatic',\n importSource: 'commandkit',\n },\n },\n checks: {\n circularDependency: true,\n },\n onwarn: (warning, defaultWarn) => {\n if (warning?.message?.includes('compilerOptions.jsx')) return;\n\n return defaultWarn(warning);\n },\n onLog: (level, log, defaultLog) => {\n if (isDev) return;\n\n return defaultLog(level, log);\n },\n moduleTypes: {\n '.json': 'json',\n '.node': 'binary',\n },\n },\n outExtensions: (context) => {\n return {\n dts: '.d.ts',\n js: context.format === 'cjs' ? '.cjs' : '.js',\n };\n },\n plugins: rolldownPlugins,\n platform: 'node',\n deps: {\n neverBundle: true,\n },\n sourcemap:\n config.sourceMap?.[isDev ? 'development' : 'production'] ?? true,\n target: 'node16',\n outDir: dest,\n env: mergeDefinitionsIfNeeded(config.env || {}, !!isDev),\n entry: Array.from(\n new Set([\n 'src/**/*.{js,cjs,mjs,ts,cts,mts,jsx,tsx}',\n `!${config.distDir}`,\n '!.commandkit',\n '!**/*.test.*',\n '!**/*.spec.*',\n ...(config.entrypoints ?? []),\n ]),\n ),\n outputOptions: {\n sanitizeFileName: (name) => name.replace(/\\0/g, ''),\n },\n unbundle: isDev\n ? true\n : (config.compilerOptions?.disableChunking ?? false),\n } satisfies InlineConfig,\n config.compilerOptions?.tsdown,\n ),\n );\n\n await copyLocaleFiles('src', dest);\n await injectEntryFile(\n configPath || COMMANDKIT_CWD,\n !!isDev,\n !!(\n config.antiCrashScript?.[isDev ? 'development' : 'production'] ??\n (isDev ? true : false)\n ),\n config.distDir,\n );\n\n if (config.experimental.pregenerateCommands) {\n await emitPregeneratedRouterArtifact(join(COMMANDKIT_CWD, dest));\n }\n } catch (error) {\n console.error('Build failed:', error);\n if (error instanceof Error) {\n console.error('Error details:', error.stack);\n }\n process.exit(1); // Force exit on error\n } finally {\n // Ensure plugins are cleaned up\n await pluginRuntime.destroy();\n }\n}\n\nasync function emitPregeneratedRouterArtifact(outputRoot: string) {\n const commandEntrypoint = join(outputRoot, 'app', 'commands');\n const eventsEntrypoint = join(outputRoot, 'app', 'events');\n\n const commandsRouter = new CommandsRouter({\n entrypoint: commandEntrypoint,\n });\n const eventsRouter = new EventsRouter({\n entrypoints: [eventsEntrypoint],\n });\n\n const commands = commandsRouter.isValidPath()\n ? await commandsRouter.scan()\n : {\n commands: {},\n middlewares: {},\n treeNodes: {},\n compiledRoutes: {},\n diagnostics: [],\n };\n\n const events = eventsRouter.isValidPath() ? await eventsRouter.scan() : {};\n\n const artifact = createRouterTreeArtifact({\n outputRoot,\n commandkitVersion: version,\n commands,\n events,\n });\n\n const artifactDirectory = join(outputRoot, ROUTER_TREE_ARTIFACT_DIRECTORY);\n await mkdir(artifactDirectory, { recursive: true });\n await writeFile(\n join(artifactDirectory, ROUTER_TREE_ARTIFACT_FILE),\n JSON.stringify(artifact, null, 2),\n 'utf8',\n );\n}\n\nconst envScript = (dev: boolean) => `// --- Environment Variables Loader ---\nconst $env = [${(dev ? devEnvFileArgs : prodEnvFileArgs).map((p) => `\"${p}\"`).join(', ')}];\nfor (const file of $env) {\n try {\n process.loadEnvFile(file);\n console.log('\\\\x1b[36m✔ Loaded \\\\x1b[0m\\\\x1b[33m%s\\\\x1b[0m', file);\n } catch {}\n}\n`;\n\nconst antiCrashScript = [\n '// --- CommandKit Anti-Crash Monitor ---',\n \" // 'uncaughtException' event is supposed to be used to perform synchronous cleanup before shutting down the process\",\n ' // instead of using it as a means to resume operation.',\n ' // But it exists here due to compatibility reasons with discord bot ecosystem.',\n \" const p = (t) => `\\\\x1b[31m${t}\\\\x1b[0m`, b = '[CommandKit Anti-Crash Monitor]', l = console.log, e1 = 'uncaughtException', e2 = 'unhandledRejection';\",\n ' if (!process.eventNames().includes(e1)) // skip if it is already handled',\n ' process.on(e1, (e) => {',\n ' l(p(`${b} Uncaught Exception`)); l(p(b), p(e.stack || e));',\n ' })',\n ' if (!process.eventNames().includes(e2)) // skip if it is already handled',\n ' process.on(e2, (r) => {',\n ' l(p(`${b} Unhandled promise rejection`)); l(p(`${b} ${r.stack || r}`));',\n ' });',\n '// --- CommandKit Anti-Crash Monitor ---',\n].join('\\n');\n\nconst wrapInAsyncIIFE = (code: string[]) =>\n `;await (async () => {\\n${code.join('\\n\\n')}\\n})();`;\n\nasync function injectEntryFile(\n configPath: string,\n isDev: boolean,\n emitAntiCrashScript: boolean,\n distDir?: string,\n) {\n const dist = isDev ? '.commandkit' : distDir || 'dist';\n const entryFilePath = join(configPath, dist, 'index.js');\n\n // skip if the entry file already exists\n if (existsSync(entryFilePath)) return;\n\n const code = `/* Entrypoint File Generated By CommandKit */\n${isDev ? `\\n\\n// Injected for development\\n${wrapInAsyncIIFE([envScript(isDev), emitAntiCrashScript ? antiCrashScript : ''])}\\n\\n` : wrapInAsyncIIFE([envScript(isDev)])}\n\n\nasync function bootstrap() {\n const { Client } = await import('discord.js');\n const { commandkit } = await import('commandkit');\n const app = await import('./app.js').then((m) => m.default ?? m);\n\n if (!app || !(app instanceof Client)) {\n throw new Error('The app file must default export the discord.js client instance');\n }\n\n commandkit.setClient(app);\n\n await commandkit.start();\n}\n\nawait bootstrap().catch((e) => {\n const error = new Error('Failed to bootstrap the application', { cause: e });\n console.error(error);\n console.error(\\`Caused by \\${e?.stack || e}\\`);\n})\n`;\n\n await writeFile(entryFilePath, code);\n}\n"],"mappings":"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"}
|
package/dist/cli/common.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","names":["join","fs","colors","COMMANDKIT_CWD","generateTypesPackage","nodeModulesPath"],"sources":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"common.js","names":["join","fs","colors","COMMANDKIT_CWD","generateTypesPackage","nodeModulesPath"],"sources":["../../src/cli/common.ts"],"sourcesContent":["import { rimrafSync } from 'rimraf';\nimport { join } from 'node:path';\nimport fs from 'node:fs';\nimport colors from '../utils/colors';\nimport { ResolvedCommandKitConfig } from '../config/utils';\nimport { generateTypesPackage } from '../utils/types-package';\nimport { execSync } from 'node:child_process';\nimport { COMMANDKIT_CWD } from '../utils/constants';\n\nlet ts: typeof import('typescript') | undefined;\nlet tsdown: typeof import('tsdown') | undefined;\n\n/**\n * @private\n * @internal\n */\nexport function write(message: any) {\n process.stdout.write(message);\n process.stdout.write('\\n');\n}\n\n/**\n * @private\n * @internal\n */\nexport function findEntrypoint(dir: string) {\n const target = join(dir, 'sharding-manager.js');\n\n // if sharding manager exists, return that file instead\n if (fs.existsSync(target)) return target;\n\n return join(dir, 'index.js');\n}\n\n/**\n * @returns {never}\n * @internal\n * @private\n */\nexport function panic(message: any): never {\n write(colors.red(`Error: ${message}`));\n process.exit(1);\n}\n\n/**\n * @private\n * @internal\n */\nasync function ensureTypeScript(target: string) {\n const isTypeScript = /\\.(c|m)?tsx?$/.test(target);\n\n if (!isTypeScript) return false;\n if (process.features.typescript) return true;\n\n await loadTypeScript();\n\n return true;\n}\n\nlet packageManager: string;\n\n/**\n * @private\n * @internal\n */\nfunction detectPackageManager() {\n if (packageManager) return packageManager;\n\n const lockfiles = {\n 'yarn.lock': 'yarn',\n 'pnpm-lock.yaml': 'pnpm',\n 'package-lock.json': 'npm',\n 'bun.lock': 'bun',\n 'bun.lockb': 'bun',\n 'deno.lock': 'deno',\n };\n\n for (const [lockfile, manager] of Object.entries(lockfiles)) {\n if (fs.existsSync(join(COMMANDKIT_CWD, lockfile))) {\n packageManager = manager;\n break;\n }\n }\n\n if (!packageManager) {\n packageManager = 'npm';\n }\n\n return packageManager;\n}\n\n/**\n * @private\n * @internal\n */\nexport async function loadTypeScript(e?: string) {\n if (ts) return ts;\n\n try {\n ts = await import('typescript');\n } catch (e) {\n if (e instanceof Error && 'code' in e && e.code === 'MODULE_NOT_FOUND') {\n try {\n const packageManager = detectPackageManager();\n const prefix = packageManager === 'deno' ? 'npm:' : '';\n execSync(`${packageManager} add -D ${prefix}typescript`, {\n stdio: 'inherit',\n cwd: COMMANDKIT_CWD,\n });\n\n console.log(\n colors.cyan(\n `TypeScript has been installed automatically, restarting...`,\n ),\n );\n\n ts = await import('typescript');\n\n return ts;\n } catch {\n panic(\n 'TypeScript is not installed and could not be installed automatically. Please install it manually.',\n );\n }\n }\n panic(e || 'TypeScript must be installed to use TypeScript config files.');\n }\n\n return ts;\n}\n\n/**\n * @private\n * @internal\n */\nexport async function loadConfigFileFromPath(\n target: string,\n): Promise<ResolvedCommandKitConfig> {\n await ensureExists(target);\n\n const isTs = await ensureTypeScript(target);\n\n let generatedFilePath: string | undefined;\n\n if (isTs && ts) {\n const { transpileModule } = ts;\n const src = fs.readFileSync(target, 'utf8');\n const { outputText } = transpileModule(src, {\n compilerOptions: {\n module: ts.ModuleKind.ESNext,\n target: ts.ScriptTarget.ESNext,\n moduleResolution: ts.ModuleResolutionKind.NodeNext,\n },\n fileName: target,\n });\n\n await generateTypesPackage();\n\n const nodeModulesPath = COMMANDKIT_CWD;\n\n const tmpFile = join(nodeModulesPath, 'compiled-commandkit.config.mjs');\n\n fs.writeFileSync(tmpFile, outputText);\n\n generatedFilePath = tmpFile;\n\n target = tmpFile;\n }\n\n /**\n * @type {import('..').CommandKitConfig}\n */\n const config = await import(`file://${target}`).then(\n (conf) => conf.default || conf,\n );\n\n if (generatedFilePath) {\n try {\n fs.unlinkSync(generatedFilePath);\n } catch {\n //\n }\n }\n\n return config;\n}\n\n/**\n * @private\n * @internal\n */\nasync function ensureExists(loc: string) {\n const exists = fs.existsSync(loc);\n\n if (!exists) {\n throw new Error(`File not found: ${loc}`);\n }\n}\n\n/**\n * @private\n * @internal\n */\nexport function erase(dir: string) {\n rimrafSync(dir);\n}\n\n/**\n * @private\n * @internal\n */\nexport async function copyLocaleFiles(_from: string, _to: string) {\n const resolvedFrom = join(COMMANDKIT_CWD, _from);\n const resolvedTo = join(COMMANDKIT_CWD, _to);\n\n const localePaths = ['app/locales'];\n const srcLocalePaths = localePaths.map((path) => join(resolvedFrom, path));\n const destLocalePaths = localePaths.map((path) => join(resolvedTo, path));\n\n for (const localePath of srcLocalePaths) {\n if (!fs.existsSync(localePath)) {\n continue;\n }\n\n // copy localePath to destLocalePath\n const destLocalePath = destLocalePaths[srcLocalePaths.indexOf(localePath)];\n\n if (!fs.existsSync(destLocalePath)) {\n fs.promises.mkdir(destLocalePath, { recursive: true }).catch(() => {});\n }\n\n await fs.promises\n .cp(localePath, destLocalePath, {\n recursive: true,\n force: true,\n })\n .catch(() => {});\n }\n}\n\n/**\n * @private\n * @internal\n */\nexport async function loadTsdown(): Promise<typeof import('tsdown')> {\n if (tsdown) return tsdown;\n\n tsdown = await import('tsdown');\n\n return tsdown;\n}\n"],"mappings":"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"}
|
package/dist/cli/development.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
2
|
const require_utils_colors = require("../utils/colors.js");
|
|
3
|
-
const require_commandkit = require("../commandkit-
|
|
3
|
+
const require_commandkit = require("../commandkit-BMeeFmdY.js");
|
|
4
4
|
const require_plugins_CompilerPlugin = require("../plugins/CompilerPlugin.js");
|
|
5
5
|
const require_utils_constants = require("../utils/constants.js");
|
|
6
6
|
const require_cli_common = require("./common.js");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"development.js","names":["loadConfigFile","findEntrypoint","buildApplication","isCompilerPlugin","createAppProcess","COMMANDKIT_CWD","getPossibleConfigPaths","watch","join","randomUUID","sleep","colors","path","debounce","HMREventType","HMREventChangeType"],"sources":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"development.js","names":["loadConfigFile","findEntrypoint","buildApplication","isCompilerPlugin","createAppProcess","COMMANDKIT_CWD","getPossibleConfigPaths","watch","join","randomUUID","sleep","colors","path","debounce","HMREventType","HMREventChangeType"],"sources":["../../src/cli/development.ts"],"sourcesContent":["import { join } from 'path';\nimport { getPossibleConfigPaths, loadConfigFile } from '../config/loader';\nimport { isCompilerPlugin } from '../plugins';\nimport { createAppProcess } from './app-process';\nimport { buildApplication } from './build';\nimport { watch } from 'chokidar';\nimport { debounce } from '../utils/utilities';\nimport colors from '../utils/colors';\nimport { ChildProcess } from 'node:child_process';\nimport { setTimeout as sleep } from 'node:timers/promises';\nimport { randomUUID } from 'node:crypto';\nimport {\n COMMANDKIT_CWD,\n HMREventChangeType,\n HMREventType,\n} from '../utils/constants';\nimport { findEntrypoint } from './common';\n\n/**\n * @private\n * @internal\n */\nasync function buildAndStart(configPath: string, skipStart = false) {\n const config = await loadConfigFile(configPath);\n const mainFile = findEntrypoint('.commandkit');\n\n await buildApplication({\n configPath,\n isDev: true,\n plugins: config.plugins.flat(2).filter((p) => isCompilerPlugin(p)),\n rolldownPlugins: config.rolldownPlugins,\n });\n\n if (skipStart) return null as never;\n\n const ps = createAppProcess(mainFile, configPath, true, config);\n\n return ps;\n}\n\n/**\n * @private\n * @internal\n */\nconst isCommandSource = (p: string) =>\n p.replaceAll('\\\\', '/').includes('src/app/commands');\n\n/**\n * @private\n * @internal\n */\nconst isEventSource = (p: string) =>\n p.replaceAll('\\\\', '/').includes('src/app/events');\n\n/**\n * @private\n * @internal\n */\nexport async function bootstrapDevelopmentServer(configPath?: string): Promise<{\n watcher: ReturnType<typeof watch>;\n isConfigUpdate: (path: string) => boolean;\n performHMR: (path?: string) => Promise<boolean>;\n hmrHandler: (path: string, changeType?: HMREventChangeType) => Promise<void>;\n sendHmrEvent: (\n event: HMREventType,\n path?: string,\n changeType?: HMREventChangeType,\n ) => Promise<boolean>;\n getProcess: () => ChildProcess | null;\n buildAndStart: typeof buildAndStart;\n}> {\n process.env.COMMANDKIT_BOOTSTRAP_MODE = 'development';\n process.env.COMMANDKIT_INTERNAL_IS_CLI_PROCESS = 'true';\n const start = performance.now();\n const cwd = configPath || COMMANDKIT_CWD;\n const configPaths = getPossibleConfigPaths(cwd);\n\n const watcher = watch([join(cwd, 'src'), ...configPaths], {\n ignoreInitial: true,\n });\n\n let ps: ChildProcess | null = null;\n\n const waitForAcknowledgment = (messageId: string): Promise<boolean> => {\n return new Promise((resolve) => {\n if (!ps) return resolve(false);\n\n let _handled = false;\n const onMessage = (message: any) => {\n _handled = true;\n if (typeof message !== 'object' || message === null) return;\n\n const { type, id, handled } = message;\n if (type === 'commandkit-hmr-ack' && id === messageId) {\n ps?.off('message', onMessage);\n resolve(!!handled);\n }\n };\n\n ps.once('message', onMessage);\n\n if (!_handled) {\n sleep(3000).then(() => {\n ps?.off('message', onMessage);\n resolve(false);\n });\n }\n });\n };\n\n const sendHmrEvent = async (\n event: HMREventType,\n path?: string,\n changeType?: HMREventChangeType,\n ): Promise<boolean> => {\n if (!ps || !ps.send) return false;\n\n const messageId = randomUUID();\n const messagePromise = waitForAcknowledgment(messageId);\n\n ps.send({ event, path, changeType, id: messageId });\n\n // Wait for acknowledgment or timeout after 3 seconds\n try {\n let triggered = false;\n const res = !!(await Promise.race([\n messagePromise,\n sleep(3000).then(() => {\n if (!triggered) {\n console.warn(\n colors.yellow(\n `HMR acknowledgment timed out for event ${event} on path ${path}`,\n ),\n );\n }\n return false;\n }),\n ]));\n\n triggered = true;\n\n return res;\n } catch (error) {\n console.error(\n colors.red(`Error waiting for HMR acknowledgment: ${error}`),\n );\n return false;\n }\n };\n\n const performHMR = debounce(\n async (\n path?: string,\n changeType?: HMREventChangeType,\n ): Promise<boolean> => {\n if (!path || !ps) return false;\n\n let eventType: HMREventType | null = null;\n let eventDescription = '';\n\n if (isCommandSource(path)) {\n eventType = HMREventType.ReloadCommands;\n eventDescription = 'command(s)';\n } else if (isEventSource(path)) {\n eventType = HMREventType.ReloadEvents;\n eventDescription = 'event(s)';\n } else {\n eventType = HMREventType.Unknown;\n eventDescription = 'unknown source';\n }\n\n if (eventType) {\n console.log(\n `${colors.cyanBright(`Attempting to reload ${eventDescription} at`)} ${colors.yellowBright(path)}`,\n );\n\n await buildAndStart(cwd, true);\n const hmrHandled = await sendHmrEvent(eventType, path, changeType);\n\n if (hmrHandled) {\n console.log(\n `${colors.greenBright(`Successfully hot reloaded ${eventDescription} at`)} ${colors.yellowBright(path)}`,\n );\n return true;\n }\n }\n\n return false;\n },\n 700,\n );\n\n const isConfigUpdate = (path: string) => {\n const isConfig = configPaths.some((configPath) => path === configPath);\n\n if (!isConfig) return false;\n\n console.log(\n colors.yellowBright(\n 'It seems like commandkit config file was updated, please restart the server manually to apply changes.',\n ),\n );\n\n return isConfig;\n };\n\n const hmrHandler = async (\n path: string,\n changeType: HMREventChangeType = HMREventChangeType.Change,\n ) => {\n if (isConfigUpdate(path)) return;\n const hmr = await performHMR(path, changeType);\n if (hmr) return;\n\n console.log(\n `${colors.yellowBright('⚡️ Performing full restart due to the changes in')} ${colors.cyanBright(path)}`,\n );\n\n ps?.kill();\n ps = await buildAndStart(cwd);\n };\n\n process.stdin.on('data', async (d) => {\n const command = d.toString().trim();\n\n switch (command) {\n case 'r':\n console.log(`Received restart command, restarting...`);\n ps?.kill();\n ps = null;\n ps = await buildAndStart(cwd);\n break;\n case 'rc':\n console.log(`Received reload commands command, reloading...`);\n await sendHmrEvent(HMREventType.ReloadCommands);\n break;\n case 're':\n console.log(`Received reload events command, reloading...`);\n await sendHmrEvent(HMREventType.ReloadEvents);\n break;\n break;\n }\n });\n\n watcher.on('change', (path) => hmrHandler(path, HMREventChangeType.Change));\n watcher.on('add', (path) => hmrHandler(path, HMREventChangeType.Add));\n watcher.on('unlink', (path) => hmrHandler(path, HMREventChangeType.Unlink));\n watcher.on('unlinkDir', (path) =>\n hmrHandler(path, HMREventChangeType.UnlinkDir),\n );\n watcher.on('error', (e) => {\n console.error(e);\n });\n\n console.log(`${colors.greenBright('Bootstrapped CommandKit Development Environment in')} ${colors.yellowBright(`${(performance.now() - start).toFixed(2)}ms`)}\n${colors.greenBright('Watching for changes in')} ${colors.yellowBright('src')} ${colors.greenBright('directory')}\n\n${colors.greenBright('Commands:')}\n${colors.yellowBright('r')} - Restart the server\n${colors.yellowBright('rc')} - Reload all commands\n${colors.yellowBright('re')} - Reload all events`);\n\n const buildStart = performance.now();\n\n ps = await buildAndStart(cwd);\n\n const buildEnd = performance.now();\n\n console.log(\n `\\n${colors.greenBright('Development mode compilation took')} ${colors.yellowBright(`${(buildEnd - buildStart).toFixed(2)}ms`)}\\n`,\n );\n\n return {\n watcher,\n isConfigUpdate,\n performHMR,\n hmrHandler,\n sendHmrEvent,\n getProcess: () => ps,\n buildAndStart,\n };\n}\n"],"mappings":"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"}
|
package/dist/cli/env.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.js","names":[],"sources":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"env.js","names":[],"sources":["../../src/cli/env.ts"],"sourcesContent":["/**\n * @private\n * @internal\n */\nexport function DevEnv(_static = false) {\n const common = {\n NODE_ENV: 'development',\n COMMANDKIT_IS_DEV: 'true',\n COMMANDKIT_INTERNAL_IS_CLI_PROCESS: 'false',\n COMMANDKIT_IS_BUILD: 'false',\n };\n\n if (_static) return Object.assign({}, common);\n\n return Object.assign({}, process.env, common);\n}\n\n/**\n * @private\n * @internal\n */\nexport function ProdEnv(_static = false) {\n const common = {\n NODE_ENV: 'production',\n COMMANDKIT_IS_DEV: 'false',\n COMMANDKIT_INTERNAL_IS_CLI_PROCESS: 'false',\n COMMANDKIT_IS_BUILD: 'false',\n };\n\n if (_static) return Object.assign({}, common);\n\n return Object.assign({}, process.env, common);\n}\n\n/**\n * @private\n * @internal\n */\nexport const CommonEnvFiles = ['.env', '.env.local'];\n/**\n * @private\n * @internal\n */\nexport const DevEnvFiles = ['.env.development', '.env.development.local'];\n/**\n * @private\n * @internal\n */\nexport const ProdEnvFiles = ['.env.production', '.env.production.local'];\n/**\n * @private\n * @internal\n */\nexport const devEnvFileArgs = [...CommonEnvFiles, ...DevEnvFiles];\n/**\n * @private\n * @internal\n */\nexport const prodEnvFileArgs = [...CommonEnvFiles, ...ProdEnvFiles];\n/**\n * @private\n * @internal\n */\nexport function setCLIEnv() {\n process.env.COMMANDKIT_IS_CLI = 'true';\n}\n"],"mappings":";;;;;;AAIA,SAAgB,OAAO,UAAU,OAAO;CACtC,MAAM,SAAS;EACb,UAAU;EACV,mBAAmB;EACnB,oCAAoC;EACpC,qBAAqB;CACvB;CAEA,IAAI,SAAS,OAAO,OAAO,OAAO,CAAC,GAAG,MAAM;CAE5C,OAAO,OAAO,OAAO,CAAC,GAAG,QAAQ,KAAK,MAAM;AAC9C;;;;;AAMA,SAAgB,QAAQ,UAAU,OAAO;CACvC,MAAM,SAAS;EACb,UAAU;EACV,mBAAmB;EACnB,oCAAoC;EACpC,qBAAqB;CACvB;CAEA,IAAI,SAAS,OAAO,OAAO,OAAO,CAAC,GAAG,MAAM;CAE5C,OAAO,OAAO,OAAO,CAAC,GAAG,QAAQ,KAAK,MAAM;AAC9C;;;;;AAMA,MAAa,iBAAiB,CAAC,QAAQ,YAAY;;;;;AAKnD,MAAa,cAAc,CAAC,oBAAoB,wBAAwB;;;;;AAKxE,MAAa,eAAe,CAAC,mBAAmB,uBAAuB;;;;;AAKvE,MAAa,iBAAiB,CAAC,GAAG,gBAAgB,GAAG,WAAW;;;;;AAKhE,MAAa,kBAAkB,CAAC,GAAG,gBAAgB,GAAG,YAAY;;;;;AAKlE,SAAgB,YAAY;CAC1B,QAAQ,IAAI,oBAAoB;AAClC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generators.js","names":["COMMANDKIT_CWD","join","path","existsSync","mkdir","writeFile","colors","readdir"],"sources":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"generators.js","names":["COMMANDKIT_CWD","join","path","existsSync","mkdir","writeFile","colors","readdir"],"sources":["../../src/cli/generators.ts"],"sourcesContent":["import { mkdir, writeFile, readdir } from 'fs/promises';\nimport { join } from 'path';\nimport { panic } from './common';\nimport { existsSync } from 'fs';\nimport colors from '../utils/colors';\nimport { COMMANDKIT_CWD } from '../utils/constants';\n\nconst BASE_PATH = COMMANDKIT_CWD;\nconst COMMANDS_DIR = join(BASE_PATH, 'src/app/commands');\nconst EVENTS_DIR = join(BASE_PATH, 'src/app/events');\n\n/**\n * @private\n * @internal\n */\nconst formatPath = (path: string) =>\n path.replace(COMMANDKIT_CWD, '.').replace(/\\\\/g, '/');\n\n/**\n * @private\n * @internal\n */\nfunction determineExtension() {\n return existsSync(join(BASE_PATH, 'tsconfig.json')) ? 'ts' : 'js';\n}\n\n/**\n * @private\n * @internal\n */\nfunction TS_COMMAND_SOURCE(name: string) {\n return `import type { CommandData, ChatInputCommand, MessageCommand } from 'commandkit';\n\nexport const command: CommandData = {\n name: '${name}',\n description: '${name} command',\n};\n\nexport const chatInput: ChatInputCommand = async (ctx) => {\n await ctx.interaction.reply('Hello from ${name}!');\n};\n\nexport const message: MessageCommand = async (ctx) => {\n await ctx.message.reply('Hello from ${name}!');\n};\n`;\n}\n\n/**\n * @private\n * @internal\n */\nfunction JS_COMMAND_SOURCE(name: string) {\n return `/**\n * @type {import('commandkit').CommandData}\n */\nexport const command = {\n name: '${name}',\n description: '${name} command',\n};\n\n/**\n * @type {import('commandkit').ChatInputCommand}\n */\nexport const chatInput = async (ctx) => {\n await ctx.interaction.reply('Hello from ${name}!');\n};\n\n/**\n * @type {import('commandkit').MessageCommand}\n */\nexport const message = async (ctx) => {\n await ctx.message.reply('Hello from ${name}!');\n};\n`;\n}\n\n/**\n * @private\n * @internal\n */\nfunction TS_EVENT_SOURCE(name: string) {\n const eventName = name[0].toUpperCase() + name.slice(1);\n return `import type { EventHandler } from 'commandkit';\n\nconst ${eventName}: EventHandler<'${name}'> = async () => {\n console.log('${name} event fired!');\n};\n\nexport default ${eventName};\n`;\n}\n\n/**\n * @private\n * @internal\n */\nfunction JS_EVENT_SOURCE(name: string) {\n const eventName = `on${name[0].toUpperCase() + name.slice(1)}`;\n return `/**\n * @type {import('commandkit').EventHandler<'${name}'>}\n */\nconst ${eventName} = async () => {\n console.log('${name} event fired!');\n};\n\nexport default ${eventName};\n`;\n}\n\n/**\n * @private\n * @internal\n */\nexport async function generateCommand(name: string, customPath?: string) {\n const cmdPath = join(customPath || COMMANDS_DIR);\n if (!existsSync(cmdPath)) await mkdir(cmdPath, { recursive: true });\n\n const ext = determineExtension();\n const isTypeScript = ext === 'ts';\n\n const fileName = `${name}.${ext}`;\n\n if (existsSync(join(cmdPath, fileName))) {\n panic(`Command ${name} already exists.`);\n }\n\n const commandFile = isTypeScript\n ? TS_COMMAND_SOURCE(name)\n : JS_COMMAND_SOURCE(name);\n\n await writeFile(join(cmdPath, fileName), commandFile);\n\n console.log(\n colors.green(\n `Command ${colors.magenta(name)} created at ${colors.blue(formatPath(`${cmdPath}/${fileName}`))}`,\n ),\n );\n}\n\n/**\n * @private\n * @internal\n */\nexport async function generateEvent(name: string, customPath?: string) {\n const eventPath = join(customPath || EVENTS_DIR, name);\n if (!existsSync(eventPath)) await mkdir(eventPath, { recursive: true });\n\n const ext = determineExtension();\n const isTypeScript = ext === 'ts';\n\n let filename = `event.${ext}`;\n\n if (existsSync(join(eventPath, filename))) {\n const count = (await readdir(eventPath)).length;\n filename = `${String(count).padStart(2, '0')}_${filename}`;\n }\n\n const eventFile = isTypeScript\n ? TS_EVENT_SOURCE(name)\n : JS_EVENT_SOURCE(name);\n\n await writeFile(join(eventPath, filename), eventFile);\n\n console.log(\n colors.green(\n `Event ${colors.magenta(name)} created at ${colors.blue(formatPath(eventPath))}/${colors.magenta(filename)}`,\n ),\n );\n}\n"],"mappings":";;;;;;;;;AAOA,MAAM,YAAYA;AAClB,MAAM,mBAAeC,WAAK,WAAW,kBAAkB;AACvD,MAAM,iBAAaA,WAAK,WAAW,gBAAgB;;;;;AAMnD,MAAM,cAAc,WAClBC,OAAK,QAAQF,wCAAgB,GAAG,CAAC,CAAC,QAAQ,OAAO,GAAG;;;;;AAMtD,SAAS,qBAAqB;CAC5B,WAAOG,mBAAWF,WAAK,WAAW,eAAe,CAAC,IAAI,OAAO;AAC/D;;;;;AAMA,SAAS,kBAAkB,MAAc;CACvC,OAAO;;;WAGE,KAAK;kBACE,KAAK;;;;4CAIqB,KAAK;;;;wCAIT,KAAK;;;AAG7C;;;;;AAMA,SAAS,kBAAkB,MAAc;CACvC,OAAO;;;;WAIE,KAAK;kBACE,KAAK;;;;;;;4CAOqB,KAAK;;;;;;;wCAOT,KAAK;;;AAG7C;;;;;AAMA,SAAS,gBAAgB,MAAc;CACrC,MAAM,YAAY,KAAK,EAAE,CAAC,YAAY,IAAI,KAAK,MAAM,CAAC;CACtD,OAAO;;QAED,UAAU,kBAAkB,KAAK;iBACxB,KAAK;;;iBAGL,UAAU;;AAE3B;;;;;AAMA,SAAS,gBAAgB,MAAc;CACrC,MAAM,YAAY,KAAK,KAAK,EAAE,CAAC,YAAY,IAAI,KAAK,MAAM,CAAC;CAC3D,OAAO;+CACsC,KAAK;;QAE5C,UAAU;iBACD,KAAK;;;iBAGL,UAAU;;AAE3B;;;;;AAMA,eAAsB,gBAAgB,MAAc,YAAqB;CACvE,MAAM,cAAUA,WAAK,cAAc,YAAY;CAC/C,IAAI,KAACE,eAAW,OAAO,GAAG,UAAMC,mBAAM,SAAS,EAAE,WAAW,KAAK,CAAC;CAElE,MAAM,MAAM,mBAAmB;CAC/B,MAAM,eAAe,QAAQ;CAE7B,MAAM,WAAW,GAAG,KAAK,GAAG;CAE5B,QAAID,mBAAWF,WAAK,SAAS,QAAQ,CAAC,GACpC,yBAAM,WAAW,KAAK,iBAAiB;CAGzC,MAAM,cAAc,eAChB,kBAAkB,IAAI,IACtB,kBAAkB,IAAI;CAE1B,UAAMI,2BAAUJ,WAAK,SAAS,QAAQ,GAAG,WAAW;CAEpD,QAAQ,IACNK,6BAAO,MACL,WAAWA,6BAAO,QAAQ,IAAI,EAAE,cAAcA,6BAAO,KAAK,WAAW,GAAG,QAAQ,GAAG,UAAU,CAAC,GAChG,CACF;AACF;;;;;AAMA,eAAsB,cAAc,MAAc,YAAqB;CACrE,MAAM,gBAAYL,WAAK,cAAc,YAAY,IAAI;CACrD,IAAI,KAACE,eAAW,SAAS,GAAG,UAAMC,mBAAM,WAAW,EAAE,WAAW,KAAK,CAAC;CAEtE,MAAM,MAAM,mBAAmB;CAC/B,MAAM,eAAe,QAAQ;CAE7B,IAAI,WAAW,SAAS;CAExB,QAAID,mBAAWF,WAAK,WAAW,QAAQ,CAAC,GAAG;EACzC,MAAM,SAAS,UAAMM,qBAAQ,SAAS,EAAC,CAAE;EACzC,WAAW,GAAG,OAAO,KAAK,CAAC,CAAC,SAAS,GAAG,GAAG,EAAE,GAAG;CAClD;CAEA,MAAM,YAAY,eACd,gBAAgB,IAAI,IACpB,gBAAgB,IAAI;CAExB,UAAMF,2BAAUJ,WAAK,WAAW,QAAQ,GAAG,SAAS;CAEpD,QAAQ,IACNK,6BAAO,MACL,SAASA,6BAAO,QAAQ,IAAI,EAAE,cAAcA,6BAAO,KAAK,WAAW,SAAS,CAAC,EAAE,GAAGA,6BAAO,QAAQ,QAAQ,GAC3G,CACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"information.js","names":["path","COMMANDKIT_CWD","fs","execSync","os","commandkitVersion"],"sources":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"information.js","names":["os","execSync","version","commandkitVersion","fs","path","COMMANDKIT_CWD","knownPlugins","findPackageVersion","packageName","packageJsonPath","require","resolve","packageJson","e","basePaths","join","basePath","existsSync","JSON","parse","readFileSync","nodeModulesPath","folders","readdirSync","packageFolder","find","folder","startsWith","replace","getBinaryVersion","binary","toString","trim","showInformation","runtimeName","globalThis","Deno","Bun","info","Platform","process","platform","Arch","arch","Version","Math","round","totalmem","cpus","length","Runtime","Binaries","Node","npm","Yarn","pnpm","commandkit","typescript","rolldown","tsdown","reduce","acc","plugin","Record","output","section","data","Object","entries","key","value","console","log","path","COMMANDKIT_CWD","fs","execSync","os","commandkitVersion"],"sources":["../../src/cli/information.ts"],"sourcesContent":["import os from 'node:os';\nimport { execSync } from 'node:child_process';\nimport { version as commandkitVersion } from '../version';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { COMMANDKIT_CWD } from '../utils/constants';\n\n/**\n * @private\n * @internal\n */\nfunction $getKnownPlugins() {\n 'use macro';\n\n // remove name from the list when that plugin is stable\n const BLACKLISTED = new Set([\n 'commandkit', // core package itself, not a plugin\n 'create-commandkit', // generator, not a plugin\n 'tsconfig', // repo config related, not a plugin\n // the plugins below are TBD\n 'tasks',\n ]);\n\n const { readdirSync, readFileSync } =\n require('node:fs') as typeof import('node:fs');\n const { join } = require('node:path') as typeof path;\n\n const pluginsPath = join(__dirname, '..', '..', '..');\n\n const entries = readdirSync(pluginsPath, { withFileTypes: true }).filter(\n (e) => !BLACKLISTED.has(e.name),\n );\n\n const packages = entries.map((p) =>\n join(p.parentPath, p.name, 'package.json'),\n );\n\n const knownPlugins: string[] = [];\n\n for (const pkg of packages) {\n try {\n const { name } = JSON.parse(readFileSync(pkg, 'utf8'));\n if (name && !BLACKLISTED.has(name.replace('@commandkit/', ''))) {\n knownPlugins.push(name);\n }\n } catch {\n // Ignore errors\n }\n }\n\n return knownPlugins;\n}\n\nconst knownPlugins: string[] = $getKnownPlugins();\n\n/**\n * @private\n * @internal\n */\nfunction findPackageVersion(packageName: string) {\n try {\n const packageJsonPath = require.resolve(`${packageName}/package.json`);\n const packageJson = require(packageJsonPath);\n return packageJson.version;\n } catch (e) {\n try {\n const basePaths = [\n path.join(COMMANDKIT_CWD, 'node_modules', packageName),\n path.join(COMMANDKIT_CWD, '..', '..', 'node_modules', packageName),\n path.join(COMMANDKIT_CWD, '..', '..', '.pnpm', packageName),\n path.join(\n COMMANDKIT_CWD,\n '..',\n '..',\n 'node_modules',\n '.pnpm',\n packageName,\n ),\n ];\n\n for (const basePath of basePaths) {\n const packageJsonPath = path.join(basePath, 'package.json');\n if (fs.existsSync(packageJsonPath)) {\n const packageJson = JSON.parse(\n fs.readFileSync(packageJsonPath, 'utf8'),\n );\n return packageJson.version;\n }\n }\n\n const nodeModulesPath = path.join(\n COMMANDKIT_CWD,\n '..',\n '..',\n 'node_modules',\n '.pnpm',\n );\n if (fs.existsSync(nodeModulesPath)) {\n const folders = fs.readdirSync(nodeModulesPath);\n const packageFolder = folders.find((folder) =>\n folder.startsWith(`${packageName.replace('/', '+')}@`),\n );\n\n if (packageFolder) {\n const packageJsonPath = path.join(\n nodeModulesPath,\n packageFolder,\n 'node_modules',\n packageName,\n 'package.json',\n );\n if (fs.existsSync(packageJsonPath)) {\n const packageJson = JSON.parse(\n fs.readFileSync(packageJsonPath, 'utf8'),\n );\n return packageJson.version;\n }\n }\n }\n\n return null;\n } catch {\n return null;\n }\n }\n}\n\n/**\n * @private\n * @internal\n */\nfunction getBinaryVersion(binary: string) {\n try {\n const version = execSync(`${binary} --version`).toString().trim();\n return version;\n } catch {\n return null;\n }\n}\n\n/**\n * @private\n * @internal\n */\nexport async function showInformation() {\n const runtimeName: string = (() => {\n // @ts-ignore\n if ('Deno' in globalThis && typeof Deno !== 'undefined') return 'Deno';\n // @ts-ignore\n if ('Bun' in globalThis && typeof Bun !== 'undefined') return 'Bun';\n\n return 'Node.js';\n })();\n\n const info = {\n 'Operating System': {\n Platform: process.platform,\n Arch: process.arch,\n Version: os.version(),\n 'Available Memory (MB)': Math.round(os.totalmem() / 1024 / 1024),\n 'Available CPU cores': os.cpus().length,\n },\n Runtime: runtimeName,\n Binaries: {\n Node: process.version,\n npm: getBinaryVersion('npm') || 'N/A',\n Yarn: getBinaryVersion('yarn') || 'N/A',\n pnpm: getBinaryVersion('pnpm') || 'N/A',\n Bun: getBinaryVersion('bun') || 'N/A',\n Deno: (getBinaryVersion('deno') || 'N/A').replace(/\\n|\\r/g, ' '),\n },\n 'Relevant Packages': {\n commandkit: commandkitVersion,\n 'discord.js': findPackageVersion('discord.js') || 'N/A',\n typescript: findPackageVersion('typescript') || 'N/A',\n rolldown: findPackageVersion('rolldown') || 'N/A',\n tsdown: findPackageVersion('tsdown') || 'N/A',\n },\n 'CommandKit Plugins': knownPlugins.reduce(\n (acc, plugin) => {\n acc[plugin] = findPackageVersion(plugin) || 'N/A';\n return acc;\n },\n {} as Record<string, string>,\n ),\n };\n\n let output = '';\n\n for (const [section, data] of Object.entries(info)) {\n output += `${section}:\\n`;\n\n if (typeof data === 'string') {\n output += ` ${data}\\n\\n`;\n continue;\n }\n\n for (const [key, value] of Object.entries(data)) {\n output += ` ${key}: ${value}\\n`;\n }\n output += '\\n';\n }\n\n console.log(output.trim());\n}\n"],"mappings":"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"}
|
package/dist/cli/init.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
-
const require_commandkit = require("../commandkit-
|
|
2
|
+
const require_commandkit = require("../commandkit-BMeeFmdY.js");
|
|
3
3
|
const require_plugins_CompilerPlugin = require("../plugins/CompilerPlugin.js");
|
|
4
4
|
const require_utils_constants = require("../utils/constants.js");
|
|
5
5
|
const require_utils_types_package = require("../utils/types-package.js");
|
package/dist/cli/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","names":["COMMANDKIT_CWD","generateTypesPackage","rewriteCommandDeclaration","CommandsRouter","existsSync","join","loadConfigFile","CompilerPluginRuntime","isCompilerPlugin","getTypesFilePath"],"sources":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"init.js","names":["COMMANDKIT_CWD","generateTypesPackage","rewriteCommandDeclaration","CommandsRouter","existsSync","join","loadConfigFile","CompilerPluginRuntime","isCompilerPlugin","getTypesFilePath"],"sources":["../../src/cli/init.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport {\n COMMANDKIT_ENV_FILE,\n generateTypesPackage,\n getTypesFilePath,\n rewriteCommandDeclaration,\n} from '../utils/types-package';\nimport { loadConfigFile } from '../config/loader';\nimport {\n CompilerPlugin,\n CompilerPluginRuntime,\n isCompilerPlugin,\n} from '../plugins';\nimport { CommandsRouter } from '../app/router';\nimport { panic } from './common';\nimport { COMMANDKIT_CWD } from '../utils/constants';\n\n/**\n * Creates a command line interface for CommandKit.\n * @param argv The arguments passed to the CLI.\n * @param options The options passed to the CLI.\n */\nexport async function bootstrapCommandkitCLI(\n argv: string[],\n options?: import('commander').ParseOptions | undefined,\n) {\n process.title = 'CommandKit CLI';\n\n // imports are lazily loaded when the cli is used, instead of loading it with the lib itself\n const { Command } = await import('commander');\n const { bootstrapDevelopmentServer } = await import('./development');\n const { bootstrapProductionServer, createProductionBuild } =\n await import('./production');\n const { generateCommand, generateEvent } = await import('./generators');\n const { version } = await import('../version');\n const { showInformation } = await import('./information');\n const { setCLIEnv } = await import('./env');\n\n const program = new Command('commandkit');\n\n program\n .command('dev')\n .version(version)\n .description('Start your bot in development mode.')\n .option(\n '-c, --config [path]',\n 'Path to your commandkit config file.',\n './commandkit.js',\n )\n .action(() => {\n const options = program.opts();\n bootstrapDevelopmentServer(options.config);\n });\n\n program\n .command('info')\n .description(\n 'Show information about the system which can be used to report bugs.',\n )\n .action(async () => {\n await showInformation();\n });\n\n program\n .command('start')\n .description(\n 'Start your bot in production mode after running the build command.',\n )\n .option('-c, --config [path]', 'Path to your commandkit config file.')\n .action(() => {\n const options = program.opts();\n bootstrapProductionServer(options.config);\n });\n\n program\n .command('build')\n .description('Build your project for production usage.')\n .option('-c, --config [path]', 'Path to your commandkit config file.')\n .action(() => {\n setCLIEnv();\n const options = program.opts();\n return createProductionBuild(options.config);\n });\n\n program\n .command('typegen')\n .description('Generate command type declarations for this project.')\n .option('-c, --config [path]', 'Path to your commandkit config file.')\n .action(async () => {\n setCLIEnv();\n const options = program.opts();\n const cwd = options.config || COMMANDKIT_CWD;\n\n await generateTypesPackage(true);\n\n const commandsEntrypoint = resolveCommandsEntrypoint(cwd);\n\n if (!commandsEntrypoint) {\n await rewriteCommandDeclaration([]);\n return;\n }\n\n const router = new CommandsRouter({\n entrypoint: commandsEntrypoint,\n });\n\n if (!router.isValidPath()) {\n await rewriteCommandDeclaration([]);\n return;\n }\n\n const result = await router.scan();\n const commandNames = Object.values(result.commands).map(\n (cmd) => cmd.name,\n );\n const routeNames = Object.keys(result.compiledRoutes ?? {});\n const names = Array.from(\n new Set([...commandNames, ...routeNames]),\n ).sort();\n\n if (!existsSync(join(cwd, COMMANDKIT_ENV_FILE))) {\n await generateTypesPackage(true);\n }\n\n await rewriteCommandDeclaration(names);\n });\n\n program\n .command('create')\n .description(\n 'Create new files using built-in templates or custom plugin templates',\n )\n .argument(\n '<template>',\n 'The template to use (e.g. command, event, or custom plugin template)',\n )\n .argument('[args...]', 'Additional arguments for the template')\n .action(async (template, args) => {\n setCLIEnv();\n\n // Handle custom plugin templates\n const { plugins } = await loadConfigFile();\n const runtime = new CompilerPluginRuntime(\n plugins.filter((p) => isCompilerPlugin(p)) as CompilerPlugin[],\n true,\n );\n\n try {\n await runtime.init();\n const templateHandler = runtime.getTemplate(template);\n\n if (!templateHandler) {\n // Handle built-in templates\n if (template === 'command') {\n const [name] = args;\n if (!name) {\n panic('Command name is required');\n }\n await generateCommand(name);\n return;\n }\n\n if (template === 'event') {\n const [name] = args;\n if (!name) {\n panic('Event name is required');\n }\n await generateEvent(name);\n return;\n }\n\n const valid = Array.from(\n new Set([\n 'command',\n 'event',\n ...Array.from(runtime.getTemplates().keys()),\n ]),\n ).map((t) => `\"${t}\"`);\n\n panic(\n `Template \"${template}\" not found. Available templates: ${valid.join(', ')}`,\n );\n }\n\n await templateHandler(args);\n } catch (e: any) {\n panic(`Failed to execute template \"${template}\": ${e?.message || e}`);\n } finally {\n await runtime.destroy();\n }\n });\n\n const types = getTypesFilePath();\n\n if (!existsSync(types)) {\n await generateTypesPackage(true).catch(() => {});\n }\n\n await program.parseAsync(argv, options);\n}\n\nfunction resolveCommandsEntrypoint(cwd: string) {\n const sourceLikeRoots = [\n join(cwd, 'src', 'app', 'commands'),\n join(cwd, 'app', 'commands'),\n ];\n\n for (const candidate of sourceLikeRoots) {\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n\n return null;\n}\n"],"mappings":"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"}
|
package/dist/cli/production.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
-
const require_commandkit = require("../commandkit-
|
|
2
|
+
const require_commandkit = require("../commandkit-BMeeFmdY.js");
|
|
3
3
|
const require_plugins_CompilerPlugin = require("../plugins/CompilerPlugin.js");
|
|
4
4
|
const require_utils_constants = require("../utils/constants.js");
|
|
5
5
|
const require_cli_common = require("./common.js");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"production.js","names":["COMMANDKIT_CWD","loadConfigFile","findEntrypoint","existsSync","createAppProcess","createSpinner","buildApplication","isCompilerPlugin"],"sources":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"production.js","names":["COMMANDKIT_CWD","loadConfigFile","findEntrypoint","existsSync","createAppProcess","createSpinner","buildApplication","isCompilerPlugin"],"sources":["../../src/cli/production.ts"],"sourcesContent":["import { loadConfigFile } from '../config/loader';\nimport { createAppProcess } from './app-process';\nimport { existsSync } from 'fs';\nimport { findEntrypoint, panic } from './common';\nimport { buildApplication } from './build';\nimport { CompilerPlugin, isCompilerPlugin } from '../plugins';\nimport { createSpinner } from './utils';\nimport { COMMANDKIT_CWD } from '../utils/constants';\n\n/**\n * @private\n * @internal\n */\nexport async function bootstrapProductionServer(configPath?: string) {\n process.env.COMMANDKIT_BOOTSTRAP_MODE = 'production';\n const cwd = configPath || COMMANDKIT_CWD;\n const config = await loadConfigFile(cwd);\n const mainFile = findEntrypoint(config.distDir);\n\n if (!existsSync(mainFile)) {\n panic(\n `Could not locate the entrypoint. Did you forget to build the application? Run 'commandkit build' to build the application first.`,\n );\n }\n\n return createAppProcess(mainFile, cwd, false, config);\n}\n\n/**\n * @private\n * @internal\n */\nexport async function createProductionBuild(configPath?: string) {\n process.env.COMMANDKIT_BOOTSTRAP_MODE = 'production';\n process.env.COMMANDKIT_INTERNAL_IS_CLI_PROCESS = 'true';\n process.env.COMMANDKIT_IS_BUILD ??= 'true';\n const cwd = configPath || COMMANDKIT_CWD;\n const config = await loadConfigFile(cwd);\n\n const spinner = await createSpinner(\n 'Creating an optimized production build\\n',\n );\n\n spinner.start();\n\n await buildApplication({\n configPath: cwd,\n isDev: false,\n plugins: config.plugins.filter((p) =>\n isCompilerPlugin(p),\n ) as CompilerPlugin[],\n rolldownPlugins: config.rolldownPlugins,\n });\n\n spinner.succeed('Production build completed!');\n}\n"],"mappings":";;;;;;;;;;;;;;;AAaA,eAAsB,0BAA0B,YAAqB;CACnE,QAAQ,IAAI,4BAA4B;CACxC,MAAM,MAAM,cAAcA;CAC1B,MAAM,SAAS,MAAMC,kCAAe,GAAG;CACvC,MAAM,WAAWC,kCAAe,OAAO,OAAO;CAE9C,IAAI,KAACC,eAAW,QAAQ,GACtB,yBACE,kIACF;CAGF,OAAOC,yCAAiB,UAAU,KAAK,OAAO,MAAM;AACtD;;;;;AAMA,eAAsB,sBAAsB,YAAqB;CAC/D,QAAQ,IAAI,4BAA4B;CACxC,QAAQ,IAAI,qCAAqC;CACjD,QAAQ,IAAI,wBAAwB;CACpC,MAAM,MAAM,cAAcJ;CAC1B,MAAM,SAAS,MAAMC,kCAAe,GAAG;CAEvC,MAAM,UAAU,MAAMI,gCACpB,0CACF;CAEA,QAAQ,MAAM;CAEd,MAAMC,mCAAiB;EACrB,YAAY;EACZ,OAAO;EACP,SAAS,OAAO,QAAQ,QAAQ,MAC9BC,gDAAiB,CAAC,CACpB;EACA,iBAAiB,OAAO;CAC1B,CAAC;CAED,QAAQ,QAAQ,6BAA6B;AAC/C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type-checker.js","names":["colors","relative","join","existsSync","loadTypeScript"],"sources":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"type-checker.js","names":["colors","relative","join","existsSync","loadTypeScript"],"sources":["../../src/cli/type-checker.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { loadTypeScript } from './common';\nimport { join, relative } from 'node:path';\nimport colors from '../utils/colors';\n\nconst TS_NOT_FOUND_ERR = `TypeScript must be installed in order to use the type checker. Please install it using \\`npm install typescript\\` or \\`yarn add typescript\\``;\n\n/**\n * Formats a TypeScript diagnostic message in a pretty, readable format\n * @private\n * @internal\n */\nfunction formatDiagnostic(\n ts: typeof import('typescript'),\n diagnostic: import('typescript').Diagnostic,\n cwd: string,\n): string {\n const messageText = ts.flattenDiagnosticMessageText(\n diagnostic.messageText,\n '\\n',\n );\n\n if (!diagnostic.file) {\n return `${colors.red('error')}: ${messageText}`;\n }\n\n const { line, character } = ts.getLineAndCharacterOfPosition(\n diagnostic.file,\n diagnostic.start!,\n );\n const fileName = relative(cwd, diagnostic.file.fileName);\n const position = `${line + 1}:${character + 1}`;\n const errorCode = diagnostic.code ? `TS${diagnostic.code}` : '';\n\n // Format the error message nicely\n return [\n `${colors.bold(colors.cyan(fileName))}:${colors.bold(colors.yellow(position))} - ${colors.red('error')} ${colors.gray(errorCode)}`,\n `${messageText}`,\n ].join('\\n');\n}\n\n/**\n * Performs a type check on the project using TypeScript.\n * @param path The project root or cwd\n * @private\n * @internal\n */\nexport async function performTypeCheck(path: string) {\n const tsconfigPath = join(path, 'tsconfig.json');\n\n if (!existsSync(tsconfigPath)) return;\n\n const ts = await loadTypeScript(TS_NOT_FOUND_ERR);\n\n // Format host for error reporting\n const formatHost = {\n getCanonicalFileName: (path: string) => path,\n getCurrentDirectory: ts.sys.getCurrentDirectory,\n getNewLine: () => ts.sys.newLine,\n };\n\n // Read tsconfig.json\n const configFile = ts.readConfigFile(tsconfigPath, ts.sys.readFile);\n\n if (configFile.error) {\n console.error(\n colors.red(\n `Error reading tsconfig.json: ${ts.formatDiagnostic(configFile.error, formatHost)}`,\n ),\n );\n process.exit(1);\n }\n\n // Parse the config file\n const parsedConfig = ts.parseJsonConfigFileContent(\n configFile.config,\n ts.sys,\n path,\n );\n\n // Force noEmit to true as we only want type checking\n parsedConfig.options.noEmit = true;\n\n // Create a program\n const program = ts.createProgram({\n rootNames: parsedConfig.fileNames,\n options: parsedConfig.options,\n projectReferences: parsedConfig.projectReferences,\n });\n\n // Get the diagnostics\n const diagnostics = [\n ...program.getOptionsDiagnostics(),\n ...program.getGlobalDiagnostics(),\n ...program.getSyntacticDiagnostics(),\n ...program.getSemanticDiagnostics(),\n ];\n\n // Report any errors\n if (diagnostics.length > 0) {\n console.log('');\n console.error(\n colors.bold(\n colors.red('Type checking failed with the following errors:'),\n ),\n );\n console.log('');\n\n // Group diagnostics by file for better readability\n const byFile = new Map<string, import('typescript').Diagnostic[]>();\n\n for (const diagnostic of diagnostics) {\n const fileName = diagnostic.file ? diagnostic.file.fileName : 'Global';\n if (!byFile.has(fileName)) {\n byFile.set(fileName, []);\n }\n byFile.get(fileName)!.push(diagnostic);\n }\n\n // Pretty-print each diagnostic\n const totalErrors = diagnostics.length;\n let counter = 0;\n\n for (const [_, fileDiags] of byFile) {\n for (const diagnostic of fileDiags) {\n counter++;\n console.log(formatDiagnostic(ts, diagnostic, path));\n // Add separator between errors for better readability, except for the last one\n if (counter < totalErrors) {\n console.log('');\n }\n }\n }\n\n console.log('');\n console.error(\n colors.bold(\n colors.red(`Found ${totalErrors} error${totalErrors > 1 ? 's' : ''}`),\n ),\n );\n console.log('');\n\n process.exit(1);\n }\n\n console.log(colors.green('✓ Type checking completed successfully.'));\n}\n"],"mappings":";;;;;;;AAKA,MAAM,mBAAmB;;;;;;AAOzB,SAAS,iBACP,IACA,YACA,KACQ;CACR,MAAM,cAAc,GAAG,6BACrB,WAAW,aACX,IACF;CAEA,IAAI,CAAC,WAAW,MACd,OAAO,GAAGA,6BAAO,IAAI,OAAO,EAAE,IAAI;CAGpC,MAAM,EAAE,MAAM,cAAc,GAAG,8BAC7B,WAAW,MACX,WAAW,KACb;CACA,MAAM,eAAWC,oBAAS,KAAK,WAAW,KAAK,QAAQ;CACvD,MAAM,WAAW,GAAG,OAAO,EAAE,GAAG,YAAY;CAC5C,MAAM,YAAY,WAAW,OAAO,KAAK,WAAW,SAAS;CAG7D,OAAO,CACL,GAAGD,6BAAO,KAAKA,6BAAO,KAAK,QAAQ,CAAC,EAAE,GAAGA,6BAAO,KAAKA,6BAAO,OAAO,QAAQ,CAAC,EAAE,KAAKA,6BAAO,IAAI,OAAO,EAAE,GAAGA,6BAAO,KAAK,SAAS,KAC/H,GAAG,aACL,CAAC,CAAC,KAAK,IAAI;AACb;;;;;;;AAQA,eAAsB,iBAAiB,MAAc;CACnD,MAAM,mBAAeE,gBAAK,MAAM,eAAe;CAE/C,IAAI,KAACC,oBAAW,YAAY,GAAG;CAE/B,MAAM,KAAK,MAAMC,kCAAe,gBAAgB;CAGhD,MAAM,aAAa;EACjB,uBAAuB,SAAiB;EACxC,qBAAqB,GAAG,IAAI;EAC5B,kBAAkB,GAAG,IAAI;CAC3B;CAGA,MAAM,aAAa,GAAG,eAAe,cAAc,GAAG,IAAI,QAAQ;CAElE,IAAI,WAAW,OAAO;EACpB,QAAQ,MACNJ,6BAAO,IACL,gCAAgC,GAAG,iBAAiB,WAAW,OAAO,UAAU,GAClF,CACF;EACA,QAAQ,KAAK,CAAC;CAChB;CAGA,MAAM,eAAe,GAAG,2BACtB,WAAW,QACX,GAAG,KACH,IACF;CAGA,aAAa,QAAQ,SAAS;CAG9B,MAAM,UAAU,GAAG,cAAc;EAC/B,WAAW,aAAa;EACxB,SAAS,aAAa;EACtB,mBAAmB,aAAa;CAClC,CAAC;CAGD,MAAM,cAAc;EAClB,GAAG,QAAQ,sBAAsB;EACjC,GAAG,QAAQ,qBAAqB;EAChC,GAAG,QAAQ,wBAAwB;EACnC,GAAG,QAAQ,uBAAuB;CACpC;CAGA,IAAI,YAAY,SAAS,GAAG;EAC1B,QAAQ,IAAI,EAAE;EACd,QAAQ,MACNA,6BAAO,KACLA,6BAAO,IAAI,iDAAiD,CAC9D,CACF;EACA,QAAQ,IAAI,EAAE;EAGd,MAAM,yBAAS,IAAI,IAA+C;EAElE,KAAK,MAAM,cAAc,aAAa;GACpC,MAAM,WAAW,WAAW,OAAO,WAAW,KAAK,WAAW;GAC9D,IAAI,CAAC,OAAO,IAAI,QAAQ,GACtB,OAAO,IAAI,UAAU,CAAC,CAAC;GAEzB,OAAO,IAAI,QAAQ,CAAC,CAAE,KAAK,UAAU;EACvC;EAGA,MAAM,cAAc,YAAY;EAChC,IAAI,UAAU;EAEd,KAAK,MAAM,CAAC,GAAG,cAAc,QAC3B,KAAK,MAAM,cAAc,WAAW;GAClC;GACA,QAAQ,IAAI,iBAAiB,IAAI,YAAY,IAAI,CAAC;GAElD,IAAI,UAAU,aACZ,QAAQ,IAAI,EAAE;EAElB;EAGF,QAAQ,IAAI,EAAE;EACd,QAAQ,MACNA,6BAAO,KACLA,6BAAO,IAAI,SAAS,YAAY,QAAQ,cAAc,IAAI,MAAM,IAAI,CACtE,CACF;EACA,QAAQ,IAAI,EAAE;EAEd,QAAQ,KAAK,CAAC;CAChB;CAEA,QAAQ,IAAIA,6BAAO,MAAM,yCAAyC,CAAC;AACrE"}
|
package/dist/cli/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","names":[],"sources":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"utils.js","names":[],"sources":["../../src/cli/utils.ts"],"sourcesContent":["import type { Ora } from 'ora';\n\nlet ora: typeof import('ora') | undefined;\n\n/**\n * @private\n * @internal\n */\nexport async function createSpinner(text: string): Promise<Ora> {\n if (!ora) {\n ora = await import('ora');\n }\n\n return (ora.default || ora)({\n text,\n color: 'cyan',\n });\n}\n"],"mappings":";;AAEA,IAAI;;;;;AAMJ,eAAsB,cAAc,MAA4B;CAC9D,IAAI,CAAC,KACH,MAAM,MAAM,OAAO;CAGrB,QAAQ,IAAI,WAAW,IAAG,CAAE;EAC1B;EACA,OAAO;CACT,CAAC;AACH"}
|