commandkit 0.1.11-dev.20250314022547 → 0.1.11-dev.20250327153237

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/index.js CHANGED
@@ -1493,12 +1493,12 @@ var init_CompilerPluginRuntime = __esm({
1493
1493
  return !this.plugins.length;
1494
1494
  }
1495
1495
  async onLoad(args) {
1496
- var _a;
1496
+ var _a, _b;
1497
1497
  const source = await (0, import_promises.readFile)(args.path, "utf8");
1498
- let contents = source, loader = args.path.split(".").pop();
1498
+ let contents = source, loader = (_a = args.path) == null ? void 0 : _a.split(".").pop();
1499
1499
  for (const plugin of this.plugins) {
1500
1500
  try {
1501
- const res = await ((_a = plugin.transform) == null ? void 0 : _a.call(plugin, {
1501
+ const res = await ((_b = plugin.transform) == null ? void 0 : _b.call(plugin, {
1502
1502
  contents,
1503
1503
  path: args.path,
1504
1504
  loader,
@@ -1695,6 +1695,7 @@ var init_UseCacheTransformer = __esm({
1695
1695
  ).join("");
1696
1696
  }, "generateRandomString");
1697
1697
  cacheDirectivePlugin = /* @__PURE__ */ __name(async (source, args) => {
1698
+ var _a;
1698
1699
  const ast = parser.parse(source, {
1699
1700
  sourceType: "module",
1700
1701
  plugins: ["typescript", "jsx"]
@@ -1707,22 +1708,22 @@ var init_UseCacheTransformer = __esm({
1707
1708
  };
1708
1709
  traverse(ast, {
1709
1710
  Program: {
1710
- enter(path3) {
1711
- const binding = path3.scope.getBinding(CACHE_IDENTIFIER);
1711
+ enter(path2) {
1712
+ const binding = path2.scope.getBinding(CACHE_IDENTIFIER);
1712
1713
  if (binding) {
1713
1714
  state.cacheIdentifierName = `${CACHE_IDENTIFIER}_${generateRandomString()}`;
1714
1715
  }
1715
1716
  }
1716
1717
  },
1717
- ImportDeclaration(path3) {
1718
- if (path3.node.source.value === IMPORT_PATH && path3.node.specifiers.some(
1718
+ ImportDeclaration(path2) {
1719
+ if (path2.node.source.value === IMPORT_PATH && path2.node.specifiers.some(
1719
1720
  (spec) => t.isImportSpecifier(spec) && // @ts-ignore
1720
1721
  spec.imported.name === CACHE_IDENTIFIER
1721
1722
  )) {
1722
1723
  state.hasExistingImport = true;
1723
1724
  if (state.cacheIdentifierName !== CACHE_IDENTIFIER) {
1724
1725
  state.modifications.push(() => {
1725
- path3.node.specifiers.forEach((spec) => {
1726
+ path2.node.specifiers.forEach((spec) => {
1726
1727
  if (t.isImportSpecifier(spec) && // @ts-ignore
1727
1728
  spec.imported.name === CACHE_IDENTIFIER) {
1728
1729
  spec.local.name = state.cacheIdentifierName;
@@ -1732,14 +1733,14 @@ var init_UseCacheTransformer = __esm({
1732
1733
  }
1733
1734
  }
1734
1735
  },
1735
- "FunctionDeclaration|FunctionExpression|ArrowFunctionExpression|ObjectMethod"(path3) {
1736
- var _a, _b, _c;
1737
- const body = t.isBlockStatement(path3.node.body) ? path3.node.body : null;
1738
- const hasUseCache = (_a = body == null ? void 0 : body.directives) == null ? void 0 : _a.some(
1736
+ "FunctionDeclaration|FunctionExpression|ArrowFunctionExpression|ObjectMethod"(path2) {
1737
+ var _a2, _b, _c;
1738
+ const body = t.isBlockStatement(path2.node.body) ? path2.node.body : null;
1739
+ const hasUseCache = (_a2 = body == null ? void 0 : body.directives) == null ? void 0 : _a2.some(
1739
1740
  (d) => d.value.value === DIRECTIVE
1740
1741
  );
1741
- if (!hasUseCache && !t.isBlockStatement(path3.node.body)) {
1742
- const parentFunction = path3.findParent(
1742
+ if (!hasUseCache && !t.isBlockStatement(path2.node.body)) {
1743
+ const parentFunction = path2.findParent(
1743
1744
  (p) => (p.isFunction() || p.isProgram()) && "directives" in p.node
1744
1745
  );
1745
1746
  if (!((_b = parentFunction == null ? void 0 : parentFunction.node.directives) == null ? void 0 : _b.some(
@@ -1748,35 +1749,35 @@ var init_UseCacheTransformer = __esm({
1748
1749
  return;
1749
1750
  }
1750
1751
  }
1751
- if (hasUseCache || !t.isBlockStatement(path3.node.body)) {
1752
- if (!path3.node.async) {
1752
+ if (hasUseCache || !t.isBlockStatement(path2.node.body)) {
1753
+ if (!path2.node.async) {
1753
1754
  throw new Error(
1754
1755
  `"${DIRECTIVE}" directive may only be used in async functions at ${args.path}
1755
1756
 
1756
- ${path3.toString()}
1757
+ ${path2.toString()}
1757
1758
  ^^^^${"-".repeat(6)} This function must be async`
1758
1759
  );
1759
1760
  }
1760
1761
  state.needsImport = true;
1761
- const isDeclaration = t.isFunctionDeclaration(path3.node);
1762
- const name = isDeclaration ? (_c = path3.node.id) == null ? void 0 : _c.name : void 0;
1763
- const newBody = t.isBlockStatement(path3.node.body) ? t.blockStatement(
1764
- path3.node.body.body,
1765
- path3.node.body.directives.filter(
1762
+ const isDeclaration = t.isFunctionDeclaration(path2.node);
1763
+ const name = isDeclaration ? (_c = path2.node.id) == null ? void 0 : _c.name : void 0;
1764
+ const newBody = t.isBlockStatement(path2.node.body) ? t.blockStatement(
1765
+ path2.node.body.body,
1766
+ path2.node.body.directives.filter(
1766
1767
  (d) => d.value.value !== DIRECTIVE
1767
1768
  )
1768
- ) : path3.node.body;
1769
+ ) : path2.node.body;
1769
1770
  const wrapped = t.callExpression(
1770
1771
  t.identifier(state.cacheIdentifierName),
1771
- [t.arrowFunctionExpression(path3.node.params, newBody, true)]
1772
+ [t.arrowFunctionExpression(path2.node.params, newBody, true)]
1772
1773
  );
1773
1774
  state.modifications.push(() => {
1774
- if (t.isObjectMethod(path3.node)) {
1775
- path3.replaceWith(
1776
- t.objectProperty(t.identifier(path3.node.key.name), wrapped)
1775
+ if (t.isObjectMethod(path2.node)) {
1776
+ path2.replaceWith(
1777
+ t.objectProperty(t.identifier(path2.node.key.name), wrapped)
1777
1778
  );
1778
1779
  } else if (name) {
1779
- path3.replaceWith(
1780
+ path2.replaceWith(
1780
1781
  t.variableDeclaration(
1781
1782
  "const",
1782
1783
  [
@@ -1784,10 +1785,10 @@ ${path3.toString()}
1784
1785
  ]
1785
1786
  )
1786
1787
  );
1787
- } else if (!t.isVariableDeclarator(path3.parent)) {
1788
- path3.replaceWith(wrapped);
1788
+ } else if (!t.isVariableDeclarator(path2.parent)) {
1789
+ path2.replaceWith(wrapped);
1789
1790
  } else {
1790
- path3.parent.init = wrapped;
1791
+ path2.parent.init = wrapped;
1791
1792
  }
1792
1793
  });
1793
1794
  }
@@ -1812,7 +1813,7 @@ ${path3.toString()}
1812
1813
  const { code } = generate(ast);
1813
1814
  return {
1814
1815
  contents: code,
1815
- loader: args.path.split(".").pop()
1816
+ loader: (_a = args.path) == null ? void 0 : _a.split(".").pop()
1816
1817
  };
1817
1818
  }, "cacheDirectivePlugin");
1818
1819
  }
@@ -1888,7 +1889,10 @@ var init_default = __esm({
1888
1889
  init_CachePlugin();
1889
1890
  init_MacroPlugin();
1890
1891
  defaultConfig = {
1891
- plugins: [new CachePlugin({}), new MacroPlugin({})],
1892
+ plugins: [
1893
+ new CachePlugin({ enabled: true }),
1894
+ new MacroPlugin({ enabled: true })
1895
+ ],
1892
1896
  esbuildPlugins: [],
1893
1897
  compilerOptions: {
1894
1898
  macro: {
@@ -1914,42 +1918,45 @@ var init_default = __esm({
1914
1918
  }
1915
1919
  });
1916
1920
 
1917
- // src/config/utils.ts
1918
- var mergeDeep;
1919
- var init_utils = __esm({
1920
- "src/config/utils.ts"() {
1921
- "use strict";
1922
- init_cjs_shims();
1923
- mergeDeep = /* @__PURE__ */ __name((target, source) => {
1924
- const isObject = /* @__PURE__ */ __name((obj) => obj && typeof obj === "object" && !Array.isArray(obj), "isObject");
1925
- const output = { ...target };
1926
- if (isObject(target) && isObject(source)) {
1927
- Object.keys(source).forEach((key) => {
1928
- if (isObject(source[key])) {
1929
- if (!(key in target)) {
1930
- Object.assign(output, { [key]: source[key] });
1931
- } else {
1932
- output[key] = mergeDeep(target[key], source[key]);
1933
- }
1934
- } else {
1935
- Object.assign(output, { [key]: source[key] });
1936
- }
1937
- });
1938
- }
1939
- return output;
1940
- }, "mergeDeep");
1941
- }
1942
- });
1943
-
1944
1921
  // src/config/config.ts
1945
1922
  function getConfig() {
1946
1923
  return defined;
1947
1924
  }
1948
1925
  function defineConfig(config = {}) {
1949
- defined = mergeDeep(
1950
- config,
1951
- mergeDeep({}, defaultConfig)
1952
- );
1926
+ var _a, _b;
1927
+ defined = {
1928
+ compilerOptions: {
1929
+ cache: {
1930
+ ...defaultConfig.compilerOptions.cache,
1931
+ ...(_a = config.compilerOptions) == null ? void 0 : _a.cache
1932
+ },
1933
+ macro: {
1934
+ ...defaultConfig.compilerOptions.macro,
1935
+ ...(_b = config.compilerOptions) == null ? void 0 : _b.macro
1936
+ }
1937
+ },
1938
+ distDir: config.distDir ?? defaultConfig.distDir,
1939
+ env: {
1940
+ ...defaultConfig.env,
1941
+ ...config.env
1942
+ },
1943
+ esbuildPlugins: [
1944
+ ...config.esbuildPlugins ?? [],
1945
+ ...defaultConfig.esbuildPlugins ?? []
1946
+ ],
1947
+ plugins: [...config.plugins ?? [], ...defaultConfig.plugins ?? []],
1948
+ sourceMap: {
1949
+ ...defaultConfig.sourceMap,
1950
+ ...config.sourceMap
1951
+ },
1952
+ static: config.static ?? defaultConfig.static,
1953
+ typedCommands: config.typedCommands ?? defaultConfig.typedCommands,
1954
+ typedLocales: config.typedLocales ?? defaultConfig.typedLocales,
1955
+ typescript: {
1956
+ ...defaultConfig.typescript,
1957
+ ...config.typescript
1958
+ }
1959
+ };
1953
1960
  return defined;
1954
1961
  }
1955
1962
  var defined;
@@ -1958,7 +1965,6 @@ var init_config = __esm({
1958
1965
  "use strict";
1959
1966
  init_cjs_shims();
1960
1967
  init_default();
1961
- init_utils();
1962
1968
  defined = defaultConfig;
1963
1969
  __name(getConfig, "getConfig");
1964
1970
  __name(defineConfig, "defineConfig");
@@ -1983,9 +1989,9 @@ var init_DefaultLocalizationStrategy = __esm({
1983
1989
  async locateTranslation(scope, locale) {
1984
1990
  const localesPath = this.commandkit.getPath("locales");
1985
1991
  if (!localesPath) return null;
1986
- const path3 = (0, import_node_path.join)(localesPath, locale, `${scope}.json`);
1992
+ const path2 = (0, import_node_path.join)(localesPath, locale, `${scope}.json`);
1987
1993
  try {
1988
- const data = await (0, import_promises2.readFile)(path3, "utf-8");
1994
+ const data = await (0, import_promises2.readFile)(path2, "utf-8");
1989
1995
  const localeData = JSON.parse(data);
1990
1996
  await this.generateLocaleTypes(localeData);
1991
1997
  return localeData;
@@ -2146,209 +2152,520 @@ var init_utilities = __esm({
2146
2152
  }
2147
2153
  });
2148
2154
 
2149
- // src/app/i18n/Localization.ts
2150
- var _Localization, Localization;
2151
- var init_Localization = __esm({
2152
- "src/app/i18n/Localization.ts"() {
2155
+ // src/utils/resolve-file-url.ts
2156
+ function toFileURL(filePath, withTs = false) {
2157
+ const resolvedPath = import_path.default.resolve(filePath);
2158
+ return `${"file://" + resolvedPath.replace(/\\\\|\\/g, "/")}${withTs ? `?ts=${Date.now()}` : ""}`;
2159
+ }
2160
+ var import_path;
2161
+ var init_resolve_file_url = __esm({
2162
+ "src/utils/resolve-file-url.ts"() {
2153
2163
  "use strict";
2154
2164
  init_cjs_shims();
2155
- _Localization = class _Localization {
2156
- /**
2157
- * Creates a new localization instance.
2158
- * @param commandkit The command kit instance.
2159
- * @param config The localization configuration.
2160
- */
2161
- constructor(commandkit2, config) {
2162
- this.commandkit = commandkit2;
2163
- this.config = config;
2164
- const strategy = this.commandkit.config.localizationStrategy;
2165
- const { locale, target } = this.config;
2166
- this.t = (translatable, args) => {
2167
- return strategy.translate({
2168
- args,
2169
- key: translatable,
2170
- locale,
2171
- scope: target
2172
- });
2173
- };
2174
- }
2175
- /**
2176
- * Translates the given translatable object.
2177
- * @param translatable The translatable object to translate.
2178
- */
2179
- t;
2180
- /**
2181
- * Get the localization strategy.
2182
- */
2183
- getStrategy() {
2184
- return this.commandkit.config.localizationStrategy;
2185
- }
2186
- /**
2187
- * Get the default locale
2188
- */
2189
- getDefaultLocale() {
2190
- return this.commandkit.config.defaultLocale;
2191
- }
2192
- /**
2193
- * Get the current locale
2194
- */
2195
- getLocale() {
2196
- return this.config.locale;
2197
- }
2198
- /**
2199
- * Get the localization target
2200
- */
2201
- getTarget() {
2202
- return this.config.target;
2203
- }
2204
- };
2205
- __name(_Localization, "Localization");
2206
- Localization = _Localization;
2165
+ import_path = __toESM(require("path"));
2166
+ __name(toFileURL, "toFileURL");
2207
2167
  }
2208
2168
  });
2209
2169
 
2210
- // src/context/environment.ts
2211
- function afterCommand(fn) {
2212
- const env = getContext();
2213
- if (!env) {
2214
- throw new Error("after must be called inside commandkit handler.");
2215
- }
2216
- return env.registerDeferredFunction(fn);
2217
- }
2218
- function cancelAfterCommand(id) {
2219
- const env = getContext();
2220
- if (!env) {
2221
- throw new Error("cancelAfter must be called inside commandkit handler.");
2222
- }
2223
- env.clearDeferredFunction(id);
2224
- }
2225
- var import_node_crypto, _data, _CommandKitEnvironment, CommandKitEnvironment, CommandKitEnvironmentType;
2226
- var init_environment = __esm({
2227
- "src/context/environment.ts"() {
2170
+ // src/app/commands/MessageCommandParser.ts
2171
+ var import_discord8, _parsed, _options, _args, _MessageCommandParser, MessageCommandParser, _MessageCommandOptions, MessageCommandOptions;
2172
+ var init_MessageCommandParser = __esm({
2173
+ "src/app/commands/MessageCommandParser.ts"() {
2228
2174
  "use strict";
2229
2175
  init_cjs_shims();
2230
- import_node_crypto = require("crypto");
2231
- init_async_context();
2232
- _CommandKitEnvironment = class _CommandKitEnvironment {
2233
- /**
2234
- * Creates the commandkit execution environment.
2235
- * @param commandkit - The commandkit instance.
2236
- */
2237
- constructor(commandkit2) {
2238
- this.commandkit = commandkit2;
2239
- __privateAdd(this, _data, {
2240
- executionError: null,
2241
- type: null,
2242
- variables: /* @__PURE__ */ new Map(),
2243
- deferredFunctions: /* @__PURE__ */ new Map(),
2244
- marker: "",
2245
- markStart: 0,
2246
- markEnd: 0
2247
- });
2248
- }
2249
- /**
2250
- * Get the execution error.
2251
- * @internal
2252
- */
2253
- getExecutionError() {
2254
- return __privateGet(this, _data).executionError;
2176
+ import_discord8 = require("discord.js");
2177
+ init_error_codes();
2178
+ _MessageCommandParser = class _MessageCommandParser {
2179
+ constructor(message, prefix, schema) {
2180
+ this.message = message;
2181
+ this.prefix = prefix;
2182
+ this.schema = schema;
2183
+ __privateAdd(this, _parsed, null);
2184
+ __privateAdd(this, _options, null);
2185
+ __privateAdd(this, _args, []);
2255
2186
  }
2256
- /**
2257
- * Set the execution error.
2258
- * @param error - The error to set.
2259
- * @internal
2260
- */
2261
- setExecutionError(error) {
2262
- if (__privateGet(this, _data).executionError) {
2263
- throw new Error("Execution error already set.");
2264
- }
2265
- __privateGet(this, _data).executionError = error;
2187
+ getArgs() {
2188
+ void this.parse();
2189
+ return __privateGet(this, _args);
2266
2190
  }
2267
- /**
2268
- * Get the environment type.
2269
- */
2270
- getType() {
2271
- const type = __privateGet(this, _data).type;
2272
- if (!type) {
2273
- throw new Error("Environment type not set.");
2191
+ get options() {
2192
+ if (!__privateGet(this, _options)) {
2193
+ __privateSet(this, _options, new MessageCommandOptions(this));
2274
2194
  }
2275
- return type;
2195
+ return __privateGet(this, _options);
2276
2196
  }
2277
- /**
2278
- * Set the environment type.
2279
- * @param type - The environment type to set.
2280
- * @internal
2281
- */
2282
- setType(type) {
2283
- __privateGet(this, _data).type = type;
2197
+ getOption(name) {
2198
+ var _a;
2199
+ return (_a = this.parse().options.find((o) => o.name === name)) == null ? void 0 : _a.value;
2284
2200
  }
2285
- /**
2286
- * The variables store for this environment.
2287
- */
2288
- get variables() {
2289
- return __privateGet(this, _data).variables;
2201
+ getCommand() {
2202
+ return this.parse().command;
2290
2203
  }
2291
- /**
2292
- * Register a deferred function.
2293
- * @param fn - The deferred function to register.
2294
- * @returns The deferred function id.
2295
- * @internal
2296
- */
2297
- registerDeferredFunction(fn) {
2298
- const id = (0, import_node_crypto.randomUUID)();
2299
- __privateGet(this, _data).deferredFunctions.set(id, fn);
2300
- return id;
2204
+ getSubcommand() {
2205
+ return this.parse().subcommand;
2301
2206
  }
2302
- /**
2303
- * Clear a deferred function by id.
2304
- * @param id - The deferred function id to clear.
2305
- * @internal
2306
- */
2307
- clearDeferredFunction(id) {
2308
- __privateGet(this, _data).deferredFunctions.delete(id);
2207
+ getSubcommandGroup() {
2208
+ return this.parse().subcommandGroup;
2309
2209
  }
2310
- /**
2311
- * Run all deferred functions sequentially.
2312
- * @internal
2313
- */
2314
- async runDeferredFunctions() {
2315
- for (const [id, fn] of __privateGet(this, _data).deferredFunctions) {
2316
- try {
2317
- await fn(this);
2318
- } catch (e) {
2319
- this.commandkit.emit("unhandledDeferredFunctionRejection", e);
2320
- } finally {
2321
- this.clearDeferredFunction(id);
2210
+ getPrefix() {
2211
+ for (const p of this.prefix) {
2212
+ if (this.message.content.startsWith(p)) {
2213
+ return p;
2322
2214
  }
2323
2215
  }
2324
2216
  }
2325
- /**
2326
- * Clear all deferred functions.
2327
- * @internal
2328
- */
2329
- clearAllDeferredFunctions() {
2330
- __privateGet(this, _data).deferredFunctions.clear();
2331
- }
2332
- /**
2333
- * Mark the start of a command execution.
2334
- * @param marker - The marker to set.
2335
- * @internal
2336
- */
2337
- markStart(marker) {
2338
- __privateGet(this, _data).marker = marker;
2339
- __privateGet(this, _data).markStart = performance.now();
2340
- }
2341
- /**
2342
- * Mark the end of a command execution.
2343
- * @internal
2344
- */
2345
- markEnd() {
2346
- if (!__privateGet(this, _data).markEnd) __privateGet(this, _data).markEnd = performance.now();
2217
+ getFullCommand() {
2218
+ return [this.getCommand(), this.getSubcommandGroup(), this.getSubcommand()].filter((v) => v).join(" ");
2347
2219
  }
2348
- /**
2349
- * Get the marker.
2350
- * @internal
2351
- */
2220
+ parse() {
2221
+ if (__privateGet(this, _parsed)) {
2222
+ return __privateGet(this, _parsed);
2223
+ }
2224
+ const content = this.message.content;
2225
+ const prefix = this.getPrefix();
2226
+ if (!prefix) {
2227
+ throw createCommandKitError(CommandKitErrorCodes.InvalidCommandPrefix);
2228
+ }
2229
+ const parts = content.slice(prefix.length).trim().split(" ");
2230
+ const command = parts.shift();
2231
+ __privateSet(this, _args, parts);
2232
+ let subcommandGroup;
2233
+ let subcommand;
2234
+ if (command == null ? void 0 : command.includes(":")) {
2235
+ const [, group, cmd] = command.split(":");
2236
+ if (!cmd && group) {
2237
+ subcommand = group;
2238
+ } else if (cmd && group) {
2239
+ subcommandGroup = group;
2240
+ subcommand = cmd;
2241
+ }
2242
+ }
2243
+ const schema = this.schema(
2244
+ [command, subcommandGroup, subcommand].filter(Boolean).join(" ").trim()
2245
+ );
2246
+ const options = parts.map((part) => {
2247
+ try {
2248
+ const [name, value] = part.split(":");
2249
+ if (!(name in schema)) return null;
2250
+ switch (schema[name]) {
2251
+ case import_discord8.ApplicationCommandOptionType.Boolean:
2252
+ return { name, value: value === "true" };
2253
+ case import_discord8.ApplicationCommandOptionType.Integer:
2254
+ return { name, value: parseInt(value, 10) };
2255
+ case import_discord8.ApplicationCommandOptionType.Number:
2256
+ return { name, value: parseFloat(value) };
2257
+ case import_discord8.ApplicationCommandOptionType.String:
2258
+ return { name, value };
2259
+ case import_discord8.ApplicationCommandOptionType.User:
2260
+ return {
2261
+ name,
2262
+ value: this.message.mentions.users.find((u) => {
2263
+ return u.id === value.replace(/[<@!>]/g, "");
2264
+ })
2265
+ };
2266
+ case import_discord8.ApplicationCommandOptionType.Channel:
2267
+ return {
2268
+ name,
2269
+ value: this.message.mentions.channels.find((c) => {
2270
+ return c.id === value.replace(/[<#>]/g, "");
2271
+ })
2272
+ };
2273
+ case import_discord8.ApplicationCommandOptionType.Role:
2274
+ return {
2275
+ name,
2276
+ value: this.message.mentions.roles.find((r) => {
2277
+ return r.id === value.replace(/[<@&>]/g, "");
2278
+ })
2279
+ };
2280
+ case import_discord8.ApplicationCommandOptionType.Attachment:
2281
+ return {
2282
+ name,
2283
+ value: this.message.attachments.find((a) => {
2284
+ return a.name === value;
2285
+ })
2286
+ };
2287
+ default:
2288
+ return null;
2289
+ }
2290
+ } catch {
2291
+ return null;
2292
+ }
2293
+ }).filter((v) => v !== null);
2294
+ __privateSet(this, _parsed, {
2295
+ command,
2296
+ options,
2297
+ subcommand,
2298
+ subcommandGroup
2299
+ });
2300
+ return __privateGet(this, _parsed);
2301
+ }
2302
+ };
2303
+ _parsed = new WeakMap();
2304
+ _options = new WeakMap();
2305
+ _args = new WeakMap();
2306
+ __name(_MessageCommandParser, "MessageCommandParser");
2307
+ MessageCommandParser = _MessageCommandParser;
2308
+ _MessageCommandOptions = class _MessageCommandOptions {
2309
+ constructor(parser2) {
2310
+ this.parser = parser2;
2311
+ }
2312
+ assertOption(name, required = false) {
2313
+ const option = this.parser.getOption(name);
2314
+ if (required && option === void 0) {
2315
+ throw new Error(`Option "${name}" is required.`);
2316
+ }
2317
+ return option ?? null;
2318
+ }
2319
+ getMember(name, required = false) {
2320
+ var _a;
2321
+ const user = this.assertOption(name, required);
2322
+ const member = (_a = this.parser.message.guild) == null ? void 0 : _a.members.cache.get(user == null ? void 0 : user.id);
2323
+ if (required && !member) {
2324
+ throw new Error(`Member "${name}" is required.`);
2325
+ }
2326
+ return member ?? null;
2327
+ }
2328
+ getAttachment(name, required = false) {
2329
+ return this.assertOption(name, required);
2330
+ }
2331
+ getBoolean(name, required = false) {
2332
+ return this.assertOption(name, required);
2333
+ }
2334
+ getNumber(name, required = false) {
2335
+ return this.assertOption(name, required);
2336
+ }
2337
+ getString(name, required = false) {
2338
+ return this.assertOption(name, required);
2339
+ }
2340
+ getInteger(name, required = false) {
2341
+ return this.assertOption(name, required);
2342
+ }
2343
+ getUser(name, required = false) {
2344
+ return this.assertOption(name, required);
2345
+ }
2346
+ getChannel(name, required = false) {
2347
+ return this.assertOption(name, required);
2348
+ }
2349
+ getRole(name, required = false) {
2350
+ return this.assertOption(name, required);
2351
+ }
2352
+ getMentionable(name, required = false) {
2353
+ const target = this.assertOption(name, required);
2354
+ if (target instanceof import_discord8.GuildMember || target instanceof import_discord8.User || target instanceof import_discord8.Role) {
2355
+ return target;
2356
+ }
2357
+ if (required) {
2358
+ throw new Error(`Mentionable "${name}" is required.`);
2359
+ }
2360
+ return null;
2361
+ }
2362
+ getSubcommand(required = false) {
2363
+ const sub = this.parser.getSubcommand();
2364
+ if (required && sub === void 0) {
2365
+ throw new Error("Subcommand is required.");
2366
+ }
2367
+ return sub ?? null;
2368
+ }
2369
+ getSubcommandGroup(required = false) {
2370
+ const sub = this.parser.getSubcommandGroup();
2371
+ if (required && sub === void 0) {
2372
+ throw new Error("Subcommand group is required.");
2373
+ }
2374
+ return sub ?? null;
2375
+ }
2376
+ };
2377
+ __name(_MessageCommandOptions, "MessageCommandOptions");
2378
+ MessageCommandOptions = _MessageCommandOptions;
2379
+ }
2380
+ });
2381
+
2382
+ // src/app/register/CommandRegistrar.ts
2383
+ var import_discord9, _CommandRegistrar, CommandRegistrar;
2384
+ var init_CommandRegistrar = __esm({
2385
+ "src/app/register/CommandRegistrar.ts"() {
2386
+ "use strict";
2387
+ init_cjs_shims();
2388
+ import_discord9 = require("discord.js");
2389
+ init_Logger();
2390
+ _CommandRegistrar = class _CommandRegistrar {
2391
+ /**
2392
+ * Creates an instance of CommandRegistrar.
2393
+ * @param commandkit The commandkit instance.
2394
+ */
2395
+ constructor(commandkit2) {
2396
+ this.commandkit = commandkit2;
2397
+ this.api.setToken(
2398
+ this.commandkit.client.token ?? process.env.DISCORD_TOKEN ?? process.env.TOKEN ?? ""
2399
+ );
2400
+ }
2401
+ api = new import_discord9.REST();
2402
+ /**
2403
+ * Gets the commands data.
2404
+ */
2405
+ getCommandsData() {
2406
+ const handler = this.commandkit.commandHandler;
2407
+ const commands = handler.getCommandsArray();
2408
+ return commands.flatMap((cmd) => {
2409
+ const json = "toJSON" in cmd.data.command ? cmd.data.command.toJSON() : cmd.data.command;
2410
+ const collections = [json];
2411
+ if (cmd.data.userContextMenu && json.type !== import_discord9.ApplicationCommandType.User) {
2412
+ collections.push({
2413
+ ...json,
2414
+ type: import_discord9.ApplicationCommandType.User,
2415
+ options: void 0,
2416
+ description_localizations: void 0,
2417
+ // @ts-ignore
2418
+ description: void 0
2419
+ });
2420
+ }
2421
+ if (cmd.data.messageContextMenu && json.type !== import_discord9.ApplicationCommandType.Message) {
2422
+ collections.push({
2423
+ ...json,
2424
+ type: import_discord9.ApplicationCommandType.Message,
2425
+ description_localizations: void 0,
2426
+ // @ts-ignore
2427
+ description: void 0,
2428
+ options: void 0
2429
+ });
2430
+ }
2431
+ return collections;
2432
+ });
2433
+ }
2434
+ /**
2435
+ * Registers loaded commands.
2436
+ */
2437
+ async register() {
2438
+ if (!this.commandkit.client.isReady()) {
2439
+ throw new Error("Cannot register commands before the client is ready");
2440
+ }
2441
+ const commands = this.getCommandsData();
2442
+ const guildCommands = commands.filter((command) => {
2443
+ var _a;
2444
+ return (_a = command.guilds) == null ? void 0 : _a.filter(Boolean).length;
2445
+ }).map((c) => {
2446
+ var _a;
2447
+ return {
2448
+ ...c,
2449
+ guilds: Array.from(new Set((_a = c.guilds) == null ? void 0 : _a.filter(Boolean)))
2450
+ };
2451
+ });
2452
+ const globalCommands = commands.filter(
2453
+ (command) => {
2454
+ var _a;
2455
+ return !((_a = command.guilds) == null ? void 0 : _a.filter(Boolean).length);
2456
+ }
2457
+ );
2458
+ await this.updateGlobalCommands(globalCommands);
2459
+ await this.updateGuildCommands(guildCommands);
2460
+ }
2461
+ /**
2462
+ * Updates the global commands.
2463
+ */
2464
+ async updateGlobalCommands(commands) {
2465
+ if (!commands.length) return;
2466
+ try {
2467
+ const data = await this.api.put(
2468
+ import_discord9.Routes.applicationCommands(this.commandkit.client.user.id),
2469
+ {
2470
+ body: commands.map((c) => ({
2471
+ ...c,
2472
+ guilds: void 0
2473
+ }))
2474
+ }
2475
+ );
2476
+ Logger.info(
2477
+ `\u2728 Refreshed ${data.length} global application (/) commands`
2478
+ );
2479
+ } catch (e) {
2480
+ Logger.error("Failed to update global application (/) commands", e);
2481
+ }
2482
+ }
2483
+ /**
2484
+ * Updates the guild commands.
2485
+ */
2486
+ async updateGuildCommands(commands) {
2487
+ try {
2488
+ const guildCommandsMap = /* @__PURE__ */ new Map();
2489
+ commands.forEach((command) => {
2490
+ var _a;
2491
+ if (!((_a = command.guilds) == null ? void 0 : _a.length)) return;
2492
+ command.guilds.forEach((guild) => {
2493
+ if (!guildCommandsMap.has(guild)) {
2494
+ guildCommandsMap.set(guild, []);
2495
+ }
2496
+ guildCommandsMap.get(guild).push(command);
2497
+ });
2498
+ });
2499
+ if (!guildCommandsMap.size) return;
2500
+ let count = 0;
2501
+ for (const [guild, guildCommands] of guildCommandsMap) {
2502
+ const data = await this.api.put(
2503
+ import_discord9.Routes.applicationGuildCommands(
2504
+ this.commandkit.client.user.id,
2505
+ guild
2506
+ ),
2507
+ {
2508
+ body: guildCommands.map((b) => ({
2509
+ ...b,
2510
+ guilds: void 0
2511
+ }))
2512
+ }
2513
+ );
2514
+ count += data.length;
2515
+ }
2516
+ Logger.info(`\u2728 Refreshed ${count} guild application (/) commands`);
2517
+ } catch (e) {
2518
+ Logger.error("Failed to update guild application (/) commands", e);
2519
+ }
2520
+ }
2521
+ };
2522
+ __name(_CommandRegistrar, "CommandRegistrar");
2523
+ CommandRegistrar = _CommandRegistrar;
2524
+ }
2525
+ });
2526
+
2527
+ // src/context/environment.ts
2528
+ function afterCommand(fn) {
2529
+ const env = getContext();
2530
+ if (!env) {
2531
+ throw new Error("after must be called inside commandkit handler.");
2532
+ }
2533
+ return env.registerDeferredFunction(fn);
2534
+ }
2535
+ function cancelAfterCommand(id) {
2536
+ const env = getContext();
2537
+ if (!env) {
2538
+ throw new Error("cancelAfter must be called inside commandkit handler.");
2539
+ }
2540
+ env.clearDeferredFunction(id);
2541
+ }
2542
+ var import_node_crypto, _data, _CommandKitEnvironment, CommandKitEnvironment, CommandKitEnvironmentType;
2543
+ var init_environment = __esm({
2544
+ "src/context/environment.ts"() {
2545
+ "use strict";
2546
+ init_cjs_shims();
2547
+ import_node_crypto = require("crypto");
2548
+ init_async_context();
2549
+ _CommandKitEnvironment = class _CommandKitEnvironment {
2550
+ /**
2551
+ * Creates the commandkit execution environment.
2552
+ * @param commandkit - The commandkit instance.
2553
+ */
2554
+ constructor(commandkit2) {
2555
+ this.commandkit = commandkit2;
2556
+ __privateAdd(this, _data, {
2557
+ executionError: null,
2558
+ type: null,
2559
+ variables: /* @__PURE__ */ new Map(),
2560
+ deferredFunctions: /* @__PURE__ */ new Map(),
2561
+ marker: "",
2562
+ markStart: 0,
2563
+ markEnd: 0
2564
+ });
2565
+ }
2566
+ /**
2567
+ * Get the execution error.
2568
+ * @internal
2569
+ */
2570
+ getExecutionError() {
2571
+ return __privateGet(this, _data).executionError;
2572
+ }
2573
+ /**
2574
+ * Set the execution error.
2575
+ * @param error - The error to set.
2576
+ * @internal
2577
+ */
2578
+ setExecutionError(error) {
2579
+ if (__privateGet(this, _data).executionError) {
2580
+ throw new Error("Execution error already set.");
2581
+ }
2582
+ __privateGet(this, _data).executionError = error;
2583
+ }
2584
+ /**
2585
+ * Get the environment type.
2586
+ */
2587
+ getType() {
2588
+ const type = __privateGet(this, _data).type;
2589
+ if (!type) {
2590
+ throw new Error("Environment type not set.");
2591
+ }
2592
+ return type;
2593
+ }
2594
+ /**
2595
+ * Set the environment type.
2596
+ * @param type - The environment type to set.
2597
+ * @internal
2598
+ */
2599
+ setType(type) {
2600
+ __privateGet(this, _data).type = type;
2601
+ }
2602
+ /**
2603
+ * The variables store for this environment.
2604
+ */
2605
+ get variables() {
2606
+ return __privateGet(this, _data).variables;
2607
+ }
2608
+ /**
2609
+ * Register a deferred function.
2610
+ * @param fn - The deferred function to register.
2611
+ * @returns The deferred function id.
2612
+ * @internal
2613
+ */
2614
+ registerDeferredFunction(fn) {
2615
+ const id = (0, import_node_crypto.randomUUID)();
2616
+ __privateGet(this, _data).deferredFunctions.set(id, fn);
2617
+ return id;
2618
+ }
2619
+ /**
2620
+ * Clear a deferred function by id.
2621
+ * @param id - The deferred function id to clear.
2622
+ * @internal
2623
+ */
2624
+ clearDeferredFunction(id) {
2625
+ __privateGet(this, _data).deferredFunctions.delete(id);
2626
+ }
2627
+ /**
2628
+ * Run all deferred functions sequentially.
2629
+ * @internal
2630
+ */
2631
+ async runDeferredFunctions() {
2632
+ for (const [id, fn] of __privateGet(this, _data).deferredFunctions) {
2633
+ try {
2634
+ await fn(this);
2635
+ } catch (e) {
2636
+ this.commandkit.emit("unhandledDeferredFunctionRejection", e);
2637
+ } finally {
2638
+ this.clearDeferredFunction(id);
2639
+ }
2640
+ }
2641
+ }
2642
+ /**
2643
+ * Clear all deferred functions.
2644
+ * @internal
2645
+ */
2646
+ clearAllDeferredFunctions() {
2647
+ __privateGet(this, _data).deferredFunctions.clear();
2648
+ }
2649
+ /**
2650
+ * Mark the start of a command execution.
2651
+ * @param marker - The marker to set.
2652
+ * @internal
2653
+ */
2654
+ markStart(marker) {
2655
+ __privateGet(this, _data).marker = marker;
2656
+ __privateGet(this, _data).markStart = performance.now();
2657
+ }
2658
+ /**
2659
+ * Mark the end of a command execution.
2660
+ * @internal
2661
+ */
2662
+ markEnd() {
2663
+ if (!__privateGet(this, _data).markEnd) __privateGet(this, _data).markEnd = performance.now();
2664
+ }
2665
+ /**
2666
+ * Get the marker.
2667
+ * @internal
2668
+ */
2352
2669
  getMarker() {
2353
2670
  return __privateGet(this, _data).marker;
2354
2671
  }
@@ -2372,6 +2689,67 @@ var init_environment = __esm({
2372
2689
  }
2373
2690
  });
2374
2691
 
2692
+ // src/app/i18n/Localization.ts
2693
+ var _Localization, Localization;
2694
+ var init_Localization = __esm({
2695
+ "src/app/i18n/Localization.ts"() {
2696
+ "use strict";
2697
+ init_cjs_shims();
2698
+ _Localization = class _Localization {
2699
+ /**
2700
+ * Creates a new localization instance.
2701
+ * @param commandkit The command kit instance.
2702
+ * @param config The localization configuration.
2703
+ */
2704
+ constructor(commandkit2, config) {
2705
+ this.commandkit = commandkit2;
2706
+ this.config = config;
2707
+ const strategy = this.commandkit.config.localizationStrategy;
2708
+ const { locale, target } = this.config;
2709
+ this.t = (translatable, args) => {
2710
+ return strategy.translate({
2711
+ args,
2712
+ key: translatable,
2713
+ locale,
2714
+ scope: target
2715
+ });
2716
+ };
2717
+ }
2718
+ /**
2719
+ * Translates the given translatable object.
2720
+ * @param translatable The translatable object to translate.
2721
+ */
2722
+ t;
2723
+ /**
2724
+ * Get the localization strategy.
2725
+ */
2726
+ getStrategy() {
2727
+ return this.commandkit.config.localizationStrategy;
2728
+ }
2729
+ /**
2730
+ * Get the default locale
2731
+ */
2732
+ getDefaultLocale() {
2733
+ return this.commandkit.config.defaultLocale;
2734
+ }
2735
+ /**
2736
+ * Get the current locale
2737
+ */
2738
+ getLocale() {
2739
+ return this.config.locale;
2740
+ }
2741
+ /**
2742
+ * Get the localization target
2743
+ */
2744
+ getTarget() {
2745
+ return this.config.target;
2746
+ }
2747
+ };
2748
+ __name(_Localization, "Localization");
2749
+ Localization = _Localization;
2750
+ }
2751
+ });
2752
+
2375
2753
  // src/app/middleware/signals.ts
2376
2754
  function exitMiddleware() {
2377
2755
  throw createCommandKitError(CommandKitErrorCodes.ExitMiddleware);
@@ -2676,637 +3054,315 @@ var init_Context = __esm({
2676
3054
  * Whether the command was triggered by an autocomplete interaction.
2677
3055
  */
2678
3056
  isAutocomplete() {
2679
- return this.executionMode === CommandExecutionMode.Autocomplete;
2680
- }
2681
- /**
2682
- * Whether the command was triggered by a message context menu interaction.
2683
- */
2684
- isMessageContextMenu() {
2685
- return this.executionMode === CommandExecutionMode.MessageContextMenu;
2686
- }
2687
- /**
2688
- * Whether the command was triggered by a user context menu interaction.
2689
- */
2690
- isUserContextMenu() {
2691
- return this.executionMode === CommandExecutionMode.UserContextMenu;
2692
- }
2693
- /**
2694
- * Whether the command was triggered by a message.
2695
- */
2696
- isMessage() {
2697
- return this.executionMode === CommandExecutionMode.Message;
2698
- }
2699
- /**
2700
- * Returns the command identifier.
2701
- */
2702
- getCommandIdentifier() {
2703
- if (this.isInteraction()) {
2704
- return this.interaction.commandName;
2705
- } else {
2706
- return this.message.content.split(" ")[0].slice(1);
2707
- }
2708
- }
2709
- /**
2710
- * Returns the locale of the guild where this command was triggered.
2711
- */
2712
- getGuildLocale() {
2713
- var _a;
2714
- if (this.isInteraction()) {
2715
- return this.interaction.guildLocale;
2716
- } else {
2717
- return ((_a = this.message.guild) == null ? void 0 : _a.preferredLocale) ?? null;
2718
- }
2719
- }
2720
- /**
2721
- * Returns the locale of the user who triggered this command.
2722
- */
2723
- getUserLocale() {
2724
- if (this.isInteraction()) {
2725
- return this.interaction.locale;
2726
- } else {
2727
- return null;
2728
- }
2729
- }
2730
- /**
2731
- * Returns the locale for this command.
2732
- * @param preferUser Whether to prefer the user's locale over the guild's locale.
2733
- * @returns The locale for this command. If no locale is found, the default locale is returned.
2734
- */
2735
- getLocale(preferUser = false) {
2736
- if (this._locale) return this._locale;
2737
- const locale = preferUser ? this.getUserLocale() : this.getGuildLocale();
2738
- if (!locale) {
2739
- return this.commandkit.config.defaultLocale;
2740
- }
2741
- return locale;
2742
- }
2743
- /**
2744
- * Sets the locale for this command.
2745
- * @param locale The locale to set.
2746
- */
2747
- setLocale(locale) {
2748
- this._locale = locale;
2749
- }
2750
- /**
2751
- * Returns the i18n api for this command.
2752
- * @param locale The locale to use for the i18n api.
2753
- */
2754
- locale(locale) {
2755
- const selectedLocale = locale ?? this.getLocale();
2756
- return new Localization(this.commandkit, {
2757
- locale: selectedLocale,
2758
- target: this.getCommandIdentifier()
2759
- });
2760
- }
2761
- /**
2762
- * Creates a clone of this context
2763
- */
2764
- clone(config) {
2765
- if (!config) return new _Context(this.commandkit, this.config);
2766
- const ctx = new _Context(this.commandkit, {
2767
- ...this.config,
2768
- ...config,
2769
- store: __privateGet(this, _store)
2770
- });
2771
- return ctx;
2772
- }
2773
- isMiddleware() {
2774
- return this instanceof MiddlewareContext;
2775
- }
2776
- args() {
2777
- if (this.isMessage()) {
2778
- return this.config.messageCommandParser.getArgs();
2779
- }
2780
- return [];
2781
- }
2782
- /**
2783
- * Stops upcoming middleware or current command execution.
2784
- * If this is called inside pre-stage middleware, the next run will be the actual command, skipping all other pre-stage middlewares.
2785
- * If this is called inside a command itself, it will skip all post-stage middlewares.
2786
- * If this is called inside post-stage middleware, it will skip all other post-stage middlewares.
2787
- */
2788
- exit() {
2789
- exitMiddleware();
2790
- }
2791
- /**
2792
- * Defers the given function to be executed after this command's execution.
2793
- * @param fn The function to defer.
2794
- * @returns A unique identifier for the deferred function.
2795
- */
2796
- defer(fn) {
2797
- return afterCommand(fn);
2798
- }
2799
- /**
2800
- * Cancels the deferred function with the given identifier.
2801
- * @param id The identifier of the deferred function.
2802
- */
2803
- cancelDeferred(id) {
2804
- cancelAfterCommand(id);
2805
- }
2806
- /**
2807
- * Validates if the given function is a cached function.
2808
- * @param fn The function to validate.
2809
- */
2810
- isCached(fn) {
2811
- return isCachedFunction(fn);
2812
- }
2813
- };
2814
- _store = new WeakMap();
2815
- __name(_Context, "Context");
2816
- Context = _Context;
2817
- _MiddlewareContext = class _MiddlewareContext extends Context {
2818
- constructor() {
2819
- super(...arguments);
2820
- __privateAdd(this, _cancel, false);
3057
+ return this.executionMode === CommandExecutionMode.Autocomplete;
2821
3058
  }
2822
3059
  /**
2823
- * Whether the command execution was cancelled.
3060
+ * Whether the command was triggered by a message context menu interaction.
2824
3061
  */
2825
- get cancelled() {
2826
- return __privateGet(this, _cancel);
3062
+ isMessageContextMenu() {
3063
+ return this.executionMode === CommandExecutionMode.MessageContextMenu;
2827
3064
  }
2828
3065
  /**
2829
- * Cancels the command execution.
3066
+ * Whether the command was triggered by a user context menu interaction.
2830
3067
  */
2831
- cancel() {
2832
- __privateSet(this, _cancel, true);
3068
+ isUserContextMenu() {
3069
+ return this.executionMode === CommandExecutionMode.UserContextMenu;
2833
3070
  }
2834
3071
  /**
2835
- * Sets command runner function to wrap the command execution.
2836
- * @param fn The function to set.
2837
- * @example ctx.setCommandRunner(async (execute) => {
2838
- * // do something before command execution
2839
- * await execute();
2840
- * // do something after command execution
2841
- * })
3072
+ * Whether the command was triggered by a message.
2842
3073
  */
2843
- setCommandRunner(fn) {
2844
- var _a, _b;
2845
- (_b = (_a = this.config.customArgs) == null ? void 0 : _a.setCommandRunner) == null ? void 0 : _b.call(_a, fn);
2846
- }
2847
- };
2848
- _cancel = new WeakMap();
2849
- __name(_MiddlewareContext, "MiddlewareContext");
2850
- MiddlewareContext = _MiddlewareContext;
2851
- }
2852
- });
2853
-
2854
- // src/utils/resolve-file-url.ts
2855
- function toFileURL(filePath, withTs = false) {
2856
- const resolvedPath = import_path.default.resolve(filePath);
2857
- return `${"file://" + resolvedPath.replace(/\\\\|\\/g, "/")}${withTs ? `?ts=${Date.now()}` : ""}`;
2858
- }
2859
- var import_path;
2860
- var init_resolve_file_url = __esm({
2861
- "src/utils/resolve-file-url.ts"() {
2862
- "use strict";
2863
- init_cjs_shims();
2864
- import_path = __toESM(require("path"));
2865
- __name(toFileURL, "toFileURL");
2866
- }
2867
- });
2868
-
2869
- // src/app/commands/MessageCommandParser.ts
2870
- var import_discord8, _parsed, _options, _args, _MessageCommandParser, MessageCommandParser, _MessageCommandOptions, MessageCommandOptions;
2871
- var init_MessageCommandParser = __esm({
2872
- "src/app/commands/MessageCommandParser.ts"() {
2873
- "use strict";
2874
- init_cjs_shims();
2875
- import_discord8 = require("discord.js");
2876
- init_error_codes();
2877
- _MessageCommandParser = class _MessageCommandParser {
2878
- constructor(message, prefix, schema) {
2879
- this.message = message;
2880
- this.prefix = prefix;
2881
- this.schema = schema;
2882
- __privateAdd(this, _parsed, null);
2883
- __privateAdd(this, _options, null);
2884
- __privateAdd(this, _args, []);
2885
- }
2886
- getArgs() {
2887
- void this.parse();
2888
- return __privateGet(this, _args);
3074
+ isMessage() {
3075
+ return this.executionMode === CommandExecutionMode.Message;
2889
3076
  }
2890
- get options() {
2891
- if (!__privateGet(this, _options)) {
2892
- __privateSet(this, _options, new MessageCommandOptions(this));
3077
+ /**
3078
+ * Returns the command identifier.
3079
+ */
3080
+ getCommandIdentifier() {
3081
+ if (this.isInteraction()) {
3082
+ return this.interaction.commandName;
3083
+ } else {
3084
+ return this.message.content.split(" ")[0].slice(1);
2893
3085
  }
2894
- return __privateGet(this, _options);
2895
3086
  }
2896
- getOption(name) {
3087
+ /**
3088
+ * Returns the locale of the guild where this command was triggered.
3089
+ */
3090
+ getGuildLocale() {
2897
3091
  var _a;
2898
- return (_a = this.parse().options.find((o) => o.name === name)) == null ? void 0 : _a.value;
2899
- }
2900
- getCommand() {
2901
- return this.parse().command;
2902
- }
2903
- getSubcommand() {
2904
- return this.parse().subcommand;
2905
- }
2906
- getSubcommandGroup() {
2907
- return this.parse().subcommandGroup;
2908
- }
2909
- getPrefix() {
2910
- for (const p of this.prefix) {
2911
- if (this.message.content.startsWith(p)) {
2912
- return p;
2913
- }
3092
+ if (this.isInteraction()) {
3093
+ return this.interaction.guildLocale;
3094
+ } else {
3095
+ return ((_a = this.message.guild) == null ? void 0 : _a.preferredLocale) ?? null;
2914
3096
  }
2915
3097
  }
2916
- getFullCommand() {
2917
- return [this.getCommand(), this.getSubcommandGroup(), this.getSubcommand()].filter((v) => v).join(" ");
2918
- }
2919
- parse() {
2920
- if (__privateGet(this, _parsed)) {
2921
- return __privateGet(this, _parsed);
2922
- }
2923
- const content = this.message.content;
2924
- const prefix = this.getPrefix();
2925
- if (!prefix) {
2926
- throw createCommandKitError(CommandKitErrorCodes.InvalidCommandPrefix);
2927
- }
2928
- const parts = content.slice(prefix.length).trim().split(" ");
2929
- const command = parts.shift();
2930
- __privateSet(this, _args, parts);
2931
- let subcommandGroup;
2932
- let subcommand;
2933
- if (command == null ? void 0 : command.includes(":")) {
2934
- const [, group, cmd] = command.split(":");
2935
- if (!cmd && group) {
2936
- subcommand = group;
2937
- } else if (cmd && group) {
2938
- subcommandGroup = group;
2939
- subcommand = cmd;
2940
- }
3098
+ /**
3099
+ * Returns the locale of the user who triggered this command.
3100
+ */
3101
+ getUserLocale() {
3102
+ if (this.isInteraction()) {
3103
+ return this.interaction.locale;
3104
+ } else {
3105
+ return null;
2941
3106
  }
2942
- const schema = this.schema(
2943
- [command, subcommandGroup, subcommand].filter(Boolean).join(" ").trim()
2944
- );
2945
- const options = parts.map((part) => {
2946
- try {
2947
- const [name, value] = part.split(":");
2948
- if (!(name in schema)) return null;
2949
- switch (schema[name]) {
2950
- case import_discord8.ApplicationCommandOptionType.Boolean:
2951
- return { name, value: value === "true" };
2952
- case import_discord8.ApplicationCommandOptionType.Integer:
2953
- return { name, value: parseInt(value, 10) };
2954
- case import_discord8.ApplicationCommandOptionType.Number:
2955
- return { name, value: parseFloat(value) };
2956
- case import_discord8.ApplicationCommandOptionType.String:
2957
- return { name, value };
2958
- case import_discord8.ApplicationCommandOptionType.User:
2959
- return {
2960
- name,
2961
- value: this.message.mentions.users.find((u) => {
2962
- return u.id === value.replace(/[<@!>]/g, "");
2963
- })
2964
- };
2965
- case import_discord8.ApplicationCommandOptionType.Channel:
2966
- return {
2967
- name,
2968
- value: this.message.mentions.channels.find((c) => {
2969
- return c.id === value.replace(/[<#>]/g, "");
2970
- })
2971
- };
2972
- case import_discord8.ApplicationCommandOptionType.Role:
2973
- return {
2974
- name,
2975
- value: this.message.mentions.roles.find((r) => {
2976
- return r.id === value.replace(/[<@&>]/g, "");
2977
- })
2978
- };
2979
- case import_discord8.ApplicationCommandOptionType.Attachment:
2980
- return {
2981
- name,
2982
- value: this.message.attachments.find((a) => {
2983
- return a.name === value;
2984
- })
2985
- };
2986
- default:
2987
- return null;
2988
- }
2989
- } catch {
2990
- return null;
2991
- }
2992
- }).filter((v) => v !== null);
2993
- __privateSet(this, _parsed, {
2994
- command,
2995
- options,
2996
- subcommand,
2997
- subcommandGroup
2998
- });
2999
- return __privateGet(this, _parsed);
3000
- }
3001
- };
3002
- _parsed = new WeakMap();
3003
- _options = new WeakMap();
3004
- _args = new WeakMap();
3005
- __name(_MessageCommandParser, "MessageCommandParser");
3006
- MessageCommandParser = _MessageCommandParser;
3007
- _MessageCommandOptions = class _MessageCommandOptions {
3008
- constructor(parser2) {
3009
- this.parser = parser2;
3010
3107
  }
3011
- assertOption(name, required = false) {
3012
- const option = this.parser.getOption(name);
3013
- if (required && option === void 0) {
3014
- throw new Error(`Option "${name}" is required.`);
3108
+ /**
3109
+ * Returns the locale for this command.
3110
+ * @param preferUser Whether to prefer the user's locale over the guild's locale.
3111
+ * @returns The locale for this command. If no locale is found, the default locale is returned.
3112
+ */
3113
+ getLocale(preferUser = false) {
3114
+ if (this._locale) return this._locale;
3115
+ const locale = preferUser ? this.getUserLocale() : this.getGuildLocale();
3116
+ if (!locale) {
3117
+ return this.commandkit.config.defaultLocale;
3015
3118
  }
3016
- return option ?? null;
3119
+ return locale;
3017
3120
  }
3018
- getMember(name, required = false) {
3019
- var _a;
3020
- const user = this.assertOption(name, required);
3021
- const member = (_a = this.parser.message.guild) == null ? void 0 : _a.members.cache.get(user == null ? void 0 : user.id);
3022
- if (required && !member) {
3023
- throw new Error(`Member "${name}" is required.`);
3024
- }
3025
- return member ?? null;
3121
+ /**
3122
+ * Sets the locale for this command.
3123
+ * @param locale The locale to set.
3124
+ */
3125
+ setLocale(locale) {
3126
+ this._locale = locale;
3026
3127
  }
3027
- getAttachment(name, required = false) {
3028
- return this.assertOption(name, required);
3128
+ /**
3129
+ * Returns the i18n api for this command.
3130
+ * @param locale The locale to use for the i18n api.
3131
+ */
3132
+ locale(locale) {
3133
+ const selectedLocale = locale ?? this.getLocale();
3134
+ return new Localization(this.commandkit, {
3135
+ locale: selectedLocale,
3136
+ target: this.getCommandIdentifier()
3137
+ });
3138
+ }
3139
+ /**
3140
+ * Creates a clone of this context
3141
+ */
3142
+ clone(config) {
3143
+ if (!config) return new _Context(this.commandkit, this.config);
3144
+ const ctx = new _Context(this.commandkit, {
3145
+ ...this.config,
3146
+ ...config,
3147
+ store: __privateGet(this, _store)
3148
+ });
3149
+ return ctx;
3029
3150
  }
3030
- getBoolean(name, required = false) {
3031
- return this.assertOption(name, required);
3151
+ isMiddleware() {
3152
+ return this instanceof MiddlewareContext;
3032
3153
  }
3033
- getNumber(name, required = false) {
3034
- return this.assertOption(name, required);
3154
+ args() {
3155
+ if (this.isMessage()) {
3156
+ return this.config.messageCommandParser.getArgs();
3157
+ }
3158
+ return [];
3035
3159
  }
3036
- getString(name, required = false) {
3037
- return this.assertOption(name, required);
3160
+ /**
3161
+ * Stops upcoming middleware or current command execution.
3162
+ * If this is called inside pre-stage middleware, the next run will be the actual command, skipping all other pre-stage middlewares.
3163
+ * If this is called inside a command itself, it will skip all post-stage middlewares.
3164
+ * If this is called inside post-stage middleware, it will skip all other post-stage middlewares.
3165
+ */
3166
+ exit() {
3167
+ exitMiddleware();
3038
3168
  }
3039
- getInteger(name, required = false) {
3040
- return this.assertOption(name, required);
3169
+ /**
3170
+ * Defers the given function to be executed after this command's execution.
3171
+ * @param fn The function to defer.
3172
+ * @returns A unique identifier for the deferred function.
3173
+ */
3174
+ defer(fn) {
3175
+ return afterCommand(fn);
3041
3176
  }
3042
- getUser(name, required = false) {
3043
- return this.assertOption(name, required);
3177
+ /**
3178
+ * Cancels the deferred function with the given identifier.
3179
+ * @param id The identifier of the deferred function.
3180
+ */
3181
+ cancelDeferred(id) {
3182
+ cancelAfterCommand(id);
3044
3183
  }
3045
- getChannel(name, required = false) {
3046
- return this.assertOption(name, required);
3184
+ /**
3185
+ * Validates if the given function is a cached function.
3186
+ * @param fn The function to validate.
3187
+ */
3188
+ isCached(fn) {
3189
+ return isCachedFunction(fn);
3047
3190
  }
3048
- getRole(name, required = false) {
3049
- return this.assertOption(name, required);
3191
+ };
3192
+ _store = new WeakMap();
3193
+ __name(_Context, "Context");
3194
+ Context = _Context;
3195
+ _MiddlewareContext = class _MiddlewareContext extends Context {
3196
+ constructor() {
3197
+ super(...arguments);
3198
+ __privateAdd(this, _cancel, false);
3050
3199
  }
3051
- getMentionable(name, required = false) {
3052
- const target = this.assertOption(name, required);
3053
- if (target instanceof import_discord8.GuildMember || target instanceof import_discord8.User || target instanceof import_discord8.Role) {
3054
- return target;
3055
- }
3056
- if (required) {
3057
- throw new Error(`Mentionable "${name}" is required.`);
3058
- }
3059
- return null;
3200
+ /**
3201
+ * Whether the command execution was cancelled.
3202
+ */
3203
+ get cancelled() {
3204
+ return __privateGet(this, _cancel);
3060
3205
  }
3061
- getSubcommand(required = false) {
3062
- const sub = this.parser.getSubcommand();
3063
- if (required && sub === void 0) {
3064
- throw new Error("Subcommand is required.");
3065
- }
3066
- return sub ?? null;
3206
+ /**
3207
+ * Cancels the command execution.
3208
+ */
3209
+ cancel() {
3210
+ __privateSet(this, _cancel, true);
3067
3211
  }
3068
- getSubcommandGroup(required = false) {
3069
- const sub = this.parser.getSubcommandGroup();
3070
- if (required && sub === void 0) {
3071
- throw new Error("Subcommand group is required.");
3072
- }
3073
- return sub ?? null;
3212
+ /**
3213
+ * Sets command runner function to wrap the command execution.
3214
+ * @param fn The function to set.
3215
+ * @example ctx.setCommandRunner(async (execute) => {
3216
+ * // do something before command execution
3217
+ * await execute();
3218
+ * // do something after command execution
3219
+ * })
3220
+ */
3221
+ setCommandRunner(fn) {
3222
+ var _a, _b;
3223
+ (_b = (_a = this.config.customArgs) == null ? void 0 : _a.setCommandRunner) == null ? void 0 : _b.call(_a, fn);
3074
3224
  }
3075
3225
  };
3076
- __name(_MessageCommandOptions, "MessageCommandOptions");
3077
- MessageCommandOptions = _MessageCommandOptions;
3226
+ _cancel = new WeakMap();
3227
+ __name(_MiddlewareContext, "MiddlewareContext");
3228
+ MiddlewareContext = _MiddlewareContext;
3078
3229
  }
3079
3230
  });
3080
3231
 
3081
- // src/app/register/CommandRegistrar.ts
3082
- var import_discord9, _CommandRegistrar, CommandRegistrar;
3083
- var init_CommandRegistrar = __esm({
3084
- "src/app/register/CommandRegistrar.ts"() {
3232
+ // src/app/commands/AppCommandRunner.ts
3233
+ var import_discord10, _AppCommandRunner_instances, finalizer_fn, _AppCommandRunner, AppCommandRunner;
3234
+ var init_AppCommandRunner = __esm({
3235
+ "src/app/commands/AppCommandRunner.ts"() {
3085
3236
  "use strict";
3086
3237
  init_cjs_shims();
3087
- import_discord9 = require("discord.js");
3238
+ import_discord10 = require("discord.js");
3239
+ init_environment();
3088
3240
  init_Logger();
3089
- _CommandRegistrar = class _CommandRegistrar {
3090
- /**
3091
- * Creates an instance of CommandRegistrar.
3092
- * @param commandkit The commandkit instance.
3093
- */
3094
- constructor(commandkit2) {
3095
- this.commandkit = commandkit2;
3096
- this.api.setToken(
3097
- this.commandkit.client.token ?? process.env.DISCORD_TOKEN ?? process.env.TOKEN ?? ""
3098
- );
3099
- }
3100
- api = new import_discord9.REST();
3101
- /**
3102
- * Gets the commands data.
3103
- */
3104
- getCommandsData() {
3105
- const handler = this.commandkit.commandHandler;
3106
- const commands = handler.getCommandsArray();
3107
- return commands.flatMap((cmd) => {
3108
- var _a;
3109
- const json = "toJSON" in cmd.data.command ? cmd.data.command.toJSON() : cmd.data.command;
3110
- if (((_a = cmd.command.subcommands) == null ? void 0 : _a.length) > 0 && (!json.type || json.type === import_discord9.ApplicationCommandType.ChatInput)) {
3111
- this.processSubcommands(json, cmd.command.subcommands);
3112
- }
3113
- const collections = [json];
3114
- if (cmd.data.userContextMenu && json.type !== import_discord9.ApplicationCommandType.User) {
3115
- collections.push({
3116
- ...json,
3117
- type: import_discord9.ApplicationCommandType.User,
3118
- options: void 0,
3119
- description_localizations: void 0,
3120
- // @ts-ignore
3121
- description: void 0
3122
- });
3123
- }
3124
- if (cmd.data.messageContextMenu && json.type !== import_discord9.ApplicationCommandType.Message) {
3125
- collections.push({
3126
- ...json,
3127
- type: import_discord9.ApplicationCommandType.Message,
3128
- description_localizations: void 0,
3129
- // @ts-ignore
3130
- description: void 0,
3131
- options: void 0
3132
- });
3133
- }
3134
- return collections;
3135
- });
3241
+ init_Context();
3242
+ init_async_context();
3243
+ _AppCommandRunner = class _AppCommandRunner {
3244
+ constructor(handler) {
3245
+ this.handler = handler;
3246
+ __privateAdd(this, _AppCommandRunner_instances);
3136
3247
  }
3137
- /**
3138
- * Process and merge subcommands into the parent command's options
3139
- */
3140
- processSubcommands(commandData, subcommands) {
3141
- var _a, _b, _c;
3142
- if (!commandData.options) {
3143
- commandData.options = [];
3248
+ async runCommand(prepared, source) {
3249
+ if (source instanceof import_discord10.Message && (source.editedTimestamp || source.partial)) {
3250
+ return;
3144
3251
  }
3145
- const groupedSubcommands = /* @__PURE__ */ new Map();
3146
- for (const subcommand of subcommands) {
3147
- const group = subcommand.group || null;
3148
- if (!groupedSubcommands.has(group)) {
3149
- groupedSubcommands.set(group, []);
3252
+ const { commandkit: commandkit2 } = this.handler;
3253
+ const executionMode = this.getExecutionMode(source);
3254
+ let runCommand = null;
3255
+ const env = new CommandKitEnvironment(commandkit2);
3256
+ env.setType("COMMAND_HANDLER" /* CommandHandler */);
3257
+ env.variables.set("commandHandlerType", "app");
3258
+ env.variables.set("currentCommandName", prepared.command.command.name);
3259
+ env.variables.set("execHandlerKind", executionMode);
3260
+ const ctx = new MiddlewareContext(commandkit2, {
3261
+ environment: env,
3262
+ executionMode,
3263
+ interaction: !(source instanceof import_discord10.Message) ? source : null,
3264
+ message: source instanceof import_discord10.Message ? source : null,
3265
+ forwarded: false,
3266
+ customArgs: {
3267
+ setCommandRunner: /* @__PURE__ */ __name((fn2) => {
3268
+ runCommand = fn2;
3269
+ }, "setCommandRunner")
3150
3270
  }
3151
- (_a = groupedSubcommands.get(group)) == null ? void 0 : _a.push(subcommand);
3271
+ });
3272
+ for (const middleware of prepared.middlewares) {
3273
+ await middleware.data.beforeExecute(ctx);
3152
3274
  }
3153
- const directSubcommands = groupedSubcommands.get(null) || [];
3154
- for (const subcommand of directSubcommands) {
3155
- const subcommandData = this.commandkit.commandHandler.getSubcommandData(
3156
- subcommand.command,
3157
- subcommand.name
3275
+ const targetData = prepared.command.data;
3276
+ const fn = targetData[executionMode];
3277
+ if (!fn) {
3278
+ Logger.warn(
3279
+ `Command ${prepared.command.command.name} has no handler for ${executionMode}`
3158
3280
  );
3159
- if (subcommandData) {
3160
- const subcommandOption = {
3161
- type: import_discord9.ApplicationCommandOptionType.Subcommand,
3162
- name: subcommand.name,
3163
- description: subcommandData.description || "No description provided",
3164
- options: subcommandData.options || [],
3165
- name_localizations: subcommandData.name_localizations,
3166
- description_localizations: subcommandData.description_localizations
3167
- };
3168
- commandData.options.push(subcommandOption);
3169
- }
3170
3281
  }
3171
- for (const [groupName, groupSubcommands] of groupedSubcommands.entries()) {
3172
- if (groupName === null) continue;
3173
- const subcommandGroupOption = {
3174
- type: import_discord9.ApplicationCommandOptionType.SubcommandGroup,
3175
- name: groupName,
3176
- description: `${groupName} commands`,
3177
- options: []
3178
- };
3179
- for (const subcommand of groupSubcommands) {
3180
- const subcommandData = this.commandkit.commandHandler.getSubcommandData(
3181
- subcommand.command,
3182
- subcommand.name
3282
+ if (fn) {
3283
+ try {
3284
+ const _executeCommand = makeContextAwareFunction(
3285
+ env,
3286
+ async () => {
3287
+ afterCommand((env2) => {
3288
+ const error = env2.getExecutionError();
3289
+ const marker = env2.getMarker();
3290
+ const time = `${env2.getExecutionTime().toFixed(2)}ms`;
3291
+ if (error) {
3292
+ Logger.error(
3293
+ `[${marker} - ${time}] Error executing command: ${error.stack || error}`
3294
+ );
3295
+ return;
3296
+ }
3297
+ Logger.info(
3298
+ `[${marker} - ${time}] Command executed successfully`
3299
+ );
3300
+ });
3301
+ return fn(ctx.clone());
3302
+ },
3303
+ __privateMethod(this, _AppCommandRunner_instances, finalizer_fn).bind(this)
3183
3304
  );
3184
- if (subcommandData) {
3185
- (_b = subcommandGroupOption.options) == null ? void 0 : _b.push({
3186
- type: import_discord9.ApplicationCommandOptionType.Subcommand,
3187
- name: subcommand.name,
3188
- description: subcommandData.description || "No description provided",
3189
- options: subcommandData.options || [],
3190
- name_localizations: subcommandData.name_localizations,
3191
- description_localizations: subcommandData.description_localizations
3192
- });
3193
- }
3194
- }
3195
- if ((((_c = subcommandGroupOption.options) == null ? void 0 : _c.length) || 0) > 0) {
3196
- commandData.options.push(subcommandGroupOption);
3197
- }
3198
- }
3199
- }
3200
- /**
3201
- * Registers loaded commands.
3202
- */
3203
- async register() {
3204
- if (!this.commandkit.client.isReady()) {
3205
- throw new Error("Cannot register commands before the client is ready");
3206
- }
3207
- const commands = this.getCommandsData();
3208
- const guildCommands = commands.filter((command) => {
3209
- var _a;
3210
- return (_a = command.guilds) == null ? void 0 : _a.filter(Boolean).length;
3211
- }).map((c) => {
3212
- var _a;
3213
- return {
3214
- ...c,
3215
- guilds: Array.from(new Set((_a = c.guilds) == null ? void 0 : _a.filter(Boolean)))
3216
- };
3217
- });
3218
- const globalCommands = commands.filter(
3219
- (command) => {
3220
- var _a;
3221
- return !((_a = command.guilds) == null ? void 0 : _a.filter(Boolean).length);
3222
- }
3223
- );
3224
- await this.updateGlobalCommands(globalCommands);
3225
- await this.updateGuildCommands(guildCommands);
3226
- }
3227
- /**
3228
- * Updates the global commands.
3229
- */
3230
- async updateGlobalCommands(commands) {
3231
- if (!commands.length) return;
3232
- try {
3233
- const data = await this.api.put(
3234
- import_discord9.Routes.applicationCommands(this.commandkit.client.user.id),
3235
- {
3236
- body: commands.map((c) => ({
3237
- ...c,
3238
- guilds: void 0
3239
- }))
3305
+ const executeCommand = runCommand != null ? runCommand(_executeCommand) : _executeCommand;
3306
+ env.markStart(prepared.command.command.name);
3307
+ const res = await commandkit2.plugins.execute(async (ctx2, plugin) => {
3308
+ return plugin.executeCommand(ctx2, source, prepared, executeCommand);
3309
+ });
3310
+ if (!res) {
3311
+ await executeCommand();
3240
3312
  }
3241
- );
3242
- Logger.info(
3243
- `\u2728 Refreshed ${data.length} global application (/) commands`
3244
- );
3245
- } catch (e) {
3246
- Logger.error("Failed to update global application (/) commands", e);
3313
+ } catch (e) {
3314
+ Logger.error(e);
3315
+ }
3247
3316
  }
3248
- }
3249
- /**
3250
- * Updates the guild commands.
3251
- */
3252
- async updateGuildCommands(commands) {
3253
3317
  try {
3254
- const guildCommandsMap = /* @__PURE__ */ new Map();
3255
- commands.forEach((command) => {
3256
- var _a;
3257
- if (!((_a = command.guilds) == null ? void 0 : _a.length)) return;
3258
- command.guilds.forEach((guild) => {
3259
- if (!guildCommandsMap.has(guild)) {
3260
- guildCommandsMap.set(guild, []);
3261
- }
3262
- guildCommandsMap.get(guild).push(command);
3263
- });
3264
- });
3265
- if (!guildCommandsMap.size) return;
3266
- let count = 0;
3267
- for (const [guild, guildCommands] of guildCommandsMap) {
3268
- const data = await this.api.put(
3269
- import_discord9.Routes.applicationGuildCommands(
3270
- this.commandkit.client.user.id,
3271
- guild
3272
- ),
3273
- {
3274
- body: guildCommands.map((b) => ({
3275
- ...b,
3276
- guilds: void 0
3277
- }))
3278
- }
3279
- );
3280
- count += data.length;
3318
+ for (const middleware of prepared.middlewares) {
3319
+ await middleware.data.afterExecute(ctx);
3281
3320
  }
3282
- Logger.info(`\u2728 Refreshed ${count} guild application (/) commands`);
3283
- } catch (e) {
3284
- Logger.error("Failed to update guild application (/) commands", e);
3321
+ } finally {
3322
+ env.markEnd();
3323
+ }
3324
+ }
3325
+ getExecutionMode(source) {
3326
+ if (source instanceof import_discord10.Message) return CommandExecutionMode.Message;
3327
+ if (source.isChatInputCommand()) return CommandExecutionMode.SlashCommand;
3328
+ if (source.isAutocomplete()) {
3329
+ return CommandExecutionMode.Autocomplete;
3285
3330
  }
3331
+ if (source.isMessageContextMenuCommand()) {
3332
+ return CommandExecutionMode.MessageContextMenu;
3333
+ }
3334
+ if (source.isUserContextMenuCommand()) {
3335
+ return CommandExecutionMode.UserContextMenu;
3336
+ }
3337
+ return null;
3286
3338
  }
3287
3339
  };
3288
- __name(_CommandRegistrar, "CommandRegistrar");
3289
- CommandRegistrar = _CommandRegistrar;
3340
+ _AppCommandRunner_instances = new WeakSet();
3341
+ finalizer_fn = /* @__PURE__ */ __name(async function() {
3342
+ const env = useEnvironment();
3343
+ await env.runDeferredFunctions();
3344
+ env.clearAllDeferredFunctions();
3345
+ }, "#finalizer");
3346
+ __name(_AppCommandRunner, "AppCommandRunner");
3347
+ AppCommandRunner = _AppCommandRunner;
3290
3348
  }
3291
3349
  });
3292
3350
 
3293
3351
  // src/app/handlers/AppCommandHandler.ts
3294
- var import_discord10, commandDataSchema, middlewareDataSchema, _AppCommandHandler_instances, finalizer_fn, _AppCommandHandler, AppCommandHandler;
3352
+ var import_discord11, commandDataSchema, middlewareDataSchema, _AppCommandHandler, AppCommandHandler;
3295
3353
  var init_AppCommandHandler = __esm({
3296
3354
  "src/app/handlers/AppCommandHandler.ts"() {
3297
3355
  "use strict";
3298
3356
  init_cjs_shims();
3299
- import_discord10 = require("discord.js");
3300
- init_Context();
3357
+ import_discord11 = require("discord.js");
3301
3358
  init_resolve_file_url();
3302
3359
  init_MessageCommandParser();
3303
3360
  init_error_codes();
3304
3361
  init_CommandRegistrar();
3305
- init_async_context();
3306
3362
  init_Logger();
3307
- init_environment();
3363
+ init_AppCommandRunner();
3308
3364
  commandDataSchema = {
3309
- command: /* @__PURE__ */ __name((c) => c instanceof import_discord10.SlashCommandBuilder || c instanceof import_discord10.ContextMenuCommandBuilder || c && typeof c === "object", "command"),
3365
+ command: /* @__PURE__ */ __name((c) => c instanceof import_discord11.SlashCommandBuilder || c instanceof import_discord11.ContextMenuCommandBuilder || c && typeof c === "object", "command"),
3310
3366
  chatInput: /* @__PURE__ */ __name((c) => typeof c === "function", "chatInput"),
3311
3367
  autocomplete: /* @__PURE__ */ __name((c) => typeof c === "function", "autocomplete"),
3312
3368
  message: /* @__PURE__ */ __name((c) => typeof c === "function", "message"),
@@ -3320,33 +3376,21 @@ var init_AppCommandHandler = __esm({
3320
3376
  _AppCommandHandler = class _AppCommandHandler {
3321
3377
  constructor(commandkit2) {
3322
3378
  this.commandkit = commandkit2;
3323
- __privateAdd(this, _AppCommandHandler_instances);
3324
- __publicField(this, "loadedCommands", new import_discord10.Collection());
3325
- __publicField(this, "loadedSubCommands", new import_discord10.Collection());
3326
- __publicField(this, "loadedMiddlewares", new import_discord10.Collection());
3327
- // Name-to-ID mapping for easier lookup
3328
- __publicField(this, "commandNameToId", /* @__PURE__ */ new Map());
3329
- __publicField(this, "subcommandPathToId", /* @__PURE__ */ new Map());
3330
- __publicField(this, "registrar");
3331
- __publicField(this, "onInteraction", null);
3332
- __publicField(this, "onMessageCreate", null);
3333
- __publicField(this, "onMessageUpdate", null);
3334
3379
  this.registrar = new CommandRegistrar(this.commandkit);
3335
3380
  }
3381
+ loadedCommands = new import_discord11.Collection();
3382
+ loadedMiddlewares = new import_discord11.Collection();
3383
+ // Name-to-ID mapping for easier lookup
3384
+ commandNameToId = /* @__PURE__ */ new Map();
3385
+ subcommandPathToId = /* @__PURE__ */ new Map();
3386
+ registrar;
3387
+ onInteraction = null;
3388
+ onMessageCreate = null;
3389
+ onMessageUpdate = null;
3390
+ commandRunner = new AppCommandRunner(this);
3336
3391
  getCommandsArray() {
3337
3392
  return Array.from(this.loadedCommands.values());
3338
3393
  }
3339
- /**
3340
- * Get subcommand data by command ID and subcommand name
3341
- */
3342
- getSubcommandData(commandId, subcommandName) {
3343
- const subcommand = Array.from(this.loadedSubCommands.values()).find(
3344
- (sub) => sub.subcommand.command === commandId && sub.subcommand.name === subcommandName
3345
- );
3346
- if (!subcommand) return null;
3347
- const commandData = subcommand.data.command;
3348
- return "toJSON" in commandData ? commandData.toJSON() : commandData;
3349
- }
3350
3394
  registerCommandHandler() {
3351
3395
  this.onInteraction ??= async (interaction) => {
3352
3396
  const success = await this.commandkit.plugins.execute(
@@ -3359,7 +3403,7 @@ var init_AppCommandHandler = __esm({
3359
3403
  if (!isCommandLike) return;
3360
3404
  const prepared = await this.prepareCommandRun(interaction);
3361
3405
  if (!prepared) return;
3362
- return this.runCommand(prepared, interaction);
3406
+ return this.commandRunner.runCommand(prepared, interaction);
3363
3407
  };
3364
3408
  this.onMessageCreate ??= async (message) => {
3365
3409
  const success = await this.commandkit.plugins.execute(
@@ -3371,7 +3415,7 @@ var init_AppCommandHandler = __esm({
3371
3415
  if (message.author.bot) return;
3372
3416
  const prepared = await this.prepareCommandRun(message);
3373
3417
  if (!prepared) return;
3374
- return this.runCommand(prepared, message);
3418
+ return this.commandRunner.runCommand(prepared, message);
3375
3419
  };
3376
3420
  this.onMessageUpdate ??= async (oldMessage, newMessage) => {
3377
3421
  const success = await this.commandkit.plugins.execute(
@@ -3388,107 +3432,17 @@ var init_AppCommandHandler = __esm({
3388
3432
  if (oldMessage.author.bot) return;
3389
3433
  const prepared = await this.prepareCommandRun(newMessage);
3390
3434
  if (!prepared) return;
3391
- return this.runCommand(prepared, newMessage);
3435
+ return this.commandRunner.runCommand(prepared, newMessage);
3392
3436
  };
3393
- this.commandkit.client.on(import_discord10.Events.InteractionCreate, this.onInteraction);
3394
- this.commandkit.client.on(import_discord10.Events.MessageCreate, this.onMessageCreate);
3395
- this.commandkit.client.on(import_discord10.Events.MessageUpdate, this.onMessageUpdate);
3396
- }
3397
- getExecutionMode(source) {
3398
- if (source instanceof import_discord10.Message) return CommandExecutionMode.Message;
3399
- if (source.isChatInputCommand()) return CommandExecutionMode.SlashCommand;
3400
- if (source.isAutocomplete()) {
3401
- return CommandExecutionMode.Autocomplete;
3402
- }
3403
- if (source.isMessageContextMenuCommand()) {
3404
- return CommandExecutionMode.MessageContextMenu;
3405
- }
3406
- if (source.isUserContextMenuCommand()) {
3407
- return CommandExecutionMode.UserContextMenu;
3408
- }
3409
- return null;
3410
- }
3411
- async runCommand(prepared, source) {
3412
- if (source instanceof import_discord10.Message && (source.editedTimestamp || source.partial)) {
3413
- return;
3414
- }
3415
- const executionMode = this.getExecutionMode(source);
3416
- let runCommand = null;
3417
- const env = new CommandKitEnvironment(this.commandkit);
3418
- env.setType("COMMAND_HANDLER" /* CommandHandler */);
3419
- env.variables.set("commandHandlerType", "app");
3420
- env.variables.set("currentCommandName", prepared.command.command.name);
3421
- env.variables.set("execHandlerKind", executionMode);
3422
- const ctx = new MiddlewareContext(this.commandkit, {
3423
- environment: env,
3424
- executionMode,
3425
- interaction: !(source instanceof import_discord10.Message) ? source : null,
3426
- message: source instanceof import_discord10.Message ? source : null,
3427
- forwarded: false,
3428
- customArgs: {
3429
- setCommandRunner: /* @__PURE__ */ __name((fn2) => {
3430
- runCommand = fn2;
3431
- }, "setCommandRunner")
3432
- }
3433
- });
3434
- for (const middleware of prepared.middlewares) {
3435
- await middleware.data.beforeExecute(ctx);
3436
- }
3437
- const targetData = prepared.subcommand ? prepared.subcommand.data : prepared.command.data;
3438
- const fn = targetData[executionMode];
3439
- if (!fn) {
3440
- Logger.warn(
3441
- `Command ${prepared.command.command.name}${prepared.subcommand ? "/" + prepared.subcommand.subcommand.name : ""} has no handler for ${executionMode}`
3442
- );
3443
- }
3444
- if (fn) {
3445
- try {
3446
- const _executeCommand = makeContextAwareFunction(
3447
- env,
3448
- async () => fn(ctx.clone()),
3449
- __privateMethod(this, _AppCommandHandler_instances, finalizer_fn).bind(this)
3450
- );
3451
- const executeCommand = runCommand != null ? runCommand(_executeCommand) : _executeCommand;
3452
- afterCommand((env2) => {
3453
- const error = env2.getExecutionError();
3454
- const marker = env2.getMarker();
3455
- const time = `${env2.getExecutionTime().toFixed(2)}ms`;
3456
- if (error) {
3457
- Logger.error(
3458
- `[${marker} - ${time}] Error executing command: ${error.stack || error}`
3459
- );
3460
- return;
3461
- }
3462
- Logger.info(`[${marker} - ${time}] Command executed successfully`);
3463
- });
3464
- env.markStart(prepared.command.command.name);
3465
- const res = await this.commandkit.plugins.execute(
3466
- async (ctx2, plugin) => {
3467
- return plugin.executeCommand(ctx2, source, prepared, executeCommand);
3468
- }
3469
- );
3470
- if (!res) {
3471
- await executeCommand();
3472
- }
3473
- } catch (e) {
3474
- Logger.error(e);
3475
- }
3476
- }
3477
- try {
3478
- for (const middleware of prepared.middlewares) {
3479
- await middleware.data.afterExecute(ctx);
3480
- }
3481
- } finally {
3482
- env.markEnd();
3483
- }
3437
+ this.commandkit.client.on(import_discord11.Events.InteractionCreate, this.onInteraction);
3438
+ this.commandkit.client.on(import_discord11.Events.MessageCreate, this.onMessageCreate);
3439
+ this.commandkit.client.on(import_discord11.Events.MessageUpdate, this.onMessageUpdate);
3484
3440
  }
3485
3441
  async prepareCommandRun(source) {
3486
3442
  var _a;
3487
3443
  let cmdName;
3488
- let subcommandGroupName = null;
3489
- let subcommandName = null;
3490
3444
  let parser2;
3491
- if (source instanceof import_discord10.Message) {
3445
+ if (source instanceof import_discord11.Message) {
3492
3446
  if (source.author.bot) return null;
3493
3447
  const prefix = await this.commandkit.config.getMessageCommandPrefix(source);
3494
3448
  parser2 = new MessageCommandParser(
@@ -3517,14 +3471,6 @@ var init_AppCommandHandler = __esm({
3517
3471
  const fullCommand = parser2.getFullCommand();
3518
3472
  const parts = fullCommand.split(" ");
3519
3473
  cmdName = parts[0];
3520
- if (parts.length > 1) {
3521
- if (parts.length === 3) {
3522
- subcommandGroupName = parts[1];
3523
- subcommandName = parts[2];
3524
- } else {
3525
- subcommandName = parts[1];
3526
- }
3527
- }
3528
3474
  } catch (e) {
3529
3475
  if (isErrorType(e, CommandKitErrorCodes.InvalidCommandPrefix)) {
3530
3476
  return null;
@@ -3535,31 +3481,16 @@ var init_AppCommandHandler = __esm({
3535
3481
  } else {
3536
3482
  if (!source.isCommand()) return null;
3537
3483
  cmdName = source.commandName;
3538
- if (source.isChatInputCommand()) {
3539
- subcommandGroupName = source.options.getSubcommandGroup(false);
3540
- subcommandName = source.options.getSubcommand(false);
3541
- }
3542
3484
  }
3543
3485
  const commandId = this.commandNameToId.get(cmdName);
3544
3486
  if (!commandId) return null;
3545
3487
  const loadedCommand = this.loadedCommands.get(commandId);
3546
3488
  if (!loadedCommand) return null;
3547
- if (source instanceof import_discord10.CommandInteraction && source.guildId && ((_a = loadedCommand.guilds) == null ? void 0 : _a.length) && !loadedCommand.guilds.includes(source.guildId)) {
3489
+ if (source instanceof import_discord11.CommandInteraction && source.guildId && ((_a = loadedCommand.guilds) == null ? void 0 : _a.length) && !loadedCommand.guilds.includes(source.guildId)) {
3548
3490
  return null;
3549
3491
  }
3550
- let loadedSubCommand = null;
3551
- if (subcommandName) {
3552
- let subcommandPath = `${loadedCommand.command.id}/${subcommandName}`;
3553
- if (subcommandGroupName) {
3554
- subcommandPath = `${loadedCommand.command.id}/${subcommandGroupName}/${subcommandName}`;
3555
- }
3556
- const subCommandId = this.subcommandPathToId.get(subcommandPath);
3557
- if (subCommandId) {
3558
- loadedSubCommand = this.loadedSubCommands.get(subCommandId) || null;
3559
- }
3560
- }
3561
3492
  const middlewares = [];
3562
- for (const middlewareId of loadedCommand.command.middlewareIds) {
3493
+ for (const middlewareId of loadedCommand.command.middlewares) {
3563
3494
  const middleware = this.loadedMiddlewares.get(middlewareId);
3564
3495
  if (middleware) {
3565
3496
  middlewares.push(middleware);
@@ -3567,14 +3498,12 @@ var init_AppCommandHandler = __esm({
3567
3498
  }
3568
3499
  return {
3569
3500
  command: loadedCommand,
3570
- subcommand: loadedSubCommand,
3571
3501
  middlewares,
3572
3502
  messageCommandParser: parser2
3573
3503
  };
3574
3504
  }
3575
3505
  async reloadCommands() {
3576
3506
  this.loadedCommands.clear();
3577
- this.loadedSubCommands.clear();
3578
3507
  this.loadedMiddlewares.clear();
3579
3508
  this.commandNameToId.clear();
3580
3509
  this.subcommandPathToId.clear();
@@ -3592,13 +3521,6 @@ var init_AppCommandHandler = __esm({
3592
3521
  for (const [id, command] of commands) {
3593
3522
  await this.loadCommand(id, command);
3594
3523
  }
3595
- for (const loadedCommand of this.loadedCommands.values()) {
3596
- if (loadedCommand.command.subcommands) {
3597
- for (const subcommand of loadedCommand.command.subcommands) {
3598
- await this.loadSubcommand(subcommand);
3599
- }
3600
- }
3601
- }
3602
3524
  }
3603
3525
  async loadMiddleware(id, middleware) {
3604
3526
  try {
@@ -3673,59 +3595,20 @@ var init_AppCommandHandler = __esm({
3673
3595
  Logger.error(`Failed to load command ${command.name} (${id})`, error);
3674
3596
  }
3675
3597
  }
3676
- async loadSubcommand(subcommand) {
3677
- try {
3678
- const data = await import(`${toFileURL(subcommand.path)}?t=${Date.now()}`);
3679
- if (!data.command) {
3680
- throw new Error(
3681
- `Invalid export for subcommand ${subcommand.name}: no command definition found`
3682
- );
3683
- }
3684
- let handlerCount = 0;
3685
- for (const [key, validator] of Object.entries(commandDataSchema)) {
3686
- if (key !== "command" && data[key]) handlerCount++;
3687
- if (data[key] && !await validator(data[key])) {
3688
- throw new Error(
3689
- `Invalid export for subcommand ${subcommand.name}: ${key} does not match expected value`
3690
- );
3691
- }
3692
- }
3693
- if (handlerCount === 0) {
3694
- throw new Error(
3695
- `Invalid export for subcommand ${subcommand.name}: at least one handler function must be provided`
3696
- );
3697
- }
3698
- const localizedCommand = await this.applyLocalizations(
3699
- { ...data.command },
3700
- subcommand
3701
- );
3702
- const subcommandId = subcommand.command + "/" + subcommand.name;
3703
- this.loadedSubCommands.set(subcommandId, {
3704
- subcommand,
3705
- data: {
3706
- ...data,
3707
- command: localizedCommand
3708
- }
3709
- });
3710
- this.subcommandPathToId.set(subcommandId, subcommandId);
3711
- } catch (error) {
3712
- Logger.error(`Failed to load subcommand ${subcommand.name}`, error);
3713
- }
3714
- }
3715
- async applyLocalizations(command, subcommand) {
3598
+ async applyLocalizations(command) {
3716
3599
  var _a, _b, _c, _d, _e;
3717
3600
  const localization = this.commandkit.config.localizationStrategy;
3718
- const validLocales = Object.values(import_discord10.Locale).filter(
3601
+ const validLocales = Object.values(import_discord11.Locale).filter(
3719
3602
  (v) => typeof v === "string"
3720
3603
  );
3721
- const localizationKey = subcommand ? command.name.split("/")[0] : command.name;
3604
+ const localizationKey = command.name;
3722
3605
  for (const locale of validLocales) {
3723
3606
  const translation = await localization.locateTranslation(
3724
3607
  localizationKey,
3725
3608
  locale
3726
3609
  );
3727
3610
  if (!(translation == null ? void 0 : translation.command)) continue;
3728
- if (command instanceof import_discord10.SlashCommandBuilder) {
3611
+ if (command instanceof import_discord11.SlashCommandBuilder) {
3729
3612
  if (translation.command.name) {
3730
3613
  command.setNameLocalization(locale, translation.command.name);
3731
3614
  }
@@ -3742,7 +3625,6 @@ var init_AppCommandHandler = __esm({
3742
3625
  while (o = opt.shift()) {
3743
3626
  (_c = raw.options) == null ? void 0 : _c.forEach((option) => {
3744
3627
  var _a2;
3745
- if (subcommand && option.name !== subcommand.name) return;
3746
3628
  if (option.name === o.ref) {
3747
3629
  if (option.name) {
3748
3630
  option.name_localizations ??= {};
@@ -3772,14 +3654,14 @@ var init_AppCommandHandler = __esm({
3772
3654
  });
3773
3655
  }
3774
3656
  }
3775
- } else if (command instanceof import_discord10.ContextMenuCommandBuilder) {
3657
+ } else if (command instanceof import_discord11.ContextMenuCommandBuilder) {
3776
3658
  if (translation.command.name) {
3777
3659
  command.setNameLocalization(locale, translation.command.name);
3778
3660
  }
3779
3661
  } else {
3780
3662
  command.name_localizations ??= {};
3781
3663
  command.name_localizations[locale] = translation.command.name;
3782
- if (!subcommand && command.description) {
3664
+ if (command.description) {
3783
3665
  command.description_localizations ??= {};
3784
3666
  command.description_localizations[locale] = translation.command.description;
3785
3667
  }
@@ -3789,7 +3671,6 @@ var init_AppCommandHandler = __esm({
3789
3671
  while (o = opt.shift()) {
3790
3672
  command.options.forEach((option) => {
3791
3673
  var _a2;
3792
- if (subcommand && option.name !== subcommand.name) return;
3793
3674
  if (option.name === o.ref) {
3794
3675
  option.name_localizations ??= {};
3795
3676
  option.name_localizations[locale] = o.name;
@@ -3822,50 +3703,70 @@ var init_AppCommandHandler = __esm({
3822
3703
  return command;
3823
3704
  }
3824
3705
  };
3825
- _AppCommandHandler_instances = new WeakSet();
3826
- finalizer_fn = /* @__PURE__ */ __name(async function() {
3827
- const env = useEnvironment();
3828
- await env.runDeferredFunctions();
3829
- env.clearAllDeferredFunctions();
3830
- }, "#finalizer");
3831
3706
  __name(_AppCommandHandler, "AppCommandHandler");
3832
3707
  AppCommandHandler = _AppCommandHandler;
3833
3708
  }
3834
3709
  });
3835
3710
 
3836
3711
  // src/app/router/CommandsRouter.ts
3837
- var import_discord11, import_node_fs3, import_node_crypto3, import_walk, import_node_path3, _CommandsRouter, CommandsRouter;
3712
+ var import_node_fs3, import_promises3, import_node_path3, MIDDLEWARE_PATTERN, COMMAND_PATTERN, CATEGORY_PATTERN, _CommandsRouter, CommandsRouter;
3838
3713
  var init_CommandsRouter = __esm({
3839
3714
  "src/app/router/CommandsRouter.ts"() {
3840
3715
  "use strict";
3841
3716
  init_cjs_shims();
3842
- import_discord11 = require("discord.js");
3843
3717
  import_node_fs3 = require("fs");
3844
- import_node_crypto3 = __toESM(require("crypto"));
3845
- import_walk = __toESM(require("@root/walk"));
3846
- import_node_path3 = __toESM(require("path"));
3718
+ import_promises3 = require("fs/promises");
3719
+ import_node_path3 = require("path");
3720
+ MIDDLEWARE_PATTERN = /^\+middleware\.(m|c)?(j|t)sx?$/;
3721
+ COMMAND_PATTERN = /^(\w+)\.(m|c)?(j|t)sx?$/;
3722
+ CATEGORY_PATTERN = /^\(\w+\)$/;
3847
3723
  _CommandsRouter = class _CommandsRouter {
3848
3724
  constructor(options) {
3849
3725
  this.options = options;
3850
3726
  }
3851
- commands = new import_discord11.Collection();
3852
- middlewares = new import_discord11.Collection();
3853
- fromData(data) {
3854
- this.commands = new import_discord11.Collection(
3855
- Object.entries(data.commands).map(([id, command]) => [id, command])
3856
- );
3857
- this.middlewares = new import_discord11.Collection(
3858
- Object.entries(data.middlewares).map(
3859
- ([id, middleware]) => [
3860
- id,
3861
- middleware
3862
- ]
3863
- )
3864
- );
3727
+ commands = /* @__PURE__ */ new Map();
3728
+ middlewares = /* @__PURE__ */ new Map();
3729
+ populate(data) {
3730
+ for (const [id, command] of Object.entries(data.commands)) {
3731
+ this.commands.set(id, command);
3732
+ }
3733
+ for (const [id, middleware] of Object.entries(data.middlewares)) {
3734
+ this.middlewares.set(id, middleware);
3735
+ }
3865
3736
  }
3866
3737
  isValidPath() {
3867
3738
  return (0, import_node_fs3.existsSync)(this.options.entrypoint);
3868
3739
  }
3740
+ isCommand(name) {
3741
+ return COMMAND_PATTERN.test(name);
3742
+ }
3743
+ isMiddleware(name) {
3744
+ return MIDDLEWARE_PATTERN.test(name);
3745
+ }
3746
+ isCategory(name) {
3747
+ return CATEGORY_PATTERN.test(name);
3748
+ }
3749
+ clear() {
3750
+ this.commands.clear();
3751
+ this.middlewares.clear();
3752
+ }
3753
+ async scan() {
3754
+ const entries = await (0, import_promises3.readdir)(this.options.entrypoint, {
3755
+ withFileTypes: true
3756
+ });
3757
+ for (const entry of entries) {
3758
+ if (entry.name.startsWith("_")) continue;
3759
+ const fullPath = (0, import_node_path3.join)(this.options.entrypoint, entry.name);
3760
+ if (entry.isDirectory()) {
3761
+ const category = this.isCategory(entry.name) ? entry.name.slice(1, -1) : null;
3762
+ await this.traverse(fullPath, category);
3763
+ } else {
3764
+ await this.handle(entry);
3765
+ }
3766
+ }
3767
+ await this.applyMiddlewares();
3768
+ return this.toJSON();
3769
+ }
3869
3770
  getData() {
3870
3771
  return {
3871
3772
  commands: this.commands,
@@ -3878,164 +3779,58 @@ var init_CommandsRouter = __esm({
3878
3779
  middlewares: Object.fromEntries(this.middlewares.entries())
3879
3780
  };
3880
3781
  }
3881
- clear() {
3882
- this.commands.clear();
3883
- this.middlewares.clear();
3884
- }
3885
- reload() {
3886
- this.clear();
3887
- return this.scan();
3888
- }
3889
- async scan() {
3890
- if (!this.isValidPath()) {
3891
- throw new Error("Invalid path");
3892
- }
3893
- await this.traverse();
3894
- this.applyBindings();
3895
- return this.toJSON();
3896
- }
3897
- async traverse() {
3898
- const validFile = /\.(c|m)?(j|t)sx?$/;
3899
- const middleware = /^(\w+\.)?middleware\.(c|m)?(j|t)sx?$/;
3900
- const categoryDir = /^\((\w+)\)$/;
3901
- const isCategory = /* @__PURE__ */ __name((name) => categoryDir.test(name), "isCategory");
3902
- const isMiddleware = /* @__PURE__ */ __name((name) => middleware.test(name), "isMiddleware");
3903
- const isCommand = /* @__PURE__ */ __name((name) => validFile.test(name) && !isMiddleware(name), "isCommand");
3904
- await import_walk.default.walk(
3905
- this.options.entrypoint,
3906
- async (error, pathname, dirent) => {
3907
- if (error) throw error;
3908
- const name = dirent.name;
3909
- if (dirent.isDirectory()) {
3910
- if (isCategory(name) && this.distanceFromRoot(pathname) > 1) {
3911
- throw new Error(
3912
- `Category directories must be at the root. Found "${name}" at "${pathname}"`
3913
- );
3914
- }
3915
- return;
3916
- }
3917
- if (this.distanceFromRoot(pathname, true) > 1) return;
3918
- if (isMiddleware(name)) {
3919
- const middleware2 = {
3920
- id: import_node_crypto3.default.randomUUID(),
3921
- path: pathname,
3922
- relativePath: this.toRelativePath(pathname)
3923
- };
3924
- this.middlewares.set(middleware2.id, middleware2);
3925
- return;
3926
- }
3927
- if (!isCommand(name)) return;
3928
- const command = {
3929
- id: import_node_crypto3.default.randomUUID(),
3930
- name: this.parseFileName(name),
3931
- category: this.parseCategory(pathname),
3932
- middlewareIds: [],
3933
- path: pathname,
3934
- relativePath: this.toRelativePath(pathname),
3935
- subcommands: []
3936
- };
3937
- this.commands.set(command.id, command);
3938
- }
3939
- );
3940
- await import_walk.default.walk(
3941
- this.options.entrypoint,
3942
- async (error, pathname, dirent) => {
3943
- if (error) throw error;
3944
- const name = dirent.name;
3945
- if (dirent.isDirectory()) return;
3946
- if (this.distanceFromRoot(pathname, true) <= 1) return;
3947
- if (isMiddleware(name)) {
3948
- const middleware2 = {
3949
- id: import_node_crypto3.default.randomUUID(),
3950
- path: pathname,
3951
- relativePath: this.toRelativePath(pathname)
3952
- };
3953
- this.middlewares.set(middleware2.id, middleware2);
3954
- return;
3955
- }
3956
- if (!isCommand(name)) return;
3957
- let currentDir = import_node_path3.default.dirname(pathname);
3958
- let parentCommand;
3959
- while (currentDir !== this.options.entrypoint) {
3960
- const dirName = import_node_path3.default.basename(currentDir);
3961
- parentCommand = Array.from(this.commands.values()).find(
3962
- (cmd) => import_node_path3.default.basename(import_node_path3.default.dirname(cmd.path)) === import_node_path3.default.basename(import_node_path3.default.dirname(currentDir)) && this.parseFileName(cmd.path) === dirName
3963
- );
3964
- if (parentCommand) break;
3965
- currentDir = import_node_path3.default.dirname(currentDir);
3966
- }
3967
- if (parentCommand) {
3968
- const subcommand = {
3969
- name: this.parseFileName(name),
3970
- group: this.parseGroup(pathname),
3971
- path: pathname,
3972
- relativePath: this.toRelativePath(pathname),
3973
- command: parentCommand.id
3974
- };
3975
- parentCommand.subcommands.push(subcommand);
3976
- }
3977
- }
3978
- );
3979
- }
3980
- applyBindings() {
3981
- for (const command of this.commands.values()) {
3982
- const commandName = command.name;
3983
- const commandDir = import_node_path3.default.dirname(command.path);
3984
- for (const middleware of this.middlewares.values()) {
3985
- const middlewareDir = import_node_path3.default.dirname(middleware.path);
3986
- const middlewareFileName = import_node_path3.default.basename(middleware.path);
3987
- const isCommandSpecificMiddleware = middlewareFileName.startsWith(
3988
- commandName + "."
3989
- );
3990
- const isSharedMiddleware = middlewareFileName === "middleware.ts" || middlewareFileName === "middleware.js";
3991
- if (isCommandSpecificMiddleware && middlewareFileName.startsWith(commandName + ".")) {
3992
- command.middlewareIds.push(middleware.id);
3993
- continue;
3994
- }
3995
- if (isSharedMiddleware) {
3996
- const relPath = import_node_path3.default.relative(middlewareDir, commandDir);
3997
- if (!relPath.startsWith("..") && !import_node_path3.default.isAbsolute(relPath)) {
3998
- command.middlewareIds.push(middleware.id);
3999
- }
3782
+ async traverse(path2, category) {
3783
+ const entries = await (0, import_promises3.readdir)(path2, {
3784
+ withFileTypes: true
3785
+ });
3786
+ for (const entry of entries) {
3787
+ if (entry.name.startsWith("_")) continue;
3788
+ if (entry.isFile()) {
3789
+ if (this.isCommand(entry.name) || this.isMiddleware(entry.name)) {
3790
+ await this.handle(entry, category);
4000
3791
  }
4001
3792
  }
4002
3793
  }
4003
3794
  }
4004
- distanceFromRoot(pathname, isFile = false) {
4005
- const entrypointParts = this.options.entrypoint.split(import_node_path3.default.sep);
4006
- const pathParts = (!isFile ? pathname : import_node_path3.default.dirname(pathname)).split(
4007
- import_node_path3.default.sep
4008
- );
4009
- const relativeParts = pathParts.slice(entrypointParts.length);
4010
- return relativeParts.filter((part) => !part.match(/^\(.*\)$/)).length;
4011
- }
4012
- parseGroup(pathname) {
4013
- const parts = pathname.split(import_node_path3.default.sep);
4014
- const parentDirIndex = parts.findIndex(
4015
- (part) => this.commands.some((cmd) => cmd.name === part)
4016
- );
4017
- if (parentDirIndex === -1) return null;
4018
- const groupName = parts[parts.length - 2];
4019
- if (!groupName || groupName === parts[parentDirIndex] || groupName.match(/^\(.*\)$/)) {
4020
- return null;
4021
- }
4022
- return groupName;
4023
- }
4024
- parseCategory(pathname) {
4025
- const parts = pathname.split(import_node_path3.default.sep);
4026
- const entrypointParts = this.options.entrypoint.split(import_node_path3.default.sep);
4027
- const relativeIndex = entrypointParts.length;
4028
- const categoryDir = parts[relativeIndex];
4029
- if (!categoryDir || !/^\((\w+)\)$/.test(categoryDir)) {
4030
- return null;
3795
+ async handle(entry, category = null) {
3796
+ const name = entry.name;
3797
+ const path2 = (0, import_node_path3.join)(entry.parentPath, entry.name);
3798
+ if (this.isCommand(name)) {
3799
+ const command = {
3800
+ id: crypto.randomUUID(),
3801
+ name: (0, import_node_path3.basename)(path2, (0, import_node_path3.extname)(path2)),
3802
+ path: path2,
3803
+ category,
3804
+ parentPath: entry.parentPath,
3805
+ relativePath: this.replaceEntrypoint(path2),
3806
+ middlewares: []
3807
+ };
3808
+ this.commands.set(command.id, command);
3809
+ } else if (this.isMiddleware(name)) {
3810
+ const middleware = {
3811
+ id: crypto.randomUUID(),
3812
+ name: (0, import_node_path3.basename)(path2, (0, import_node_path3.extname)(path2)),
3813
+ path: path2,
3814
+ relativePath: this.replaceEntrypoint(path2),
3815
+ parentPath: entry.parentPath
3816
+ };
3817
+ this.middlewares.set(middleware.id, middleware);
4031
3818
  }
4032
- return categoryDir.slice(1, -1);
4033
3819
  }
4034
- parseFileName(filename) {
4035
- return import_node_path3.default.basename(filename, import_node_path3.default.extname(filename));
3820
+ applyMiddlewares() {
3821
+ this.commands.forEach((command) => {
3822
+ const commandPath = command.parentPath;
3823
+ const samePathMiddlewares = Array.from(this.middlewares.values()).filter((middleware) => {
3824
+ return middleware.parentPath === commandPath;
3825
+ }).map((middleware) => middleware.id);
3826
+ command.middlewares = Array.from(
3827
+ /* @__PURE__ */ new Set([...command.middlewares, ...samePathMiddlewares])
3828
+ );
3829
+ });
4036
3830
  }
4037
- toRelativePath(pathname) {
4038
- return import_node_path3.default.relative(this.options.entrypoint, pathname);
3831
+ replaceEntrypoint(path2) {
3832
+ const normalized = (0, import_node_path3.normalize)(path2);
3833
+ return normalized.replace(this.options.entrypoint, "");
4039
3834
  }
4040
3835
  };
4041
3836
  __name(_CommandsRouter, "CommandsRouter");
@@ -4044,13 +3839,13 @@ var init_CommandsRouter = __esm({
4044
3839
  });
4045
3840
 
4046
3841
  // src/app/router/EventsRouter.ts
4047
- var import_node_fs4, import_promises3, import_node_path4, _EventsRouter, EventsRouter;
3842
+ var import_node_fs4, import_promises4, import_node_path4, _EventsRouter, EventsRouter;
4048
3843
  var init_EventsRouter = __esm({
4049
3844
  "src/app/router/EventsRouter.ts"() {
4050
3845
  "use strict";
4051
3846
  init_cjs_shims();
4052
3847
  import_node_fs4 = require("fs");
4053
- import_promises3 = require("fs/promises");
3848
+ import_promises4 = require("fs/promises");
4054
3849
  import_node_path4 = require("path");
4055
3850
  _EventsRouter = class _EventsRouter {
4056
3851
  /**
@@ -4106,12 +3901,11 @@ var init_EventsRouter = __esm({
4106
3901
  * @returns Promise resolving to the events tree
4107
3902
  */
4108
3903
  async scan() {
4109
- const dirs = await (0, import_promises3.readdir)(this.entrypoint, { withFileTypes: true });
3904
+ const dirs = await (0, import_promises4.readdir)(this.entrypoint, { withFileTypes: true });
4110
3905
  for (const dir of dirs) {
4111
3906
  if (dir.isDirectory()) {
4112
- const path3 = (0, import_node_path4.join)(this.entrypoint, dir.name);
4113
- const event = await this.scanEvent(dir.name, path3);
4114
- this.events.set(event.event, event);
3907
+ const path2 = (0, import_node_path4.join)(this.entrypoint, dir.name);
3908
+ await this.scanEvent(dir.name, path2, null, [], true);
4115
3909
  }
4116
3910
  }
4117
3911
  return Object.fromEntries(this.events);
@@ -4130,23 +3924,24 @@ var init_EventsRouter = __esm({
4130
3924
  * @param listeners - Array to collect listener file paths
4131
3925
  * @returns Promise resolving to the parsed event metadata
4132
3926
  */
4133
- async scanEvent(event, path3, listeners = []) {
4134
- var _a;
4135
- const files = await (0, import_promises3.readdir)(path3, { withFileTypes: true });
3927
+ async scanEvent(event, path2, _namespace = null, listeners = [], isRoot = false) {
3928
+ const files = await (0, import_promises4.readdir)(path2, { withFileTypes: true });
3929
+ const isNamespace = isRoot && /^\(.+\)$/.test(event);
3930
+ const namespace = isNamespace ? event.slice(1, -1) : _namespace ?? null;
4136
3931
  for (const file of files) {
4137
- if (/node_modules/.test(file.name)) continue;
3932
+ if (file.name.includes("_")) continue;
4138
3933
  if (file.isDirectory()) {
4139
- const nextPath = (0, import_node_path4.join)(path3, file.name);
4140
- await this.scanEvent(event, nextPath, listeners);
3934
+ const nextPath = (0, import_node_path4.join)(path2, file.name);
3935
+ await this.scanEvent(file.name, nextPath, namespace, listeners);
4141
3936
  continue;
4142
3937
  }
4143
3938
  if (file.isFile() && /\.(m|c)?(j|t)sx?$/.test(file.name)) {
4144
3939
  listeners.push((0, import_node_path4.join)(file.parentPath, file.name));
4145
3940
  }
4146
3941
  }
4147
- const maybeNamespace = path3.replace(this.entrypoint, "").replaceAll("\\", "/").split("/").shift();
4148
- const namespace = maybeNamespace && ((_a = /\(([^)]+)\)/.exec(maybeNamespace)) == null ? void 0 : _a[1]) || null;
4149
- return { event, path: path3, listeners, namespace };
3942
+ if (!isNamespace) {
3943
+ this.events.set(event, { event, path: path2, listeners, namespace });
3944
+ }
4150
3945
  }
4151
3946
  };
4152
3947
  __name(_EventsRouter, "EventsRouter");
@@ -4344,21 +4139,21 @@ async function generateTypesPackage() {
4344
4139
  command: CommandTypeData;
4345
4140
  }
4346
4141
  }`;
4347
- await (0, import_promises4.mkdir)(location, { recursive: true });
4348
- await (0, import_promises4.writeFile)(packageJSON, JSON.stringify(packageJSONContent, null, 2));
4349
- await (0, import_promises4.writeFile)(index, indexContent);
4350
- await (0, import_promises4.writeFile)(types, typesContent);
4351
- await (0, import_promises4.writeFile)(locale, "");
4352
- await (0, import_promises4.writeFile)(command, "");
4142
+ await (0, import_promises5.mkdir)(location, { recursive: true });
4143
+ await (0, import_promises5.writeFile)(packageJSON, JSON.stringify(packageJSONContent, null, 2));
4144
+ await (0, import_promises5.writeFile)(index, indexContent);
4145
+ await (0, import_promises5.writeFile)(types, typesContent);
4146
+ await (0, import_promises5.writeFile)(locale, "");
4147
+ await (0, import_promises5.writeFile)(command, "");
4353
4148
  return location;
4354
4149
  }
4355
- var import_node_fs5, import_promises4, import_node_path5;
4150
+ var import_node_fs5, import_promises5, import_node_path5;
4356
4151
  var init_types_package = __esm({
4357
4152
  "src/utils/types-package.ts"() {
4358
4153
  "use strict";
4359
4154
  init_cjs_shims();
4360
4155
  import_node_fs5 = require("fs");
4361
- import_promises4 = require("fs/promises");
4156
+ import_promises5 = require("fs/promises");
4362
4157
  import_node_path5 = require("path");
4363
4158
  __name(generateTypesPackage, "generateTypesPackage");
4364
4159
  }
@@ -4481,10 +4276,10 @@ function registerDevHooks(commandkit2) {
4481
4276
  if (!COMMANDKIT_IS_DEV) return;
4482
4277
  process.on("message", (message) => {
4483
4278
  if (typeof message !== "object" || message === null) return;
4484
- const { event, path: path3 } = message;
4279
+ const { event, path: path2 } = message;
4485
4280
  if (!event) return;
4486
4281
  if (process.env.COMMANDKIT_DEBUG_HMR === "true") {
4487
- Logger.info(`Received HMR event: ${event}${path3 ? ` for ${path3}` : ""}`);
4282
+ Logger.info(`Received HMR event: ${event}${path2 ? ` for ${path2}` : ""}`);
4488
4283
  }
4489
4284
  switch (event) {
4490
4285
  case "reload-commands":
@@ -4869,7 +4664,7 @@ var init_version = __esm({
4869
4664
  "use strict";
4870
4665
  init_cjs_shims();
4871
4666
  version = /* @__MACRO__ $version */
4872
- "0.1.11-dev.20250314022547";
4667
+ "0.1.11-dev.20250327153237";
4873
4668
  }
4874
4669
  });
4875
4670
 
@@ -5028,9 +4823,9 @@ async function main() {
5028
4823
  await main();
5029
4824
  `;
5030
4825
  const dist = isDev ? ".commandkit" : distDir || "dist";
5031
- await (0, import_promises5.writeFile)((0, import_node_path10.join)(configPath, dist, "index.js"), code);
4826
+ await (0, import_promises6.writeFile)((0, import_node_path10.join)(configPath, dist, "index.js"), code);
5032
4827
  }
5033
- var import_tsup, import_promises5, import_node_path10, envScript, requireScript, antiCrashScript, wrapInAsyncIIFE;
4828
+ var import_tsup, import_promises6, import_node_path10, envScript, requireScript, antiCrashScript, wrapInAsyncIIFE;
5034
4829
  var init_build = __esm({
5035
4830
  "src/cli/build.ts"() {
5036
4831
  "use strict";
@@ -5038,7 +4833,7 @@ var init_build = __esm({
5038
4833
  import_tsup = require("tsup");
5039
4834
  init_plugins();
5040
4835
  init_loader();
5041
- import_promises5 = require("fs/promises");
4836
+ import_promises6 = require("fs/promises");
5042
4837
  import_node_path10 = require("path");
5043
4838
  init_env();
5044
4839
  __name(buildApplication, "buildApplication");
@@ -5118,40 +4913,40 @@ async function bootstrapDevelopmentServer(configPath) {
5118
4913
  ignoreInitial: true
5119
4914
  });
5120
4915
  let ps = null;
5121
- const performHMR = debounce(async (path3) => {
5122
- if (!path3 || !ps) return false;
4916
+ const performHMR = debounce(async (path2) => {
4917
+ if (!path2 || !ps) return false;
5123
4918
  if (!ps.send) return false;
5124
- if (isCommandSource(path3)) {
4919
+ if (isCommandSource(path2)) {
5125
4920
  console.log(
5126
- `${colors_default.cyanBright("Reloading command(s) at ")} ${colors_default.yellowBright(path3)}`
4921
+ `${colors_default.cyanBright("Reloading command(s) at ")} ${colors_default.yellowBright(path2)}`
5127
4922
  );
5128
4923
  await buildAndStart(cwd, true);
5129
- ps.send({ event: "reload-commands", path: path3 });
4924
+ ps.send({ event: "reload-commands", path: path2 });
5130
4925
  return true;
5131
4926
  }
5132
- if (isEventSource(path3)) {
4927
+ if (isEventSource(path2)) {
5133
4928
  console.log(
5134
- `${colors_default.cyanBright("Reloading event(s) at ")} ${colors_default.yellowBright(path3)}`
4929
+ `${colors_default.cyanBright("Reloading event(s) at ")} ${colors_default.yellowBright(path2)}`
5135
4930
  );
5136
4931
  await buildAndStart(cwd, true);
5137
- ps.send({ event: "reload-events", path: path3 });
4932
+ ps.send({ event: "reload-events", path: path2 });
5138
4933
  return true;
5139
4934
  }
5140
- if (isLocaleSource(path3)) {
4935
+ if (isLocaleSource(path2)) {
5141
4936
  console.log(
5142
- `${colors_default.cyanBright("Reloading locale(s) at ")} ${colors_default.yellowBright(path3)}`
4937
+ `${colors_default.cyanBright("Reloading locale(s) at ")} ${colors_default.yellowBright(path2)}`
5143
4938
  );
5144
4939
  await buildAndStart(cwd, true);
5145
- ps.send({ event: "reload-locales", path: path3 });
4940
+ ps.send({ event: "reload-locales", path: path2 });
5146
4941
  return true;
5147
4942
  }
5148
4943
  return false;
5149
4944
  }, 300);
5150
- const hmrHandler = /* @__PURE__ */ __name(async (path3) => {
5151
- const hmr = await performHMR(path3);
4945
+ const hmrHandler = /* @__PURE__ */ __name(async (path2) => {
4946
+ const hmr = await performHMR(path2);
5152
4947
  if (hmr) return;
5153
4948
  console.log(
5154
- `${colors_default.yellowBright("\u26A1\uFE0F Performing full restart due to the changes in")} ${colors_default.cyanBright(path3)}`
4949
+ `${colors_default.yellowBright("\u26A1\uFE0F Performing full restart due to the changes in")} ${colors_default.cyanBright(path2)}`
5155
4950
  );
5156
4951
  ps == null ? void 0 : ps.kill();
5157
4952
  ps = await buildAndStart(cwd);
@@ -5231,7 +5026,7 @@ async function createSpinner(text) {
5231
5026
  });
5232
5027
  }
5233
5028
  var ora;
5234
- var init_utils2 = __esm({
5029
+ var init_utils = __esm({
5235
5030
  "src/cli/utils.ts"() {
5236
5031
  "use strict";
5237
5032
  init_cjs_shims();
@@ -5281,7 +5076,7 @@ var init_production = __esm({
5281
5076
  init_common();
5282
5077
  init_build();
5283
5078
  init_plugins();
5284
- init_utils2();
5079
+ init_utils();
5285
5080
  __name(bootstrapProductionServer, "bootstrapProductionServer");
5286
5081
  __name(createProductionBuild, "createProductionBuild");
5287
5082
  }
@@ -5296,7 +5091,7 @@ __export(generators_exports, {
5296
5091
  });
5297
5092
  async function generateCommand(name, customPath) {
5298
5093
  const cmdPath = (0, import_path4.join)(customPath || COMMANDS_DIR, name);
5299
- if (!(0, import_fs2.existsSync)(cmdPath)) await (0, import_promises6.mkdir)(cmdPath, { recursive: true });
5094
+ if (!(0, import_fs2.existsSync)(cmdPath)) await (0, import_promises7.mkdir)(cmdPath, { recursive: true });
5300
5095
  if ((0, import_fs2.existsSync)((0, import_path4.join)(cmdPath, "command.ts"))) {
5301
5096
  panic(`Command ${name} already exists.`);
5302
5097
  }
@@ -5316,7 +5111,7 @@ export const message: MessageCommand = async (ctx) => {
5316
5111
  await ctx.message.reply('Hello from ${name}!');
5317
5112
  };
5318
5113
  `.trim();
5319
- await (0, import_promises6.writeFile)((0, import_path4.join)(cmdPath, "command.ts"), commandFile);
5114
+ await (0, import_promises7.writeFile)((0, import_path4.join)(cmdPath, "command.ts"), commandFile);
5320
5115
  console.log(
5321
5116
  colors_default.green(
5322
5117
  `Command ${colors_default.magenta(name)} created at ${colors_default.blue(formatPath(cmdPath))}/command.ts`
@@ -5325,10 +5120,10 @@ export const message: MessageCommand = async (ctx) => {
5325
5120
  }
5326
5121
  async function generateEvent(name, customPath) {
5327
5122
  const eventPath = (0, import_path4.join)(customPath || EVENTS_DIR, name);
5328
- if (!(0, import_fs2.existsSync)(eventPath)) await (0, import_promises6.mkdir)(eventPath, { recursive: true });
5123
+ if (!(0, import_fs2.existsSync)(eventPath)) await (0, import_promises7.mkdir)(eventPath, { recursive: true });
5329
5124
  let filename = "event.ts";
5330
5125
  if ((0, import_fs2.existsSync)((0, import_path4.join)(eventPath, filename))) {
5331
- const count = (await (0, import_promises6.readdir)(eventPath)).length;
5126
+ const count = (await (0, import_promises7.readdir)(eventPath)).length;
5332
5127
  filename = `${String(count).padStart(2, "0")}_${filename}`;
5333
5128
  }
5334
5129
  const eventFile = `
@@ -5336,7 +5131,7 @@ export default async function on${name[0].toUpperCase() + name.slice(1)}() {
5336
5131
  console.log('${name} event fired!');
5337
5132
  };
5338
5133
  `.trim();
5339
- await (0, import_promises6.writeFile)((0, import_path4.join)(eventPath, filename), eventFile);
5134
+ await (0, import_promises7.writeFile)((0, import_path4.join)(eventPath, filename), eventFile);
5340
5135
  console.log(
5341
5136
  colors_default.green(
5342
5137
  `Event ${colors_default.magenta(name)} created at ${colors_default.blue(formatPath(eventPath))}/${colors_default.magenta(filename)}`
@@ -5354,7 +5149,7 @@ async function generateLocale(locale, commandName, customPath) {
5354
5149
  panic("Command name is required.");
5355
5150
  }
5356
5151
  const localePath = (0, import_path4.join)(customPath || LOCALES_DIR, locale);
5357
- if (!(0, import_fs2.existsSync)(localePath)) await (0, import_promises6.mkdir)(localePath, { recursive: true });
5152
+ if (!(0, import_fs2.existsSync)(localePath)) await (0, import_promises7.mkdir)(localePath, { recursive: true });
5358
5153
  if ((0, import_fs2.existsSync)((0, import_path4.join)(localePath, `${commandName}.json`))) {
5359
5154
  panic(`Locale file for ${commandName} already exists.`);
5360
5155
  }
@@ -5365,7 +5160,7 @@ async function generateLocale(locale, commandName, customPath) {
5365
5160
  },
5366
5161
  translations: {}
5367
5162
  };
5368
- await (0, import_promises6.writeFile)(
5163
+ await (0, import_promises7.writeFile)(
5369
5164
  (0, import_path4.join)(localePath, `${commandName}.json`),
5370
5165
  JSON.stringify(localeFile, null, 2)
5371
5166
  );
@@ -5377,12 +5172,12 @@ async function generateLocale(locale, commandName, customPath) {
5377
5172
  )
5378
5173
  );
5379
5174
  }
5380
- var import_promises6, import_path4, import_discord13, import_fs2, BASE_PATH, COMMANDS_DIR, EVENTS_DIR, LOCALES_DIR, formatPath;
5175
+ var import_promises7, import_path4, import_discord13, import_fs2, BASE_PATH, COMMANDS_DIR, EVENTS_DIR, LOCALES_DIR, formatPath;
5381
5176
  var init_generators = __esm({
5382
5177
  "src/cli/generators.ts"() {
5383
5178
  "use strict";
5384
5179
  init_cjs_shims();
5385
- import_promises6 = require("fs/promises");
5180
+ import_promises7 = require("fs/promises");
5386
5181
  import_path4 = require("path");
5387
5182
  import_discord13 = require("discord.js");
5388
5183
  init_common();
@@ -5392,7 +5187,7 @@ var init_generators = __esm({
5392
5187
  COMMANDS_DIR = (0, import_path4.join)(BASE_PATH, "src/app/commands");
5393
5188
  EVENTS_DIR = (0, import_path4.join)(BASE_PATH, "src/app/events");
5394
5189
  LOCALES_DIR = (0, import_path4.join)(BASE_PATH, "src/app/locales");
5395
- formatPath = /* @__PURE__ */ __name((path3) => path3.replace(process.cwd(), ".").replace(/\\/g, "/"), "formatPath");
5190
+ formatPath = /* @__PURE__ */ __name((path2) => path2.replace(process.cwd(), ".").replace(/\\/g, "/"), "formatPath");
5396
5191
  __name(generateCommand, "generateCommand");
5397
5192
  __name(generateEvent, "generateEvent");
5398
5193
  __name(generateLocale, "generateLocale");
@@ -5411,7 +5206,10 @@ __export(index_exports, {
5411
5206
  CommandKit: () => CommandKit,
5412
5207
  CommandKitEnvironment: () => CommandKitEnvironment,
5413
5208
  CommandKitEnvironmentType: () => CommandKitEnvironmentType,
5209
+ CommandKitPluginRuntime: () => CommandKitPluginRuntime,
5414
5210
  CommandsRouter: () => CommandsRouter,
5211
+ CompilerPlugin: () => CompilerPlugin,
5212
+ CompilerPluginRuntime: () => CompilerPluginRuntime,
5415
5213
  Context: () => Context,
5416
5214
  DefaultLocalizationStrategy: () => DefaultLocalizationStrategy,
5417
5215
  DefaultLogger: () => DefaultLogger,
@@ -5428,6 +5226,7 @@ __export(index_exports, {
5428
5226
  Modal: () => Modal,
5429
5227
  ModalKit: () => ModalKit,
5430
5228
  ParagraphInput: () => ParagraphInput,
5229
+ RuntimePlugin: () => RuntimePlugin,
5431
5230
  ShortInput: () => ShortInput,
5432
5231
  TextInput: () => TextInput,
5433
5232
  afterCommand: () => afterCommand,
@@ -5444,6 +5243,7 @@ __export(index_exports, {
5444
5243
  dmOnly: () => dmOnly,
5445
5244
  exitContext: () => exitContext,
5446
5245
  exitMiddleware: () => exitMiddleware,
5246
+ fromEsbuildPlugin: () => fromEsbuildPlugin,
5447
5247
  getCommandKit: () => getCommandKit,
5448
5248
  getConfig: () => getConfig,
5449
5249
  getContext: () => getContext,
@@ -5452,6 +5252,8 @@ __export(index_exports, {
5452
5252
  invalidate: () => invalidate,
5453
5253
  isCachedFunction: () => isCachedFunction,
5454
5254
  isCommandKitElement: () => isCommandKitElement,
5255
+ isCompilerPlugin: () => isCompilerPlugin,
5256
+ isRuntimePlugin: () => isRuntimePlugin,
5455
5257
  makeContextAwareFunction: () => makeContextAwareFunction,
5456
5258
  redirect: () => redirect,
5457
5259
  rethrow: () => rethrow,
@@ -5497,6 +5299,7 @@ init_cjs_shims();
5497
5299
  init_Logger();
5498
5300
  init_router();
5499
5301
  init_version();
5302
+ init_plugins();
5500
5303
 
5501
5304
  // src/cli/init.ts
5502
5305
  init_cjs_shims();
@@ -5563,7 +5366,10 @@ var index_default = CommandKit;
5563
5366
  CommandKit,
5564
5367
  CommandKitEnvironment,
5565
5368
  CommandKitEnvironmentType,
5369
+ CommandKitPluginRuntime,
5566
5370
  CommandsRouter,
5371
+ CompilerPlugin,
5372
+ CompilerPluginRuntime,
5567
5373
  Context,
5568
5374
  DefaultLocalizationStrategy,
5569
5375
  DefaultLogger,
@@ -5580,6 +5386,7 @@ var index_default = CommandKit;
5580
5386
  Modal,
5581
5387
  ModalKit,
5582
5388
  ParagraphInput,
5389
+ RuntimePlugin,
5583
5390
  ShortInput,
5584
5391
  TextInput,
5585
5392
  afterCommand,
@@ -5595,6 +5402,7 @@ var index_default = CommandKit;
5595
5402
  dmOnly,
5596
5403
  exitContext,
5597
5404
  exitMiddleware,
5405
+ fromEsbuildPlugin,
5598
5406
  getCommandKit,
5599
5407
  getConfig,
5600
5408
  getContext,
@@ -5603,6 +5411,8 @@ var index_default = CommandKit;
5603
5411
  invalidate,
5604
5412
  isCachedFunction,
5605
5413
  isCommandKitElement,
5414
+ isCompilerPlugin,
5415
+ isRuntimePlugin,
5606
5416
  makeContextAwareFunction,
5607
5417
  redirect,
5608
5418
  rethrow,