diff --git a/.gitignore b/.gitignore index f9a2902..8a8a4fd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,7 @@ +# lock +package-lock.json +yarn.lock + # dependencies /node_modules diff --git a/.npmignore b/.npmignore index 130fdb1..267876c 100644 --- a/.npmignore +++ b/.npmignore @@ -1,6 +1,5 @@ # source lib -index.ts package-lock.json tsconfig.json .prettierrc diff --git a/index.d.ts b/index.d.ts deleted file mode 100644 index 5703fb5..0000000 --- a/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './dist'; diff --git a/index.js b/index.js deleted file mode 100644 index a82ea05..0000000 --- a/index.js +++ /dev/null @@ -1,6 +0,0 @@ -"use strict"; -function __export(m) { - for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; -} -exports.__esModule = true; -__export(require("./dist")); \ No newline at end of file diff --git a/index.ts b/index.ts deleted file mode 100644 index 5703fb5..0000000 --- a/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './dist'; diff --git a/lib/decorators/action.decorator.ts b/lib/decorators/action.decorator.ts deleted file mode 100644 index e54ace0..0000000 --- a/lib/decorators/action.decorator.ts +++ /dev/null @@ -1,19 +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; - -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 }); -}; diff --git a/lib/decorators/cashtag.decorator.ts b/lib/decorators/cashtag.decorator.ts deleted file mode 100644 index b98b2da..0000000 --- a/lib/decorators/cashtag.decorator.ts +++ /dev/null @@ -1,17 +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 }); -}; diff --git a/lib/decorators/command.decorator.ts b/lib/decorators/command.decorator.ts deleted file mode 100644 index 2fb6e7a..0000000 --- a/lib/decorators/command.decorator.ts +++ /dev/null @@ -1,17 +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 }); -}; diff --git a/lib/decorators/core/index.ts b/lib/decorators/core/index.ts new file mode 100644 index 0000000..baddc8e --- /dev/null +++ b/lib/decorators/core/index.ts @@ -0,0 +1,3 @@ +export * from './update.decorator'; +export * from './scene.decorator'; +export * from './inject-bot.decorator'; diff --git a/lib/decorators/core/inject-bot.decorator.ts b/lib/decorators/core/inject-bot.decorator.ts new file mode 100644 index 0000000..d010fbe --- /dev/null +++ b/lib/decorators/core/inject-bot.decorator.ts @@ -0,0 +1,4 @@ +import { Inject } from '@nestjs/common'; +import { Telegraf } from 'telegraf'; + +export const InjectBot = (): ParameterDecorator => Inject(Telegraf); diff --git a/lib/decorators/core/scene.decorator.ts b/lib/decorators/core/scene.decorator.ts new file mode 100644 index 0000000..391c842 --- /dev/null +++ b/lib/decorators/core/scene.decorator.ts @@ -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); diff --git a/lib/decorators/update.decorator.ts b/lib/decorators/core/update.decorator.ts similarity index 53% rename from lib/decorators/update.decorator.ts rename to lib/decorators/core/update.decorator.ts index 1946199..2002fec 100644 --- a/lib/decorators/update.decorator.ts +++ b/lib/decorators/core/update.decorator.ts @@ -1,8 +1,8 @@ import { SetMetadata } from '@nestjs/common'; -import { DECORATORS } from '../telegraf.constants'; +import { UPDATE_METADATA } from '../../telegraf.constants'; /** * `@Update` decorator, it's like NestJS `@Controller` decorator, * but for Telegram Bot API updates. */ -export const Update = (): ClassDecorator => SetMetadata(DECORATORS.UPDATE, {}); +export const Update = (): ClassDecorator => SetMetadata(UPDATE_METADATA, true); diff --git a/lib/decorators/entity.decorator.ts b/lib/decorators/entity.decorator.ts deleted file mode 100644 index 7c16011..0000000 --- a/lib/decorators/entity.decorator.ts +++ /dev/null @@ -1,22 +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 }); -}; diff --git a/lib/decorators/game-query.decorator.ts b/lib/decorators/game-query.decorator.ts deleted file mode 100644 index dd1138c..0000000 --- a/lib/decorators/game-query.decorator.ts +++ /dev/null @@ -1,11 +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, {}); -}; diff --git a/lib/decorators/hashtag.decorator.ts b/lib/decorators/hashtag.decorator.ts deleted file mode 100644 index 9269411..0000000 --- a/lib/decorators/hashtag.decorator.ts +++ /dev/null @@ -1,17 +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 }); -}; diff --git a/lib/decorators/hears.decorator.ts b/lib/decorators/hears.decorator.ts deleted file mode 100644 index 6e62bdd..0000000 --- a/lib/decorators/hears.decorator.ts +++ /dev/null @@ -1,19 +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; - -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 }); -}; diff --git a/lib/decorators/help.decorator.ts b/lib/decorators/help.decorator.ts deleted file mode 100644 index 159a5c5..0000000 --- a/lib/decorators/help.decorator.ts +++ /dev/null @@ -1,11 +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, {}); -}; diff --git a/lib/decorators/index.ts b/lib/decorators/index.ts index 03af4ba..31fa986 100644 --- a/lib/decorators/index.ts +++ b/lib/decorators/index.ts @@ -1,18 +1,3 @@ -export * from './action.decorator'; -export * from './cashtag.decorator'; -export * from './command.decorator'; -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'; +export * from './core'; +export * from './listeners'; +export * from './scene'; diff --git a/lib/decorators/inject-bot.decorator.ts b/lib/decorators/inject-bot.decorator.ts deleted file mode 100644 index 84f1c50..0000000 --- a/lib/decorators/inject-bot.decorator.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { Inject } from '@nestjs/common'; -import { TELEGRAF_PROVIDER } from '../telegraf.constants'; - -export const InjectBot = (): ParameterDecorator => Inject(TELEGRAF_PROVIDER); diff --git a/lib/decorators/inline-query.decorator.ts b/lib/decorators/inline-query.decorator.ts deleted file mode 100644 index 71706de..0000000 --- a/lib/decorators/inline-query.decorator.ts +++ /dev/null @@ -1,28 +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', - }); -}; diff --git a/lib/decorators/listeners/action.decorator.ts b/lib/decorators/listeners/action.decorator.ts new file mode 100644 index 0000000..4b14901 --- /dev/null +++ b/lib/decorators/listeners/action.decorator.ts @@ -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'); diff --git a/lib/decorators/listeners/cashtag.decorator.ts b/lib/decorators/listeners/cashtag.decorator.ts new file mode 100644 index 0000000..c3e37e9 --- /dev/null +++ b/lib/decorators/listeners/cashtag.decorator.ts @@ -0,0 +1,8 @@ +import { createUpdateListenerDecorator } from '../../helpers'; + +/** + * Cashtag handling. + * + * @see https://telegraf.js.org/#/?id=cashtag + */ +export const Cashtag = createUpdateListenerDecorator('cashtag'); diff --git a/lib/decorators/listeners/command.decorator.ts b/lib/decorators/listeners/command.decorator.ts new file mode 100644 index 0000000..0e7806e --- /dev/null +++ b/lib/decorators/listeners/command.decorator.ts @@ -0,0 +1,8 @@ +import { createUpdateListenerDecorator } from '../../helpers'; + +/** + * Command handling. + * + * @see https://telegraf.js.org/#/?id=command + */ +export const Command = createUpdateListenerDecorator('command'); diff --git a/lib/decorators/listeners/email.decorator.ts b/lib/decorators/listeners/email.decorator.ts new file mode 100644 index 0000000..e9bb1a6 --- /dev/null +++ b/lib/decorators/listeners/email.decorator.ts @@ -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'); diff --git a/lib/decorators/listeners/game-query.decorator.ts b/lib/decorators/listeners/game-query.decorator.ts new file mode 100644 index 0000000..347f998 --- /dev/null +++ b/lib/decorators/listeners/game-query.decorator.ts @@ -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'); diff --git a/lib/decorators/listeners/hashtag.decorator.ts b/lib/decorators/listeners/hashtag.decorator.ts new file mode 100644 index 0000000..86e9e13 --- /dev/null +++ b/lib/decorators/listeners/hashtag.decorator.ts @@ -0,0 +1,8 @@ +import { createUpdateListenerDecorator } from '../../helpers'; + +/** + * Hashtag handling. + * + * @see https://telegraf.js.org/#/?id=hashtag + */ +export const Hashtag = createUpdateListenerDecorator('hashtag'); diff --git a/lib/decorators/listeners/hears.decorator.ts b/lib/decorators/listeners/hears.decorator.ts new file mode 100644 index 0000000..79d71af --- /dev/null +++ b/lib/decorators/listeners/hears.decorator.ts @@ -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'); diff --git a/lib/decorators/listeners/help.decorator.ts b/lib/decorators/listeners/help.decorator.ts new file mode 100644 index 0000000..36ac9e4 --- /dev/null +++ b/lib/decorators/listeners/help.decorator.ts @@ -0,0 +1,8 @@ +import { createUpdateListenerDecorator } from '../../helpers'; + +/** + * Handler for /help command. + * + * @see https://telegraf.js.org/#/?id=help + */ +export const Help = createUpdateListenerDecorator('help'); diff --git a/lib/decorators/listeners/index.ts b/lib/decorators/listeners/index.ts new file mode 100644 index 0000000..a332f5a --- /dev/null +++ b/lib/decorators/listeners/index.ts @@ -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'; diff --git a/lib/decorators/listeners/inline-query.decorator.ts b/lib/decorators/listeners/inline-query.decorator.ts new file mode 100644 index 0000000..722a348 --- /dev/null +++ b/lib/decorators/listeners/inline-query.decorator.ts @@ -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'); diff --git a/lib/decorators/listeners/mention.decorator.ts b/lib/decorators/listeners/mention.decorator.ts new file mode 100644 index 0000000..e4341a0 --- /dev/null +++ b/lib/decorators/listeners/mention.decorator.ts @@ -0,0 +1,8 @@ +import { createUpdateListenerDecorator } from '../../helpers'; + +/** + * Mention handling. + * + * @see https://telegraf.js.org/#/?id=mention + */ +export const Mention = createUpdateListenerDecorator('mention'); diff --git a/lib/decorators/listeners/on.decorator.ts b/lib/decorators/listeners/on.decorator.ts new file mode 100644 index 0000000..9f3c0fd --- /dev/null +++ b/lib/decorators/listeners/on.decorator.ts @@ -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'); diff --git a/lib/decorators/listeners/phone.decorator.ts b/lib/decorators/listeners/phone.decorator.ts new file mode 100644 index 0000000..0f68380 --- /dev/null +++ b/lib/decorators/listeners/phone.decorator.ts @@ -0,0 +1,8 @@ +import { createUpdateListenerDecorator } from '../../helpers'; + +/** + * Phone number handling. + * + * @see https://telegraf.js.org/#/?id=phone + */ +export const Phone = createUpdateListenerDecorator('phone'); diff --git a/lib/decorators/listeners/settings.decorator.ts b/lib/decorators/listeners/settings.decorator.ts new file mode 100644 index 0000000..6cca7c7 --- /dev/null +++ b/lib/decorators/listeners/settings.decorator.ts @@ -0,0 +1,8 @@ +import { createUpdateListenerDecorator } from '../../helpers'; + +/** + * Handler for /settings command. + * + * @see https://telegraf.js.org/#/?id=settings + */ +export const Settings = createUpdateListenerDecorator('settings'); diff --git a/lib/decorators/listeners/start.decorator.ts b/lib/decorators/listeners/start.decorator.ts new file mode 100644 index 0000000..48bdc5b --- /dev/null +++ b/lib/decorators/listeners/start.decorator.ts @@ -0,0 +1,8 @@ +import { createUpdateListenerDecorator } from '../../helpers'; + +/** + * Handler for /start command. + * + * @see https://telegraf.js.org/#/?id=start + */ +export const Start = createUpdateListenerDecorator('start'); diff --git a/lib/decorators/listeners/text-link.decorator.ts b/lib/decorators/listeners/text-link.decorator.ts new file mode 100644 index 0000000..c62439a --- /dev/null +++ b/lib/decorators/listeners/text-link.decorator.ts @@ -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'); diff --git a/lib/decorators/listeners/text-mention.decorator.ts b/lib/decorators/listeners/text-mention.decorator.ts new file mode 100644 index 0000000..895a458 --- /dev/null +++ b/lib/decorators/listeners/text-mention.decorator.ts @@ -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'); diff --git a/lib/decorators/listeners/url.decorator.ts b/lib/decorators/listeners/url.decorator.ts new file mode 100644 index 0000000..843aa41 --- /dev/null +++ b/lib/decorators/listeners/url.decorator.ts @@ -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'); diff --git a/lib/decorators/listeners/use.decorator.ts b/lib/decorators/listeners/use.decorator.ts new file mode 100644 index 0000000..ba83af5 --- /dev/null +++ b/lib/decorators/listeners/use.decorator.ts @@ -0,0 +1,8 @@ +import { createUpdateListenerDecorator } from '../../helpers'; + +/** + * Registers a middleware. + * + * @see https://telegraf.js.org/#/?id=use + */ +export const Use = createUpdateListenerDecorator('use'); diff --git a/lib/decorators/mention.decorator.ts b/lib/decorators/mention.decorator.ts deleted file mode 100644 index 004f41b..0000000 --- a/lib/decorators/mention.decorator.ts +++ /dev/null @@ -1,17 +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 }); -}; diff --git a/lib/decorators/on.decorator.ts b/lib/decorators/on.decorator.ts deleted file mode 100644 index 9e3752a..0000000 --- a/lib/decorators/on.decorator.ts +++ /dev/null @@ -1,22 +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 }); -}; diff --git a/lib/decorators/phone.decorator.ts b/lib/decorators/phone.decorator.ts deleted file mode 100644 index 39a0b27..0000000 --- a/lib/decorators/phone.decorator.ts +++ /dev/null @@ -1,17 +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 }); -}; diff --git a/lib/decorators/scene/index.ts b/lib/decorators/scene/index.ts new file mode 100644 index 0000000..b1d61b2 --- /dev/null +++ b/lib/decorators/scene/index.ts @@ -0,0 +1,2 @@ +export * from './scene-enter.decorator'; +export * from './scene-leave.decorator'; diff --git a/lib/decorators/scene/scene-enter.decorator.ts b/lib/decorators/scene/scene-enter.decorator.ts new file mode 100644 index 0000000..914b2d7 --- /dev/null +++ b/lib/decorators/scene/scene-enter.decorator.ts @@ -0,0 +1,3 @@ +import { createSceneListenerDecorator } from '../../helpers'; + +export const SceneEnter = createSceneListenerDecorator('enter'); diff --git a/lib/decorators/scene/scene-leave.decorator.ts b/lib/decorators/scene/scene-leave.decorator.ts new file mode 100644 index 0000000..19b970e --- /dev/null +++ b/lib/decorators/scene/scene-leave.decorator.ts @@ -0,0 +1,3 @@ +import { createSceneListenerDecorator } from '../../helpers'; + +export const SceneLeave = createSceneListenerDecorator('leave'); diff --git a/lib/decorators/settings.decorator.ts b/lib/decorators/settings.decorator.ts deleted file mode 100644 index 9378e7f..0000000 --- a/lib/decorators/settings.decorator.ts +++ /dev/null @@ -1,11 +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, {}); -}; diff --git a/lib/decorators/start.decorator.ts b/lib/decorators/start.decorator.ts deleted file mode 100644 index 9429753..0000000 --- a/lib/decorators/start.decorator.ts +++ /dev/null @@ -1,11 +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, {}); -}; diff --git a/lib/decorators/update-hooks.decorators.ts b/lib/decorators/update-hooks.decorators.ts deleted file mode 100644 index 75621d8..0000000 --- a/lib/decorators/update-hooks.decorators.ts +++ /dev/null @@ -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. diff --git a/lib/decorators/use.decorator.ts b/lib/decorators/use.decorator.ts deleted file mode 100644 index a7f68fa..0000000 --- a/lib/decorators/use.decorator.ts +++ /dev/null @@ -1,11 +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, {}); -}; diff --git a/lib/explorers/telegraf-scene.explorer.ts b/lib/explorers/telegraf-scene.explorer.ts new file mode 100644 index 0000000..2ab2c49 --- /dev/null +++ b/lib/explorers/telegraf-scene.explorer.ts @@ -0,0 +1,73 @@ +import { Inject, Injectable, OnModuleInit } from '@nestjs/common'; +import { DiscoveryService } 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 { TelegrafMetadataAccessor } from '../telegraf.metadata-accessor'; + +@Injectable() +export class TelegrafSceneExplorer implements OnModuleInit { + private readonly stage = new Stage([]); + + constructor( + @Inject(Telegraf) + private readonly telegraf: Telegraf, + private readonly discoveryService: DiscoveryService, + private readonly metadataAccessor: TelegrafMetadataAccessor, + private readonly metadataScanner: MetadataScanner, + ) { + this.telegraf.use(this.stage.middleware()); + } + + onModuleInit(): void { + this.explore(); + } + + private explore(): void { + const sceneClasses = this.filterSceneClasses(); + + sceneClasses.forEach((wrapper) => { + const { instance } = wrapper; + + const sceneId = this.metadataAccessor.getSceneMetadata( + instance.constructor, + ); + const scene = new Scene(sceneId); + this.stage.register(scene); + + const prototype = Object.getPrototypeOf(instance); + this.metadataScanner.scanFromPrototype( + instance, + prototype, + (methodKey: string) => + this.registerIfListener(scene, instance, methodKey), + ); + }); + } + + private filterSceneClasses(): InstanceWrapper[] { + return this.discoveryService + .getProviders() + .filter((wrapper) => wrapper.instance) + .filter((wrapper) => + this.metadataAccessor.isScene(wrapper.instance.constructor), + ); + } + + private registerIfListener( + scene: Scene, + instance: Record, + methodKey: string, + ): void { + const methodRef = instance[methodKey]; + const middlewareFn = methodRef.bind(instance); + + const listenerMetadata = this.metadataAccessor.getListenerMetadata( + methodRef, + ); + if (!listenerMetadata) return; + + const { method, args } = listenerMetadata; + (scene[method] as any)(...args, middlewareFn); + } +} diff --git a/lib/explorers/telegraf-update.explorer.ts b/lib/explorers/telegraf-update.explorer.ts new file mode 100644 index 0000000..a848806 --- /dev/null +++ b/lib/explorers/telegraf-update.explorer.ts @@ -0,0 +1,63 @@ +import { Inject, Injectable, OnModuleInit } from '@nestjs/common'; +import { DiscoveryService } from '@nestjs/core'; +import { MetadataScanner } from '@nestjs/core/metadata-scanner'; +import { InstanceWrapper } from '@nestjs/core/injector/instance-wrapper'; +import { Telegraf } from 'telegraf'; +import { TelegrafMetadataAccessor } from '../telegraf.metadata-accessor'; + +@Injectable() +export class TelegrafUpdateExplorer implements OnModuleInit { + constructor( + @Inject(Telegraf) + private readonly telegraf: Telegraf, + private readonly discoveryService: DiscoveryService, + private readonly metadataAccessor: TelegrafMetadataAccessor, + private readonly metadataScanner: MetadataScanner, + ) {} + + onModuleInit(): void { + this.explore(); + } + + private explore(): void { + const updateClasses = this.filterUpdateClasses(); + + updateClasses.forEach((wrapper) => { + const { instance } = wrapper; + + const prototype = Object.getPrototypeOf(instance); + this.metadataScanner.scanFromPrototype( + instance, + prototype, + (methodKey: string) => this.registerIfListener(instance, methodKey), + ); + }); + } + + private filterUpdateClasses(): InstanceWrapper[] { + return this.discoveryService + .getProviders() + .filter((wrapper) => wrapper.instance) + .filter((wrapper) => + this.metadataAccessor.isUpdate(wrapper.instance.constructor), + ); + } + + private registerIfListener( + instance: Record, + methodKey: string, + ): void { + const methodRef = instance[methodKey]; + const middlewareFn = methodRef.bind(instance); + + const listenerMetadata = this.metadataAccessor.getListenerMetadata( + methodRef, + ); + if (!listenerMetadata) return; + + const { method, args } = listenerMetadata; + // NOTE: Use "any" to disable "Expected at least 1 arguments, but got 1 or more." error. + // Use telegraf instance for non-scene listeners + (this.telegraf[method] as any)(...args, middlewareFn); + } +} diff --git a/lib/helpers/create-scene-listener-decorator.helper.ts b/lib/helpers/create-scene-listener-decorator.helper.ts new file mode 100644 index 0000000..c997ffc --- /dev/null +++ b/lib/helpers/create-scene-listener-decorator.helper.ts @@ -0,0 +1,18 @@ +import { SetMetadata } from '@nestjs/common'; +import { BaseScene as Scene } from 'telegraf'; +import { ComposerMethodArgs, SceneMethods } from '../telegraf.types'; +import { UPDATE_LISTENER_METADATA } from '../telegraf.constants'; +import { ListenerMetadata } from '../interfaces'; + +export function createSceneListenerDecorator( + method: Method, +) { + return ( + ...args: ComposerMethodArgs, Method> + ): MethodDecorator => { + return SetMetadata(UPDATE_LISTENER_METADATA, { + method, + args, + } as ListenerMetadata); + }; +} diff --git a/lib/helpers/create-update-listener-decorator.helper.ts b/lib/helpers/create-update-listener-decorator.helper.ts new file mode 100644 index 0000000..6c28eb2 --- /dev/null +++ b/lib/helpers/create-update-listener-decorator.helper.ts @@ -0,0 +1,18 @@ +import { SetMetadata } from '@nestjs/common'; +import { Composer } from 'telegraf'; +import { ComposerMethodArgs, UpdateMethods } from '../telegraf.types'; +import { UPDATE_LISTENER_METADATA } from '../telegraf.constants'; +import { ListenerMetadata } from '../interfaces'; + +export function createUpdateListenerDecorator( + method: Method, +) { + return ( + ...args: ComposerMethodArgs, Method> + ): MethodDecorator => { + return SetMetadata(UPDATE_LISTENER_METADATA, { + method, + args, + } as ListenerMetadata); + }; +} diff --git a/lib/helpers/index.ts b/lib/helpers/index.ts new file mode 100644 index 0000000..20b6077 --- /dev/null +++ b/lib/helpers/index.ts @@ -0,0 +1,2 @@ +export * from './create-update-listener-decorator.helper'; +export * from './create-scene-listener-decorator.helper'; diff --git a/lib/index.ts b/lib/index.ts index 39b657d..da17d36 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -1,12 +1,5 @@ -export * as Composer from 'telegraf/composer'; -export * as Markup from 'telegraf/markup'; -export * as BaseScene from 'telegraf/scenes/base'; -export * as session from 'telegraf/session'; -export * as Stage from 'telegraf/stage'; -export * as WizardScene from 'telegraf/scenes/wizard'; -export * as Extra from 'telegraf/extra'; - export * from './decorators'; export * from './interfaces'; +export * from './helpers'; export * from './telegraf.module'; -export * from './telegraf.provider'; +export * from './telegraf.types'; diff --git a/lib/interfaces/context.interface.ts b/lib/interfaces/context.interface.ts deleted file mode 100644 index d670e24..0000000 --- a/lib/interfaces/context.interface.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { Context as TelegrafContext } from 'telegraf'; - -export interface Context extends TelegrafContext {} diff --git a/lib/interfaces/index.ts b/lib/interfaces/index.ts index 3b25926..ef12fd5 100644 --- a/lib/interfaces/index.ts +++ b/lib/interfaces/index.ts @@ -1,2 +1,2 @@ -export * from './context.interface'; export * from './telegraf-options.interface'; +export * from './listener-metadata.interface'; diff --git a/lib/interfaces/listener-metadata.interface.ts b/lib/interfaces/listener-metadata.interface.ts new file mode 100644 index 0000000..9dc4925 --- /dev/null +++ b/lib/interfaces/listener-metadata.interface.ts @@ -0,0 +1,4 @@ +export interface ListenerMetadata { + method: string; + args: unknown[]; +} diff --git a/lib/interfaces/telegraf-options.interface.ts b/lib/interfaces/telegraf-options.interface.ts index 13c729d..09ffb2c 100644 --- a/lib/interfaces/telegraf-options.interface.ts +++ b/lib/interfaces/telegraf-options.interface.ts @@ -1,17 +1,19 @@ import { ModuleMetadata, Type } from '@nestjs/common/interfaces'; +import { Middleware, Context } from 'telegraf'; import { - TelegrafOptions, LaunchPollingOptions, LaunchWebhookOptions, + TelegrafOptions, } from 'telegraf/typings/telegraf'; -export interface TelegrafModuleOptions { +export interface TelegrafModuleOptions { token: string; options?: TelegrafOptions; launchOptions?: { polling?: LaunchPollingOptions; webhook?: LaunchWebhookOptions; }; + middlewares?: Middleware[]; } export interface TelegrafOptionsFactory { diff --git a/lib/telegraf-core.module.ts b/lib/telegraf-core.module.ts deleted file mode 100644 index 9be69ed..0000000 --- a/lib/telegraf-core.module.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { DiscoveryModule } from '@nestjs/core'; -import { Module, DynamicModule, Provider, Type } from '@nestjs/common'; -import { - TelegrafModuleOptions, - TelegrafModuleAsyncOptions, - TelegrafOptionsFactory, -} from './interfaces'; -import { - TELEGRAF_MODULE_OPTIONS, - TELEGRAF_PROVIDER, -} from './telegraf.constants'; -import { TelegrafMetadataAccessor } from './telegraf-metadata.accessor'; -import { TelegrafExplorer } from './telegraf.explorer'; -import { TelegrafProvider } from './telegraf.provider'; - -@Module({ - imports: [DiscoveryModule], - providers: [TelegrafMetadataAccessor, TelegrafExplorer], -}) -export class TelegrafCoreModule { - public static forRoot(options: TelegrafModuleOptions): DynamicModule { - const telegrafProvider = { - provide: TELEGRAF_PROVIDER, - useClass: TelegrafProvider, - inject: [TELEGRAF_MODULE_OPTIONS], - }; - return { - module: TelegrafCoreModule, - providers: [ - { provide: TELEGRAF_MODULE_OPTIONS, useValue: options }, - telegrafProvider, - ], - exports: [telegrafProvider], - }; - } - - public static forRootAsync( - options: TelegrafModuleAsyncOptions, - ): DynamicModule { - const telegrafProvider = { - provide: TELEGRAF_PROVIDER, - useClass: TelegrafProvider, - inject: [TELEGRAF_MODULE_OPTIONS], - }; - const asyncProviders = this.createAsyncProviders(options); - return { - module: TelegrafCoreModule, - imports: options.imports, - providers: [...asyncProviders, telegrafProvider], - exports: [telegrafProvider], - }; - } - - private static createAsyncProviders( - options: TelegrafModuleAsyncOptions, - ): Provider[] { - if (options.useExisting || options.useFactory) { - return [this.createAsyncOptionsProvider(options)]; - } - const useClass = options.useClass as Type; - return [ - this.createAsyncOptionsProvider(options), - { - provide: useClass, - useClass, - }, - ]; - } - - private static createAsyncOptionsProvider( - options: TelegrafModuleAsyncOptions, - ): Provider { - if (options.useFactory) { - return { - provide: TELEGRAF_MODULE_OPTIONS, - useFactory: options.useFactory, - inject: options.inject || [], - }; - } - // `as Type` is a workaround for microsoft/TypeScript#31603 - const inject = [ - (options.useClass || options.useExisting) as Type, - ]; - return { - provide: TELEGRAF_MODULE_OPTIONS, - useFactory: async (optionsFactory: TelegrafOptionsFactory) => - await optionsFactory.createTelegrafOptions(), - inject, - }; - } -} diff --git a/lib/telegraf-metadata.accessor.ts b/lib/telegraf-metadata.accessor.ts deleted file mode 100644 index b204d60..0000000 --- a/lib/telegraf-metadata.accessor.ts +++ /dev/null @@ -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 | Function): boolean { - if (!target) { - return false; - } - return !!this.reflector.get(DECORATORS.UPDATE, target); - } - - isUpdateHook(target: Type | Function): boolean { - if (!target) { - return false; - } - return !!this.reflector.get(DECORATORS.UPDATE_HOOK, target); - } - - getUpdateHookMetadata( - target: Type | Function, - ): UpdateHookOptions | undefined { - return this.reflector.get(DECORATORS.UPDATE_HOOK, target); - } - - isTelegrafUse(target: Type | Function): boolean { - if (!target) { - return false; - } - return !!this.reflector.get(DECORATORS.USE, target); - } - - isTelegrafOn(target: Type | Function): boolean { - if (!target) { - return false; - } - return !!this.reflector.get(DECORATORS.ON, target); - } - - getTelegrafOnMetadata(target: Type | Function): OnOptions | undefined { - return this.reflector.get(DECORATORS.ON, target); - } - - isTelegrafHears(target: Type | Function): boolean { - if (!target) { - return false; - } - return !!this.reflector.get(DECORATORS.HEARS, target); - } - - getTelegrafHearsMetadata( - target: Type | Function, - ): HearsOptions | undefined { - return this.reflector.get(DECORATORS.HEARS, target); - } - - isTelegrafCommand(target: Type | Function): boolean { - if (!target) { - return false; - } - return !!this.reflector.get(DECORATORS.COMMAND, target); - } - - getTelegrafCommandMetadata( - target: Type | Function, - ): CommandOptions | undefined { - return this.reflector.get(DECORATORS.COMMAND, target); - } - - isTelegrafStart(target: Type | Function): boolean { - if (!target) { - return false; - } - return !!this.reflector.get(DECORATORS.START, target); - } - - isTelegrafHelp(target: Type | Function): boolean { - if (!target) { - return false; - } - return !!this.reflector.get(DECORATORS.HELP, target); - } - - isTelegrafSettings(target: Type | Function): boolean { - if (!target) { - return false; - } - return !!this.reflector.get(DECORATORS.SETTINGS, target); - } - - isTelegrafEntity(target: Type | Function): boolean { - if (!target) { - return false; - } - return !!this.reflector.get(DECORATORS.ENTITY, target); - } - - getTelegrafEntityMetadata( - target: Type | Function, - ): EntityOptions | undefined { - return this.reflector.get(DECORATORS.ENTITY, target); - } - - isTelegrafMention(target: Type | Function): boolean { - if (!target) { - return false; - } - return !!this.reflector.get(DECORATORS.MENTION, target); - } - - getTelegrafMentionMetadata( - target: Type | Function, - ): MentionOptions | undefined { - return this.reflector.get(DECORATORS.MENTION, target); - } - - isTelegrafPhone(target: Type | Function): boolean { - if (!target) { - return false; - } - return !!this.reflector.get(DECORATORS.PHONE, target); - } - - getTelegrafPhoneMetadata( - target: Type | Function, - ): PhoneOptions | undefined { - return this.reflector.get(DECORATORS.PHONE, target); - } - - isTelegrafHashtag(target: Type | Function): boolean { - if (!target) { - return false; - } - return !!this.reflector.get(DECORATORS.HASHTAG, target); - } - - getTelegrafHashtagMetadata( - target: Type | Function, - ): HashtagOptions | undefined { - return this.reflector.get(DECORATORS.HASHTAG, target); - } - - isTelegrafCashtag(target: Type | Function): boolean { - if (!target) { - return false; - } - return !!this.reflector.get(DECORATORS.CASHTAG, target); - } - - getTelegrafCashtagMetadata( - target: Type | Function, - ): CashtagOptions | undefined { - return this.reflector.get(DECORATORS.CASHTAG, target); - } - - isTelegrafAction(target: Type | Function): boolean { - if (!target) { - return false; - } - return !!this.reflector.get(DECORATORS.ACTION, target); - } - - getTelegrafActionMetadata( - target: Type | Function, - ): ActionOptions | undefined { - return this.reflector.get(DECORATORS.ACTION, target); - } - - isTelegrafInlineQuery(target: Type | Function): boolean { - if (!target) { - return false; - } - return !!this.reflector.get(DECORATORS.INLINE_QUERY, target); - } - - getTelegrafInlineQueryMetadata( - target: Type | Function, - ): InlineQueryOptions | undefined { - return this.reflector.get(DECORATORS.INLINE_QUERY, target); - } - - isTelegrafGameQuery(target: Type | Function): boolean { - if (!target) { - return false; - } - return !!this.reflector.get(DECORATORS.GAME_QUERY, target); - } -} diff --git a/lib/telegraf.constants.ts b/lib/telegraf.constants.ts index 1affe84..1790594 100644 --- a/lib/telegraf.constants.ts +++ b/lib/telegraf.constants.ts @@ -1,23 +1,6 @@ export const TELEGRAF_MODULE_OPTIONS = 'TELEGRAF_MODULE_OPTIONS'; -export const TELEGRAF_PROVIDER = 'TelegrafProvider'; -export const DECORATORS_PREFIX = 'TELEGRAF'; -export const DECORATORS = { - USE: `${DECORATORS_PREFIX}/USE`, - ON: `${DECORATORS_PREFIX}/ON`, - 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`, -}; +export const UPDATE_METADATA = 'UPDATE_METADATA'; +export const UPDATE_LISTENER_METADATA = 'UPDATE_LISTENER_METADATA'; + +export const SCENE_METADATA = 'SCENE_METADATA'; diff --git a/lib/telegraf.explorer.ts b/lib/telegraf.explorer.ts deleted file mode 100644 index 42aa3c5..0000000 --- a/lib/telegraf.explorer.ts +++ /dev/null @@ -1,238 +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(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) { - this.telegraf.settings(instance[key].bind(instance)); - } - - handleTelegrafEntity(instance: object, key: string, metadata: EntityOptions) { - this.telegraf.entity(metadata.entity, instance[key].bind(instance)); - } - - handleTelegrafMention( - instance: object, - key: string, - metadata: MentionOptions, - ) { - this.telegraf.mention(metadata.username, instance[key].bind(instance)); - } - - handleTelegrafPhone(instance: object, key: string, metadata: PhoneOptions) { - this.telegraf.phone(metadata.phone, instance[key].bind(instance)); - } - - handleTelegrafHashtag( - instance: object, - key: string, - metadata: HashtagOptions, - ) { - this.telegraf.hashtag(metadata.hashtag, instance[key].bind(instance)); - } - - handleTelegrafCashtag( - instance: object, - key: string, - metadata: CashtagOptions, - ) { - 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) { - 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)); - } -} diff --git a/lib/telegraf.metadata-accessor.ts b/lib/telegraf.metadata-accessor.ts new file mode 100644 index 0000000..5c4394d --- /dev/null +++ b/lib/telegraf.metadata-accessor.ts @@ -0,0 +1,29 @@ +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 TelegrafMetadataAccessor { + constructor(private readonly reflector: Reflector) {} + + isUpdate(target: Function): boolean { + return !!this.reflector.get(UPDATE_METADATA, target); + } + + isScene(target: Function): boolean { + 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); + } +} diff --git a/lib/telegraf.module.ts b/lib/telegraf.module.ts index fb3cdeb..4e9f958 100644 --- a/lib/telegraf.module.ts +++ b/lib/telegraf.module.ts @@ -1,27 +1,106 @@ -import { Module, DynamicModule } from '@nestjs/common'; -import { TelegrafCoreModule } from './telegraf-core.module'; +import { DiscoveryModule, ModuleRef } from '@nestjs/core'; +import { + DynamicModule, + Inject, + Module, + OnApplicationBootstrap, + OnApplicationShutdown, + Provider, +} from '@nestjs/common'; +import { Telegraf } from 'telegraf'; import { - TelegrafModuleOptions, TelegrafModuleAsyncOptions, + TelegrafModuleOptions, + TelegrafOptionsFactory, } from './interfaces'; +import { TELEGRAF_MODULE_OPTIONS } from './telegraf.constants'; +import { TelegrafMetadataAccessor } from './telegraf.metadata-accessor'; +import { TelegrafUpdateExplorer } from './explorers/telegraf-update.explorer'; +import { TelegrafSceneExplorer } from './explorers/telegraf-scene.explorer'; +import { createProviders, TelegrafProvider } from './telegraf.providers'; + +@Module({ + imports: [DiscoveryModule], + providers: [ + TelegrafMetadataAccessor, + TelegrafSceneExplorer, + TelegrafUpdateExplorer, + ], +}) +export class TelegrafModule + implements OnApplicationBootstrap, OnApplicationShutdown { + constructor( + @Inject(TELEGRAF_MODULE_OPTIONS) + private readonly options: TelegrafModuleOptions, + private readonly moduleRef: ModuleRef, + ) {} + + async onApplicationBootstrap(): Promise { + const { launchOptions } = this.options; + const telegraf = this.moduleRef.get(Telegraf); + await telegraf.launch(launchOptions); + } + + async onApplicationShutdown(): Promise { + const telegraf = this.moduleRef.get(Telegraf); + await telegraf.stop(); + } -@Module({}) -export class TelegrafModule { public static forRoot(options: TelegrafModuleOptions): DynamicModule { + const providers = [...createProviders(options), TelegrafProvider]; + return { module: TelegrafModule, - imports: [TelegrafCoreModule.forRoot(options)], - exports: [TelegrafCoreModule], + providers, + exports: providers, }; } public static forRootAsync( options: TelegrafModuleAsyncOptions, ): DynamicModule { + const providers = [...this.createAsyncProviders(options), TelegrafProvider]; + return { module: TelegrafModule, - imports: [TelegrafCoreModule.forRootAsync(options)], - exports: [TelegrafCoreModule], + imports: options.imports || [], + providers, + exports: providers, + }; + } + + private static createAsyncProviders( + options: TelegrafModuleAsyncOptions, + ): Provider[] { + if (options.useExisting || options.useFactory) { + return [this.createAsyncOptionsProvider(options)]; + } + + return [ + this.createAsyncOptionsProvider(options), + { + provide: options.useClass, + useClass: options.useClass, + }, + ]; + } + + private static createAsyncOptionsProvider( + options: TelegrafModuleAsyncOptions, + ): Provider { + if (options.useFactory) { + return { + provide: TELEGRAF_MODULE_OPTIONS, + useFactory: options.useFactory, + inject: options.inject || [], + }; + } + + return { + provide: TELEGRAF_MODULE_OPTIONS, + useFactory: async (optionsFactory: TelegrafOptionsFactory) => + await optionsFactory.createTelegrafOptions(), + inject: [options.useExisting || options.useClass], }; } } diff --git a/lib/telegraf.provider.ts b/lib/telegraf.provider.ts deleted file mode 100644 index 58be5b1..0000000 --- a/lib/telegraf.provider.ts +++ /dev/null @@ -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 - 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(); - } -} diff --git a/lib/telegraf.providers.ts b/lib/telegraf.providers.ts new file mode 100644 index 0000000..399efe7 --- /dev/null +++ b/lib/telegraf.providers.ts @@ -0,0 +1,23 @@ +import { Provider } from '@nestjs/common'; +import { Telegraf } from 'telegraf'; +import { TELEGRAF_MODULE_OPTIONS } from './telegraf.constants'; +import { TelegrafModuleOptions } from './interfaces'; + +export const TelegrafProvider = { + provide: Telegraf, + useFactory: (options: TelegrafModuleOptions) => { + const telegraf = new Telegraf(options.token, options.options); + telegraf.use(...options.middlewares); + return telegraf; + }, + inject: [TELEGRAF_MODULE_OPTIONS], +}; + +export function createProviders(options: TelegrafModuleOptions): Provider[] { + return [ + { + provide: TELEGRAF_MODULE_OPTIONS, + useValue: options, + }, + ]; +} diff --git a/lib/telegraf.types.ts b/lib/telegraf.types.ts new file mode 100644 index 0000000..4a6dc63 --- /dev/null +++ b/lib/telegraf.types.ts @@ -0,0 +1,21 @@ +import { BaseScene, Composer, Middleware } from 'telegraf'; + +export type Filter = T extends [] + ? [] + : T extends [infer Head, ...infer Tail] + ? Head extends F + ? Filter + : [Head, ...Filter] + : []; + +export type OnlyFunctionPropertyNames = { + [K in keyof T]: T[K] extends (...args: any) => any ? K : never; +}[keyof T]; + +export type ComposerMethodArgs< + T extends Composer, + U extends OnlyFunctionPropertyNames = OnlyFunctionPropertyNames +> = Filter, Middleware>; + +export type UpdateMethods = OnlyFunctionPropertyNames>; +export type SceneMethods = OnlyFunctionPropertyNames>; diff --git a/package-lock.json b/package-lock.json index 888220d..d141bbc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,18 +5,18 @@ "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, "requires": { "@babel/highlight": "^7.10.4" } }, "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", "dev": true }, "@babel/highlight": { @@ -28,12 +28,64 @@ "@babel/helper-validator-identifier": "^7.10.4", "chalk": "^2.0.0", "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "@eslint/eslintrc": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.1.3.tgz", - "integrity": "sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.2.tgz", + "integrity": "sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -57,31 +109,30 @@ } }, "@nestjs/common": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-7.4.4.tgz", - "integrity": "sha512-Cj94FJrnLcAU4URJrRmnsHRODZPJpX+EKKJ/Or9qvL9ULQwRWYmFcGQYaJ0nVV0hSBjn/jaAV1Cgqw74uk21KA==", + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-7.6.1.tgz", + "integrity": "sha512-Tq95a6a0kP3rxtV49xal168QNx49JPfO3s6SZ01sCJMWJVtGy8KCaC8YHAx7+KYamH43K6bd9Qv0K9R8lZxEtg==", "dev": true, "requires": { - "axios": "0.20.0", - "cli-color": "2.0.0", + "axios": "0.21.0", "iterare": "1.2.1", - "tslib": "2.0.1", - "uuid": "8.3.0" + "tslib": "2.0.3", + "uuid": "8.3.2" } }, "@nestjs/core": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-7.4.4.tgz", - "integrity": "sha512-e3iID6s0JIaWDlZMIO+gkk5KDwHW+VUexvZOKXbTjtsBidtusbiT4JLr4ODkj8y3QSfQN9vouY9hWfwwQrxa/Q==", + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-7.6.1.tgz", + "integrity": "sha512-Rd0hqV2TsseMfZFTZBQH6zlNe5Hif5kVe5KNOnXADghKVaSLOO9SQ+VVPqXzeRYvC+xvJxnSdDyeTIriVsgMlg==", "dev": true, "requires": { - "@nuxtjs/opencollective": "0.2.2", + "@nuxtjs/opencollective": "0.3.2", "fast-safe-stringify": "2.0.7", "iterare": "1.2.1", "object-hash": "2.0.3", "path-to-regexp": "3.2.0", - "tslib": "2.0.1", - "uuid": "8.3.0" + "tslib": "2.0.3", + "uuid": "8.3.2" } }, "@nodelib/fs.scandir": { @@ -111,28 +162,16 @@ } }, "@nuxtjs/opencollective": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.2.2.tgz", - "integrity": "sha512-69gFVDs7mJfNjv9Zs5DFVD+pvBW+k1TaHSOqUWqAyTTfLcKI/EMYQgvEvziRd+zAFtUOoye6MfWh0qvinGISPw==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz", + "integrity": "sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==", "dev": true, "requires": { - "chalk": "^2.4.1", - "consola": "^2.3.0", - "node-fetch": "^2.3.0" + "chalk": "^4.1.0", + "consola": "^2.15.0", + "node-fetch": "^2.6.1" } }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", - "dev": true - }, - "@types/eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", - "dev": true - }, "@types/json-schema": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", @@ -152,13 +191,13 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.0.0.tgz", - "integrity": "sha512-5e6q1TR7gS2P+8W2xndCu7gBh3BzmYEo70OyIdsmCmknHha/yNbz2vdevl+tP1uoaMOcrzg4gyrAijuV3DDBHA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.9.1.tgz", + "integrity": "sha512-QRLDSvIPeI1pz5tVuurD+cStNR4sle4avtHhxA+2uyixWGFjKzJ+EaFVRW6dA/jOgjV5DTAjOxboQkRDE8cRlQ==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "4.0.0", - "@typescript-eslint/scope-manager": "4.0.0", + "@typescript-eslint/experimental-utils": "4.9.1", + "@typescript-eslint/scope-manager": "4.9.1", "debug": "^4.1.1", "functional-red-black-tree": "^1.0.1", "regexpp": "^3.0.0", @@ -167,108 +206,55 @@ } }, "@typescript-eslint/experimental-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.0.0.tgz", - "integrity": "sha512-hbX6zR+a/vcpFVNJYN/Nbd7gmaMosDTxHEKcvmhWeWcq/0UDifrqmCfkkodbAKL46Fn4ekSBMTyq2zlNDzcQxw==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.9.1.tgz", + "integrity": "sha512-c3k/xJqk0exLFs+cWSJxIjqLYwdHCuLWhnpnikmPQD2+NGAx9KjLYlBDcSI81EArh9FDYSL6dslAUSwILeWOxg==", "dev": true, "requires": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.0.0", - "@typescript-eslint/types": "4.0.0", - "@typescript-eslint/typescript-estree": "4.0.0", + "@typescript-eslint/scope-manager": "4.9.1", + "@typescript-eslint/types": "4.9.1", + "@typescript-eslint/typescript-estree": "4.9.1", "eslint-scope": "^5.0.0", "eslint-utils": "^2.0.0" } }, "@typescript-eslint/parser": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.10.1.tgz", - "integrity": "sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.9.1.tgz", + "integrity": "sha512-Gv2VpqiomvQ2v4UL+dXlQcZ8zCX4eTkoIW+1aGVWT6yTO+6jbxsw7yQl2z2pPl/4B9qa5JXeIbhJpONKjXIy3g==", "dev": true, "requires": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "3.10.1", - "@typescript-eslint/types": "3.10.1", - "@typescript-eslint/typescript-estree": "3.10.1", - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "@typescript-eslint/experimental-utils": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz", - "integrity": "sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/types": "3.10.1", - "@typescript-eslint/typescript-estree": "3.10.1", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" - } - }, - "@typescript-eslint/types": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz", - "integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz", - "integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==", - "dev": true, - "requires": { - "@typescript-eslint/types": "3.10.1", - "@typescript-eslint/visitor-keys": "3.10.1", - "debug": "^4.1.1", - "glob": "^7.1.6", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz", - "integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } + "@typescript-eslint/scope-manager": "4.9.1", + "@typescript-eslint/types": "4.9.1", + "@typescript-eslint/typescript-estree": "4.9.1", + "debug": "^4.1.1" } }, "@typescript-eslint/scope-manager": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.0.0.tgz", - "integrity": "sha512-9gcWUPoWo7gk/+ZQPg7L1ySRmR5HLIy3Vu6/LfhQbuzIkGm6v2CGIjpVRISoDLFRovNRDImd4aP/sa8O4yIEBg==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.9.1.tgz", + "integrity": "sha512-sa4L9yUfD/1sg9Kl8OxPxvpUcqxKXRjBeZxBuZSSV1v13hjfEJkn84n0An2hN8oLQ1PmEl2uA6FkI07idXeFgQ==", "dev": true, "requires": { - "@typescript-eslint/types": "4.0.0", - "@typescript-eslint/visitor-keys": "4.0.0" + "@typescript-eslint/types": "4.9.1", + "@typescript-eslint/visitor-keys": "4.9.1" } }, "@typescript-eslint/types": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.0.0.tgz", - "integrity": "sha512-bK+c2VLzznX2fUWLK6pFDv3cXGTp7nHIuBMq1B9klA+QCsqLHOOqe5TQReAQDl7DN2RfH+neweo0oC5hYlG7Rg==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.9.1.tgz", + "integrity": "sha512-fjkT+tXR13ks6Le7JiEdagnwEFc49IkOyys7ueWQ4O8k4quKPwPJudrwlVOJCUQhXo45PrfIvIarcrEjFTNwUA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.0.0.tgz", - "integrity": "sha512-ewFMPi2pMLDNIXGMPdf8r7El2oPSZw9PEYB0j+WcpKd7AX2ARmajGa7RUHTukllWX2bj4vWX6JLE1Oih2BMokA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.9.1.tgz", + "integrity": "sha512-bzP8vqwX6Vgmvs81bPtCkLtM/Skh36NE6unu6tsDeU/ZFoYthlTXbBmpIrvosgiDKlWTfb2ZpPELHH89aQjeQw==", "dev": true, "requires": { - "@typescript-eslint/types": "4.0.0", - "@typescript-eslint/visitor-keys": "4.0.0", + "@typescript-eslint/types": "4.9.1", + "@typescript-eslint/visitor-keys": "4.9.1", "debug": "^4.1.1", "globby": "^11.0.1", "is-glob": "^4.0.1", @@ -278,19 +264,27 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.0.0.tgz", - "integrity": "sha512-sTouJbv6rjVJeTE4lpSBVYXq/u5K3gbB6LKt7ccFEZPTZB/VeQ0ssUz9q5Hx++sCqBbdF8PzrrgvEnicXAR6NQ==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.9.1.tgz", + "integrity": "sha512-9gspzc6UqLQHd7lXQS7oWs+hrYggspv/rk6zzEMhCbYwPE/sF7oxo7GAjkS35Tdlt7wguIG+ViWCPtVZHz/ybQ==", "dev": true, "requires": { - "@typescript-eslint/types": "4.0.0", + "@typescript-eslint/types": "4.9.1", "eslint-visitor-keys": "^2.0.0" } }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "requires": { + "event-target-shim": "^5.0.0" + } + }, "acorn": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", - "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true }, "acorn-jsx": { @@ -310,9 +304,9 @@ } }, "ajv": { - "version": "6.12.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", - "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -345,18 +339,18 @@ } }, "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" } }, "argparse": { @@ -369,13 +363,15 @@ } }, "array-includes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", - "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.2.tgz", + "integrity": "sha512-w2GspexNQpx+PutG3QpT437/BenZBj0M/MZGn5mzv/MofYqo0xmRHzn4lFsoDlWJ+THYsGJmFlW68WlDFx7VRw==", "dev": true, "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0", + "es-abstract": "^1.18.0-next.1", + "get-intrinsic": "^1.0.1", "is-string": "^1.0.5" } }, @@ -386,13 +382,14 @@ "dev": true }, "array.prototype.flat": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", - "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", "dev": true, "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" + "es-abstract": "^1.18.0-next.1" } }, "astral-regex": { @@ -402,9 +399,9 @@ "dev": true }, "axios": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.20.0.tgz", - "integrity": "sha512-ANA4rr2BDcmmAQLOKft2fufrtuvlqR+cXNNinUmvfeSNCOF98PZL+7M/v1zIdGo7OLjEA9J2gXJL+j4zGsl0bA==", + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.0.tgz", + "integrity": "sha512-fmkJBknJKoZwem3/IKSSLpkdNXZeBu5Q7GA/aRsr2btgrptmSCxi2oFjZHqGdK9DoTil9PIHlPIZw2EcRJXRvw==", "dev": true, "requires": { "follow-redirects": "^1.10.0" @@ -435,6 +432,16 @@ "fill-range": "^7.0.1" } }, + "call-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", + "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.0" + } + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -442,14 +449,13 @@ "dev": true }, "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, "ci-info": { @@ -464,20 +470,6 @@ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true }, - "cli-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.0.tgz", - "integrity": "sha512-a0VZ8LeraW0jTuCkuAGMNufareGHhyZU9z8OGsW0gXd1hZGi1SRuNRXdbGkraBBKnhyUhyebFWnRbp+dIn0f0A==", - "dev": true, - "requires": { - "ansi-regex": "^2.1.1", - "d": "^1.0.1", - "es5-ext": "^0.10.51", - "es6-iterator": "^2.0.3", - "memoizee": "^0.4.14", - "timers-ext": "^0.1.7" - } - }, "cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -497,37 +489,12 @@ "string-width": "^4.2.0" }, "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, "astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -565,24 +532,24 @@ } }, "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "color-name": "1.1.3" + "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "commander": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.1.0.tgz", - "integrity": "sha512-wl7PNrYWd2y5mp1OK/LhTlv8Ff4kQJQRXXAvF+uU/TPNiVJUxZLRYGj/B0y/lPGAVcSbJqH2Za/cvHmrPMC8mA==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "dev": true }, "compare-versions": { @@ -647,22 +614,12 @@ "which": "^2.0.1" } }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "dedent": { @@ -738,20 +695,21 @@ } }, "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.0", + "object.assign": "^4.1.1", "string.prototype.trimend": "^1.0.1", "string.prototype.trimstart": "^1.0.1" } @@ -767,50 +725,6 @@ "is-symbol": "^1.0.2" } }, - "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dev": true, - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -818,26 +732,26 @@ "dev": true }, "eslint": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.8.1.tgz", - "integrity": "sha512-/2rX2pfhyUG0y+A123d0ccXtMm7DV7sH1m3lk9nk2DZ2LReq39FXHueR9xZwshE5MdfSf0xunSaMWRqyIA6M1w==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.15.0.tgz", + "integrity": "sha512-Vr64xFDT8w30wFll643e7cGrIkPEU50yIiI36OdSIDoSGguIeaLzBo0vpGvzo9RECUqq7htURfwEtKqwytkqzA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@eslint/eslintrc": "^0.1.3", + "@eslint/eslintrc": "^0.2.2", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.0.1", "doctrine": "^3.0.0", "enquirer": "^2.3.5", - "eslint-scope": "^5.1.0", + "eslint-scope": "^5.1.1", "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^1.3.0", - "espree": "^7.3.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", "esquery": "^1.2.0", "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", + "file-entry-cache": "^6.0.0", "functional-red-black-tree": "^1.0.1", "glob-parent": "^5.0.0", "globals": "^12.1.0", @@ -862,78 +776,19 @@ "v8-compile-cache": "^2.0.3" }, "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } } } }, "eslint-config-prettier": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz", - "integrity": "sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA==", - "dev": true, - "requires": { - "get-stdin": "^6.0.0" - } + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-7.0.0.tgz", + "integrity": "sha512-8Y8lGLVPPZdaNA7JXqnvETVC7IiVRgAP6afQu9gOQRn90YY3otMNh+x7Vr2vMePQntF+5erdSUBqSzCmU/AxaQ==", + "dev": true }, "eslint-import-resolver-node": { "version": "0.3.4", @@ -990,9 +845,9 @@ } }, "eslint-plugin-import": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz", - "integrity": "sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg==", + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", + "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", "dev": true, "requires": { "array-includes": "^3.1.1", @@ -1000,7 +855,7 @@ "contains-path": "^0.1.0", "debug": "^2.6.9", "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.3", + "eslint-import-resolver-node": "^0.3.4", "eslint-module-utils": "^2.6.0", "has": "^1.0.3", "minimatch": "^3.0.4", @@ -1038,12 +893,12 @@ } }, "eslint-scope": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", - "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { - "esrecurse": "^4.1.0", + "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, @@ -1071,13 +926,13 @@ "dev": true }, "espree": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", - "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, "requires": { "acorn": "^7.4.0", - "acorn-jsx": "^5.2.0", + "acorn-jsx": "^5.3.1", "eslint-visitor-keys": "^1.3.0" }, "dependencies": { @@ -1141,20 +996,15 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" }, "execa": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", - "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", "dev": true, "requires": { "cross-spawn": "^7.0.0", @@ -1168,23 +1018,6 @@ "strip-final-newline": "^2.0.0" } }, - "ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", - "dev": true, - "requires": { - "type": "^2.0.0" - }, - "dependencies": { - "type": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", - "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==", - "dev": true - } - } - }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -1224,9 +1057,9 @@ "dev": true }, "fastq": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", - "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.0.tgz", + "integrity": "sha512-NL2Qc5L3iQEsyYzweq7qfgy5OtXCmGzGvhElGEd/SoFWEMOEczNh5s5ocaF01HDetxz+p8ecjNPA6cZxxIHmzA==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -1242,12 +1075,12 @@ } }, "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz", + "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==", "dev": true, "requires": { - "flat-cache": "^2.0.1" + "flat-cache": "^3.0.4" } }, "fill-range": { @@ -1278,26 +1111,25 @@ } }, "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" + "flatted": "^3.1.0", + "rimraf": "^3.0.2" } }, "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.0.tgz", + "integrity": "sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA==", "dev": true }, "follow-redirects": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", - "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz", + "integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg==", "dev": true }, "fs.realpath": { @@ -1318,18 +1150,23 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, + "get-intrinsic": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.2.tgz", + "integrity": "sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "get-own-enumerable-property-symbols": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", "dev": true }, - "get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", - "dev": true - }, "get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", @@ -1401,9 +1238,9 @@ } }, "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "has-symbols": { @@ -1425,9 +1262,9 @@ "dev": true }, "husky": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.0.tgz", - "integrity": "sha512-tTMeLCLqSBqnflBZnlVDhpaIMucSGaYyX6855jM4AguGeWCeSzNdb1mfyWduTZ3pe3SJVvVWGL0jO1iKZVPfTA==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.5.tgz", + "integrity": "sha512-E5S/1HMoDDaqsH8kDF5zeKEQbYqe3wL9zJDyqyYqc8I4vHBtAoxkDBGXox0lZ9RI+k5GyB728vZdmnM4bYap+g==", "dev": true, "requires": { "chalk": "^4.0.0", @@ -1442,41 +1279,6 @@ "which-pm-runs": "^1.0.0" }, "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -1487,12 +1289,6 @@ "path-exists": "^4.0.0" } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -1540,15 +1336,6 @@ "requires": { "find-up": "^4.0.0" } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } } } }, @@ -1559,9 +1346,9 @@ "dev": true }, "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "requires": { "parent-module": "^1.0.0", @@ -1603,11 +1390,20 @@ "dev": true }, "is-callable": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.1.tgz", - "integrity": "sha512-wliAfSzx6V+6WfMOmus1xy0XvSgf/dlStkvTfq7F0g4bOIW0PSUbnyse3NhDwdyYS1ozfUtAAySqTws3z9Eqgg==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", "dev": true }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "is-date-object": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", @@ -1635,6 +1431,12 @@ "is-extglob": "^2.1.1" } }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -1647,12 +1449,6 @@ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, - "is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "dev": true - }, "is-regex": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", @@ -1714,9 +1510,9 @@ "dev": true }, "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -1767,84 +1563,32 @@ "dev": true }, "lint-staged": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.3.0.tgz", - "integrity": "sha512-an3VgjHqmJk0TORB/sdQl0CTkRg4E5ybYCXTTCSJ5h9jFwZbcgKIx5oVma5e7wp/uKt17s1QYFmYqT9MGVosGw==", + "version": "10.5.3", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.5.3.tgz", + "integrity": "sha512-TanwFfuqUBLufxCc3RUtFEkFraSPNR3WzWcGF39R3f2J7S9+iF9W0KTVLfSy09lYGmZS5NDCxjNvhGMSJyFCWg==", "dev": true, "requires": { "chalk": "^4.1.0", "cli-truncate": "^2.1.0", - "commander": "^6.0.0", + "commander": "^6.2.0", "cosmiconfig": "^7.0.0", - "debug": "^4.1.1", + "debug": "^4.2.0", "dedent": "^0.7.0", "enquirer": "^2.3.6", - "execa": "^4.0.3", - "listr2": "^2.6.0", + "execa": "^4.1.0", + "listr2": "^3.2.2", "log-symbols": "^4.0.0", "micromatch": "^4.0.2", "normalize-path": "^3.0.0", "please-upgrade-node": "^3.2.0", "string-argv": "0.3.1", "stringify-object": "^3.3.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "listr2": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-2.6.2.tgz", - "integrity": "sha512-6x6pKEMs8DSIpA/tixiYY2m/GcbgMplMVmhQAaLFxEtNSKLeWTGjtmU57xvv6QCm2XcqzyNXL/cTSVf4IChCRA==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.2.3.tgz", + "integrity": "sha512-vUb80S2dSUi8YxXahO8/I/s29GqnOL8ozgHVLjfWQXa03BNEeS1TpBLjh2ruaqq5ufx46BRGvfymdBSuoXET5w==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -1853,60 +1597,8 @@ "indent-string": "^4.0.0", "log-update": "^4.0.0", "p-map": "^4.0.0", - "rxjs": "^6.6.2", + "rxjs": "^6.6.3", "through": "^2.3.8" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "load-json-file": { @@ -1944,58 +1636,6 @@ "dev": true, "requires": { "chalk": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "log-update": { @@ -2010,37 +1650,12 @@ "wrap-ansi": "^6.2.0" }, "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, "astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -2060,29 +1675,13 @@ } } }, - "lru-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { - "es5-ext": "~0.10.2" - } - }, - "memoizee": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz", - "integrity": "sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.45", - "es6-weak-map": "^2.0.2", - "event-emitter": "^0.3.5", - "is-promise": "^2.1", - "lru-queue": "0.1", - "next-tick": "1", - "timers-ext": "^0.1.5" + "yallist": "^4.0.0" } }, "merge-stream": { @@ -2127,15 +1726,6 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, "module-alias": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.2.tgz", @@ -2152,12 +1742,6 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, "node-fetch": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", @@ -2205,9 +1789,9 @@ "dev": true }, "object-inspect": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", - "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", "dev": true }, "object-keys": { @@ -2217,26 +1801,26 @@ "dev": true }, "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" } }, "object.values": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", - "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.2.tgz", + "integrity": "sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag==", "dev": true, "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", + "es-abstract": "^1.18.0-next.1", "has": "^1.0.3" } }, @@ -2402,9 +1986,9 @@ "dev": true }, "prettier": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.1.tgz", - "integrity": "sha512-9bY+5ZWCfqj3ghYBLxApy2zf6m+NJo5GzmLTpr9FsApsfjriNnS2dahWReHMi7qNPhhHl9SYHJs2cHZLgexNIw==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", + "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", "dev": true }, "progress": { @@ -2474,11 +2058,12 @@ "dev": true }, "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", "dev": true, "requires": { + "is-core-module": "^2.1.0", "path-parse": "^1.0.6" } }, @@ -2505,18 +2090,18 @@ "dev": true }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { "glob": "^7.1.3" } }, "run-parallel": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", + "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==", "dev": true }, "rxjs": { @@ -2542,10 +2127,13 @@ "integrity": "sha512-jLYV0DORrzY3xaz/S9ydJL6Iz7essZeAfnAavsJ+zsJGZ1MOnsS52yRjU3uF3pJa/lla7+wisp//fxOwOH8SKQ==" }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } }, "semver-compare": { "version": "1.0.0", @@ -2595,6 +2183,32 @@ "ansi-styles": "^3.2.0", "astral-regex": "^1.0.0", "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + } } }, "spdx-correct": { @@ -2624,9 +2238,9 @@ } }, "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", "dev": true }, "sprintf-js": { @@ -2670,23 +2284,23 @@ } }, "string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", + "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" } }, "string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", + "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" } }, "stringify-object": { @@ -2707,14 +2321,6 @@ "dev": true, "requires": { "ansi-regex": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - } } }, "strip-bom": { @@ -2736,12 +2342,12 @@ "dev": true }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } }, "table": { @@ -2757,15 +2363,16 @@ } }, "telegraf": { - "version": "git://github.com/telegraf/telegraf.git#addd845af3a20948ba0ee32fe6b1b4374bff1f09", - "from": "git://github.com/telegraf/telegraf.git#addd845af3a20948ba0ee32fe6b1b4374bff1f09", + "version": "git+https://github.com/telegraf/telegraf.git#7ed1903580ea93dbaf7b737d0196889d46708cf5", + "from": "git+https://github.com/telegraf/telegraf.git#develop", "requires": { - "debug": "^4.0.1", - "minimist": "^1.2.0", + "abort-controller": "^3.0.0", + "debug": "^4.2.0", + "minimist": "^1.2.5", "module-alias": "^2.2.2", - "node-fetch": "^2.2.0", - "sandwich-stream": "^2.0.1", - "typegram": "^2.2.1" + "node-fetch": "^2.6.1", + "sandwich-stream": "^2.0.2", + "typegram": "^3.0.0" } }, "text-table": { @@ -2780,16 +2387,6 @@ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, - "timers-ext": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", - "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", - "dev": true, - "requires": { - "es5-ext": "~0.10.46", - "next-tick": "1" - } - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -2812,9 +2409,9 @@ } }, "tslib": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", - "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", "dev": true }, "tsutils": { @@ -2827,19 +2424,13 @@ }, "dependencies": { "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true } } }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", - "dev": true - }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -2856,14 +2447,14 @@ "dev": true }, "typegram": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/typegram/-/typegram-2.2.1.tgz", - "integrity": "sha512-PaHbV/oeqE8y0g6nO1pcQJl2R7EpZe7B05emprGf46DMVKCS865jpa0WgBNJh0W2G1jq5rebqMdttw/errZqZQ==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/typegram/-/typegram-3.1.1.tgz", + "integrity": "sha512-uXBGUGXhEKDyw1dAqdNWOR98nQO2a/2tnZPvEFruU6zr4t1dQIi+zziZIDNct93rnImOJbAaHH6Bsdc4l8mQoQ==" }, "typescript": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", - "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.2.tgz", + "integrity": "sha512-thGloWsGH3SOxv1SoY7QojKi0tc+8FnOmiarEGMbd/lar7QOEd3hvlx3Fp5y6FlDUGl9L+pd4n2e+oToGMmhRQ==", "dev": true }, "uri-js": { @@ -2876,15 +2467,15 @@ } }, "uuid": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", - "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true }, "v8-compile-cache": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", - "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", + "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", "dev": true }, "validate-npm-package-license": { @@ -2929,31 +2520,6 @@ "strip-ansi": "^6.0.0" }, "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -2985,14 +2551,11 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "yaml": { "version": "1.10.0", diff --git a/package.json b/package.json index 06cdf3b..8932e6a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "nestjs-telegraf", - "version": "2.0.0-alpha.1", + "version": "2.0.0", "description": "Telegraf module for NestJS", "keywords": [ "nest", @@ -30,25 +30,28 @@ "precommit": "lint-staged", "prepublish:npm": "npm run build", "publish:npm": "npm publish --access public", - "test": "" + "test": "", + "sample-app": "ts-node --transpile-only -r tsconfig-paths/register sample/main.ts" }, "dependencies": { - "telegraf": "git://github.com/telegraf/telegraf.git#addd845af3a20948ba0ee32fe6b1b4374bff1f09" + "telegraf": "^3.38.0" }, "devDependencies": { - "@nestjs/common": "7.4.4", - "@nestjs/core": "7.4.4", - "@typescript-eslint/eslint-plugin": "4.0.0", - "@typescript-eslint/parser": "3.10.1", - "eslint": "7.8.1", - "eslint-config-prettier": "6.11.0", - "eslint-plugin-import": "2.22.0", - "husky": "4.3.0", - "lint-staged": "10.3.0", - "prettier": "2.1.1", + "@nestjs/common": "7.6.1", + "@nestjs/core": "7.6.1", + "@typescript-eslint/eslint-plugin": "4.9.1", + "@typescript-eslint/parser": "4.9.1", + "eslint": "7.15.0", + "eslint-config-prettier": "7.0.0", + "eslint-plugin-import": "2.22.1", + "husky": "4.3.5", + "lint-staged": "10.5.3", + "prettier": "2.2.1", "reflect-metadata": "0.1.13", "rxjs": "6.6.3", - "typescript": "4.0.2" + "ts-node": "^9.1.1", + "tsconfig-paths": "^3.9.0", + "typescript": "4.1.2" }, "peerDependencies": { "@nestjs/common": "^6.7.0 || ^7.0.0", diff --git a/sample/app.constants.ts b/sample/app.constants.ts new file mode 100644 index 0000000..b9cfdda --- /dev/null +++ b/sample/app.constants.ts @@ -0,0 +1 @@ +export const HELLO_SCENE_ID = 'HELLO_SCENE_ID'; diff --git a/sample/app.module.ts b/sample/app.module.ts new file mode 100644 index 0000000..2d177de --- /dev/null +++ b/sample/app.module.ts @@ -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 {} diff --git a/sample/app.update.ts b/sample/app.update.ts new file mode 100644 index 0000000..402e9fb --- /dev/null +++ b/sample/app.update.ts @@ -0,0 +1,43 @@ +import { SceneContext, 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, + private readonly echoService: EchoService, + ) {} + + @Start() + async onStart(ctx: Context): Promise { + const me = await this.bot.telegram.getMe(); + await ctx.reply(`Hey, I'm ${me.first_name}`); + } + + @Help() + async onHelp(ctx: Context): Promise { + await ctx.reply('Send me any text'); + } + + @Command('scene') + async onSceneCommand(ctx: Context): Promise { + await ctx.scene.enter(HELLO_SCENE_ID); + } + + @On('message') + async onMessage(ctx: Context): Promise { + 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'); + } + } +} diff --git a/sample/echo.service.ts b/sample/echo.service.ts new file mode 100644 index 0000000..2603cc2 --- /dev/null +++ b/sample/echo.service.ts @@ -0,0 +1,8 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class EchoService { + echo(text: string): string { + return `Echo: ${text}`; + } +} diff --git a/sample/interfaces/context.interface.ts b/sample/interfaces/context.interface.ts new file mode 100644 index 0000000..58f20ef --- /dev/null +++ b/sample/interfaces/context.interface.ts @@ -0,0 +1,4 @@ +import { SceneContextMessageUpdate } from 'telegraf/typings/stage'; + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface Context extends SceneContextMessageUpdate {} diff --git a/sample/main.ts b/sample/main.ts new file mode 100644 index 0000000..42c2fa5 --- /dev/null +++ b/sample/main.ts @@ -0,0 +1,7 @@ +import { NestFactory } from '@nestjs/core'; +import { AppModule } from './app.module'; + +async function bootstrap() { + await NestFactory.createApplicationContext(AppModule); +} +bootstrap(); diff --git a/sample/middleware/session.middleware.ts b/sample/middleware/session.middleware.ts new file mode 100644 index 0000000..c203f15 --- /dev/null +++ b/sample/middleware/session.middleware.ts @@ -0,0 +1,3 @@ +import { session } from 'telegraf'; + +export const sessionMiddleware = session(); diff --git a/sample/scenes/hello.scene.ts b/sample/scenes/hello.scene.ts new file mode 100644 index 0000000..f84a6f4 --- /dev/null +++ b/sample/scenes/hello.scene.ts @@ -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 { + console.log('Enter to scene'); + await ctx.reply('Welcome on scene ✋'); + } + + @SceneLeave() + async onSceneLeave(ctx: Context): Promise { + console.log('Leave from scene'); + await ctx.reply('Bye Bye 👋'); + } + + @Command('hello') + async onHelloCommand(ctx: Context): Promise { + console.log('Use say hello'); + await ctx.reply('Hi'); + } + + @Command('leave') + async onLeaveCommand(ctx: Context): Promise { + await ctx.scene.leave(); + } +} diff --git a/tsconfig.json b/tsconfig.json index bb13608..921d963 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,10 +9,10 @@ "experimentalDecorators": true, "target": "es6", "sourceMap": false, + "baseUrl": "./", "outDir": "./dist", - "rootDir": "./lib", "skipLibCheck": true }, - "include": ["lib/**/*", "../index.ts"], + "include": ["lib/**/*", "sample/**/*"], "exclude": ["node_modules", "**/*.spec.ts"] }