commandkit 1.2.1-dev.20260920033200 → 1.2.1-dev.20261013130331

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. package/dist/analytics/analytics-engine.d.ts +1 -1
  2. package/dist/analytics/analytics-engine.js +1 -1
  3. package/dist/analytics/analytics-provider.d.ts +1 -1
  4. package/dist/analytics/analytics-provider.js +1 -1
  5. package/dist/analytics/constants.js.map +1 -1
  6. package/dist/analytics/utils.js +1 -1
  7. package/dist/{analytics-engine-Bz1p7ud3.d.ts → analytics-engine-uY6FDAEv.d.ts} +8 -2
  8. package/dist/app/commands/AppCommandRunner.d.ts +1 -1
  9. package/dist/app/commands/AppCommandRunner.js +1 -1
  10. package/dist/app/commands/Context.d.ts +1 -1
  11. package/dist/app/commands/Context.js +1 -1
  12. package/dist/app/commands/MessageCommandParser.js +1 -1
  13. package/dist/app/commands/MessageCommandParser.js.map +1 -1
  14. package/dist/app/commands/helpers.js.map +1 -1
  15. package/dist/app/events/EventWorkerContext.d.ts +1 -1
  16. package/dist/app/events/EventWorkerContext.js.map +1 -1
  17. package/dist/app/handlers/AppCommandHandler.d.ts +1 -1
  18. package/dist/app/handlers/AppCommandHandler.js +1 -1
  19. package/dist/app/handlers/AppEventsHandler.d.ts +1 -1
  20. package/dist/app/handlers/AppEventsHandler.js +1 -1
  21. package/dist/app/index.d.ts +1 -1
  22. package/dist/app/index.js +4 -4
  23. package/dist/app/interrupt/signals.js +2 -2
  24. package/dist/app/interrupt/signals.js.map +1 -1
  25. package/dist/app/middlewares/permissions.d.ts +1 -1
  26. package/dist/app/middlewares/permissions.js +1 -1
  27. package/dist/app/register/CommandRegistrar.d.ts +1 -1
  28. package/dist/app/register/CommandRegistrar.js +1 -1
  29. package/dist/app/router/CommandTree.js +1 -1
  30. package/dist/app/router/CommandsRouter.js +3 -1
  31. package/dist/app/router/CommandsRouter.js.map +1 -1
  32. package/dist/app/router/EventsRouter.js +3 -1
  33. package/dist/app/router/EventsRouter.js.map +1 -1
  34. package/dist/app/router/TreeArtifact.js.map +1 -1
  35. package/dist/app/router/index.js +3 -3
  36. package/dist/cli/app-process.d.ts +1 -1
  37. package/dist/cli/app-process.js +2 -2
  38. package/dist/cli/app-process.js.map +1 -1
  39. package/dist/cli/build.d.ts +1 -1
  40. package/dist/cli/build.js +25 -22
  41. package/dist/cli/build.js.map +1 -1
  42. package/dist/cli/common.d.ts +1 -1
  43. package/dist/cli/common.js +4 -4
  44. package/dist/cli/common.js.map +1 -1
  45. package/dist/cli/development.js +7 -8
  46. package/dist/cli/development.js.map +1 -1
  47. package/dist/cli/env.js +0 -1
  48. package/dist/cli/env.js.map +1 -1
  49. package/dist/cli/generators.js +3 -3
  50. package/dist/cli/generators.js.map +1 -1
  51. package/dist/cli/information.js +3 -3
  52. package/dist/cli/information.js.map +1 -1
  53. package/dist/cli/init.js +12 -10
  54. package/dist/cli/init.js.map +1 -1
  55. package/dist/cli/production.js +7 -7
  56. package/dist/cli/production.js.map +1 -1
  57. package/dist/cli/type-checker.js +2 -2
  58. package/dist/cli/type-checker.js.map +1 -1
  59. package/dist/cli/utils.js +0 -1
  60. package/dist/cli/utils.js.map +1 -1
  61. package/dist/{commandkit-gJ4YjTy4.js → commandkit-CzNV2oE8.js} +244 -196
  62. package/dist/commandkit-CzNV2oE8.js.map +1 -0
  63. package/dist/commandkit.d.ts +1 -1
  64. package/dist/commandkit.js +1 -1
  65. package/dist/components/common/EventInterceptor.js +0 -1
  66. package/dist/components/common/EventInterceptor.js.map +1 -1
  67. package/dist/components/common/element.js +1 -1
  68. package/dist/components/common/types.js +1 -1
  69. package/dist/components/display/common.js +1 -1
  70. package/dist/components/display/container.js +1 -1
  71. package/dist/components/display/file.js.map +1 -1
  72. package/dist/components/display/index.js +5 -5
  73. package/dist/components/display/label.js +1 -1
  74. package/dist/components/display/media-gallery.js +1 -1
  75. package/dist/components/display/poll.js.map +1 -1
  76. package/dist/components/display/section.js +1 -1
  77. package/dist/components/display/separator.js.map +1 -1
  78. package/dist/components/display/text-display.js +4 -2
  79. package/dist/components/display/text-display.js.map +1 -1
  80. package/dist/components/index.js +6 -6
  81. package/dist/components/interactive/action-row/ActionRow.js.map +1 -1
  82. package/dist/components/interactive/button/Button.js +1 -1
  83. package/dist/components/interactive/button/ButtonKit.js +1 -1
  84. package/dist/components/interactive/checkbox/checkbox.js +1 -1
  85. package/dist/components/interactive/modal/Modal.js +1 -1
  86. package/dist/components/interactive/modal/ModalKit.js +1 -1
  87. package/dist/components/interactive/radio/radio.js +1 -1
  88. package/dist/components/interactive/select-menu/ChannelSelectMenuKit.js +1 -1
  89. package/dist/components/interactive/select-menu/MentionableSelectMenuKit.js +1 -1
  90. package/dist/components/interactive/select-menu/RoleSelectMenuKit.js +1 -1
  91. package/dist/components/interactive/select-menu/SelectMenu.js +1 -1
  92. package/dist/components/interactive/select-menu/StringSelectMenuKit.js +1 -1
  93. package/dist/components/interactive/select-menu/UserSelectMenuKit.js +1 -1
  94. package/dist/components/interactive/select-menu/common.js +1 -1
  95. package/dist/config/config.d.ts +1 -1
  96. package/dist/config/config.js +1 -1
  97. package/dist/config/default.d.ts +1 -1
  98. package/dist/config/default.js +1 -1
  99. package/dist/config/loader.d.ts +1 -1
  100. package/dist/config/loader.js +1 -1
  101. package/dist/config/types.d.ts +1 -1
  102. package/dist/config/types.js +1 -1
  103. package/dist/config/utils.d.ts +1 -1
  104. package/dist/config/utils.js +4 -4
  105. package/dist/config/utils.js.map +1 -1
  106. package/dist/context/async-context.d.ts +1 -1
  107. package/dist/context/async-context.js +1 -1
  108. package/dist/context/environment.d.ts +1 -1
  109. package/dist/context/environment.js +1 -1
  110. package/dist/events/CommandKitEventsChannel.d.ts +1 -1
  111. package/dist/events/CommandKitEventsChannel.js +1 -1
  112. package/dist/events/CommandKitEventsChannel.js.map +1 -1
  113. package/dist/flags/FlagProvider.d.ts +1 -1
  114. package/dist/flags/FlagProvider.js +0 -1
  115. package/dist/flags/FlagProvider.js.map +1 -1
  116. package/dist/flags/feature-flags.d.ts +1 -1
  117. package/dist/flags/feature-flags.js +1 -1
  118. package/dist/flags/store.d.ts +1 -1
  119. package/dist/flags/store.js.map +1 -1
  120. package/dist/index.d.ts +1 -1
  121. package/dist/index.js +22 -22
  122. package/dist/kv/constants.js +0 -1
  123. package/dist/kv/constants.js.map +1 -1
  124. package/dist/kv/dotprops.js +0 -1
  125. package/dist/kv/dotprops.js.map +1 -1
  126. package/dist/kv/kv.js +6 -4
  127. package/dist/kv/kv.js.map +1 -1
  128. package/dist/kv/serde.js +1 -1
  129. package/dist/kv/serde.js.map +1 -1
  130. package/dist/logger/DefaultLogger.js +1 -1
  131. package/dist/logger/ILogger.js +1 -1
  132. package/dist/logger/Logger.js +1 -1
  133. package/dist/logger/NoopLogger.js +0 -1
  134. package/dist/logger/NoopLogger.js.map +1 -1
  135. package/dist/plugins/CompilerPlugin.d.ts +1 -1
  136. package/dist/plugins/CompilerPlugin.js +1 -1
  137. package/dist/plugins/CompilerPlugin.js.map +1 -1
  138. package/dist/plugins/PluginCommon.d.ts +1 -1
  139. package/dist/plugins/PluginCommon.js.map +1 -1
  140. package/dist/plugins/RuntimePlugin.d.ts +1 -1
  141. package/dist/plugins/RuntimePlugin.js +1 -1
  142. package/dist/plugins/RuntimePlugin.js.map +1 -1
  143. package/dist/plugins/index.d.ts +1 -1
  144. package/dist/plugins/index.js +3 -3
  145. package/dist/plugins/plugin-runtime/CommandKitPluginRuntime.d.ts +1 -1
  146. package/dist/plugins/plugin-runtime/CommandKitPluginRuntime.js +1 -1
  147. package/dist/plugins/plugin-runtime/CompilerPluginRuntime.d.ts +1 -1
  148. package/dist/plugins/plugin-runtime/CompilerPluginRuntime.js +1 -1
  149. package/dist/plugins/plugin-runtime/builtin/CommonDirectiveTransformer.d.ts +1 -1
  150. package/dist/plugins/plugin-runtime/builtin/CommonDirectiveTransformer.js +1 -1
  151. package/dist/plugins/plugin-runtime/builtin/MacroPlugin.d.ts +1 -1
  152. package/dist/plugins/plugin-runtime/builtin/MacroPlugin.js +1 -1
  153. package/dist/plugins/plugin-runtime/runtime.d.ts +1 -1
  154. package/dist/plugins/plugin-runtime/runtime.js +1 -1
  155. package/dist/plugins/types.d.ts +1 -1
  156. package/dist/plugins/types.js +1 -1
  157. package/dist/{rolldown-runtime-C_NdSu1c.js → rolldown-runtime-AN5ru5iW.js} +2 -3
  158. package/dist/types.d.ts +1 -1
  159. package/dist/types.js +1 -1
  160. package/dist/utils/colors.js.map +1 -1
  161. package/dist/utils/constants.js +0 -1
  162. package/dist/utils/constants.js.map +1 -1
  163. package/dist/utils/dev-hooks.d.ts +1 -1
  164. package/dist/utils/dev-hooks.js +1 -1
  165. package/dist/utils/error-codes.js +0 -1
  166. package/dist/utils/error-codes.js.map +1 -1
  167. package/dist/utils/resolve-file-url.js +1 -1
  168. package/dist/utils/resolve-file-url.js.map +1 -1
  169. package/dist/utils/types-package.js +3 -2
  170. package/dist/utils/types-package.js.map +1 -1
  171. package/dist/utils/useful-stuff/async-queue.js +0 -1
  172. package/dist/utils/useful-stuff/async-queue.js.map +1 -1
  173. package/dist/utils/useful-stuff/mutex.js +0 -1
  174. package/dist/utils/useful-stuff/mutex.js.map +1 -1
  175. package/dist/utils/useful-stuff/ratelimiter.js +0 -1
  176. package/dist/utils/useful-stuff/ratelimiter.js.map +1 -1
  177. package/dist/utils/useful-stuff/semaphore.js +0 -1
  178. package/dist/utils/useful-stuff/semaphore.js.map +1 -1
  179. package/dist/utils/utilities.js +1 -1
  180. package/dist/utils/warning.js +0 -1
  181. package/dist/utils/warning.js.map +1 -1
  182. package/dist/version.js +1 -2
  183. package/dist/version.js.map +1 -1
  184. package/package.json +18 -16
  185. package/dist/commandkit-gJ4YjTy4.js.map +0 -1
