Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More β†’
Socket
Sign inDemoInstall
Socket

grammy

Package Overview
Dependencies
Maintainers
1
Versions
120
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

grammy - npm Package Compare versions

Comparing version 1.19.3 to 1.20.0

12

out/bot.d.ts

@@ -1,8 +0,8 @@

import { BotError, Composer, type Middleware } from "./composer.js";
import { Context } from "./context.js";
import { BotError, Composer, type Middleware, type ReactionMiddleware } from "./composer.js";
import { Context, type MaybeArray, type ReactionContext } from "./context.js";
import { Api } from "./core/api.js";
import { type ApiClientOptions, type WebhookReplyEnvelope } from "./core/client.js";
import { type Filter, type FilterQuery } from "./filter.js";
import { type Update, type UserFromGetMe } from "./types.js";
export declare const DEFAULT_UPDATE_TYPES: readonly ["message", "edited_message", "channel_post", "edited_channel_post", "inline_query", "chosen_inline_result", "callback_query", "shipping_query", "pre_checkout_query", "poll", "poll_answer", "my_chat_member", "chat_join_request"];
import { type ReactionType, type ReactionTypeEmoji, type Update, type UserFromGetMe } from "./types.js";
export declare const DEFAULT_UPDATE_TYPES: readonly ["message", "edited_message", "channel_post", "edited_channel_post", "inline_query", "chosen_inline_result", "callback_query", "shipping_query", "pre_checkout_query", "poll", "poll_answer", "my_chat_member", "chat_join_request", "chat_boost", "removed_chat_boost"];
/**

@@ -167,2 +167,6 @@ * Options that can be specified when running the bot via simple long polling.

/**
* @inheritdoc
*/
reaction(reaction: MaybeArray<ReactionTypeEmoji["emoji"] | ReactionType>, ...middleware: Array<ReactionMiddleware<C>>): Composer<ReactionContext<C>>;
/**
* Checks if the bot has been initialized. A bot is initialized if the bot

@@ -169,0 +173,0 @@ * information is set. The bot information can either be set automatically

@@ -29,2 +29,4 @@ "use strict";

"chat_join_request",
"chat_boost",
"removed_chat_boost",
];

@@ -130,2 +132,9 @@ /**

/**
* @inheritdoc
*/
reaction(reaction, ...middleware) {
this.observedUpdateTypes.add("message_reaction");
return super.reaction(reaction, ...middleware);
}
/**
* Checks if the bot has been initialized. A bot is initialized if the bot

@@ -132,0 +141,0 @@ * information is set. The bot information can either be set automatically

@@ -1,4 +0,4 @@

import { type CallbackQueryContext, type ChatTypeContext, type ChosenInlineResultContext, type CommandContext, Context, type GameQueryContext, type HearsContext, type InlineQueryContext, type MaybeArray, type StringWithSuggestions } from "./context.js";
import { type CallbackQueryContext, type ChatTypeContext, type ChosenInlineResultContext, type CommandContext, Context, type GameQueryContext, type HearsContext, type InlineQueryContext, type MaybeArray, type ReactionContext, type StringWithSuggestions } from "./context.js";
import { type Filter, type FilterQuery } from "./filter.js";
import { type Chat } from "./types.js";
import { type Chat, type ReactionType, type ReactionTypeEmoji } from "./types.js";
type MaybePromise<T> = T | Promise<T>;

@@ -176,3 +176,3 @@ /**

* // Matches all messages and channel posts that both a) contain a URL and b) are forwards
* bot.on('::url').on(':forward_date', ctx => { ... })
* bot.on('::url').on(':forward_origin', ctx => { ... })
* ```

@@ -273,2 +273,29 @@ *

/**
* Registers some middleware that will only be added when a new reaction of
* the given type is added to a message.
* ```ts
* // Reacts to new 'πŸ‘' reactions
* bot.reaction('πŸ‘', ctx => { ... })
* // Reacts to new 'πŸ‘' or 'πŸ‘Ž' reactions
* bot.reaction(['πŸ‘', 'πŸ‘Ž'], ctx => { ... })
* ```
*
* > Note that you have to enable `message_reaction` updates in
* `allowed_updates` if you want your bot to receive updates about message
* reactions.
*
* `bot.reaction` will trigger if:
* - a new emoji reaction is added to a message
* - a new custom emoji reaction is added a message
*
* `bot.reaction` will not trigger if:
* - a reaction is removed
* - an anonymous reaction count is updated, such as on channel posts
* - `message_reaction` updates are not enabled for your bot
*
* @param reaction The reaction to look for
* @param middleware The middleware to register
*/
reaction(reaction: MaybeArray<ReactionTypeEmoji["emoji"] | ReactionType>, ...middleware: Array<ReactionMiddleware<C>>): Composer<ReactionContext<C>>;
/**
* Registers some middleware for certain chat types only. For example, you

@@ -626,2 +653,11 @@ * can use this method to only receive updates from private chats. The four

/**
* Type of the middleware that can be passed to `bot.reaction`.
*
* This helper type can be used to annotate middleware functions that are
* defined in one place, so that they have the correct type when passed to
* `bot.reaction` in a different place. For instance, this allows for more
* modular code where handlers are defined in separate files.
*/
export type ReactionMiddleware<C extends Context> = Middleware<ReactionContext<C>>;
/**
* Type of the middleware that can be passed to `bot.callbackQuery`.

@@ -628,0 +664,0 @@ *

@@ -177,3 +177,3 @@ "use strict";

* // Matches all messages and channel posts that both a) contain a URL and b) are forwards
* bot.on('::url').on(':forward_date', ctx => { ... })
* bot.on('::url').on(':forward_origin', ctx => { ... })
* ```

@@ -280,2 +280,31 @@ *

/**
* Registers some middleware that will only be added when a new reaction of
* the given type is added to a message.
* ```ts
* // Reacts to new 'πŸ‘' reactions
* bot.reaction('πŸ‘', ctx => { ... })
* // Reacts to new 'πŸ‘' or 'πŸ‘Ž' reactions
* bot.reaction(['πŸ‘', 'πŸ‘Ž'], ctx => { ... })
* ```
*
* > Note that you have to enable `message_reaction` updates in
* `allowed_updates` if you want your bot to receive updates about message
* reactions.
*
* `bot.reaction` will trigger if:
* - a new emoji reaction is added to a message
* - a new custom emoji reaction is added a message
*
* `bot.reaction` will not trigger if:
* - a reaction is removed
* - an anonymous reaction count is updated, such as on channel posts
* - `message_reaction` updates are not enabled for your bot
*
* @param reaction The reaction to look for
* @param middleware The middleware to register
*/
reaction(reaction, ...middleware) {
return this.filter(context_js_1.Context.has.reaction(reaction), ...middleware);
}
/**
* Registers some middleware for certain chat types only. For example, you

@@ -282,0 +311,0 @@ * can use this method to only receive updates from private chats. The four

import { DEFAULT_UPDATE_TYPES } from "../bot.js";
declare const ALL_UPDATE_TYPES: readonly ["message", "edited_message", "channel_post", "edited_channel_post", "inline_query", "chosen_inline_result", "callback_query", "shipping_query", "pre_checkout_query", "poll", "poll_answer", "my_chat_member", "chat_join_request", "chat_member"];
declare const ALL_UPDATE_TYPES: readonly ["message", "edited_message", "channel_post", "edited_channel_post", "inline_query", "chosen_inline_result", "callback_query", "shipping_query", "pre_checkout_query", "poll", "poll_answer", "my_chat_member", "chat_join_request", "chat_boost", "removed_chat_boost", "chat_member", "message_reaction", "message_reaction_count"];
declare const ALL_CHAT_PERMISSIONS: {

@@ -4,0 +4,0 @@ readonly can_send_messages: true;

@@ -5,3 +5,8 @@ "use strict";

const bot_js_1 = require("../bot.js");
const ALL_UPDATE_TYPES = [...bot_js_1.DEFAULT_UPDATE_TYPES, "chat_member"];
const ALL_UPDATE_TYPES = [
...bot_js_1.DEFAULT_UPDATE_TYPES,
"chat_member",
"message_reaction",
"message_reaction_count",
];
const ALL_CHAT_PERMISSIONS = {

@@ -8,0 +13,0 @@ can_send_messages: true,

@@ -1,2 +0,2 @@

import { type InlineKeyboardButton, type KeyboardButton, type KeyboardButtonPollType, type KeyboardButtonRequestChat, type KeyboardButtonRequestUser, type LoginUrl, type SwitchInlineQueryChosenChat } from "../types.js";
import { type InlineKeyboardButton, type KeyboardButton, type KeyboardButtonPollType, type KeyboardButtonRequestChat, type KeyboardButtonRequestUsers, type LoginUrl, type SwitchInlineQueryChosenChat } from "../types.js";
type KeyboardButtonSource = string | KeyboardButton;

@@ -112,6 +112,6 @@ type KeyboardSource = KeyboardButtonSource[][] | Keyboard;

/**
* Adds a new request user button. When the user presses the button, a list
* of suitable users will be opened. Tapping on any user will send their
* identifier to the bot in a β€œuser_shared” service message. Available in
* private chats only.
* Adds a new request users button. When the user presses the button, a list
* of suitable users will be opened. Tapping on any number of users will
* send their identifiers to the bot in a β€œusers_shared” service message.
* Available in private chats only.
*

@@ -122,8 +122,8 @@ * @param text The text to display

*/
requestUser(text: string, requestId: number, options?: Omit<KeyboardButtonRequestUser, "request_id">): this;
requestUsers(text: string, requestId: number, options?: Omit<KeyboardButtonRequestUsers, "request_id">): this;
/**
* Creates a new request user button. When the user presses the button, a
* list of suitable users will be opened. Tapping on any user will send
* their identifier to the bot in a β€œuser_shared” service message. Available
* in private chats only.
* Creates a new request users button. When the user presses the button, a
* list of suitable users will be opened. Tapping on any number of users
* will send their identifiers to the bot in a β€œusers_shared” service
* message. Available in private chats only.
*

@@ -134,3 +134,3 @@ * @param text The text to display

*/
static requestUser(text: string, requestId: number, options?: Omit<KeyboardButtonRequestUser, "request_id">): KeyboardButton.RequestUserButton;
static requestUsers(text: string, requestId: number, options?: Omit<KeyboardButtonRequestUsers, "request_id">): KeyboardButton.RequestUsersButton;
/**

@@ -137,0 +137,0 @@ * Adds a new request chat button. When the user presses the button, a list

@@ -100,6 +100,6 @@ "use strict";

/**
* Adds a new request user button. When the user presses the button, a list
* of suitable users will be opened. Tapping on any user will send their
* identifier to the bot in a β€œuser_shared” service message. Available in
* private chats only.
* Adds a new request users button. When the user presses the button, a list
* of suitable users will be opened. Tapping on any number of users will
* send their identifiers to the bot in a β€œusers_shared” service message.
* Available in private chats only.
*

@@ -110,10 +110,10 @@ * @param text The text to display

*/
requestUser(text, requestId, options = {}) {
return this.add(Keyboard.requestUser(text, requestId, options));
requestUsers(text, requestId, options = {}) {
return this.add(Keyboard.requestUsers(text, requestId, options));
}
/**
* Creates a new request user button. When the user presses the button, a
* list of suitable users will be opened. Tapping on any user will send
* their identifier to the bot in a β€œuser_shared” service message. Available
* in private chats only.
* Creates a new request users button. When the user presses the button, a
* list of suitable users will be opened. Tapping on any number of users
* will send their identifiers to the bot in a β€œusers_shared” service
* message. Available in private chats only.
*

@@ -124,4 +124,4 @@ * @param text The text to display

*/
static requestUser(text, requestId, options = {}) {
return { text, request_user: { request_id: requestId, ...options } };
static requestUsers(text, requestId, options = {}) {
return { text, request_users: { request_id: requestId, ...options } };
}

@@ -128,0 +128,0 @@ /**

@@ -16,3 +16,3 @@ import { type AliasProps, type Context } from "./context.js";

* // Listens for updates except forwards of messages or channel posts
* bot.drop(matchFilter(':forward_date'), ctx => { ... })
* bot.drop(matchFilter(':forward_origin'), ctx => { ... })
* ```

@@ -50,3 +50,3 @@ *

readonly successful_payment: {};
readonly user_shared: {};
readonly users_shared: {};
readonly chat_shared: {};

@@ -65,3 +65,8 @@ readonly connected_website: {};

readonly general_forum_topic_unhidden: {};
readonly forward_date: {};
readonly forward_origin: {
readonly user: {};
readonly hidden_user: {};
readonly chat: {};
readonly channel: {};
};
readonly is_topic_message: {};

@@ -160,3 +165,3 @@ readonly is_automatic_forward: {};

readonly successful_payment: {};
readonly user_shared: {};
readonly users_shared: {};
readonly chat_shared: {};

@@ -175,3 +180,8 @@ readonly connected_website: {};

readonly general_forum_topic_unhidden: {};
readonly forward_date: {};
readonly forward_origin: {
readonly user: {};
readonly hidden_user: {};
readonly chat: {};
readonly channel: {};
};
readonly is_topic_message: {};

@@ -254,3 +264,8 @@ readonly is_automatic_forward: {};

readonly channel_chat_created: {};
readonly forward_date: {};
readonly forward_origin: {
readonly user: {};
readonly hidden_user: {};
readonly chat: {};
readonly channel: {};
};
readonly is_topic_message: {};

@@ -333,3 +348,8 @@ readonly is_automatic_forward: {};

readonly channel_chat_created: {};
readonly forward_date: {};
readonly forward_origin: {
readonly user: {};
readonly hidden_user: {};
readonly chat: {};
readonly channel: {};
};
readonly is_topic_message: {};

@@ -437,2 +457,18 @@ readonly is_automatic_forward: {};

readonly chat_join_request: {};
readonly message_reaction: {
readonly old_reaction: {
readonly emoji: {};
readonly custom_emoji: {};
};
readonly new_reaction: {
readonly emoji: {};
readonly custom_emoji: {};
};
};
readonly message_reaction_count: {
readonly reactions: {
readonly emoji: {};
readonly custom_emoji: {};
};
};
};

@@ -446,6 +482,6 @@ type KeyOf<T> = string & keyof T;

type L123 = L1S | L2S | L3S;
type InjectShortcuts<Q extends L123 = L123> = Q extends `${infer R}:${infer S}:${infer T}` ? `${CollapseL1<R, L1Shortcuts>}:${CollapseL2<S, L2Shortcuts>}:${T}` : Q extends `${infer R}:${infer S}` ? `${CollapseL1<R, L1Shortcuts>}:${CollapseL2<S>}` : CollapseL1<Q>;
type InjectShortcuts<Q extends L123 = L123> = Q extends `${infer L1}:${infer L2}:${infer L3}` ? `${CollapseL1<L1, L1Shortcuts>}:${CollapseL2<L2, L2Shortcuts>}:${L3}` : Q extends `${infer L1}:${infer L2}` ? `${CollapseL1<L1, L1Shortcuts>}:${CollapseL2<L2>}` : CollapseL1<Q>;
type CollapseL1<Q extends string, L extends L1Shortcuts = Exclude<L1Shortcuts, "">> = Q | (L extends string ? Q extends typeof L1_SHORTCUTS[L][number] ? L : never : never);
type CollapseL2<Q extends string, L extends L2Shortcuts = Exclude<L2Shortcuts, "">> = Q | (L extends string ? Q extends typeof L2_SHORTCUTS[L][number] ? L : never : never);
type AllValidFilterQueries = InjectShortcuts;
type ComputeFilterQueryList = InjectShortcuts | "chat_boost" | "removed_chat_boost";
/**

@@ -467,3 +503,3 @@ * Represents a filter query that can be passed to `bot.on`. There are three

*/
export type FilterQuery = AllValidFilterQueries;
export type FilterQuery = ComputeFilterQueryList;
/**

@@ -489,3 +525,2 @@ * Any kind of value that appears in the Telegram Bot API. When intersected with

type Combine<U, K extends string> = U extends unknown ? U & Partial<Record<Exclude<K, keyof U>, undefined>> : never;
export type FilterCore<Q extends FilterQuery> = PerformQueryCore<RunQuery<ExpandShortcuts<Q>>>;
/**

@@ -501,6 +536,7 @@ * This type infers which properties will be present on the given context object

export type Filter<C extends Context, Q extends FilterQuery> = PerformQuery<C, RunQuery<ExpandShortcuts<Q>>>;
export type FilterCore<Q extends FilterQuery> = PerformQueryCore<RunQuery<ExpandShortcuts<Q>>>;
type PerformQuery<C extends Context, U extends object> = U extends unknown ? FilteredContext<C, Update & U> : never;
type PerformQueryCore<U extends object> = U extends unknown ? FilteredContextCore<Update & U> : never;
type PerformQuery<C extends Context, U extends object> = U extends unknown ? FilteredContext<C, Update & U> : never;
type FilteredContext<C extends Context, U extends Update> = C & FilteredContextCore<U>;
type FilteredContextCore<U extends Update> = Record<"update", U> & AliasProps<Omit<U, "update_id">> & Shortcuts<U>;
type FilteredContext<C extends Context, U extends Update> = C & FilteredContextCore<U>;
interface Shortcuts<U extends Update> {

@@ -524,3 +560,3 @@ msg: [U["callback_query"]] extends [object] ? U["callback_query"]["message"] : [U["message"]] extends [object] ? U["message"] : [U["edited_message"]] extends [object] ? U["edited_message"] : [U["channel_post"]] extends [object] ? U["channel_post"] : [U["edited_channel_post"]] extends [object] ? U["edited_channel_post"] : undefined;

type L2Shortcuts = KeyOf<typeof L2_SHORTCUTS>;
type ExpandShortcuts<Q extends string> = Q extends `${infer L1}:${infer L2}:${infer L3}` ? `${ExpandL1<L1>}:${ExpandL2<L2>}:${L3}` : Q extends `${infer L1}:${infer L2}` ? `${ExpandL1<L1>}:${ExpandL2<L2>}` : ExpandL1<Q>;
type ExpandShortcuts<Q extends string> = Exclude<Q extends `${infer L1}:${infer L2}:${infer L3}` ? `${ExpandL1<L1>}:${ExpandL2<L2>}:${L3}` : Q extends `${infer L1}:${infer L2}` ? `${ExpandL1<L1>}:${ExpandL2<L2>}` : ExpandL1<Q>, "chat_boost" | "removed_chat_boost">;
type ExpandL1<S extends string> = S extends L1Shortcuts ? typeof L1_SHORTCUTS[S][number] : S;

@@ -527,0 +563,0 @@ type ExpandL2<S extends string> = S extends L2Shortcuts ? typeof L2_SHORTCUTS[S][number] : S;

@@ -18,3 +18,3 @@ "use strict";

* // Listens for updates except forwards of messages or channel posts
* bot.drop(matchFilter(':forward_date'), ctx => { ... })
* bot.drop(matchFilter(':forward_origin'), ctx => { ... })
* ```

@@ -121,3 +121,5 @@ *

return "Empty filter query given";
if (!(l1 in UPDATE_KEYS)) {
if (!(l1 in UPDATE_KEYS ||
l1 === "chat_boost" || l1 === "removed_chat_boost") // TODO: remove
) {
const permitted = Object.keys(UPDATE_KEYS);

@@ -231,2 +233,8 @@ return `Invalid L1 filter '${l1}' given in '${filter.join(":")}'. \

};
const FORWARD_ORIGIN_KEYS = {
user: {},
hidden_user: {},
chat: {},
channel: {},
};
const STICKER_KEYS = {

@@ -237,5 +245,9 @@ is_video: {},

};
const REACTION_KEYS = {
emoji: {},
custom_emoji: {},
};
// L2
const COMMON_MESSAGE_KEYS = {
forward_date: {},
forward_origin: FORWARD_ORIGIN_KEYS,
is_topic_message: {},

@@ -285,3 +297,3 @@ is_automatic_forward: {},

successful_payment: {},
user_shared: {},
users_shared: {},
chat_shared: {},

@@ -304,2 +316,9 @@ connected_website: {},

const CHAT_MEMBER_UPDATED_KEYS = { from: USER_KEYS };
const MESSAGE_REACTION_UPDATED_KEYS = {
old_reaction: REACTION_KEYS,
new_reaction: REACTION_KEYS,
};
const MESSAGE_REACTION_COUNT_UPDATED_KEYS = {
reactions: REACTION_KEYS,
};
// L1

@@ -321,2 +340,6 @@ const UPDATE_KEYS = {

chat_join_request: {},
message_reaction: MESSAGE_REACTION_UPDATED_KEYS,
message_reaction_count: MESSAGE_REACTION_COUNT_UPDATED_KEYS,
// chat_boost: {},
// removed_chat_boost: {},
};

@@ -323,0 +346,0 @@ // === Define some helpers for handling shortcuts, e.g. in 'edit:photo'

export { Bot, type BotConfig, BotError, type ErrorHandler, type PollingOptions, } from "./bot.js";
export { InputFile } from "./types.js";
export { type CallbackQueryContext, type ChatTypeContext, type CommandContext, Context, type GameQueryContext, type HearsContext, type InlineQueryContext, } from "./context.js";
export { type CallbackQueryContext, type ChatTypeContext, type CommandContext, Context, type GameQueryContext, type HearsContext, type InlineQueryContext, type ReactionContext, } from "./context.js";
export * from "./convenience/constants.js";

@@ -10,3 +10,3 @@ export * from "./convenience/inline_query.js";

export * from "./convenience/webhook.js";
export { type CallbackQueryMiddleware, type ChatTypeMiddleware, type CommandMiddleware, Composer, type GameQueryMiddleware, type HearsMiddleware, type InlineQueryMiddleware, type Middleware, type MiddlewareFn, type MiddlewareObj, type NextFunction, } from "./composer.js";
export { type CallbackQueryMiddleware, type ChatTypeMiddleware, type CommandMiddleware, Composer, type GameQueryMiddleware, type HearsMiddleware, type InlineQueryMiddleware, type Middleware, type MiddlewareFn, type MiddlewareObj, type NextFunction, type ReactionMiddleware, } from "./composer.js";
export { type Filter, type FilterQuery, matchFilter } from "./filter.js";

@@ -13,0 +13,0 @@ export { Api } from "./core/api.js";

{
"name": "grammy",
"description": "The Telegram Bot Framework.",
"version": "1.19.3",
"version": "1.20.0",
"author": "KnorpelSenf",

@@ -20,3 +20,3 @@ "license": "MIT",

"dependencies": {
"@grammyjs/types": "3.3.0",
"@grammyjs/types": "3.4.4",
"abort-controller": "^3.0.0",

@@ -27,3 +27,3 @@ "debug": "^4.3.4",

"devDependencies": {
"@types/debug": "^4.1.9",
"@types/debug": "^4.1.12",
"@types/node": "^12.20.55",

@@ -30,0 +30,0 @@ "@types/node-fetch": "2.6.2",

@@ -13,3 +13,3 @@ <div align="center"><a href="https://grammy.dev"><img src="https://raw.githubusercontent.com/grammyjs/website/main/logos/grammY.png" alt="grammY"></a></h1></div>

[![Bot API](https://img.shields.io/badge/Bot%20API-6.9-blue?logo=telegram&style=flat&labelColor=000&color=3b82f6)](https://core.telegram.org/bots/api)
[![Bot API](https://img.shields.io/badge/Bot%20API-7.0-blue?logo=telegram&style=flat&labelColor=000&color=3b82f6)](https://core.telegram.org/bots/api)
[![Deno](https://shield.deno.dev/x/grammy)](https://deno.land/x/grammy)

@@ -264,3 +264,3 @@ [![npm](https://img.shields.io/npm/v/grammy?logo=npm&style=flat&labelColor=000&color=3b82f6)](https://www.npmjs.org/package/grammy)

<td align="center" valign="top" width="11.11%"><a href="https://lwjerri.dev/"><img src="https://avatars.githubusercontent.com/u/50290430?v=4?s=100" width="100px;" alt="Andrey Zontov"/><br /><sub><b>Andrey Zontov</b></sub></a><br /><a href="https://github.com/grammyjs/grammY/issues?q=author%3ALWJerri" title="Bug reports">πŸ›</a> <a href="https://github.com/grammyjs/grammY/commits?author=LWJerri" title="Code">πŸ’»</a> <a href="#question-LWJerri" title="Answering Questions">πŸ’¬</a> <a href="#ideas-LWJerri" title="Ideas, Planning, & Feedback">πŸ€”</a> <a href="https://github.com/grammyjs/grammY/commits?author=LWJerri" title="Documentation">πŸ“–</a> <a href="#translation-LWJerri" title="Translation">🌍</a></td>
<td align="center" valign="top" width="11.11%"><a href="https://github.com/AbbassAlmusawi"><img src="https://avatars.githubusercontent.com/u/73327881?v=4?s=100" width="100px;" alt="Abbass Al-Musawi"/><br /><sub><b>Abbass Al-Musawi</b></sub></a><br /><a href="https://github.com/grammyjs/grammY/commits?author=AbbassAlmusawi" title="Documentation">πŸ“–</a></td>
<td align="center" valign="top" width="11.11%"><a href="https://github.com/AbbassAlmusawi"><img src="https://avatars.githubusercontent.com/u/73327881?v=4?s=100" width="100px;" alt="Abbass Al-Musawi"/><br /><sub><b>Abbass Al-Musawi</b></sub></a><br /><a href="https://github.com/grammyjs/grammY/commits?author=AbbassAlmusawi" title="Documentation">πŸ“–</a> <a href="https://github.com/grammyjs/grammY/issues?q=author%3AAbbassAlmusawi" title="Bug reports">πŸ›</a></td>
</tr>

@@ -267,0 +267,0 @@ <tr>

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚑️ by Socket Inc