mirror of
https://github.com/Maks1mS/nestjs-telegraf.git
synced 2026-10-20 13:17:07 +03:00
@@ -1,3 +1,7 @@
|
|||||||
|
# lock
|
||||||
|
package-lock.json
|
||||||
|
yarn.lock
|
||||||
|
|
||||||
# dependencies
|
# dependencies
|
||||||
/node_modules
|
/node_modules
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
function __export(m) {
|
function __export(m) {
|
||||||
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
|
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
|
||||||
}
|
}
|
||||||
exports.__esModule = true;
|
exports.__esModule = true;
|
||||||
__export(require("./dist"));
|
__export(require("./dist"));
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
import { SetMetadata } from '@nestjs/common';
|
|
||||||
import { DECORATORS } from '../telegraf.constants';
|
|
||||||
import { HearsTriggers } from 'telegraf/typings/composer';
|
|
||||||
import { Context } from '../interfaces';
|
|
||||||
|
|
||||||
export type TelegrafActionTriggers = HearsTriggers<Context>;
|
|
||||||
|
|
||||||
export interface ActionOptions {
|
|
||||||
triggers: TelegrafActionTriggers;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers middleware for handling callback_data actions with regular expressions.
|
|
||||||
*
|
|
||||||
* @see https://telegraf.js.org/#/?id=action
|
|
||||||
*/
|
|
||||||
export const Action = (triggers: TelegrafActionTriggers): MethodDecorator => {
|
|
||||||
return SetMetadata(DECORATORS.ACTION, { triggers });
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers middleware for handling callback_data actions with regular expressions.
|
|
||||||
*
|
|
||||||
* @see https://telegraf.js.org/#/?id=action
|
|
||||||
* @deprecated since v2, use Action decorator instead.
|
|
||||||
*/
|
|
||||||
export const TelegrafAction = Action;
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
import { SetMetadata } from '@nestjs/common';
|
|
||||||
import { DECORATORS } from '../telegraf.constants';
|
|
||||||
|
|
||||||
export type TelegrafCashtagCashtag = string | string[];
|
|
||||||
|
|
||||||
export interface CashtagOptions {
|
|
||||||
cashtag: TelegrafCashtagCashtag;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Cashtag handling.
|
|
||||||
*
|
|
||||||
* @see https://telegraf.js.org/#/?id=cashtag
|
|
||||||
*/
|
|
||||||
export const Cashtag = (cashtag: TelegrafCashtagCashtag): MethodDecorator => {
|
|
||||||
return SetMetadata(DECORATORS.CASHTAG, { cashtag });
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Cashtag handling.
|
|
||||||
*
|
|
||||||
* @see https://telegraf.js.org/#/?id=cashtag
|
|
||||||
* @deprecated since v2, use Cashtag decorator instead.
|
|
||||||
*/
|
|
||||||
export const TelegrafCashtag = Cashtag;
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
import { SetMetadata } from '@nestjs/common';
|
|
||||||
import { DECORATORS } from '../telegraf.constants';
|
|
||||||
|
|
||||||
export type TelegrafCommandCommands = string | string[];
|
|
||||||
|
|
||||||
export interface CommandOptions {
|
|
||||||
commands: TelegrafCommandCommands;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Command handling.
|
|
||||||
*
|
|
||||||
* @see https://telegraf.js.org/#/?id=command
|
|
||||||
*/
|
|
||||||
export const Command = (commands: TelegrafCommandCommands): MethodDecorator => {
|
|
||||||
return SetMetadata(DECORATORS.COMMAND, { commands });
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Command handling.
|
|
||||||
*
|
|
||||||
* @see https://telegraf.js.org/#/?id=command
|
|
||||||
* @deprecated since v2, use Command decorator instead.
|
|
||||||
*/
|
|
||||||
export const TelegrafCommand = Command;
|
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
export * from './update.decorator';
|
||||||
|
export * from './scene.decorator';
|
||||||
|
export * from './inject-bot.decorator';
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
import { Inject } from '@nestjs/common';
|
||||||
|
import { getBotToken } from '../../utils';
|
||||||
|
|
||||||
|
export const InjectBot = (name?: string): ParameterDecorator =>
|
||||||
|
Inject(getBotToken(name));
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
import { SetMetadata } from '@nestjs/common';
|
||||||
|
import { SCENE_METADATA } from '../../telegraf.constants';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO
|
||||||
|
*/
|
||||||
|
export const Scene = (id: string): ClassDecorator =>
|
||||||
|
SetMetadata(SCENE_METADATA, id);
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
import { SetMetadata } from '@nestjs/common';
|
import { SetMetadata } from '@nestjs/common';
|
||||||
import { DECORATORS } from '../telegraf.constants';
|
import { UPDATE_METADATA } from '../../telegraf.constants';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* `@Update` decorator, it's like NestJS `@Controller` decorator,
|
* `@Update` decorator, it's like NestJS `@Controller` decorator,
|
||||||
* but for Telegram Bot API updates.
|
* but for Telegram Bot API updates.
|
||||||
*/
|
*/
|
||||||
export const Update = (): ClassDecorator => SetMetadata(DECORATORS.UPDATE, {});
|
export const Update = (): ClassDecorator => SetMetadata(UPDATE_METADATA, true);
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
import { SetMetadata } from '@nestjs/common';
|
|
||||||
import { DECORATORS } from '../telegraf.constants';
|
|
||||||
|
|
||||||
export type TelegrafEntityEntity =
|
|
||||||
| string
|
|
||||||
| string[]
|
|
||||||
| RegExp
|
|
||||||
| RegExp[]
|
|
||||||
| Function;
|
|
||||||
|
|
||||||
export interface EntityOptions {
|
|
||||||
entity: TelegrafEntityEntity;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Entity handling.
|
|
||||||
*
|
|
||||||
* @see https://telegraf.js.org/#/?id=entity
|
|
||||||
*/
|
|
||||||
export const Entity = (entity: TelegrafEntityEntity): MethodDecorator => {
|
|
||||||
return SetMetadata(DECORATORS.ENTITY, { entity });
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Entity handling.
|
|
||||||
*
|
|
||||||
* @see https://telegraf.js.org/#/?id=entity
|
|
||||||
* @deprecated since v2, use Entity decorator instead.
|
|
||||||
*/
|
|
||||||
export const TelegrafEntity = Entity;
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
import { SetMetadata } from '@nestjs/common';
|
|
||||||
import { DECORATORS } from '../telegraf.constants';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers middleware for handling callback_data actions with game query.
|
|
||||||
*
|
|
||||||
* @see https://telegraf.js.org/#/?id=inlinequery
|
|
||||||
*/
|
|
||||||
export const GameQuery = (): MethodDecorator => {
|
|
||||||
return SetMetadata(DECORATORS.GAME_QUERY, {});
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers middleware for handling callback_data actions with game query.
|
|
||||||
*
|
|
||||||
* @see https://telegraf.js.org/#/?id=inlinequery
|
|
||||||
* @deprecated since v2, use Action decorator instead.
|
|
||||||
*/
|
|
||||||
export const TelegrafGameQuery = GameQuery;
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
import { SetMetadata } from '@nestjs/common';
|
|
||||||
import { DECORATORS } from '../telegraf.constants';
|
|
||||||
|
|
||||||
export type TelegrafHashtagHashtag = string | string[];
|
|
||||||
|
|
||||||
export interface HashtagOptions {
|
|
||||||
hashtag: TelegrafHashtagHashtag;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Hashtag handling.
|
|
||||||
*
|
|
||||||
* @see https://telegraf.js.org/#/?id=hashtag
|
|
||||||
*/
|
|
||||||
export const Hashtag = (hashtag: TelegrafHashtagHashtag): MethodDecorator => {
|
|
||||||
return SetMetadata(DECORATORS.HASHTAG, { hashtag });
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Hashtag handling.
|
|
||||||
*
|
|
||||||
* @see https://telegraf.js.org/#/?id=hashtag
|
|
||||||
* @deprecated since v2, use Hashtag decorator instead.
|
|
||||||
*/
|
|
||||||
export const TelegrafHashtag = Hashtag;
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
import { SetMetadata } from '@nestjs/common';
|
|
||||||
import { DECORATORS } from '../telegraf.constants';
|
|
||||||
import { HearsTriggers } from 'telegraf/typings/composer';
|
|
||||||
import { Context } from '../interfaces';
|
|
||||||
|
|
||||||
export type TelegrafHearsTriggers = HearsTriggers<Context>;
|
|
||||||
|
|
||||||
export interface HearsOptions {
|
|
||||||
triggers: TelegrafHearsTriggers;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers middleware for handling text messages.
|
|
||||||
*
|
|
||||||
* @see https://telegraf.js.org/#/?id=hears
|
|
||||||
*/
|
|
||||||
export const Hears = (triggers: TelegrafHearsTriggers): MethodDecorator => {
|
|
||||||
return SetMetadata(DECORATORS.HEARS, { triggers: triggers });
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers middleware for handling text messages.
|
|
||||||
*
|
|
||||||
* @see https://telegraf.js.org/#/?id=hears
|
|
||||||
* @deprecated since v2, use Hears decorator instead.
|
|
||||||
*/
|
|
||||||
export const TelegrafHears = Hears;
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
import { SetMetadata } from '@nestjs/common';
|
|
||||||
import { DECORATORS } from '../telegraf.constants';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handler for /help command.
|
|
||||||
*
|
|
||||||
* @see https://telegraf.js.org/#/?id=help
|
|
||||||
*/
|
|
||||||
export const Help = (): MethodDecorator => {
|
|
||||||
return SetMetadata(DECORATORS.HELP, {});
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handler for /help command.
|
|
||||||
*
|
|
||||||
* @see https://telegraf.js.org/#/?id=help
|
|
||||||
* @deprecated since v2, use Help decorator instead.
|
|
||||||
*/
|
|
||||||
export const TelegrafHelp = Help;
|
|
||||||
+3
-18
@@ -1,18 +1,3 @@
|
|||||||
export * from './action.decorator';
|
export * from './core';
|
||||||
export * from './cashtag.decorator';
|
export * from './listeners';
|
||||||
export * from './command.decorator';
|
export * from './scene';
|
||||||
export * from './entity.decorator';
|
|
||||||
export * from './game-query.decorator';
|
|
||||||
export * from './hashtag.decorator';
|
|
||||||
export * from './hears.decorator';
|
|
||||||
export * from './help.decorator';
|
|
||||||
export * from './inject-bot.decorator';
|
|
||||||
export * from './inline-query.decorator';
|
|
||||||
export * from './mention.decorator';
|
|
||||||
export * from './on.decorator';
|
|
||||||
export * from './phone.decorator';
|
|
||||||
export * from './settings.decorator';
|
|
||||||
export * from './start.decorator';
|
|
||||||
export * from './update.decorator';
|
|
||||||
export * from './update-hooks.decorators';
|
|
||||||
export * from './use.decorator';
|
|
||||||
|
|||||||
@@ -1,4 +0,0 @@
|
|||||||
import { Inject } from '@nestjs/common';
|
|
||||||
import { TELEGRAF_PROVIDER } from '../telegraf.constants';
|
|
||||||
|
|
||||||
export const InjectBot = (): ParameterDecorator => Inject(TELEGRAF_PROVIDER);
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
import { SetMetadata } from '@nestjs/common';
|
|
||||||
import { DECORATORS } from '../telegraf.constants';
|
|
||||||
import * as tt from 'telegraf/typings/telegram-types';
|
|
||||||
|
|
||||||
export type TelegrafInlineQueryTriggers = string | string[] | RegExp | RegExp[];
|
|
||||||
|
|
||||||
export interface InlineQueryOptions {
|
|
||||||
triggers?: TelegrafInlineQueryTriggers;
|
|
||||||
updateType:
|
|
||||||
| tt.UpdateType
|
|
||||||
| tt.UpdateType[]
|
|
||||||
| tt.MessageSubTypes
|
|
||||||
| tt.MessageSubTypes[];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers middleware for handling inline_query actions with regular expressions.
|
|
||||||
*
|
|
||||||
* @see https://telegraf.js.org/#/?id=inlinequery
|
|
||||||
*/
|
|
||||||
export const InlineQuery = (
|
|
||||||
triggers?: TelegrafInlineQueryTriggers,
|
|
||||||
): MethodDecorator => {
|
|
||||||
return SetMetadata(DECORATORS.INLINE_QUERY, {
|
|
||||||
triggers,
|
|
||||||
updateType: 'inline_query',
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers middleware for handling inline_query actions with regular expressions.
|
|
||||||
*
|
|
||||||
* @see https://telegraf.js.org/#/?id=inlinequery
|
|
||||||
* @deprecated since v2, use InlineQuery decorator instead.
|
|
||||||
*/
|
|
||||||
export const TelegrafInlineQuery = InlineQuery;
|
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
import { createUpdateListenerDecorator } from '../../helpers';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers middleware for handling callback_data actions with regular expressions.
|
||||||
|
*
|
||||||
|
* @see https://telegraf.js.org/#/?id=action
|
||||||
|
*/
|
||||||
|
export const Action = createUpdateListenerDecorator('action');
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
import { createUpdateListenerDecorator } from '../../helpers';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cashtag handling.
|
||||||
|
*
|
||||||
|
* @see https://telegraf.js.org/#/?id=cashtag
|
||||||
|
*/
|
||||||
|
export const Cashtag = createUpdateListenerDecorator('cashtag');
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
import { createUpdateListenerDecorator } from '../../helpers';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Command handling.
|
||||||
|
*
|
||||||
|
* @see https://telegraf.js.org/#/?id=command
|
||||||
|
*/
|
||||||
|
export const Command = createUpdateListenerDecorator('command');
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
import { createUpdateListenerDecorator } from '../../helpers';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers middleware for handling messages with email entity.
|
||||||
|
*
|
||||||
|
* @see https://telegraf.js.org/#/?id=telegraf-email
|
||||||
|
*/
|
||||||
|
export const Email = createUpdateListenerDecorator('email');
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
import { createUpdateListenerDecorator } from '../../helpers';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers middleware for handling callback_data actions with game query.
|
||||||
|
*
|
||||||
|
* @see https://telegraf.js.org/#/?id=inlinequery
|
||||||
|
*/
|
||||||
|
export const GameQuery = createUpdateListenerDecorator('gameQuery');
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
import { createUpdateListenerDecorator } from '../../helpers';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hashtag handling.
|
||||||
|
*
|
||||||
|
* @see https://telegraf.js.org/#/?id=hashtag
|
||||||
|
*/
|
||||||
|
export const Hashtag = createUpdateListenerDecorator('hashtag');
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
import { createUpdateListenerDecorator } from '../../helpers';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers middleware for handling text messages.
|
||||||
|
*
|
||||||
|
* @see https://telegraf.js.org/#/?id=hears
|
||||||
|
*/
|
||||||
|
export const Hears = createUpdateListenerDecorator('hears');
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
import { createUpdateListenerDecorator } from '../../helpers';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for /help command.
|
||||||
|
*
|
||||||
|
* @see https://telegraf.js.org/#/?id=help
|
||||||
|
*/
|
||||||
|
export const Help = createUpdateListenerDecorator('help');
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
export * from './on.decorator';
|
||||||
|
export * from './use.decorator';
|
||||||
|
export * from './action.decorator';
|
||||||
|
export * from './cashtag.decorator';
|
||||||
|
export * from './command.decorator';
|
||||||
|
export * from './game-query.decorator';
|
||||||
|
export * from './hashtag.decorator';
|
||||||
|
export * from './hears.decorator';
|
||||||
|
export * from './help.decorator';
|
||||||
|
export * from './inline-query.decorator';
|
||||||
|
export * from './mention.decorator';
|
||||||
|
export * from './phone.decorator';
|
||||||
|
export * from './settings.decorator';
|
||||||
|
export * from './start.decorator';
|
||||||
|
export * from './email.decorator';
|
||||||
|
export * from './url.decorator';
|
||||||
|
export * from './text-link.decorator';
|
||||||
|
export * from './text-mention.decorator';
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
import { createUpdateListenerDecorator } from '../../helpers';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers middleware for handling inline_query actions with regular expressions.
|
||||||
|
*
|
||||||
|
* @see https://telegraf.js.org/#/?id=inlinequery
|
||||||
|
*/
|
||||||
|
export const InlineQuery = createUpdateListenerDecorator('inlineQuery');
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
import { createUpdateListenerDecorator } from '../../helpers';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mention handling.
|
||||||
|
*
|
||||||
|
* @see https://telegraf.js.org/#/?id=mention
|
||||||
|
*/
|
||||||
|
export const Mention = createUpdateListenerDecorator('mention');
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
import { createUpdateListenerDecorator } from '../../helpers';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers middleware for provided update type.
|
||||||
|
*
|
||||||
|
* @see https://telegraf.js.org/#/?id=on
|
||||||
|
*/
|
||||||
|
export const On = createUpdateListenerDecorator('on');
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
import { createUpdateListenerDecorator } from '../../helpers';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Phone number handling.
|
||||||
|
*
|
||||||
|
* @see https://telegraf.js.org/#/?id=phone
|
||||||
|
*/
|
||||||
|
export const Phone = createUpdateListenerDecorator('phone');
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
import { createUpdateListenerDecorator } from '../../helpers';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for /settings command.
|
||||||
|
*
|
||||||
|
* @see https://telegraf.js.org/#/?id=settings
|
||||||
|
*/
|
||||||
|
export const Settings = createUpdateListenerDecorator('settings');
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
import { createUpdateListenerDecorator } from '../../helpers';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for /start command.
|
||||||
|
*
|
||||||
|
* @see https://telegraf.js.org/#/?id=start
|
||||||
|
*/
|
||||||
|
export const Start = createUpdateListenerDecorator('start');
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
import { createUpdateListenerDecorator } from '../../helpers';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers middleware for handling messages with text_link entity.
|
||||||
|
*
|
||||||
|
* @see https://telegraf.js.org/#/?id=telegraf-textlink
|
||||||
|
*/
|
||||||
|
export const TextLink = createUpdateListenerDecorator('textLink');
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
import { createUpdateListenerDecorator } from '../../helpers';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers middleware for handling messages with text_mention entity.
|
||||||
|
*
|
||||||
|
* @see https://telegraf.js.org/#/?id=telegraf-textlink
|
||||||
|
*/
|
||||||
|
export const TextMention = createUpdateListenerDecorator('textMention');
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
import { createUpdateListenerDecorator } from '../../helpers';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers middleware for handling messages with url entity.
|
||||||
|
*
|
||||||
|
* @see https://telegraf.js.org/#/?id=telegraf-url
|
||||||
|
*/
|
||||||
|
export const Url = createUpdateListenerDecorator('url');
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
import { createUpdateListenerDecorator } from '../../helpers';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a middleware.
|
||||||
|
*
|
||||||
|
* @see https://telegraf.js.org/#/?id=use
|
||||||
|
*/
|
||||||
|
export const Use = createUpdateListenerDecorator('use');
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
import { SetMetadata } from '@nestjs/common';
|
|
||||||
import { DECORATORS } from '../telegraf.constants';
|
|
||||||
|
|
||||||
export type TelegrafMentionUsername = string | string[];
|
|
||||||
|
|
||||||
export interface MentionOptions {
|
|
||||||
username: TelegrafMentionUsername;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Mention handling.
|
|
||||||
*
|
|
||||||
* @see https://telegraf.js.org/#/?id=mention
|
|
||||||
*/
|
|
||||||
export const Mention = (username: TelegrafMentionUsername): MethodDecorator => {
|
|
||||||
return SetMetadata(DECORATORS.MENTION, { username });
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Mention handling.
|
|
||||||
*
|
|
||||||
* @see https://telegraf.js.org/#/?id=mention
|
|
||||||
* @deprecated since v2, use Mention decorator instead.
|
|
||||||
*/
|
|
||||||
export const TelegrafMention = Mention;
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
import { SetMetadata } from '@nestjs/common';
|
|
||||||
import { DECORATORS } from '../telegraf.constants';
|
|
||||||
import { UpdateType, MessageSubTypes } from 'telegraf/typings/telegram-types';
|
|
||||||
|
|
||||||
export type TelegrafOnUpdateTypes =
|
|
||||||
| UpdateType
|
|
||||||
| UpdateType[]
|
|
||||||
| MessageSubTypes
|
|
||||||
| MessageSubTypes[];
|
|
||||||
|
|
||||||
export interface OnOptions {
|
|
||||||
updateTypes: TelegrafOnUpdateTypes;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers middleware for provided update type.
|
|
||||||
*
|
|
||||||
* @see https://telegraf.js.org/#/?id=on
|
|
||||||
*/
|
|
||||||
export const On = (updateTypes: TelegrafOnUpdateTypes): MethodDecorator => {
|
|
||||||
return SetMetadata(DECORATORS.ON, { updateTypes: updateTypes });
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers middleware for provided update type.
|
|
||||||
*
|
|
||||||
* @see https://telegraf.js.org/#/?id=on
|
|
||||||
* @deprecated since v2, use On decorator instead.
|
|
||||||
*/
|
|
||||||
export const TelegrafOn = On;
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
import { SetMetadata } from '@nestjs/common';
|
|
||||||
import { DECORATORS } from '../telegraf.constants';
|
|
||||||
|
|
||||||
export type TelegrafPhonePhone = string | string[];
|
|
||||||
|
|
||||||
export interface PhoneOptions {
|
|
||||||
phone: TelegrafPhonePhone;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Phone number handling.
|
|
||||||
*
|
|
||||||
* @see https://telegraf.js.org/#/?id=phone
|
|
||||||
*/
|
|
||||||
export const Phone = (phone: TelegrafPhonePhone): MethodDecorator => {
|
|
||||||
return SetMetadata(DECORATORS.PHONE, { phone });
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Phone number handling.
|
|
||||||
*
|
|
||||||
* @see https://telegraf.js.org/#/?id=phone
|
|
||||||
* @deprecated since v2, use Phone decorator instead.
|
|
||||||
*/
|
|
||||||
export const TelegrafPhone = Phone;
|
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
export * from './scene-enter.decorator';
|
||||||
|
export * from './scene-leave.decorator';
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
import { createSceneListenerDecorator } from '../../helpers';
|
||||||
|
|
||||||
|
export const SceneEnter = createSceneListenerDecorator('enter');
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
import { createSceneListenerDecorator } from '../../helpers';
|
||||||
|
|
||||||
|
export const SceneLeave = createSceneListenerDecorator('leave');
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
import { SetMetadata } from '@nestjs/common';
|
|
||||||
import { DECORATORS } from '../telegraf.constants';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handler for /settings command.
|
|
||||||
*
|
|
||||||
* @see https://telegraf.js.org/#/?id=settings
|
|
||||||
*/
|
|
||||||
export const Settings = (): MethodDecorator => {
|
|
||||||
return SetMetadata(DECORATORS.SETTINGS, {});
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handler for /settings command.
|
|
||||||
*
|
|
||||||
* @see https://telegraf.js.org/#/?id=settings
|
|
||||||
* @deprecated since v2, use Settings decorator instead.
|
|
||||||
*/
|
|
||||||
export const TelegrafSettings = Settings;
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
import { SetMetadata } from '@nestjs/common';
|
|
||||||
import { DECORATORS } from '../telegraf.constants';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handler for /start command.
|
|
||||||
*
|
|
||||||
* @see https://telegraf.js.org/#/?id=start
|
|
||||||
*/
|
|
||||||
export const Start = (): MethodDecorator => {
|
|
||||||
return SetMetadata(DECORATORS.START, {});
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handler for /start command.
|
|
||||||
*
|
|
||||||
* @see https://telegraf.js.org/#/?id=start
|
|
||||||
* @deprecated since v2, use Start decorator instead.
|
|
||||||
*/
|
|
||||||
export const TelegrafStart = Start;
|
|
||||||
@@ -1,104 +0,0 @@
|
|||||||
import { SetMetadata } from '@nestjs/common';
|
|
||||||
import { DECORATORS } from '../telegraf.constants';
|
|
||||||
import * as tt from 'telegraf/typings/telegram-types';
|
|
||||||
|
|
||||||
export interface UpdateHookOptions {
|
|
||||||
updateType:
|
|
||||||
| tt.UpdateType
|
|
||||||
| tt.UpdateType[]
|
|
||||||
| tt.MessageSubTypes
|
|
||||||
| tt.MessageSubTypes[];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* New incoming message of any kind — text, photo, sticker, etc.
|
|
||||||
* @constructor
|
|
||||||
*/
|
|
||||||
export const Message = (): MethodDecorator => {
|
|
||||||
return SetMetadata(DECORATORS.UPDATE_HOOK, {
|
|
||||||
updateType: 'message',
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* New version of a message that is known to the bot and was edited
|
|
||||||
* @constructor
|
|
||||||
*/
|
|
||||||
export const EditedMessage = (): MethodDecorator => {
|
|
||||||
return SetMetadata(DECORATORS.UPDATE_HOOK, {
|
|
||||||
updateType: 'edited_message',
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* New incoming channel post of any kind — text, photo, sticker, etc.
|
|
||||||
* @constructor
|
|
||||||
*/
|
|
||||||
export const ChannelPost = (): MethodDecorator => {
|
|
||||||
return SetMetadata(DECORATORS.UPDATE_HOOK, {
|
|
||||||
updateType: 'channel_post',
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* New version of a channel post that is known to the bot and was edited
|
|
||||||
* @constructor
|
|
||||||
*/
|
|
||||||
export const EditedChannelPost = (): MethodDecorator => {
|
|
||||||
return SetMetadata(DECORATORS.UPDATE_HOOK, {
|
|
||||||
updateType: 'edited_channel_post',
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* New incoming inline query
|
|
||||||
* See this decorator in inline-query.decorator.ts
|
|
||||||
* @constructor
|
|
||||||
*/
|
|
||||||
// export const InlineQuery = (): MethodDecorator => {
|
|
||||||
// return SetMetadata(DECORATORS.UPDATE_HOOK, {
|
|
||||||
// updateType: 'inline_query',
|
|
||||||
// });
|
|
||||||
// };
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The result of an inline query that was chosen by a user and sent to their chat partner.
|
|
||||||
* @constructor
|
|
||||||
*/
|
|
||||||
export const ChosenInlineResult = (): MethodDecorator => {
|
|
||||||
return SetMetadata(DECORATORS.UPDATE_HOOK, {
|
|
||||||
updateType: 'chosen_inline_result',
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* New incoming callback query
|
|
||||||
* @constructor
|
|
||||||
*/
|
|
||||||
export const CallbackQuery = (): MethodDecorator => {
|
|
||||||
return SetMetadata(DECORATORS.UPDATE_HOOK, {
|
|
||||||
updateType: 'callback_query',
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* New incoming shipping query. Only for invoices with flexible price
|
|
||||||
* @constructor
|
|
||||||
*/
|
|
||||||
export const ShippingQuery = (): MethodDecorator => {
|
|
||||||
return SetMetadata(DECORATORS.UPDATE_HOOK, {
|
|
||||||
updateType: 'shipping_query',
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* New incoming pre-checkout query. Contains full information about checkout
|
|
||||||
* @constructor
|
|
||||||
*/
|
|
||||||
export const PreCheckoutQuery = (): MethodDecorator => {
|
|
||||||
return SetMetadata(DECORATORS.UPDATE_HOOK, {
|
|
||||||
updateType: 'pre_checkout_query',
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
// Two more decorators are missing here. For 'poll' and 'poll_answer' update types.
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
import { SetMetadata } from '@nestjs/common';
|
|
||||||
import { DECORATORS } from '../telegraf.constants';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a middleware.
|
|
||||||
*
|
|
||||||
* @see https://telegraf.js.org/#/?id=use
|
|
||||||
*/
|
|
||||||
export const Use = (): MethodDecorator => {
|
|
||||||
return SetMetadata(DECORATORS.USE, {});
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a middleware.
|
|
||||||
*
|
|
||||||
* @see https://telegraf.js.org/#/?id=use
|
|
||||||
* @deprecated since v2, use Use decorator instead.
|
|
||||||
*/
|
|
||||||
export const TelegrafUse = Use;
|
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
import { SetMetadata } from '@nestjs/common';
|
||||||
|
import { BaseScene as Scene } from 'telegraf';
|
||||||
|
import { ComposerMethodArgs, SceneMethods } from '../types';
|
||||||
|
import { UPDATE_LISTENER_METADATA } from '../telegraf.constants';
|
||||||
|
import { ListenerMetadata } from '../interfaces';
|
||||||
|
|
||||||
|
export function createSceneListenerDecorator<Method extends SceneMethods>(
|
||||||
|
method: Method,
|
||||||
|
) {
|
||||||
|
return (
|
||||||
|
...args: ComposerMethodArgs<Scene<never>, Method>
|
||||||
|
): MethodDecorator => {
|
||||||
|
return SetMetadata(UPDATE_LISTENER_METADATA, {
|
||||||
|
method,
|
||||||
|
args,
|
||||||
|
} as ListenerMetadata);
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
import { SetMetadata } from '@nestjs/common';
|
||||||
|
import { Composer } from 'telegraf';
|
||||||
|
import { ComposerMethodArgs, UpdateMethods } from '../types';
|
||||||
|
import { UPDATE_LISTENER_METADATA } from '../telegraf.constants';
|
||||||
|
import { ListenerMetadata } from '../interfaces';
|
||||||
|
|
||||||
|
export function createUpdateListenerDecorator<Method extends UpdateMethods>(
|
||||||
|
method: unknown,
|
||||||
|
) {
|
||||||
|
return (
|
||||||
|
...args: ComposerMethodArgs<Composer<never>, Method>
|
||||||
|
): MethodDecorator => {
|
||||||
|
return SetMetadata(UPDATE_LISTENER_METADATA, {
|
||||||
|
method,
|
||||||
|
args,
|
||||||
|
} as ListenerMetadata);
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
export * from './create-update-listener-decorator.helper';
|
||||||
|
export * from './create-scene-listener-decorator.helper';
|
||||||
+4
-1
@@ -8,5 +8,8 @@ export * as Extra from 'telegraf/extra';
|
|||||||
|
|
||||||
export * from './decorators';
|
export * from './decorators';
|
||||||
export * from './interfaces';
|
export * from './interfaces';
|
||||||
|
export * from './helpers';
|
||||||
|
export * from './utils';
|
||||||
export * from './telegraf.module';
|
export * from './telegraf.module';
|
||||||
export * from './telegraf.provider';
|
export * from './types';
|
||||||
|
export { Telegraf } from 'telegraf';
|
||||||
|
|||||||
@@ -1,11 +0,0 @@
|
|||||||
import { TelegrafContext } from 'telegraf/typings/context';
|
|
||||||
|
|
||||||
export interface Context extends TelegrafContext {
|
|
||||||
[key: string]: any;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removed type from Telegraf v3.38.0, added for backward compatibility.
|
|
||||||
* TODO: remove on next major release
|
|
||||||
*/
|
|
||||||
export interface ContextMessageUpdate extends Context {}
|
|
||||||
@@ -1,2 +1,3 @@
|
|||||||
export * from './context.interface';
|
|
||||||
export * from './telegraf-options.interface';
|
export * from './telegraf-options.interface';
|
||||||
|
export * from './listener-metadata.interface';
|
||||||
|
export * from './update-metadata.interface';
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
export interface ListenerMetadata {
|
||||||
|
method: string;
|
||||||
|
args: unknown[];
|
||||||
|
}
|
||||||
@@ -1,17 +1,21 @@
|
|||||||
import { ModuleMetadata, Type } from '@nestjs/common/interfaces';
|
import { ModuleMetadata, Type } from '@nestjs/common/interfaces';
|
||||||
|
import { Middleware, Context } from 'telegraf';
|
||||||
import {
|
import {
|
||||||
TelegrafOptions,
|
TelegrafOptions,
|
||||||
LaunchPollingOptions,
|
LaunchPollingOptions,
|
||||||
LaunchWebhookOptions,
|
LaunchWebhookOptions,
|
||||||
} from 'telegraf/typings/telegraf';
|
} from 'telegraf/typings/telegraf';
|
||||||
|
|
||||||
export interface TelegrafModuleOptions {
|
export interface TelegrafModuleOptions<C extends Context = Context> {
|
||||||
token: string;
|
token: string;
|
||||||
options?: TelegrafOptions;
|
options?: TelegrafOptions;
|
||||||
launchOptions?: {
|
launchOptions?: {
|
||||||
polling?: LaunchPollingOptions;
|
polling?: LaunchPollingOptions;
|
||||||
webhook?: LaunchWebhookOptions;
|
webhook?: LaunchWebhookOptions;
|
||||||
};
|
};
|
||||||
|
botName?: string;
|
||||||
|
include?: Function[];
|
||||||
|
middlewares?: ReadonlyArray<Middleware<C>>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface TelegrafOptionsFactory {
|
export interface TelegrafOptionsFactory {
|
||||||
@@ -20,6 +24,7 @@ export interface TelegrafOptionsFactory {
|
|||||||
|
|
||||||
export interface TelegrafModuleAsyncOptions
|
export interface TelegrafModuleAsyncOptions
|
||||||
extends Pick<ModuleMetadata, 'imports'> {
|
extends Pick<ModuleMetadata, 'imports'> {
|
||||||
|
botName?: string;
|
||||||
useExisting?: Type<TelegrafOptionsFactory>;
|
useExisting?: Type<TelegrafOptionsFactory>;
|
||||||
useClass?: Type<TelegrafOptionsFactory>;
|
useClass?: Type<TelegrafOptionsFactory>;
|
||||||
useFactory?: (
|
useFactory?: (
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
export interface UpdateMetadata {
|
||||||
|
name: string;
|
||||||
|
type: string;
|
||||||
|
methodName: string;
|
||||||
|
callback?: Function | Record<string, any>;
|
||||||
|
}
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
import { InstanceWrapper } from '@nestjs/core/injector/instance-wrapper';
|
||||||
|
import { Module } from '@nestjs/core/injector/module';
|
||||||
|
import { flattenDeep, groupBy, identity, isEmpty, mapValues } from 'lodash';
|
||||||
|
import { UpdateMetadata } from '../interfaces';
|
||||||
|
|
||||||
|
export class BaseExplorerService {
|
||||||
|
getModules(
|
||||||
|
modulesContainer: Map<string, Module>,
|
||||||
|
include: Function[],
|
||||||
|
): Module[] {
|
||||||
|
if (!include || isEmpty(include)) {
|
||||||
|
return [...modulesContainer.values()];
|
||||||
|
}
|
||||||
|
const whitelisted = this.includeWhitelisted(modulesContainer, include);
|
||||||
|
return whitelisted;
|
||||||
|
}
|
||||||
|
|
||||||
|
includeWhitelisted(
|
||||||
|
modulesContainer: Map<string, Module>,
|
||||||
|
include: Function[],
|
||||||
|
): Module[] {
|
||||||
|
const modules = [...modulesContainer.values()];
|
||||||
|
return modules.filter(({ metatype }) =>
|
||||||
|
include.some((item) => item === metatype),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
flatMap<T = UpdateMetadata>(
|
||||||
|
modules: Module[],
|
||||||
|
callback: (instance: InstanceWrapper, moduleRef: Module) => T | T[],
|
||||||
|
): T[] {
|
||||||
|
const invokeMap = () => {
|
||||||
|
return modules.map((moduleRef) => {
|
||||||
|
const providers = [...moduleRef.providers.values()];
|
||||||
|
return providers.map((wrapper) => callback(wrapper, moduleRef));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
return flattenDeep(invokeMap()).filter(identity);
|
||||||
|
}
|
||||||
|
|
||||||
|
groupMetadata(resolvers: UpdateMetadata[]) {
|
||||||
|
const groupByType = groupBy(
|
||||||
|
resolvers,
|
||||||
|
(metadata: UpdateMetadata) => metadata.type,
|
||||||
|
);
|
||||||
|
const groupedMetadata = mapValues(
|
||||||
|
groupByType,
|
||||||
|
(resolversArr: UpdateMetadata[]) =>
|
||||||
|
resolversArr.reduce(
|
||||||
|
(prev, curr) => ({
|
||||||
|
...prev,
|
||||||
|
[curr.name]: curr.callback,
|
||||||
|
}),
|
||||||
|
{},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
return groupedMetadata;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
export * from './updates-explorer.service';
|
||||||
|
export * from './metadata-accessor.service';
|
||||||
|
export * from './scenes-explorer.service';
|
||||||
|
export * from './updates-explorer.service';
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
import { Injectable } from '@nestjs/common';
|
||||||
|
import { Reflector } from '@nestjs/core';
|
||||||
|
import {
|
||||||
|
SCENE_METADATA,
|
||||||
|
UPDATE_LISTENER_METADATA,
|
||||||
|
UPDATE_METADATA,
|
||||||
|
} from '../telegraf.constants';
|
||||||
|
import { ListenerMetadata } from '../interfaces';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class MetadataAccessorService {
|
||||||
|
constructor(private readonly reflector: Reflector) {}
|
||||||
|
|
||||||
|
isUpdate(target: Function): boolean {
|
||||||
|
if (!target) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return !!this.reflector.get(UPDATE_METADATA, target);
|
||||||
|
}
|
||||||
|
|
||||||
|
isUpdateListener(target: Function) {
|
||||||
|
if (!target) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return !!this.reflector.get(UPDATE_LISTENER_METADATA, target);
|
||||||
|
}
|
||||||
|
|
||||||
|
isScene(target: Function): boolean {
|
||||||
|
if (!target) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return !!this.reflector.get(SCENE_METADATA, target);
|
||||||
|
}
|
||||||
|
|
||||||
|
getListenerMetadata(target: Function): ListenerMetadata | undefined {
|
||||||
|
return this.reflector.get(UPDATE_LISTENER_METADATA, target);
|
||||||
|
}
|
||||||
|
|
||||||
|
getSceneMetadata(target: Function): string | undefined {
|
||||||
|
return this.reflector.get(SCENE_METADATA, target);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,98 @@
|
|||||||
|
import { Inject, Injectable, OnModuleInit } from '@nestjs/common';
|
||||||
|
import { DiscoveryService, ModuleRef, ModulesContainer } from '@nestjs/core';
|
||||||
|
import { MetadataScanner } from '@nestjs/core/metadata-scanner';
|
||||||
|
import { InstanceWrapper } from '@nestjs/core/injector/instance-wrapper';
|
||||||
|
import { BaseScene as Scene, Stage, Telegraf } from 'telegraf';
|
||||||
|
import { MetadataAccessorService } from './metadata-accessor.service';
|
||||||
|
import { BaseExplorerService } from './base-explorer.service';
|
||||||
|
import {
|
||||||
|
TELEGRAF_BOT_NAME,
|
||||||
|
TELEGRAF_MODULE_OPTIONS,
|
||||||
|
} from '../telegraf.constants';
|
||||||
|
import { TelegrafModuleOptions } from '../interfaces';
|
||||||
|
import { Module } from '@nestjs/core/injector/module';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class ScenesExplorerService
|
||||||
|
extends BaseExplorerService
|
||||||
|
implements OnModuleInit {
|
||||||
|
private readonly stage = new Stage([]);
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
@Inject(TELEGRAF_BOT_NAME)
|
||||||
|
private readonly botName: string,
|
||||||
|
@Inject(TELEGRAF_MODULE_OPTIONS)
|
||||||
|
private readonly telegrafModuleOptions: TelegrafModuleOptions,
|
||||||
|
private readonly moduleRef: ModuleRef,
|
||||||
|
private readonly discoveryService: DiscoveryService,
|
||||||
|
private readonly metadataAccessor: MetadataAccessorService,
|
||||||
|
private readonly metadataScanner: MetadataScanner,
|
||||||
|
private readonly modulesContainer: ModulesContainer,
|
||||||
|
) {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
private bot: Telegraf<any>;
|
||||||
|
|
||||||
|
onModuleInit(): void {
|
||||||
|
this.bot = this.moduleRef.get<Telegraf<any>>(this.botName, {
|
||||||
|
strict: false,
|
||||||
|
});
|
||||||
|
this.bot.use(this.stage.middleware());
|
||||||
|
this.explore();
|
||||||
|
}
|
||||||
|
|
||||||
|
private explore(): void {
|
||||||
|
const modules = this.getModules(
|
||||||
|
this.modulesContainer,
|
||||||
|
this.telegrafModuleOptions.include || [],
|
||||||
|
);
|
||||||
|
const scenes = this.flatMap(modules, (instance, moduleRef) =>
|
||||||
|
this.applyScenes(instance, moduleRef),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private applyScenes(wrapper: InstanceWrapper, moduleRef: Module) {
|
||||||
|
const { instance } = wrapper;
|
||||||
|
if (!instance) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
const prototype = Object.getPrototypeOf(instance);
|
||||||
|
|
||||||
|
const providers: InstanceWrapper[] = this.discoveryService.getProviders();
|
||||||
|
const sceneProviders: InstanceWrapper[] = providers.filter(
|
||||||
|
(wrapper: InstanceWrapper) =>
|
||||||
|
this.metadataAccessor.isScene(wrapper.metatype),
|
||||||
|
);
|
||||||
|
|
||||||
|
sceneProviders.forEach((wrapper) => {
|
||||||
|
const { instance } = wrapper;
|
||||||
|
if (!instance) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
const sceneId = this.metadataAccessor.getSceneMetadata(
|
||||||
|
instance.constructor,
|
||||||
|
);
|
||||||
|
|
||||||
|
const scene = new Scene(sceneId);
|
||||||
|
this.stage.register(scene);
|
||||||
|
|
||||||
|
this.metadataScanner.scanFromPrototype(
|
||||||
|
instance,
|
||||||
|
prototype,
|
||||||
|
(methodKey: string) => {
|
||||||
|
const methodRef = instance[methodKey];
|
||||||
|
if (this.metadataAccessor.isUpdateListener(methodRef)) {
|
||||||
|
const metadata = this.metadataAccessor.getListenerMetadata(
|
||||||
|
methodRef,
|
||||||
|
);
|
||||||
|
const middlewareFn = methodRef.bind(instance);
|
||||||
|
const { method, args } = metadata;
|
||||||
|
(scene[method] as any)(...args, middlewareFn);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,83 @@
|
|||||||
|
import { Inject, Injectable, OnModuleInit } from '@nestjs/common';
|
||||||
|
import { DiscoveryService, ModuleRef, ModulesContainer } from '@nestjs/core';
|
||||||
|
import { InstanceWrapper } from '@nestjs/core/injector/instance-wrapper';
|
||||||
|
import { MetadataScanner } from '@nestjs/core/metadata-scanner';
|
||||||
|
import { MetadataAccessorService } from './metadata-accessor.service';
|
||||||
|
import {
|
||||||
|
TELEGRAF_BOT_NAME,
|
||||||
|
TELEGRAF_MODULE_OPTIONS,
|
||||||
|
} from '../telegraf.constants';
|
||||||
|
import { Telegraf } from 'telegraf';
|
||||||
|
import { TelegrafModuleOptions } from '../interfaces';
|
||||||
|
import { BaseExplorerService } from './base-explorer.service';
|
||||||
|
import { Module } from '@nestjs/core/injector/module';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class UpdatesExplorerService
|
||||||
|
extends BaseExplorerService
|
||||||
|
implements OnModuleInit {
|
||||||
|
constructor(
|
||||||
|
@Inject(TELEGRAF_BOT_NAME)
|
||||||
|
private readonly botName: string,
|
||||||
|
@Inject(TELEGRAF_MODULE_OPTIONS)
|
||||||
|
private readonly telegrafModuleOptions: TelegrafModuleOptions,
|
||||||
|
private readonly moduleRef: ModuleRef,
|
||||||
|
private readonly discoveryService: DiscoveryService,
|
||||||
|
private readonly metadataAccessor: MetadataAccessorService,
|
||||||
|
private readonly metadataScanner: MetadataScanner,
|
||||||
|
private readonly modulesContainer: ModulesContainer,
|
||||||
|
) {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
private bot: Telegraf<any>;
|
||||||
|
|
||||||
|
onModuleInit(): void {
|
||||||
|
this.bot = this.moduleRef.get<Telegraf<any>>(this.botName, {
|
||||||
|
strict: false,
|
||||||
|
});
|
||||||
|
this.explore();
|
||||||
|
}
|
||||||
|
|
||||||
|
explore() {
|
||||||
|
const modules = this.getModules(
|
||||||
|
this.modulesContainer,
|
||||||
|
this.telegrafModuleOptions.include || [],
|
||||||
|
);
|
||||||
|
const updates = this.flatMap(modules, (instance, moduleRef) =>
|
||||||
|
this.applyUpdates(instance, moduleRef),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private applyUpdates(wrapper: InstanceWrapper, moduleRef: Module) {
|
||||||
|
const { instance } = wrapper;
|
||||||
|
if (!instance) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
const prototype = Object.getPrototypeOf(instance);
|
||||||
|
|
||||||
|
const providers: InstanceWrapper[] = this.discoveryService.getProviders();
|
||||||
|
const updateProviders: InstanceWrapper[] = providers.filter(
|
||||||
|
(wrapper: InstanceWrapper) =>
|
||||||
|
this.metadataAccessor.isUpdate(wrapper.metatype),
|
||||||
|
);
|
||||||
|
|
||||||
|
updateProviders.forEach((wrapper: InstanceWrapper) => {
|
||||||
|
const { instance } = wrapper;
|
||||||
|
if (!instance) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
this.metadataScanner.scanFromPrototype(instance, prototype, (name) => {
|
||||||
|
const methodRef = instance[name];
|
||||||
|
if (this.metadataAccessor.isUpdateListener(methodRef)) {
|
||||||
|
const metadata = this.metadataAccessor.getListenerMetadata(methodRef);
|
||||||
|
const middlewareFn = methodRef.bind(instance);
|
||||||
|
const { method, args } = metadata;
|
||||||
|
// NOTE: Use "any" to disable "Expected at least 1 arguments, but got 1 or more." error.
|
||||||
|
// Use telegraf instance for non-scene listeners
|
||||||
|
(this.bot[method] as any)(...args, middlewareFn);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
+95
-20
@@ -1,56 +1,126 @@
|
|||||||
import { DiscoveryModule } from '@nestjs/core';
|
import { DiscoveryModule, ModuleRef } from '@nestjs/core';
|
||||||
import { Module, DynamicModule, Provider, Type } from '@nestjs/common';
|
import {
|
||||||
|
Module,
|
||||||
|
DynamicModule,
|
||||||
|
Provider,
|
||||||
|
Type,
|
||||||
|
Global,
|
||||||
|
Inject,
|
||||||
|
OnApplicationShutdown,
|
||||||
|
Logger,
|
||||||
|
} from '@nestjs/common';
|
||||||
import {
|
import {
|
||||||
TelegrafModuleOptions,
|
TelegrafModuleOptions,
|
||||||
TelegrafModuleAsyncOptions,
|
TelegrafModuleAsyncOptions,
|
||||||
TelegrafOptionsFactory,
|
TelegrafOptionsFactory,
|
||||||
} from './interfaces';
|
} from './interfaces';
|
||||||
import {
|
import {
|
||||||
|
TELEGRAF_BOT_NAME,
|
||||||
TELEGRAF_MODULE_OPTIONS,
|
TELEGRAF_MODULE_OPTIONS,
|
||||||
TELEGRAF_PROVIDER,
|
|
||||||
} from './telegraf.constants';
|
} from './telegraf.constants';
|
||||||
import { TelegrafMetadataAccessor } from './telegraf-metadata.accessor';
|
import {
|
||||||
import { TelegrafExplorer } from './telegraf.explorer';
|
MetadataAccessorService,
|
||||||
import { TelegrafProvider } from './telegraf.provider';
|
ScenesExplorerService,
|
||||||
|
UpdatesExplorerService,
|
||||||
|
} from './services';
|
||||||
|
import { getBotToken } from './utils';
|
||||||
|
import { Telegraf } from 'telegraf';
|
||||||
|
import { defer } from 'rxjs';
|
||||||
|
|
||||||
|
@Global()
|
||||||
@Module({
|
@Module({
|
||||||
imports: [DiscoveryModule],
|
imports: [DiscoveryModule],
|
||||||
providers: [TelegrafMetadataAccessor, TelegrafExplorer],
|
providers: [
|
||||||
|
UpdatesExplorerService,
|
||||||
|
ScenesExplorerService,
|
||||||
|
MetadataAccessorService,
|
||||||
|
],
|
||||||
})
|
})
|
||||||
export class TelegrafCoreModule {
|
export class TelegrafCoreModule implements OnApplicationShutdown {
|
||||||
|
private static logger = new Logger(TelegrafCoreModule.name);
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
@Inject(TELEGRAF_BOT_NAME) private readonly botName: string,
|
||||||
|
private readonly moduleRef: ModuleRef,
|
||||||
|
) {}
|
||||||
|
|
||||||
public static forRoot(options: TelegrafModuleOptions): DynamicModule {
|
public static forRoot(options: TelegrafModuleOptions): DynamicModule {
|
||||||
const telegrafProvider = {
|
const telegrafBotName = getBotToken(options.botName);
|
||||||
provide: TELEGRAF_PROVIDER,
|
|
||||||
useClass: TelegrafProvider,
|
const telegrafBotProvider = {
|
||||||
inject: [TELEGRAF_MODULE_OPTIONS],
|
provide: telegrafBotName,
|
||||||
|
useFactory: async (): Promise<any> =>
|
||||||
|
await defer(async () => {
|
||||||
|
const bot = new Telegraf<any>(options.token);
|
||||||
|
this.applyBotMiddlewares(bot, options.middlewares);
|
||||||
|
await bot.launch(options.launchOptions);
|
||||||
|
return bot;
|
||||||
|
}).toPromise(),
|
||||||
};
|
};
|
||||||
|
|
||||||
return {
|
return {
|
||||||
module: TelegrafCoreModule,
|
module: TelegrafCoreModule,
|
||||||
providers: [
|
providers: [
|
||||||
{ provide: TELEGRAF_MODULE_OPTIONS, useValue: options },
|
{
|
||||||
telegrafProvider,
|
provide: TELEGRAF_MODULE_OPTIONS,
|
||||||
|
useValue: options,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
provide: TELEGRAF_BOT_NAME,
|
||||||
|
useValue: telegrafBotName,
|
||||||
|
},
|
||||||
|
telegrafBotProvider,
|
||||||
],
|
],
|
||||||
exports: [telegrafProvider],
|
exports: [telegrafBotProvider],
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public static forRootAsync(
|
public static forRootAsync(
|
||||||
options: TelegrafModuleAsyncOptions,
|
options: TelegrafModuleAsyncOptions,
|
||||||
): DynamicModule {
|
): DynamicModule {
|
||||||
const telegrafProvider = {
|
const telegrafBotName = getBotToken(options.botName);
|
||||||
provide: TELEGRAF_PROVIDER,
|
|
||||||
useClass: TelegrafProvider,
|
const telegrafBotProvider = {
|
||||||
|
provide: telegrafBotName,
|
||||||
|
useFactory: async (
|
||||||
|
telegrafModuleOptions: TelegrafModuleOptions,
|
||||||
|
): Promise<any> => {
|
||||||
|
const { botName, ...telegrafOptions } = telegrafModuleOptions;
|
||||||
|
|
||||||
|
return await defer(async () => {
|
||||||
|
const bot = new Telegraf<any>(telegrafOptions.token);
|
||||||
|
this.applyBotMiddlewares(bot, telegrafOptions.middlewares);
|
||||||
|
await bot.launch(telegrafOptions.launchOptions);
|
||||||
|
return bot;
|
||||||
|
}).toPromise();
|
||||||
|
},
|
||||||
inject: [TELEGRAF_MODULE_OPTIONS],
|
inject: [TELEGRAF_MODULE_OPTIONS],
|
||||||
};
|
};
|
||||||
|
|
||||||
const asyncProviders = this.createAsyncProviders(options);
|
const asyncProviders = this.createAsyncProviders(options);
|
||||||
return {
|
return {
|
||||||
module: TelegrafCoreModule,
|
module: TelegrafCoreModule,
|
||||||
imports: options.imports,
|
imports: options.imports,
|
||||||
providers: [...asyncProviders, telegrafProvider],
|
providers: [
|
||||||
exports: [telegrafProvider],
|
...asyncProviders,
|
||||||
|
{
|
||||||
|
provide: TELEGRAF_BOT_NAME,
|
||||||
|
useValue: telegrafBotName,
|
||||||
|
},
|
||||||
|
telegrafBotProvider,
|
||||||
|
],
|
||||||
|
exports: [telegrafBotProvider],
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static applyBotMiddlewares(bot, middlewares) {
|
||||||
|
if (middlewares) {
|
||||||
|
middlewares.forEach((middleware) => {
|
||||||
|
bot.use(middleware);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static createAsyncProviders(
|
private static createAsyncProviders(
|
||||||
options: TelegrafModuleAsyncOptions,
|
options: TelegrafModuleAsyncOptions,
|
||||||
): Provider[] {
|
): Provider[] {
|
||||||
@@ -88,4 +158,9 @@ export class TelegrafCoreModule {
|
|||||||
inject,
|
inject,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async onApplicationShutdown(): Promise<void> {
|
||||||
|
const bot = this.moduleRef.get<any>(this.botName);
|
||||||
|
bot && (await bot.stop());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,204 +0,0 @@
|
|||||||
import { Injectable, Type } from '@nestjs/common';
|
|
||||||
import { Reflector } from '@nestjs/core';
|
|
||||||
import {
|
|
||||||
ActionOptions,
|
|
||||||
CashtagOptions,
|
|
||||||
CommandOptions,
|
|
||||||
EntityOptions,
|
|
||||||
HashtagOptions,
|
|
||||||
HearsOptions,
|
|
||||||
InlineQueryOptions,
|
|
||||||
MentionOptions,
|
|
||||||
OnOptions,
|
|
||||||
PhoneOptions,
|
|
||||||
UpdateHookOptions,
|
|
||||||
} from './decorators';
|
|
||||||
import { DECORATORS } from './telegraf.constants';
|
|
||||||
|
|
||||||
@Injectable()
|
|
||||||
export class TelegrafMetadataAccessor {
|
|
||||||
constructor(private readonly reflector: Reflector) {}
|
|
||||||
|
|
||||||
isUpdate(target: Type<any> | Function): boolean {
|
|
||||||
if (!target) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return !!this.reflector.get(DECORATORS.UPDATE, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
isUpdateHook(target: Type<any> | Function): boolean {
|
|
||||||
if (!target) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return !!this.reflector.get(DECORATORS.UPDATE_HOOK, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
getUpdateHookMetadata(
|
|
||||||
target: Type<any> | Function,
|
|
||||||
): UpdateHookOptions | undefined {
|
|
||||||
return this.reflector.get(DECORATORS.UPDATE_HOOK, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
isTelegrafUse(target: Type<any> | Function): boolean {
|
|
||||||
if (!target) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return !!this.reflector.get(DECORATORS.USE, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
isTelegrafOn(target: Type<any> | Function): boolean {
|
|
||||||
if (!target) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return !!this.reflector.get(DECORATORS.ON, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
getTelegrafOnMetadata(target: Type<any> | Function): OnOptions | undefined {
|
|
||||||
return this.reflector.get(DECORATORS.ON, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
isTelegrafHears(target: Type<any> | Function): boolean {
|
|
||||||
if (!target) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return !!this.reflector.get(DECORATORS.HEARS, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
getTelegrafHearsMetadata(
|
|
||||||
target: Type<any> | Function,
|
|
||||||
): HearsOptions | undefined {
|
|
||||||
return this.reflector.get(DECORATORS.HEARS, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
isTelegrafCommand(target: Type<any> | Function): boolean {
|
|
||||||
if (!target) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return !!this.reflector.get(DECORATORS.COMMAND, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
getTelegrafCommandMetadata(
|
|
||||||
target: Type<any> | Function,
|
|
||||||
): CommandOptions | undefined {
|
|
||||||
return this.reflector.get(DECORATORS.COMMAND, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
isTelegrafStart(target: Type<any> | Function): boolean {
|
|
||||||
if (!target) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return !!this.reflector.get(DECORATORS.START, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
isTelegrafHelp(target: Type<any> | Function): boolean {
|
|
||||||
if (!target) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return !!this.reflector.get(DECORATORS.HELP, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
isTelegrafSettings(target: Type<any> | Function): boolean {
|
|
||||||
if (!target) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return !!this.reflector.get(DECORATORS.SETTINGS, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
isTelegrafEntity(target: Type<any> | Function): boolean {
|
|
||||||
if (!target) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return !!this.reflector.get(DECORATORS.ENTITY, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
getTelegrafEntityMetadata(
|
|
||||||
target: Type<any> | Function,
|
|
||||||
): EntityOptions | undefined {
|
|
||||||
return this.reflector.get(DECORATORS.ENTITY, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
isTelegrafMention(target: Type<any> | Function): boolean {
|
|
||||||
if (!target) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return !!this.reflector.get(DECORATORS.MENTION, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
getTelegrafMentionMetadata(
|
|
||||||
target: Type<any> | Function,
|
|
||||||
): MentionOptions | undefined {
|
|
||||||
return this.reflector.get(DECORATORS.MENTION, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
isTelegrafPhone(target: Type<any> | Function): boolean {
|
|
||||||
if (!target) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return !!this.reflector.get(DECORATORS.PHONE, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
getTelegrafPhoneMetadata(
|
|
||||||
target: Type<any> | Function,
|
|
||||||
): PhoneOptions | undefined {
|
|
||||||
return this.reflector.get(DECORATORS.PHONE, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
isTelegrafHashtag(target: Type<any> | Function): boolean {
|
|
||||||
if (!target) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return !!this.reflector.get(DECORATORS.HASHTAG, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
getTelegrafHashtagMetadata(
|
|
||||||
target: Type<any> | Function,
|
|
||||||
): HashtagOptions | undefined {
|
|
||||||
return this.reflector.get(DECORATORS.HASHTAG, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
isTelegrafCashtag(target: Type<any> | Function): boolean {
|
|
||||||
if (!target) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return !!this.reflector.get(DECORATORS.CASHTAG, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
getTelegrafCashtagMetadata(
|
|
||||||
target: Type<any> | Function,
|
|
||||||
): CashtagOptions | undefined {
|
|
||||||
return this.reflector.get(DECORATORS.CASHTAG, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
isTelegrafAction(target: Type<any> | Function): boolean {
|
|
||||||
if (!target) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return !!this.reflector.get(DECORATORS.ACTION, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
getTelegrafActionMetadata(
|
|
||||||
target: Type<any> | Function,
|
|
||||||
): ActionOptions | undefined {
|
|
||||||
return this.reflector.get(DECORATORS.ACTION, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
isTelegrafInlineQuery(target: Type<any> | Function): boolean {
|
|
||||||
if (!target) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return !!this.reflector.get(DECORATORS.INLINE_QUERY, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
getTelegrafInlineQueryMetadata(
|
|
||||||
target: Type<any> | Function,
|
|
||||||
): InlineQueryOptions | undefined {
|
|
||||||
return this.reflector.get(DECORATORS.INLINE_QUERY, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
isTelegrafGameQuery(target: Type<any> | Function): boolean {
|
|
||||||
if (!target) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return !!this.reflector.get(DECORATORS.GAME_QUERY, target);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,23 +1,8 @@
|
|||||||
export const TELEGRAF_MODULE_OPTIONS = 'TELEGRAF_MODULE_OPTIONS';
|
export const TELEGRAF_MODULE_OPTIONS = 'TELEGRAF_MODULE_OPTIONS';
|
||||||
export const TELEGRAF_PROVIDER = 'TelegrafProvider';
|
export const TELEGRAF_BOT_NAME = 'TELEGRAF_BOT_NAME';
|
||||||
|
export const DEFAULT_BOT_NAME = 'DEFAULT_BOT_NAME';
|
||||||
|
|
||||||
export const DECORATORS_PREFIX = 'TELEGRAF';
|
export const UPDATE_METADATA = 'UPDATE_METADATA';
|
||||||
export const DECORATORS = {
|
export const UPDATE_LISTENER_METADATA = 'UPDATE_LISTENER_METADATA';
|
||||||
USE: `${DECORATORS_PREFIX}/USE`,
|
|
||||||
ON: `${DECORATORS_PREFIX}/ON`,
|
export const SCENE_METADATA = 'SCENE_METADATA';
|
||||||
HEARS: `${DECORATORS_PREFIX}/HEARS`,
|
|
||||||
COMMAND: `${DECORATORS_PREFIX}/COMMAND`,
|
|
||||||
START: `${DECORATORS_PREFIX}/START`,
|
|
||||||
HELP: `${DECORATORS_PREFIX}/HELP`,
|
|
||||||
SETTINGS: `${DECORATORS_PREFIX}/SETTINGS`,
|
|
||||||
ENTITY: `${DECORATORS_PREFIX}/ENTITY`,
|
|
||||||
MENTION: `${DECORATORS_PREFIX}/MENTION`,
|
|
||||||
PHONE: `${DECORATORS_PREFIX}/PHONE`,
|
|
||||||
HASHTAG: `${DECORATORS_PREFIX}/HASHTAG`,
|
|
||||||
CASHTAG: `${DECORATORS_PREFIX}/CASHTAG`,
|
|
||||||
ACTION: `${DECORATORS_PREFIX}/ACTION`,
|
|
||||||
INLINE_QUERY: `${DECORATORS_PREFIX}/INLINE_QUERY`,
|
|
||||||
GAME_QUERY: `${DECORATORS_PREFIX}/GAME_QUERY`,
|
|
||||||
UPDATE: `${DECORATORS_PREFIX}/UPDATE`,
|
|
||||||
UPDATE_HOOK: `${DECORATORS_PREFIX}/UPDATE_HOOK`,
|
|
||||||
};
|
|
||||||
|
|||||||
@@ -1,245 +0,0 @@
|
|||||||
import { Injectable, OnModuleInit } from '@nestjs/common';
|
|
||||||
import { DiscoveryService, ModuleRef } from '@nestjs/core';
|
|
||||||
import { InstanceWrapper } from '@nestjs/core/injector/instance-wrapper';
|
|
||||||
import { MetadataScanner } from '@nestjs/core/metadata-scanner';
|
|
||||||
import { TelegrafMetadataAccessor } from './telegraf-metadata.accessor';
|
|
||||||
import { TelegrafProvider } from './telegraf.provider';
|
|
||||||
import { TELEGRAF_PROVIDER } from './telegraf.constants';
|
|
||||||
import {
|
|
||||||
ActionOptions,
|
|
||||||
CashtagOptions,
|
|
||||||
CommandOptions,
|
|
||||||
EntityOptions,
|
|
||||||
HashtagOptions,
|
|
||||||
HearsOptions,
|
|
||||||
InlineQueryOptions,
|
|
||||||
MentionOptions,
|
|
||||||
OnOptions,
|
|
||||||
PhoneOptions,
|
|
||||||
UpdateHookOptions,
|
|
||||||
} from './decorators';
|
|
||||||
|
|
||||||
@Injectable()
|
|
||||||
export class TelegrafExplorer implements OnModuleInit {
|
|
||||||
constructor(
|
|
||||||
private readonly moduleRef: ModuleRef,
|
|
||||||
private readonly discoveryService: DiscoveryService,
|
|
||||||
private readonly metadataAccessor: TelegrafMetadataAccessor,
|
|
||||||
private readonly metadataScanner: MetadataScanner,
|
|
||||||
) {}
|
|
||||||
|
|
||||||
private telegraf: TelegrafProvider;
|
|
||||||
|
|
||||||
onModuleInit() {
|
|
||||||
this.telegraf = this.moduleRef.get<TelegrafProvider>(TELEGRAF_PROVIDER, {
|
|
||||||
strict: false,
|
|
||||||
});
|
|
||||||
this.explore();
|
|
||||||
}
|
|
||||||
|
|
||||||
explore() {
|
|
||||||
/**
|
|
||||||
* Update providers section is only for decorators under Update decorator
|
|
||||||
*/
|
|
||||||
const updateProviders: InstanceWrapper[] = this.discoveryService
|
|
||||||
.getProviders()
|
|
||||||
.filter((wrapper: InstanceWrapper) =>
|
|
||||||
this.metadataAccessor.isUpdate(wrapper.metatype),
|
|
||||||
);
|
|
||||||
|
|
||||||
updateProviders.forEach((wrapper: InstanceWrapper) => {
|
|
||||||
const { instance } = wrapper;
|
|
||||||
|
|
||||||
this.metadataScanner.scanFromPrototype(
|
|
||||||
instance,
|
|
||||||
Object.getPrototypeOf(instance),
|
|
||||||
(key: string) => {
|
|
||||||
if (this.metadataAccessor.isUpdateHook(instance[key])) {
|
|
||||||
const metadata = this.metadataAccessor.getUpdateHookMetadata(
|
|
||||||
instance[key],
|
|
||||||
);
|
|
||||||
this.handleUpdateHook(instance, key, metadata);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
const providers: InstanceWrapper[] = this.discoveryService.getProviders();
|
|
||||||
|
|
||||||
providers.forEach((wrapper: InstanceWrapper) => {
|
|
||||||
const { instance } = wrapper;
|
|
||||||
|
|
||||||
if (!instance) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.metadataScanner.scanFromPrototype(
|
|
||||||
instance,
|
|
||||||
Object.getPrototypeOf(instance),
|
|
||||||
(key: string) => {
|
|
||||||
if (this.metadataAccessor.isTelegrafUse(instance[key])) {
|
|
||||||
this.handleTelegrafUse(instance, key);
|
|
||||||
} else if (this.metadataAccessor.isTelegrafOn(instance[key])) {
|
|
||||||
const metadata = this.metadataAccessor.getTelegrafOnMetadata(
|
|
||||||
instance[key],
|
|
||||||
);
|
|
||||||
this.handleTelegrafOn(instance, key, metadata);
|
|
||||||
} else if (this.metadataAccessor.isTelegrafHears(instance[key])) {
|
|
||||||
const metadata = this.metadataAccessor.getTelegrafHearsMetadata(
|
|
||||||
instance[key],
|
|
||||||
);
|
|
||||||
this.handleTelegrafHears(instance, key, metadata);
|
|
||||||
} else if (this.metadataAccessor.isTelegrafCommand(instance[key])) {
|
|
||||||
const metadata = this.metadataAccessor.getTelegrafCommandMetadata(
|
|
||||||
instance[key],
|
|
||||||
);
|
|
||||||
this.handleTelegrafCommand(instance, key, metadata);
|
|
||||||
} else if (this.metadataAccessor.isTelegrafStart(instance[key])) {
|
|
||||||
this.handleTelegrafStart(instance, key);
|
|
||||||
} else if (this.metadataAccessor.isTelegrafHelp(instance[key])) {
|
|
||||||
this.handleTelegrafHelp(instance, key);
|
|
||||||
} else if (this.metadataAccessor.isTelegrafSettings(instance[key])) {
|
|
||||||
this.handleTelegrafSettings(instance, key);
|
|
||||||
} else if (this.metadataAccessor.isTelegrafEntity(instance[key])) {
|
|
||||||
const metadata = this.metadataAccessor.getTelegrafEntityMetadata(
|
|
||||||
instance[key],
|
|
||||||
);
|
|
||||||
this.handleTelegrafEntity(instance, key, metadata);
|
|
||||||
} else if (this.metadataAccessor.isTelegrafMention(instance[key])) {
|
|
||||||
const metadata = this.metadataAccessor.getTelegrafMentionMetadata(
|
|
||||||
instance[key],
|
|
||||||
);
|
|
||||||
this.handleTelegrafMention(instance, key, metadata);
|
|
||||||
} else if (this.metadataAccessor.isTelegrafPhone(instance[key])) {
|
|
||||||
const metadata = this.metadataAccessor.getTelegrafPhoneMetadata(
|
|
||||||
instance[key],
|
|
||||||
);
|
|
||||||
this.handleTelegrafPhone(instance, key, metadata);
|
|
||||||
} else if (this.metadataAccessor.isTelegrafHashtag(instance[key])) {
|
|
||||||
const metadata = this.metadataAccessor.getTelegrafHashtagMetadata(
|
|
||||||
instance[key],
|
|
||||||
);
|
|
||||||
this.handleTelegrafHashtag(instance, key, metadata);
|
|
||||||
} else if (this.metadataAccessor.isTelegrafCashtag(instance[key])) {
|
|
||||||
const metadata = this.metadataAccessor.getTelegrafCashtagMetadata(
|
|
||||||
instance[key],
|
|
||||||
);
|
|
||||||
this.handleTelegrafCashtag(instance, key, metadata);
|
|
||||||
} else if (this.metadataAccessor.isTelegrafAction(instance[key])) {
|
|
||||||
const metadata = this.metadataAccessor.getTelegrafActionMetadata(
|
|
||||||
instance[key],
|
|
||||||
);
|
|
||||||
this.handleTelegrafAction(instance, key, metadata);
|
|
||||||
} else if (
|
|
||||||
this.metadataAccessor.isTelegrafInlineQuery(instance[key])
|
|
||||||
) {
|
|
||||||
const metadata = this.metadataAccessor.getTelegrafInlineQueryMetadata(
|
|
||||||
instance[key],
|
|
||||||
);
|
|
||||||
this.handleTelegrafInlineQuery(instance, key, metadata);
|
|
||||||
} else if (this.metadataAccessor.isTelegrafGameQuery(instance[key])) {
|
|
||||||
this.handleTelegrafGameQuery(instance, key);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
handleUpdateHook(instance: object, key: string, metadata: UpdateHookOptions) {
|
|
||||||
this.telegraf.on(metadata.updateType, instance[key].bind(instance));
|
|
||||||
}
|
|
||||||
|
|
||||||
handleTelegrafUse(instance: object, key: string) {
|
|
||||||
this.telegraf.use(instance[key].bind(instance));
|
|
||||||
}
|
|
||||||
|
|
||||||
handleTelegrafOn(instance: object, key: string, metadata: OnOptions) {
|
|
||||||
this.telegraf.on(metadata.updateTypes, instance[key].bind(instance));
|
|
||||||
}
|
|
||||||
|
|
||||||
handleTelegrafHears(instance: object, key: string, metadata: HearsOptions) {
|
|
||||||
this.telegraf.hears(metadata.triggers, instance[key].bind(instance));
|
|
||||||
}
|
|
||||||
|
|
||||||
handleTelegrafCommand(
|
|
||||||
instance: object,
|
|
||||||
key: string,
|
|
||||||
metadata: CommandOptions,
|
|
||||||
) {
|
|
||||||
this.telegraf.command(metadata.commands, instance[key].bind(instance));
|
|
||||||
}
|
|
||||||
|
|
||||||
handleTelegrafStart(instance: object, key: string) {
|
|
||||||
this.telegraf.start(instance[key].bind(instance));
|
|
||||||
}
|
|
||||||
|
|
||||||
handleTelegrafHelp(instance: object, key: string) {
|
|
||||||
this.telegraf.help(instance[key].bind(instance));
|
|
||||||
}
|
|
||||||
|
|
||||||
handleTelegrafSettings(instance: object, key: string) {
|
|
||||||
// @ts-ignore
|
|
||||||
this.telegraf.settings(instance[key].bind(instance));
|
|
||||||
}
|
|
||||||
|
|
||||||
handleTelegrafEntity(instance: object, key: string, metadata: EntityOptions) {
|
|
||||||
// @ts-ignore
|
|
||||||
this.telegraf.entity(metadata.entity, instance[key].bind(instance));
|
|
||||||
}
|
|
||||||
|
|
||||||
handleTelegrafMention(
|
|
||||||
instance: object,
|
|
||||||
key: string,
|
|
||||||
metadata: MentionOptions,
|
|
||||||
) {
|
|
||||||
// @ts-ignore
|
|
||||||
this.telegraf.mention(metadata.username, instance[key].bind(instance));
|
|
||||||
}
|
|
||||||
|
|
||||||
handleTelegrafPhone(instance: object, key: string, metadata: PhoneOptions) {
|
|
||||||
// @ts-ignore
|
|
||||||
this.telegraf.phone(metadata.phone, instance[key].bind(instance));
|
|
||||||
}
|
|
||||||
|
|
||||||
handleTelegrafHashtag(
|
|
||||||
instance: object,
|
|
||||||
key: string,
|
|
||||||
metadata: HashtagOptions,
|
|
||||||
) {
|
|
||||||
// @ts-ignore
|
|
||||||
this.telegraf.hashtag(metadata.hashtag, instance[key].bind(instance));
|
|
||||||
}
|
|
||||||
|
|
||||||
handleTelegrafCashtag(
|
|
||||||
instance: object,
|
|
||||||
key: string,
|
|
||||||
metadata: CashtagOptions,
|
|
||||||
) {
|
|
||||||
// @ts-ignore
|
|
||||||
this.telegraf.cashtag(metadata.cashtag, instance[key].bind(instance));
|
|
||||||
}
|
|
||||||
|
|
||||||
handleTelegrafAction(instance: object, key: string, metadata: ActionOptions) {
|
|
||||||
this.telegraf.action(metadata.triggers, instance[key].bind(instance));
|
|
||||||
}
|
|
||||||
|
|
||||||
handleTelegrafInlineQuery(
|
|
||||||
instance: object,
|
|
||||||
key: string,
|
|
||||||
metadata: InlineQueryOptions,
|
|
||||||
) {
|
|
||||||
if (metadata.triggers) {
|
|
||||||
// @ts-ignore
|
|
||||||
this.telegraf.inlineQuery(
|
|
||||||
metadata.triggers,
|
|
||||||
instance[key].bind(instance),
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
this.telegraf.on(metadata.updateType, instance[key].bind(instance));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
handleTelegrafGameQuery(instance: object, key: string) {
|
|
||||||
this.telegraf.gameQuery(instance[key].bind(instance));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
import {
|
|
||||||
Injectable,
|
|
||||||
Inject,
|
|
||||||
OnApplicationBootstrap,
|
|
||||||
Logger,
|
|
||||||
OnApplicationShutdown,
|
|
||||||
} from '@nestjs/common';
|
|
||||||
import { Telegraf } from 'telegraf';
|
|
||||||
import { Context, TelegrafModuleOptions } from './interfaces';
|
|
||||||
import { TELEGRAF_MODULE_OPTIONS } from './telegraf.constants';
|
|
||||||
|
|
||||||
@Injectable()
|
|
||||||
export class TelegrafProvider extends Telegraf<Context>
|
|
||||||
implements OnApplicationBootstrap, OnApplicationShutdown {
|
|
||||||
private logger = new Logger('Telegraf');
|
|
||||||
private readonly launchOptions;
|
|
||||||
|
|
||||||
constructor(@Inject(TELEGRAF_MODULE_OPTIONS) options: TelegrafModuleOptions) {
|
|
||||||
super(options.token, options.options);
|
|
||||||
this.launchOptions = options.launchOptions;
|
|
||||||
}
|
|
||||||
|
|
||||||
async onApplicationBootstrap() {
|
|
||||||
this.catch((err, ctx: Context) => {
|
|
||||||
this.logger.error(
|
|
||||||
`Encountered an error for ${ctx.updateType} update type`,
|
|
||||||
err,
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
await this.launch(this.launchOptions);
|
|
||||||
}
|
|
||||||
|
|
||||||
async onApplicationShutdown() {
|
|
||||||
await this.stop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
import { BaseScene, Composer, Middleware } from 'telegraf';
|
||||||
|
|
||||||
|
export type Filter<T extends any[], F> = T extends []
|
||||||
|
? []
|
||||||
|
: T extends [infer Head, ...infer Tail]
|
||||||
|
? Head extends F
|
||||||
|
? Filter<Tail, F>
|
||||||
|
: [Head, ...Filter<Tail, F>]
|
||||||
|
: [];
|
||||||
|
|
||||||
|
export type OnlyFunctionPropertyNames<T> = {
|
||||||
|
[K in keyof T]: T[K] extends (...args: any) => any ? K : never;
|
||||||
|
}[keyof T];
|
||||||
|
|
||||||
|
export type ComposerMethodArgs<
|
||||||
|
T extends Composer<never>,
|
||||||
|
U extends OnlyFunctionPropertyNames<T> = OnlyFunctionPropertyNames<T>
|
||||||
|
> = Filter<Parameters<T[U]>, Middleware<never>>;
|
||||||
|
|
||||||
|
export type UpdateMethods = OnlyFunctionPropertyNames<Composer<never>>;
|
||||||
|
export type SceneMethods = OnlyFunctionPropertyNames<BaseScene<never>>;
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
import { DEFAULT_BOT_NAME } from '../telegraf.constants';
|
||||||
|
|
||||||
|
export function getBotToken(name?: string) {
|
||||||
|
return name && name !== DEFAULT_BOT_NAME
|
||||||
|
? `${name}_BOT_NAME`
|
||||||
|
: DEFAULT_BOT_NAME;
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
export * from './get-bot-token.util';
|
||||||
Generated
+527
-2
@@ -1,11 +1,11 @@
|
|||||||
{
|
{
|
||||||
"name": "nestjs-telegraf",
|
"name": "nestjs-telegraf",
|
||||||
"version": "1.3.1",
|
"version": "2.0.0",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"version": "1.3.1",
|
"version": "2.0.0",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"telegraf": "3.38.0"
|
"telegraf": "3.38.0"
|
||||||
@@ -13,6 +13,7 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@nestjs/common": "7.6.5",
|
"@nestjs/common": "7.6.5",
|
||||||
"@nestjs/core": "7.6.5",
|
"@nestjs/core": "7.6.5",
|
||||||
|
"@types/lodash": "4.14.167",
|
||||||
"@typescript-eslint/eslint-plugin": "4.11.1",
|
"@typescript-eslint/eslint-plugin": "4.11.1",
|
||||||
"@typescript-eslint/parser": "4.11.1",
|
"@typescript-eslint/parser": "4.11.1",
|
||||||
"eslint": "7.17.0",
|
"eslint": "7.17.0",
|
||||||
@@ -20,9 +21,11 @@
|
|||||||
"eslint-plugin-import": "2.22.1",
|
"eslint-plugin-import": "2.22.1",
|
||||||
"husky": "4.3.6",
|
"husky": "4.3.6",
|
||||||
"lint-staged": "10.5.3",
|
"lint-staged": "10.5.3",
|
||||||
|
"lodash": "4.17.20",
|
||||||
"prettier": "2.2.1",
|
"prettier": "2.2.1",
|
||||||
"reflect-metadata": "0.1.13",
|
"reflect-metadata": "0.1.13",
|
||||||
"rxjs": "6.6.3",
|
"rxjs": "6.6.3",
|
||||||
|
"typedoc": "0.20.9",
|
||||||
"typescript": "4.1.3"
|
"typescript": "4.1.3"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
@@ -292,6 +295,12 @@
|
|||||||
"integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=",
|
"integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/@types/lodash": {
|
||||||
|
"version": "4.14.167",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.167.tgz",
|
||||||
|
"integrity": "sha512-w7tQPjARrvdeBkX/Rwg95S592JwxqOjmms3zWQ0XZgSyxSLdzWaYH3vErBhdVS/lRBX7F8aBYcYJYTr5TMGOzw==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"node_modules/@types/parse-json": {
|
"node_modules/@types/parse-json": {
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
|
||||||
@@ -610,6 +619,15 @@
|
|||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/at-least-node": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
|
||||||
|
"integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
|
||||||
|
"dev": true,
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 4.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/axios": {
|
"node_modules/axios": {
|
||||||
"version": "0.21.1",
|
"version": "0.21.1",
|
||||||
"resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz",
|
"resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz",
|
||||||
@@ -725,6 +743,15 @@
|
|||||||
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
|
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/colors": {
|
||||||
|
"version": "1.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
|
||||||
|
"integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
|
||||||
|
"dev": true,
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.1.90"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/commander": {
|
"node_modules/commander": {
|
||||||
"version": "6.2.0",
|
"version": "6.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz",
|
||||||
@@ -1531,6 +1558,21 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/fs-extra": {
|
||||||
|
"version": "9.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz",
|
||||||
|
"integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"at-least-node": "^1.0.0",
|
||||||
|
"graceful-fs": "^4.2.0",
|
||||||
|
"jsonfile": "^6.0.1",
|
||||||
|
"universalify": "^1.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/fs.realpath": {
|
"node_modules/fs.realpath": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
|
||||||
@@ -1649,6 +1691,28 @@
|
|||||||
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
|
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/handlebars": {
|
||||||
|
"version": "4.7.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz",
|
||||||
|
"integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"minimist": "^1.2.5",
|
||||||
|
"neo-async": "^2.6.0",
|
||||||
|
"source-map": "^0.6.1",
|
||||||
|
"uglify-js": "^3.1.4",
|
||||||
|
"wordwrap": "^1.0.0"
|
||||||
|
},
|
||||||
|
"bin": {
|
||||||
|
"handlebars": "bin/handlebars"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.4.7"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"uglify-js": "^3.1.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/has": {
|
"node_modules/has": {
|
||||||
"version": "1.0.3",
|
"version": "1.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
|
||||||
@@ -1845,6 +1909,15 @@
|
|||||||
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
|
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/interpret": {
|
||||||
|
"version": "1.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
|
||||||
|
"integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
|
||||||
|
"dev": true,
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.10"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/is-arrayish": {
|
"node_modules/is-arrayish": {
|
||||||
"version": "0.2.1",
|
"version": "0.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
|
||||||
@@ -2047,6 +2120,28 @@
|
|||||||
"json5": "lib/cli.js"
|
"json5": "lib/cli.js"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/jsonfile": {
|
||||||
|
"version": "6.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
|
||||||
|
"integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"graceful-fs": "^4.1.6",
|
||||||
|
"universalify": "^2.0.0"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"graceful-fs": "^4.1.6"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/jsonfile/node_modules/universalify": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
|
||||||
|
"integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
|
||||||
|
"dev": true,
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 10.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/levn": {
|
"node_modules/levn": {
|
||||||
"version": "0.4.1",
|
"version": "0.4.1",
|
||||||
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
|
||||||
@@ -2440,6 +2535,33 @@
|
|||||||
"node": ">=10"
|
"node": ">=10"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/lru-cache": {
|
||||||
|
"version": "5.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
|
||||||
|
"integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"yallist": "^3.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/lunr": {
|
||||||
|
"version": "2.3.9",
|
||||||
|
"resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz",
|
||||||
|
"integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"node_modules/marked": {
|
||||||
|
"version": "1.2.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/marked/-/marked-1.2.7.tgz",
|
||||||
|
"integrity": "sha512-No11hFYcXr/zkBvL6qFmAp1z6BKY3zqLMHny/JN/ey+al7qwCM2+CMBL9BOgqMxZU36fz4cCWfn2poWIf7QRXA==",
|
||||||
|
"dev": true,
|
||||||
|
"bin": {
|
||||||
|
"marked": "bin/marked"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 8.16.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/merge-stream": {
|
"node_modules/merge-stream": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
|
||||||
@@ -2511,6 +2633,12 @@
|
|||||||
"integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
|
"integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/neo-async": {
|
||||||
|
"version": "2.6.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
|
||||||
|
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"node_modules/node-fetch": {
|
"node_modules/node-fetch": {
|
||||||
"version": "2.6.1",
|
"version": "2.6.1",
|
||||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
|
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
|
||||||
@@ -2659,6 +2787,15 @@
|
|||||||
"node": ">=6"
|
"node": ">=6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/onigasm": {
|
||||||
|
"version": "2.2.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/onigasm/-/onigasm-2.2.5.tgz",
|
||||||
|
"integrity": "sha512-F+th54mPc0l1lp1ZcFMyL/jTs2Tlq4SqIHKIXGZOR/VkHkF9A7Fr5rRr5+ZG/lWeRsyrClLYRq7s/yFQ/XhWCA==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"lru-cache": "^5.1.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/opencollective-postinstall": {
|
"node_modules/opencollective-postinstall": {
|
||||||
"version": "2.0.3",
|
"version": "2.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz",
|
||||||
@@ -2999,6 +3136,18 @@
|
|||||||
"node": ">=4"
|
"node": ">=4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/rechoir": {
|
||||||
|
"version": "0.6.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
|
||||||
|
"integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"resolve": "^1.1.6"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.10"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/reflect-metadata": {
|
"node_modules/reflect-metadata": {
|
||||||
"version": "0.1.13",
|
"version": "0.1.13",
|
||||||
"resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz",
|
"resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz",
|
||||||
@@ -3158,6 +3307,69 @@
|
|||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/shelljs": {
|
||||||
|
"version": "0.8.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz",
|
||||||
|
"integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"glob": "^7.0.0",
|
||||||
|
"interpret": "^1.0.0",
|
||||||
|
"rechoir": "^0.6.2"
|
||||||
|
},
|
||||||
|
"bin": {
|
||||||
|
"shjs": "bin/shjs"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/shiki": {
|
||||||
|
"version": "0.2.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/shiki/-/shiki-0.2.7.tgz",
|
||||||
|
"integrity": "sha512-bwVc7cdtYYHEO9O+XJ8aNOskKRfaQd5Y4ovLRfbQkmiLSUaR+bdlssbZUUhbQ0JAFMYcTcJ5tjG5KtnufttDHQ==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"onigasm": "^2.2.5",
|
||||||
|
"shiki-languages": "^0.2.7",
|
||||||
|
"shiki-themes": "^0.2.7",
|
||||||
|
"vscode-textmate": "^5.2.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/shiki-languages": {
|
||||||
|
"version": "0.2.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/shiki-languages/-/shiki-languages-0.2.7.tgz",
|
||||||
|
"integrity": "sha512-REmakh7pn2jCn9GDMRSK36oDgqhh+rSvJPo77sdWTOmk44C5b0XlYPwJZcFOMJWUZJE0c7FCbKclw4FLwUKLRw==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"vscode-textmate": "^5.2.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/shiki-themes": {
|
||||||
|
"version": "0.2.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/shiki-themes/-/shiki-themes-0.2.7.tgz",
|
||||||
|
"integrity": "sha512-ZMmboDYw5+SEpugM8KGUq3tkZ0vXg+k60XX6NngDK7gc1Sv6YLUlanpvG3evm57uKJvfXsky/S5MzSOTtYKLjA==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"json5": "^2.1.0",
|
||||||
|
"vscode-textmate": "^5.2.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/shiki-themes/node_modules/json5": {
|
||||||
|
"version": "2.1.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
|
||||||
|
"integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"minimist": "^1.2.5"
|
||||||
|
},
|
||||||
|
"bin": {
|
||||||
|
"json5": "lib/cli.js"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/signal-exit": {
|
"node_modules/signal-exit": {
|
||||||
"version": "3.0.3",
|
"version": "3.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
|
||||||
@@ -3217,6 +3429,15 @@
|
|||||||
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
|
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/source-map": {
|
||||||
|
"version": "0.6.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
|
||||||
|
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
|
||||||
|
"dev": true,
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.10.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/spdx-correct": {
|
"node_modules/spdx-correct": {
|
||||||
"version": "3.1.1",
|
"version": "3.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
|
||||||
@@ -3555,6 +3776,43 @@
|
|||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/typedoc": {
|
||||||
|
"version": "0.20.9",
|
||||||
|
"resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.20.9.tgz",
|
||||||
|
"integrity": "sha512-GCaE9Hn+VFY2i9wBxFbCv/KZCgHw4+6hiYRdJ0y2DudcWvpgLeCIBJYP1e70MtKCZzs4FT+ydLxInr/hyXrY4Q==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"colors": "^1.4.0",
|
||||||
|
"fs-extra": "^9.0.1",
|
||||||
|
"handlebars": "^4.7.6",
|
||||||
|
"lodash": "^4.17.20",
|
||||||
|
"lunr": "^2.3.9",
|
||||||
|
"marked": "^1.2.5",
|
||||||
|
"minimatch": "^3.0.0",
|
||||||
|
"progress": "^2.0.3",
|
||||||
|
"shelljs": "^0.8.4",
|
||||||
|
"shiki": "^0.2.7",
|
||||||
|
"typedoc-default-themes": "0.12.0"
|
||||||
|
},
|
||||||
|
"bin": {
|
||||||
|
"typedoc": "bin/typedoc"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 10.8.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"typescript": "3.9.x || 4.0.x || 4.1.x"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/typedoc-default-themes": {
|
||||||
|
"version": "0.12.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.12.0.tgz",
|
||||||
|
"integrity": "sha512-0hHBxwmfxE0rkIslOiO39fJyYwaScQEhUIxcpqx3uS1BL3zhFW5oQfUaPx2cv2XLL/GXhYFxhdFLoVmNptbxEQ==",
|
||||||
|
"dev": true,
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 8"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/typescript": {
|
"node_modules/typescript": {
|
||||||
"version": "4.1.3",
|
"version": "4.1.3",
|
||||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.3.tgz",
|
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.3.tgz",
|
||||||
@@ -3568,6 +3826,28 @@
|
|||||||
"node": ">=4.2.0"
|
"node": ">=4.2.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/uglify-js": {
|
||||||
|
"version": "3.12.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.12.4.tgz",
|
||||||
|
"integrity": "sha512-L5i5jg/SHkEqzN18gQMTWsZk3KelRsfD1wUVNqtq0kzqWQqcJjyL8yc1o8hJgRrWqrAl2mUFbhfznEIoi7zi2A==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"bin": {
|
||||||
|
"uglifyjs": "bin/uglifyjs"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.8.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/universalify": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz",
|
||||||
|
"integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==",
|
||||||
|
"dev": true,
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 10.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/uri-js": {
|
"node_modules/uri-js": {
|
||||||
"version": "4.4.0",
|
"version": "4.4.0",
|
||||||
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz",
|
||||||
@@ -3602,6 +3882,12 @@
|
|||||||
"spdx-expression-parse": "^3.0.0"
|
"spdx-expression-parse": "^3.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/vscode-textmate": {
|
||||||
|
"version": "5.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz",
|
||||||
|
"integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"node_modules/which": {
|
"node_modules/which": {
|
||||||
"version": "2.0.2",
|
"version": "2.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
|
||||||
@@ -3632,6 +3918,12 @@
|
|||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/wordwrap": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
|
||||||
|
"integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"node_modules/wrap-ansi": {
|
"node_modules/wrap-ansi": {
|
||||||
"version": "6.2.0",
|
"version": "6.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
|
||||||
@@ -3682,6 +3974,12 @@
|
|||||||
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
|
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/yallist": {
|
||||||
|
"version": "3.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
|
||||||
|
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"node_modules/yaml": {
|
"node_modules/yaml": {
|
||||||
"version": "1.10.0",
|
"version": "1.10.0",
|
||||||
"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz",
|
"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz",
|
||||||
@@ -3880,6 +4178,12 @@
|
|||||||
"integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=",
|
"integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"@types/lodash": {
|
||||||
|
"version": "4.14.167",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.167.tgz",
|
||||||
|
"integrity": "sha512-w7tQPjARrvdeBkX/Rwg95S592JwxqOjmms3zWQ0XZgSyxSLdzWaYH3vErBhdVS/lRBX7F8aBYcYJYTr5TMGOzw==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"@types/parse-json": {
|
"@types/parse-json": {
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
|
||||||
@@ -4086,6 +4390,12 @@
|
|||||||
"integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
|
"integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"at-least-node": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
|
||||||
|
"integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"axios": {
|
"axios": {
|
||||||
"version": "0.21.1",
|
"version": "0.21.1",
|
||||||
"resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz",
|
"resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz",
|
||||||
@@ -4183,6 +4493,12 @@
|
|||||||
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
|
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"colors": {
|
||||||
|
"version": "1.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
|
||||||
|
"integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"commander": {
|
"commander": {
|
||||||
"version": "6.2.0",
|
"version": "6.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz",
|
||||||
@@ -4833,6 +5149,18 @@
|
|||||||
"integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg==",
|
"integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"fs-extra": {
|
||||||
|
"version": "9.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz",
|
||||||
|
"integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"at-least-node": "^1.0.0",
|
||||||
|
"graceful-fs": "^4.2.0",
|
||||||
|
"jsonfile": "^6.0.1",
|
||||||
|
"universalify": "^1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"fs.realpath": {
|
"fs.realpath": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
|
||||||
@@ -4926,6 +5254,19 @@
|
|||||||
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
|
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"handlebars": {
|
||||||
|
"version": "4.7.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz",
|
||||||
|
"integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"minimist": "^1.2.5",
|
||||||
|
"neo-async": "^2.6.0",
|
||||||
|
"source-map": "^0.6.1",
|
||||||
|
"uglify-js": "^3.1.4",
|
||||||
|
"wordwrap": "^1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"has": {
|
"has": {
|
||||||
"version": "1.0.3",
|
"version": "1.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
|
||||||
@@ -5073,6 +5414,12 @@
|
|||||||
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
|
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"interpret": {
|
||||||
|
"version": "1.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
|
||||||
|
"integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"is-arrayish": {
|
"is-arrayish": {
|
||||||
"version": "0.2.1",
|
"version": "0.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
|
||||||
@@ -5227,6 +5574,24 @@
|
|||||||
"minimist": "^1.2.0"
|
"minimist": "^1.2.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"jsonfile": {
|
||||||
|
"version": "6.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
|
||||||
|
"integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"graceful-fs": "^4.1.6",
|
||||||
|
"universalify": "^2.0.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"universalify": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
|
||||||
|
"integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
|
||||||
|
"dev": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"levn": {
|
"levn": {
|
||||||
"version": "0.4.1",
|
"version": "0.4.1",
|
||||||
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
|
||||||
@@ -5546,6 +5911,27 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"lru-cache": {
|
||||||
|
"version": "5.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
|
||||||
|
"integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"yallist": "^3.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"lunr": {
|
||||||
|
"version": "2.3.9",
|
||||||
|
"resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz",
|
||||||
|
"integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"marked": {
|
||||||
|
"version": "1.2.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/marked/-/marked-1.2.7.tgz",
|
||||||
|
"integrity": "sha512-No11hFYcXr/zkBvL6qFmAp1z6BKY3zqLMHny/JN/ey+al7qwCM2+CMBL9BOgqMxZU36fz4cCWfn2poWIf7QRXA==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"merge-stream": {
|
"merge-stream": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
|
||||||
@@ -5605,6 +5991,12 @@
|
|||||||
"integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
|
"integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"neo-async": {
|
||||||
|
"version": "2.6.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
|
||||||
|
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"node-fetch": {
|
"node-fetch": {
|
||||||
"version": "2.6.1",
|
"version": "2.6.1",
|
||||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
|
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
|
||||||
@@ -5727,6 +6119,15 @@
|
|||||||
"mimic-fn": "^2.1.0"
|
"mimic-fn": "^2.1.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"onigasm": {
|
||||||
|
"version": "2.2.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/onigasm/-/onigasm-2.2.5.tgz",
|
||||||
|
"integrity": "sha512-F+th54mPc0l1lp1ZcFMyL/jTs2Tlq4SqIHKIXGZOR/VkHkF9A7Fr5rRr5+ZG/lWeRsyrClLYRq7s/yFQ/XhWCA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"lru-cache": "^5.1.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"opencollective-postinstall": {
|
"opencollective-postinstall": {
|
||||||
"version": "2.0.3",
|
"version": "2.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz",
|
||||||
@@ -5984,6 +6385,15 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"rechoir": {
|
||||||
|
"version": "0.6.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
|
||||||
|
"integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"resolve": "^1.1.6"
|
||||||
|
}
|
||||||
|
},
|
||||||
"reflect-metadata": {
|
"reflect-metadata": {
|
||||||
"version": "0.1.13",
|
"version": "0.1.13",
|
||||||
"resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz",
|
"resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz",
|
||||||
@@ -6089,6 +6499,59 @@
|
|||||||
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
|
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"shelljs": {
|
||||||
|
"version": "0.8.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz",
|
||||||
|
"integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"glob": "^7.0.0",
|
||||||
|
"interpret": "^1.0.0",
|
||||||
|
"rechoir": "^0.6.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"shiki": {
|
||||||
|
"version": "0.2.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/shiki/-/shiki-0.2.7.tgz",
|
||||||
|
"integrity": "sha512-bwVc7cdtYYHEO9O+XJ8aNOskKRfaQd5Y4ovLRfbQkmiLSUaR+bdlssbZUUhbQ0JAFMYcTcJ5tjG5KtnufttDHQ==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"onigasm": "^2.2.5",
|
||||||
|
"shiki-languages": "^0.2.7",
|
||||||
|
"shiki-themes": "^0.2.7",
|
||||||
|
"vscode-textmate": "^5.2.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"shiki-languages": {
|
||||||
|
"version": "0.2.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/shiki-languages/-/shiki-languages-0.2.7.tgz",
|
||||||
|
"integrity": "sha512-REmakh7pn2jCn9GDMRSK36oDgqhh+rSvJPo77sdWTOmk44C5b0XlYPwJZcFOMJWUZJE0c7FCbKclw4FLwUKLRw==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"vscode-textmate": "^5.2.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"shiki-themes": {
|
||||||
|
"version": "0.2.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/shiki-themes/-/shiki-themes-0.2.7.tgz",
|
||||||
|
"integrity": "sha512-ZMmboDYw5+SEpugM8KGUq3tkZ0vXg+k60XX6NngDK7gc1Sv6YLUlanpvG3evm57uKJvfXsky/S5MzSOTtYKLjA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"json5": "^2.1.0",
|
||||||
|
"vscode-textmate": "^5.2.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"json5": {
|
||||||
|
"version": "2.1.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
|
||||||
|
"integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"minimist": "^1.2.5"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"signal-exit": {
|
"signal-exit": {
|
||||||
"version": "3.0.3",
|
"version": "3.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
|
||||||
@@ -6138,6 +6601,12 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"source-map": {
|
||||||
|
"version": "0.6.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
|
||||||
|
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"spdx-correct": {
|
"spdx-correct": {
|
||||||
"version": "3.1.1",
|
"version": "3.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
|
||||||
@@ -6413,12 +6882,50 @@
|
|||||||
"integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
|
"integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"typedoc": {
|
||||||
|
"version": "0.20.9",
|
||||||
|
"resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.20.9.tgz",
|
||||||
|
"integrity": "sha512-GCaE9Hn+VFY2i9wBxFbCv/KZCgHw4+6hiYRdJ0y2DudcWvpgLeCIBJYP1e70MtKCZzs4FT+ydLxInr/hyXrY4Q==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"colors": "^1.4.0",
|
||||||
|
"fs-extra": "^9.0.1",
|
||||||
|
"handlebars": "^4.7.6",
|
||||||
|
"lodash": "^4.17.20",
|
||||||
|
"lunr": "^2.3.9",
|
||||||
|
"marked": "^1.2.5",
|
||||||
|
"minimatch": "^3.0.0",
|
||||||
|
"progress": "^2.0.3",
|
||||||
|
"shelljs": "^0.8.4",
|
||||||
|
"shiki": "^0.2.7",
|
||||||
|
"typedoc-default-themes": "0.12.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"typedoc-default-themes": {
|
||||||
|
"version": "0.12.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.12.0.tgz",
|
||||||
|
"integrity": "sha512-0hHBxwmfxE0rkIslOiO39fJyYwaScQEhUIxcpqx3uS1BL3zhFW5oQfUaPx2cv2XLL/GXhYFxhdFLoVmNptbxEQ==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"typescript": {
|
"typescript": {
|
||||||
"version": "4.1.3",
|
"version": "4.1.3",
|
||||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.3.tgz",
|
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.3.tgz",
|
||||||
"integrity": "sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg==",
|
"integrity": "sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"uglify-js": {
|
||||||
|
"version": "3.12.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.12.4.tgz",
|
||||||
|
"integrity": "sha512-L5i5jg/SHkEqzN18gQMTWsZk3KelRsfD1wUVNqtq0kzqWQqcJjyL8yc1o8hJgRrWqrAl2mUFbhfznEIoi7zi2A==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"universalify": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz",
|
||||||
|
"integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"uri-js": {
|
"uri-js": {
|
||||||
"version": "4.4.0",
|
"version": "4.4.0",
|
||||||
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz",
|
||||||
@@ -6450,6 +6957,12 @@
|
|||||||
"spdx-expression-parse": "^3.0.0"
|
"spdx-expression-parse": "^3.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"vscode-textmate": {
|
||||||
|
"version": "5.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz",
|
||||||
|
"integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"which": {
|
"which": {
|
||||||
"version": "2.0.2",
|
"version": "2.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
|
||||||
@@ -6471,6 +6984,12 @@
|
|||||||
"integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
|
"integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"wordwrap": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
|
||||||
|
"integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"wrap-ansi": {
|
"wrap-ansi": {
|
||||||
"version": "6.2.0",
|
"version": "6.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
|
||||||
@@ -6514,6 +7033,12 @@
|
|||||||
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
|
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"yallist": {
|
||||||
|
"version": "3.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
|
||||||
|
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"yaml": {
|
"yaml": {
|
||||||
"version": "1.10.0",
|
"version": "1.10.0",
|
||||||
"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz",
|
"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz",
|
||||||
|
|||||||
+6
-2
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "nestjs-telegraf",
|
"name": "nestjs-telegraf",
|
||||||
"version": "1.3.1",
|
"version": "2.0.0",
|
||||||
"description": "Telegraf module for NestJS",
|
"description": "Telegraf module for NestJS",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"nest",
|
"nest",
|
||||||
@@ -29,7 +29,8 @@
|
|||||||
"precommit": "lint-staged",
|
"precommit": "lint-staged",
|
||||||
"prepublish:npm": "npm run build",
|
"prepublish:npm": "npm run build",
|
||||||
"publish:npm": "npm publish --access public",
|
"publish:npm": "npm publish --access public",
|
||||||
"test": ""
|
"test": "",
|
||||||
|
"typedoc:build": "typedoc --tsconfig ./tsconfig.typedoc.json"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"telegraf": "3.38.0"
|
"telegraf": "3.38.0"
|
||||||
@@ -37,6 +38,7 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@nestjs/common": "7.6.5",
|
"@nestjs/common": "7.6.5",
|
||||||
"@nestjs/core": "7.6.5",
|
"@nestjs/core": "7.6.5",
|
||||||
|
"@types/lodash": "4.14.167",
|
||||||
"@typescript-eslint/eslint-plugin": "4.11.1",
|
"@typescript-eslint/eslint-plugin": "4.11.1",
|
||||||
"@typescript-eslint/parser": "4.11.1",
|
"@typescript-eslint/parser": "4.11.1",
|
||||||
"eslint": "7.17.0",
|
"eslint": "7.17.0",
|
||||||
@@ -44,9 +46,11 @@
|
|||||||
"eslint-plugin-import": "2.22.1",
|
"eslint-plugin-import": "2.22.1",
|
||||||
"husky": "4.3.6",
|
"husky": "4.3.6",
|
||||||
"lint-staged": "10.5.3",
|
"lint-staged": "10.5.3",
|
||||||
|
"lodash": "4.17.20",
|
||||||
"prettier": "2.2.1",
|
"prettier": "2.2.1",
|
||||||
"reflect-metadata": "0.1.13",
|
"reflect-metadata": "0.1.13",
|
||||||
"rxjs": "6.6.3",
|
"rxjs": "6.6.3",
|
||||||
|
"typedoc": "0.20.9",
|
||||||
"typescript": "4.1.3"
|
"typescript": "4.1.3"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
export const HELLO_SCENE_ID = 'HELLO_SCENE_ID';
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
import { Module } from '@nestjs/common';
|
||||||
|
import { TelegrafModule } from '../lib';
|
||||||
|
import { EchoService } from './echo.service';
|
||||||
|
import { AppUpdate } from './app.update';
|
||||||
|
import { HelloScene } from './scenes/hello.scene';
|
||||||
|
import { sessionMiddleware } from './middleware/session.middleware';
|
||||||
|
|
||||||
|
@Module({
|
||||||
|
imports: [
|
||||||
|
TelegrafModule.forRoot({
|
||||||
|
token: '1467731595:AAHCvH65H9VQYKF9jE-E8c2rXsQBVAYseg8', // Don't steal >:(
|
||||||
|
middlewares: [sessionMiddleware],
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
providers: [EchoService, AppUpdate, HelloScene],
|
||||||
|
})
|
||||||
|
export class AppModule {}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
import { Telegraf } from 'telegraf';
|
||||||
|
import { Command, Help, InjectBot, On, Start, Update } from '../lib';
|
||||||
|
import { EchoService } from './echo.service';
|
||||||
|
import { HELLO_SCENE_ID } from './app.constants';
|
||||||
|
import { Context } from './interfaces/context.interface';
|
||||||
|
|
||||||
|
@Update()
|
||||||
|
export class AppUpdate {
|
||||||
|
constructor(
|
||||||
|
@InjectBot()
|
||||||
|
private readonly bot: Telegraf<any>, // TODO: fix any
|
||||||
|
private readonly echoService: EchoService,
|
||||||
|
) {}
|
||||||
|
|
||||||
|
@Start()
|
||||||
|
async onStart(ctx: Context): Promise<void> {
|
||||||
|
const me = await this.bot.telegram.getMe();
|
||||||
|
await ctx.reply(`Hey, I'm ${me.first_name}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Help()
|
||||||
|
async onHelp(ctx: Context): Promise<void> {
|
||||||
|
await ctx.reply('Send me any text');
|
||||||
|
}
|
||||||
|
|
||||||
|
@Command('scene')
|
||||||
|
async onSceneCommand(ctx: Context): Promise<void> {
|
||||||
|
await ctx.scene.enter(HELLO_SCENE_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
@On('message')
|
||||||
|
async onMessage(ctx: Context): Promise<void> {
|
||||||
|
console.log('New message received');
|
||||||
|
|
||||||
|
if ('text' in ctx.message) {
|
||||||
|
const messageText = ctx.message.text;
|
||||||
|
const echoText = this.echoService.echo(messageText);
|
||||||
|
await ctx.reply(echoText);
|
||||||
|
} else {
|
||||||
|
await ctx.reply('Only text messages');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
import { Injectable } from '@nestjs/common';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class EchoService {
|
||||||
|
echo(text: string): string {
|
||||||
|
return `Echo: ${text}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
import { SceneContextMessageUpdate } from 'telegraf/typings/stage';
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-empty-interface
|
||||||
|
export interface Context extends SceneContextMessageUpdate {}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
import { NestFactory } from '@nestjs/core';
|
||||||
|
import { AppModule } from './app.module';
|
||||||
|
|
||||||
|
async function bootstrap() {
|
||||||
|
await NestFactory.createApplicationContext(AppModule);
|
||||||
|
}
|
||||||
|
bootstrap();
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
import { session } from 'telegraf';
|
||||||
|
|
||||||
|
export const sessionMiddleware = session();
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
import { HELLO_SCENE_ID } from '../app.constants';
|
||||||
|
import { Context } from '../interfaces/context.interface';
|
||||||
|
import { Scene, SceneEnter, SceneLeave, Command } from '../../lib';
|
||||||
|
|
||||||
|
@Scene(HELLO_SCENE_ID)
|
||||||
|
export class HelloScene {
|
||||||
|
@SceneEnter()
|
||||||
|
async onSceneEnter(ctx: Context): Promise<void> {
|
||||||
|
console.log('Enter to scene');
|
||||||
|
await ctx.reply('Welcome on scene ✋');
|
||||||
|
}
|
||||||
|
|
||||||
|
@SceneLeave()
|
||||||
|
async onSceneLeave(ctx: Context): Promise<void> {
|
||||||
|
console.log('Leave from scene');
|
||||||
|
await ctx.reply('Bye Bye 👋');
|
||||||
|
}
|
||||||
|
|
||||||
|
@Command('hello')
|
||||||
|
async onHelloCommand(ctx: Context): Promise<void> {
|
||||||
|
console.log('Use say hello');
|
||||||
|
await ctx.reply('Hi');
|
||||||
|
}
|
||||||
|
|
||||||
|
@Command('leave')
|
||||||
|
async onLeaveCommand(ctx: Context): Promise<void> {
|
||||||
|
await ctx.scene.leave();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"extends": "./tsconfig.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"rootDir": "./"
|
||||||
|
},
|
||||||
|
"typedocOptions": {
|
||||||
|
"entryPoints": ["./index.ts", "./lib"],
|
||||||
|
"out": "docs"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,10 +8,10 @@ slug: /bot-injection
|
|||||||
At times you may need to access the native `Telegraf` instance. For example, you may want to connect stage middleware. You can inject the Telegraf by using the `@InjectBot()` decorator as follows:
|
At times you may need to access the native `Telegraf` instance. For example, you may want to connect stage middleware. You can inject the Telegraf by using the `@InjectBot()` decorator as follows:
|
||||||
```typescript
|
```typescript
|
||||||
import { Injectable } from '@nestjs/common';
|
import { Injectable } from '@nestjs/common';
|
||||||
import { InjectBot, TelegrafProvider } from 'nestjs-telegraf';
|
import { InjectBot, TelegrafProvider, Context } from 'nestjs-telegraf';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class BotSettingsService {
|
export class BotSettingsService {
|
||||||
constructor(@InjectBot() private bot: TelegrafProvider) {}
|
constructor(@InjectBot() private bot: TelegrafProvider<Context>) {}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
---
|
||||||
|
id: error-handling
|
||||||
|
title: Error handling
|
||||||
|
sidebar_label: Error handling
|
||||||
|
slug: /error-handling
|
||||||
|
---
|
||||||
|
|
||||||
|
By default, `nestjs-telegraf` catches all errors using the `Logger` built into NestJS.
|
||||||
|
|
||||||
|
Use can disable global errors catch with `disableGlobalCatch`:
|
||||||
|
```typescript
|
||||||
|
TelegrafModule.forRoot({
|
||||||
|
disableGlobalCatch: true,
|
||||||
|
}),
|
||||||
|
```
|
||||||
|
|
||||||
|
After that you can override errors handling with bot instance `catch` function.
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { Injectable } from '@nestjs/common';
|
||||||
|
import { InjectBot, TelegrafProvider, Context } from 'nestjs-telegraf';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class BotSettingsService {
|
||||||
|
constructor(@InjectBot() private bot: TelegrafProvider<Context>) {
|
||||||
|
this.bot.catch((err, ctx) => {
|
||||||
|
console.log(`Ooops, encountered an error for ${ctx.updateType}`, err);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
@@ -11,23 +11,26 @@ By default, the bot receives updates using long-polling and requires no addition
|
|||||||
|
|
||||||
## Webhooks
|
## Webhooks
|
||||||
|
|
||||||
If you want to configure a telegram bot webhook, you need to get a middleware from `TelegrafProvider` for connect it in your `main.ts` file.
|
If you want to configure a telegram bot webhook, you need to get a middleware via `getBotToken` helper in your `main.ts` file.
|
||||||
|
|
||||||
To access it, you must use the `app.get()` method, followed by the provider reference:
|
To access it, you must use the `app.get()` method, followed by the provider reference:
|
||||||
```typescript
|
```typescript
|
||||||
const telegrafProvider = app.get('TelegrafProvider');
|
import { getBotToken } from 'nestjs-telegraf';
|
||||||
|
|
||||||
|
// ...
|
||||||
|
const bot = app.get(getBotToken());
|
||||||
```
|
```
|
||||||
|
|
||||||
Now you can connect middleware:
|
Now you can connect middleware:
|
||||||
```typescript
|
```typescript
|
||||||
app.use(telegrafProvider.webhookCallback('/secret-path'));
|
app.use(bot.webhookCallback('/secret-path'));
|
||||||
```
|
```
|
||||||
|
|
||||||
The last step is to specify launchOptions in `forRoot` method:
|
The last step is to specify launchOptions in `forRoot` method:
|
||||||
```typescript
|
```typescript
|
||||||
TelegrafModule.forRootAsync({
|
TelegrafModule.forRootAsync({
|
||||||
imports: [ConfigModule.forFeature(telegrafModuleConfig)],
|
imports: [ConfigModule],
|
||||||
useFactory: async (configService: ConfigService) => ({
|
useFactory: (configService: ConfigService) => ({
|
||||||
token: configService.get<string>('TELEGRAM_BOT_TOKEN'),
|
token: configService.get<string>('TELEGRAM_BOT_TOKEN'),
|
||||||
launchOptions: {
|
launchOptions: {
|
||||||
webhook: {
|
webhook: {
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
---
|
||||||
|
id: middlewares
|
||||||
|
title: Middlewares
|
||||||
|
sidebar_label: Middlewares
|
||||||
|
slug: /middlewares
|
||||||
|
---
|
||||||
|
|
||||||
|
`nestjs-telegraf` has support of the Telegraf middleware packages. To use an existing middleware package, simply import it and add it to the middlewares array:
|
||||||
|
```typescript
|
||||||
|
TelegrafModule.forRoot({
|
||||||
|
middlewares: [session()],
|
||||||
|
}),
|
||||||
|
```
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
---
|
||||||
|
id: multiple-bots
|
||||||
|
title: Multiple bots
|
||||||
|
sidebar_label: Multiple bots
|
||||||
|
slug: /multiple-bots
|
||||||
|
---
|
||||||
|
|
||||||
|
In some cases, you may need to run multiple bots at the same time. This can also be achieved with this module. To work with multiple bots, first create the bots. In this case, bot naming becomes mandatory.
|
||||||
|
```typescript
|
||||||
|
import { Module } from '@nestjs/common';
|
||||||
|
import { ConfigModule } from '@nestjs/config';
|
||||||
|
import { TelegrafModule } from 'nestjs-telegraf';
|
||||||
|
|
||||||
|
@Module({
|
||||||
|
imports: [
|
||||||
|
ConfigModule.forRoot(),
|
||||||
|
TelegrafModule.forRootAsync({
|
||||||
|
imports: [ConfigModule],
|
||||||
|
botName: 'cat',
|
||||||
|
useFactory: (configService: ConfigService) => ({
|
||||||
|
token: configService.get<string>('CAT_BOT_TOKEN'),
|
||||||
|
}),
|
||||||
|
inject: [ConfigService],
|
||||||
|
}),
|
||||||
|
TelegrafModule.forRootAsync({
|
||||||
|
imports: [ConfigModule.forFeature(telegrafModuleConfig)],
|
||||||
|
botName: 'dog',
|
||||||
|
useFactory: async (configService: ConfigService) => ({
|
||||||
|
token: configService.get<string>('DOG_BOT_TOKEN'),
|
||||||
|
}),
|
||||||
|
inject: [ConfigService],
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
})
|
||||||
|
export class AppModule {}
|
||||||
|
```
|
||||||
|
|
||||||
|
:::caution
|
||||||
|
Please note that you shouldn't have multiple bots without a name, or with the same name, otherwise they will get overridden.
|
||||||
|
:::
|
||||||
|
|
||||||
|
You can also inject the `Bot` for a given bot:
|
||||||
|
```typescript
|
||||||
|
import { Injectable } from '@nestjs/common';
|
||||||
|
import { InjectBot, Telegraf, Context } from 'nestjs-telegraf';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class EchoService {
|
||||||
|
constructor(@InjectBot('cat') private catBot: Telegraf<Context>) {}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
To inject a given `Bot` to a custom provider (for example, factory provider), use the `getBotToken()` function passing the name of the bot as an argument.
|
||||||
|
```typescript
|
||||||
|
{
|
||||||
|
provide: CatsService,
|
||||||
|
useFactory: (catBot: Telegraf<Context>) => {
|
||||||
|
return new CatsService(catBot);
|
||||||
|
},
|
||||||
|
inject: [getBotToken('cat')],
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Another useful feature of the `nestjs-telegraf` module is the ability to choose which modules should handle updates for each launched bot. By default, module searches for handlers throughout the whole app. To limit this scan to only a subset of modules, use the include property.
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
TelegrafModule.forRootAsync({
|
||||||
|
imports: [ConfigModule],
|
||||||
|
botName: 'cat',
|
||||||
|
useFactory: (configService: ConfigService) => ({
|
||||||
|
token: configService.get<string>('CAT_BOT_TOKEN'),
|
||||||
|
include: [CatsModule],
|
||||||
|
}),
|
||||||
|
inject: [ConfigService],
|
||||||
|
}),
|
||||||
|
```
|
||||||
@@ -6,6 +6,9 @@ module.exports = {
|
|||||||
'telegraf-methods',
|
'telegraf-methods',
|
||||||
'bot-injection',
|
'bot-injection',
|
||||||
'async-configuration',
|
'async-configuration',
|
||||||
|
'multiple-bots',
|
||||||
|
'middlewares',
|
||||||
|
'error-handling',
|
||||||
],
|
],
|
||||||
Extras: ['extras/standalone-applications'],
|
Extras: ['extras/standalone-applications'],
|
||||||
'API Reference': ['api-reference/decorators'],
|
'API Reference': ['api-reference/decorators'],
|
||||||
|
|||||||
Reference in New Issue
Block a user