@@ -1,2 +1,2 @@
1
- import { n as FilterFunction, t as AnalyticsEngine } from "../analytics-engine-Bz1p7ud3.js";
1
+ import { n as FilterFunction, t as AnalyticsEngine } from "../analytics-engine-uY6FDAEv.js";
2
2
  export { AnalyticsEngine, FilterFunction };
@@ -1,4 +1,4 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_commandkit = require('../commandkit-gJ4YjTy4.js');
2
+ const require_commandkit = require("../commandkit-CzNV2oE8.js");
3
3
 
4
4
  exports.AnalyticsEngine = require_commandkit.AnalyticsEngine;
@@ -1,2 +1,2 @@
1
- import { a as IdentifyEvent, i as AnalyticsProvider, r as AnalyticsEvent } from "../analytics-engine-Bz1p7ud3.js";
1
+ import { a as IdentifyEvent, i as AnalyticsProvider, r as AnalyticsEvent } from "../analytics-engine-uY6FDAEv.js";
2
2
  export { AnalyticsEvent, AnalyticsProvider, IdentifyEvent };
@@ -1 +1 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","names":[],"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"}
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_commandkit = require('../commandkit-gJ4YjTy4.js');
2
+ const require_commandkit = require("../commandkit-CzNV2oE8.js");
3
3
 
