bakit 2.0.0-alpha.5 → 2.0.0-alpha.6

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/bin/bakit.js ADDED
@@ -0,0 +1,43 @@
1
+ // @ts-check
2
+ import { config as useEnv } from "dotenv";
3
+ import { program } from "commander";
4
+
5
+ program.name("bakit");
6
+
7
+ program.command("dev").action(async () => {
8
+ useEnv({
9
+ path: [".env.local", ".env"],
10
+ quiet: true,
11
+ });
12
+ const { default: nodemon } = await import("nodemon");
13
+
14
+ nodemon({
15
+ script: "src/index.ts",
16
+ exec: `${process.execPath} --import tsx`,
17
+ ext: "ts,js",
18
+ watch: ["src"],
19
+ env: {
20
+ ...process.env,
21
+ FORCE_COLOR: "1",
22
+ NODE_ENV: "development",
23
+ },
24
+ });
25
+
26
+ nodemon.on("start", () => {
27
+ console.log("Starting bakit app...");
28
+ });
29
+
30
+ nodemon.on("restart", () => {
31
+ console.log("Bakit detected changes! Restarting...");
32
+ });
33
+
34
+ nodemon.on("exit", () => {
35
+ console.log("Proccess exited! Did you start bakit correctly?");
36
+ });
37
+
38
+ nodemon.on("quit", () => {
39
+ process.exit();
40
+ });
41
+ });
42
+
43
+ program.parse();
package/dist/index.d.ts CHANGED
@@ -1,7 +1,8 @@
1
1
  import * as discord_js from 'discord.js';
2
- import { GatewayIntentBits, ClientOptions, ChatInputCommandInteraction, CacheType, Message, User, MessageCreateOptions, InteractionReplyOptions, Awaitable, Collection, ClientEvents, Events, IntentsBitField, Client } from 'discord.js';
2
+ import { GatewayIntentBits, ClientOptions, ChatInputCommandInteraction, CacheType, Message, User, MessageCreateOptions, InteractionReplyOptions, Awaitable, Collection, Events, IntentsBitField, ClientEvents, Client } from 'discord.js';
3
3
  import z$1, { z } from 'zod';
4
4
  import { inspect } from 'node:util';
5
+ import * as jiti from 'jiti';
5
6
 
