@raspberryvarg/bot-kit 0.0.0-stage → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/dist/core/bootstrap.d.ts +3 -0
  2. package/dist/core/bootstrap.d.ts.map +1 -0
  3. package/dist/core/bootstrap.js +86 -0
  4. package/dist/core/bootstrap.js.map +1 -0
  5. package/dist/core/config.d.ts +55 -0
  6. package/dist/core/config.d.ts.map +1 -0
  7. package/dist/core/config.js +65 -0
  8. package/dist/core/config.js.map +1 -0
  9. package/dist/core/container.d.ts +15 -0
  10. package/dist/core/container.d.ts.map +1 -0
  11. package/dist/core/container.js +50 -0
  12. package/dist/core/container.js.map +1 -0
  13. package/dist/core/index.d.ts +4 -0
  14. package/dist/core/index.d.ts.map +1 -0
  15. package/dist/core/index.js +4 -0
  16. package/dist/core/index.js.map +1 -0
  17. package/dist/discord/command.d.ts +29 -0
  18. package/dist/discord/command.d.ts.map +1 -0
  19. package/dist/discord/command.js +25 -0
  20. package/dist/discord/command.js.map +1 -0
  21. package/dist/discord/event.d.ts +22 -0
  22. package/dist/discord/event.d.ts.map +1 -0
  23. package/dist/discord/event.js +13 -0
  24. package/dist/discord/event.js.map +1 -0
  25. package/dist/discord/index.d.ts +3 -0
  26. package/dist/discord/index.d.ts.map +1 -0
  27. package/dist/discord/index.js +3 -0
  28. package/dist/discord/index.js.map +1 -0
  29. package/dist/discord/load.d.ts +4 -0
  30. package/dist/discord/load.d.ts.map +1 -0
  31. package/dist/discord/load.js +74 -0
  32. package/dist/discord/load.js.map +1 -0
  33. package/dist/discord/registry.d.ts +9 -0
  34. package/dist/discord/registry.d.ts.map +1 -0
  35. package/dist/discord/registry.js +24 -0
  36. package/dist/discord/registry.js.map +1 -0
  37. package/dist/discord/router.d.ts +3 -0
  38. package/dist/discord/router.d.ts.map +1 -0
  39. package/dist/discord/router.js +66 -0
  40. package/dist/discord/router.js.map +1 -0
  41. package/dist/index.d.ts +2 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +2 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/internal/coreLog.d.ts +3 -0
  46. package/dist/internal/coreLog.d.ts.map +1 -0
  47. package/dist/internal/coreLog.js +3 -0
  48. package/dist/internal/coreLog.js.map +1 -0
  49. package/dist/internal/internalLogger.d.ts +22 -0
  50. package/dist/internal/internalLogger.d.ts.map +1 -0
  51. package/dist/internal/internalLogger.js +58 -0
  52. package/dist/internal/internalLogger.js.map +1 -0
  53. package/package.json +48 -3
  54. package/README.md +0 -3
