@grammy-x/conversations 0.2.1 → 2.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.
package/dist/index.js CHANGED
@@ -4,8 +4,7 @@ import { smartReply, GlobalMenuRegistry } from "@grammy-x/core";
4
4
  function randomInteger(minimum, maximum) {
5
5
  return Math.floor(Math.random() * (maximum - minimum + 1) + minimum);
6
6
  }
7
-
8
- class QuestionHelper {
7
+ var QuestionHelper = class {
9
8
  conversation;
10
9
  config;
11
10
  ctx;
@@ -29,22 +28,18 @@ class QuestionHelper {
29
28
  if (gx?.history.length > 0) {
30
29
  gx.history.pop();
31
30
  }
32
- const targetId = gx?.history.length > 0 ? gx.history.pop() : undefined;
31
+ const targetId = gx?.history.length > 0 ? gx.history.pop() : void 0;
33
32
  if (targetId) {
34
33
  const menu = GlobalMenuRegistry.get(targetId);
35
- if (menu)
36
- return menu.send(this.ctx);
34
+ if (menu) return menu.send(this.ctx);
37
35
  }
38
36
  };
39
37
  reply = async (text, options) => {
40
38
  let newText = text;
41
39
  const mergedOptions = { ...this.config, ...options };
42
- if (mergedOptions.autoBold !== false)
43
- newText = `<b>${newText}</b>`;
44
- if (options?.markup instanceof InlineKeyboard)
45
- mergedOptions.markup = options.markup;
46
- if (!mergedOptions.markup)
47
- mergedOptions.markup = new InlineKeyboard;
40
+ if (mergedOptions.autoBold !== false) newText = `<b>${newText}</b>`;
41
+ if (options?.markup instanceof InlineKeyboard) mergedOptions.markup = options.markup;
42
+ if (!mergedOptions.markup) mergedOptions.markup = new InlineKeyboard();
48
43
  if (mergedOptions.markup instanceof InlineKeyboard && this.config.markup instanceof InlineKeyboard)
49
44
  mergedOptions.markup.append(this.config.markup);
50
45
  if (mergedOptions.fastMenu && mergedOptions.markup instanceof InlineKeyboard) {
@@ -76,13 +71,15 @@ class QuestionHelper {
76
71
  textParser = async (text, parser, validator, options) => {
77
72
  const message = await this.reply(text, options);
78
73
  const additionalTriggers = this.getCallbackDataFromKeyboard(options?.markup);
79
- const answer = await this.conversation.waitUntil((ctx) => Context.has.callbackQuery(additionalTriggers)(ctx) || ctx.has(":text"));
74
+ const answer = await this.conversation.waitUntil(
75
+ (ctx) => Context.has.callbackQuery(additionalTriggers)(ctx) || ctx.has(":text")
76
+ );
80
77
  this.updateCtx(answer);
81
78
  const callbackQuery = answer.callbackQuery?.data;
82
- if (callbackQuery)
83
- return { callbackQuery, answerCtx: answer, message };
79
+ if (callbackQuery) return { callbackQuery, answerCtx: answer, message };
84
80
  if (answer.message?.text?.startsWith("/")) {
85
- await this.ctx.api.deleteMessage(this.ctx.from.id, answer.message.message_id).catch(() => {});
81
+ await this.ctx.api.deleteMessage(this.ctx.from.id, answer.message.message_id).catch(() => {
82
+ });
86
83
  const cmd = answer.message.text.split(" ")[0];
87
84
  const err = new Error(`CommandInterrupt:${cmd}`);
88
85
  err.name = "CommandInterruptError";
@@ -90,17 +87,22 @@ class QuestionHelper {
90
87
  throw err;
91
88
  }
92
89
  const result = parser(answer.msg.text);
93
- await this.ctx.api.deleteMessage(this.ctx.from.id, answer.msg.message_id).catch(() => {});
94
- if (!validator(result))
95
- return await this.conversation.skip();
90
+ await this.ctx.api.deleteMessage(this.ctx.from.id, answer.msg.message_id).catch(() => {
91
+ });
92
+ if (!validator(result)) return await this.conversation.skip();
96
93
  return { result, answerCtx: answer, message };
97
94
  };
98
- text = (text, options) => this.textParser(text, (r) => r, () => true, options);
95
+ text = (text, options) => this.textParser(
96
+ text,
97
+ (r) => r,
98
+ () => true,
99
+ options
100
+ );
99
101
  int = (text, options) => this.textParser(text, parseInt, (r) => !isNaN(r), options);
100
102
  float = (text, options) => this.textParser(text, parseFloat, (r) => !isNaN(r), options);
101
103
  chat = async (text, options) => {
102
104
  const chat = options.chat;
103
- const markup = new Keyboard().requestChat("Выбрать чат \uD83D\uDD0D", randomInteger(0, 999999), {
105
+ const markup = new Keyboard().requestChat("\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u0447\u0430\u0442 \u{1F50D}", randomInteger(0, 999999), {
104
106
  chat_is_channel: chat.isChannel,
105
107
  bot_administrator_rights: chat.requiredBotRights,
106
108
  bot_is_member: chat.botIsMember,
@@ -112,12 +114,13 @@ class QuestionHelper {
112
114
  const message = await this.reply(text, { ...options, markup });
113
115
  const answer = await this.conversation.waitFor(":chat_shared");
114
116
  this.updateCtx(answer);
115
- await answer?.msg?.delete?.().catch?.(() => {});
117
+ await answer?.msg?.delete?.().catch?.(() => {
118
+ });
116
119
  return answer.msg.chat_shared;
117
120
  };
118
121
  user = async (text, options) => {
119
122
  const user = options?.user;
120
- const markup = new Keyboard().requestUsers("Выбрать пользователя \uD83D\uDD0D", randomInteger(0, 999999), {
123
+ const markup = new Keyboard().requestUsers("\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F \u{1F50D}", randomInteger(0, 999999), {
121
124
  max_quantity: 1,
122
125
  request_name: user?.requestName,
123
126
  request_photo: user?.requestPhoto,
@@ -128,12 +131,13 @@ class QuestionHelper {
128
131
  const message = await this.reply(text, { ...options, markup });
129
132
  const answer = await this.conversation.waitFor(":users_shared");
130
133
  this.updateCtx(answer);
131
- await answer?.msg?.delete?.().catch?.(() => {});
134
+ await answer?.msg?.delete?.().catch?.(() => {
135
+ });
132
136
  return answer.msg.users_shared?.users[0];
133
137
  };
134
138
  users = async (text, options) => {
135
139
  const users = options?.users;
136
- const markup = new Keyboard().requestUsers("Выбрать пользователей \uD83D\uDD0D", randomInteger(0, 999999), {
140
+ const markup = new Keyboard().requestUsers("\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u0439 \u{1F50D}", randomInteger(0, 999999), {
137
141
  max_quantity: users?.maxQuantity,
138
142
  request_name: users?.requestName,
139
143
  request_photo: users?.requestPhoto,
@@ -144,90 +148,105 @@ class QuestionHelper {
144
148
  const message = await this.reply(text, { ...options, markup });
145
149
  const answer = await this.conversation.waitFor(":users_shared");
146
150
  this.updateCtx(answer);
147
- await answer?.msg?.delete?.().catch?.(() => {});
151
+ await answer?.msg?.delete?.().catch?.(() => {
152
+ });
148
153
  return answer.msg.users_shared;
149
154
  };
150
155
  contact = async (text, options) => {
151
- const markup = new Keyboard().requestContact("Поделиться контактом \uD83D\uDCDE").oneTime(true).resized(true);
156
+ const markup = new Keyboard().requestContact("\u041F\u043E\u0434\u0435\u043B\u0438\u0442\u044C\u0441\u044F \u043A\u043E\u043D\u0442\u0430\u043A\u0442\u043E\u043C \u{1F4DE}").oneTime(true).resized(true);
152
157
  const message = await this.reply(text, { ...options, markup });
153
158
  const answer = await this.conversation.waitFor(":contact");
154
159
  this.updateCtx(answer);
155
- await answer?.msg?.delete?.().catch?.(() => {});
160
+ await answer?.msg?.delete?.().catch?.(() => {
161
+ });
156
162
  return answer.msg.contact;
157
163
  };
158
164
  location = async (text, options) => {
159
- const markup = new Keyboard().requestLocation("Поделиться геопозицией \uD83D\uDCCD").oneTime(true).resized(true);
165
+ const markup = new Keyboard().requestLocation("\u041F\u043E\u0434\u0435\u043B\u0438\u0442\u044C\u0441\u044F \u0433\u0435\u043E\u043F\u043E\u0437\u0438\u0446\u0438\u0435\u0439 \u{1F4CD}").oneTime(true).resized(true);
160
166
  const message = await this.reply(text, { ...options, markup });
161
167
  const answer = await this.conversation.waitFor(":location");
162
168
  this.updateCtx(answer);
163
- await answer?.msg?.delete?.().catch?.(() => {});
169
+ await answer?.msg?.delete?.().catch?.(() => {
170
+ });
164
171
  return answer.msg.location;
165
172
  };
166
173
  poll = async (text, options) => {
167
174
  const pollType = options?.poll?.type;
168
- const markup = new Keyboard().requestPoll("Отправить опрос \uD83D\uDCCA", pollType).oneTime(true).resized(true);
175
+ const markup = new Keyboard().requestPoll("\u041E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C \u043E\u043F\u0440\u043E\u0441 \u{1F4CA}", pollType).oneTime(true).resized(true);
169
176
  const message = await this.reply(text, { ...options, markup });
170
177
  const answer = await this.conversation.waitFor(":poll");
171
178
  this.updateCtx(answer);
172
- await answer?.msg?.delete?.().catch?.(() => {});
179
+ await answer?.msg?.delete?.().catch?.(() => {
180
+ });
173
181
  return answer.msg.poll;
174
182
  };
175
183
  renderPaginationButtons = (pagesCount, currentPage, markup, columnCount, extraControls) => {
176
184
  const oddColumnCount = columnCount % 2 === 0 ? columnCount + 1 : columnCount;
177
185
  const emptyColumns = oddColumnCount >= 5 ? extraControls ? 0 : 1 : 0;
178
- for (let i = 0;i < emptyColumns; i++) {
186
+ for (let i = 0; i < emptyColumns; i++) {
179
187
  markup.text(" ", " ");
180
188
  }
181
189
  if (extraControls) {
182
- markup.text(currentPage > 2 ? "" : " ", "first");
190
+ markup.text(currentPage > 2 ? "\u22D8" : " ", "first");
183
191
  }
184
- markup.text(currentPage > 1 ? "" : " ", "prev");
192
+ markup.text(currentPage > 1 ? "\u2190" : " ", "prev");
185
193
  markup.text(currentPage + " / " + pagesCount, "page");
186
- markup.text(currentPage < pagesCount ? "" : " ", "next");
194
+ markup.text(currentPage < pagesCount ? "\u2192" : " ", "next");
187
195
  if (extraControls) {
188
- markup.text(currentPage < pagesCount - 1 ? "" : " ", "last");
196
+ markup.text(currentPage < pagesCount - 1 ? "\u22D9" : " ", "last");
189
197
  }
190
- for (let i = 0;i < emptyColumns; i++) {
198
+ for (let i = 0; i < emptyColumns; i++) {
191
199
  markup.text(" ", " ");
192
200
  }
193
201
  return markup.row();
194
202
  };
195
203
  resetChoice = (session) => {
196
- if (!session._gx.conversations)
197
- session._gx.conversations = {
198
- currentChoices: new Set,
199
- currentPage: 1
200
- };
204
+ if (!session._gx.conversations) session._gx.conversations = {
205
+ currentChoices: /* @__PURE__ */ new Set(),
206
+ currentPage: 1
207
+ };
201
208
  else {
202
- session._gx.conversations.currentChoices = new Set;
209
+ session._gx.conversations.currentChoices = /* @__PURE__ */ new Set();
203
210
  session._gx.conversations.currentPage = 1;
204
211
  }
205
212
  };
206
213
  async basicChoice(text, choices, multi = false, options, inProgress) {
207
- const markup = new InlineKeyboard;
208
- const session = await this.conversation.external(() => this.ctx.session);
209
- if (!session._gx.conversations)
210
- this.resetChoice(session);
214
+ const markup = new InlineKeyboard();
215
+ const session = await this.conversation.external(
216
+ () => this.ctx.session
217
+ );
218
+ if (!session._gx.conversations) this.resetChoice(session);
211
219
  await this.conversation.external(() => !inProgress && this.resetChoice(session));
212
220
  let currentRow = [];
213
221
  const columnCount = options?.columnCount ?? this.config.columnCount ?? 1;
214
222
  const rowCount = options?.rowCount ?? this.config.rowCount ?? 3;
215
- const filledChoices = options?.pagination?.enabled ? choices.concat(Array.from({ length: columnCount * rowCount - choices.length % (columnCount * rowCount) }).map(() => [" ", "empty"])) : choices;
223
+ const filledChoices = options?.pagination?.enabled ? choices.concat(
224
+ Array.from({ length: columnCount * rowCount - choices.length % (columnCount * rowCount) }).map(
225
+ () => [" ", "empty"]
226
+ )
227
+ ) : choices;
216
228
  const pagesCount = Math.ceil(choices.length / (columnCount * rowCount));
217
229
  const currentPage = session._gx.conversations.currentPage ?? 1;
218
230
  let currentRowId = 0;
219
231
  for (const [choiceId, choice] of filledChoices.entries()) {
220
- if (options?.pagination?.enabled && choiceId < (currentPage - 1) * columnCount * rowCount)
221
- continue;
232
+ if (options?.pagination?.enabled && choiceId < (currentPage - 1) * columnCount * rowCount) continue;
222
233
  const checked = session._gx.conversations.currentChoices.has(choice[1]);
223
- currentRow.push([`${choice[0]}${checked ? " " : ""}`, choice[1]]);
234
+ currentRow.push([`${choice[0]}${checked ? " \u2705" : ""}`, choice[1]]);
224
235
  if (currentRow.length === columnCount) {
225
- currentRow.forEach(([label, value]) => markup.text(label, value == "empty" ? "empty" : `answer:${value}`));
236
+ currentRow.forEach(
237
+ ([label, value]) => markup.text(label, value == "empty" ? "empty" : `answer:${value}`)
238
+ );
226
239
  markup.row();
227
240
  currentRow = [];
228
241
  currentRowId++;
229
242
  if (options?.pagination?.enabled && (currentRowId === rowCount || choiceId === filledChoices.length - 1)) {
230
- this.renderPaginationButtons(pagesCount, currentPage, markup, columnCount, options?.pagination?.extraControls ?? false);
243
+ this.renderPaginationButtons(
244
+ pagesCount,
245
+ currentPage,
246
+ markup,
247
+ columnCount,
248
+ options?.pagination?.extraControls ?? false
249
+ );
231
250
  break;
232
251
  }
233
252
  }
@@ -239,13 +258,16 @@ class QuestionHelper {
239
258
  markup.row();
240
259
  }
241
260
  const additionalTriggers = this.getCallbackDataFromKeyboard(options?.markup);
242
- if (options?.markup instanceof InlineKeyboard)
243
- markup.append(options.markup).row();
261
+ if (options?.markup instanceof InlineKeyboard) markup.append(options.markup).row();
244
262
  const sendContinueButton = session._gx.conversations.currentChoices.size > 0;
245
263
  const continueInlineEnd = options?.continueInlineEnd ?? this.config.continueInlineEnd;
246
264
  if (multi && !options?.noChoiceAllowed && !continueInlineEnd && sendContinueButton)
247
265
  markup.text(options?.continueButton ?? this.config?.continueButton ?? "Continue", "continue").row();
248
- const messageText = typeof text === "function" ? await text(Array.from(session._gx.conversations.currentChoices), session._gx.conversations.currentPage, pagesCount) : text;
266
+ const messageText = typeof text === "function" ? await text(
267
+ Array.from(session._gx.conversations.currentChoices),
268
+ session._gx.conversations.currentPage,
269
+ pagesCount
270
+ ) : text;
249
271
  const message = await this.reply(messageText, {
250
272
  ...options,
251
273
  markup,
@@ -268,9 +290,8 @@ class QuestionHelper {
268
290
  additionalTriggerCalled = additionalTriggers.includes(callbackData2);
269
291
  if (callbackData2 == "continue" || additionalTriggerCalled) {
270
292
  const choices2 = Array.from(session._gx.conversations.currentChoices);
271
- this.ctx.session._gx.conversations.currentChoices = new Set;
272
- if (additionalTriggerCalled)
273
- return { result: choices2, callbackQuery: callbackData2, message };
293
+ this.ctx.session._gx.conversations.currentChoices = /* @__PURE__ */ new Set();
294
+ if (additionalTriggerCalled) return { result: choices2, callbackQuery: callbackData2, message };
274
295
  return { result: choices2, message };
275
296
  }
276
297
  } while (additionalTriggerCalled);
@@ -278,30 +299,25 @@ class QuestionHelper {
278
299
  const callbackData = answer.callbackQuery.data;
279
300
  const data = callbackData.split(":")[1];
280
301
  const skip = await this.conversation.external(async () => {
281
- if (callbackData == "prev")
282
- questionData.currentPage = Math.max(currentPage - 1, 1);
283
- if (callbackData == "next")
284
- questionData.currentPage = Math.min(currentPage + 1, pagesCount);
285
- if (callbackData == "first")
286
- questionData.currentPage = 1;
287
- if (callbackData == "last")
288
- questionData.currentPage = pagesCount;
302
+ if (callbackData == "prev") questionData.currentPage = Math.max(currentPage - 1, 1);
303
+ if (callbackData == "next") questionData.currentPage = Math.min(currentPage + 1, pagesCount);
304
+ if (callbackData == "first") questionData.currentPage = 1;
305
+ if (callbackData == "last") questionData.currentPage = pagesCount;
289
306
  if (data) {
290
- if (questionData.currentChoices.has(data))
291
- questionData.currentChoices.delete(data);
292
- else
293
- questionData.currentChoices.add(data);
307
+ if (questionData.currentChoices.has(data)) questionData.currentChoices.delete(data);
308
+ else questionData.currentChoices.add(data);
294
309
  }
310
+ ;
295
311
  this.ctx.session._gx.conversations = questionData;
296
312
  if (paginationsCallbacks.includes(callbackData) && questionData.currentPage == currentPage) {
297
313
  await this.ctx.answerCallbackQuery();
298
314
  return true;
299
315
  }
300
316
  });
301
- if (skip)
302
- return this.conversation.skip({ drop: true });
317
+ if (skip) return this.conversation.skip({ drop: true });
303
318
  if (!multi && data) {
304
- this.ctx.session._gx.conversations.currentChoices = new Set;
319
+ ;
320
+ this.ctx.session._gx.conversations.currentChoices = /* @__PURE__ */ new Set();
305
321
  return {
306
322
  result: data,
307
323
  message
@@ -312,10 +328,14 @@ class QuestionHelper {
312
328
  choice = async (text, choices, options) => this.basicChoice(text, choices, false, options);
313
329
  multi = async (text, choices, options) => this.basicChoice(text, choices, true, options);
314
330
  boolean = async (text, yesNoStrings, options) => {
315
- const { result, message } = await this.choice(text, [
316
- [yesNoStrings?.[0] ?? "✅ Да", "true"],
317
- [yesNoStrings?.[1] ?? "❌ Нет", "false"]
318
- ], { columnCount: 2, ...options });
331
+ const { result, message } = await this.choice(
332
+ text,
333
+ [
334
+ [yesNoStrings?.[0] ?? "\u2705 \u0414\u0430", "true"],
335
+ [yesNoStrings?.[1] ?? "\u274C \u041D\u0435\u0442", "false"]
336
+ ],
337
+ { columnCount: 2, ...options }
338
+ );
319
339
  const boolResult = result === "true";
320
340
  return { result: boolResult, message };
321
341
  };
@@ -323,7 +343,8 @@ class QuestionHelper {
323
343
  const message = await this.reply(text, options);
324
344
  const answer = await this.conversation.waitFor(":photo");
325
345
  this.updateCtx(answer);
326
- await answer?.msg?.delete?.().catch?.(() => {});
346
+ await answer?.msg?.delete?.().catch?.(() => {
347
+ });
327
348
  const photo = answer.msg.photo?.[0];
328
349
  if (!photo) {
329
350
  throw new Error("No photo found in update");
@@ -334,10 +355,12 @@ class QuestionHelper {
334
355
  const message = await this.reply(text, options);
335
356
  const answer = await this.conversation.waitFor(":file");
336
357
  this.updateCtx(answer);
337
- await answer?.msg?.delete?.().catch?.(() => {});
358
+ await answer?.msg?.delete?.().catch?.(() => {
359
+ });
338
360
  return answer.msg.document?.file_id;
339
361
  };
340
- }
362
+ };
363
+
341
364
  // src/conversation.ts
342
365
  import { createConversation } from "@grammyjs/conversations";
343
366
  import { hydrate } from "@grammyjs/hydrate";
@@ -360,39 +383,41 @@ function createCustomConversation(builder, config) {
360
383
  return ctx.conversation.enter(id);
361
384
  }
362
385
  });
363
- return createConversation(async (conversation, ctx) => {
364
- await conversation.run(hydrate());
365
- const gx = ctx.session?._gx;
366
- if (gx && gx.history[gx.history.length - 1] !== id) {
367
- gx.history.push(id);
368
- if (gx.history.length > 20)
369
- gx.history.shift();
370
- }
371
- try {
372
- return await builder(conversation, ctx);
373
- } catch (e) {
374
- if (e.name === "CommandInterruptError") {
375
- const cmd = e.message.split(":")[1];
376
- const opts = getGrammyXOptions(e.ctx);
377
- const targetMenu = opts?.interruptCommands?.[cmd];
378
- if (targetMenu) {
379
- try {
380
- if (typeof targetMenu === "string") {
381
- await e.ctx.menu.nav(targetMenu);
382
- } else if (typeof targetMenu.send === "function") {
383
- await targetMenu.send(e.ctx);
386
+ return createConversation(
387
+ (async (conversation, ctx) => {
388
+ await conversation.run(hydrate());
389
+ const gx = ctx.session?._gx;
390
+ if (gx && gx.history[gx.history.length - 1] !== id) {
391
+ gx.history.push(id);
392
+ if (gx.history.length > 20) gx.history.shift();
393
+ }
394
+ try {
395
+ return await builder(conversation, ctx);
396
+ } catch (e) {
397
+ if (e.name === "CommandInterruptError") {
398
+ const cmd = e.message.split(":")[1];
399
+ const opts = getGrammyXOptions(e.ctx);
400
+ const targetMenu = opts?.interruptCommands?.[cmd];
401
+ if (targetMenu) {
402
+ try {
403
+ if (typeof targetMenu === "string") {
404
+ await e.ctx.menu.nav(targetMenu);
405
+ } else if (typeof targetMenu.send === "function") {
406
+ await targetMenu.send(e.ctx);
407
+ }
408
+ } catch (err) {
409
+ console.error(`Could not auto-nav to target menu for command ${cmd}`, err);
384
410
  }
385
- } catch (err) {
386
- console.error(`Could not auto-nav to target menu for command ${cmd}`, err);
387
411
  }
412
+ return;
388
413
  }
389
- return;
414
+ throw e;
390
415
  }
391
- throw e;
392
- }
393
- }, cfg);
416
+ }),
417
+ cfg
418
+ );
394
419
  }
395
420
  export {
396
- createCustomConversation,
397
- QuestionHelper
421
+ QuestionHelper,
422
+ createCustomConversation
398
423
  };
package/package.json CHANGED
@@ -1,25 +1,42 @@
1
1
  {
2
2
  "name": "@grammy-x/conversations",
3
- "version": "0.2.1",
3
+ "version": "2.0.1",
4
+
4
5
  "type": "module",
5
- "main": "./dist/index.js",
6
+
7
+ "main": "./dist/index.cjs",
8
+ "module": "./dist/index.js",
6
9
  "types": "./dist/index.d.ts",
10
+
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.js",
15
+ "require": "./dist/index.cjs"
16
+ }
17
+ },
18
+
7
19
  "private": false,
20
+
8
21
  "publishConfig": {
9
- "access": "restricted"
22
+ "access": "public"
10
23
  },
24
+
11
25
  "dependencies": {
12
26
  "@grammy-x/core": "0.2.1"
13
27
  },
28
+
14
29
  "peerDependencies": {
15
30
  "grammy": "^1.24.0",
16
31
  "@grammyjs/conversations": "^1",
17
32
  "@grammyjs/hydrate": "^1.4.1"
18
33
  },
34
+
19
35
  "files": [
20
36
  "dist"
21
37
  ],
38
+
22
39
  "scripts": {
23
- "build": "bun build ./src/index.ts --outdir ./dist --target node --packages external && tsc --emitDeclarationOnly --outDir ./dist"
40
+ "build": "tsup src/index.ts --format esm,cjs --dts --clean"
24
41
  }
25
- }
42
+ }
@@ -1,6 +0,0 @@
1
- import type { ConversationConfig } from "@grammyjs/conversations";
2
- import type { Conversation } from "@grammyjs/conversations";
3
- import type { Context, MiddlewareFn } from "grammy";
4
- export type ConversationFn<C extends Context = Context> = (conversation: Conversation<C>, ctx: C) => unknown | Promise<unknown>;
5
- export declare function createCustomConversation<C extends Context = Context>(builder: ConversationFn<C>, config?: string | ConversationConfig): MiddlewareFn<any>;
6
- //# sourceMappingURL=conversation.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../../src/conversation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAEjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAE3D,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AAGnD,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,IAAI,CACtD,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,EAC7B,GAAG,EAAE,CAAC,KACL,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;AAE/B,wBAAgB,wBAAwB,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EAChE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,EAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,kBAAkB,GACrC,YAAY,CAAC,GAAG,CAAC,CA2DnB"}
@@ -1,4 +0,0 @@
1
- export { QuestionHelper } from "./question-helper.js";
2
- export { createCustomConversation } from "./conversation.js";
3
- export type { ConversationFn } from "./conversation.js";
4
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAA;AAC5D,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"question-helper.d.ts","sourceRoot":"","sources":["../../../src/question-helper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAAwB,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAChF,OAAO,KAAK,EACR,uBAAuB,EACvB,UAAU,EACV,OAAO,EACP,QAAQ,EACR,IAAI,EACJ,WAAW,EACd,MAAM,cAAc,CAAA;AAGrB,KAAK,YAAY,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;AACzC,KAAK,aAAa,GAAG,cAAc,GAAG,QAAQ,CAAA;AAE9C,UAAU,kBAAkB;IACxB,MAAM,CAAC,EAAE,aAAa,CAAA;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAA;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,OAAO,CAAA;CACvB;AAED,UAAU,0BAA2B,SAAQ,kBAAkB;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,UAAU,CAAC,EAAE;QACT,OAAO,EAAE,OAAO,CAAA;QAChB,aAAa,CAAC,EAAE,OAAO,CAAA;KAC1B,CAAA;CACJ;AAED,UAAU,uBAAwB,SAAQ,0BAA0B;IAChE,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAC9B;AAED,UAAU,sBAAuB,SAAQ,kBAAkB;IACvD,IAAI,EAAE;QACF,kBAAkB,CAAC,EAAE,uBAAuB,CAAA;QAC5C,iBAAiB,CAAC,EAAE,uBAAuB,CAAA;QAC3C,WAAW,CAAC,EAAE,OAAO,CAAA;QACrB,SAAS,EAAE,OAAO,CAAA;QAClB,YAAY,CAAC,EAAE,OAAO,CAAA;QACtB,eAAe,CAAC,EAAE,OAAO,CAAA;QACzB,YAAY,CAAC,EAAE,OAAO,CAAA;KACzB,CAAA;CACJ;AAED,UAAU,sBAAuB,SAAQ,kBAAkB;IACvD,IAAI,CAAC,EAAE;QACH,KAAK,CAAC,EAAE,OAAO,CAAA;QACf,SAAS,CAAC,EAAE,OAAO,CAAA;QACnB,WAAW,CAAC,EAAE,OAAO,CAAA;QACrB,eAAe,CAAC,EAAE,OAAO,CAAA;QACzB,YAAY,CAAC,EAAE,OAAO,CAAA;KACzB,CAAA;CACJ;AAED,UAAU,uBAAwB,SAAQ,kBAAkB;IACxD,KAAK,CAAC,EAAE;QACJ,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,KAAK,CAAC,EAAE,OAAO,CAAA;QACf,SAAS,CAAC,EAAE,OAAO,CAAA;QACnB,WAAW,CAAC,EAAE,OAAO,CAAA;QACrB,eAAe,CAAC,EAAE,OAAO,CAAA;QACzB,YAAY,CAAC,EAAE,OAAO,CAAA;KACzB,CAAA;CACJ;AAED,UAAU,sBAAuB,SAAQ,kBAAkB;IACvD,IAAI,CAAC,EAAE;QACH,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM,CAAA;KAC5B,CAAA;CACJ;AAED,KAAK,2BAA2B,GAAG,OAAO,CACtC,uBAAuB,GACnB,sBAAsB,GACtB,sBAAsB,GACtB,uBAAuB,GACvB,sBAAsB,CAC7B,CAAA;AAOD,MAAM,WAAW,gBAAgB,CAAC,CAAC;IAC/B,MAAM,CAAC,EAAE,CAAC,CAAA;IACV,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,SAAS,CAAC,EAAE,GAAG,CAAA;IACf,OAAO,CAAC,EAAE,GAAG,CAAA;CAChB;AAeD,qBAAa,cAAc,CACvB,CAAC,SAAS,OAAO,GAAG,OAAO,EAC3B,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;IAE3C,OAAO,CAAC,YAAY,CAAG;IACvB,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,GAAG,CAAG;IACP,UAAU,CAAC,EAAE,MAAM,CAAA;gBAEd,YAAY,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,2BAA2B;IAMzE,OAAO,CAAC,SAAS,CAGhB;IAED,MAAM,sBAIL;IAED,IAAI,yBAWH;IAED,OAAO,CAAC,KAAK,CAsCZ;IAED,OAAO,CAAC,2BAA2B,CAOlC;IAED,OAAO,CAAC,UAAU,CA2BjB;IAED,IAAI,GAAI,MAAM,MAAM,EAAE,UAAU,kBAAkB,KAAG,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAM5C;IAE1C,GAAG,GAAI,MAAM,MAAM,EAAE,UAAU,kBAAkB,KAAG,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CACc;IAEnG,KAAK,GAAI,MAAM,MAAM,EAAE,UAAU,kBAAkB,KAAG,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CACc;IAErG,IAAI,GAAU,MAAM,MAAM,EAAE,SAAS,sBAAsB,yBAqB1D;IAED,IAAI,GAAU,MAAM,MAAM,EAAE,UAAU,sBAAsB,gDAoB3D;IAED,KAAK,GAAU,MAAM,MAAM,EAAE,UAAU,uBAAuB,0BAoB7D;IAED,OAAO,GAAU,MAAM,MAAM,EAAE,UAAU,kBAAkB,sBAS1D;IAED,QAAQ,GAAU,MAAM,MAAM,EAAE,UAAU,kBAAkB,uBAS3D;IAED,IAAI,GAAU,MAAM,MAAM,EAAE,UAAU,sBAAsB,mBAU3D;IAED,OAAO,CAAC,uBAAuB,CAyB9B;IAED,OAAO,CAAC,WAAW,CASlB;YAEa,WAAW;IAwKzB,MAAM,GAAU,KAAK,CAAC,GAAC,SAAS,MAAM,EAClC,MAAM,MAAM,EACZ,SAAS,CAAC,MAAM,EAAE,GAAC,CAAC,EAAE,EACtB,UAAU,0BAA0B,KACrC,OAAO,CAAC;QACP,MAAM,EAAE,GAAC,CAAA;QACT,OAAO,EAAE,GAAG,CAAA;KACf,CAAC,CAAmD;IAErD,KAAK,GAAU,KAAK,CAAC,GAAC,SAAS,MAAM,EACjC,MAAM,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,GAAC,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,YAAY,CAAC,MAAM,CAAC,CAAC,EAChG,SAAS,CAAC,MAAM,EAAE,GAAC,CAAC,EAAE,EACtB,UAAU,0BAA0B,KACrC,OAAO,CAAC;QACP,MAAM,EAAE,GAAC,EAAE,CAAA;QACX,YAAY,CAAC,EAAE,MAAM,CAAA;QACrB,OAAO,EAAE,GAAG,CAAA;KACf,CAAC,CAAkD;IAEpD,OAAO,GAAU,MAAM,MAAM,EAAE,eAAe,MAAM,EAAE,EAAE,UAAU,0BAA0B;;;OAW3F;IAED,KAAK,GAAU,MAAM,MAAM,EAAE,UAAU,kBAAkB,qBAUxD;IAED,IAAI,GAAU,MAAM,MAAM,EAAE,UAAU,kBAAkB,qBAMvD;CACJ"}
@@ -1,8 +0,0 @@
1
- export type { GrammyXSessionData, GrammyXInternalSession, GrammyXFlavor, WithGrammyXSession } from "./session.js";
2
- export { smartReply, setActiveMessage } from "./message.js";
3
- export type { ReplyOptions } from "./message.js";
4
- export { grammyx, getGrammyXOptions, grammyXMenus } from "./plugin.js";
5
- export type { GrammyXDefaultColor, GrammyXPluginOptions, GrammyXRuntimeOptions } from "./plugin.js";
6
- export { GlobalMenuRegistry } from "./registry/menu.js";
7
- export type { MenuLike } from "./registry/menu.js";
8
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../core/src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjH,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC3D,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AACtE,YAAY,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AACnG,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACvD,YAAY,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA"}
@@ -1,12 +0,0 @@
1
- import type { Context } from "grammy";
2
- import type { Message } from "grammy/types";
3
- export interface ReplyOptions {
4
- embolden?: boolean;
5
- dedent?: boolean;
6
- newMessage?: boolean;
7
- messageToEdit?: number;
8
- options?: Record<string, any>;
9
- }
10
- export declare function smartReply(ctx: Context, text: string, options?: ReplyOptions, replyMarkup?: any): Promise<Message>;
11
- export declare function setActiveMessage(ctx: Context, message: Message): void;
12
- //# sourceMappingURL=message.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../../../core/src/message.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AACrC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAI3C,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAChC;AAiBD,wBAAsB,UAAU,CAC5B,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,YAAY,EACtB,WAAW,CAAC,EAAE,GAAG,GAClB,OAAO,CAAC,OAAO,CAAC,CA0BlB;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAQrE"}
@@ -1,20 +0,0 @@
1
- import type { MiddlewareFn } from "grammy";
2
- export type GrammyXDefaultColor = "primary" | "success" | "danger";
3
- export interface GrammyXRuntimeOptions {
4
- defaultColor?: GrammyXDefaultColor;
5
- interruptCommands?: Record<string, any>;
6
- backText?: string;
7
- }
8
- export interface GrammyXPluginOptions {
9
- sessionInitial?: () => any;
10
- defaultColor?: GrammyXDefaultColor;
11
- interruptCommands?: Record<string, any>;
12
- backText?: string;
13
- }
14
- export declare function getGrammyXOptions(ctx: unknown): GrammyXRuntimeOptions | undefined;
15
- export declare function grammyx(options?: GrammyXPluginOptions): MiddlewareFn<any>;
16
- /**
17
- * The Global Menu Handler.
18
- */
19
- export declare function grammyXMenus(): MiddlewareFn<any>;
20
- //# sourceMappingURL=plugin.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../../core/src/plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAW,MAAM,QAAQ,CAAA;AAMnD,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAA;AAElE,MAAM,WAAW,qBAAqB;IAClC,YAAY,CAAC,EAAE,mBAAmB,CAAA;IAClC,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,oBAAoB;IACjC,cAAc,CAAC,EAAE,MAAM,GAAG,CAAA;IAC1B,YAAY,CAAC,EAAE,mBAAmB,CAAA;IAClC,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,qBAAqB,GAAG,SAAS,CAEjF;AAgBD,wBAAgB,OAAO,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,YAAY,CAAC,GAAG,CAAC,CAqFzE;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,YAAY,CAAC,GAAG,CAAC,CAahD"}
@@ -1,14 +0,0 @@
1
- import type { Context } from "grammy";
2
- export interface MenuLike<C extends Context = Context> {
3
- menuName: string;
4
- send: (ctx: C, data?: any) => Promise<unknown>;
5
- }
6
- declare class MenuRegistry {
7
- private menus;
8
- register(menu: MenuLike<any>): void;
9
- get<C extends Context>(name: string): MenuLike<C> | undefined;
10
- getAll(): MenuLike<any>[];
11
- }
12
- export declare const GlobalMenuRegistry: MenuRegistry;
13
- export {};
14
- //# sourceMappingURL=menu.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../../../../core/src/registry/menu.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAErC,MAAM,WAAW,QAAQ,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO;IACjD,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CACjD;AAED,cAAM,YAAY;IACd,OAAO,CAAC,KAAK,CAAmC;IAEhD,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC;IAQ5B,GAAG,CAAC,CAAC,SAAS,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,SAAS;IAI7D,MAAM,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE;CAG5B;AAED,eAAO,MAAM,kBAAkB,cAAqB,CAAA"}
@@ -1,35 +0,0 @@
1
- export interface GrammyXInternalSession {
2
- menu?: {
3
- data?: any;
4
- messageId?: number;
5
- };
6
- history: string[];
7
- lazy: Record<string, any>;
8
- conversations?: {
9
- currentChoices: any;
10
- currentPage: number;
11
- };
12
- }
13
- export interface GrammyXSessionData {
14
- _gx: GrammyXInternalSession;
15
- conversation?: Record<string, any>;
16
- [key: string]: any;
17
- }
18
- import type { Context, SessionFlavor } from "grammy";
19
- export interface GrammyXMenuControlPanel {
20
- nav: (to: string, data?: any) => Promise<unknown>;
21
- back: (data?: any) => Promise<unknown>;
22
- update: (data?: any) => Promise<unknown>;
23
- close: () => void;
24
- }
25
- export type GrammyXFlavor<C extends Context = Context> = C & SessionFlavor<GrammyXSessionData> & {
26
- menu: GrammyXMenuControlPanel;
27
- };
28
- type SessionValue<C extends Context> = C extends {
29
- session: infer S;
30
- } ? Awaited<S> : never;
31
- export type WithGrammyXSession<C extends Context> = C & SessionFlavor<SessionValue<C> & GrammyXSessionData> & {
32
- menu: GrammyXMenuControlPanel;
33
- };
34
- export {};
35
- //# sourceMappingURL=session.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../../core/src/session.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,sBAAsB;IACnC,IAAI,CAAC,EAAE;QACH,IAAI,CAAC,EAAE,GAAG,CAAA;QACV,SAAS,CAAC,EAAE,MAAM,CAAA;KACrB,CAAA;IACD,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACzB,aAAa,CAAC,EAAE;QACZ,cAAc,EAAE,GAAG,CAAA;QACnB,WAAW,EAAE,MAAM,CAAA;KACtB,CAAA;CACJ;AAED,MAAM,WAAW,kBAAkB;IAC/B,GAAG,EAAE,sBAAsB,CAAA;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAClC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CACrB;AAED,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAA;AAEpD,MAAM,WAAW,uBAAuB;IACpC,GAAG,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IACjD,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IACtC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IACxC,KAAK,EAAE,MAAM,IAAI,CAAA;CACpB;AAED,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,IAAI,CAAC,GAAG,aAAa,CAAC,kBAAkB,CAAC,GAAG;IAAE,IAAI,EAAE,uBAAuB,CAAA;CAAE,CAAA;AAElI,KAAK,YAAY,CAAC,CAAC,SAAS,OAAO,IAAI,CAAC,SAAS;IAAE,OAAO,EAAE,MAAM,CAAC,CAAA;CAAE,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAA;AAE1F,MAAM,MAAM,kBAAkB,CAAC,CAAC,SAAS,OAAO,IAAI,CAAC,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAAC,GAAG;IAAE,IAAI,EAAE,uBAAuB,CAAA;CAAE,CAAA"}
@@ -1,5 +0,0 @@
1
- export declare const dedent: {
2
- (literals: string): string;
3
- (strings: TemplateStringsArray, ...values: unknown[]): string;
4
- };
5
- //# sourceMappingURL=dedent.d.ts.map