4
4
  exports.getDoNotTrack = require_commandkit.getDoNotTrack;
5
5
  exports.noAnalytics = require_commandkit.noAnalytics;
@@ -9,7 +9,7 @@ import { a as ParsedEvent, n as EventsRouterFileChangeType, t as EventsRouter }
9
9
  import "./index-COt7nfC9.js";
10
10
  import { o as HMREventChangeType, s as HMREventType } from "./constants-kWgE3L9F.js";
11
11
  import EventEmitter from "node:events";
12
- import { AutocompleteInteraction, Awaitable, CacheType, ChatInputCommandInteraction, Client, ClientEvents, Collection, Constructable, ContextMenuCommandBuilder, ContextMenuCommandInteraction, Guild, Interaction, Locale, Message, MessageContextMenuCommandInteraction, PermissionsString, RESTPostAPIApplicationCommandsJSONBody, SlashCommandBuilder, TextBasedChannel, UserContextMenuCommandInteraction } from "discord.js";
12
+ import { AutocompleteInteraction, Awaitable, CacheType, ChatInputCommandInteraction, Client, ClientEvents, Collection, Constructable, ContextMenuCommandBuilder, ContextMenuCommandInteraction, Guild, Interaction, Locale, Message, MessageContextMenuCommandInteraction, PermissionsString, RESTPostAPIApplicationCommandsJSONBody, RESTPostAPIChatInputApplicationCommandsJSONBody, SlashCommandBuilder, TextBasedChannel, UserContextMenuCommandInteraction } from "discord.js";
13
13
  import { DirectiveTransformerOptions } from "directive-to-hof";
