Files
2026-10-25 22:55:29 +04:00

38 lines
2.4 KiB
TypeScript

/**
* Локальная разработка без Telegram: печатает ссылки на Mini App с подписанным initData.
*
* pnpm dev:initdata — ссылки для всех тестовых пользователей из seed
* pnpm dev:initdata -- client 100000001 — конкретный пользователь
*
* Подпись делается тем же токеном, которым API проверяет initData (настоящий или DEV_*).
*/
import { env } from '../src/env.ts';
import { signInitData } from '../src/auth/telegram.ts';
if (env.isProd) throw new Error('Только для разработки');
const users: { app: 'client' | 'pro'; id: number; name: string; lang: string }[] = [
{ app: 'client', id: 100000001, name: 'Анна', lang: 'ru' },
{ app: 'client', id: 100000002, name: 'John', lang: 'en' },
{ app: 'client', id: 100000003, name: '李明', lang: 'zh' },
{ app: 'client', id: 100000004, name: 'Ольга', lang: 'ru' },
{ app: 'client', id: 100000099, name: 'Новый клиент', lang: 'ru' },
{ app: 'pro', id: 200000001, name: 'Мария (клинер)', lang: 'ru' },
{ app: 'pro', id: 200000003, name: 'Elena (клинер)', lang: 'es' },
{ app: 'pro', id: 200000011, name: 'Лусине (сотрудник компании)', lang: 'hy' },
{ app: 'pro', id: 300000001, name: 'Карен (диспетчер компании)', lang: 'ru' },
{ app: 'pro', id: 300000010, name: 'Арам (собственник Lumen Coffee)', lang: 'ru' },
{ app: 'pro', id: 300000011, name: 'Гаяне (сотрудник Lumen Coffee)', lang: 'ru' },
];
const [appArg, idArg] = process.argv.slice(2).filter((a) => a !== '--');
const selected = appArg && idArg ? [{ app: appArg as 'client' | 'pro', id: Number(idArg), name: `user ${idArg}`, lang: 'ru' }] : users;
for (const u of selected) {
const token = u.app === 'client' ? env.clientBotToken : env.proBotToken;
// initData живёт TG_INIT_DATA_MAX_AGE секунд — для разработки этого достаточно
const initData = signInitData(token, { id: u.id, first_name: u.name.split(' ')[0], language_code: u.lang });
const base = u.app === 'client' ? env.CLIENT_MINIAPP_URL : env.PRO_MINIAPP_URL;
console.log(`${u.app.padEnd(6)} ${u.name}\n ${base}/#tgWebAppData=${encodeURIComponent(initData)}\n`);
}