sugar-djs 0.2.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.
package/Readme.ja.md ADDED
@@ -0,0 +1,113 @@
1
+ # Sugar-DJS (discordjs-builder-wrapper)
2
+
3
+ discord.jsをTypeScriptでもっと楽しく書くためのライブラリ!
4
+
5
+ ## 対応バージョン
6
+
7
+ ```
8
+ discord.js: "^14.23.2"
9
+ ```
10
+
11
+ ## 使い方の例
12
+
13
+ `SlashCommand`のサンプル
14
+
15
+ ```typescript
16
+ import { wrapper } from 'sugar-djs';
17
+ import { SlashCommandBuilder } from 'discord.js';
18
+ import { isCachedInteraction } from './middlewares.ts';
19
+
20
+ export default wrapper
21
+ .setCommand(
22
+ // discord.jsのBuilderをそのまま使用
23
+ new SlashCommandBuilder()
24
+ .setName('ping')
25
+ .setDescription('Send "Pong!"')
26
+ )
27
+ .addMiddleware(isCachedInteraction) // キャッシュされたインタラクションのみ許可
28
+ .setProcess(({ interaction }) => {
29
+ // interaction: ChatInputCommandInteraction<"cached">;
30
+ interaction.reply('Ping!');
31
+ });
32
+ ```
33
+
34
+ ## 特徴
35
+
36
+ `Sugar-DJS`を使うと、一部の型指定を省略したり、共通の処理を簡単に挿入できたりすることで、スピーディーにボットを制作することができます。
37
+
38
+ ### 適切なInteraction型を推論
39
+
40
+ `Sugar-DJS`は、渡された`Builder`から適切な`Interaction`を選択して、`setProcess`メソッドの引数の型に指定します。
41
+
42
+ ### ミドルウェア概念の導入
43
+
44
+ コマンドやコンポーネントの処理の前に、ミドルウェアを追加することができます。ミドルウェアは、`Interaction`を含むペイロードを使って処理を行い、元のペイロードと追加のデータを返すことができます。また、ペイロードに含まれる形を絞る事もできます。
45
+
46
+ #### Interactionが'cached'であることを確認する例
47
+ ```typescript
48
+ import { AnyInteraction, MiddlewarePayload } from 'sugar-djs';
49
+
50
+ export const isCachedInteraction = <T extends AnyInteraction, U>({
51
+ interaction,
52
+ ...payload
53
+ }: MiddlewarePayload<T, U>) => {
54
+ if (!interaction.inCachedGuild()) {
55
+ interaction.reply("サーバー内で実行してください");
56
+ return; // voidを返した場合、次の処理は実行されません。
57
+ }
58
+ return { interaction, ...payload };
59
+ };
60
+ ```
61
+
62
+ ## 導入方法
63
+
64
+ ### 1. sugardjs.tsの作成
65
+
66
+ コマンドやコンポーネントが格納されているディレクトリを指定して、`WrapperCollection`に渡します。
67
+
68
+ ```typescript
69
+ // sugardjs.ts
70
+ import path from 'path';
71
+ import { WrapperCollection } from 'sugar-djs';
72
+
73
+ const commandsPath = path.join(__dirname, './commands');
74
+ const componentsPath = path.join(__dirname, './components');
75
+
76
+ export default new WrapperCollection({
77
+ paths: [commandsPath, componentsPath],
78
+ });
79
+ ```
80
+
81
+ ### 2.discord.jsに接続
82
+
83
+ 手順1で作成した`WrapperCollection`の`interactionCreateHandler`をdiscord.jsの`InteractionCreate`イベントにイベントハンドラーとして渡します。
84
+
85
+ ```typescript
86
+ // index.ts
87
+ import wrappers from "./sugardjs";
88
+ ...
89
+ client.on('interactionCreate', wrappers.interactionCreateHandler);
90
+ ...
91
+ ```
92
+
93
+ ### 3.register.tsの作成
94
+
95
+ 手順1で作成した`WrapperCollection`の`toJSON`メソッドを活用すると、簡単にコマンドやコンポーネントを登録する処理が書けます。
96
+
97
+ ```typescript
98
+ // register.ts
99
+ import { REST, Routes } from 'discord.js';
100
+ import wrappers from './sugardjs';
101
+
102
+ const TOKEN = process.env.DISCORD_TOKEN;
103
+ const CLIENT_ID = process.env.DISCORD_CLIENT_ID;
104
+
105
+ const rest = new REST({ version: '10' }).setToken(TOKEN);
106
+ const commands = wrappers.toJSON(); // Discord API に渡せるJSONのリストを返します。
107
+ await rest.put(Routes.applicationCommands(CLIENT_ID), {
108
+ body: commands,
109
+ });
110
+ ```
111
+
112
+ ## ライセンス
113
+ MIT License (see `LICENSE` file).
package/Readme.md ADDED
@@ -0,0 +1,32 @@
1
+ # Sugar-DJS (discordjs-builder-wrapper)
2
+
3
+ Library for writing discord.js in TypeScript for more fun!
4
+
5
+ ## Supported Versions
6
+
7
+ ```
8
+ discord.js: "^14.23.2"
9
+ ```
10
+
11
+ # Usege
12
+
13
+ SlashCommand Example
14
+
15
+ ```typescript
16
+ import { wrapper } from 'sugar-djs';
17
+ import { SlashCommandBuilder } from 'discord.js';
18
+
19
+ export default wrapper
20
+ .setCommand(
21
+ new SlashCommandBuilder()
22
+ .setName('ping')
23
+ .setDescription('Send "Pong!"')
24
+ )
25
+ .setProcess(({ interaction }) => {
26
+ interaction.reply('Ping!');
27
+ });
28
+ ```
29
+
30
+ # What is useful?
31
+
32
+ This library frees developers from the hassle of type specification.
@@ -0,0 +1,47 @@
1
+ import { Collection, Interaction } from 'discord.js';
2
+ import { AnyCommandData, AnyComponentData } from './wrapper';
3
+ export interface WrapperCollectionOptions {
4
+ paths: string[];
5
+ }
6
+ export interface WrapperCollectionCollections {
7
+ slashCommands: Collection<string, AnyCommandData>;
8
+ userCtxCommands: Collection<string, AnyCommandData>;
9
+ messageCtxCommands: Collection<string, AnyCommandData>;
10
+ components: Collection<string, AnyComponentData>;
11
+ }
12
+ export declare class WrapperCollection {
13
+ private options;
14
+ readonly collections: WrapperCollectionCollections;
15
+ constructor(options: WrapperCollectionOptions);
16
+ /**
17
+ * Return json list for registering commands to Discord.
18
+ */
19
+ toJSON: () => string[];
20
+ interactionCreateHandler: (interaction: Interaction) => Promise<void>;
21
+ /**
22
+ * Execute a component process.
23
+ * @param interaction AnyComponentInteraction
24
+ * @param collection AnyCollection
25
+ */
26
+ private executeComponent;
27
+ /**
28
+ * Execute a command process.
29
+ * @param interaction AnyComponentInteraction
30
+ * @param collection AnyCollection
31
+ */
32
+ private executeCommand;
33
+ /**
34
+ * Execute an autocomplete process.
35
+ * @param interaction
36
+ * @param collection
37
+ *
38
+ */
39
+ private executeAutocomplete;
40
+ /**
41
+ * Execute middlewares and command.
42
+ * @param payload MiddlewarePayload
43
+ * @param command AnyCommand and AnyComponent execute function
44
+ * @param middlewares Array of Middleware
45
+ */
46
+ private execute;
47
+ }
@@ -0,0 +1,177 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.WrapperCollection = void 0;
7
+ const discord_js_1 = require("discord.js");
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const custom_id_1 = require("./custom-id");
11
+ class WrapperCollection {
12
+ constructor(options) {
13
+ this.options = options;
14
+ /**
15
+ * Return json list for registering commands to Discord.
16
+ */
17
+ this.toJSON = () => {
18
+ let commands = this.collections.slashCommands;
19
+ commands = commands.concat(this.collections.userCtxCommands);
20
+ commands = commands.concat(this.collections.messageCtxCommands);
21
+ return commands.map((c) => c.data.toJSON());
22
+ };
23
+ this.interactionCreateHandler = async (interaction) => {
24
+ if (interaction.isCommand()) {
25
+ await this.executeCommand(interaction);
26
+ }
27
+ else if (interaction.isAutocomplete()) {
28
+ await this.executeAutocomplete(interaction);
29
+ }
30
+ else if (interaction.isButton() || interaction.isModalSubmit() || interaction.isAnySelectMenu()) {
31
+ await this.executeComponent(interaction);
32
+ }
33
+ };
34
+ this.collections = {
35
+ slashCommands: new discord_js_1.Collection(),
36
+ userCtxCommands: new discord_js_1.Collection(),
37
+ messageCtxCommands: new discord_js_1.Collection(),
38
+ components: new discord_js_1.Collection(),
39
+ };
40
+ // ファイル探索
41
+ let pathList = this.options.paths;
42
+ while (pathList.length) {
43
+ const currentDir = pathList.shift();
44
+ if (!currentDir)
45
+ continue;
46
+ const dirents = fs_1.default.readdirSync(currentDir, { withFileTypes: true });
47
+ dirents.forEach((dirent) => {
48
+ const filePath = path_1.default.join(currentDir, dirent.name);
49
+ if (dirent.isDirectory()) {
50
+ pathList.push(filePath); // ディレクトリの場合は探索キューに追加
51
+ }
52
+ else if (dirent.name.endsWith('.js') || dirent.name.endsWith('.ts')) {
53
+ let fileData = require(filePath);
54
+ if (!fileData)
55
+ return;
56
+ if (typeof fileData === 'object' && 'default' in fileData) {
57
+ fileData = fileData.default;
58
+ }
59
+ const item = fileData;
60
+ if (!('execute' in item))
61
+ return;
62
+ if ('data' in item) {
63
+ // Any Command
64
+ if ('type' in item.data) {
65
+ // AnyContextMenuCommand
66
+ if (item.data.type == discord_js_1.ApplicationCommandType.User) {
67
+ // UserContextMenuCommand
68
+ this.collections.userCtxCommands.set(item.data.name, item);
69
+ }
70
+ else if (item.data.type == discord_js_1.ApplicationCommandType.Message) {
71
+ // MessageContextMenuCommand
72
+ this.collections.messageCtxCommands.set(item.data.name, item);
73
+ }
74
+ }
75
+ else {
76
+ // SlashCommand
77
+ this.collections.slashCommands.set(item.data.name, item);
78
+ }
79
+ }
80
+ else if ('customId' in item) {
81
+ // Any Component
82
+ this.collections.components.set(item.customId, item);
83
+ }
84
+ }
85
+ });
86
+ }
87
+ }
88
+ /**
89
+ * Execute a component process.
90
+ * @param interaction AnyComponentInteraction
91
+ * @param collection AnyCollection
92
+ */
93
+ async executeComponent(interaction) {
94
+ const [customId, args] = (0, custom_id_1.parseCustomId)(interaction.customId);
95
+ const component = this.collections.components.get(customId);
96
+ if (!component) {
97
+ console.log(`Component "${interaction.customId}" not found.`);
98
+ }
99
+ else {
100
+ try {
101
+ this.execute({ interaction, args }, component.execute, component.middlewares);
102
+ }
103
+ catch (error) {
104
+ console.log(`Error on component "${interaction.customId}"`);
105
+ console.error(error);
106
+ }
107
+ }
108
+ }
109
+ /**
110
+ * Execute a command process.
111
+ * @param interaction AnyComponentInteraction
112
+ * @param collection AnyCollection
113
+ */
114
+ async executeCommand(interaction) {
115
+ let command;
116
+ let commandType = 'Unknown';
117
+ if (interaction.isChatInputCommand()) {
118
+ commandType = 'SlashCommand';
119
+ command = this.collections.slashCommands.get(interaction.commandName);
120
+ }
121
+ else if (interaction.isUserContextMenuCommand()) {
122
+ commandType = 'UserContextMenuCommand';
123
+ command = this.collections.userCtxCommands.get(interaction.commandName);
124
+ }
125
+ else if (interaction.isMessageContextMenuCommand()) {
126
+ commandType = 'MessageContextMenuCommand';
127
+ command = this.collections.messageCtxCommands.get(interaction.commandName);
128
+ }
129
+ if (!command) {
130
+ console.log(`${commandType} "${interaction.commandName}" not found.`);
131
+ }
132
+ else {
133
+ try {
134
+ this.execute({ interaction }, command.execute, command.middlewares);
135
+ }
136
+ catch (error) {
137
+ console.log(`Error on ${commandType} "${interaction.commandName}"`);
138
+ console.error(error);
139
+ }
140
+ }
141
+ }
142
+ /**
143
+ * Execute an autocomplete process.
144
+ * @param interaction
145
+ * @param collection
146
+ *
147
+ */
148
+ async executeAutocomplete(interaction) {
149
+ const command = this.collections.slashCommands.get(interaction.commandName);
150
+ if (!command) {
151
+ console.log(`Command "${interaction.commandName}" not found.`);
152
+ }
153
+ else if (command.autocomplete) {
154
+ await command.autocomplete(interaction);
155
+ }
156
+ }
157
+ /**
158
+ * Execute middlewares and command.
159
+ * @param payload MiddlewarePayload
160
+ * @param command AnyCommand and AnyComponent execute function
161
+ * @param middlewares Array of Middleware
162
+ */
163
+ async execute(payload, command, middlewares) {
164
+ const middleware = middlewares.shift();
165
+ if (middleware) {
166
+ const mwResult = await middleware(payload);
167
+ if (mwResult) {
168
+ return await this.execute(mwResult, command, middlewares);
169
+ }
170
+ }
171
+ else {
172
+ return command(payload);
173
+ }
174
+ }
175
+ }
176
+ exports.WrapperCollection = WrapperCollection;
177
+ //# sourceMappingURL=collection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection.js","sourceRoot":"","sources":["../src/collection.ts"],"names":[],"mappings":";;;;;;AAAA,2CAAsG;AACtG,4CAAoB;AACpB,gDAAwB;AAExB,2CAA4C;AAsB5C,MAAa,iBAAiB;IAE7B,YAAoB,OAAiC;QAAjC,YAAO,GAAP,OAAO,CAA0B;QAoDrD;;WAEG;QACI,WAAM,GAAG,GAAa,EAAE;YAC9B,IAAI,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC;YAC9C,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;YAC7D,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;YAChE,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7C,CAAC,CAAC;QAEK,6BAAwB,GAAG,KAAK,EAAE,WAAwB,EAAE,EAAE;YACpE,IAAI,WAAW,CAAC,SAAS,EAAE,EAAE,CAAC;gBAC7B,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;YACxC,CAAC;iBAAM,IAAI,WAAW,CAAC,cAAc,EAAE,EAAE,CAAC;gBACzC,MAAM,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;YAC7C,CAAC;iBAAM,IAAI,WAAW,CAAC,QAAQ,EAAE,IAAI,WAAW,CAAC,aAAa,EAAE,IAAI,WAAW,CAAC,eAAe,EAAE,EAAE,CAAC;gBACnG,MAAM,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;YAC1C,CAAC;QACF,CAAC,CAAC;QArED,IAAI,CAAC,WAAW,GAAG;YAClB,aAAa,EAAE,IAAI,uBAAU,EAA0B;YACvD,eAAe,EAAE,IAAI,uBAAU,EAA0B;YACzD,kBAAkB,EAAE,IAAI,uBAAU,EAA0B;YAC5D,UAAU,EAAE,IAAI,uBAAU,EAA4B;SACtD,CAAC;QAEF,SAAS;QACT,IAAI,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QAClC,OAAO,QAAQ,CAAC,MAAM,EAAE,CAAC;YACxB,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;YACpC,IAAI,CAAC,UAAU;gBAAE,SAAS;YAE1B,MAAM,OAAO,GAAG,YAAE,CAAC,WAAW,CAAC,UAAU,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YACpE,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC1B,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;gBACpD,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;oBAC1B,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,qBAAqB;gBAC/C,CAAC;qBAAM,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBACvE,IAAI,QAAQ,GAAY,OAAO,CAAC,QAAQ,CAAC,CAAC;oBAC1C,IAAI,CAAC,QAAQ;wBAAE,OAAO;oBACtB,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,SAAS,IAAI,QAAQ,EAAE,CAAC;wBAC3D,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC;oBAC7B,CAAC;oBACD,MAAM,IAAI,GAAG,QAA6C,CAAC;oBAC3D,IAAI,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC;wBAAE,OAAO;oBAEjC,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;wBACpB,cAAc;wBACd,IAAI,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;4BACzB,wBAAwB;4BACxB,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,mCAAsB,CAAC,IAAI,EAAE,CAAC;gCACnD,yBAAyB;gCACzB,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;4BAC5D,CAAC;iCAAM,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,mCAAsB,CAAC,OAAO,EAAE,CAAC;gCAC7D,4BAA4B;gCAC5B,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;4BAC/D,CAAC;wBACF,CAAC;6BAAM,CAAC;4BACP,eAAe;4BACf,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;wBAC1D,CAAC;oBACF,CAAC;yBAAM,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;wBAC/B,gBAAgB;wBAChB,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;oBACtD,CAAC;gBACF,CAAC;YACF,CAAC,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IAsBD;;;;OAIG;IACK,KAAK,CAAC,gBAAgB,CAAoC,WAAc;QAC/E,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,IAAA,yBAAa,EAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5D,IAAI,CAAC,SAAS,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,cAAc,WAAW,CAAC,QAAQ,cAAc,CAAC,CAAC;QAC/D,CAAC;aAAM,CAAC;YACP,IAAI,CAAC;gBACJ,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;YAC/E,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,uBAAuB,WAAW,CAAC,QAAQ,GAAG,CAAC,CAAC;gBAC5D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;QACF,CAAC;IACF,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,cAAc,CAAkC,WAAc;QAC3E,IAAI,OAAO,CAAC;QACZ,IAAI,WAAW,GAAW,SAAS,CAAC;QACpC,IAAI,WAAW,CAAC,kBAAkB,EAAE,EAAE,CAAC;YACtC,WAAW,GAAG,cAAc,CAAC;YAC7B,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QACvE,CAAC;aAAM,IAAI,WAAW,CAAC,wBAAwB,EAAE,EAAE,CAAC;YACnD,WAAW,GAAG,wBAAwB,CAAC;YACvC,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QACzE,CAAC;aAAM,IAAI,WAAW,CAAC,2BAA2B,EAAE,EAAE,CAAC;YACtD,WAAW,GAAG,2BAA2B,CAAC;YAC1C,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAC5E,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,GAAG,WAAW,KAAK,WAAW,CAAC,WAAW,cAAc,CAAC,CAAC;QACvE,CAAC;aAAM,CAAC;YACP,IAAI,CAAC;gBACJ,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;YACrE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,YAAY,WAAW,KAAK,WAAW,CAAC,WAAW,GAAG,CAAC,CAAC;gBACpE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;QACF,CAAC;IACF,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,mBAAmB,CAAC,WAAoC;QACrE,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAC5E,IAAI,CAAC,OAAO,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,YAAY,WAAW,CAAC,WAAW,cAAc,CAAC,CAAC;QAChE,CAAC;aAAM,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACjC,MAAM,OAAO,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QACzC,CAAC;IACF,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,OAAO,CAKpB,OAAU,EACV,OAA4D,EAC5D,WAA+B;QAE/B,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,EAAE,CAAC;QACvC,IAAI,UAAU,EAAE,CAAC;YAChB,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;YAC3C,IAAI,QAAQ,EAAE,CAAC;gBACd,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;YAC3D,CAAC;QACF,CAAC;aAAM,CAAC;YACP,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;IACF,CAAC;CACD;AApKD,8CAoKC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * カスタムID用エンコード関数
3
+ * @param id 文字列
4
+ * @returns エンコード済みカスタムID
5
+ */
6
+ export declare function encodeId(id?: string): string;
7
+ /**
8
+ * カスタムID用デコード関数
9
+ * @param id 文字列
10
+ * @returns デコード済み文字列
11
+ */
12
+ export declare function decodeId(id?: string): string;
13
+ /**
14
+ * カスタムIDを解析
15
+ * @param id カスタムID
16
+ * @returns カスタムIDと引数のタプル
17
+ */
18
+ export declare function parseCustomId(id: string): [string, string[]];
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.encodeId = encodeId;
4
+ exports.decodeId = decodeId;
5
+ exports.parseCustomId = parseCustomId;
6
+ //カスタムIDのエンコード用
7
+ const encodeList = [
8
+ {
9
+ reg_d: /\$d;/g,
10
+ reg_e: '$$d;',
11
+ string: '$',
12
+ },
13
+ {
14
+ reg_d: /\$a;/g,
15
+ reg_e: '$$a;',
16
+ string: '&',
17
+ },
18
+ {
19
+ reg_d: /\$q;/g,
20
+ reg_e: '$$q;',
21
+ string: '?',
22
+ },
23
+ ];
24
+ /**
25
+ * カスタムID用エンコード関数
26
+ * @param id 文字列
27
+ * @returns エンコード済みカスタムID
28
+ */
29
+ function encodeId(id) {
30
+ if (!id)
31
+ return '';
32
+ return encodeList.reduce((id, data) => {
33
+ return id.replaceAll(data.string, data.reg_e);
34
+ }, id);
35
+ }
36
+ /**
37
+ * カスタムID用デコード関数
38
+ * @param id 文字列
39
+ * @returns デコード済み文字列
40
+ */
41
+ function decodeId(id) {
42
+ if (!id)
43
+ return '';
44
+ return encodeList.reduce((id, data) => {
45
+ return id.replaceAll(data.reg_d, data.string);
46
+ }, id);
47
+ }
48
+ /**
49
+ * カスタムIDを解析
50
+ * @param id カスタムID
51
+ * @returns カスタムIDと引数のタプル
52
+ */
53
+ function parseCustomId(id) {
54
+ const idWithArgs = id.split('?');
55
+ const customId = decodeId(idWithArgs.shift());
56
+ if (!idWithArgs.length)
57
+ return [customId, []];
58
+ const args = idWithArgs[0].split('&').map((arg) => decodeId(arg));
59
+ return [customId, args];
60
+ }
61
+ //# sourceMappingURL=custom-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-id.js","sourceRoot":"","sources":["../src/custom-id.ts"],"names":[],"mappings":";;AAwBA,4BAKC;AAOD,4BAKC;AAOD,sCAMC;AAtDD,eAAe;AACf,MAAM,UAAU,GAAG;IAClB;QACC,KAAK,EAAE,OAAO;QACd,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,GAAG;KACX;IACD;QACC,KAAK,EAAE,OAAO;QACd,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,GAAG;KACX;IACD;QACC,KAAK,EAAE,OAAO;QACd,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,GAAG;KACX;CACD,CAAC;AAEF;;;;GAIG;AACH,SAAgB,QAAQ,CAAC,EAAW;IACnC,IAAI,CAAC,EAAE;QAAE,OAAO,EAAE,CAAC;IACnB,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE;QACrC,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC,EAAE,EAAE,CAAC,CAAC;AACR,CAAC;AAED;;;;GAIG;AACH,SAAgB,QAAQ,CAAC,EAAW;IACnC,IAAI,CAAC,EAAE;QAAE,OAAO,EAAE,CAAC;IACnB,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE;QACrC,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC,EAAE,EAAE,CAAC,CAAC;AACR,CAAC;AAED;;;;GAIG;AACH,SAAgB,aAAa,CAAC,EAAU;IACvC,MAAM,UAAU,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;IAC9C,IAAI,CAAC,UAAU,CAAC,MAAM;QAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IAClE,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './wrapper';
2
+ export { AnyInteraction, MiddlewarePayload } from './types';
3
+ export { WrapperCollection } from './collection';
package/dist/index.js ADDED
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.WrapperCollection = void 0;
18
+ __exportStar(require("./wrapper"), exports);
19
+ var collection_1 = require("./collection");
20
+ Object.defineProperty(exports, "WrapperCollection", { enumerable: true, get: function () { return collection_1.WrapperCollection; } });
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,4CAA0B;AAE1B,2CAAiD;AAAxC,+GAAA,iBAAiB,OAAA"}
@@ -0,0 +1,38 @@
1
+ import { ButtonBuilder, ModalBuilder, StringSelectMenuBuilder, UserSelectMenuBuilder, RoleSelectMenuBuilder, MentionableSelectMenuBuilder, ChannelSelectMenuBuilder, CacheType, ButtonInteraction, ModalSubmitInteraction, StringSelectMenuInteraction, UserSelectMenuInteraction, RoleSelectMenuInteraction, MentionableSelectMenuInteraction, ChannelSelectMenuInteraction, PrimaryEntryPointCommandInteraction, SlashCommandBuilder as SCB, ChatInputCommandInteraction, ContextMenuCommandBuilder, ContextMenuCommandInteraction, SlashCommandSubcommandsOnlyBuilder, ApplicationCommandType, UserContextMenuCommandInteraction, MessageContextMenuCommandInteraction, SlashCommandOptionsOnlyBuilder } from 'discord.js';
2
+ export type UnwrapOrDefault<V, D> = V extends undefined ? D : Exclude<V, undefined>;
3
+ export type MaybePromise<T> = T | Promise<T>;
4
+ /**
5
+ * スマートコンポーネントで作れるコマンド
6
+ */
7
+ type SlashCommandBuilder = SCB | Omit<SCB, 'addSubcommand' | 'addSubcommandGroup'> | SlashCommandOptionsOnlyBuilder | SlashCommandSubcommandsOnlyBuilder;
8
+ export type AnyCommandBuilder = SlashCommandBuilder | ContextMenuCommandBuilder;
9
+ /**
10
+ * スマートコンポーネントで作れるコンポーネント
11
+ */
12
+ export type AnyComponentBuilder = ButtonBuilder | ModalBuilder | StringSelectMenuBuilder | UserSelectMenuBuilder | RoleSelectMenuBuilder | MentionableSelectMenuBuilder | ChannelSelectMenuBuilder;
13
+ export type AnyBuilder = AnyCommandBuilder | AnyComponentBuilder;
14
+ /**
15
+ * スマートコンポーネントで扱うコマンドインタラクション
16
+ */
17
+ export type AnyCommandInteraction<Cached extends CacheType = CacheType> = ChatInputCommandInteraction<Cached> | ContextMenuCommandInteraction<Cached> | UserContextMenuCommandInteraction<Cached> | MessageContextMenuCommandInteraction<Cached> | PrimaryEntryPointCommandInteraction<Cached>;
18
+ /**
19
+ * スマートコンポーネントで扱うコンポーネントインタラクション
20
+ */
21
+ export type AnyComponentInteraction<Cached extends CacheType = CacheType> = ButtonInteraction<Cached> | ModalSubmitInteraction<Cached> | StringSelectMenuInteraction<Cached> | StringSelectMenuInteraction<Cached> | UserSelectMenuInteraction<Cached> | RoleSelectMenuInteraction<Cached> | MentionableSelectMenuInteraction<Cached> | ChannelSelectMenuInteraction<Cached>;
22
+ export type AnyInteraction<Cached extends CacheType = CacheType> = AnyCommandInteraction<Cached> | AnyComponentInteraction<Cached>;
23
+ /**
24
+ * ビルダーからインターフェースへ変換
25
+ */
26
+ export type inferBuilder<Builder extends AnyBuilder, CommandType extends ApplicationCommandType = ApplicationCommandType> = Builder extends ButtonBuilder ? ButtonInteraction : Builder extends ModalBuilder ? ModalSubmitInteraction : Builder extends StringSelectMenuBuilder ? StringSelectMenuInteraction : Builder extends UserSelectMenuBuilder ? UserSelectMenuInteraction : Builder extends RoleSelectMenuBuilder ? RoleSelectMenuInteraction : Builder extends MentionableSelectMenuBuilder ? MentionableSelectMenuInteraction : Builder extends ChannelSelectMenuBuilder ? ChannelSelectMenuInteraction : Builder extends SlashCommandBuilder ? ChatInputCommandInteraction : Builder extends ContextMenuCommandBuilder ? inferCommandType<CommandType> : never;
27
+ export type inferCommandType<CommandType extends ApplicationCommandType> = CommandType extends ApplicationCommandType.User ? UserContextMenuCommandInteraction : CommandType extends ApplicationCommandType.Message ? MessageContextMenuCommandInteraction : never;
28
+ export type MiddlewarePayload<T extends AnyInteraction = AnyInteraction<any>, U extends any = {}> = {
29
+ interaction: T;
30
+ } & U;
31
+ export interface MiddlewarePayloadWithArgs<T extends AnyComponentInteraction = AnyComponentInteraction<any>> extends MiddlewarePayload<T, {
32
+ args: string[];
33
+ }> {
34
+ interaction: T;
35
+ args: string[];
36
+ }
37
+ export type Middleware<T extends AnyInteraction = AnyInteraction<any>, U extends any = {}, V extends MiddlewarePayload<T, U> = MiddlewarePayload<T, U>> = (input: MiddlewarePayload<T, U>) => MaybePromise<V | void>;
38
+ export {};
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,149 @@
1
+ import type { ApplicationCommandType, AutocompleteInteraction, ContextMenuCommandBuilder, ContextMenuCommandType } from 'discord.js';
2
+ import { z } from 'zod';
3
+ import { AnyBuilder, AnyCommandBuilder, AnyCommandInteraction, AnyComponentBuilder, AnyComponentInteraction, AnyInteraction, MaybePromise, Middleware, MiddlewarePayload, UnwrapOrDefault, inferBuilder, inferCommandType } from './types';
4
+ interface BaseWrapperReturnData<T extends AnyInteraction = AnyInteraction<any>> {
5
+ middlewares: Middleware<T>[];
6
+ execute: (input: MiddlewarePayload<T>) => void;
7
+ }
8
+ interface BaseBuilderParms<Builder extends AnyBuilder = AnyBuilder, Interaction extends AnyInteraction = AnyInteraction<any>> {
9
+ _builder: Builder;
10
+ _processInputData: MiddlewarePayload<Interaction>;
11
+ _interaction: Interaction;
12
+ }
13
+ type AutocompleteProcess = (input: AutocompleteInteraction) => void;
14
+ /**
15
+ * コマンドビルダーの型情報
16
+ */
17
+ interface CommandBuilderParms<Builder extends AnyCommandBuilder = AnyCommandBuilder, BuilderType extends ApplicationCommandType = ApplicationCommandType, Interaction extends AnyCommandInteraction = AnyCommandInteraction<any>> extends BaseBuilderParms<Builder, Interaction> {
18
+ _builderType: BuilderType;
19
+ }
20
+ /**
21
+ * コマンドビルダーが保持するデータ
22
+ */
23
+ interface CommandBuilderDef<TParms extends CommandBuilderParms> {
24
+ builder: TParms['_builder'];
25
+ autocomplete?: AutocompleteProcess;
26
+ middlewares: Middleware<TParms['_interaction']>[];
27
+ type: ApplicationCommandType;
28
+ }
29
+ type CommandBuilder = <T extends AnyCommandBuilder = AnyCommandBuilder>(command: T) => AutocompleteRegister<{
30
+ _builder: T;
31
+ _builderType: ApplicationCommandType;
32
+ _processInputData: MiddlewarePayload<inferBuilder<T>>;
33
+ _interaction: inferBuilder<T>;
34
+ }>;
35
+ /**
36
+ * コマンドの処理を登録する関数集
37
+ */
38
+ interface CommandProcessRegister<TParms extends CommandBuilderParms> {
39
+ _def: CommandBuilderDef<TParms>;
40
+ addMiddleware<T extends TParms['_processInputData']>(fc: (input: TParms['_processInputData']) => MaybePromise<T | undefined>): CommandProcessRegister<{
41
+ _builder: TParms['_builder'];
42
+ _builderType: TParms['_builderType'];
43
+ _processInputData: Exclude<Awaited<T>, undefined>;
44
+ _interaction: Awaited<T['interaction']>;
45
+ }>;
46
+ setProcess(process: (input: TParms['_processInputData']) => void): CommandData<{
47
+ _builder: TParms['_builder'];
48
+ _builderType: TParms['_builderType'];
49
+ _processInputData: TParms['_processInputData'];
50
+ _interaction: TParms['_interaction'];
51
+ }>;
52
+ }
53
+ interface AutocompleteRegister<TParms extends CommandBuilderParms> extends CommandProcessRegister<TParms> {
54
+ setAutocomplete(fc: (input: AutocompleteInteraction) => void): CommandProcessRegister<{
55
+ _builder: TParms['_builder'];
56
+ _builderType: TParms['_builderType'];
57
+ _processInputData: TParms['_processInputData'];
58
+ _interaction: TParms['_interaction'];
59
+ }>;
60
+ }
61
+ /**
62
+ * コマンドレジスターやイベントハンドラー用のデータ
63
+ */
64
+ interface CommandData<TParms extends CommandBuilderParms> extends BaseWrapperReturnData<TParms['_interaction']> {
65
+ data: TParms['_builder'];
66
+ autocomplete?: AutocompleteProcess;
67
+ middlewares: Middleware<TParms['_interaction']>[];
68
+ execute(input: TParms['_processInputData']): void;
69
+ }
70
+ export type AnyCommandData = CommandData<any>;
71
+ type ContextBuilder = <T extends ContextMenuCommandBuilder = ContextMenuCommandBuilder>(command: T) => ContextMenuCommandTypeRegister;
72
+ /**
73
+ * コンテキストメニューコマンドのタイプを登録する関数
74
+ */
75
+ interface ContextMenuCommandTypeRegister {
76
+ setType<T extends ContextMenuCommandType>(type: T): CommandProcessRegister<{
77
+ _builder: ContextMenuCommandBuilder;
78
+ _builderType: T;
79
+ _processInputData: MiddlewarePayload<inferCommandType<T>>;
80
+ _interaction: inferCommandType<T>;
81
+ }>;
82
+ }
83
+ interface ComponentBuilderParms<Schema = any, Args extends z.ZodArray<z.ZodString> = z.ZodArray<z.ZodString>, Builder extends AnyComponentBuilder = AnyComponentBuilder, ComponentType extends 'function' | 'builder' = 'function' | 'builder', Interaction extends AnyComponentInteraction = AnyComponentInteraction<any>> extends BaseBuilderParms<Builder, Interaction> {
84
+ _schema: Schema;
85
+ _args: Args | undefined;
86
+ _componentType: ComponentType;
87
+ }
88
+ type BuilderFC<TParms extends Omit<ComponentBuilderParms, '_args' | '_interaction' | '_processInputData'>> = (input: TParms['_schema']) => TParms['_builder'];
89
+ type UnwrapBuilderFC<T> = T extends (...args: any) => infer U ? U : T;
90
+ type inferComponentType<T> = T extends (...args: any) => any ? 'function' : 'builder';
91
+ interface ComponentBuilderDef<TParms extends ComponentBuilderParms> {
92
+ customId: string;
93
+ args: TParms['_args'];
94
+ middlewares: Middleware<TParms['_interaction']>[];
95
+ component: BuilderFC<TParms> | TParms['_builder'];
96
+ }
97
+ type ComponentBuilder = <T extends AnyComponentBuilder | ((input: V) => AnyComponentBuilder), V extends {}>(component: T, defaultValue?: T extends (...args: any) => any ? V : undefined) => ComponentProcessRegister<{
98
+ _schema: T extends (i: infer U, ...args: any) => any ? U : undefined;
99
+ _builder: UnwrapBuilderFC<T>;
100
+ _componentType: inferComponentType<T>;
101
+ _args: undefined;
102
+ _processInputData: MiddlewarePayload<inferBuilder<UnwrapBuilderFC<T>>>;
103
+ _interaction: inferBuilder<UnwrapBuilderFC<T>>;
104
+ }>;
105
+ interface ComponentProcessRegister<TParms extends ComponentBuilderParms> {
106
+ _def: ComponentBuilderDef<TParms>;
107
+ setCustomId(customId: string): ComponentProcessRegister<TParms>;
108
+ useArgs<Schema extends ComponentBuilderParms['_args'] = undefined>(schema?: (z: z.ZodArray<z.ZodString>) => Schema): ComponentProcessRegister<{
109
+ _schema: TParms['_schema'];
110
+ _builder: TParms['_builder'];
111
+ _componentType: TParms['_componentType'];
112
+ _args: UnwrapOrDefault<Schema, z.ZodArray<z.ZodString>>;
113
+ _processInputData: TParms['_processInputData'] & {
114
+ args: z.infer<UnwrapOrDefault<Schema, z.ZodArray<z.ZodString>>>;
115
+ };
116
+ _interaction: TParms['_interaction'];
117
+ }>;
118
+ addMiddleware<T extends TParms['_processInputData']>(fc: (input: TParms['_processInputData']) => T | Promise<T>): ComponentProcessRegister<{
119
+ _schema: TParms['_schema'];
120
+ _builder: TParms['_builder'];
121
+ _componentType: TParms['_componentType'];
122
+ _args: TParms['_args'];
123
+ _processInputData: Awaited<T>;
124
+ _interaction: Awaited<T['interaction']>;
125
+ }>;
126
+ setProcess(process: (input: TParms['_processInputData']) => void): ComponentData<{
127
+ _schema: TParms['_schema'];
128
+ _builder: TParms['_builder'];
129
+ _componentType: TParms['_componentType'];
130
+ _args: TParms['_args'];
131
+ _processInputData: TParms['_processInputData'];
132
+ _interaction: TParms['_interaction'];
133
+ }>;
134
+ }
135
+ type componentFC<TParms extends Omit<ComponentBuilderParms, '_interaction' | '_processInputData'>> = TParms['_componentType'] extends 'function' ? TParms['_schema'] extends undefined ? TParms['_args'] extends undefined ? (input?: any, args?: string[]) => TParms['_builder'] : (input: any | undefined, args: z.infer<Exclude<TParms['_args'], undefined>>) => TParms['_builder'] : TParms['_args'] extends undefined ? (input: TParms['_schema'], args?: string[]) => TParms['_builder'] : (input: TParms['_schema'], args: z.infer<Exclude<TParms['_args'], undefined>>) => TParms['_builder'] : TParms['_builder'];
136
+ interface ComponentData<TParms extends ComponentBuilderParms> extends BaseWrapperReturnData<TParms['_interaction']> {
137
+ args: TParms['_args'];
138
+ customId: string;
139
+ component: componentFC<TParms>;
140
+ middlewares: Middleware<TParms['_interaction']>[];
141
+ execute(input: TParms['_processInputData']): void;
142
+ }
143
+ export type AnyComponentData = ComponentData<any>;
144
+ export declare const wrapper: {
145
+ setCommand: CommandBuilder;
146
+ setCtxCommand: ContextBuilder;
147
+ setComponent: ComponentBuilder;
148
+ };
149
+ export {};
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.wrapper = void 0;
4
+ const zod_1 = require("zod");
5
+ const custom_id_1 = require("./custom-id");
6
+ const createCommandBuilder = function (command) {
7
+ const _def = {
8
+ middlewares: [],
9
+ type: 1, // ApplicationCommandType.ChatInput
10
+ builder: command,
11
+ };
12
+ return {
13
+ ...createCommandProcessRegister(_def),
14
+ setAutocomplete: (process) => {
15
+ return createCommandProcessRegister({
16
+ ..._def,
17
+ autocomplete: process,
18
+ });
19
+ },
20
+ };
21
+ };
22
+ function createCommandProcessRegister(initDef) {
23
+ const _def = {
24
+ ...initDef,
25
+ };
26
+ return {
27
+ _def,
28
+ addMiddleware: (fc) => {
29
+ if (typeof fc !== 'function') {
30
+ throw new Error('Middleware must be a function.');
31
+ }
32
+ return createCommandProcessRegister({
33
+ ..._def,
34
+ middlewares: [..._def.middlewares, fc],
35
+ });
36
+ },
37
+ setProcess(process) {
38
+ return {
39
+ data: _def.builder,
40
+ autocomplete: _def.autocomplete,
41
+ middlewares: _def.middlewares,
42
+ execute: process,
43
+ };
44
+ },
45
+ };
46
+ }
47
+ const createCtxCommandBuilder = function (command) {
48
+ return createCommandTypeRegister(command);
49
+ };
50
+ function createCommandTypeRegister(builder) {
51
+ return {
52
+ setType: (type) => {
53
+ builder.setType(type);
54
+ return createCommandProcessRegister({
55
+ type,
56
+ middlewares: [],
57
+ builder: builder,
58
+ });
59
+ },
60
+ };
61
+ }
62
+ const extractComponentCustomId = (component) => {
63
+ const json = component.toJSON();
64
+ if ('custom_id' in json) {
65
+ return json.custom_id;
66
+ }
67
+ else {
68
+ throw new Error('Component does not have a custom_id.');
69
+ }
70
+ };
71
+ const createComponentBuilder = function (component, defaultValue) {
72
+ let customId;
73
+ if (typeof component === 'function') {
74
+ if (!defaultValue)
75
+ throw new Error('Default value is required for function component.');
76
+ customId = extractComponentCustomId(component(defaultValue));
77
+ }
78
+ else {
79
+ customId = extractComponentCustomId(component);
80
+ }
81
+ return createComponentProcessRegister({
82
+ customId,
83
+ args: undefined,
84
+ middlewares: [],
85
+ component,
86
+ });
87
+ };
88
+ function createComponentProcessRegister(initDef) {
89
+ const _def = { ...initDef };
90
+ return {
91
+ _def,
92
+ setCustomId(customId) {
93
+ return createComponentProcessRegister({
94
+ ..._def,
95
+ customId,
96
+ });
97
+ },
98
+ useArgs: (fc) => {
99
+ const arrayString = zod_1.z.array(zod_1.z.string());
100
+ const schema = fc ? fc(arrayString) : arrayString;
101
+ return createComponentProcessRegister({
102
+ ..._def,
103
+ args: schema,
104
+ });
105
+ },
106
+ addMiddleware: (fc) => {
107
+ if (typeof fc !== 'function') {
108
+ throw new Error('Middleware must be a function.');
109
+ }
110
+ return createComponentProcessRegister({
111
+ ..._def,
112
+ middlewares: [..._def.middlewares, fc],
113
+ });
114
+ },
115
+ setProcess(process) {
116
+ return createComponentData(_def, process);
117
+ },
118
+ };
119
+ }
120
+ function createComponentData(initdef, process) {
121
+ let component;
122
+ if (typeof initdef.component === 'function') {
123
+ component = (input, args) => {
124
+ const builder = initdef.component(input);
125
+ if (!('custom_id' in builder.data))
126
+ return builder;
127
+ let customId = initdef.customId;
128
+ if (args?.length) {
129
+ const argsString = args?.map((arg) => (0, custom_id_1.encodeId)(arg)).join('&');
130
+ customId = customId + '?' + argsString;
131
+ }
132
+ builder.setCustomId(customId);
133
+ return builder;
134
+ };
135
+ }
136
+ else {
137
+ component = initdef.component;
138
+ }
139
+ return {
140
+ args: initdef.args,
141
+ customId: initdef.customId,
142
+ middlewares: initdef.middlewares,
143
+ component,
144
+ execute: process,
145
+ };
146
+ }
147
+ /*////////////////////////////////////////////////////////////
148
+ discordjsBuilderWrapper
149
+ ////////////////////////////////////////////////////////////*/
150
+ exports.wrapper = {
151
+ setCommand: createCommandBuilder,
152
+ setCtxCommand: createCtxCommandBuilder,
153
+ setComponent: createComponentBuilder,
154
+ };
155
+ //# sourceMappingURL=wrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrapper.js","sourceRoot":"","sources":["../src/wrapper.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "sugar-djs",
3
+ "version": "0.2.1",
4
+ "description": "Library for writing discord.js in TypeScript for more fun!",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "prepare": "npm run build",
10
+ "test": "echo \"Error: no test specified\" && exit 1"
11
+ },
12
+ "author": "soukun",
13
+ "license": "MIT",
14
+ "homepage": "https://github.com/n-soukun/sugar-djs#readme",
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "git+https://github.com/n-soukun/sugar-djs.git"
18
+ },
19
+ "dependencies": {
20
+ "discord.js": "^14.23.2",
21
+ "zod": "^4.1.12"
22
+ }
23
+ }