14
14
  import { InlineConfig } from "tsdown";
15
15
  //#region src/types.d.ts
@@ -73,6 +73,7 @@ type CommandData = Prettify<Omit<RESTPostAPIApplicationCommandsJSONBody, 'descri
73
73
  * The description of the command.
74
74
  */
75
75
  description?: string;
76
+ options?: RESTPostAPIChatInputApplicationCommandsJSONBody['options'];
76
77
  }>;
77
78
  /**
78
79
  * Represents an event handler for a specific event.
@@ -396,6 +397,11 @@ declare class CommandRegistrar {
396
397
  * Removes internal runtime-only fields before Discord registration data is emitted.
397
398
  */
398
399
  private sanitizeCommandData;
400
+ /**
401
+ * Keeps duplicate command names within a registration scope from invalidating
402
+ * the entire bulk overwrite request.
403
+ */
404
+ private deduplicateCommands;
399
405
  /**
400
406
  * Builds a top-level Discord payload for a hierarchical command root.
401
407
  */
@@ -2423,4 +2429,4 @@ declare class AnalyticsEngine {
2423
2429
  }
2424
2430
  //#endregion
2425
2431
  export { RuntimePlugin as $, InteractionCommandMiddlewareContext as $t, MaybePromise as A, isCommandWorkerContext as At, isPlugin as B, CommandRegistrar as Bt, DecideFunction as C, AppCommandRunner as Ct, FeatureFlagDefinition as D, exitContext as Dt, FeatureFlag as E, GenericFunction as Et, JsonFlagProvider as F, CommandKitEnvironment as Ft, CompilerPlugin as G, AutocompleteCommandMiddlewareContext as Gt, CompilerPluginRuntime as H, AnyCommandExecute as Ht, CommandKitPluginRuntime as I, CommandKitEnvironmentInternalData as It, isCompilerPlugin as J, CommandContextOptions as Jt, PluginTransformParameters as K, ChatInputCommand as Kt, PluginCommon as L, CommandKitEnvironmentType as Lt, setFlagProvider as M, provideContext as Mt, FlagConfiguration as N, useEnvironment as Nt, FlagRunner as O, getCommandKit as Ot, FlagProvider as P, useStore as Pt, TemplateHandler as Q, InteractionCommandContext as Qt, PluginOptions as R, after as Rt, CustomEvaluationFunction as S, RunCommand as St, EventFlagContext as T, AsyncFunction as Tt, CommonDirectiveTransformer as U, AutocompleteCommand as Ut, CommonPluginRuntime as V, PreRegisterCommandsEvent as Vt, CommonDirectiveTransformerOptions as W, AutocompleteCommandContext as Wt, CommandKitPlugin as X, Context as Xt, CommandKitEventDispatch as Y, CommandExecutionMode as Yt, MaybeFalsey as Z, ContextParameters as Zt, CommandKitConfig as _, EventHandler as _n, CommandTypeData as _t, IdentifyEvent as a, MessageContextMenuCommandMiddlewareContext as an, AppEventsHandlerLoadedData as at, CommandFlagContext as b, PreparedAppCommandExecution as bt, CommandKitConfiguration as c, SlashCommandMiddlewareContext as cn, CommandKitEventsChannel as ct, onBootstrap as d, UserContextMenuCommandMiddlewareContext as dn, AppCommandHandler as dt, MessageCommand as en, isRuntimePlugin as et, DeepPartial as f, CommandContext as fn, AppCommandNative as ft, CommandKitCompilerOptions as g, CommandMetadataFunction as gn, CommandDataSchemaValue as gt, mergeDeep as h, CommandMetadata as hn, CommandDataSchemaKey as ht, AnalyticsProvider as i, MessageContextMenuCommandContext as in, AppEventsHandler as it, flag as j, makeContextAwareFunction as jt, IdentifyFunction as k, getContext as kt, commandkit as l, UserContextMenuCommand as ln, ListenerFunction as lt, ResolvedCommandKitConfig as m, CommandKitOptions as mn, CommandDataSchema as mt, FilterFunction as n, MessageCommandMiddlewareContext as nn, IpcMessageCommand as nt, BootstrapFunction as o, MiddlewareContext as on, EventListener as ot, DeepRequired as p, CommandData as pn, CommandBuilderLike as pt, TransformedResult as q, ChatInputCommandContext as qt, AnalyticsEvent as r, MessageContextMenuCommand as rn, registerDevHooks as rt, CommandKit as s, MiddlewareContextArgs as sn, LoadedEvent as st, AnalyticsEngine as t, MessageCommandContext as tn, CommandKitHMREvent as tt, onApplicationBootstrap as u, UserContextMenuCommandContext as un, AppCommand as ut, CommandKitJsRuntime as v, CustomAppCommandProps as vt, EvaluationContext as w, RunCommandOptions as wt, CustomEvaluationContext as x, ResolvableCommand as xt, FlagStore as y, LoadedCommand as yt, PluginType as z, cancelAfter as zt };
