@tma.sh/sdk 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bot/context.d.ts +29 -0
- package/dist/bot/context.d.ts.map +1 -0
- package/dist/bot/define-bot.d.ts +14 -0
- package/dist/bot/define-bot.d.ts.map +1 -0
- package/dist/bot/index.d.ts +5 -0
- package/dist/bot/index.d.ts.map +1 -0
- package/dist/bot/runtime.d.ts +7 -0
- package/dist/bot/runtime.d.ts.map +1 -0
- package/dist/bot/telegram-types.d.ts +119 -0
- package/dist/bot/telegram-types.d.ts.map +1 -0
- package/dist/bot/types.d.ts +55 -0
- package/dist/bot/types.d.ts.map +1 -0
- package/dist/client/auth.d.ts +19 -0
- package/dist/client/auth.d.ts.map +1 -0
- package/dist/client/http.d.ts +11 -0
- package/dist/client/http.d.ts.map +1 -0
- package/dist/client/index.d.ts +26 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/kv.d.ts +13 -0
- package/dist/client/kv.d.ts.map +1 -0
- package/dist/react/index.d.ts +36 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/server/auth.d.ts +53 -0
- package/dist/server/auth.d.ts.map +1 -0
- package/dist/server/index.d.ts +24 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/kv.d.ts +48 -0
- package/dist/server/kv.d.ts.map +1 -0
- package/dist/svelte/index.d.ts +42 -0
- package/dist/svelte/index.d.ts.map +1 -0
- package/dist/types.d.ts +39 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +17 -1
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { TelegramUpdate } from "./telegram-types";
|
|
2
|
+
import type { BotContext, BotEnv, KVStore } from "./types";
|
|
3
|
+
/**
|
|
4
|
+
* Wraps a Cloudflare KV namespace binding into the SDK's {@link KVStore}
|
|
5
|
+
* interface with automatic JSON serialization.
|
|
6
|
+
*
|
|
7
|
+
* Values are stored as strings. On read, the wrapper attempts to parse the
|
|
8
|
+
* value as JSON; if parsing fails the raw string is returned.
|
|
9
|
+
*/
|
|
10
|
+
export declare const createKV: (binding: KVNamespace) => KVStore;
|
|
11
|
+
/**
|
|
12
|
+
* Creates a {@link BotContext} for a single Telegram update.
|
|
13
|
+
*
|
|
14
|
+
* The context provides:
|
|
15
|
+
* - Resolved `chatId` and `from` fields extracted from the update
|
|
16
|
+
* - Reply helpers (`reply`, `replyPhoto`, `answerCallbackQuery`, etc.)
|
|
17
|
+
* - A typed `kv` store wrapping the environment's KV namespace
|
|
18
|
+
* - A generic `api.call()` for arbitrary Telegram Bot API methods
|
|
19
|
+
* - The raw `env` bindings for direct access
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```ts
|
|
23
|
+
* const ctx = createBotContext(update, env);
|
|
24
|
+
* await ctx.reply('Hello!', { parse_mode: 'HTML' });
|
|
25
|
+
* await ctx.kv.set('seen:' + ctx.from?.id, true);
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare const createBotContext: (update: TelegramUpdate, env: BotEnv) => BotContext;
|
|
29
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/bot/context.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAmB,MAAM,kBAAkB,CAAC;AACxE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAU,OAAO,EAAE,MAAM,SAAS,CAAC;AA6CnE;;;;;;GAMG;AACH,eAAO,MAAM,QAAQ,GAAI,SAAS,WAAW,KAAG,OA+B9C,CAAC;AAuBH;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,gBAAgB,GAC3B,QAAQ,cAAc,EACtB,KAAK,MAAM,KACV,UAyFF,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { BotConfig } from "./types";
|
|
2
|
+
export declare const defineBot: (config: BotConfig) => {
|
|
3
|
+
fetch: (request: Request, env: import("./types").BotEnv, ctx: ExecutionContext) => Promise<Response>;
|
|
4
|
+
commands?: readonly import("./types").BotCommand[];
|
|
5
|
+
description?: string;
|
|
6
|
+
shortDescription?: string;
|
|
7
|
+
middleware?: readonly import("./types").Middleware[];
|
|
8
|
+
onMessage?: (ctx: import("./types").BotContext) => Promise<void>;
|
|
9
|
+
onCallbackQuery?: (ctx: import("./types").BotContext) => Promise<void>;
|
|
10
|
+
onInlineQuery?: (ctx: import("./types").BotContext) => Promise<void>;
|
|
11
|
+
onPreCheckoutQuery?: (ctx: import("./types").BotContext) => Promise<void>;
|
|
12
|
+
onUpdate?: (ctx: import("./types").BotContext) => Promise<void>;
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=define-bot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-bot.d.ts","sourceRoot":"","sources":["../../src/bot/define-bot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGzC,eAAO,MAAM,SAAS,GAAI,QAAQ,SAAS;;;;;;;;;;;CAG1C,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { defineBot } from "./define-bot";
|
|
2
|
+
export { createKV } from "./context";
|
|
3
|
+
export type { BotCommand, BotConfig, BotContext, BotEnv, KVStore, BotApi, Middleware, } from "./types";
|
|
4
|
+
export type { TelegramUpdate, TelegramMessage, TelegramUser, TelegramChat, TelegramCallbackQuery, TelegramInlineQuery, TelegramPreCheckoutQuery, TelegramSuccessfulPayment, TelegramPhotoSize, TelegramDocument, InlineKeyboardButton, InlineKeyboardMarkup, ReplyKeyboardButton, ReplyKeyboardMarkup, SendMessageOptions, SendPhotoOptions, } from "./telegram-types";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bot/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,YAAY,EACV,UAAU,EACV,SAAS,EACT,UAAU,EACV,MAAM,EACN,OAAO,EACP,MAAM,EACN,UAAU,GACX,MAAM,SAAS,CAAC;AAEjB,YAAY,EACV,cAAc,EACd,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,qBAAqB,EACrB,mBAAmB,EACnB,wBAAwB,EACxB,yBAAyB,EACzB,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { BotConfig, BotEnv } from "./types";
|
|
2
|
+
type WorkerFetch = (request: Request, env: BotEnv, ctx: ExecutionContext) => Promise<Response>;
|
|
3
|
+
export declare const createBotWorker: (config: BotConfig) => {
|
|
4
|
+
readonly fetch: WorkerFetch;
|
|
5
|
+
};
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/bot/runtime.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,EAAc,MAAM,SAAS,CAAC;AA8CzE,KAAK,WAAW,GAAG,CACjB,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,gBAAgB,KAClB,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEvB,eAAO,MAAM,eAAe,GAC1B,QAAQ,SAAS,KAChB;IAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;CAoC/B,CAAC"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
export interface TelegramUser {
|
|
2
|
+
readonly id: number;
|
|
3
|
+
readonly is_bot: boolean;
|
|
4
|
+
readonly first_name: string;
|
|
5
|
+
readonly last_name?: string;
|
|
6
|
+
readonly username?: string;
|
|
7
|
+
readonly language_code?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface TelegramChat {
|
|
10
|
+
readonly id: number;
|
|
11
|
+
readonly type: "private" | "group" | "supergroup" | "channel";
|
|
12
|
+
readonly title?: string;
|
|
13
|
+
readonly username?: string;
|
|
14
|
+
readonly first_name?: string;
|
|
15
|
+
readonly last_name?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface TelegramMessage {
|
|
18
|
+
readonly message_id: number;
|
|
19
|
+
readonly from?: TelegramUser;
|
|
20
|
+
readonly chat: TelegramChat;
|
|
21
|
+
readonly date: number;
|
|
22
|
+
readonly text?: string;
|
|
23
|
+
readonly reply_to_message?: TelegramMessage;
|
|
24
|
+
readonly photo?: readonly TelegramPhotoSize[];
|
|
25
|
+
readonly document?: TelegramDocument;
|
|
26
|
+
readonly web_app_data?: {
|
|
27
|
+
readonly data: string;
|
|
28
|
+
readonly button_text: string;
|
|
29
|
+
};
|
|
30
|
+
readonly reply_markup?: InlineKeyboardMarkup;
|
|
31
|
+
readonly successful_payment?: TelegramSuccessfulPayment;
|
|
32
|
+
}
|
|
33
|
+
export interface TelegramPhotoSize {
|
|
34
|
+
readonly file_id: string;
|
|
35
|
+
readonly file_unique_id: string;
|
|
36
|
+
readonly width: number;
|
|
37
|
+
readonly height: number;
|
|
38
|
+
readonly file_size?: number;
|
|
39
|
+
}
|
|
40
|
+
export interface TelegramDocument {
|
|
41
|
+
readonly file_id: string;
|
|
42
|
+
readonly file_unique_id: string;
|
|
43
|
+
readonly file_name?: string;
|
|
44
|
+
readonly mime_type?: string;
|
|
45
|
+
readonly file_size?: number;
|
|
46
|
+
}
|
|
47
|
+
export interface TelegramCallbackQuery {
|
|
48
|
+
readonly id: string;
|
|
49
|
+
readonly from: TelegramUser;
|
|
50
|
+
readonly message?: TelegramMessage;
|
|
51
|
+
readonly data?: string;
|
|
52
|
+
readonly game_short_name?: string;
|
|
53
|
+
}
|
|
54
|
+
export interface TelegramInlineQuery {
|
|
55
|
+
readonly id: string;
|
|
56
|
+
readonly from: TelegramUser;
|
|
57
|
+
readonly query: string;
|
|
58
|
+
readonly offset: string;
|
|
59
|
+
}
|
|
60
|
+
export interface TelegramPreCheckoutQuery {
|
|
61
|
+
readonly id: string;
|
|
62
|
+
readonly from: TelegramUser;
|
|
63
|
+
readonly currency: string;
|
|
64
|
+
readonly total_amount: number;
|
|
65
|
+
readonly invoice_payload: string;
|
|
66
|
+
}
|
|
67
|
+
export interface TelegramSuccessfulPayment {
|
|
68
|
+
readonly currency: string;
|
|
69
|
+
readonly total_amount: number;
|
|
70
|
+
readonly invoice_payload: string;
|
|
71
|
+
readonly telegram_payment_charge_id: string;
|
|
72
|
+
readonly provider_payment_charge_id: string;
|
|
73
|
+
}
|
|
74
|
+
export interface TelegramUpdate {
|
|
75
|
+
readonly update_id: number;
|
|
76
|
+
readonly message?: TelegramMessage;
|
|
77
|
+
readonly callback_query?: TelegramCallbackQuery;
|
|
78
|
+
readonly inline_query?: TelegramInlineQuery;
|
|
79
|
+
readonly pre_checkout_query?: TelegramPreCheckoutQuery;
|
|
80
|
+
}
|
|
81
|
+
export interface InlineKeyboardButton {
|
|
82
|
+
readonly text: string;
|
|
83
|
+
readonly url?: string;
|
|
84
|
+
readonly callback_data?: string;
|
|
85
|
+
readonly web_app?: {
|
|
86
|
+
readonly url: string;
|
|
87
|
+
};
|
|
88
|
+
readonly pay?: boolean;
|
|
89
|
+
}
|
|
90
|
+
export interface InlineKeyboardMarkup {
|
|
91
|
+
readonly inline_keyboard: readonly (readonly InlineKeyboardButton[])[];
|
|
92
|
+
}
|
|
93
|
+
export interface ReplyKeyboardButton {
|
|
94
|
+
readonly text: string;
|
|
95
|
+
readonly request_contact?: boolean;
|
|
96
|
+
readonly request_location?: boolean;
|
|
97
|
+
readonly web_app?: {
|
|
98
|
+
readonly url: string;
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
export interface ReplyKeyboardMarkup {
|
|
102
|
+
readonly keyboard: readonly (readonly ReplyKeyboardButton[])[];
|
|
103
|
+
readonly resize_keyboard?: boolean;
|
|
104
|
+
readonly one_time_keyboard?: boolean;
|
|
105
|
+
readonly selective?: boolean;
|
|
106
|
+
}
|
|
107
|
+
export interface SendMessageOptions {
|
|
108
|
+
readonly parse_mode?: "HTML" | "Markdown" | "MarkdownV2";
|
|
109
|
+
readonly reply_markup?: InlineKeyboardMarkup | ReplyKeyboardMarkup;
|
|
110
|
+
readonly disable_web_page_preview?: boolean;
|
|
111
|
+
readonly reply_to_message_id?: number;
|
|
112
|
+
}
|
|
113
|
+
export interface SendPhotoOptions {
|
|
114
|
+
readonly caption?: string;
|
|
115
|
+
readonly parse_mode?: "HTML" | "Markdown" | "MarkdownV2";
|
|
116
|
+
readonly reply_markup?: InlineKeyboardMarkup | ReplyKeyboardMarkup;
|
|
117
|
+
readonly reply_to_message_id?: number;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=telegram-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegram-types.d.ts","sourceRoot":"","sources":["../../src/bot/telegram-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { TelegramUpdate, TelegramMessage, TelegramCallbackQuery, TelegramInlineQuery, TelegramPreCheckoutQuery, SendMessageOptions, SendPhotoOptions } from "./telegram-types";
|
|
2
|
+
export interface BotCommand {
|
|
3
|
+
readonly command: string;
|
|
4
|
+
readonly description: string;
|
|
5
|
+
}
|
|
6
|
+
export interface BotConfig {
|
|
7
|
+
readonly commands?: readonly BotCommand[];
|
|
8
|
+
readonly description?: string;
|
|
9
|
+
readonly shortDescription?: string;
|
|
10
|
+
readonly middleware?: readonly Middleware[];
|
|
11
|
+
readonly onMessage?: (ctx: BotContext) => Promise<void>;
|
|
12
|
+
readonly onCallbackQuery?: (ctx: BotContext) => Promise<void>;
|
|
13
|
+
readonly onInlineQuery?: (ctx: BotContext) => Promise<void>;
|
|
14
|
+
readonly onPreCheckoutQuery?: (ctx: BotContext) => Promise<void>;
|
|
15
|
+
readonly onUpdate?: (ctx: BotContext) => Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
export interface BotEnv {
|
|
18
|
+
readonly BOT_TOKEN: string;
|
|
19
|
+
readonly WEB_APP_URL: string;
|
|
20
|
+
readonly KV: KVNamespace;
|
|
21
|
+
readonly [key: string]: unknown;
|
|
22
|
+
}
|
|
23
|
+
export interface KVStore {
|
|
24
|
+
readonly get: <T = string>(key: string) => Promise<T | null>;
|
|
25
|
+
readonly set: (key: string, value: unknown, ttl?: number) => Promise<void>;
|
|
26
|
+
readonly delete: (key: string) => Promise<void>;
|
|
27
|
+
readonly list: (prefix?: string) => Promise<readonly string[]>;
|
|
28
|
+
}
|
|
29
|
+
export interface BotApi {
|
|
30
|
+
readonly call: <T = unknown>(method: string, body?: Record<string, unknown>) => Promise<T>;
|
|
31
|
+
}
|
|
32
|
+
export interface BotContext {
|
|
33
|
+
readonly update: TelegramUpdate;
|
|
34
|
+
readonly message: TelegramMessage | undefined;
|
|
35
|
+
readonly callbackQuery: TelegramCallbackQuery | undefined;
|
|
36
|
+
readonly inlineQuery: TelegramInlineQuery | undefined;
|
|
37
|
+
readonly preCheckoutQuery: TelegramPreCheckoutQuery | undefined;
|
|
38
|
+
readonly chatId: number | undefined;
|
|
39
|
+
readonly from: {
|
|
40
|
+
readonly id: number;
|
|
41
|
+
readonly language_code?: string;
|
|
42
|
+
} | undefined;
|
|
43
|
+
readonly env: BotEnv;
|
|
44
|
+
readonly kv: KVStore;
|
|
45
|
+
readonly api: BotApi;
|
|
46
|
+
readonly reply: (text: string, options?: SendMessageOptions) => Promise<TelegramMessage>;
|
|
47
|
+
readonly replyPhoto: (photo: string, options?: SendPhotoOptions) => Promise<TelegramMessage>;
|
|
48
|
+
readonly answerCallbackQuery: (text?: string, options?: {
|
|
49
|
+
readonly show_alert?: boolean;
|
|
50
|
+
}) => Promise<void>;
|
|
51
|
+
readonly answerInlineQuery: (results: readonly unknown[], options?: Record<string, unknown>) => Promise<void>;
|
|
52
|
+
readonly answerPreCheckoutQuery: (ok: boolean, errorMessage?: string) => Promise<void>;
|
|
53
|
+
}
|
|
54
|
+
export type Middleware = (ctx: BotContext, next: () => Promise<void>) => Promise<void>;
|
|
55
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/bot/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { AuthResult, TMAConfig } from "../types";
|
|
2
|
+
export interface AuthClient {
|
|
3
|
+
/**
|
|
4
|
+
* Validate Telegram initData and receive a signed JWT.
|
|
5
|
+
*
|
|
6
|
+
* Sends the raw initData string to the TMA API which verifies the
|
|
7
|
+
* HMAC-SHA256 signature using the project's bot token and returns a JWT
|
|
8
|
+
* containing the authenticated Telegram user claims.
|
|
9
|
+
*/
|
|
10
|
+
readonly validate: (initData: string, projectId: string) => Promise<AuthResult>;
|
|
11
|
+
/** Returns the current JWT if authentication has been completed. */
|
|
12
|
+
readonly getJwt: () => string | null;
|
|
13
|
+
}
|
|
14
|
+
/** Set the JWT in memory (used internally after validation). */
|
|
15
|
+
export declare const setStoredJwt: (jwt: string | null) => void;
|
|
16
|
+
/** Get the current in-memory JWT. */
|
|
17
|
+
export declare const getStoredJwt: () => string | null;
|
|
18
|
+
export declare const createAuthClient: (config?: TMAConfig) => AuthClient;
|
|
19
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/client/auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAMtD,MAAM,WAAW,UAAU;IACzB;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,EAAE,CACjB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,KACd,OAAO,CAAC,UAAU,CAAC,CAAC;IAEzB,oEAAoE;IACpE,QAAQ,CAAC,MAAM,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;CACtC;AAQD,gEAAgE;AAChE,eAAO,MAAM,YAAY,GAAI,KAAK,MAAM,GAAG,IAAI,KAAG,IAEjD,CAAC;AAEF,qCAAqC;AACrC,eAAO,MAAM,YAAY,QAAO,MAAM,GAAG,IAAiB,CAAC;AAM3D,eAAO,MAAM,gBAAgB,GAAI,SAAS,SAAS,KAAG,UAqBrD,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare class TMAError extends Error {
|
|
2
|
+
readonly code: string;
|
|
3
|
+
constructor(message: string, code?: string);
|
|
4
|
+
}
|
|
5
|
+
export declare const resolveApiUrl: (apiUrl?: string) => string;
|
|
6
|
+
export declare const makeRequest: <T>(baseUrl: string, path: string, options?: {
|
|
7
|
+
readonly method?: string;
|
|
8
|
+
readonly body?: unknown;
|
|
9
|
+
readonly jwt?: string | null;
|
|
10
|
+
}) => Promise<T>;
|
|
11
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/client/http.ts"],"names":[],"mappings":"AAMA,qBAAa,QAAS,SAAQ,KAAK;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,OAAO,EAAE,MAAM,EAAE,IAAI,SAAc;CAKhD;AASD,eAAO,MAAM,aAAa,GAAI,SAAS,MAAM,KAAG,MACW,CAAC;AAE5D,eAAO,MAAM,WAAW,GAAU,CAAC,EACjC,SAAS,MAAM,EACf,MAAM,MAAM,EACZ,UAAS;IACP,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB,KACL,OAAO,CAAC,CAAC,CAyBX,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type AuthClient } from "./auth";
|
|
2
|
+
import { type KVClient } from "./kv";
|
|
3
|
+
import type { TMAConfig } from "../types";
|
|
4
|
+
export interface TMAClient {
|
|
5
|
+
readonly auth: AuthClient;
|
|
6
|
+
readonly kv: KVClient;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Create a TMA SDK client instance.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* import { createTMA } from '@tma.sh/sdk';
|
|
14
|
+
*
|
|
15
|
+
* const tma = createTMA();
|
|
16
|
+
* const { jwt, user } = await tma.auth.validate(initData, projectId);
|
|
17
|
+
* await tma.kv.set('key', 'value');
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export declare const createTMA: (config?: TMAConfig) => TMAClient;
|
|
21
|
+
export type { AuthClient } from "./auth";
|
|
22
|
+
export type { KVClient } from "./kv";
|
|
23
|
+
export type { TMAConfig } from "../types";
|
|
24
|
+
export type { TelegramUser, AuthResult, AuthState, KVKey, KVListResult, } from "../types";
|
|
25
|
+
export { TMAError } from "./http";
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC3D,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,MAAM,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAM1C,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;CACvB;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,SAAS,GAAI,SAAS,SAAS,KAAG,SAG7C,CAAC;AAMH,YAAY,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACzC,YAAY,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACrC,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,YAAY,EACV,YAAY,EACZ,UAAU,EACV,SAAS,EACT,KAAK,EACL,YAAY,GACb,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { TMAConfig, KVListResult } from "../types";
|
|
2
|
+
export interface KVClient {
|
|
3
|
+
/** Store a value at the given key. Value is JSON-serialized. */
|
|
4
|
+
readonly set: (key: string, value: unknown) => Promise<void>;
|
|
5
|
+
/** Retrieve a value by key. Returns null if the key does not exist. */
|
|
6
|
+
readonly get: <T = unknown>(key: string) => Promise<T | null>;
|
|
7
|
+
/** Delete a key. */
|
|
8
|
+
readonly remove: (key: string) => Promise<void>;
|
|
9
|
+
/** List keys matching an optional prefix. */
|
|
10
|
+
readonly list: (prefix?: string) => Promise<KVListResult>;
|
|
11
|
+
}
|
|
12
|
+
export declare const createKVClient: (config?: TMAConfig) => KVClient;
|
|
13
|
+
//# sourceMappingURL=kv.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kv.d.ts","sourceRoot":"","sources":["../../src/client/kv.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAMxD,MAAM,WAAW,QAAQ;IACvB,gEAAgE;IAChE,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7D,uEAAuE;IACvE,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAE9D,oBAAoB;IACpB,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhD,6CAA6C;IAC7C,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;CAC3D;AAuBD,eAAO,MAAM,cAAc,GAAI,SAAS,SAAS,KAAG,QAyCnD,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { TMAConfig, AuthState } from "../types";
|
|
2
|
+
declare global {
|
|
3
|
+
interface Window {
|
|
4
|
+
Telegram?: {
|
|
5
|
+
WebApp?: {
|
|
6
|
+
initData?: string;
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* React hook that validates Telegram initData on mount and provides the
|
|
13
|
+
* authenticated user, JWT, loading state, and any error.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```tsx
|
|
17
|
+
* import { useTelegramAuth } from '@tma.sh/sdk/react';
|
|
18
|
+
*
|
|
19
|
+
* function App() {
|
|
20
|
+
* const { user, jwt, isLoading, error } = useTelegramAuth({
|
|
21
|
+
* projectId: 'my-project',
|
|
22
|
+
* });
|
|
23
|
+
*
|
|
24
|
+
* if (isLoading) return <div>Loading...</div>;
|
|
25
|
+
* if (error) return <div>Error: {error.message}</div>;
|
|
26
|
+
* if (!user) return <div>Not in Telegram</div>;
|
|
27
|
+
*
|
|
28
|
+
* return <div>Welcome, {user.firstName}!</div>;
|
|
29
|
+
* }
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export declare const useTelegramAuth: (config?: TMAConfig) => AuthState;
|
|
33
|
+
export { createTMA } from "../client/index";
|
|
34
|
+
export type { TMAConfig, TMAClient, AuthClient, KVClient, } from "../client/index";
|
|
35
|
+
export type { TelegramUser, AuthResult, AuthState } from "../types";
|
|
36
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAMrD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,QAAQ,CAAC,EAAE;YACT,MAAM,CAAC,EAAE;gBACP,QAAQ,CAAC,EAAE,MAAM,CAAC;aACnB,CAAC;SACH,CAAC;KACH;CACF;AAiED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,eAAe,GAAI,SAAS,SAAS,KAAG,SAwBpD,CAAC;AAMF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EACV,SAAS,EACT,SAAS,EACT,UAAU,EACV,QAAQ,GACT,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { CryptoKey as JoseCryptoKey, FlattenedJWSInput, JWSHeaderParameters } from "jose";
|
|
2
|
+
/**
|
|
3
|
+
* Authenticated Telegram user context set by the `requireUser` middleware.
|
|
4
|
+
*/
|
|
5
|
+
export interface UserContext {
|
|
6
|
+
readonly telegramId: number;
|
|
7
|
+
readonly firstName: string;
|
|
8
|
+
readonly lastName?: string;
|
|
9
|
+
readonly username?: string;
|
|
10
|
+
readonly projectId: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Hono environment variables for routes protected by `requireUser`.
|
|
14
|
+
*/
|
|
15
|
+
export interface AuthEnv {
|
|
16
|
+
Variables: {
|
|
17
|
+
user: UserContext;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/** A JWKS resolver function compatible with jose `jwtVerify`. */
|
|
21
|
+
type JWKSResolver = (protectedHeader?: JWSHeaderParameters, token?: FlattenedJWSInput) => Promise<JoseCryptoKey>;
|
|
22
|
+
/**
|
|
23
|
+
* Options for `requireUser`.
|
|
24
|
+
*
|
|
25
|
+
* Provide either a `jwksUrl` string (for production use) or a `jwks` resolver
|
|
26
|
+
* function (useful for testing with `createLocalJWKSet`).
|
|
27
|
+
*/
|
|
28
|
+
export interface RequireUserOptions {
|
|
29
|
+
/** URL to the JWKS endpoint. Defaults to the TMA public endpoint. */
|
|
30
|
+
readonly jwksUrl?: string;
|
|
31
|
+
/** Pre-built JWKS resolver (e.g. from `createLocalJWKSet` in tests). */
|
|
32
|
+
readonly jwks?: JWKSResolver;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Hono middleware that verifies a JWT from the `Authorization: Bearer <token>`
|
|
36
|
+
* header using the TMA JWKS endpoint (or a custom one).
|
|
37
|
+
*
|
|
38
|
+
* On success the authenticated {@link UserContext} is available via
|
|
39
|
+
* `c.get('user')` in downstream handlers.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```ts
|
|
43
|
+
* import { Hono } from 'hono';
|
|
44
|
+
* import { requireUser } from '@tma.sh/sdk/server';
|
|
45
|
+
*
|
|
46
|
+
* const app = new Hono();
|
|
47
|
+
* app.use('/api/*', requireUser());
|
|
48
|
+
* app.get('/api/me', (c) => c.json({ user: c.get('user') }));
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export declare const requireUser: (options?: RequireUserOptions) => import("hono/types").MiddlewareHandler<AuthEnv, string, {}, Response>;
|
|
52
|
+
export {};
|
|
53
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/server/auth.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,SAAS,IAAI,aAAa,EAC1B,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,MAAM,CAAC;AAOd;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE;QACT,IAAI,EAAE,WAAW,CAAC;KACnB,CAAC;CACH;AAED,iEAAiE;AACjE,KAAK,YAAY,GAAG,CAClB,eAAe,CAAC,EAAE,mBAAmB,EACrC,KAAK,CAAC,EAAE,iBAAiB,KACtB,OAAO,CAAC,aAAa,CAAC,CAAC;AAE5B;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,qEAAqE;IACrE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,wEAAwE;IACxE,QAAQ,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC;CAC9B;AAYD;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,WAAW,GAAI,UAAU,kBAAkB,0EAiCvD,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export { requireUser } from "./auth";
|
|
2
|
+
export type { AuthEnv, RequireUserOptions, UserContext } from "./auth";
|
|
3
|
+
export { createKV } from "./kv";
|
|
4
|
+
export type { KVNamespaceBinding, TypedKV } from "./kv";
|
|
5
|
+
/**
|
|
6
|
+
* Validate Telegram initData locally using HMAC-SHA256 verification.
|
|
7
|
+
*
|
|
8
|
+
* This performs the same algorithm as the TMA API endpoint but runs
|
|
9
|
+
* entirely on the caller's server, requiring only the bot token. No API
|
|
10
|
+
* call is made.
|
|
11
|
+
*
|
|
12
|
+
* @param initData - Raw initData query string from Telegram WebApp
|
|
13
|
+
* @param botToken - The Telegram bot token used to verify the HMAC signature
|
|
14
|
+
* @returns The parsed and verified Telegram user, or null if invalid
|
|
15
|
+
*/
|
|
16
|
+
export declare const validateInitData: (initData: string, botToken: string) => Promise<ValidatedInitData | null>;
|
|
17
|
+
export interface ValidatedInitData {
|
|
18
|
+
readonly telegramId: number;
|
|
19
|
+
readonly firstName: string;
|
|
20
|
+
readonly lastName?: string;
|
|
21
|
+
readonly username?: string;
|
|
22
|
+
readonly authDate: number;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACrC,YAAY,EAAE,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAChC,YAAY,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAExD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,GAC3B,UAAU,MAAM,EAChB,UAAU,MAAM,KACf,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAyElC,CAAC;AAMF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal interface for a Cloudflare KV namespace binding.
|
|
3
|
+
*
|
|
4
|
+
* This avoids a hard dependency on `@cloudflare/workers-types` so consumers
|
|
5
|
+
* don't need that package installed. The real `KVNamespace` satisfies this.
|
|
6
|
+
*/
|
|
7
|
+
export interface KVNamespaceBinding {
|
|
8
|
+
get(key: string, type: "json"): Promise<unknown>;
|
|
9
|
+
put(key: string, value: string, options?: {
|
|
10
|
+
expirationTtl?: number;
|
|
11
|
+
}): Promise<void>;
|
|
12
|
+
delete(key: string): Promise<void>;
|
|
13
|
+
list(options?: {
|
|
14
|
+
prefix?: string;
|
|
15
|
+
}): Promise<{
|
|
16
|
+
keys: ReadonlyArray<{
|
|
17
|
+
readonly name: string;
|
|
18
|
+
}>;
|
|
19
|
+
}>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Typed KV client returned by {@link createKV}.
|
|
23
|
+
*/
|
|
24
|
+
export interface TypedKV {
|
|
25
|
+
/** Retrieve a JSON value by key. Returns `null` if the key does not exist. */
|
|
26
|
+
get: <T = unknown>(key: string) => Promise<T | null>;
|
|
27
|
+
/** Store a JSON-serializable value. Optionally set a TTL in seconds. */
|
|
28
|
+
set: (key: string, value: unknown, ttl?: number) => Promise<void>;
|
|
29
|
+
/** Delete a key from the store. */
|
|
30
|
+
delete: (key: string) => Promise<void>;
|
|
31
|
+
/** List key names, optionally filtered by prefix. */
|
|
32
|
+
list: (prefix?: string) => Promise<string[]>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Wraps a Cloudflare KV namespace binding with typed `get`/`set`/`delete`/`list`
|
|
36
|
+
* methods. Values are automatically JSON-serialized on write and parsed on read.
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```ts
|
|
40
|
+
* import { createKV } from '@tma.sh/sdk/server';
|
|
41
|
+
*
|
|
42
|
+
* const kv = createKV(c.env.KV);
|
|
43
|
+
* await kv.set('user:123', { name: 'Alice' });
|
|
44
|
+
* const user = await kv.get<{ name: string }>('user:123');
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export declare const createKV: (binding: KVNamespaceBinding) => TypedKV;
|
|
48
|
+
//# sourceMappingURL=kv.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kv.d.ts","sourceRoot":"","sources":["../../src/server/kv.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,GAAG,CACD,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GACnC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAC3C,IAAI,EAAE,aAAa,CAAC;YAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAChD,CAAC,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,8EAA8E;IAC9E,GAAG,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACrD,wEAAwE;IACxE,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,mCAAmC;IACnC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,qDAAqD;IACrD,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAC9C;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,QAAQ,GAAI,SAAS,kBAAkB,KAAG,OAsBrD,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type Writable } from "svelte/store";
|
|
2
|
+
import type { TMAConfig, AuthState } from "../types";
|
|
3
|
+
declare global {
|
|
4
|
+
interface Window {
|
|
5
|
+
Telegram?: {
|
|
6
|
+
WebApp?: {
|
|
7
|
+
initData?: string;
|
|
8
|
+
};
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Create a Svelte writable store that validates Telegram initData and
|
|
14
|
+
* provides the authenticated user, JWT, loading state, and any error.
|
|
15
|
+
*
|
|
16
|
+
* Call this function once (e.g. at the top level of your root layout) and
|
|
17
|
+
* subscribe to the returned store.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```svelte
|
|
21
|
+
* <script>
|
|
22
|
+
* import { createTelegramAuth } from '@tma.sh/sdk/svelte';
|
|
23
|
+
*
|
|
24
|
+
* const auth = createTelegramAuth({ projectId: 'my-project' });
|
|
25
|
+
* </script>
|
|
26
|
+
*
|
|
27
|
+
* {#if $auth.isLoading}
|
|
28
|
+
* <p>Loading...</p>
|
|
29
|
+
* {:else if $auth.error}
|
|
30
|
+
* <p>Error: {$auth.error.message}</p>
|
|
31
|
+
* {:else if $auth.user}
|
|
32
|
+
* <p>Welcome, {$auth.user.firstName}!</p>
|
|
33
|
+
* {:else}
|
|
34
|
+
* <p>Not in Telegram</p>
|
|
35
|
+
* {/if}
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export declare const createTelegramAuth: (config?: TMAConfig) => Writable<AuthState>;
|
|
39
|
+
export { createTMA } from "../client/index";
|
|
40
|
+
export type { TMAConfig, TMAClient, AuthClient, KVClient, } from "../client/index";
|
|
41
|
+
export type { TelegramUser, AuthResult, AuthState } from "../types";
|
|
42
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/svelte/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAC;AAEvD,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAMrD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,QAAQ,CAAC,EAAE;YACT,MAAM,CAAC,EAAE;gBACP,QAAQ,CAAC,EAAE,MAAM,CAAC;aACnB,CAAC;SACH,CAAC;KACH;CACF;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,kBAAkB,GAAI,SAAS,SAAS,KAAG,QAAQ,CAAC,SAAS,CA6DzE,CAAC;AAMF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EACV,SAAS,EACT,SAAS,EACT,UAAU,EACV,QAAQ,GACT,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export interface TMAConfig {
|
|
2
|
+
/** Base URL for the TMA API. Defaults to https://api.tma.sh */
|
|
3
|
+
readonly apiUrl?: string;
|
|
4
|
+
/** Project ID to scope all SDK operations to */
|
|
5
|
+
readonly projectId?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface TelegramUser {
|
|
8
|
+
readonly telegramId: number;
|
|
9
|
+
readonly firstName: string;
|
|
10
|
+
readonly lastName?: string;
|
|
11
|
+
readonly username?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface AuthResult {
|
|
14
|
+
readonly jwt: string;
|
|
15
|
+
readonly user: TelegramUser;
|
|
16
|
+
}
|
|
17
|
+
export interface KVKey {
|
|
18
|
+
readonly name: string;
|
|
19
|
+
}
|
|
20
|
+
export interface KVListResult {
|
|
21
|
+
readonly keys: readonly KVKey[];
|
|
22
|
+
readonly list_complete: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface ApiSuccessResponse<T> {
|
|
25
|
+
readonly success: true;
|
|
26
|
+
readonly data: T;
|
|
27
|
+
}
|
|
28
|
+
export interface ApiErrorResponse {
|
|
29
|
+
readonly success: false;
|
|
30
|
+
readonly error: string;
|
|
31
|
+
}
|
|
32
|
+
export type ApiResponse<T> = ApiSuccessResponse<T> | ApiErrorResponse;
|
|
33
|
+
export interface AuthState {
|
|
34
|
+
readonly user: TelegramUser | null;
|
|
35
|
+
readonly jwt: string | null;
|
|
36
|
+
readonly isLoading: boolean;
|
|
37
|
+
readonly error: Error | null;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,SAAS;IACxB,+DAA+D;IAC/D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,gDAAgD;IAChD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAMD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;CAC7B;AAMD,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,SAAS,KAAK,EAAE,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;CACjC;AAMD,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,kBAAkB,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC;AAMtE,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CAC9B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tma.sh/sdk",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "SDK for Telegram Mini Apps on TMA -- auth, KV storage, and framework bindings",
|
|
6
6
|
"license": "MIT",
|
|
@@ -26,6 +26,22 @@
|
|
|
26
26
|
"types": "./dist/bot/index.d.ts"
|
|
27
27
|
}
|
|
28
28
|
},
|
|
29
|
+
"typesVersions": {
|
|
30
|
+
"*": {
|
|
31
|
+
"svelte": [
|
|
32
|
+
"dist/svelte/index.d.ts"
|
|
33
|
+
],
|
|
34
|
+
"react": [
|
|
35
|
+
"dist/react/index.d.ts"
|
|
36
|
+
],
|
|
37
|
+
"server": [
|
|
38
|
+
"dist/server/index.d.ts"
|
|
39
|
+
],
|
|
40
|
+
"bot": [
|
|
41
|
+
"dist/bot/index.d.ts"
|
|
42
|
+
]
|
|
43
|
+
}
|
|
44
|
+
},
|
|
29
45
|
"files": [
|
|
30
46
|
"dist"
|
|
31
47
|
],
|