6
7
  declare const ProjectConfigSchema: z.ZodObject<{
7
8
  intents: z.ZodDefault<z.ZodUnion<readonly [z.ZodLiteral<"auto">, z.ZodBigInt, z.ZodArray<z.ZodEnum<typeof GatewayIntentBits>>]>>;
@@ -102,20 +103,48 @@ declare const BaseParamSchema: z.ZodObject<{
102
103
  description: z.ZodOptional<z.ZodString>;
103
104
  required: z.ZodDefault<z.ZodBoolean>;
104
105
  }, z.core.$strip>;
105
- declare const StringParamSchema: z.ZodObject<{
106
+ declare const StringParamSchema: z.ZodPipe<z.ZodObject<{
106
107
  name: z.ZodString;
107
108
  description: z.ZodOptional<z.ZodString>;
108
109
  required: z.ZodDefault<z.ZodBoolean>;
109
110
  maxLength: z.ZodOptional<z.ZodNumber>;
110
111
  minLength: z.ZodOptional<z.ZodNumber>;
111
- }, z.core.$strip>;
112
- declare const NumberParamSchema: z.ZodObject<{
112
+ }, z.core.$strip>, z.ZodTransform<{
113
+ name: string;
114
+ required: boolean;
115
+ description?: string | undefined;
116
+ maxLength?: number | undefined;
117
+ minLength?: number | undefined;
118
+ } & {
119
+ description: string;
120
+ }, {
121
+ name: string;
122
+ required: boolean;
123
+ description?: string | undefined;
124
+ maxLength?: number | undefined;
125
+ minLength?: number | undefined;
126
+ }>>;
127
+ declare const NumberParamSchema: z.ZodPipe<z.ZodObject<{
113
128
  name: z.ZodString;
114
129
  description: z.ZodOptional<z.ZodString>;
115
130
  required: z.ZodDefault<z.ZodBoolean>;
116
131
  maxValue: z.ZodOptional<z.ZodNumber>;
117
132
  minValue: z.ZodOptional<z.ZodNumber>;
118
- }, z.core.$strip>;
133
+ }, z.core.$strip>, z.ZodTransform<{
134
+ name: string;
135
+ required: boolean;
136
+ description?: string | undefined;
137
+ maxValue?: number | undefined;
138
+ minValue?: number | undefined;
139
+ } & {
140
+ description: string;
141
+ }, {
142
+ name: string;
143
+ required: boolean;
144
+ description?: string | undefined;
145
+ maxValue?: number | undefined;
146
+ minValue?: number | undefined;
147
+ }>>;
119
148
  type BaseParamOptions = z.input<typeof BaseParamSchema>;
120
149
  type StringOptions = z.input<typeof StringParamSchema>;
121
150
  type NumberOptions = z.input<typeof NumberParamSchema>;
@@ -192,10 +221,12 @@ type InferParamTuple<T extends readonly BaseParam<any, any, any>[]> = {
192
221
  [K in keyof T]: T[K] extends AnyParam<any> ? InferParamValue<T[K]> : never;
193
222
  };
194
223
 
224
+ declare function validateParamsOrder(params: readonly AnyParam<boolean>[]): boolean;
195
225
  declare const CommandOptionsSchema: z.ZodPipe<z.ZodObject<{
196
- name: z.ZodString;
197
- description: z.ZodOptional<z.ZodString>;
198
- params: z.ZodDefault<z.ZodArray<z.ZodCustom<BaseParam<{
226
+ name: z.ZodReadonly<z.ZodString>;
227
+ description: z.ZodReadonly<z.ZodOptional<z.ZodString>>;
228
+ nsfw: z.ZodReadonly<z.ZodDefault<z.ZodBoolean>>;
229
+ params: z.ZodReadonly<z.ZodDefault<z.ZodArray<z.ZodCustom<BaseParam<{
199
230
  name: string;
200
231
  description?: string | undefined;
201
232
  required?: boolean | undefined;
@@ -203,12 +234,13 @@ declare const CommandOptionsSchema: z.ZodPipe<z.ZodObject<{
203
234
  name: string;
204
235
  description?: string | undefined;
205
236
  required?: boolean | undefined;
206
- }, unknown, boolean>>>>;
207
- quotes: z.ZodDefault<z.ZodBoolean>;
237
+ }, unknown, boolean>>>>>;
238
+ quotes: z.ZodReadonly<z.ZodDefault<z.ZodBoolean>>;
208
239
  }, z.core.$strip>, z.ZodTransform<{
209
240
  description: string;
210
241
  name: string;
211
- params: BaseParam<{
242
+ nsfw: boolean;
243
+ params: readonly BaseParam<{
212
244
  name: string;
213
245
  description?: string | undefined;
214
246
  required?: boolean | undefined;
@@ -216,7 +248,8 @@ declare const CommandOptionsSchema: z.ZodPipe<z.ZodObject<{
216
248
  quotes: boolean;
217
249
  }, {
218
250
  name: string;
219
- params: BaseParam<{
251
+ nsfw: boolean;
252
+ params: readonly BaseParam<{
220
253
  name: string;
221
254
  description?: string | undefined;
222
255
  required?: boolean | undefined;
@@ -237,6 +270,9 @@ declare class Command<ParamsList extends readonly AnyParam<any>[] = any[]> exten
237
270
  params?: ParamsList;
238
271
  }) | string);
239
272
  private handleSyntaxError;
273
+ toSlashCommandJSON(): discord_js.RESTPostAPIChatInputApplicationCommandsJSONBody;
274
+ private initSlashCommandOptions;
275
+ private initSlashCommandOption;
240
276
  }
241
277
  /**
242
278
  * Define command entry, usually for modules.
@@ -282,8 +318,10 @@ declare const ListenerOptionsSchema: z$1.ZodObject<{
282
318
  type ListenerOptions<K extends EventKey = EventKey> = Omit<z$1.input<typeof ListenerOptionsSchema>, "name"> & {
283
319
  name: K;
284
320
  };
285
- type EventKey = keyof ClientEvents;
286
- declare class Listener<K extends EventKey = EventKey> extends LifecycleManager<Context, [...args: ClientEvents[K]]> {
321
+ type EventKey = keyof BakitClientEvents;
322
+ declare class Listener<K extends EventKey = EventKey> extends LifecycleManager<Context, [
323
+ ...args: BakitClientEvents[K]
324
+ ]> {
287
325
  options: ListenerOptions<K>;
288
326
  constructor(options: K | ListenerOptions<K>);
289
327
  }
@@ -339,6 +377,8 @@ declare const EVENT_INTENT_MAPPING: Record<string, number[]>;
339
377
 
340
378
  declare function tokenize(content: string): string[];
341
379
 
380
+ declare const $jiti: jiti.Jiti;
381
+
342
382
  declare class BakitError extends Error {
343
383
  constructor(message: string);
344
384
  }
@@ -366,4 +406,4 @@ declare const Params: {
366
406
  }) => NumberParam<Required>;
367
407
  };
368
408
 
369
- export { type AnyParam, ArgumentError, BakitClient, type BakitClientEvents, BakitError, BaseClientManager, BaseCommandContext, BaseParam, type BaseParamOptions, BaseParamSchema, ChatInputContext, type ChatInputContextSendOptions, Command, type CommandContext, CommandManager, type CommandOptions, type CommandOptionsInput, CommandOptionsSchema, Context, type ContextSendOptions, EVENT_INTENT_MAPPING, type ErrorHookCallback, type GetPrefixFunction, HookOrder, HookState, type InferParamTuple, type InferParamValue, Instance, LifecycleManager, Listener, ListenerManager, type ListenerOptions, ListenerOptionsSchema, type MainHookCallback, MessageContext, type MessageContextSendOptions, type NumberOptions, NumberParam, NumberParamSchema, type ParamResolvedOutputType, ParamUserType, Params, type ProjectConfig, type ProjectConfigInput, ProjectConfigSchema, type StringOptions, StringParam, StringParamSchema, defineCommand, defineConfig, defineListener, getConfig, loadConfig, tokenize, useApp };
409
+ export { $jiti, type AnyParam, ArgumentError, BakitClient, type BakitClientEvents, BakitError, BaseClientManager, BaseCommandContext, BaseParam, type BaseParamOptions, BaseParamSchema, ChatInputContext, type ChatInputContextSendOptions, Command, type CommandContext, CommandManager, type CommandOptions, type CommandOptionsInput, CommandOptionsSchema, Context, type ContextSendOptions, EVENT_INTENT_MAPPING, type ErrorHookCallback, type GetPrefixFunction, HookOrder, HookState, type InferParamTuple, type InferParamValue, Instance, LifecycleManager, Listener, ListenerManager, type ListenerOptions, ListenerOptionsSchema, type MainHookCallback, MessageContext, type MessageContextSendOptions, type NumberOptions, NumberParam, NumberParamSchema, type ParamResolvedOutputType, ParamUserType, Params, type ProjectConfig, type ProjectConfigInput, ProjectConfigSchema, type StringOptions, StringParam, StringParamSchema, defineCommand, defineConfig, defineListener, getConfig, loadConfig, tokenize, useApp, validateParamsOrder };
package/dist/index.js CHANGED
@@ -1,12 +1,131 @@
1
- import 'dotenv/config';
2
- import { GatewayIntentBits, Events, Client, IntentsBitField, Collection, ChatInputCommandInteraction, Message } from 'discord.js';
1
+ import { GatewayIntentBits, Events, Client, IntentsBitField, Collection, SlashCommandBuilder, SlashCommandStringOption, SlashCommandNumberOption, ChatInputCommandInteraction, Message } from 'discord.js';
3
2
  import z3, { z } from 'zod';
4
- import { pathToFileURL } from 'url';
5
3
  import glob from 'tiny-glob';
4
+ import { createJiti } from 'jiti';
6
5
  import { inspect } from 'util';
7
6
  import { posix } from 'path';
8
7
 
9
- // src/index.ts
8
+ // src/config.ts
9
+ var INTENT_GROUPS = {
10
+ [GatewayIntentBits.Guilds]: [
11
+ Events.GuildCreate,
12
+ Events.GuildDelete,
13
+ Events.GuildUpdate,
14
+ Events.GuildUnavailable,
15
+ Events.GuildRoleCreate,
16
+ Events.GuildRoleDelete,
17
+ Events.GuildRoleUpdate,
18
+ Events.ChannelCreate,
19
+ Events.ChannelDelete,
20
+ Events.ChannelUpdate,
21
+ Events.ChannelPinsUpdate,
22
+ Events.ThreadCreate,
23
+ Events.ThreadDelete,
24
+ Events.ThreadUpdate,
25
+ Events.ThreadListSync,
26
+ Events.ThreadMemberUpdate,
27
+ Events.ThreadMembersUpdate,
28
+ Events.StageInstanceCreate,
29
+ Events.StageInstanceUpdate,
30
+ Events.StageInstanceDelete
31
+ ],
32
+ [GatewayIntentBits.GuildMembers]: [
33
+ Events.GuildMemberAdd,
34
+ Events.GuildMemberUpdate,
35
+ Events.GuildMemberRemove,
36
+ Events.ThreadMembersUpdate
37
+ ],
38
+ [GatewayIntentBits.GuildModeration]: [Events.GuildAuditLogEntryCreate, Events.GuildBanAdd, Events.GuildBanRemove],
39
+ [GatewayIntentBits.GuildExpressions]: [
40
+ Events.GuildEmojiCreate,
41
+ Events.GuildEmojiDelete,
42
+ Events.GuildEmojiUpdate,
43
+ Events.GuildStickerCreate,
44
+ Events.GuildStickerDelete,
45
+ Events.GuildStickerUpdate,
46
+ Events.GuildSoundboardSoundCreate,
47
+ Events.GuildSoundboardSoundUpdate,
48
+ Events.GuildSoundboardSoundDelete,
49
+ Events.GuildSoundboardSoundsUpdate
50
+ ],
51
+ [GatewayIntentBits.GuildIntegrations]: [Events.GuildIntegrationsUpdate],
52
+ [GatewayIntentBits.GuildWebhooks]: [Events.WebhooksUpdate],
53
+ [GatewayIntentBits.GuildInvites]: [Events.InviteCreate, Events.InviteDelete],
54
+ [GatewayIntentBits.GuildVoiceStates]: [Events.VoiceStateUpdate],
55
+ [GatewayIntentBits.GuildPresences]: [Events.PresenceUpdate],
56
+ [GatewayIntentBits.GuildMessages]: [
57
+ Events.MessageCreate,
58
+ Events.MessageUpdate,
59
+ Events.MessageDelete,
60
+ Events.MessageBulkDelete
61
+ ],
62
+ [GatewayIntentBits.GuildMessageReactions]: [
63
+ Events.MessageReactionAdd,
64
+ Events.MessageReactionRemove,
65
+ Events.MessageReactionRemoveAll,
66
+ Events.MessageReactionRemoveEmoji
67
+ ],
68
+ [GatewayIntentBits.GuildMessageTyping]: [Events.TypingStart],
69
+ [GatewayIntentBits.DirectMessages]: [
70
+ Events.MessageCreate,
71
+ Events.MessageUpdate,
72
+ Events.MessageDelete,
73
+ Events.ChannelPinsUpdate
74
+ ],
75
+ [GatewayIntentBits.DirectMessageReactions]: [
76
+ Events.MessageReactionAdd,
77
+ Events.MessageReactionRemove,
78
+ Events.MessageReactionRemoveAll,
79
+ Events.MessageReactionRemoveEmoji
80
+ ],
81
+ [GatewayIntentBits.DirectMessageTyping]: [Events.TypingStart],
82
+ [GatewayIntentBits.MessageContent]: [Events.MessageCreate, Events.MessageUpdate],
83
+ [GatewayIntentBits.GuildScheduledEvents]: [
84
+ Events.GuildScheduledEventCreate,
85
+ Events.GuildScheduledEventDelete,
86
+ Events.GuildScheduledEventUpdate,
87
+ Events.GuildScheduledEventUserAdd,
88
+ Events.GuildScheduledEventUserRemove
89
+ ],
90
+ [GatewayIntentBits.AutoModerationConfiguration]: [
91
+ Events.AutoModerationRuleCreate,
92
+ Events.AutoModerationRuleDelete,
93
+ Events.AutoModerationRuleUpdate
94
+ ],
95
+ [GatewayIntentBits.AutoModerationExecution]: [Events.AutoModerationActionExecution],
96
+ [GatewayIntentBits.GuildMessagePolls]: [Events.MessagePollVoteAdd, Events.MessagePollVoteRemove],
97
+ [GatewayIntentBits.DirectMessagePolls]: [Events.MessagePollVoteAdd, Events.MessagePollVoteRemove]
98
+ }, EVENT_INTENT_MAPPING = {};
99
+ for (let [intentStr, events] of Object.entries(INTENT_GROUPS)) {
100
+ let intent = Number(intentStr);
101
+ for (let event of events)
102
+ EVENT_INTENT_MAPPING[event] ??= [], EVENT_INTENT_MAPPING[event].includes(intent) || EVENT_INTENT_MAPPING[event].push(intent);
103
+ }
104
+
105
+ // src/utils/string.ts
106
+ function tokenize(content) {
107
+ let args = [], current = "", quoteChar = null, isEscaped = false;
108
+ for (let i = 0; i < content.length; i++) {
109
+ let char = content[i];
110
+ if (char === void 0)
111
+ break;
112
+ if (isEscaped) {
113
+ current += char, isEscaped = false;
114
+ continue;
115
+ }
116
+ if (char === "\\") {
117
+ isEscaped = true;
118
+ continue;
119
+ }
120
+ quoteChar ? char === quoteChar ? quoteChar = null : current += char : char === '"' ? quoteChar = char : /\s/.test(char) ? current.length > 0 && (args.push(current), current = "") : current += char;
121
+ }
122
+ return current.length > 0 && args.push(current), args;
123
+ }
124
+
125
+ // src/utils/index.ts
126
+ var $jiti = createJiti(import.meta.url);
127
+
128
+ // src/config.ts
10
129
  var ProjectConfigSchema = z.object({
11
130
  /**
12
131
  * The gateway intents to use for the Discord client.
@@ -50,7 +169,7 @@ async function loadConfig(cwd = process.cwd()) {
50
169
  if (!configPath)
51
170
  throw new Error("Missing config file");
52
171
  other && console.warn(`Multiple config files found in ${cwd}. Using ${configPath}.`);
53
- let configFileURL = pathToFileURL(configPath).toString(), { default: config } = await import(configFileURL);
172
+ let config = await $jiti.import(configPath, { default: true });
54
173
  return _config = Object.freeze(await ProjectConfigSchema.parseAsync(config)), _config;
55
174
  }
56
175
  function getConfig() {
@@ -330,17 +449,29 @@ var BaseParam = class {
330
449
  return this.setOption("maxValue", value);
331
450
  }
332
451
  };
333
-
334
- // src/command/Command.ts
452
+ function validateParamsOrder(params) {
453
+ let seenOptional = false;
454
+ for (let param of params)
455
+ if (param.options.required) {
456
+ if (seenOptional)
457
+ return false;
458
+ } else
459
+ seenOptional = true;
460
+ return true;
461
+ }
335
462
  var CommandOptionsSchema = z.object({
336
- name: z.string(),
337
- description: z.string().min(1).max(100).optional(),
338
- params: z.array(z.instanceof(BaseParam)).default([]),
339
- quotes: z.boolean().default(true)
463
+ name: z.string().readonly(),
464
+ description: z.string().min(1).max(100).optional().readonly(),
465
+ nsfw: z.boolean().default(false).readonly(),
466
+ params: z.array(z.instanceof(BaseParam)).default([]).readonly(),
467
+ quotes: z.boolean().default(true).readonly()
340
468
  }).transform((data) => ({
341
469
  ...data,
342
470
  description: data.description ?? `Command ${data.name}`
343
- })), Command = class extends LifecycleManager {
471
+ })).refine(({ params }) => validateParamsOrder(params), {
472
+ path: ["params"],
473
+ error: "Required params must be placed before optional params"
474
+ }), Command = class extends LifecycleManager {
344
475
  constructor(options) {
345
476
  let _options = CommandOptionsSchema.parse(typeof options == "string" ? { name: options } : options);
346
477
  super(`command:${_options.name}`), this.options = _options, this.setHook("syntaxError", "ERROR" /* Error */, async (ctx, error, ...args) => {
@@ -350,6 +481,30 @@ var CommandOptionsSchema = z.object({
350
481
  async handleSyntaxError(context, error, _args) {
351
482
  error instanceof BakitError && await context.send(error.message);
352
483
  }
484
+ toSlashCommandJSON() {
485
+ let { name, description, nsfw, params } = this.options, builder = new SlashCommandBuilder().setName(name).setDescription(description).setNSFW(nsfw);
486
+ return this.initSlashCommandOptions(builder, params), builder.toJSON();
487
+ }
488
+ initSlashCommandOptions(builder, params) {
489
+ for (let param of params)
490
+ this.initSlashCommandOption(builder, param);
491
+ }
492
+ initSlashCommandOption(builder, param) {
493
+ let initOption = (builder2) => {
494
+ let { name, description, required } = param.options;
495
+ return builder2.setName(name).setDescription(description).setRequired(required);
496
+ };
497
+ if (param instanceof StringParam) {
498
+ let { maxLength, minLength } = param.options, option = initOption(new SlashCommandStringOption());
499
+ maxLength && option.setMaxLength(maxLength), minLength && option.setMinLength(minLength), builder.addStringOption(option);
500
+ return;
501
+ }
502
+ if (param instanceof NumberParam) {
503
+ let { maxValue, minValue } = param.options, option = initOption(new SlashCommandNumberOption());
504
+ maxValue && option.setMaxValue(maxValue), minValue && option.setMinValue(minValue), builder.addNumberOption(option);
505
+ return;
506
+ }
507
+ }
353
508
  };
354
509
  function defineCommand(options) {
355
510
  return new Command(options);
@@ -370,7 +525,7 @@ var CommandManager = class extends BaseClientManager {
370
525
  cwd: process.cwd()
371
526
  })).map(async (file) => {
372
527
  try {
373
- let { default: command } = await import(pathToFileURL(file).toString());
528
+ let command = await $jiti.import(file, { default: !0 });
374
529
  if (!command) {
375
530
  console.warn(`[Loader] File has no default export: ${file}`);
376
531
  return;
@@ -418,103 +573,6 @@ var ListenerOptionsSchema = z3.object({
418
573
  function defineListener(options) {
419
574
  return new Listener(options);
420
575
  }
421
- var INTENT_GROUPS = {
422
- [GatewayIntentBits.Guilds]: [
423
- Events.GuildCreate,
424
- Events.GuildDelete,
425
- Events.GuildUpdate,
426
- Events.GuildUnavailable,
427
- Events.GuildRoleCreate,
428
- Events.GuildRoleDelete,
429
- Events.GuildRoleUpdate,
430
- Events.ChannelCreate,
431
- Events.ChannelDelete,
432
- Events.ChannelUpdate,
433
- Events.ChannelPinsUpdate,
434
- Events.ThreadCreate,
435
- Events.ThreadDelete,
436
- Events.ThreadUpdate,
437
- Events.ThreadListSync,
438
- Events.ThreadMemberUpdate,
439
- Events.ThreadMembersUpdate,
440
- Events.StageInstanceCreate,
441
- Events.StageInstanceUpdate,
442
- Events.StageInstanceDelete
443
- ],
444
- [GatewayIntentBits.GuildMembers]: [
445
- Events.GuildMemberAdd,
446
- Events.GuildMemberUpdate,
447
- Events.GuildMemberRemove,
448
- Events.ThreadMembersUpdate
449
- ],
450
- [GatewayIntentBits.GuildModeration]: [Events.GuildAuditLogEntryCreate, Events.GuildBanAdd, Events.GuildBanRemove],
451
- [GatewayIntentBits.GuildExpressions]: [
452
- Events.GuildEmojiCreate,
453
- Events.GuildEmojiDelete,
454
- Events.GuildEmojiUpdate,
455
- Events.GuildStickerCreate,
456
- Events.GuildStickerDelete,
457
- Events.GuildStickerUpdate,
458
- Events.GuildSoundboardSoundCreate,
459
- Events.GuildSoundboardSoundUpdate,
460
- Events.GuildSoundboardSoundDelete,
461
- Events.GuildSoundboardSoundsUpdate
462
- ],
463
- [GatewayIntentBits.GuildIntegrations]: [Events.GuildIntegrationsUpdate],
464
- [GatewayIntentBits.GuildWebhooks]: [Events.WebhooksUpdate],
465
- [GatewayIntentBits.GuildInvites]: [Events.InviteCreate, Events.InviteDelete],
466
- [GatewayIntentBits.GuildVoiceStates]: [Events.VoiceStateUpdate],
467
- [GatewayIntentBits.GuildPresences]: [Events.PresenceUpdate],
468
- [GatewayIntentBits.GuildMessages]: [
469
- Events.MessageCreate,
470
- Events.MessageUpdate,
471
- Events.MessageDelete,
472
- Events.MessageBulkDelete
473
- ],
474
- [GatewayIntentBits.GuildMessageReactions]: [
475
- Events.MessageReactionAdd,
476
- Events.MessageReactionRemove,
477
- Events.MessageReactionRemoveAll,
478
- Events.MessageReactionRemoveEmoji
479
- ],
480
- [GatewayIntentBits.GuildMessageTyping]: [Events.TypingStart],
481
- [GatewayIntentBits.DirectMessages]: [
482
- Events.MessageCreate,
483
- Events.MessageUpdate,
484
- Events.MessageDelete,
485
- Events.ChannelPinsUpdate
486
- ],
487
- [GatewayIntentBits.DirectMessageReactions]: [
488
- Events.MessageReactionAdd,
489
- Events.MessageReactionRemove,
490
- Events.MessageReactionRemoveAll,
491
- Events.MessageReactionRemoveEmoji
492
- ],
493
- [GatewayIntentBits.DirectMessageTyping]: [Events.TypingStart],
494
- [GatewayIntentBits.MessageContent]: [Events.MessageCreate, Events.MessageUpdate],
495
- [GatewayIntentBits.GuildScheduledEvents]: [
496
- Events.GuildScheduledEventCreate,
497
- Events.GuildScheduledEventDelete,
498
- Events.GuildScheduledEventUpdate,
499
- Events.GuildScheduledEventUserAdd,
500
- Events.GuildScheduledEventUserRemove
501
- ],
502
- [GatewayIntentBits.AutoModerationConfiguration]: [
503
- Events.AutoModerationRuleCreate,
504
- Events.AutoModerationRuleDelete,
505
- Events.AutoModerationRuleUpdate
506
- ],
507
- [GatewayIntentBits.AutoModerationExecution]: [Events.AutoModerationActionExecution],
508
- [GatewayIntentBits.GuildMessagePolls]: [Events.MessagePollVoteAdd, Events.MessagePollVoteRemove],
509
- [GatewayIntentBits.DirectMessagePolls]: [Events.MessagePollVoteAdd, Events.MessagePollVoteRemove]
510
- }, EVENT_INTENT_MAPPING = {};
511
- for (let [intentStr, events] of Object.entries(INTENT_GROUPS)) {
512
- let intent = Number(intentStr);
513
- for (let event of events)
514
- EVENT_INTENT_MAPPING[event] ??= [], EVENT_INTENT_MAPPING[event].includes(intent) || EVENT_INTENT_MAPPING[event].push(intent);
515
- }
516
-
517
- // src/listener/ListenerManager.ts
518
576
  var ListenerManager = class extends BaseClientManager {
519
577
  listeners = [];
520
578
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -524,7 +582,7 @@ var ListenerManager = class extends BaseClientManager {
524
582
  cwd: process.cwd()
525
583
  })).map(async (file) => {
526
584
  try {
527
- let { default: listener } = await import(pathToFileURL(file).toString());
585
+ let listener = await $jiti.import(file, { default: !0 });
528
586
  if (!listener) {
529
587
  console.warn(`[Loader] File has no default export: ${file}`);
530
588
  return;
@@ -614,37 +672,20 @@ var BakitClient3 = class extends Client {
614
672
  return `${this.constructor.name} {}`;
615
673
  }
616
674
  };
617
-
618
- // src/utils/string.ts
619
- function tokenize(content) {
620
- let args = [], current = "", quoteChar = null, isEscaped = false;
621
- for (let i = 0; i < content.length; i++) {
622
- let char = content[i];
623
- if (char === void 0)
624
- break;
625
- if (isEscaped) {
626
- current += char, isEscaped = false;
627
- continue;
628
- }
629
- if (char === "\\") {
630
- isEscaped = true;
631
- continue;
632
- }
633
- quoteChar ? char === quoteChar ? quoteChar = null : current += char : char === '"' ? quoteChar = char : /\s/.test(char) ? current.length > 0 && (args.push(current), current = "") : current += char;
634
- }
635
- return current.length > 0 && args.push(current), args;
636
- }
637
675
  var ParamUserType = /* @__PURE__ */ ((ParamUserType2) => (ParamUserType2.Bot = "bot", ParamUserType2.Normal = "normal", ParamUserType2.Any = "any", ParamUserType2))(ParamUserType || {}), BaseParamSchema = z.object({
638
676
  name: z.string(),
639
677
  description: z.string().optional(),
640
678
  required: z.boolean().default(true)
679
+ }), withDefaultDescription = (data) => ({
680
+ ...data,
681
+ description: data.description ?? `${data.name}`
641
682
  }), StringParamSchema = BaseParamSchema.extend({
642
683
  maxLength: z.number().min(1).optional(),
643
684
  minLength: z.number().min(1).optional()
644
- }), NumberParamSchema = BaseParamSchema.extend({
685
+ }).transform(withDefaultDescription), NumberParamSchema = BaseParamSchema.extend({
645
686
  maxValue: z.number().optional(),
646
687
  minValue: z.number().optional()
647
- });
688
+ }).transform(withDefaultDescription);
648
689
 
649
690
  // src/command/param/Params.ts
650
691
  function createFactory(ctor) {
@@ -656,7 +697,14 @@ var Params = {
656
697
  };
657
698
 
658
699
  // src/defaults/command.ts
659
- var messageCommandHandler = defineListener(Events.MessageCreate), chatInputCommandHandler = defineListener(Events.InteractionCreate);
700
+ var messageCommandHandler = defineListener(Events.MessageCreate), chatInputCommandHandler = defineListener(Events.InteractionCreate), registerCommandsHandler = defineListener({
701
+ name: Events.ClientReady,
702
+ once: true
703
+ });
704
+ registerCommandsHandler.main(async (_, client) => {
705
+ let { commands } = client.managers, data = commands.commands.map((cmd) => cmd.toSlashCommandJSON()), result = await client.application.commands.set(data);
706
+ console.log(`Registered ${result.size} application command(s)`);
707
+ });
660
708
  messageCommandHandler.main(async (_, message) => {
661
709
  let config = getConfig();
662
710
  if (message.author.bot)
@@ -717,4 +765,4 @@ function useApp() {
717
765
  return new Instance();
718
766
  }
719
767
 
720
- export { ArgumentError, BakitClient3 as BakitClient, BakitError, BaseClientManager, BaseCommandContext, BaseParam, BaseParamSchema, ChatInputContext, Command, CommandManager, CommandOptionsSchema, Context, EVENT_INTENT_MAPPING, HookOrder, HookState, Instance, LifecycleManager, Listener, ListenerManager, ListenerOptionsSchema, MessageContext, NumberParam, NumberParamSchema, ParamUserType, Params, ProjectConfigSchema, StringParam, StringParamSchema, defineCommand, defineConfig, defineListener, getConfig, loadConfig, tokenize, useApp };
768
+ export { $jiti, ArgumentError, BakitClient3 as BakitClient, BakitError, BaseClientManager, BaseCommandContext, BaseParam, BaseParamSchema, ChatInputContext, Command, CommandManager, CommandOptionsSchema, Context, EVENT_INTENT_MAPPING, HookOrder, HookState, Instance, LifecycleManager, Listener, ListenerManager, ListenerOptionsSchema, MessageContext, NumberParam, NumberParamSchema, ParamUserType, Params, ProjectConfigSchema, StringParam, StringParamSchema, defineCommand, defineConfig, defineListener, getConfig, loadConfig, tokenize, useApp, validateParamsOrder };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bakit",
3
- "version": "2.0.0-alpha.5",
3
+ "version": "2.0.0-alpha.6",
4
4
  "description": "A framework for discord.js",
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.ts",
@@ -10,6 +10,9 @@
10
10
  "type-check": "tsc --noEmit",
11
11
  "test": "vitest run --pass-with-no-tests"
12
12
  },
13
+ "bin": {
14
+ "bakit": "./bin/bakit.js"
15
+ },
13
16
  "files": [
14
17
  "dist"
15
18
  ],
@@ -34,7 +37,10 @@
34
37
  "discord.js": "^14.0.0"
35
38
  },
36
39
  "dependencies": {
40
+ "commander": "^14.0.2",
37
41
  "dotenv": "^17.2.1",
42
+ "jiti": "^2.6.1",
43
+ "nodemon": "^3.1.11",
38
44
  "tiny-glob": "^0.2.9",
39
45
  "type-fest": "^4.41.0",
40
46
  "zod": "^4.1.12"