2426
- //# sourceMappingURL=analytics-engine-Bz1p7ud3.d.ts.map
2432
+ //# sourceMappingURL=analytics-engine-uY6FDAEv.d.ts.map
@@ -1,2 +1,2 @@
1
- import { Ct as AppCommandRunner, wt as RunCommandOptions } from "../../analytics-engine-Bz1p7ud3.js";
1
+ import { Ct as AppCommandRunner, wt as RunCommandOptions } from "../../analytics-engine-uY6FDAEv.js";
2
2
  export { AppCommandRunner, RunCommandOptions };
@@ -1,4 +1,4 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_commandkit = require('../../commandkit-gJ4YjTy4.js');
2
+ const require_commandkit = require("../../commandkit-CzNV2oE8.js");
3
3
 
4
4
  exports.AppCommandRunner = require_commandkit.AppCommandRunner;
@@ -1,2 +1,2 @@
1
- import { $t as InteractionCommandMiddlewareContext, Gt as AutocompleteCommandMiddlewareContext, Ht as AnyCommandExecute, Jt as CommandContextOptions, Kt as ChatInputCommand, Qt as InteractionCommandContext, Ut as AutocompleteCommand, Wt as AutocompleteCommandContext, Xt as Context, Yt as CommandExecutionMode, Zt as ContextParameters, an as MessageContextMenuCommandMiddlewareContext, cn as SlashCommandMiddlewareContext, dn as UserContextMenuCommandMiddlewareContext, en as MessageCommand, in as MessageContextMenuCommandContext, ln as UserContextMenuCommand, nn as MessageCommandMiddlewareContext, on as MiddlewareContext, qt as ChatInputCommandContext, rn as MessageContextMenuCommand, sn as MiddlewareContextArgs, tn as MessageCommandContext, un as UserContextMenuCommandContext } from "../../analytics-engine-Bz1p7ud3.js";
1
+ import { $t as InteractionCommandMiddlewareContext, Gt as AutocompleteCommandMiddlewareContext, Ht as AnyCommandExecute, Jt as CommandContextOptions, Kt as ChatInputCommand, Qt as InteractionCommandContext, Ut as AutocompleteCommand, Wt as AutocompleteCommandContext, Xt as Context, Yt as CommandExecutionMode, Zt as ContextParameters, an as MessageContextMenuCommandMiddlewareContext, cn as SlashCommandMiddlewareContext, dn as UserContextMenuCommandMiddlewareContext, en as MessageCommand, in as MessageContextMenuCommandContext, ln as UserContextMenuCommand, nn as MessageCommandMiddlewareContext, on as MiddlewareContext, qt as ChatInputCommandContext, rn as MessageContextMenuCommand, sn as MiddlewareContextArgs, tn as MessageCommandContext, un as UserContextMenuCommandContext } from "../../analytics-engine-uY6FDAEv.js";
2
2
  export { AnyCommandExecute, AutocompleteCommand, AutocompleteCommandContext, AutocompleteCommandMiddlewareContext, ChatInputCommand, ChatInputCommandContext, CommandContextOptions, CommandExecutionMode, Context, ContextParameters, InteractionCommandContext, InteractionCommandMiddlewareContext, MessageCommand, MessageCommandContext, MessageCommandMiddlewareContext, MessageContextMenuCommand, MessageContextMenuCommandContext, MessageContextMenuCommandMiddlewareContext, MiddlewareContext, MiddlewareContextArgs, SlashCommandMiddlewareContext, UserContextMenuCommand, UserContextMenuCommandContext, UserContextMenuCommandMiddlewareContext };
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_commandkit = require('../../commandkit-gJ4YjTy4.js');
2
+ const require_commandkit = require("../../commandkit-CzNV2oE8.js");
3
3
 