@@ -0,0 +1,3 @@
1
+ import { type BotKitConfigPartial } from './config.js';
2
+ export declare function bootstrap(configPartial: BotKitConfigPartial): Promise<void>;
3
+ //# sourceMappingURL=bootstrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/core/bootstrap.ts"],"names":[],"mappings":"AASA,OAAO,EAAqB,KAAK,mBAAmB,EAAa,MAAM,aAAa,CAAC;AASrF,wBAAsB,SAAS,CAAC,aAAa,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BjF"}
@@ -0,0 +1,86 @@
1
+ import crypto from 'crypto';
2
+ import { Client, REST, Routes } from 'discord.js';
3
+ import { loadAllInteractions } from '../discord/load.js';
4
+ import { gatherCommandsToJson } from '../discord/registry.js';
5
+ import { initializeRouter } from '../discord/router.js';
6
+ import { coreLog } from '../internal/coreLog.js';
7
+ import { configure } from './config.js';
8
+ const isDev = process.env.NODE_ENV === 'development';
9
+ const hmr = globalThis;
10
+ export async function bootstrap(configPartial) {
11
+ const config = configure(configPartial);
12
+ let client;
13
+ if (!isDev) {
14
+ client = new Client(config.clientOptions);
15
+ }
16
+ else {
17
+ if (hmr.discordClient) {
18
+ coreLog.info('🔥 HMR: Reusing existing client.');
19
+ client = hmr.discordClient;
20
+ }
21
+ else {
22
+ client = new Client(config.clientOptions);
23
+ }
24
+ }
25
+ await loadAllInteractions(config, client);
26
+ await deployCommandsIfNecessary(config);
27
+ if (isDev && hmr.discordClientLoggedIn) {
28
+ coreLog.info('🔥 HMR: Skipping Discord client login.');
29
+ return;
30
+ }
31
+ await client.login(config.clientToken);
32
+ if (isDev) {
33
+ hmr.discordClientLoggedIn = true;
34
+ }
35
+ initializeRouter(client);
36
+ coreLog.info('Client successfully logged in.');
37
+ }
38
+ async function deployCommandsIfNecessary(config) {
39
+ const { commandSync } = config;
40
+ let commands = gatherCommandsToJson();
41
+ if (!commands.length) {
42
+ coreLog.info('No commands found. Skipping deployment.');
43
+ return;
44
+ }
45
+ commands = commands.toSorted((a, b) => a.name.localeCompare(b.name));
46
+ const currentHash = crypto.createHash('md5').update(JSON.stringify(commands)).digest('hex');
47
+ const shouldSync = await commandSync.shouldSync(currentHash);
48
+ if (!shouldSync) {
49
+ coreLog.info('Commands are up to date. Skipping deployment.');
50
+ return;
51
+ }
52
+ coreLog.info('Detected command definition changes. Redeploying.');
53
+ await deployCommands(config, commands, commandSync.target === 'global'
54
+ ? {
55
+ syncGlobally: true,
56
+ }
57
+ : {
58
+ syncGlobally: false,
59
+ guildIds: typeof commandSync.testGuildIds === 'string'
60
+ ? [commandSync.testGuildIds]
61
+ : commandSync.testGuildIds,
62
+ });
63
+ commandSync.onSynced?.(currentHash);
64
+ }
65
+ async function deployCommands(config, commands, options) {
66
+ const Rest = new REST({ version: '10' }).setToken(config.clientToken);
67
+ if (options.syncGlobally) {
68
+ coreLog?.info('Syncing all global application commands...');
69
+ await Rest.put(Routes.applicationCommands(config.clientApplicationId), {
70
+ body: commands,
71
+ });
72
+ }
73
+ else if (options.guildIds) {
74
+ const putQueue = [];
75
+ const ids = options.guildIds;
76
+ for (const id of ids) {
77
+ coreLog?.info(`Syncing guild application commands for guildId: ${id}`);
78
+ putQueue.push(Rest.put(Routes.applicationGuildCommands(config.clientApplicationId, id), {
79
+ body: commands,
80
+ }));
81
+ }
82
+ await Promise.all(putQueue);
83
+ }
84
+ coreLog?.info('Application command sync complete');
85
+ }
86
+ //# sourceMappingURL=bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/core/bootstrap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import type { ClientOptions } from 'discord.js';
2
+ export interface BotKitConfig {
3
+ /**
4
+ * The level of logs to pass through to {@link logger}.
5
+ */
6
+ logLevel: LogLevelString;
7
+ /**
8
+ * Logger to use for framework logs.
9
+ */
10
+ logger: BotKitLogger;
11
+ /**
12
+ * Support Bun's --hot reloading (globalThis persistence of objects such as the router).
13
+ */
14
+ supportHotReloading: boolean;
15
+ clientOptions: ClientOptions;
16
+ clientToken: string;
17
+ clientApplicationId: string;
18
+ paths?: string[];
19
+ commandSync: {
20
+ shouldSync: (newHash: string) => boolean | Promise<boolean>;
21
+ onSynced?: (newHash: string) => void | Promise<void>;
22
+ } & ({
23
+ target: 'global';
24
+ } | {
25
+ target: 'development';
26
+ testGuildIds: string | string[];
27
+ });
28
+ }
29
+ export type BotKitLoggerMeta = Record<string, any>;
30
+ export interface BotKitLogger {
31
+ debug?: (message: string, meta?: BotKitLoggerMeta) => void;
32
+ info?: (message: string, meta?: BotKitLoggerMeta) => void;
33
+ verbose?: (message: string, meta?: BotKitLoggerMeta) => void;
34
+ warn: (message: string, meta?: BotKitLoggerMeta) => void;
35
+ error: (message: string, error?: unknown, meta?: Record<string, any>) => void;
36
+ }
37
+ export declare const LogLevel: {
38
+ readonly none: 0;
39
+ readonly error: 1;
40
+ readonly warn: 2;
41
+ readonly info: 3;
42
+ readonly debug: 4;
43
+ readonly verbose: 5;
44
+ };
45
+ export type LogLevelString = keyof typeof LogLevel;
46
+ declare const globalConfig: {
47
+ logLevel: "debug" | "error" | "info" | "none" | "verbose" | "warn";
48
+ logger: BotKitLogger;
49
+ supportHotReloading: false;
50
+ };
51
+ export declare function configure(options: BotKitConfigPartial): BotKitConfig;
52
+ export type BotKitConfigPartial = Omit<BotKitConfig, keyof typeof globalConfig> & Partial<Pick<BotKitConfig, keyof typeof globalConfig>>;
53
+ export declare function getConfig(): Readonly<BotKitConfig>;
54
+ export {};
55
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,QAAQ,EAAE,cAAc,CAAC;IAEzB;;OAEG;IACH,MAAM,EAAE,YAAY,CAAC;IAErB;;OAEG;IACH,mBAAmB,EAAE,OAAO,CAAC;IAE7B,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,CAAC;IAE5B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAEjB,WAAW,EAAE;QACX,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAC5D,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KACtD,GAAG,CACA;QACE,MAAM,EAAE,QAAQ,CAAC;KAClB,GACD;QACE,MAAM,EAAE,aAAa,CAAC;QACtB,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;KACjC,CACJ,CAAC;CACH;AAED,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAEnD,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC3D,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC1D,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC7D,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACzD,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;CAC/E;AAuCD,eAAO,MAAM,QAAQ;aACnB,IAAI,EAAE,CAAC;aACP,KAAK,EAAE,CAAC;aACR,IAAI,EAAE,CAAC;aACP,IAAI,EAAE,CAAC;aACP,KAAK,EAAE,CAAC;aACR,OAAO,EAAE,CAAC;CACF,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,QAAQ,CAAC;AAqBnD,QAAA,MAAM,YAAY;;;;CAIe,CAAC;AAElC,wBAAgB,SAAS,CAAC,OAAO,EAAE,mBAAmB,GAAG,YAAY,CAEpE;AAED,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,YAAY,EAAE,MAAM,OAAO,YAAY,CAAC,GAC7E,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,OAAO,YAAY,CAAC,CAAC,CAAC;AAEzD,wBAAgB,SAAS,IAAI,QAAQ,CAAC,YAAY,CAAC,CAElD"}
@@ -0,0 +1,65 @@
1
+ const useColor = process.env.FORCE_COLOR ? true : !process.env.NO_COLOR && process.stdout.isTTY;
2
+ const c = {
3
+ reset: useColor ? '\x1b[0m' : '',
4
+ bold: useColor ? '\x1b[1m' : '',
5
+ red: useColor ? '\x1b[31m' : '',
6
+ yellow: useColor ? '\x1b[33m' : '',
7
+ cyan: useColor ? '\x1b[36m' : '',
8
+ gray: useColor ? '\x1b[90m' : '',
9
+ };
10
+ function prefix(tag, colorCode) {
11
+ return `${c.bold}${colorCode}[BotKit ${tag}]${c.reset}`;
12
+ }
13
+ function formatMsg(msg) {
14
+ return !useColor ? msg : msg.replace(/`([^`]+)`/g, `${c.cyan}${c.bold}$1${c.reset}`);
15
+ }
16
+ const defaultLogger = {
17
+ warn: (msg, meta) => {
18
+ console.warn(`${prefix('Warn', c.yellow)} ${formatMsg(msg)}`, meta ?? '');
19
+ },
20
+ info: (msg, meta) => {
21
+ console.info(`${prefix('Info', c.cyan)} ${formatMsg(msg)}`, meta ?? '');
22
+ },
23
+ error: (msg, error, meta) => {
24
+ console.error(`${prefix('Error', c.red)} ${formatMsg(msg)}`, meta ?? '', error ?? '');
25
+ },
26
+ debug: (msg, meta) => {
27
+ console.debug(`${prefix('Debug', c.gray)} ${c.gray}${formatMsg(msg)}`, meta ?? '');
28
+ },
29
+ verbose: (msg, meta) => {
30
+ console.debug(`${prefix('Verbose', c.gray)} ${c.gray}${formatMsg(msg)}`, meta ?? '');
31
+ },
32
+ };
33
+ export const LogLevel = {
34
+ none: 0,
35
+ error: 1,
36
+ warn: 2,
37
+ info: 3,
38
+ debug: 4,
39
+ verbose: 5,
40
+ };
41
+ function getEnvLogLevel() {
42
+ const rawEnv = process.env.BOT_KIT_LOG_LEVEL;
43
+ if (!rawEnv)
44
+ return undefined;
45
+ const normalized = rawEnv.toLowerCase().trim();
46
+ if (normalized in LogLevel) {
47
+ return normalized;
48
+ }
49
+ console.warn(`[BotKit Warning]: Invalid BOT_KIT_LOG_LEVEL provided ("${rawEnv}"). ` +
50
+ `Expected one of: ${Object.keys(LogLevel).join(', ')}. ` +
51
+ `Falling back to default log level.`);
52
+ return undefined;
53
+ }
54
+ const globalConfig = {
55
+ logLevel: getEnvLogLevel() ?? (process.env.NODE_ENV === 'production' ? 'warn' : 'info'),
56
+ logger: defaultLogger,
57
+ supportHotReloading: false,
58
+ };
59
+ export function configure(options) {
60
+ return Object.assign(globalConfig, options);
61
+ }
62
+ export function getConfig() {
63
+ return globalConfig;
64
+ }
65
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ interface Injectable {
2
+ token: symbol | string;
3
+ }
4
+ type Token<T> = ((abstract new (...args: unknown[]) => T) & Injectable) | string | symbol;
5
+ type Factory<T> = (container: Container) => T;
6
+ declare class Container {
7
+ private registry;
8
+ private instances;
9
+ register<T>(token: Token<T>, factory: Factory<T>): void;
10
+ resolve<T>(token: Token<T>): T;
11
+ }
12
+ export declare const container: Container;
13
+ export declare function inject<T>(token: Token<T>): T;
14
+ export {};
15
+ //# sourceMappingURL=container.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../src/core/container.ts"],"names":[],"mappings":"AAIA,UAAU,UAAU;IAClB,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB;AAED,KAAK,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,GAAG,UAAU,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC;AAC1F,KAAK,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,KAAK,CAAC,CAAC;AAE9C,cAAM,SAAS;IACb,OAAO,CAAC,QAAQ,CAA+C;IAC/D,OAAO,CAAC,SAAS,CAAsC;IAEvD,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,QAyB/C;IAED,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAoB7B;CACF;AAED,eAAO,MAAM,SAAS,WAAkB,CAAC;AAEzC,wBAAgB,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAE5C"}
@@ -0,0 +1,50 @@
1
+ import { coreLog } from '../internal/coreLog.js';
2
+ const isDev = process.env.NODE_ENV === 'development';
3
+ class Container {
4
+ registry = new Map();
5
+ instances = new Map();
6
+ register(token, factory) {
7
+ if (typeof token === 'function') {
8
+ token = token.token;
9
+ }
10
+ if (isDev) {
11
+ // HMR
12
+ if (this.registry.delete(token)) {
13
+ coreLog.verbose(`HMR: Overriding inject for ${String(token)}`);
14
+ }
15
+ if (this.instances.delete(token)) {
16
+ coreLog.verbose(`HMR: Invalidating constructed instance for ${String(token)}`);
17
+ }
18
+ }
19
+ if (this.registry.has(token)) {
20
+ throw new Error(`Injectable factory has already been registered with the token: ${String(token)}`);
21
+ }
22
+ if (this.instances.has(token)) {
23
+ throw new Error(`Injectable has already been resolved with the token: ${String(token)}`);
24
+ }
25
+ this.registry.set(token, factory);
26
+ }
27
+ resolve(token) {
28
+ if (typeof token === 'function') {
29
+ token = token.token;
30
+ }
31
+ if (this.instances.has(token)) {
32
+ // oxlint-disable-next-line no-unsafe-type-assertion
33
+ return this.instances.get(token);
34
+ }
35
+ const factory = this.registry.get(token);
36
+ if (!factory) {
37
+ throw new Error(`Missing dependency: ${String(token)}`);
38
+ }
39
+ coreLog.verbose(`Resolving ${String(token)} dependency: ${String(factory)}`);
40
+ const instance = factory(this);
41
+ this.instances.set(token, instance);
42
+ // oxlint-disable-next-line no-unsafe-type-assertion
43
+ return instance;
44
+ }
45
+ }
46
+ export const container = new Container();
47
+ export function inject(token) {
48
+ return container.resolve(token);
49
+ }
50
+ //# sourceMappingURL=container.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/core/container.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,CAAC;AASrD,MAAM,SAAS;IACL,QAAQ,GAAG,IAAI,GAAG,EAAoC,CAAC;IACvD,SAAS,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEvD,QAAQ,CAAI,KAAe,EAAE,OAAmB;QAC9C,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;YAChC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QACtB,CAAC;QAED,IAAI,KAAK,EAAE,CAAC;YACV,MAAM;YACN,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChC,OAAO,CAAC,OAAO,CAAC,8BAA8B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACjE,CAAC;YACD,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjC,OAAO,CAAC,OAAO,CAAC,8CAA8C,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CACb,kEAAkE,MAAM,CAAC,KAAK,CAAC,EAAE,CAClF,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,wDAAwD,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC3F,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,CAAI,KAAe;QACxB,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;YAChC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QACtB,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,oDAAoD;YACpD,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAM,CAAC;QACxC,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,uBAAuB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC1D,CAAC;QAED,OAAO,CAAC,OAAO,CAAC,aAAa,MAAM,CAAC,KAAK,CAAC,gBAAgB,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7E,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACpC,oDAAoD;QACpD,OAAO,QAAa,CAAC;IACvB,CAAC;CACF;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;AAEzC,MAAM,UAAU,MAAM,CAAI,KAAe;IACvC,OAAO,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { inject, container } from './container.js';
2
+ export { bootstrap } from './bootstrap.js';
3
+ export * from './config.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,cAAc,aAAa,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { inject, container } from './container.js';
2
+ export { bootstrap } from './bootstrap.js';
3
+ export * from './config.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,cAAc,aAAa,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { SlashCommandBuilder, ContextMenuCommandBuilder, ChatInputCommandInteraction, ContextMenuCommandInteraction, AutocompleteInteraction } from 'discord.js';
2
+ /**
3
+ * Instantiated slash command handler definition.
4
+ */
5
+ export interface SlashCommandHandler {
6
+ __router_isSlashCommandHandler: true;
7
+ data: SlashCommandBuilder;
8
+ execute: (interaction: ChatInputCommandInteraction) => Promise<void>;
9
+ autocomplete?: (interaction: AutocompleteInteraction) => Promise<void>;
10
+ }
11
+ /**
12
+ * Creates a slash command handler definition.
13
+ */
14
+ export declare function defineSlashCommand(definition: Omit<SlashCommandHandler, '__router_isSlashCommandHandler'>): SlashCommandHandler;
15
+ export declare function isSlashCommandHandler(value: unknown): value is SlashCommandHandler;
16
+ /**
17
+ * Instantiated context menu command handler definition.
18
+ */
19
+ export interface ContextMenuCommandHandler {
20
+ __router_isContextMenuCommandHandler: true;
21
+ data: ContextMenuCommandBuilder;
22
+ execute: (interaction: ContextMenuCommandInteraction) => Promise<void>;
23
+ }
24
+ /**
25
+ * Creates a context menu command handler definition.
26
+ */
27
+ export declare function defineContextMenuCommand(definition: Omit<ContextMenuCommandHandler, '__router_isContextMenuCommandHandler'>): ContextMenuCommandHandler;
28
+ export declare function isContextMenuCommandHandler(value: unknown): value is ContextMenuCommandHandler;
29
+ //# sourceMappingURL=command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/discord/command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,yBAAyB,EACzB,2BAA2B,EAC3B,6BAA6B,EAC7B,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,8BAA8B,EAAE,IAAI,CAAC;IACrC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,OAAO,EAAE,CAAC,WAAW,EAAE,2BAA2B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,YAAY,CAAC,EAAE,CAAC,WAAW,EAAE,uBAAuB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACxE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,IAAI,CAAC,mBAAmB,EAAE,gCAAgC,CAAC,GACtE,mBAAmB,CAKrB;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,mBAAmB,CAElF;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,oCAAoC,EAAE,IAAI,CAAC;IAC3C,IAAI,EAAE,yBAAyB,CAAC;IAChC,OAAO,EAAE,CAAC,WAAW,EAAE,6BAA6B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACxE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,IAAI,CAAC,yBAAyB,EAAE,sCAAsC,CAAC,GAClF,yBAAyB,CAK3B;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,yBAAyB,CAI9F"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Creates a slash command handler definition.
3
+ */
4
+ export function defineSlashCommand(definition) {
5
+ return {
6
+ ...definition,
7
+ __router_isSlashCommandHandler: true,
8
+ };
9
+ }
10
+ export function isSlashCommandHandler(value) {
11
+ return value != null && typeof value === 'object' && '__router_isSlashCommandHandler' in value;
12
+ }
13
+ /**
14
+ * Creates a context menu command handler definition.
15
+ */
16
+ export function defineContextMenuCommand(definition) {
17
+ return {
18
+ ...definition,
19
+ __router_isContextMenuCommandHandler: true,
20
+ };
21
+ }
22
+ export function isContextMenuCommandHandler(value) {
23
+ return (value != null && typeof value === 'object' && '__router_isContextMenuCommandHandler' in value);
24
+ }
25
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/discord/command.ts"],"names":[],"mappings":"AAkBA;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,UAAuE;IAEvE,OAAO;QACL,GAAG,UAAU;QACb,8BAA8B,EAAE,IAAI;KACrC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,OAAO,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,gCAAgC,IAAI,KAAK,CAAC;AACjG,CAAC;AAWD;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,UAAmF;IAEnF,OAAO;QACL,GAAG,UAAU;QACb,oCAAoC,EAAE,IAAI;KAC3C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,KAAc;IACxD,OAAO,CACL,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,sCAAsC,IAAI,KAAK,CAC9F,CAAC;AACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { Client, ClientEvents } from 'discord.js';
2
+ export interface EventContext {
3
+ client: Client;
4
+ }
5
+ /**
6
+ * Instantiated slash command handler definition.
7
+ */
8
+ export interface EventHandler<K extends keyof ClientEvents = keyof ClientEvents> {
9
+ __router_isEventHandler: true;
10
+ /**
11
+ * Disconnect the listener as soon as the first event is fired.
12
+ */
13
+ once?: boolean;
14
+ event: K;
15
+ execute: (...args: [...ClientEvents[K], EventContext]) => void | Promise<void>;
16
+ }
17
+ /**
18
+ * Creates a slash command handler definition.
19
+ */
20
+ export declare function defineEvent<K extends keyof ClientEvents>(definition: Omit<EventHandler<K>, '__router_isEventHandler'>): EventHandler<K>;
21
+ export declare function isEventHandler(value: unknown): value is EventHandler;
22
+ //# sourceMappingURL=event.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../../src/discord/event.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEvD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,MAAM,YAAY,GAAG,MAAM,YAAY;IAC7E,uBAAuB,EAAE,IAAI,CAAC;IAC9B;;OAEG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,CAAC,CAAC;IACT,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChF;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,YAAY,EACtD,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,yBAAyB,CAAC,GAC3D,YAAY,CAAC,CAAC,CAAC,CAKjB;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAEpE"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Creates a slash command handler definition.
3
+ */
4
+ export function defineEvent(definition) {
5
+ return {
6
+ ...definition,
7
+ __router_isEventHandler: true,
8
+ };
9
+ }
10
+ export function isEventHandler(value) {
11
+ return value != null && typeof value === 'object' && '__router_isEventHandler' in value;
12
+ }
13
+ //# sourceMappingURL=event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.js","sourceRoot":"","sources":["../../src/discord/event.ts"],"names":[],"mappings":"AAmBA;;GAEG;AACH,MAAM,UAAU,WAAW,CACzB,UAA4D;IAE5D,OAAO;QACL,GAAG,UAAU;QACb,uBAAuB,EAAE,IAAI;KAC9B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,yBAAyB,IAAI,KAAK,CAAC;AAC1F,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './command.js';
2
+ export * from './event.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/discord/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './command.js';
2
+ export * from './event.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/discord/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type Client } from 'discord.js';
2
+ import type { BotKitConfig } from '../core/index.js';
3
+ export declare function loadAllInteractions(config: BotKitConfig, client: Client): Promise<void>;
4
+ //# sourceMappingURL=load.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../src/discord/load.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAQzC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAIrD,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,iBAsC7E"}
@@ -0,0 +1,74 @@
1
+ import * as path from 'node:path';
2
+ import * as bun from 'bun';
3
+ import { coreLog } from '../internal/coreLog.js';
4
+ import { isContextMenuCommandHandler, isSlashCommandHandler } from './command.js';
5
+ import { isEventHandler } from './event.js';
6
+ import * as registry from './registry.js';
7
+ const isDev = process.env.NODE_ENV === 'development';
8
+ export async function loadAllInteractions(config, client) {
9
+ if (!config.paths?.length) {
10
+ return;
11
+ }
12
+ await Promise.allSettled(config.paths.map((p) => loadFolder(p, (module) => {
13
+ for (const exported of Object.values(module)) {
14
+ if (isSlashCommandHandler(exported)) {
15
+ registry.slashCommands.set(exported.data.name, exported);
16
+ }
17
+ else if (isContextMenuCommandHandler(exported)) {
18
+ registry.contextMenuCommands.set(exported.data.name, exported);
19
+ }
20
+ else if (isEventHandler(exported)) {
21
+ const { event, once, execute } = exported;
22
+ const name = String(event);
23
+ const prev = registry.events.get(name);
24
+ if (prev) {
25
+ client.off(name, prev.execute);
26
+ registry.events.delete(name);
27
+ }
28
+ const ctx = {
29
+ client,
30
+ };
31
+ const handler = (...args) => execute(...args, ctx);
32
+ if (once) {
33
+ client.once(name, handler);
34
+ }
35
+ else {
36
+ client.on(name, handler);
37
+ }
38
+ registry.events.set(event, exported);
39
+ }
40
+ }
41
+ })));
42
+ }
43
+ async function loadFolder(dirPath, cb) {
44
+ const glob = new bun.Glob(`**/*.{ts,js,tsx,jsx}`);
45
+ const filePaths = glob.scan(dirPath);
46
+ const importOps = [];
47
+ let successCount = 0;
48
+ for await (const file of filePaths) {
49
+ const fullPath = path.join(dirPath, file);
50
+ importOps.push(loadOne(fullPath, cb)
51
+ .then(() => {
52
+ successCount++;
53
+ coreLog.verbose(`Loaded ${fullPath}`);
54
+ })
55
+ .catch((e) => {
56
+ coreLog.error(`Failed to load ${fullPath}`, e);
57
+ }));
58
+ }
59
+ coreLog.verbose(`Kicked off ${importOps.length} import load operations in parallel for ${dirPath}`);
60
+ await Promise.all(importOps);
61
+ coreLog.info(`Loaded ${successCount} files from ${dirPath}`);
62
+ }
63
+ async function loadOne(filePath, cb) {
64
+ try {
65
+ const importPath = isDev ? `${filePath}?update=${Date.now()}` : filePath;
66
+ const module = await import(importPath);
67
+ cb(module);
68
+ coreLog.verbose(`Loaded ${importPath}`);
69
+ }
70
+ catch (error) {
71
+ coreLog.error(`Failed to hot-load command: ${filePath}`, error);
72
+ }
73
+ }
74
+ //# sourceMappingURL=load.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/discord/load.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { Collection, type RESTPostAPIChatInputApplicationCommandsJSONBody, type RESTPostAPIContextMenuApplicationCommandsJSONBody } from 'discord.js';
2
+ import type { ContextMenuCommandHandler, SlashCommandHandler } from './command.js';
3
+ import type { EventHandler } from './event.js';
4
+ export declare const slashCommands: Collection<string, SlashCommandHandler>;
5
+ export declare const contextMenuCommands: Collection<string, ContextMenuCommandHandler>;
6
+ export declare const events: Collection<string, EventHandler<keyof import("discord.js").ClientEvents>>;
7
+ export type AnyApplicationCommandsJSONBody = RESTPostAPIContextMenuApplicationCommandsJSONBody | RESTPostAPIChatInputApplicationCommandsJSONBody;
8
+ export declare function gatherCommandsToJson(): ReadonlyArray<AnyApplicationCommandsJSONBody>;
9
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/discord/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,KAAK,+CAA+C,EACpD,KAAK,iDAAiD,EACvD,MAAM,YAAY,CAAC;AAIpB,OAAO,KAAK,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAqB/C,eAAO,MAAM,aAAa,yCAEqB,CAAC;AAEhD,eAAO,MAAM,mBAAmB,+CAEqB,CAAC;AAEtD,eAAO,MAAM,MAAM,2EACwE,CAAC;AAE5F,MAAM,MAAM,8BAA8B,GACtC,iDAAiD,GACjD,+CAA+C,CAAC;AAEpD,wBAAgB,oBAAoB,IAAI,aAAa,CAAC,8BAA8B,CAAC,CAKpF"}
@@ -0,0 +1,24 @@
1
+ import { Collection, } from 'discord.js';
2
+ import { coreLog } from '../internal/coreLog.js';
3
+ const isDev = process.env.NODE_ENV === 'development';
4
+ const hmr = globalThis;
5
+ if (isDev && !hmr.hotReloadCommandRegistry) {
6
+ coreLog.info('🔥 HMR: Initializing file registry.');
7
+ hmr.hotReloadCommandRegistry = {
8
+ slashCommands: new Collection(),
9
+ contextMenuCommands: new Collection(),
10
+ events: new Collection(),
11
+ };
12
+ }
13
+ export const slashCommands = (isDev && hmr.hotReloadCommandRegistry.slashCommands) ||
14
+ new Collection();
15
+ export const contextMenuCommands = (isDev && hmr.hotReloadCommandRegistry.contextMenuCommands) ||
16
+ new Collection();
17
+ export const events = (isDev && hmr.hotReloadCommandRegistry.events) || new Collection();
18
+ export function gatherCommandsToJson() {
19
+ return [
20
+ ...slashCommands.map((handler) => handler.data),
21
+ ...contextMenuCommands.map((handler) => handler.data),
22
+ ].map((builder) => builder.toJSON());
23
+ }
24
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/discord/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,GAGX,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAKjD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,CAAC;AAErD,MAAM,GAAG,GAAG,UAMX,CAAC;AAEF,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,wBAAwB,EAAE,CAAC;IAC3C,OAAO,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IACpD,GAAG,CAAC,wBAAwB,GAAG;QAC7B,aAAa,EAAE,IAAI,UAAU,EAAE;QAC/B,mBAAmB,EAAE,IAAI,UAAU,EAAE;QACrC,MAAM,EAAE,IAAI,UAAU,EAAE;KACzB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GACxB,CAAC,KAAK,IAAI,GAAG,CAAC,wBAAyB,CAAC,aAAa,CAAC;IACtD,IAAI,UAAU,EAA+B,CAAC;AAEhD,MAAM,CAAC,MAAM,mBAAmB,GAC9B,CAAC,KAAK,IAAI,GAAG,CAAC,wBAAyB,CAAC,mBAAmB,CAAC;IAC5D,IAAI,UAAU,EAAqC,CAAC;AAEtD,MAAM,CAAC,MAAM,MAAM,GACjB,CAAC,KAAK,IAAI,GAAG,CAAC,wBAAyB,CAAC,MAAM,CAAC,IAAI,IAAI,UAAU,EAAwB,CAAC;AAM5F,MAAM,UAAU,oBAAoB;IAClC,OAAO;QACL,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;QAC/C,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;KACtD,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Client } from 'discord.js';
2
+ export declare function initializeRouter(client: Client): void;
3
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/discord/router.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAe,MAAM,YAAY,CAAC;AAOtD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAWrD"}
@@ -0,0 +1,66 @@
1
+ import { coreLog } from '../internal/coreLog.js';
2
+ import * as registry from './registry.js';
3
+ const isDev = process.env.NODE_ENV === 'development';
4
+ const hmr = globalThis;
5
+ export function initializeRouter(client) {
6
+ const handler = (isDev && hmr.onInteractionCreateHandler) || handle;
7
+ if (isDev && hmr.onInteractionCreateHandler) {
8
+ client.off('interactionCreate', hmr.onInteractionCreateHandler);
9
+ }
10
+ client.on('interactionCreate', handler);
11
+ if (isDev) {
12
+ hmr.onInteractionCreateHandler = handler;
13
+ }
14
+ }
15
+ async function handle(interaction) {
16
+ try {
17
+ // oxlint-disable-next-line typescript/no-unsafe-type-assertion
18
+ await doHandle(interaction);
19
+ }
20
+ catch (error) {
21
+ coreLog.error('Error while handling interaction', error, {
22
+ id: interaction.id,
23
+ type: interaction.type,
24
+ userId: interaction.user.id,
25
+ });
26
+ }
27
+ }
28
+ async function doHandle(interaction) {
29
+ if (interaction.isChatInputCommand()) {
30
+ coreLog.verbose(`Received chat input command: ${interaction.commandName}`);
31
+ const handler = registry.slashCommands.get(interaction.commandName);
32
+ if (!handler) {
33
+ coreLog.warn(`No handler found for command: ${interaction.commandName}`);
34
+ return;
35
+ }
36
+ if (handler.autocomplete && interaction.isAutocomplete()) {
37
+ await handler.autocomplete(interaction);
38
+ }
39
+ else {
40
+ await handler.execute(interaction);
41
+ }
42
+ }
43
+ if (interaction.isAutocomplete()) {
44
+ coreLog.verbose(`Received autocomplete request: ${interaction.commandName}`);
45
+ const handler = registry.slashCommands.get(interaction.commandName);
46
+ if (!handler) {
47
+ coreLog.warn(`No handler found for command: ${interaction.commandName}`);
48
+ return;
49
+ }
50
+ if (!handler.autocomplete) {
51
+ coreLog.warn(`No autocomplete handler found for command: ${interaction.commandName}`);
52
+ return;
53
+ }
54
+ await handler.autocomplete(interaction);
55
+ }
56
+ if (interaction.isContextMenuCommand()) {
57
+ coreLog.verbose(`Received context menu command: ${interaction.commandName}`);
58
+ const handler = registry.contextMenuCommands.get(interaction.commandName);
59
+ if (!handler) {
60
+ coreLog.warn(`No handler found for command: ${interaction.commandName}`);
61
+ return;
62
+ }
63
+ await handler.execute(interaction);
64
+ }
65
+ }
66
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/discord/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './core/index.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export * from './core/index.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { InternalLogger } from './internalLogger.js';
2
+ export declare const coreLog: InternalLogger;
3
+ //# sourceMappingURL=coreLog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coreLog.d.ts","sourceRoot":"","sources":["../../src/internal/coreLog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAwB,MAAM,qBAAqB,CAAC;AAE3E,eAAO,MAAM,OAAO,EAAE,cAA+D,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { createInternalLogger } from './internalLogger.js';
2
+ export const coreLog = createInternalLogger('@raspberryvarg:bot-kit');
3
+ //# sourceMappingURL=coreLog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coreLog.js","sourceRoot":"","sources":["../../src/internal/coreLog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3E,MAAM,CAAC,MAAM,OAAO,GAAmB,oBAAoB,CAAC,wBAAwB,CAAC,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { LogLevel, type LogLevelString, type BotKitLoggerMeta } from '../core/config.js';
2
+ export declare function shouldLog(level: (typeof LogLevel)[LogLevelString]): boolean;
3
+ /**
4
+ * @internal
5
+ */
6
+ export declare class InternalLogger {
7
+ private readonly scope;
8
+ private readonly ns;
9
+ constructor(scope: string, ns?: string);
10
+ namespaced(ns: string): InternalLogger;
11
+ private fmtMsg;
12
+ verbose(msg: string, meta?: BotKitLoggerMeta): void;
13
+ debug(msg: string, maybeLazyMeta?: BotKitLoggerMeta | (() => BotKitLoggerMeta)): void;
14
+ info(msg: string, meta?: BotKitLoggerMeta): void;
15
+ warn(msg: string, meta?: BotKitLoggerMeta): void;
16
+ error(msg: string, error?: unknown, meta?: BotKitLoggerMeta): void;
17
+ }
18
+ /**
19
+ * @internal
20
+ */
21
+ export declare function createInternalLogger(scope: string): InternalLogger;
22
+ //# sourceMappingURL=internalLogger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internalLogger.d.ts","sourceRoot":"","sources":["../../src/internal/internalLogger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAa,MAAM,mBAAmB,CAAC;AAEpG,wBAAgB,SAAS,CAAC,KAAK,EAAE,CAAC,OAAO,QAAQ,CAAC,CAAC,cAAc,CAAC,GAAG,OAAO,CAE3E;AAED;;GAEG;AACH,qBAAa,cAAc;IAEvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,EAAE;IAFrB,YACmB,KAAK,EAAE,MAAM,EACb,EAAE,GAAE,MAAW,EAC9B;IAEJ,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,CAErC;IAED,OAAO,CAAC,MAAM;IAQd,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB,QAI3C;IAED,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,gBAAgB,GAAG,CAAC,MAAM,gBAAgB,CAAC,QAK7E;IAED,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB,QAIxC;IAED,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB,QAIxC;IAED,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,gBAAgB,QAI1D;CACF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,CAElE"}
@@ -0,0 +1,58 @@
1
+ import { LogLevel, getConfig } from '../core/config.js';
2
+ export function shouldLog(level) {
3
+ return LogLevel[getConfig().logLevel] >= level;
4
+ }
5
+ /**
6
+ * @internal
7
+ */
8
+ export class InternalLogger {
9
+ scope;
10
+ ns;
11
+ constructor(scope, ns = '') {
12
+ this.scope = scope;
13
+ this.ns = ns;
14
+ }
15
+ namespaced(ns) {
16
+ return new InternalLogger(this.scope, ns);
17
+ }
18
+ fmtMsg(msg) {
19
+ let str = `[${this.scope}`;
20
+ if (this.ns) {
21
+ str += `:${this.ns}`;
22
+ }
23
+ return `${str}] ${msg}`;
24
+ }
25
+ verbose(msg, meta) {
26
+ if (shouldLog(LogLevel.verbose)) {
27
+ getConfig().logger.verbose?.(this.fmtMsg(msg), meta);
28
+ }
29
+ }
30
+ debug(msg, maybeLazyMeta) {
31
+ if (shouldLog(LogLevel.debug)) {
32
+ const meta = typeof maybeLazyMeta === 'function' ? maybeLazyMeta() : maybeLazyMeta;
33
+ getConfig().logger.debug?.(this.fmtMsg(msg), meta);
34
+ }
35
+ }
36
+ info(msg, meta) {
37
+ if (shouldLog(LogLevel.info)) {
38
+ getConfig().logger.info?.(this.fmtMsg(msg), meta);
39
+ }
40
+ }
41
+ warn(msg, meta) {
42
+ if (shouldLog(LogLevel.warn)) {
43
+ getConfig().logger.warn(this.fmtMsg(msg), meta);
44
+ }
45
+ }
46
+ error(msg, error, meta) {
47
+ if (shouldLog(LogLevel.error)) {
48
+ getConfig().logger.error(this.fmtMsg(msg), error, meta);
49
+ }
50
+ }
51
+ }
52
+ /**
53
+ * @internal
54
+ */
55
+ export function createInternalLogger(scope) {
56
+ return new InternalLogger(scope);
57
+ }
58
+ //# sourceMappingURL=internalLogger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internalLogger.js","sourceRoot":"","sources":["../../src/internal/internalLogger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAA8C,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEpG,MAAM,UAAU,SAAS,CAAC,KAAwC;IAChE,OAAO,QAAQ,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,cAAc;IAEN,KAAK;IACL,EAAE;IAFrB,YACmB,KAAa,EACb,EAAE,GAAW,EAAE;qBADf,KAAK;kBACL,EAAE;IAClB,CAAC;IAEJ,UAAU,CAAC,EAAU;QACnB,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC5C,CAAC;IAEO,MAAM,CAAC,GAAW;QACxB,IAAI,GAAG,GAAG,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,GAAG,IAAI,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;QACvB,CAAC;QACD,OAAO,GAAG,GAAG,KAAK,GAAG,EAAE,CAAC;IAC1B,CAAC;IAED,OAAO,CAAC,GAAW,EAAE,IAAuB;QAC1C,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAChC,SAAS,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAW,EAAE,aAA2D;QAC5E,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,OAAO,aAAa,KAAK,UAAU,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;YACnF,SAAS,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,GAAW,EAAE,IAAuB;QACvC,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,SAAS,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,GAAW,EAAE,IAAuB;QACvC,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,SAAS,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAW,EAAE,KAAe,EAAE,IAAuB;QACzD,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,SAAS,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,OAAO,IAAI,cAAc,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,51 @@
1
1
  {
2
2
  "name": "@raspberryvarg/bot-kit",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "1.0.1",
4
+ "private": false,
5
+ "description": "",
6
+ "keywords": [],
7
+ "license": "ISC",
8
+ "directories": {
9
+ "lib": "dist"
10
+ },
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "type": "module",
15
+ "main": "./dist/index.js",
16
+ "types": "./dist/index.d.ts",
17
+ "exports": {
18
+ "./package.json": "./package.json",
19
+ ".": {
20
+ "types": "./dist/index.d.ts",
21
+ "default": "./dist/index.js"
22
+ },
23
+ "./discord": {
24
+ "types": "./dist/discord/index.d.ts",
25
+ "default": "./dist/discord/index.js"
26
+ }
27
+ },
28
+ "publishConfig": {
29
+ "access": "public"
30
+ },
31
+ "devDependencies": {
32
+ "@raspberryvarg/config": "1.0.0",
33
+ "@types/bun": "^1.4.2",
34
+ "discord.js": "^14.27.0",
35
+ "oxfmt": "^0.72.0",
36
+ "oxlint": "^1.87.0",
37
+ "oxlint-tsgolint": "^7.0.2004",
38
+ "typescript": "^7.0.2"
39
+ },
40
+ "devEngines": {
41
+ "packageManager": {
42
+ "name": "pnpm",
43
+ "version": "12.11.2",
44
+ "onFail": "download"
45
+ }
46
+ },
47
+ "scripts": {
48
+ "test": "bun test",
49
+ "build": "tsc -p ./tsconfig.build.json"
50
+ }
6
51
  }
package/README.md DELETED
@@ -1,3 +0,0 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.