4
4
  exports.CommandExecutionMode = require_commandkit.CommandExecutionMode;
5
5
  exports.Context = require_commandkit.Context;
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_utils_error_codes = require('../../utils/error-codes.js');
2
+ const require_utils_error_codes = require("../../utils/error-codes.js");
3
3
  let discord_js = require("discord.js");
4
4
 
5
5
  //#region src/app/commands/MessageCommandParser.ts
@@ -1 +1 @@
1
- {"version":3,"file":"MessageCommandParser.js","names":[],"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":[],"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,4 +1,4 @@
1
- import { s as CommandKit } from "../../analytics-engine-Bz1p7ud3.js";
1
+ import { s as CommandKit } from "../../analytics-engine-uY6FDAEv.js";
2
2
  import { a as ParsedEvent } from "../../EventsRouter-Bt63ZuEF.js";
3
3
  import "../../index-COt7nfC9.js";
4
4
  import { AsyncLocalStorage } from "node:async_hooks";
@@ -1 +1 @@
1
- {"version":3,"file":"EventWorkerContext.js","names":[],"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,2 +1,2 @@
1
- import { St as RunCommand, _t as CommandTypeData, bt as PreparedAppCommandExecution, dt as AppCommandHandler, ft as AppCommandNative, gt as CommandDataSchemaValue, ht as CommandDataSchemaKey, mt as CommandDataSchema, pt as CommandBuilderLike, ut as AppCommand, vt as CustomAppCommandProps, xt as ResolvableCommand, yt as LoadedCommand } from "../../analytics-engine-Bz1p7ud3.js";
1
+ import { St as RunCommand, _t as CommandTypeData, bt as PreparedAppCommandExecution, dt as AppCommandHandler, ft as AppCommandNative, gt as CommandDataSchemaValue, ht as CommandDataSchemaKey, mt as CommandDataSchema, pt as CommandBuilderLike, ut as AppCommand, vt as CustomAppCommandProps, xt as ResolvableCommand, yt as LoadedCommand } from "../../analytics-engine-uY6FDAEv.js";
2
2
  export { AppCommand, AppCommandHandler, AppCommandNative, CommandBuilderLike, CommandDataSchema, CommandDataSchemaKey, CommandDataSchemaValue, CommandTypeData, CustomAppCommandProps, LoadedCommand, PreparedAppCommandExecution, ResolvableCommand, RunCommand };
@@ -1,4 +1,4 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_commandkit = require('../../commandkit-gJ4YjTy4.js');
2
+ const require_commandkit = require("../../commandkit-CzNV2oE8.js");
3
3
 
4
4
  exports.AppCommandHandler = require_commandkit.AppCommandHandler;
@@ -1,2 +1,2 @@
1
- import { at as AppEventsHandlerLoadedData, it as AppEventsHandler, ot as EventListener, st as LoadedEvent } from "../../analytics-engine-Bz1p7ud3.js";
1
+ import { at as AppEventsHandlerLoadedData, it as AppEventsHandler, ot as EventListener, st as LoadedEvent } from "../../analytics-engine-uY6FDAEv.js";
2
2
  export { AppEventsHandler, AppEventsHandlerLoadedData, EventListener, LoadedEvent };
@@ -1,4 +1,4 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_commandkit = require('../../commandkit-gJ4YjTy4.js');
2
+ const require_commandkit = require("../../commandkit-CzNV2oE8.js");
3
3
 
4
4
  exports.AppEventsHandler = require_commandkit.AppEventsHandler;
@@ -1,4 +1,4 @@
1
- import { $t as InteractionCommandMiddlewareContext, Bt as CommandRegistrar, Gt as AutocompleteCommandMiddlewareContext, Ht as AnyCommandExecute, Jt as CommandContextOptions, Kt as ChatInputCommand, Qt as InteractionCommandContext, St as RunCommand, Ut as AutocompleteCommand, Vt as PreRegisterCommandsEvent, Wt as AutocompleteCommandContext, Xt as Context, Yt as CommandExecutionMode, Zt as ContextParameters, _t as CommandTypeData, an as MessageContextMenuCommandMiddlewareContext, bt as PreparedAppCommandExecution, cn as SlashCommandMiddlewareContext, dn as UserContextMenuCommandMiddlewareContext, dt as AppCommandHandler, en as MessageCommand, ft as AppCommandNative, gt as CommandDataSchemaValue, ht as CommandDataSchemaKey, in as MessageContextMenuCommandContext, ln as UserContextMenuCommand, mt as CommandDataSchema, nn as MessageCommandMiddlewareContext, on as MiddlewareContext, pt as CommandBuilderLike, qt as ChatInputCommandContext, rn as MessageContextMenuCommand, sn as MiddlewareContextArgs, tn as MessageCommandContext, un as UserContextMenuCommandContext, ut as AppCommand, vt as CustomAppCommandProps, xt as ResolvableCommand, yt as LoadedCommand } from "../analytics-engine-Bz1p7ud3.js";
1
+ import { $t as InteractionCommandMiddlewareContext, Bt as CommandRegistrar, Gt as AutocompleteCommandMiddlewareContext, Ht as AnyCommandExecute, Jt as CommandContextOptions, Kt as ChatInputCommand, Qt as InteractionCommandContext, St as RunCommand, Ut as AutocompleteCommand, Vt as PreRegisterCommandsEvent, Wt as AutocompleteCommandContext, Xt as Context, Yt as CommandExecutionMode, Zt as ContextParameters, _t as CommandTypeData, an as MessageContextMenuCommandMiddlewareContext, bt as PreparedAppCommandExecution, cn as SlashCommandMiddlewareContext, dn as UserContextMenuCommandMiddlewareContext, dt as AppCommandHandler, en as MessageCommand, ft as AppCommandNative, gt as CommandDataSchemaValue, ht as CommandDataSchemaKey, in as MessageContextMenuCommandContext, ln as UserContextMenuCommand, mt as CommandDataSchema, nn as MessageCommandMiddlewareContext, on as MiddlewareContext, pt as CommandBuilderLike, qt as ChatInputCommandContext, rn as MessageContextMenuCommand, sn as MiddlewareContextArgs, tn as MessageCommandContext, un as UserContextMenuCommandContext, ut as AppCommand, vt as CustomAppCommandProps, xt as ResolvableCommand, yt as LoadedCommand } from "../analytics-engine-uY6FDAEv.js";
2
2
  import { i as ParsedMessageCommand, n as MessageCommandOptionsSchema, r as MessageCommandParser, t as MessageCommandOptions } from "../MessageCommandParser-BYbxHOSK.js";
3
3
  import { i as stopMiddlewares, n as rethrow, r as stopEvents, t as redirect } from "../signals-DRMDrCOn.js";
4
4
  import { n as isInteractionSource, r as isMessageSource, t as CommandSource } from "../helpers-vlnRvNJv.js";
package/dist/app/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_commandkit = require('../commandkit-gJ4YjTy4.js');
3
- const require_app_interrupt_signals = require('./interrupt/signals.js');
4
- const require_app_commands_helpers = require('./commands/helpers.js');
5
- const require_app_commands_MessageCommandParser = require('./commands/MessageCommandParser.js');
2
+ const require_commandkit = require("../commandkit-CzNV2oE8.js");
3
+ const require_app_interrupt_signals = require("./interrupt/signals.js");
4
+ const require_app_commands_helpers = require("./commands/helpers.js");
5
+ const require_app_commands_MessageCommandParser = require("./commands/MessageCommandParser.js");
6
6
 
7
7
  exports.AppCommandHandler = require_commandkit.AppCommandHandler;
8
8
  exports.CommandExecutionMode = require_commandkit.CommandExecutionMode;
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_utils_error_codes = require('../../utils/error-codes.js');
3
- const require_app_events_EventWorkerContext = require('../events/EventWorkerContext.js');
2
+ const require_utils_error_codes = require("../../utils/error-codes.js");
3
+ const require_app_events_EventWorkerContext = require("../events/EventWorkerContext.js");
4
4
 
5
5
  //#region src/app/interrupt/signals.ts
6
6
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"signals.js","names":[],"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,4 +1,4 @@
1
- import { on as MiddlewareContext } from "../../analytics-engine-Bz1p7ud3.js";
1
+ import { on as MiddlewareContext } from "../../analytics-engine-uY6FDAEv.js";
2
2
  //#region src/app/middlewares/permissions.d.ts
3
3
  declare const middlewareId: `${string}-${string}-${string}-${string}-${string}`;
4
4
  /**
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_commandkit = require('../../commandkit-gJ4YjTy4.js');
2
+ const require_commandkit = require("../../commandkit-CzNV2oE8.js");
3
3
 
4
4
  exports.beforeExecute = require_commandkit.beforeExecute;
5
5
  exports.middlewareId = require_commandkit.middlewareId;
@@ -1,2 +1,2 @@
1
- import { Bt as CommandRegistrar, Vt as PreRegisterCommandsEvent } from "../../analytics-engine-Bz1p7ud3.js";
1
+ import { Bt as CommandRegistrar, Vt as PreRegisterCommandsEvent } from "../../analytics-engine-uY6FDAEv.js";
2
2
  export { CommandRegistrar, PreRegisterCommandsEvent };
@@ -1,4 +1,4 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_commandkit = require('../../commandkit-gJ4YjTy4.js');
2
+ const require_commandkit = require("../../commandkit-CzNV2oE8.js");
3
3
 
4
4
  exports.CommandRegistrar = require_commandkit.CommandRegistrar;
@@ -1 +1 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
@@ -621,7 +621,9 @@ var CommandsRouter = class {
621
621
  * @internal
622
622
  */
623
623
  isWithinPath(basePath, targetPath) {
624
- const rel = (0, node_path.relative)((0, node_path.normalize)(basePath), (0, node_path.normalize)(targetPath));
624
+ const base = (0, node_path.normalize)(basePath);
625
+ const target = (0, node_path.normalize)(targetPath);
626
+ const rel = (0, node_path.relative)(base, target);
625
627
  if (!rel) return true;
626
628
  return !rel.startsWith("..") && !(0, node_path.isAbsolute)(rel);
627
629
  }
@@ -1 +1 @@
1
- {"version":3,"file":"CommandsRouter.js","names":[],"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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"}
@@ -162,7 +162,9 @@ var EventsRouter = class {
162
162
  * @internal
163
163
  */
164
164
  isWithinPath(basePath, targetPath) {
165
- const rel = (0, node_path.relative)((0, node_path.normalize)(basePath), (0, node_path.normalize)(targetPath));
165
+ const base = (0, node_path.normalize)(basePath);
166
+ const target = (0, node_path.normalize)(targetPath);
167
+ const rel = (0, node_path.relative)(base, target);
166
168
  if (!rel) return true;
167
169
  return !rel.startsWith("..") && !(0, node_path.isAbsolute)(rel);
168
170
  }
@@ -1 +1 @@
1
- {"version":3,"file":"EventsRouter.js","names":[],"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":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TreeArtifact.js","names":[],"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,7 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_app_router_CommandsRouter = require('./CommandsRouter.js');
3
- const require_app_router_EventsRouter = require('./EventsRouter.js');
4
- const require_app_router_TreeArtifact = require('./TreeArtifact.js');
2
+ const require_app_router_CommandsRouter = require("./CommandsRouter.js");
3
+ const require_app_router_EventsRouter = require("./EventsRouter.js");
4
+ const require_app_router_TreeArtifact = require("./TreeArtifact.js");
5
5
 
6
6
  exports.CommandsRouter = require_app_router_CommandsRouter.CommandsRouter;
7
7
  exports.EventsRouter = require_app_router_EventsRouter.EventsRouter;
@@ -1,4 +1,4 @@
1
- import { m as ResolvedCommandKitConfig } from "../analytics-engine-Bz1p7ud3.js";
1
+ import { m as ResolvedCommandKitConfig } from "../analytics-engine-uY6FDAEv.js";
2
2
  //#region src/cli/app-process.d.ts
3
3
  /**
4
4
  * @private
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_cli_common = require('./common.js');
3
- const require_cli_env = require('./env.js');
2
+ const require_cli_common = require("./common.js");
3
+ const require_cli_env = require("./env.js");
4
4
  let node_fs = require("node:fs");
5
5
  let node_path = require("node:path");
6
6
  let node_child_process = require("node:child_process");
@@ -1 +1 @@
1
- {"version":3,"file":"app-process.js","names":[],"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"}
@@ -1,4 +1,4 @@
1
- import { G as CompilerPlugin } from "../analytics-engine-Bz1p7ud3.js";
1
+ import { G as CompilerPlugin } from "../analytics-engine-uY6FDAEv.js";
2
2
  import { t as MaybeArray } from "../types-ur7SvktF.js";
3
3
  import "../index-DvqHpiuh.js";
4
4
  //#region src/cli/build.d.ts